diff options
author | Kristian Høgsberg <krh@redhat.com> | 2006-07-04 17:49:42 -0400 |
---|---|---|
committer | Kristian Høgsberg <krh@redhat.com> | 2006-07-04 17:49:42 -0400 |
commit | f8faf232f33746bdd9b0da67bebdce0fceb267c5 (patch) | |
tree | 1b0d35667932b7fc22a48113b5632d853d475593 | |
parent | 404c4744915f1f698b16549e36ef1e1b5734105a (diff) |
Prelight on mouse-over on launchers.
-rw-r--r-- | dock.c | 115 |
1 files changed, 91 insertions, 24 deletions
@@ -68,6 +68,7 @@ struct _KibaLauncher { char *exec; char *comment; char *icon; + gboolean prelight; }; #define KIBA_TYPE_DOCK (kiba_dock_get_type ()) @@ -88,6 +89,10 @@ static gboolean kiba_dock_button_release_event (GtkWidget *widget, GdkEventButton *event); static gboolean kiba_dock_motion_notify_event (GtkWidget *widget, GdkEventMotion *event); +static gboolean kiba_dock_enter_notify_event (GtkWidget *widget, + GdkEventCrossing *event); +static gboolean kiba_dock_leave_notify_event (GtkWidget *widget, + GdkEventCrossing *event); static void kiba_dock_drag_data_received (GtkWidget *widget, GdkDragContext *drag_context, @@ -121,6 +126,8 @@ kiba_dock_class_init (KibaDockClass *class) widget_class->button_press_event = kiba_dock_button_press_event; widget_class->button_release_event = kiba_dock_button_release_event; widget_class->motion_notify_event = kiba_dock_motion_notify_event; + widget_class->enter_notify_event = kiba_dock_enter_notify_event; + widget_class->leave_notify_event = kiba_dock_leave_notify_event; } static void @@ -189,6 +196,23 @@ kiba_dock_new (void) return g_object_new (KIBA_TYPE_DOCK, NULL); } +static KibaLauncher * +kiba_dock_get_launcher_for_window (KibaDock *dock, + GdkWindow *window) +{ + GList *l; + + for (l = dock->launchers; l != NULL; l = l->next) + { + KibaLauncher *launcher = l->data; + + if (launcher->window == window) + return launcher; + } + + return NULL; +} + static void kiba_dock_paint (KibaDock *dock) { @@ -235,6 +259,14 @@ kiba_launcher_paint (KibaLauncher *launcher) gdk_cairo_set_source_pixbuf (cr, launcher->pixbuf, 0, 0); cairo_set_operator (cr, CAIRO_OPERATOR_SOURCE); cairo_paint (cr); + + if (launcher->prelight) + { + cairo_set_source_rgba (cr, 1, 1, 1, 0.3); + cairo_set_operator (cr, CAIRO_OPERATOR_ATOP); + cairo_paint (cr); + } + cairo_destroy (cr); } @@ -244,21 +276,14 @@ kiba_dock_expose_event (GtkWidget *widget, { KibaDock *dock = KIBA_DOCK (widget); KibaLauncher *launcher; - GList *l; if (event->window == widget->window) kiba_dock_paint (dock); else { - for (l = dock->launchers; l != NULL; l = l->next) - { - launcher = l->data; - if (launcher->window != event->window) - continue; - - kiba_launcher_paint (launcher); - break; - } + launcher = kiba_dock_get_launcher_for_window (dock, event->window); + if (launcher != NULL) + kiba_launcher_paint (launcher); } return TRUE; @@ -430,25 +455,20 @@ kiba_dock_button_press_event (GtkWidget *widget, GdkEventButton *event) { KibaDock *dock = KIBA_DOCK (widget); - GList *l; + KibaLauncher *launcher; dock->drag_offset_x = event->x; dock->drag_offset_y = event->y; dock->drag_distance = 0; - for (l = dock->launchers; l != NULL; l = l->next) - { - KibaLauncher *launcher = l->data; - - if (launcher->window != event->window) - continue; + launcher = kiba_dock_get_launcher_for_window (dock, event->window); + if (launcher == NULL) + return FALSE; - dock->dragging_launcher = launcher; - dock->model.mouse_anchor.x = launcher->object->position.x; - dock->model.mouse_anchor.y = launcher->object->position.y; - dock->model.mouse_anchor.object = launcher->object; - break; - } + dock->dragging_launcher = launcher; + dock->model.mouse_anchor.x = launcher->object->position.x; + dock->model.mouse_anchor.y = launcher->object->position.y; + dock->model.mouse_anchor.object = launcher->object; return TRUE; } @@ -474,6 +494,19 @@ kiba_launcher_exec (gpointer data) return FALSE; } +static void +kiba_launcher_queue_draw (KibaLauncher *launcher) +{ + GdkRectangle invalid_rect; + + invalid_rect.x = 0; + invalid_rect.y = 0; + invalid_rect.width = gdk_pixbuf_get_width (launcher->pixbuf); + invalid_rect.height = gdk_pixbuf_get_height (launcher->pixbuf); + + gdk_window_invalidate_rect (launcher->window, &invalid_rect, TRUE); +} + static gboolean kiba_dock_button_release_event (GtkWidget *widget, GdkEventButton *event) @@ -510,6 +543,40 @@ kiba_dock_motion_notify_event (GtkWidget *widget, return TRUE; } +static gboolean +kiba_dock_enter_notify_event (GtkWidget *widget, + GdkEventCrossing *event) +{ + KibaDock *dock = KIBA_DOCK (widget); + KibaLauncher *launcher; + + launcher = kiba_dock_get_launcher_for_window (dock, event->window); + if (launcher == NULL) + return FALSE; + + launcher->prelight = TRUE; + kiba_launcher_queue_draw (launcher); + + return TRUE; +} + +static gboolean +kiba_dock_leave_notify_event (GtkWidget *widget, + GdkEventCrossing *event) +{ + KibaDock *dock = KIBA_DOCK (widget); + KibaLauncher *launcher; + + launcher = kiba_dock_get_launcher_for_window (dock, event->window); + if (launcher == NULL) + return FALSE; + + launcher->prelight = FALSE; + kiba_launcher_queue_draw (launcher); + + return TRUE; +} + static void parse_desktop_file (KibaLauncher *launcher, const char *uri, GError **error) { @@ -627,7 +694,7 @@ kiba_launcher_new (KibaDock *dock, Object *object, const char *gconf_path) char *desktop_file; char *key; - launcher = g_new (KibaLauncher, 1); + launcher = g_new0 (KibaLauncher, 1); key = g_strdup_printf ("%s/file", gconf_path); desktop_file = gconf_client_get_string (dock->gconf_client, key, &error); |