summaryrefslogtreecommitdiff
path: root/midori
diff options
context:
space:
mode:
authorChristian Dywan <christian.dywan@canonical.com>2015-05-23 20:19:21 -0400
committerChristian Dywan <christian.dywan@canonical.com>2015-05-23 20:19:21 -0400
commit49db5674902e49e05afc197cea7398e31996f0eb (patch)
tree90f12fd1aec5c0bda6fbba2f9ef0650aeb85010c /midori
parent31de16aa1e6e3ac50318e92ebb8e090369497f2a (diff)
downloadmidori-49db5674902e49e05afc197cea7398e31996f0eb.tar.gz
Implement Midori.Window class with toolbar/ headerbar
Diffstat (limited to 'midori')
-rw-r--r--midori/midori-browser.c345
-rw-r--r--midori/midori-browser.h2
-rw-r--r--midori/midori-contextaction.vala12
-rw-r--r--midori/midori-frontend.c4
-rw-r--r--midori/midori-panedaction.vala4
-rw-r--r--midori/midori-window.vala217
-rw-r--r--midori/midori.vapi2
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);