diff options
author | Mauro Carvalho Chehab <mchehab+huawei@kernel.org> | 2021-04-08 16:39:24 +0200 |
---|---|---|
committer | Mauro Carvalho Chehab <mchehab+huawei@kernel.org> | 2021-04-08 18:15:44 +0200 |
commit | 8a5beb2c580e852a567aa57046ce259924cb0ea9 (patch) | |
tree | 1c577d6ff4df50e05f77c749ad281d337bac84a8 | |
parent | 99a2e0087f25a6f865d11bfab39d358bde13d71e (diff) |
add support for full screen mode
Nowadays, there are several UVC devices that can be used to
capture HDMI images. Those could be used, for instance, to
display a console from another machine. On such case, it can
be interesting to use as little as possible of the screen,
in order to maximize the screen.
Let's implement a full screen mode that will disable everything
but the top menu, and place the application in full screen
mode.
As this depends on a proper scaling support, only enable it
with Gtk3.
Signed-off-by: Mauro Carvalho Chehab <mchehab+huawei@kernel.org>
-rw-r--r-- | data/camorama-gtk3.ui | 80 | ||||
-rw-r--r-- | src/callbacks.c | 38 | ||||
-rw-r--r-- | src/callbacks.h | 3 | ||||
-rw-r--r-- | src/camorama-window.c | 7 |
4 files changed, 126 insertions, 2 deletions
diff --git a/data/camorama-gtk3.ui b/data/camorama-gtk3.ui index 826fb59..7d98b72 100644 --- a/data/camorama-gtk3.ui +++ b/data/camorama-gtk3.ui @@ -39,6 +39,11 @@ <property name="can_focus">False</property> <property name="pixbuf">snap-icon-small.xpm</property> </object> + <object class="GtkImage" id="image23"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="icon_name">view-fullscreen</property> + </object> <object class="GtkWindow" id="main_window"> <property name="can_focus">False</property> <property name="title" translatable="yes">Camorama-libglade</property> @@ -80,6 +85,17 @@ </object> </child> <child> + <object class="GtkImageMenuItem" id="imagemenuitem2"> + <property name="label" translatable="yes">Toggle _Full Screen</property> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="use_underline">True</property> + <property name="image">image23</property> + <property name="use_stock">False</property> + <accelerator key="f" signal="activate" modifiers="GDK_CONTROL_MASK"/> + </object> + </child> + <child> <object class="GtkSeparatorMenuItem" id="menuitem2"> <property name="visible">True</property> <property name="can_focus">False</property> @@ -346,6 +362,68 @@ </packing> </child> <child> + <object class="GtkAlignment" id="alignment6"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="halign">center</property> + <property name="hexpand">True</property> + <child> + <object class="GtkButton" id="button3"> + <property name="visible">True</property> + <property name="can_focus">True</property> + <property name="receives_default">False</property> + <property name="halign">center</property> + <signal name="clicked" handler="capture_func" swapped="no"/> + <child> + <object class="GtkAlignment" id="alignment5"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="xscale">0</property> + <property name="yscale">0</property> + <child> + <object class="GtkBox" id="hbox34"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="spacing">2</property> + <child> + <object class="GtkImage" id="image22"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="icon_name">view-fullscreen</property> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">False</property> + <property name="position">0</property> + </packing> + </child> + <child> + <object class="GtkLabel" id="label77"> + <property name="visible">True</property> + <property name="can_focus">False</property> + <property name="label" translatable="yes">Full Screen</property> + <property name="use_underline">True</property> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">False</property> + <property name="position">2</property> + </packing> + </child> + </object> + </child> + </object> + </child> + </object> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">False</property> + <property name="position">1</property> + </packing> + </child> + <child> <object class="GtkAlignment" id="alignment2"> <property name="visible">True</property> <property name="can_focus">False</property> @@ -402,7 +480,7 @@ <property name="expand">False</property> <property name="fill">False</property> <property name="pack_type">end</property> - <property name="position">1</property> + <property name="position">2</property> </packing> </child> </object> diff --git a/src/callbacks.c b/src/callbacks.c index b4ee1bf..603351c 100644 --- a/src/callbacks.c +++ b/src/callbacks.c @@ -353,7 +353,7 @@ static void get_geometry(cam_t *cam, unsigned int *width, unsigned int *height) #endif } -gboolean on_configure_event(GtkMenuItem *menuitem, GdkEvent *event, cam_t *cam) +gboolean on_configure_event(GtkMenuItem *menuitem, GdkEvent *event, cam_t *cam) { #if GTK_MAJOR_VERSION >= 3 GtkWidget *da = GTK_WIDGET(gtk_builder_get_object(cam->xml, "da")); @@ -386,6 +386,42 @@ gboolean on_configure_event(GtkMenuItem *menuitem, GdkEvent *event, cam_t *cam) return FALSE; } +gboolean on_window_state_event(GtkMenuItem *menuitem, + GdkEventWindowState *event, cam_t *cam) +{ +#if GTK_MAJOR_VERSION >= 3 + if (event->new_window_state & GDK_WINDOW_STATE_FULLSCREEN) { + gtk_widget_hide(GTK_WIDGET(gtk_builder_get_object(cam->xml, "menuitem3"))); + gtk_widget_hide(GTK_WIDGET(gtk_builder_get_object(cam->xml, "menuitem4"))); + gtk_widget_hide(GTK_WIDGET(gtk_builder_get_object(cam->xml, "hbox31"))); + gtk_widget_hide(cam->status); + } else { + gtk_widget_show(GTK_WIDGET(gtk_builder_get_object(cam->xml, "menuitem3"))); + gtk_widget_show(GTK_WIDGET(gtk_builder_get_object(cam->xml, "menuitem4"))); + gtk_widget_show(GTK_WIDGET(gtk_builder_get_object(cam->xml, "hbox31"))); + gtk_widget_show(cam->status); + } +#endif + + return GDK_EVENT_PROPAGATE; +} + +void toggle_fullscreen(GtkWidget *widget, cam_t *cam) +{ + GdkWindowState state; + GtkWidget *window = GTK_WIDGET(gtk_builder_get_object(cam->xml, + "main_window")); + + state = gdk_window_get_state (gtk_widget_get_window (GTK_WIDGET (window))); + + if (state & GDK_WINDOW_STATE_FULLSCREEN) { + gtk_window_unfullscreen(GTK_WINDOW(window)); + } else { + gtk_window_fullscreen(GTK_WINDOW(window)); + } +} + + void set_image_scale(cam_t *cam) { float f; diff --git a/src/callbacks.h b/src/callbacks.h index 4f11587..a23df4d 100644 --- a/src/callbacks.h +++ b/src/callbacks.h @@ -18,6 +18,8 @@ G_BEGIN_DECLS void on_change_size_activate(GtkWidget * widget, cam_t *cam); void on_quit_activate(GtkMenuItem *menuitem, cam_t *cam); gboolean on_configure_event(GtkMenuItem *menuitem, GdkEvent *event, cam_t *cam); +gboolean on_window_state_event(GtkMenuItem *menuitem, + GdkEventWindowState *event, cam_t *cam); int delete_event(GtkWidget *, gpointer data); void cap_func(GtkWidget *, cam_t *); void rcap_func(GtkWidget *, cam_t *); @@ -48,6 +50,7 @@ gboolean delete_event_prefs_window(GtkWidget *widget, GdkEvent *event, cam_t *cam); void capture_func2(GtkWidget *, cam_t *); void capture_func(GtkWidget *, cam_t *); +void toggle_fullscreen(GtkWidget *, cam_t *); gint timeout_capture_func(cam_t *); gint fps(GtkWidget *); gint timeout_func(cam_t *); diff --git a/src/camorama-window.c b/src/camorama-window.c index 8f05d78..7e69e36 100644 --- a/src/camorama-window.c +++ b/src/camorama-window.c @@ -516,5 +516,12 @@ void load_interface(cam_t *cam) // Detect window resize calls g_signal_connect(GTK_WIDGET(gtk_builder_get_object(cam->xml, "da")), "configure-event", G_CALLBACK(on_configure_event), cam); + g_signal_connect(window, "window-state-event", + G_CALLBACK(on_window_state_event), cam); + + g_signal_connect(gtk_builder_get_object(cam->xml, "button3"), + "clicked", G_CALLBACK(toggle_fullscreen), cam); + g_signal_connect(gtk_builder_get_object(cam->xml, "imagemenuitem2"), + "activate", G_CALLBACK(toggle_fullscreen), cam); #endif } |