Re: forcing a a widget_queue_draw

The buttons are all toggle buttons. I am using gtk_toggle_button_set_active to set the state of the button. When I toggle one button, all the otthers should "untoggle", but they won't look like that until I force the redraw. All the buttons are visible, but the draw the wrong state: they don't appear toggled or untoggled until I force the expose event with the mouse or another window.

I tried blocking the signal handler, it doesn't help.

Any ideas?

Ben Johnson wrote:

Are all the widgets in this list the same type?  What type are they?
Are they toggle buttons?  (created with gtk_toggle_button_new() or
similar?) Or are they radio buttons?  Or, if they are a new type defined
by you, what widget are they sub-classed from?

gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(buttons[n]), myboolean);

...should be all you need.  in fact, it's possible that setting the
"button_down" and "active" properties directly is what's screwing things

I assume you're calling gtk_widget_show() on these buttons before this
code is running.  The buttons are visible, right?

Do you have "toggled" a signal handler connected to these buttons?  In
that signal handler, do you activate or de-activate any buttons in the
array that did not receive the signal?  If yes, you'll probably want to
block the signal before calling the .._set_active() function.

(I'm kind of grasping at straws if you can't tell.  There are a lot of

- Ben

On Mon, Jan 31, 2005 at 02:29:23PM -0800, Adrian E. Feiguin wrote:
I probably wasn't clear. I just want to initialize my GUI. Suppose that I have a list of buttons (something like radio buttons, although I implement it myself in a customized fashion). I have a list of widgets, if widget_list[n] == active_widget, then the button is down, else it's up. So I do something like this:

      if(widget_list[n] == active_widget){
          GTK_BUTTON(buttons[n])->button_down = TRUE;
          GTK_TOGGLE_BUTTON(buttons[n])->active = TRUE;
gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(buttons[n]), TRUE);
          GTK_BUTTON(buttons[n])->button_down = FALSE;
          GTK_TOGGLE_BUTTON(buttons[n])->active = FALSE;
gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(buttons[n]), FALSE);

And its simply doesn't work as intended. The button does not appear down until I force the expose event. With gtk-1 I would use gtk_widget_draw instead of queue draw, and it worked just fine. But now in gtk-2 there is no gtk_widget_draw. How do I force the widget to draw?

Tristan Van Berkom wrote:

On Mon, 31 Jan 2005 12:42:33 -0800, Adrian E. Feiguin <afeiguin uci edu> wrote:

Hi all.
 This is an example, but there are many cases when I want to do
something similar:

Suppose that I change the state of a toggle button with
gtk_toggle_button_set_active or gtk_widget_set_state. The widget just
wont draw properly until I move the mouse pointer over it forcing an
expose event. What's going on? in gtk-1 I would simply call
gtk_widget_draw, but now, event calling gtk_widget_queue_draw, the
widget won't update. Can anyone explain it to me, please?
Hmm, seems like you're hijacking the main loop somewhere, you
got a `while (42) { /* code body */ }' lying around in your code ?

If its absolutely nescisary to implement the main program loop yourself;
you can call:
 `while (gtk_events_pending()) gtk_main_iteration_do (FALSE);' once
every loop.

Just a guess, OTOH maybe there is something wrong with your X server installation (if your not recieving expose events or are unable to queue them).



gtk-list mailing list
gtk-list gnome org

[Date Prev][Date Next]   [Thread Prev][Thread Next]   [Thread Index] [Date Index] [Author Index]