Implement Fullscreen mode

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.
This commit is contained in:
Christian Dywan 2008-01-26 08:44:31 +01:00
parent 184b54e311
commit 1522f47002
5 changed files with 59 additions and 4 deletions

View 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;

View 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

View 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__ */

View file

@ -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;

View file

@ -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'/>"