From 152a9af6a3ddc700dd0bf7e4fd6a9fe8a05e22f7 Mon Sep 17 00:00:00 2001 From: Daniel Carl Date: Sat, 19 Apr 2014 00:08:48 +0200 Subject: [PATCH] Added kiosk mode. --- doc/vimb.1 | 4 +++ src/main.c | 84 +++++++++++++++++++++++++++++++++--------------------- src/main.h | 1 + 3 files changed, 56 insertions(+), 33 deletions(-) diff --git a/doc/vimb.1 b/doc/vimb.1 index 268312a..ff850fd 100644 --- a/doc/vimb.1 +++ b/doc/vimb.1 @@ -32,6 +32,10 @@ of an XEmbed-aware application, that vimb will use as its parent. .B "\-h, \-\-help" Show help options. .TP +.B \-k, \-\-kiosk +Run vimb in kiosk mode with nearly no keybindings, not inputbox and no context +menu. +.TP .B "\-v, \-\-version" Print build and version information. .SH MODES diff --git a/src/main.c b/src/main.c index 0d21bcd..d01a581 100644 --- a/src/main.c +++ b/src/main.c @@ -627,6 +627,7 @@ static void set_status(const StatusType status) static void init_core(void) { Gui *gui = &vb.gui; + WebKitWebSettings *setting; if (vb.embed) { gui->window = gtk_plug_new(vb.embed); @@ -656,22 +657,26 @@ static void init_core(void) gui->adjust_v = gtk_scrolled_window_get_vadjustment(GTK_SCROLLED_WINDOW(gui->scroll)); #ifdef FEATURE_NO_SCROLLBARS + /* don't remove scrollbars if kiosk mode is on else the user would have no + * way to navigation because keys are not processed */ + if (!vb.config.kioskmode) { #ifdef HAS_GTK3 - /* set the default style for the application - this can be overwritten by - * the users style in gtk-3.0/gtk.css */ - const char *style = "GtkScrollbar{-GtkRange-slider-width:0;-GtkRange-trough-border:0;}\ - GtkScrolledWindow{-GtkScrolledWindow-scrollbar-spacing:0;}"; - GtkCssProvider *provider = gtk_css_provider_get_default(); - gtk_css_provider_load_from_data(provider, style, -1, NULL); - gtk_style_context_add_provider_for_screen( - gdk_screen_get_default(), - GTK_STYLE_PROVIDER(provider), - GTK_STYLE_PROVIDER_PRIORITY_APPLICATION - ); + /* set the default style for the application - this can be overwritten by + * the users style in gtk-3.0/gtk.css */ + const char *style = "GtkScrollbar{-GtkRange-slider-width:0;-GtkRange-trough-border:0;}\ + GtkScrolledWindow{-GtkScrolledWindow-scrollbar-spacing:0;}"; + GtkCssProvider *provider = gtk_css_provider_get_default(); + gtk_css_provider_load_from_data(provider, style, -1, NULL); + gtk_style_context_add_provider_for_screen( + gdk_screen_get_default(), + GTK_STYLE_PROVIDER(provider), + GTK_STYLE_PROVIDER_PRIORITY_APPLICATION + ); #else /* no GTK3 */ - /* GTK_POLICY_NEVER with gtk3 disallows window resizing and scrolling */ - gtk_scrolled_window_set_policy(GTK_SCROLLED_WINDOW(gui->scroll), GTK_POLICY_NEVER, GTK_POLICY_NEVER); + /* GTK_POLICY_NEVER with gtk3 disallows window resizing and scrolling */ + gtk_scrolled_window_set_policy(GTK_SCROLLED_WINDOW(gui->scroll), GTK_POLICY_NEVER, GTK_POLICY_NEVER); #endif + } #endif /* Prepare the command line */ @@ -714,9 +719,11 @@ static void init_core(void) /* initialize the modes */ mode_init(); mode_add('n', normal_enter, normal_leave, normal_keypress, NULL); - mode_add('c', ex_enter, ex_leave, ex_keypress, ex_input_changed); - mode_add('i', input_enter, input_leave, input_keypress, NULL); - mode_add('p', pass_enter, pass_leave, pass_keypress, NULL); + if (!vb.config.kioskmode) { + mode_add('c', ex_enter, ex_leave, ex_keypress, ex_input_changed); + mode_add('i', input_enter, input_leave, input_keypress, NULL); + mode_add('p', pass_enter, pass_leave, pass_keypress, NULL); + } /* initialize the marks with empty values */ marks_clear(); @@ -731,11 +738,21 @@ static void init_core(void) setup_signals(); - /* enter normal mode */ - mode_enter('n'); + setting = webkit_web_view_get_settings(gui->webview); /* make sure the main window and all its contents are visible */ gtk_widget_show_all(gui->window); + if (vb.config.kioskmode) { + /* hide input box - to not create it would be better, but this needs a + * lot of changes in the code where the input is used */ + gtk_widget_hide(vb.gui.input); + + /* disable context menu */ + g_object_set(G_OBJECT(setting), "enable-default-context-menu", false, NULL); + } + + /* enter normal mode */ + mode_enter('n'); vb.config.default_zoom = 1.0; @@ -744,7 +761,6 @@ static void init_core(void) GdkScreen *screen = gdk_window_get_screen(gtk_widget_get_window(vb.gui.window)); gdouble dpi = gdk_screen_get_resolution(screen); if (dpi != -1) { - WebKitWebSettings *setting = webkit_web_view_get_settings(gui->webview); webkit_web_view_set_full_content_zoom(gui->webview, true); g_object_set(G_OBJECT(setting), "enforce-96-dpi", true, NULL); @@ -814,22 +830,23 @@ static void setup_signals() NULL ); + if (!vb.config.kioskmode) { #ifdef FEATURE_NO_SCROLLBARS - WebKitWebFrame *frame = webkit_web_view_get_main_frame(vb.gui.webview); - g_signal_connect(G_OBJECT(frame), "scrollbars-policy-changed", G_CALLBACK(gtk_true), NULL); + WebKitWebFrame *frame = webkit_web_view_get_main_frame(vb.gui.webview); + g_signal_connect(G_OBJECT(frame), "scrollbars-policy-changed", G_CALLBACK(gtk_true), NULL); #endif - - g_signal_connect( - G_OBJECT(vb.gui.window), "key-press-event", G_CALLBACK(map_keypress), NULL - ); - g_signal_connect( - G_OBJECT(vb.gui.input), "focus-in-event", G_CALLBACK(mode_input_focusin), NULL - ); - g_object_connect( - G_OBJECT(vb.gui.buffer), - "signal::changed", G_CALLBACK(mode_input_changed), NULL, - NULL - ); + g_signal_connect( + G_OBJECT(vb.gui.window), "key-press-event", G_CALLBACK(map_keypress), NULL + ); + g_signal_connect( + G_OBJECT(vb.gui.input), "focus-in-event", G_CALLBACK(mode_input_focusin), NULL + ); + g_object_connect( + G_OBJECT(vb.gui.buffer), + "signal::changed", G_CALLBACK(mode_input_changed), NULL, + NULL + ); + } /* webview adjustment */ g_object_connect(G_OBJECT(vb.gui.adjust_v), @@ -1106,6 +1123,7 @@ int main(int argc, char *argv[]) {"cmd", 'C', 0, G_OPTION_ARG_STRING, &vb.config.autocmd, "Ex command run before first page is loaded", NULL}, {"config", 'c', 0, G_OPTION_ARG_STRING, &vb.config.file, "Custom cufiguration file", NULL}, {"embed", 'e', 0, G_OPTION_ARG_STRING, &winid, "Reparents to window specified by xid", NULL}, + {"kiosk", 'k', 0, G_OPTION_ARG_NONE, &vb.config.kioskmode, "run in kiosk mode", NULL}, {"version", 'v', 0, G_OPTION_ARG_NONE, &ver, "Print version", NULL}, {NULL} }; diff --git a/src/main.h b/src/main.h index db1cf64..3e2eef9 100644 --- a/src/main.h +++ b/src/main.h @@ -301,6 +301,7 @@ typedef struct { GTlsDatabase *tls_db; /* tls database */ float default_zoom; /* default zoomlevel that is applied on zz zoom reset */ gboolean fullscreen; /* indicates if full screen mode is on */ + gboolean kioskmode; } Config; typedef struct { -- 2.20.1