]> spindle.queued.net Git - midori/commitdiff
Implement Fullscreen mode
authorChristian Dywan <christian@twotoasts.de>
Sat, 26 Jan 2008 07:44:31 +0000 (08:44 +0100)
committerChristian Dywan <christian@twotoasts.de>
Sat, 26 Jan 2008 07:49:48 +0000 (08:49 +0100)
A new menuitem toggles Fullscreen mode, which means that the
menubar is hidden, the window is maximized and window manager
decoration is removed. A new button appears in the navibar
which reverts this process.

Fullscreen relies entirely on the window manager, which has the
advantage that window manager keybindings have the same effect
as activating the Fullscreen menuitem. At the same time this
means that Fullscreen won't work at all without it.

src/browser.c
src/browser.h
src/global.h
src/main.c
src/ui.h

index 03ea2fa379b14bb83f8b59a4c45f6e97c008a0ca..88044e392610377bfc31870ca83f99a41428e99f 100644 (file)
@@ -290,6 +290,15 @@ void on_action_source_view_activate(GtkAction* action, CBrowser* browser)
     g_free(source);*/
 }
 
+void on_action_fullscreen_activate(GtkAction* action, CBrowser* browser)
+{
+    GdkWindowState state = gdk_window_get_state(browser->window->window);
+    if(state & GDK_WINDOW_STATE_FULLSCREEN)
+        gtk_window_unfullscreen(GTK_WINDOW(browser->window));
+    else
+        gtk_window_fullscreen(GTK_WINDOW(browser->window));
+}
+
 void on_action_back_activate(GtkAction* action, CBrowser* browser)
 {
     webkit_web_view_go_back(WEBKIT_WEB_VIEW(get_nth_webView(-1, browser)));
@@ -1125,13 +1134,35 @@ void on_notebook_switch_page(GtkWidget* widget, GtkNotebookPage* page
     update_search_engines(browser);
 }
 
+static void on_window_state_changed(GtkWidget* widget
+ , GdkEventWindowState* event, CBrowser* browser)
+{
+    if(event->changed_mask & GDK_WINDOW_STATE_FULLSCREEN)
+    {
+        if(event->new_window_state & GDK_WINDOW_STATE_FULLSCREEN)
+        {
+            gtk_widget_hide(browser->menubar);
+            g_object_set(browser->fullscreen, "stock-id"
+             , GTK_STOCK_LEAVE_FULLSCREEN, NULL);
+            gtk_widget_show(browser->fullscreen);
+        }
+        else
+        {
+            gtk_widget_show(browser->menubar);
+            gtk_widget_hide(browser->fullscreen);
+            g_object_set(browser->fullscreen, "stock-id"
+             , GTK_STOCK_FULLSCREEN, NULL);
+        }
+    }
+}
+
 static void on_window_size_allocate(GtkWidget* widget, GtkAllocation* allocation
  , CBrowser* browser)
 {
      if(GTK_WIDGET_REALIZED(widget))
      {
-         if(!(gdk_window_get_state(widget->window)
-          & (GDK_WINDOW_STATE_MAXIMIZED | GDK_WINDOW_STATE_FULLSCREEN)))
+         GdkWindowState state = gdk_window_get_state(widget->window);
+         if(!(state & (GDK_WINDOW_STATE_MAXIMIZED | GDK_WINDOW_STATE_FULLSCREEN)))
          {
              config->winWidth = allocation->width;
              config->winHeight = allocation->height;
@@ -1180,6 +1211,8 @@ CBrowser* browser_new(CBrowser* oldBrowser)
 
     // Setup the window metrics
     browser->window = gtk_window_new(GTK_WINDOW_TOPLEVEL);
+    g_signal_connect(browser->window, "window-state-event"
+     , G_CALLBACK(on_window_state_changed), browser);
     GdkScreen* screen = gtk_window_get_screen(GTK_WINDOW(browser->window));
     const gint defaultWidth = (gint)gdk_screen_get_width(screen) / 1.7;
     const gint defaultHeight = (gint)gdk_screen_get_height(screen) / 1.7;
@@ -1351,6 +1384,13 @@ CBrowser* browser_new(CBrowser* oldBrowser)
     gtk_toolbar_insert(GTK_TOOLBAR(browser->navibar)
      , GTK_TOOL_ITEM(browser->closedTabs), -1);
     sokoke_container_show_children(GTK_CONTAINER(browser->navibar));
+    action = gtk_action_group_get_action(browser->actiongroup, "Fullscreen");
+    browser->fullscreen = gtk_action_create_tool_item(action);
+    gtk_widget_hide(browser->fullscreen);
+    g_signal_connect(browser->fullscreen, "clicked"
+     , G_CALLBACK(on_action_fullscreen_activate), browser);
+    gtk_toolbar_insert(GTK_TOOLBAR(browser->navibar)
+     , GTK_TOOL_ITEM(browser->fullscreen), -1);
     action_set_active("ToolbarNavigation", config->toolbarNavigation, browser);
 
     // Bookmarkbar
@@ -1605,6 +1645,7 @@ CBrowser* browser_new(CBrowser* oldBrowser)
     browser->location = oldBrowser->location;
     browser->webSearch = oldBrowser->webSearch;
     browser->closedTabs = oldBrowser->closedTabs;
+    browser->fullscreen = oldBrowser->fullscreen;
     browser->bookmarkbar = oldBrowser->bookmarkbar;
     browser->panels = oldBrowser->panels;
     browser->panels_notebook = oldBrowser->panels_notebook;
index 3f6bc218a7273cf9cb811fd5f6d69dc007da5f67..a3c4f3df254999fe9b82180b1de554d2acda3d3b 100644 (file)
@@ -39,6 +39,7 @@ typedef struct _CBrowser
     GtkWidget* location;
     GtkWidget* webSearch;
     GtkWidget* closedTabs;
+    GtkWidget* fullscreen;
     GtkWidget* bookmarkbar;
     // panels
     GtkWidget* panels;
@@ -160,6 +161,9 @@ on_action_zoom_normal_activate(GtkAction*, CBrowser*);
 void
 on_action_source_view_activate(GtkAction*, CBrowser*);
 
+void
+on_action_fullscreen_activate(GtkAction*, CBrowser*);
+
 void
 on_action_back_activate(GtkAction*, CBrowser*);
 
@@ -364,6 +368,9 @@ static const GtkActionEntry entries[] = {
  { "Properties", GTK_STOCK_PROPERTIES
  , NULL, ""
  , "hm?", NULL/*G_CALLBACK(on_action_properties_activate)*/ },
+ { "Fullscreen", GTK_STOCK_FULLSCREEN
+ , NULL, "F11"
+ , "Toggle fullscreen view", G_CALLBACK(on_action_fullscreen_activate) },
 
  { "Go", NULL, "_Go" },
  { "Back", GTK_STOCK_GO_BACK
index 52f283e6703e609129d3ebdc1cb876fd66c0a507..de9ea3efc69d56db8a335e2532721031e85c64a3 100644 (file)
@@ -81,5 +81,9 @@ KatzeXbelItem* tabtrash;
 #if !GTK_CHECK_VERSION(2, 10, 0)
 #define GTK_STOCK_SELECT_ALL     "gtk-select-all"
 #endif
+#if !GTK_CHECK_VERSION(2, 8, 0)
+#define GTK_STOCK_FULLSCREEN "gtk-fullscreen"
+#define GTK_STOCK_LEAVE_FULLSCREEN "gtk-leave-fullscreen"
+#endif
 
 #endif /* !__GLOBAL_H__ */
index c177e1cd05b7dfb65c89877a89bf0f58e0c86129..7fe43c20b9bd8b7bfd3261eecd1eae630eaf74bd 100755 (executable)
@@ -59,6 +59,10 @@ static void stock_items_init(void)
         #if !GTK_CHECK_VERSION(2, 10, 0)
         { GTK_STOCK_SELECT_ALL, "Select _All", 0, 0, (gchar*)"gtk20" },
         #endif
+        #if !GTK_CHECK_VERSION(2, 8, 0)
+        { GTK_STOCK_FULLSCREEN, "_Fullscreen", 0, 0, (gchar*)"gtk20" },
+        { GTK_STOCK_FULLSCREEN, "_Leave Fullscreen", 0, 0, (gchar*)"gtk20" },
+        #endif
     };
     GtkIconFactory* factory = gtk_icon_factory_new();
     guint i;
index d9d350f6eda17032a7512ab0abda3956bbe51a06..787fdd41f99a97933fe09bba9ae71cf0115187c9 100644 (file)
--- a/src/ui.h
+++ b/src/ui.h
@@ -91,9 +91,8 @@ static const gchar* ui_markup =
     "<menuitem action='ZoomOut'/>"
     "<menuitem action='ZoomNormal'/>"
     "<separator/>"
-    "<menuitem action='BackgroundImage'/>"
     "<menuitem action='SourceView'/>"
-    "<menuitem action='Properties'/>"
+    "<menuitem action='Fullscreen'/>"
    "</menu>"
    "<menu action='Go'>"
     "<menuitem action='Back'/>"