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, 28 insertions, 23 deletions
diff --git a/libmdock/mdock-widget.c b/libmdock/mdock-widget.c
index 5b3daed..cdb942e 100644
--- a/libmdock/mdock-widget.c
+++ b/libmdock/mdock-widget.c
@@ -198,16 +198,16 @@ static void handle_item_pinned_changed(MDockWidget *self, GParamSpec *spec, MDoc
static gboolean handle_item_button_press(MDockWidget *self, GdkEventButton *event, MDockItem *item)
{
+ if (self->priv->popup_timer) {
+ g_source_remove(self->priv->popup_timer);
+ self->priv->popup_timer = 0;
+ }
+ if (self->priv->current_popup_item) {
+ hide_item_popup(self);
+ }
+
switch (event->button) {
case 3:
- if (self->priv->popup_timer) {
- g_source_remove(self->priv->popup_timer);
- self->priv->popup_timer = 0;
- }
- if (self->priv->current_popup_item) {
- hide_item_popup(self);
- }
-
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);
@@ -276,16 +276,25 @@ static void handle_item_drag_data_delete(MDockWidget *self, GdkDragContext *dc,
g_debug("data delete");
}
-static GSequenceIter * find_drop_position_at_coordinates(MDockWidget *self, gint x, gint y)
+static GSequenceIter * find_drop_position_at_coordinates(MDockWidget *self, gint x, gint y, gboolean moving)
{
- const guint icon_size = g_settings_get_uint(self->priv->settings, "icon-size");
- const guint spacing = gtk_box_get_spacing(GTK_BOX(self));
- const guint offset = icon_size / 4;
- if (gtk_orientable_get_orientation(GTK_ORIENTABLE(self)) == GTK_ORIENTATION_HORIZONTAL) {
- g_debug("dropped in position %d", x / icon_size);
- return g_sequence_get_iter_at_pos(self->priv->items, (x + offset) / (icon_size + spacing)) ;
+ GtkOrientation orientation = gtk_orientable_get_orientation(GTK_ORIENTABLE(self));
+ gint nitems = g_sequence_get_length(self->priv->items) - (moving ? 1 : 0);
+ GtkAllocation allocation;
+ gtk_widget_get_allocation(GTK_WIDGET(self), &allocation);
+ const gint major_length = orientation == GTK_ORIENTATION_HORIZONTAL ? allocation.width : allocation.height;
+
+ if (nitems == 0) {
+ return g_sequence_get_begin_iter(self->priv->items);
+ }
+
+ const gint item_size = major_length / nitems;
+ const guint offset = item_size / 3;
+
+ if (orientation == GTK_ORIENTATION_HORIZONTAL) {
+ return g_sequence_get_iter_at_pos(self->priv->items, (x + offset) / item_size);
} else {
- return g_sequence_get_iter_at_pos(self->priv->items, (y + offset) / (icon_size + spacing));
+ return g_sequence_get_iter_at_pos(self->priv->items, (y + offset) / item_size);
}
}
@@ -306,7 +315,7 @@ static void mdock_widget_drag_data_received(GtkWidget *widget, GdkDragContext *c
g_debug("Got position %u", position);
GSequenceIter *iter = g_sequence_get_iter_at_pos(self->priv->items, position);
g_warn_if_fail(iter);
- GSequenceIter *pos_iter = find_drop_position_at_coordinates(self, x, y);
+ GSequenceIter *pos_iter = find_drop_position_at_coordinates(self, x, y, TRUE);
move_item_to_position(self, iter, pos_iter);
if (mdock_item_get_pinned(MDOCK_ITEM(g_sequence_get(iter)))) {
save_items_to_settings(self);
@@ -473,10 +482,6 @@ static void connect_item(MDockWidget *self, MDockItem *item, GSequenceIter *posi
G_CALLBACK(handle_item_pinned_changed), self,
G_CONNECT_SWAPPED);
- g_settings_bind(self->priv->settings, "icon-size",
- item, "icon-size",
- G_SETTINGS_BIND_GET | G_SETTINGS_BIND_NO_SENSITIVITY);
-
gtk_drag_source_set(GTK_WIDGET(item), GDK_BUTTON1_MASK,
drag_types, G_N_ELEMENTS(drag_types),
GDK_ACTION_MOVE);
@@ -559,7 +564,7 @@ static void reload_items_from_settings(MDockWidget *self)
connect_item(self, item, iter);
gtk_widget_show(GTK_WIDGET(item));
- gtk_box_pack_start(GTK_BOX(self), GTK_WIDGET(item), FALSE, FALSE, 0);
+ gtk_box_pack_start(GTK_BOX(self), GTK_WIDGET(item), TRUE, TRUE, 0);
if (!g_sequence_iter_is_end(seq_iter)) {
// Fix the order!
gtk_box_reorder_child(GTK_BOX(self), GTK_WIDGET(item),
@@ -667,7 +672,7 @@ static void handle_window_opened(MDockWidget *self, WnckWindow *window, WnckScre
g_hash_table_insert(self->priv->window_to_item, window, iter);
gtk_widget_show(GTK_WIDGET(item));
- gtk_box_pack_start(GTK_BOX(self), GTK_WIDGET(item), FALSE, FALSE, 0);
+ gtk_box_pack_start(GTK_BOX(self), GTK_WIDGET(item), TRUE, TRUE, 0);
}
static void handle_settings_items_changed(MDockWidget *self, gchar *key, GSettings *settings)