Le samedi 5 mai 2007 00:48, Kevin DeKorte a écrit :
> Hi,
>
> I have a situation where I need to highlight an eventbox when a user
> enters it and unhighlight it when the users leaves. I'm using this code
> but the color I'm drawing in the leave_button_callback is always wrong
> and varies from run to run with the program. Any ideas what I am doing
> wrong. I was looking for a XOR option or something but I don't see it.
>
> gboolean enter_button_callback (GtkWidget *widget, GdkEventCrossing
> *event, gpointer data)
> {
>       GdkGC *gc;
>       gc = gdk_gc_new(widget->window);
>     gdk_draw_rectangle(widget->window, gc, FALSE, 0, 0,
> widget->allocation.width-1,
>                            widget->allocation.height-1);
>     gdk_gc_unref(gc);
>
>       return FALSE;
> }
>
> gboolean leave_button_callback (GtkWidget *widget, GdkEventCrossing
> *event, gpointer data)
> {
>       GdkGC *gc;
>       GdkGCValues v;
>       GdkColor color;
>       GdkColormap *map;
>
>       gc = gdk_gc_new(widget->window);
>       map = gdk_gc_get_colormap(gc);
>       gdk_gc_get_values(gc,&v);
>       gdk_colormap_query_color(map,v.background.pixel,&color);
>
>       gdk_gc_set_foreground(gc,&color);
>
>     gdk_draw_rectangle(widget->window, gc, FALSE, 0, 0,
> widget->allocation.width-1,
>                            widget->allocation.height-1);
>     gdk_gc_unref(gc);
>       return FALSE;
> }

You should never draw anything in an enter/leave callback, but only in an 
expose event. Also note that creating/destroying a GC each time you draw it 
is very slow, so you should do something like this instead:

enter_button_callback()
{
        gtk_widget_set_state(widget, GTK_STATE_PRELIGHT);

        /* not sure this is required, as it's maybe called by set_state? */
        /* you may use gdk_window_invalidate_* instead for better performances,
         * see the docs for more infos */
        gtk_widget_queue_draw(widget);
}

leave_button_callback()
{
        /* same with GTK_STATE_NORMAL */
}

expose_button_callback()
{
        gdk_draw_rectangle(widget->window, widget->state->fg_gc[widget->state], 
...)
}

-- 
Cédric Lucantis
_______________________________________________
gtk-app-devel-list mailing list
gtk-app-devel-list@gnome.org
http://mail.gnome.org/mailman/listinfo/gtk-app-devel-list

Reply via email to