diff options
Diffstat (limited to 'midori')
-rw-r--r-- | midori/midori-browser.c | 345 | ||||
-rw-r--r-- | midori/midori-browser.h | 2 | ||||
-rw-r--r-- | midori/midori-contextaction.vala | 12 | ||||
-rw-r--r-- | midori/midori-frontend.c | 4 | ||||
-rw-r--r-- | midori/midori-panedaction.vala | 4 | ||||
-rw-r--r-- | midori/midori-window.vala | 217 | ||||
-rw-r--r-- | midori/midori.vapi | 2 |
7 files changed, 295 insertions, 291 deletions
diff --git a/midori/midori-browser.c b/midori/midori-browser.c index 744a8bf8..e4ed65a0 100644 --- a/midori/midori-browser.c +++ b/midori/midori-browser.c @@ -61,7 +61,7 @@ struct _MidoriBrowser { - GtkWindow parent_instance; + MidoriWindow parent_instance; GtkActionGroup* action_group; GtkWidget* menubar; GtkWidget* throbber; @@ -102,7 +102,7 @@ struct _MidoriBrowser gboolean bookmarkbar_populate; }; -G_DEFINE_TYPE (MidoriBrowser, midori_browser, GTK_TYPE_WINDOW) +G_DEFINE_TYPE (MidoriBrowser, midori_browser, MIDORI_TYPE_WINDOW) enum { @@ -192,6 +192,12 @@ midori_browser_settings_notify (MidoriWebSettings* web_settings, GParamSpec* pspec, MidoriBrowser* browser); +static void +midori_browser_toolbar_popup_context_menu_history (MidoriBrowser* browser, + GtkWidget* widget, + gboolean back, + gint x, + gint y); void midori_panel_set_toolbar_style (MidoriPanel* panel, GtkToolbarStyle style); @@ -1710,10 +1716,6 @@ midori_view_new_window_cb (GtkWidget* view, } static void -_midori_browser_set_toolbar_items (MidoriBrowser* browser, - const gchar* items); - -static void midori_view_new_view_cb (GtkWidget* view, GtkWidget* new_view, MidoriNewView where, @@ -1735,7 +1737,8 @@ midori_view_new_view_cb (GtkWidget* view, sokoke_widget_set_visible (new_browser->bookmarkbar, FALSE); sokoke_widget_set_visible (new_browser->statusbar, FALSE); _action_set_visible (new_browser, "CompactMenu", FALSE); - _midori_browser_set_toolbar_items (new_browser, "Location"); + _action_set_sensitive (new_browser, "Location", FALSE); + midori_window_set_actions (MIDORI_WINDOW (new_browser), "Location"); sokoke_widget_set_visible (new_browser->panel, FALSE); midori_browser_add_tab (new_browser, new_view); midori_browser_set_current_tab (new_browser, new_view); @@ -3111,22 +3114,6 @@ _action_find_previous_activate (GtkAction* action, midori_findbar_continue (MIDORI_FINDBAR (browser->find), FALSE); } -static void -midori_browser_navigationbar_notify_style_cb (GObject* object, - GParamSpec* arg1, - MidoriBrowser* browser) -{ - MidoriToolbarStyle toolbar_style; - - g_object_get (browser->settings, "toolbar-style", &toolbar_style, NULL); - _midori_browser_set_toolbar_style (browser, toolbar_style); -} - -static gboolean -midori_browser_toolbar_item_button_press_event_cb (GtkWidget* toolitem, - GdkEventButton* event, - MidoriBrowser* browser); - /** * midori_browser_get_toolbar_actions: * @@ -3176,7 +3163,8 @@ midori_browser_toolbar_popup_context_menu_cb (GtkWidget* widget, MidoriContextAction* menu = midori_context_action_new ("ToolbarContextMenu", NULL, NULL, NULL); midori_context_action_add_action_group (menu, browser->action_group); midori_context_action_add_by_name (menu, "Menubar"); - midori_context_action_add_by_name (menu, "Navigationbar"); + if (GTK_IS_TOOLBAR (browser->navigationbar)) + midori_context_action_add_by_name (menu, "Navigationbar"); midori_context_action_add_by_name (menu, "Bookmarkbar"); midori_context_action_add_by_name (menu, "Statusbar"); @@ -3460,7 +3448,7 @@ _action_preferences_activate (GtkAction* action, } static gboolean -midori_browser_has_native_menubar (void) +midori_browser_has_native_menubar (MidoriBrowser* browser) { static const gchar* ubuntu_menuproxy = NULL; if (ubuntu_menuproxy == NULL) @@ -3480,51 +3468,13 @@ _action_menubar_activate (GtkToggleAction* menubar_action, MidoriBrowser* browser) { gboolean active = gtk_toggle_action_get_active (menubar_action); - GtkAction* menu_action = _action_by_name (browser, "CompactMenu"); - GString* toolbar_items; - GList* children; - gchar* items; - if (midori_browser_has_native_menubar ()) + if (midori_browser_has_native_menubar (browser)) active = FALSE; - - toolbar_items = g_string_new (NULL); - children = gtk_container_get_children (GTK_CONTAINER (browser->navigationbar)); - for (; children != NULL; children = g_list_next (children)) - { - GtkAction* action = gtk_activatable_get_related_action ( - GTK_ACTIVATABLE (children->data)); - if (!action) - continue; - if (action == ((GtkAction*)menu_action)) - { - if (active) - { - gtk_container_remove (GTK_CONTAINER (browser->navigationbar), - GTK_WIDGET (children->data)); - } - continue; - } - else if (MIDORI_IS_PANED_ACTION (action)) - { - MidoriPanedAction* paned_action = MIDORI_PANED_ACTION (action); - g_string_append_printf (toolbar_items, "%s,%s", - midori_paned_action_get_child1_name (paned_action), - midori_paned_action_get_child2_name (paned_action)); - } - else - g_string_append (toolbar_items, gtk_action_get_name (action)); - g_string_append_c (toolbar_items, ','); - } - g_list_free (children); - + midori_window_set_show_menubar (MIDORI_WINDOW (browser), active); if (katze_object_get_boolean (browser->settings, "show-menubar") != active) g_object_set (browser->settings, "show-menubar", active, NULL); - items = g_string_free (toolbar_items, FALSE); - g_object_set (browser->settings, "toolbar-items", items, NULL); - g_free (items); - sokoke_widget_set_visible (browser->menubar, active); g_object_set_data (G_OBJECT (browser), "midori-toolbars-visible", gtk_widget_get_visible (browser->menubar) @@ -4396,6 +4346,26 @@ midori_browser_bookmark_delete_activate_cb (GtkWidget* menuitem, midori_bookmarks_db_remove_item (browser->bookmarks, item); } +static gboolean +midori_browser_toolbar_context_menu_cb (GtkWidget* toolbar, + GtkWidget* widget, + GtkAction* action, + MidoriBrowser* browser) +{ + const gchar* name = gtk_action_get_name (action); + gboolean back = !g_strcmp0 (name, "Back"); + if (back + || g_str_has_suffix (name, "Forward")) + { + midori_browser_toolbar_popup_context_menu_history ( + browser, + widget, + back, 0, 0); + return TRUE; + } + return midori_browser_toolbar_popup_context_menu_cb (widget, 0, 0, 0, browser); +} + static void midori_browser_bookmark_popup (GtkWidget* widget, GdkEventButton* event, @@ -5958,7 +5928,6 @@ midori_browser_init (MidoriBrowser* browser) GtkWidget* homepage; GtkWidget* back; GtkWidget* forward; - GtkSettings* gtk_settings; GtkWidget* hpaned; GtkWidget* vpaned; GtkWidget* scrolled; @@ -5990,12 +5959,14 @@ midori_browser_init (MidoriBrowser* browser) #endif #endif vbox = gtk_vbox_new (FALSE, 0); - gtk_container_add (GTK_CONTAINER (browser), vbox); - gtk_widget_show (vbox); + /* gtk_container_add (GTK_CONTAINER (browser), vbox); + gtk_widget_show (vbox); */ + midori_window_set_contents (MIDORI_WINDOW (browser), vbox); /* Let us see some ui manager magic */ browser->action_group = gtk_action_group_new ("Browser"); gtk_action_group_set_translation_domain (browser->action_group, GETTEXT_PACKAGE); + midori_window_add_action_group (MIDORI_WINDOW (browser), browser->action_group); midori_browser_add_actions (browser); ui_manager = gtk_ui_manager_new (); accel_group = gtk_ui_manager_get_accel_group (ui_manager); @@ -6174,9 +6145,9 @@ midori_browser_init (MidoriBrowser* browser) /* Create the menubar */ browser->menubar = gtk_ui_manager_get_widget (ui_manager, "/menubar"); - gtk_box_pack_start (GTK_BOX (vbox), browser->menubar, FALSE, FALSE, 0); + midori_window_add_toolbar (MIDORI_WINDOW (browser), browser->menubar); gtk_widget_hide (browser->menubar); - _action_set_visible (browser, "Menubar", !midori_browser_has_native_menubar ()); + _action_set_visible (browser, "Menubar", !midori_browser_has_native_menubar (browser)); g_signal_connect (browser->menubar, "button-press-event", G_CALLBACK (midori_browser_menu_button_press_event_cb), browser); @@ -6235,30 +6206,18 @@ midori_browser_init (MidoriBrowser* browser) _action_set_visible (browser, "UndoTabClose", browser->trash != NULL); /* Create the navigationbar */ - browser->navigationbar = gtk_ui_manager_get_widget ( - ui_manager, "/toolbar_navigation"); - katze_widget_add_class (browser->navigationbar, "primary-toolbar"); - /* FIXME: Settings should be connected with screen changes */ - gtk_settings = gtk_widget_get_settings (GTK_WIDGET (browser)); - if (gtk_settings) - g_signal_connect (gtk_settings, "notify::gtk-toolbar-style", - G_CALLBACK (midori_browser_navigationbar_notify_style_cb), browser); - gtk_toolbar_set_show_arrow (GTK_TOOLBAR (browser->navigationbar), TRUE); - g_object_set (_action_by_name (browser, "Back"), "is-important", TRUE, NULL); - gtk_widget_hide (browser->navigationbar); - g_signal_connect (browser->navigationbar, "popup-context-menu", - G_CALLBACK (midori_browser_toolbar_popup_context_menu_cb), browser); - gtk_box_pack_start (GTK_BOX (vbox), browser->navigationbar, FALSE, FALSE, 0); + browser->navigationbar = midori_window_get_toolbar (MIDORI_WINDOW (browser)); + g_signal_connect (browser, "context-menu", + G_CALLBACK (midori_browser_toolbar_context_menu_cb), browser); /* Bookmarkbar */ browser->bookmarkbar = gtk_toolbar_new (); - katze_widget_add_class (browser->bookmarkbar, "secondary-toolbar"); gtk_widget_set_name (browser->bookmarkbar, "MidoriBookmarkbar"); gtk_toolbar_set_icon_size (GTK_TOOLBAR (browser->bookmarkbar), GTK_ICON_SIZE_MENU); gtk_toolbar_set_style (GTK_TOOLBAR (browser->bookmarkbar), GTK_TOOLBAR_BOTH_HORIZ); - gtk_box_pack_start (GTK_BOX (vbox), browser->bookmarkbar, FALSE, FALSE, 0); + midori_window_add_toolbar (MIDORI_WINDOW (browser), browser->bookmarkbar); g_signal_connect (browser->bookmarkbar, "popup-context-menu", G_CALLBACK (midori_browser_toolbar_popup_context_menu_cb), browser); @@ -6407,9 +6366,12 @@ _midori_browser_set_toolbar_style (MidoriBrowser* browser, gtk_toolbar_style = GTK_TOOLBAR_BOTH_HORIZ; } } - gtk_toolbar_set_style (GTK_TOOLBAR (browser->navigationbar), - gtk_toolbar_style); - gtk_toolbar_set_icon_size (GTK_TOOLBAR (browser->navigationbar), icon_size); + if (GTK_IS_TOOLBAR (browser->navigationbar)) + { + gtk_toolbar_set_style (GTK_TOOLBAR (browser->navigationbar), + gtk_toolbar_style); + gtk_toolbar_set_icon_size (GTK_TOOLBAR (browser->navigationbar), icon_size); + } midori_panel_set_toolbar_style (MIDORI_PANEL (browser->panel), gtk_toolbar_style); } @@ -6489,201 +6451,6 @@ midori_browser_toolbar_popup_context_menu_history (MidoriBrowser* browser, #endif } -static gboolean -midori_browser_toolbar_item_button_press_event_cb (GtkWidget* toolitem, - GdkEventButton* event, - MidoriBrowser* browser) -{ - if (MIDORI_EVENT_NEW_TAB (event)) - { - /* check if the middle-click was performed over reload button */ - if (g_object_get_data (G_OBJECT (toolitem), "reload-middle-click")) - { - gtk_action_activate (_action_by_name (browser, "TabDuplicate")); - } - - GtkWidget* parent = gtk_widget_get_parent (toolitem); - GtkAction* action = gtk_activatable_get_related_action ( - GTK_ACTIVATABLE (parent)); - - g_object_set_data (G_OBJECT (action), - "midori-middle-click", - GINT_TO_POINTER (1)); - - return _action_navigation_activate (action, browser); - } - else if (MIDORI_EVENT_CONTEXT_MENU (event)) - { - if (g_object_get_data (G_OBJECT (toolitem), "history-back")) - { - midori_browser_toolbar_popup_context_menu_history ( - browser, - GTK_IS_BIN (toolitem) && gtk_bin_get_child (GTK_BIN (toolitem)) ? - gtk_widget_get_parent (toolitem) : toolitem, - TRUE, event->x, event->y); - } - else if (g_object_get_data (G_OBJECT (toolitem), "history-forward")) - { - midori_browser_toolbar_popup_context_menu_history ( - browser, - GTK_IS_BIN (toolitem) && gtk_bin_get_child (GTK_BIN (toolitem)) ? - gtk_widget_get_parent (toolitem) : toolitem, - FALSE, event->x, event->y); - } - else - { - midori_browser_toolbar_popup_context_menu_cb ( - GTK_IS_BIN (toolitem) && gtk_bin_get_child (GTK_BIN (toolitem)) ? - gtk_widget_get_parent (toolitem) : toolitem, - event->x, event->y, event->button, browser); - } - return TRUE; - } - return FALSE; -} - -static void -_midori_browser_search_item_allocate_cb (GtkWidget* widget, - GdkRectangle* allocation, - gpointer user_data) -{ - MidoriBrowser* browser = MIDORI_BROWSER (user_data); - MidoriWebSettings* settings = browser->settings; - g_object_set (settings, "search-width", allocation->width, NULL); -} - -static void -_midori_browser_set_toolbar_items (MidoriBrowser* browser, - const gchar* items) -{ - gchar** names; - gchar** name; - GtkAction* action; - GtkWidget* toolitem; - const char* token_location = g_intern_static_string ("Location"); - const char* token_search = g_intern_static_string ("Search"); - const char* token_dontcare = g_intern_static_string ("Dontcare"); - const char* token_current = token_dontcare; - const char* token_last; - - gtk_container_foreach (GTK_CONTAINER (browser->navigationbar), - (GtkCallback)gtk_widget_destroy, NULL); - - names = g_strsplit (items ? items : "", ",", 0); - name = names; - for (; *name; ++name) - { - action = _action_by_name (browser, *name); - if (action && strstr (*name, "CompactMenu") == NULL) - { - token_last = token_current; - - /* Decide, what kind of token (item) we got now */ - if (name && !g_strcmp0 (*name, "Location")) - token_current = token_location; - else if (name && !g_strcmp0 (*name, "Search")) - token_current = token_search; - else - token_current = token_dontcare; - - if ((token_current == token_location || token_current == token_search) && - (token_last == token_location || token_last == token_search)) - { - GtkWidget* toolitem_first = gtk_action_create_tool_item ( - _action_by_name (browser, token_last)); - GtkWidget* toolitem_second = gtk_action_create_tool_item ( - _action_by_name (browser, token_current)); - MidoriPanedAction* paned_action = MIDORI_PANED_ACTION ( - _action_by_name (browser, "LocationSearch")); - MidoriWebSettings* midori_settings = browser->settings; - midori_paned_action_set_child1 (paned_action, toolitem_first, token_last, - token_last == token_search ? FALSE : TRUE, TRUE); - midori_paned_action_set_child2 (paned_action, toolitem_second, token_current, - token_current == token_search ? FALSE : TRUE, TRUE); - g_signal_connect (G_OBJECT (token_current == token_search ? toolitem_second : toolitem_first), - "size-allocate", G_CALLBACK (_midori_browser_search_item_allocate_cb), (gpointer) browser); - - gtk_widget_set_size_request ( - token_last == token_search ? toolitem_first : toolitem_second, - katze_object_get_int ((gpointer) midori_settings, - "search-width"), - -1); - - toolitem = gtk_action_create_tool_item (GTK_ACTION (paned_action)); - token_current = token_dontcare; - } - else if (token_current == token_dontcare && token_last != token_dontcare) - { - /* There was a location or search item, but was not followed by - the other one, that form a couple */ - gtk_toolbar_insert (GTK_TOOLBAR (browser->navigationbar), - GTK_TOOL_ITEM (gtk_action_create_tool_item ( - _action_by_name (browser, token_last))), - -1); - - toolitem = gtk_action_create_tool_item (action); - } - else if (token_current != token_dontcare && token_last == token_dontcare) - continue; - /* A "new tab" button is already part of the notebook */ - else if (!strcmp (gtk_action_get_name (action), "TabNew")) - continue; - else - toolitem = gtk_action_create_tool_item (action); - - if (gtk_bin_get_child (GTK_BIN (toolitem))) - { - if (!g_strcmp0 (*name, "Back")) - g_object_set_data (G_OBJECT (gtk_bin_get_child (GTK_BIN (toolitem))), - "history-back", (void*) 0xdeadbeef); - else if (g_str_has_suffix (*name, "Forward")) - g_object_set_data (G_OBJECT (gtk_bin_get_child (GTK_BIN (toolitem))), - "history-forward", (void*) 0xdeadbeef); - else if (g_strcmp0 (*name, "Reload")) - g_object_set_data (G_OBJECT (gtk_bin_get_child (GTK_BIN (toolitem))), - "reload-middle-click", (void*) 0xdeadbeef); - - g_signal_connect (gtk_bin_get_child (GTK_BIN (toolitem)), - "button-press-event", - G_CALLBACK (midori_browser_toolbar_item_button_press_event_cb), - browser); - } - else - { - gtk_tool_item_set_use_drag_window (GTK_TOOL_ITEM (toolitem), TRUE); - g_signal_connect (toolitem, - "button-press-event", - G_CALLBACK (midori_browser_toolbar_item_button_press_event_cb), - browser); - } - gtk_toolbar_insert (GTK_TOOLBAR (browser->navigationbar), - GTK_TOOL_ITEM (toolitem), -1); - } - } - g_strfreev (names); - - /* There was a last item, which could have formed a couple, but - there is no item left, we add that last item to toolbar as is */ - if (token_current != token_dontcare) - { - gtk_toolbar_insert (GTK_TOOLBAR (browser->navigationbar), - GTK_TOOL_ITEM (gtk_action_create_tool_item ( - _action_by_name (browser, token_current))), -1); - } - - if (!katze_object_get_boolean (browser->settings, "show-menubar")) - { - toolitem = gtk_action_create_tool_item ( - GTK_ACTION (_action_by_name (browser, "CompactMenu"))); - gtk_toolbar_insert (GTK_TOOLBAR (browser->navigationbar), - GTK_TOOL_ITEM (toolitem), -1); - g_signal_connect (gtk_bin_get_child (GTK_BIN (toolitem)), - "button-press-event", - G_CALLBACK (midori_browser_toolbar_item_button_press_event_cb), - browser); - } -} - static void _midori_browser_update_settings (MidoriBrowser* browser) { @@ -6758,7 +6525,7 @@ _midori_browser_update_settings (MidoriBrowser* browser) _midori_browser_set_toolbar_style (browser, toolbar_style); _toggle_tabbar_smartly (browser, FALSE); - _midori_browser_set_toolbar_items (browser, toolbar_items); + midori_window_set_actions (MIDORI_WINDOW (browser), toolbar_items); if (browser->search_engines) { @@ -6791,7 +6558,8 @@ _midori_browser_update_settings (MidoriBrowser* browser) GINT_TO_POINTER (last_panel_page)); _action_set_active (browser, "Menubar", show_menubar); - _action_set_active (browser, "Navigationbar", browser->show_navigationbar); + if (GTK_IS_TOOLBAR (browser->navigationbar)) + _action_set_active (browser, "Navigationbar", browser->show_navigationbar); _action_set_active (browser, "Bookmarkbar", show_bookmarkbar && browser->bookmarks != NULL); _action_set_active (browser, "Panel", show_panel); @@ -6815,7 +6583,7 @@ midori_browser_settings_notify (MidoriWebSettings* web_settings, if (name == g_intern_string ("toolbar-style")) _midori_browser_set_toolbar_style (browser, g_value_get_enum (&value)); else if (name == g_intern_string ("toolbar-items")) - _midori_browser_set_toolbar_items (browser, g_value_get_string (&value)); + midori_window_set_actions (MIDORI_WINDOW (browser), g_value_get_string (&value)); else if (name == g_intern_string ("compact-sidepanel")) { g_signal_handlers_block_by_func (browser->panel, @@ -6837,7 +6605,8 @@ midori_browser_settings_notify (MidoriWebSettings* web_settings, else if (name == g_intern_string ("show-navigationbar")) { browser->show_navigationbar = g_value_get_boolean (&value); - _action_set_active (browser, "Navigationbar", g_value_get_boolean (&value)); + if (GTK_IS_TOOLBAR (browser->navigationbar)) + _action_set_active (browser, "Navigationbar", g_value_get_boolean (&value)); } else if (name == g_intern_string ("show-bookmarkbar")) { diff --git a/midori/midori-browser.h b/midori/midori-browser.h index c68540a1..bccf6204 100644 --- a/midori/midori-browser.h +++ b/midori/midori-browser.h @@ -35,7 +35,7 @@ typedef struct _MidoriBrowserClass MidoriBrowserClass; struct _MidoriBrowserClass { - GtkWindowClass parent_class; + MidoriWindowClass parent_class; /* Signals */ void diff --git a/midori/midori-contextaction.vala b/midori/midori-contextaction.vala index ea5a5784..45269977 100644 --- a/midori/midori-contextaction.vala +++ b/midori/midori-contextaction.vala @@ -92,6 +92,18 @@ namespace Midori { } #endif + Gtk.ToolButton toolitem; + public override unowned Gtk.Widget create_tool_item () { + toolitem = base.create_tool_item () as Gtk.ToolButton; + toolitem.clicked.connect (()=>{ + var popup = create_menu (null, false); + popup.show (); + popup.attach_to_widget (toolitem, null); + popup.popup (null, null, null, 1, Gtk.get_current_event_time ()); + }); + return toolitem; + } + public new Gtk.Menu create_menu (Gtk.Menu? default_menu, bool accels) { var menu = default_menu ?? new Gtk.Menu (); foreach (var action in children) { diff --git a/midori/midori-frontend.c b/midori/midori-frontend.c index 89bbdd42..062aa38c 100644 --- a/midori/midori-frontend.c +++ b/midori/midori-frontend.c @@ -74,11 +74,13 @@ midori_web_app_new (const gchar* webapp, midori_browser_set_action_visible (browser, "CompactMenu", FALSE); midori_browser_set_action_visible (browser, "AddSpeedDial", FALSE); midori_browser_set_action_visible (browser, "Navigationbar", FALSE); + GtkActionGroup* action_group = midori_browser_get_action_group (browser); + GtkAction* action = gtk_action_group_get_action (action_group, "Location"); + gtk_action_set_sensitive (action, FALSE); MidoriWebSettings* settings = midori_settings_new_full (NULL); g_object_set (settings, "show-menubar", FALSE, - "show-navigationbar", FALSE, "toolbar-items", "Back,Forward,ReloadStop,Location,Homepage,Preferences", "show-statusbar", FALSE, "show-panel", FALSE, diff --git a/midori/midori-panedaction.vala b/midori/midori-panedaction.vala index 161be025..32cdb764 100644 --- a/midori/midori-panedaction.vala +++ b/midori/midori-panedaction.vala @@ -16,6 +16,10 @@ namespace Midori { Child child1 = new Child(); Child child2 = new Child(); + public PanedAction () { + GLib.Object (name: "LocationSearch"); + } + private struct Child { public Gtk.Widget widget; string name; diff --git a/midori/midori-window.vala b/midori/midori-window.vala new file mode 100644 index 00000000..5343613a --- /dev/null +++ b/midori/midori-window.vala @@ -0,0 +1,217 @@ +/* + Copyright (C) 2015 Christian Dywan <christian@twotoasts.de> + + This library is free software; you can redistribute it and/or + modify it under the terms of the GNU Lesser General Public + License as published by the Free Software Foundation; either + version 2.1 of the License, or (at your option) any later version. + + See the file COPYING for the full license text. +*/ + +namespace Midori { + public class Window : Gtk.Window { + Gtk.Widget? _toolbar = null; + public Gtk.Widget? toolbar { get { + if (_toolbar == null) { +#if HAVE_GTK3 + if (strcmp (Environment.get_variable ("GTK_CSD"), "1") == 0) { + var toolbar = new Gtk.HeaderBar (); + toolbar.show_close_button = true; + toolbar.show (); + toolbar.get_style_context ().add_class ("midori-titlebar"); + _toolbar = toolbar; + return _toolbar; + } +#endif + var toolbar = new Gtk.Toolbar (); + toolbar.show_arrow = true; +#if HAVE_GTK3 + toolbar.get_style_context ().add_class ("primary-toolbar"); + hide_titlebar_when_maximized = true; +#endif + toolbar.popup_context_menu.connect ((x, y, button)=> { return button == 3 && context_menu (toolbar); }); + _toolbar = toolbar; + } + return _toolbar; + } } + + public string actions { get; set; default = ""; } + List<Gtk.ActionGroup> action_groups; + public signal bool context_menu (Gtk.Widget widget, Gtk.Action? action=null); + Gtk.Box? box = null; + List<Gtk.Widget> toolbars; + + Gtk.Widget? _contents = null; + public Gtk.Widget? contents { get { + return _contents; + } set { + if (_contents != null) + box.remove (_contents); + _contents = value; + _contents.show (); + if (box != null) + box.pack_end (_contents, true, true, 0); + } } + + public void add_action_group (Gtk.ActionGroup action_group) { + action_groups.append (action_group); + } + + public bool show_menubar { get; set; default = false; } + + [CCode (type = "GtkWidget*")] + public Window () { + } + + Gtk.ToolItem? get_tool_item (string name) { + /* Name is the empty string if actions has ,, or trailing , */ + if (name == "") + return null; + /* Shown in the notebook, no need to include in the toolbar */ + if (name == "TabNew") + return null; + foreach (var action_group in action_groups) { + var action = action_group.get_action (name); + if (action != null) { + return create_tool_item (action); + } + } + warning ("Action %s not known to Window", name); + return null; + } + + Gtk.ToolItem create_tool_item (Gtk.Action action) { + var toolitem = action.create_tool_item () as Gtk.ToolItem; + /* Show label if button has no icon of any kind */ + if (action.icon_name == null && action.stock_id == null) + toolitem.is_important = true; + toolitem.get_child ().button_press_event.connect ((event)=> { + return event.button == 3 && context_menu (toolitem, toolitem.related_action); }); + if (name == "CompactMenu") + bind_property ("show-menubar", toolitem, "visible"); + return toolitem; + } + + public void add_action (Gtk.Action action) { + /* FIXME: Keep track of added actions */ + var toolitem = create_tool_item (action); +#if HAVE_GTK3 + if (_toolbar is Gtk.HeaderBar) + (_toolbar as Gtk.HeaderBar).pack_end (toolitem); + else { +#else + (_toolbar as Gtk.Toolbar).insert (toolitem, -1); +#endif + } + } + + void update_toolbar () { + var container = _toolbar as Gtk.Container; + foreach (var toolitem in container.get_children ()) + container.remove (toolitem); + + string[] names = actions.split (","); +#if HAVE_GTK3 + if (_toolbar is Gtk.HeaderBar) { + var headerbar = _toolbar as Gtk.HeaderBar; + List<Gtk.ToolItem> tail = new List<Gtk.ToolItem> (); + foreach (string name in names) { + var toolitem = get_tool_item (name); + if (toolitem == null) + continue; + var widget = toolitem.get_child (); + if (widget is Gtk.Alignment) + widget = (widget as Gtk.Bin).get_child (); + if (name == "Location") { + (widget as Gtk.Entry).width_chars = 24; + widget.set ("margin-start", 25, "margin-end", 25); + headerbar.custom_title = toolitem; + } else if (name == "Search") { + (widget as Gtk.Entry).width_chars = 12; + tail.append (toolitem); + } else if ("Add" in name || "Compact" in name || name in "Preferences,Trash") + tail.append (toolitem); + else + headerbar.pack_start (toolitem); + } + + /* Pack end appends, so we need to pack in reverse order */ + tail.reverse (); + foreach (var toolitem in tail) + headerbar.pack_end (toolitem); + + set_titlebar (headerbar); + return; + } +#endif + + var toolbar = _toolbar as Gtk.Toolbar; + string? previous = null; + Gtk.ToolItem? toolitem_previous = null; + foreach (string name in names) { + var toolitem = get_tool_item (name); + if (toolitem == null) + continue; + if ((name == "Location" || name == "Search") + && (previous == "Location" || previous == "Search")) { + toolitem_previous.ref (); + toolbar.remove (toolitem_previous); + var paned = new Midori.PanedAction (); + paned.set_child1 (toolitem, previous, previous != "Search", true); + paned.set_child2 (toolitem_previous, name, name != "Search", true); + var sizeable = name == "Search" ? toolitem_previous : toolitem; + sizeable.size_allocate.connect (()=> { + // FIXME + }); + var requester = previous == "Search" ? toolitem : toolitem_previous; + // FIXME: Midori.WebSettings search-width + int search_width = 50; + requester.set_size_request (search_width, -1); + toolitem = paned.create_tool_item () as Gtk.ToolItem; + previous = null; + toolitem_previous.unref (); + toolitem_previous = null; + } else { + previous = name; + toolitem_previous = toolitem; + } + toolbar.insert (toolitem, -1); + } + } + + public void add_toolbar (Gtk.Widget toolbar) { + if (toolbar is Gtk.Toolbar) { +#if HAVE_GTK3 + get_style_context ().add_class ("secondary-toolbar"); +#endif + (toolbar as Gtk.Toolbar).popup_context_menu.connect ((x, y, button)=> { return button == 3 && context_menu (toolbar); }); + } + if (box == null) + toolbars.append (toolbar); + else + box.pack_start (toolbar, false, false); + } + + construct { + box = new Gtk.VBox (false, 0); + box.show (); + add (box); + foreach (var toolbar in toolbars) { + if (toolbar is Gtk.MenuBar) + box.pack_start (toolbar, false, false); + } + if (toolbar is Gtk.Toolbar) + box.pack_start (toolbar, false, false); + foreach (var toolbar in toolbars) { + if (!(toolbar is Gtk.MenuBar)) + box.pack_start (toolbar, false, false); + } + if (_contents != null) + box.pack_end (_contents, true, true, 0); + if (actions != "") + update_toolbar (); + notify["actions"].connect ((pspec)=> { update_toolbar (); }); + } + } +} diff --git a/midori/midori.vapi b/midori/midori.vapi index 74177796..a5659370 100644 --- a/midori/midori.vapi +++ b/midori/midori.vapi @@ -62,7 +62,7 @@ namespace Midori { } [CCode (cheader_filename = "midori/midori-browser.h")] - public class Browser : Gtk.Window { + public class Browser : Window { public Browser (); public unowned Gtk.Widget add_item (Katze.Item item); public unowned Gtk.Widget add_uri (string uri); |