diff options
Diffstat (limited to 'libmdock/mdock-widget.c')
-rw-r--r-- | libmdock/mdock-widget.c | 51 |
1 files changed, 49 insertions, 2 deletions
diff --git a/libmdock/mdock-widget.c b/libmdock/mdock-widget.c index 5e3fbbd..a97e886 100644 --- a/libmdock/mdock-widget.c +++ b/libmdock/mdock-widget.c @@ -23,6 +23,8 @@ #include <libwnck/libwnck.h> #include "mdock-widget.h" +#include "mdock-item-window-list.h" +#include "mdock-item-menu.h" #include "mdock-item.h" #include "matcher.h" @@ -35,7 +37,8 @@ struct _MDockWidgetPrivate GHashTable *appid_to_item; GHashTable *desktopid_to_item; GHashTable *window_to_item; - gboolean loading_settings; + gboolean loading_settings : 1; + gboolean just_dropped : 1; }; G_DEFINE_TYPE(MDockWidget, mdock_widget, GTK_TYPE_BOX) @@ -51,6 +54,7 @@ enum { static GParamSpec *obj_properties[N_PROPERTIES] = { NULL }; G_DEFINE_QUARK(mdock-widget-item-iter, mdock_widget_item_iter) +G_DEFINE_QUARK(mdock-widget-item-menu, mdock_widget_item_menu) enum { DRAG_TYPE_ITEM, @@ -103,6 +107,36 @@ static void handle_item_pinned_changed(MDockWidget *self, GParamSpec *spec, MDoc } } +static gboolean handle_item_button_press(MDockWidget *self, GdkEventButton *event, MDockItem *item) +{ + switch (event->button) { + case 3: + gtk_menu_popup(GTK_MENU(g_object_get_qdata(G_OBJECT(item), mdock_widget_item_menu_quark())), + NULL, NULL, NULL, NULL, event->button, event->time); + + break; + } + + return TRUE; +} + +static gboolean handle_item_button_release(MDockWidget *self, GdkEventButton *event, MDockItem *item) +{ + switch (event->button) { + case 1: + if (self->priv->just_dropped) { + self->priv->just_dropped = FALSE; + break; + } + + mdock_item_activate(item); + + break; + } + + return TRUE; +} + static void handle_item_drag_begin(MDockWidget *self, GdkDragContext *dc, MDockItem *item) { g_debug("drag begin"); @@ -204,6 +238,7 @@ static void mdock_widget_drag_data_received(GtkWidget *widget, GdkDragContext *c static gboolean mdock_widget_drag_drop(GtkWidget *widget, GdkDragContext *context, gint x, gint y, guint timestamp) { + MDockWidget *self = MDOCK_WIDGET(widget); GtkTargetList *target_list = gtk_drag_dest_get_target_list(widget); GdkAtom target = gtk_drag_dest_find_target(widget, context, target_list); guint info; @@ -222,6 +257,9 @@ static gboolean mdock_widget_drag_drop(GtkWidget *widget, GdkDragContext *contex g_message("Drag target type not found"); } + g_debug("drag drop"); + self->priv->just_dropped = TRUE; + if (drag_ok) { gtk_drag_get_data(widget, context, target, timestamp); } else { @@ -279,6 +317,12 @@ static void connect_item(MDockWidget *self, MDockItem *item, GSequenceIter *posi gtk_drag_source_set(GTK_WIDGET(item), GDK_BUTTON1_MASK, drag_types, G_N_ELEMENTS(drag_types), GDK_ACTION_MOVE); + g_signal_connect_object(item, "button-press-event", + G_CALLBACK(handle_item_button_press), self, + G_CONNECT_SWAPPED); + g_signal_connect_object(item, "button-release-event", + G_CALLBACK(handle_item_button_release), self, + G_CONNECT_SWAPPED); g_signal_connect_object(item, "drag-begin", G_CALLBACK(handle_item_drag_begin), self, G_CONNECT_SWAPPED); @@ -291,6 +335,9 @@ static void connect_item(MDockWidget *self, MDockItem *item, GSequenceIter *posi g_signal_connect_object(item, "drag-data-delete", G_CALLBACK(handle_item_drag_data_delete), self, G_CONNECT_SWAPPED); + + g_object_set_qdata_full(G_OBJECT(item), mdock_widget_item_menu_quark(), + mdock_item_menu_new(item), (GDestroyNotify)gtk_widget_destroy); } @@ -372,7 +419,7 @@ static void handle_window_closed(MDockWidget *self, WnckWindow *window, WnckScre mdock_item_remove_window(item, window); g_hash_table_remove(self->priv->window_to_item, window); - if (mdock_item_get_num_windows(item) == 0 && !mdock_item_get_pinned(item)) { + if (!mdock_item_has_windows(item) && !mdock_item_get_pinned(item)) { // Removing item from dock g_hash_table_foreach_remove(self->priv->appid_to_item, filter_deleted_group, iter); g_hash_table_foreach_remove(self->priv->desktopid_to_item, filter_deleted_group, iter); |