I didn't look at the code yet, but the symptoms look like you still
have that same problem: your widgets just aren't repainted. (This will
only be visible if you don't use screen compositing). You'll have to
either somehow periodically process all events, or move your
inotify-related code to a separate thread, so that glib main loop
could work in main thread, automatically processing all events (this
would be the correct solution).

On Tue, Nov 5, 2013 at 4:19 PM, Mahesh Chaudhari
<mahesh.chaudh...@ymail.com> wrote:
> Many thanks Ruslan,
> got my things working now...
> except with one problem that is
> all widgets (mostly buttons) fitted into top level window disappears when I
> switch window and come back
>
>
> On Friday, 1 November 2013 2:13 PM, Ruslan Kabatsayev
> <b7.10110...@gmail.com> wrote:
> OK, now I see your problem. You set new color for the button, and
> don't really allow GTK to redraw it. I.e. you change color variable,
> but actual widget is not updated. Moreover, as your program is in busy
> waiting, the user can't interact with it.
>
> Let's think busy waiting is by design. Now you need to update your
> button, in other words, you want to process all pending events. This
> can be done by adding the following code at the end of your while()
> loop:
>
> while(gtk_events_pending())
>     gtk_main_iteration_do(FALSE);
>
> This will do gtk_main iteration for all pending events, then let you
> continue your outer while() loop.
>
> On Fri, Nov 1, 2013 at 3:56 PM, Mahesh Chaudhari
> <mahesh.chaudh...@ymail.com> wrote:
>> thanks Ruslan,
>> it worked, it meant problem lies with other logic (using INOTIFY to wait
>> for
>> file change)
>> The entire code (clean compilable) is
>>
>> #include<gtk/gtk.h>
>> #include<stdlib.h>
>> #include<sys/inotify.h>
>> #define EVENT_SIZE  ( sizeof (struct inotify_event) )
>> #define BUF_LEN    ( 1024 * ( EVENT_SIZE + 16 ) )
>> GtkWidget *button1, *button2, *button3, *button4, *button5;
>>  void click_button1(GtkWidget *widget, gpointer data)
>> {
>>  printf("in click_button1\n");
>>  GdkColor color;
>>  color.red = 27000;
>>  color.green = 30325;
>>  color.blue = 34181;
>> //  gtk_widget_modify_fg(GTK_WIDGET(widget), GTK_STATE_NORMAL, &color);
>>  gtk_widget_modify_bg(GTK_WIDGET(button1), GTK_STATE_NORMAL, &color);
>> }
>>  void click_button2(GtkWidget *widget, gpointer data)
>> {
>>  printf("in click_button2\n");
>>  GdkColor color;
>>  color.red = 27000;
>>  color.green = 30325;
>>  color.blue = 34181;
>> //  gtk_widget_modify_fg(GTK_WIDGET(widget), GTK_STATE_NORMAL, &color);
>>  gtk_widget_modify_bg(GTK_WIDGET(button2), GTK_STATE_NORMAL, &color);
>> }
>> void click_button_start(GtkWidget *widget, gpointer data)
>> {
>>        int notifyfd, watchfd, len=0;
>>        notifyfd = inotify_init();
>>        if (notifyfd<0)perror("inotify_init failed\n");
>>        watchfd = inotify_add_watch(notifyfd,
>> "/home/user/Desktop/mahesh/GTK+/trials/putty.log", IN_MODIFY);
>>        if(watchfd<0)perror("inotify_add_watch failed\n");
>>        while(1)
>>        {
>>        printf("waiting for file change\n");
>>        struct inotify_event* event = malloc(BUF_LEN);
>>        len = read(notifyfd, event, BUF_LEN);
>>        if(len>0){
>>                gtk_button_clicked(GTK_BUTTON(button1));
>>        }
>>        free(event);
>>        }
>>  }
>>
>> int main (int argc,char **argv)
>> {
>>    GtkWidget *button_start;
>>    GtkWidget *window;
>>
>>    GtkWidget *hbox,*vbox;
>>    GdkColor color;
>>    gdk_color_parse ("blue", &color);
>>    gtk_init (&argc,&argv);
>>
>>    /*...............create top level window...................*/
>>
>>    window = gtk_window_new (GTK_WINDOW_TOPLEVEL);
>>    gtk_window_set_title(GTK_WINDOW(window), "LED status");
>>    gtk_window_set_default_size(GTK_WINDOW(window), 250, 80);
>>    gtk_container_set_border_width(GTK_CONTAINER(window), 5);
>>    g_signal_connect (G_OBJECT(window), "destroy",
>>            G_CALLBACK (gtk_main_quit), NULL);
>>
>>    /*................. create buttons ......................*/
>>    button_start = gtk_button_new_with_label("start");
>>    g_signal_connect(G_OBJECT(button_start), "clicked",
>>    G_CALLBACK(click_button_start), NULL);
>>    button1 = gtk_button_new_with_label ("button1");
>>    g_signal_connect(G_OBJECT(button1), "clicked",
>>    G_CALLBACK(click_button1), NULL);
>>    button2 = gtk_button_new_with_label ("button2");
>>    g_signal_connect(G_OBJECT(button2), "clicked",
>>    G_CALLBACK(click_button2), NULL);
>>    button3 = gtk_button_new_with_label ("button3");
>>    button4 = gtk_button_new_with_label ("button4");
>>    button5 = gtk_button_new_with_label ("button5");
>>
>>    /*.................. Alignements......................*/
>>
>>    hbox = gtk_hbox_new(TRUE,1);
>>    vbox = gtk_vbox_new(TRUE,1);
>>    gtk_box_pack_start(GTK_BOX(hbox), button1, 1, 1, 0);
>>    gtk_box_pack_start(GTK_BOX(hbox), button2, 1, 1, 0);
>>    gtk_box_pack_start(GTK_BOX(hbox), button3, 1, 1, 0);
>>    gtk_box_pack_start(GTK_BOX(hbox), button4, 1, 1, 0);
>>    gtk_box_pack_start(GTK_BOX(hbox), button5, 1, 1, 0);
>>    gtk_box_pack_start(GTK_BOX(vbox), button_start, 1, 1, 0);
>>    gtk_box_pack_start(GTK_BOX(vbox), hbox, 1, 1, 0);
>>    gtk_container_add (GTK_CONTAINER (window), vbox);
>>
>>    /*....................show...............................*/
>>
>>    gtk_widget_show_all (window);
>>      gtk_main();
>>    return 0;
>> }
>>
>>
>> On Friday, 1 November 2013 1:43 AM, Ruslan Kabatsayev
>> <b7.10110...@gmail.com> wrote:
>> Well, it worked. Didn't it work for you?
>> Also, in the future please give _compilable_ code - it's no fun to fix
>> compilation errors just to try it out.
>>
>> On Thu, Oct 31, 2013 at 3:11 PM, Mahesh Chaudhari
>> <mahesh.chaudh...@ymail.com> wrote:
>>> Ruslan ,
>>>  that is working with mouse clicks (works for me also)
>>> what I wanted is without clicking with mouse, generate a click signal
>>> event
>>> (through a  program only) and and thus color should be changed
>>> try this one if possible (click only "start" button with mouse and color
>>> of
>>> button1 should be changed)
>>>
>>> GtkWidget *button1, *button2, *button3, *button4, *button5;
>>>  void click_button1(GtkWidget *widget, gpointer data)
>>> {
>>>  printf("in click_button1\n");
>>>  GdkColor color;
>>>  color.red = 27000;
>>>  color.green = 30325;
>>>  color.blue = 34181;
>>> //  gtk_widget_modify_fg(GTK_WIDGET(widget), GTK_STATE_NORMAL, &color);
>>>  gtk_widget_modify_bg(GTK_WIDGET(button1), GTK_STATE_NORMAL, &color);
>>> }
>>>
>>> void click_button_start(GtkWidget *widget, gpointer data)
>>> {
>>>                  gtk_button_clicked(GTK_BUTTON(button1));
>>>  }
>>>
>>> int main (int argc,char **argv)
>>> {
>>>    GtkWidget *button_start;
>>>    GtkWidget *hbox,*vbox;
>>>    GdkColor color;
>>>    gdk_color_parse ("blue", &color);
>>>    gtk_init (&argc,&argv);
>>>
>>>    /*...............create top level window...................*/
>>>
>>>    window = gtk_window_new (GTK_WINDOW_TOPLEVEL);
>>>    gtk_window_set_title(GTK_WINDOW(window), "LED status");
>>>    gtk_window_set_default_size(GTK_WINDOW(window), 250, 80);
>>>    gtk_container_set_border_width(GTK_CONTAINER(window), 5);
>>>    g_signal_connect (G_OBJECT(window), "destroy",
>>>            G_CALLBACK (gtk_main_quit), NULL);
>>>
>>>    /*................. create buttons ......................*/
>>>
>>>    button_start = gtk_button_new_with_label("start");
>>>    g_signal_connect(G_OBJECT(button_start), "clicked",
>>>    G_CALLBACK(click_button_start), NULL);
>>>    button1 = gtk_button_new_with_label ("button1");
>>>    g_signal_connect(G_OBJECT(button1), "clicked",
>>>    G_CALLBACK(click_button1), NULL);
>>>    button2 = gtk_button_new_with_label ("button2");
>>>    g_signal_connect(G_OBJECT(button2), "clicked",
>>>    G_CALLBACK(click_button2), NULL);
>>>    button3 = gtk_button_new_with_label ("button3");
>>>    button4 = gtk_button_new_with_label ("button4");
>>>    button5 = gtk_button_new_with_label ("button5");
>>>
>>>    /*.................. Alignements......................*/
>>>
>>>    hbox = gtk_hbox_new(TRUE,1);
>>>    vbox = gtk_vbox_new(TRUE,1);
>>>    gtk_box_pack_start(GTK_BOX(hbox), button1, 1, 1, 0);
>>>    gtk_box_pack_start(GTK_BOX(hbox), button2, 1, 1, 0);
>>>    gtk_box_pack_start(GTK_BOX(hbox), button3, 1, 1, 0);
>>>    gtk_box_pack_start(GTK_BOX(hbox), button4, 1, 1, 0);
>>>    gtk_box_pack_start(GTK_BOX(hbox), button5, 1, 1, 0);
>>>    gtk_box_pack_start(GTK_BOX(vbox), button_start, 1, 1, 0);
>>>    gtk_box_pack_start(GTK_BOX(vbox), hbox, 1, 1, 0);
>>>    gtk_container_add (GTK_CONTAINER (window), vbox);
>>>
>>>    /*....................show...............................*/
>>>
>>>    gtk_widget_show_all (window);
>>>    gtk_main();
>>>    return 0;
>>>
>>>
>>> On Thursday, 31 October 2013 3:09 AM, Ruslan Kabatsayev
>>> <b7.10110...@gmail.com> wrote:
>>> Hi,
>>>
>>> I've tried your code, it works for me. Did you try moving cursor out
>>> of the button after you click it? If the cursor is still inside, the
>>> button is in hovered state, not STATE_NORMAL.
>>> If it still doesn't work, then what widget theme do you use? Maybe it
>>> interferes with your actions (older versions of oxygen-gtk had this
>>> problem, for example).
>>>
>>> Regards,
>>> Ruslan
>>>
>>> On Thu, Oct 31, 2013 at 1:07 PM, Mahesh Chaudhari
>>> <mahesh.chaudh...@ymail.com> wrote:
>>>> what am I doing wrong in Following Code :
>>>>
>>>> GtkWidget *button1;
>>>>  void click_button1(GtkWidget *widget, gpointer data)
>>>>  {
>>>>    printf("I am in click_button\n");                    // able to print
>>>> this
>>>>    GdkColor color;
>>>>    color.red = 27000;
>>>>    color.green = 30325;
>>>>    color.blue = 34181;
>>>>    gtk_widget_modify_bg(GTK_WIDGET(widget), GTK_STATE_NORMAL, &color);
>>>> //gtk_widget_modify_fg(GTK_WIDGET(widget), GTK_STATE_NORMAL, &color);
>>>>  }
>>>>
>>>>
>>>>  some_callback_func()
>>>>  {  ....
>>>>      gtk_button_clicked(GTK_BUTTON(button1));
>>>>    ..... }
>>>>
>>>>
>>>>
>>>>
>>>> int main(int argc, char** argv)
>>>> {
>>>>  gtk_init(&argc,&argv);
>>>>    button1 = gtk_button_new_with_label ("button1");
>>>>      g_signal_connect(G_OBJECT(button1), "clicked",
>>>> G_CALLBACK(click_button1), NULL);
>>>>      gtk_widget_show_all (window);
>>>>      gtk_main();
>>>>      return 0;
>>>>  }
>>>> _______________________________________________
>>>> gtk-app-devel-list mailing list
>>>> gtk-app-devel-list@gnome.org
>>>> https://mail.gnome.org/mailman/listinfo/gtk-app-devel-list
>>>
>>>
>>
>>
>
>
_______________________________________________
gtk-app-devel-list mailing list
gtk-app-devel-list@gnome.org
https://mail.gnome.org/mailman/listinfo/gtk-app-devel-list

Reply via email to