summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorKristian Høgsberg <krh@redhat.com>2006-07-04 17:49:42 -0400
committerKristian Høgsberg <krh@redhat.com>2006-07-04 17:49:42 -0400
commitf8faf232f33746bdd9b0da67bebdce0fceb267c5 (patch)
tree1b0d35667932b7fc22a48113b5632d853d475593
parent404c4744915f1f698b16549e36ef1e1b5734105a (diff)
Prelight on mouse-over on launchers.
-rw-r--r--dock.c115
1 files changed, 91 insertions, 24 deletions
diff --git a/dock.c b/dock.c
index 471cf79..e6c46f9 100644
--- a/dock.c
+++ b/dock.c
@@ -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);