diff options
Diffstat (limited to 'lib/widgets/ephy-editable-toolbar.c')
-rwxr-xr-x | lib/widgets/ephy-editable-toolbar.c | 112 |
1 files changed, 110 insertions, 2 deletions
diff --git a/lib/widgets/ephy-editable-toolbar.c b/lib/widgets/ephy-editable-toolbar.c index 1bb58c6d0..2ccc130b2 100755 --- a/lib/widgets/ephy-editable-toolbar.c +++ b/lib/widgets/ephy-editable-toolbar.c @@ -21,6 +21,7 @@ #include "ephy-toolbars-group.h" #include "ephy-debug.h" #include "ephy-dnd.h" +#include "ephy-file-helpers.h" #include "eggtoolitem.h" #include "eggtoolbar.h" #include "eggseparatortoolitem.h" @@ -60,6 +61,22 @@ static void setup_editor (EphyEditableToolbar *etoolbar, GtkWidget *window); static void update_editor_sheet (EphyEditableToolbar *etoolbar); +static void ephy_editable_toolbar_remove_cb (EggAction *action, EphyEditableToolbar *etoolbar); +static void ephy_editable_toolbar_edit_cb (EggAction *action, EphyEditableToolbar *etoolbar); + +static EggActionGroupEntry ephy_toolbar_popups [] = { + /* Toplevel */ + { "FakeToplevel", (""), NULL, NULL, NULL, NULL, NULL }, + + /* Popups */ + { "RemoveToolbarPopup", N_("_Remove"), GTK_STOCK_REMOVE, NULL, + NULL, G_CALLBACK (ephy_editable_toolbar_remove_cb), NULL }, + { "EditToolbarPopup", N_("_Edit"), GTK_STOCK_PREFERENCES, NULL, + NULL, G_CALLBACK (ephy_editable_toolbar_edit_cb), NULL }, +}; + +static guint ephy_toolbar_popups_n_entries = G_N_ELEMENTS (ephy_toolbar_popups); + enum { PROP_0, @@ -87,9 +104,17 @@ struct EphyEditableToolbarPrivate EphyToolbarsGroup *group; + EggMenuMerge *popup_merge; + EggActionGroup *popup_action_group; + GList *actions_list; }; +typedef struct { + EphyEditableToolbar *etoolbar; + EphyToolbarsToolbar *t; +} ContextMenuData; + GType ephy_editable_toolbar_get_type (void) { @@ -283,6 +308,24 @@ drag_data_get_cb (GtkWidget *widget, 8, target, strlen (target)); } +static void +ephy_editable_toolbar_remove_cb (EggAction *action, + EphyEditableToolbar *etoolbar) +{ + EphyToolbarsToolbar *t; + + t = g_object_get_data (G_OBJECT (etoolbar), "popup_toolbar"); + + ephy_toolbars_group_remove_toolbar (etoolbar->priv->group, t); +} + +static void +ephy_editable_toolbar_edit_cb (EggAction *action, + EphyEditableToolbar *etoolbar) +{ + ephy_editable_toolbar_edit (etoolbar, NULL); +} + static GtkWidget * get_item_widget (EphyEditableToolbar *t, gpointer data) { @@ -347,9 +390,28 @@ disconnect_item_drag_source (EphyToolbarsItem *item, EphyEditableToolbar *etoolb } static void +popup_toolbar_context_menu (EggToolbar *toolbar, ContextMenuData *data) +{ + GtkWidget *widget; + + widget = egg_menu_merge_get_widget (data->etoolbar->priv->popup_merge, + "/popups/EphyToolbarPopup"); + + g_object_set_data (G_OBJECT (data->etoolbar), + "popup_toolbar", data->t); + + g_return_if_fail (widget != NULL); + + gtk_menu_popup (GTK_MENU (widget), NULL, NULL, NULL, NULL, 2, + gtk_get_current_event_time ()); +} + +static void setup_toolbar (EphyToolbarsToolbar *toolbar, EphyEditableToolbar *etoolbar) { GtkWidget *widget; + ContextMenuData *data; + int signal_id; g_return_if_fail (IS_EPHY_EDITABLE_TOOLBAR (etoolbar)); g_return_if_fail (toolbar != NULL); @@ -370,6 +432,21 @@ setup_toolbar (EphyToolbarsToolbar *toolbar, EphyEditableToolbar *etoolbar) etoolbar); } + if (!g_object_get_data (G_OBJECT (widget), "popup_signal_id")) + { + data = g_new0 (ContextMenuData, 1); + data->etoolbar = etoolbar; + data->t = toolbar; + + signal_id = g_signal_connect_data (widget, + "popup_context_menu", + G_CALLBACK (popup_toolbar_context_menu), + data, (GClosureNotify)g_free, 0); + + g_object_set_data (G_OBJECT (widget), "popup_signal_id", + GINT_TO_POINTER (signal_id)); + } + etoolbar->priv->last_toolbar = widget; } @@ -598,6 +675,8 @@ ephy_editable_toolbar_class_init (EphyEditableToolbarClass *klass) static void ephy_editable_toolbar_init (EphyEditableToolbar *t) { + int i; + t->priv = g_new0 (EphyEditableToolbarPrivate, 1); t->priv->merge = NULL; @@ -607,6 +686,23 @@ ephy_editable_toolbar_init (EphyEditableToolbar *t) t->priv->editor_sheet_dirty = FALSE; t->priv->edit_mode = FALSE; t->priv->actions_list = NULL; + + for (i = 0; i < ephy_toolbar_popups_n_entries; i++) + { + ephy_toolbar_popups[i].user_data = t; + } + + t->priv->popup_merge = egg_menu_merge_new (); + + t->priv->popup_action_group = egg_action_group_new ("ToolbarPopupActions"); + egg_action_group_add_actions (t->priv->popup_action_group, + ephy_toolbar_popups, + ephy_toolbar_popups_n_entries); + egg_menu_merge_insert_action_group (t->priv->popup_merge, + t->priv->popup_action_group, 0); + egg_menu_merge_add_ui_from_file (t->priv->popup_merge, + ephy_file ("epiphany-toolbar-popup-ui.xml"), + NULL); } static void @@ -622,6 +718,11 @@ ephy_editable_toolbar_finalize (GObject *object) gtk_widget_destroy (t->priv->editor); } + g_object_unref (t->priv->popup_action_group); + egg_menu_merge_remove_action_group (t->priv->popup_merge, + t->priv->popup_action_group); + g_object_unref (t->priv->popup_merge); + g_free (t->priv); LOG ("EphyEditableToolbar finalized") @@ -887,8 +988,15 @@ button_press_cb (GtkWidget *w, widget = gtk_get_event_widget (event); toolitem = gtk_widget_get_ancestor (widget, EGG_TYPE_TOOL_ITEM); - - if (toolitem == NULL) return FALSE; + + if (toolitem == NULL && + event->type == GDK_BUTTON_PRESS && + EGG_IS_TOOLBAR (widget)) + { + gtk_widget_event (widget, event); + return FALSE; + } + else if (toolitem == NULL) return FALSE; switch (event->type) { |