aboutsummaryrefslogtreecommitdiffstats
path: root/lib/widgets/ephy-editable-toolbar.c
diff options
context:
space:
mode:
Diffstat (limited to 'lib/widgets/ephy-editable-toolbar.c')
-rwxr-xr-xlib/widgets/ephy-editable-toolbar.c92
1 files changed, 85 insertions, 7 deletions
diff --git a/lib/widgets/ephy-editable-toolbar.c b/lib/widgets/ephy-editable-toolbar.c
index eddb39bd9..9861f4bf4 100755
--- a/lib/widgets/ephy-editable-toolbar.c
+++ b/lib/widgets/ephy-editable-toolbar.c
@@ -258,8 +258,22 @@ drag_data_delete_cb (GtkWidget *widget,
g_return_if_fail (IS_EPHY_EDITABLE_TOOLBAR (etoolbar));
node = (EphyToolbarsItem *)g_object_get_data (G_OBJECT (widget), "item_data");
- g_return_if_fail (node != NULL);
- ephy_toolbars_group_remove_item (etoolbar->priv->group, node);
+ if (node)
+ {
+ ephy_toolbars_group_remove_item (etoolbar->priv->group, node);
+ }
+ else
+ {
+ EphyToolbarsToolbar *toolbar;
+ GtkWidget *child = GTK_BIN (widget)->child;
+
+ g_return_if_fail (child != NULL);
+ toolbar = (EphyToolbarsToolbar *)g_object_get_data
+ (G_OBJECT (child), "toolbar_data");
+ g_return_if_fail (toolbar != NULL);
+
+ ephy_toolbars_group_remove_toolbar (etoolbar->priv->group, toolbar);
+ }
etoolbar->priv->toolbars_dirty = TRUE;
queue_ui_update (etoolbar);
@@ -279,7 +293,7 @@ drag_data_get_cb (GtkWidget *widget,
g_return_if_fail (IS_EPHY_EDITABLE_TOOLBAR (etoolbar));
action = EGG_ACTION (g_object_get_data (G_OBJECT (widget), "egg-action"));
- target = action->name;
+ target = action ? action->name : "Toolbar";
LOG ("Drag data get %s", action->name);
@@ -352,6 +366,49 @@ disconnect_item_drag_source (EphyToolbarsItem *item, EphyEditableToolbar *etoolb
}
static void
+connect_toolbar_drag_source (EphyToolbarsToolbar *toolbar, EphyEditableToolbar *etoolbar)
+{
+ GtkWidget *widget;
+
+ g_return_if_fail (IS_EPHY_EDITABLE_TOOLBAR (etoolbar));
+ g_return_if_fail (toolbar != NULL);
+
+ widget = get_item_widget (etoolbar, toolbar);
+
+ if (!g_object_get_data (G_OBJECT (widget), "drag_source_set"))
+ {
+ g_object_set_data (G_OBJECT (widget), "drag_source_set",
+ GINT_TO_POINTER (TRUE));
+ g_signal_connect (widget->parent, "drag_data_get",
+ G_CALLBACK (drag_data_get_cb),
+ etoolbar);
+ g_signal_connect (widget->parent, "drag_data_delete",
+ G_CALLBACK (drag_data_delete_cb),
+ etoolbar);
+ }
+}
+
+static void
+disconnect_toolbar_drag_source (EphyToolbarsToolbar *toolbar, EphyEditableToolbar *etoolbar)
+{
+ GtkWidget *widget;
+
+ g_return_if_fail (IS_EPHY_EDITABLE_TOOLBAR (etoolbar));
+ g_return_if_fail (toolbar != NULL);
+
+ widget = get_item_widget (etoolbar, toolbar);
+
+ if (g_object_get_data (G_OBJECT (widget), "drag_source_set"))
+ {
+ g_object_set_data (G_OBJECT (widget), "drag_source_set",
+ GINT_TO_POINTER (FALSE));
+ g_signal_handlers_disconnect_by_func (widget->parent,
+ G_CALLBACK (drag_data_delete_cb),
+ etoolbar);
+ }
+}
+
+static void
setup_toolbar (EphyToolbarsToolbar *toolbar, EphyEditableToolbar *etoolbar)
{
GtkWidget *widget;
@@ -470,6 +527,9 @@ do_merge (EphyEditableToolbar *t)
ephy_toolbars_group_foreach_item (t->priv->group,
(EphyToolbarsGroupForeachItemFunc)
connect_item_drag_source, t);
+ ephy_toolbars_group_foreach_toolbar (t->priv->group,
+ (EphyToolbarsGroupForeachToolbarFunc)
+ connect_toolbar_drag_source, t);
}
ephy_toolbars_group_foreach_toolbar (t->priv->group,
@@ -733,6 +793,10 @@ editor_close_cb (GtkWidget *button, EphyEditableToolbar *etoolbar)
(EphyToolbarsGroupForeachItemFunc)
disconnect_item_drag_source,
etoolbar);
+ ephy_toolbars_group_foreach_toolbar (etoolbar->priv->group,
+ (EphyToolbarsGroupForeachToolbarFunc)
+ disconnect_toolbar_drag_source,
+ etoolbar);
hide_editor (etoolbar);
}
@@ -975,19 +1039,29 @@ button_press_cb (GtkWidget *w,
EphyEditableToolbar *etoolbar)
{
GtkWidget *widget;
- GtkWidget *toolitem;
+ GtkWidget *drag_widget;
+ GtkWidget *child;
g_return_val_if_fail (IS_EPHY_EDITABLE_TOOLBAR (etoolbar), FALSE);
widget = gtk_get_event_widget (event);
- toolitem = gtk_widget_get_ancestor (widget, EGG_TYPE_TOOL_ITEM);
+ child = GTK_BIN (widget)->child;
+
+ if (EGG_IS_TOOLBAR (child))
+ {
+ drag_widget = widget;
+ }
+ else
+ {
+ drag_widget = gtk_widget_get_ancestor (widget, EGG_TYPE_TOOL_ITEM);
+ }
- if (toolitem == NULL) return FALSE;
+ if (drag_widget == NULL) return FALSE;
switch (event->type)
{
case GDK_BUTTON_PRESS:
- gtk_drag_begin (toolitem,
+ gtk_drag_begin (drag_widget,
gtk_target_list_new (source_drag_types, 1),
GDK_ACTION_MOVE, 1, event);
return TRUE;
@@ -1038,6 +1112,10 @@ ephy_editable_toolbar_edit (EphyEditableToolbar *etoolbar)
ephy_toolbars_group_foreach_item (etoolbar->priv->group,
(EphyToolbarsGroupForeachItemFunc)
connect_item_drag_source, etoolbar);
+ ephy_toolbars_group_foreach_toolbar (etoolbar->priv->group,
+ (EphyToolbarsGroupForeachToolbarFunc)
+ connect_toolbar_drag_source,
+ etoolbar);
ephy_toolbars_group_foreach_item (etoolbar->priv->group,
(EphyToolbarsGroupForeachItemFunc)
set_action_sensitive, etoolbar);