summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorKristian Høgsberg <krh@redhat.com>2006-07-04 17:01:57 -0400
committerKristian Høgsberg <krh@redhat.com>2006-07-04 17:01:57 -0400
commit404c4744915f1f698b16549e36ef1e1b5734105a (patch)
treed3971c51deaae7e57f09b945c75bc86aa433b931
parentf335e8a681bef4c23fe98b79f06f2d75c72941d4 (diff)
Implemented launching on click.
-rw-r--r--dock.c65
1 files changed, 50 insertions, 15 deletions
diff --git a/dock.c b/dock.c
index b3efd09..471cf79 100644
--- a/dock.c
+++ b/dock.c
@@ -38,16 +38,18 @@ typedef struct _KibaLauncher KibaLauncher;
struct _KibaDock
{
- GtkWidget widget;
-
- Model model;
- int width;
- int height;
- int spacing;
- int num_launchers;
- GList *launchers;
- int drag_offset_x;
- int drag_offset_y;
+ GtkWidget widget;
+
+ Model model;
+ int width;
+ int height;
+ int spacing;
+ int num_launchers;
+ GList *launchers;
+ int drag_offset_x;
+ int drag_offset_y;
+ int drag_distance;
+ KibaLauncher *dragging_launcher;
GConfClient *gconf_client;
};
@@ -432,6 +434,7 @@ kiba_dock_button_press_event (GtkWidget *widget,
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)
{
@@ -440,8 +443,9 @@ kiba_dock_button_press_event (GtkWidget *widget,
if (launcher->window != event->window)
continue;
- dock->model.mouse_anchor.x = launcher->object->position.x;
- dock->model.mouse_anchor.y = launcher->object->position.y;
+ 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;
}
@@ -450,11 +454,36 @@ kiba_dock_button_press_event (GtkWidget *widget,
}
static gboolean
+kiba_launcher_exec (gpointer data)
+{
+ KibaLauncher *launcher = data;
+ char **argv;
+ GError *error = NULL;
+
+ /* Bounce the icon. */
+ launcher->object->previous_position.y += g_random_double_range (5, 10);
+
+ /* FIXME: Support drag and drop on launchers with %U and %F */
+ argv = g_strsplit (launcher->exec, " ", 0);
+ g_spawn_async (NULL, argv, NULL, G_SPAWN_SEARCH_PATH,
+ NULL, NULL, NULL, &error);
+ if (error != NULL)
+ g_error ("failed to launch %s: %s\n", argv[0], error->message);
+ g_strfreev (argv);
+
+ return FALSE;
+}
+
+static gboolean
kiba_dock_button_release_event (GtkWidget *widget,
GdkEventButton *event)
{
KibaDock *dock = KIBA_DOCK (widget);
+ if (dock->dragging_launcher && dock->drag_distance <= 1)
+ g_idle_add (kiba_launcher_exec, dock->dragging_launcher);
+
+ dock->dragging_launcher = NULL;
dock->model.mouse_anchor.object = NULL;
return TRUE;
@@ -466,11 +495,17 @@ kiba_dock_motion_notify_event (GtkWidget *widget,
{
KibaDock *dock = KIBA_DOCK (widget);
GdkModifierType state;
- int x, y;
+ int x, y, new_x, new_y, dx, dy;
gdk_window_get_pointer (gdk_get_default_root_window(), &x, &y, &state);
- dock->model.mouse_anchor.x = x - dock->drag_offset_x;
- dock->model.mouse_anchor.y = y - dock->drag_offset_y;
+ new_x = x - dock->drag_offset_x;
+ new_y = y - dock->drag_offset_y;
+ dx = new_x - dock->model.mouse_anchor.x;
+ dy = new_y - dock->model.mouse_anchor.y;
+
+ dock->model.mouse_anchor.x = new_x;
+ dock->model.mouse_anchor.y = new_y;
+ dock->drag_distance += sqrt (dx * dx + dy * dy);
return TRUE;
}