diff options
author | Kristian Høgsberg <krh@redhat.com> | 2006-07-04 17:01:57 -0400 |
---|---|---|
committer | Kristian Høgsberg <krh@redhat.com> | 2006-07-04 17:01:57 -0400 |
commit | 404c4744915f1f698b16549e36ef1e1b5734105a (patch) | |
tree | d3971c51deaae7e57f09b945c75bc86aa433b931 | |
parent | f335e8a681bef4c23fe98b79f06f2d75c72941d4 (diff) |
Implemented launching on click.
-rw-r--r-- | dock.c | 65 |
1 files changed, 50 insertions, 15 deletions
@@ -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; } |