summaryrefslogtreecommitdiff
path: root/libmdock/mdock-widget.c
diff options
context:
space:
mode:
Diffstat (limited to 'libmdock/mdock-widget.c')
-rw-r--r--libmdock/mdock-widget.c51
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);