diff mbox

gtk: implement -full-screen and -no-frame

Message ID 11837115.9GZ72nQAUt@al
State New
Headers show

Commit Message

Peter Wu June 9, 2013, 10:30 a.m. UTC
Aiming for GTK as replacement for SDL, features like -full-screen and -no-frame
should also be implemented.

Bringing the window into full-screen mode is done by faking activating the full
screen menu item with a NULL menu item (which currently is not used by
gd_menu_full_screen). This is done after showing the windows to make the cursor
and menu hidden.

Signed-off-by: Peter Wu <lekensteyn@gmail.com>
---
 include/ui/console.h |  2 +-
 ui/gtk.c             | 10 +++++++++-
 vl.c                 |  2 +-
 3 files changed, 11 insertions(+), 3 deletions(-)

Comments

Anthony Liguori June 9, 2013, 6:33 p.m. UTC | #1
On Sun, Jun 9, 2013 at 5:30 AM, Peter Wu <lekensteyn@gmail.com> wrote:
> Aiming for GTK as replacement for SDL, features like -full-screen and -no-frame
> should also be implemented.
>
> Bringing the window into full-screen mode is done by faking activating the full
> screen menu item with a NULL menu item (which currently is not used by
> gd_menu_full_screen). This is done after showing the windows to make the cursor
> and menu hidden.
>
> Signed-off-by: Peter Wu <lekensteyn@gmail.com>
> ---
>  include/ui/console.h |  2 +-
>  ui/gtk.c             | 10 +++++++++-
>  vl.c                 |  2 +-
>  3 files changed, 11 insertions(+), 3 deletions(-)
>
> diff --git a/include/ui/console.h b/include/ui/console.h
> index 4307b5f..7174ba9 100644
> --- a/include/ui/console.h
> +++ b/include/ui/console.h
> @@ -339,6 +339,6 @@ int index_from_keycode(int code);
>
>  /* gtk.c */
>  void early_gtk_display_init(void);
> -void gtk_display_init(DisplayState *ds);
> +void gtk_display_init(DisplayState *ds, int full_screen, int no_frame);
>
>  #endif
> diff --git a/ui/gtk.c b/ui/gtk.c
> index 3bc2842..3df2611 100644
> --- a/ui/gtk.c
> +++ b/ui/gtk.c
> @@ -1433,7 +1433,7 @@ static const DisplayChangeListenerOps dcl_ops = {
>      .dpy_cursor_define = gd_cursor_define,
>  };
>
> -void gtk_display_init(DisplayState *ds)
> +void gtk_display_init(DisplayState *ds, int full_screen, int no_frame)
>  {
>      GtkDisplayState *s = g_malloc0(sizeof(*s));
>      char *filename;
> @@ -1457,6 +1457,10 @@ void gtk_display_init(DisplayState *ds)
>      s->scale_y = 1.0;
>      s->free_scale = FALSE;
>
> +    if (no_frame) {
> +        gtk_window_set_decorated(GTK_WINDOW(s->window), FALSE);
> +    }
> +

Is this really desirable?  Why do people use -no-frame?  I don't think
we should carry over features from SDL just because they are there.

>      setlocale(LC_ALL, "");
>      bindtextdomain("qemu", CONFIG_QEMU_LOCALEDIR);
>      textdomain("qemu");
> @@ -1509,6 +1513,10 @@ void gtk_display_init(DisplayState *ds)
>
>      gtk_widget_show_all(s->window);
>
> +    if (full_screen) {
> +        gd_menu_full_screen(NULL, s);
> +    }
> +

You should activate the menu item by using gtk_check_menu_item_set_active().

Otherwise the menu with be out of sync with the UI state.

Regards,

Anthony Liguori

>      register_displaychangelistener(&s->dcl);
>
>      global_state = s;
> diff --git a/vl.c b/vl.c
> index 47ab45d..5a00710 100644
> --- a/vl.c
> +++ b/vl.c
> @@ -4347,7 +4347,7 @@ int main(int argc, char **argv, char **envp)
>  #endif
>  #if defined(CONFIG_GTK)
>      case DT_GTK:
> -        gtk_display_init(ds);
> +        gtk_display_init(ds, full_screen, no_frame);
>          break;
>  #endif
>      default:
> --
> 1.8.3
>
>
>
Peter Wu June 9, 2013, 9:49 p.m. UTC | #2
On Sunday 09 June 2013 13:33:14 Anthony Liguori wrote:
> On Sun, Jun 9, 2013 at 5:30 AM, Peter Wu <lekensteyn@gmail.com> wrote:
> > Aiming for GTK as replacement for SDL, features like -full-screen and
> > -no-frame should also be implemented.
> > 
> > Bringing the window into full-screen mode is done by faking activating the
> > full screen menu item with a NULL menu item (which currently is not used
> > by gd_menu_full_screen). This is done after showing the windows to make
> > the cursor and menu hidden.
> > 
> > Signed-off-by: Peter Wu <lekensteyn@gmail.com>
> > ---
> > 
> >  include/ui/console.h |  2 +-
> >  ui/gtk.c             | 10 +++++++++-
> >  vl.c                 |  2 +-
> >  3 files changed, 11 insertions(+), 3 deletions(-)
> > 
> > diff --git a/include/ui/console.h b/include/ui/console.h
> > index 4307b5f..7174ba9 100644
> > --- a/include/ui/console.h
> > +++ b/include/ui/console.h
> > @@ -339,6 +339,6 @@ int index_from_keycode(int code);
> > 
> >  /* gtk.c */
> >  void early_gtk_display_init(void);
> > 
> > -void gtk_display_init(DisplayState *ds);
> > +void gtk_display_init(DisplayState *ds, int full_screen, int no_frame);
> > 
> >  #endif
> > 
> > diff --git a/ui/gtk.c b/ui/gtk.c
> > index 3bc2842..3df2611 100644
> > --- a/ui/gtk.c
> > +++ b/ui/gtk.c
> > @@ -1433,7 +1433,7 @@ static const DisplayChangeListenerOps dcl_ops = {
> > 
> >      .dpy_cursor_define = gd_cursor_define,
> >  
> >  };
> > 
> > -void gtk_display_init(DisplayState *ds)
> > +void gtk_display_init(DisplayState *ds, int full_screen, int no_frame)
> > 
> >  {
> >  
> >      GtkDisplayState *s = g_malloc0(sizeof(*s));
> >      char *filename;
> > 
> > @@ -1457,6 +1457,10 @@ void gtk_display_init(DisplayState *ds)
> > 
> >      s->scale_y = 1.0;
> >      s->free_scale = FALSE;
> > 
> > +    if (no_frame) {
> > +        gtk_window_set_decorated(GTK_WINDOW(s->window), FALSE);
> > +    }
> > +
> 
> Is this really desirable?  Why do people use -no-frame?  I don't think
> we should carry over features from SDL just because they are there.

I started using it because -full-screen didn't work well in SDL. In SDL, full-
screen mode changes de video mode too. At some point, I even managed to crash 
QEMU in full screen mode with certain Xorg settings.

I just added it to GTK because it was possible to do so. In GTK, I -full-
screen hides the menu bar (although there is still some pixels visible on the 
top!) and the border without changing modes (which is a plus!). Due to this, 
there is not really a need for -no-frame for me.

Others are likely using -no-frame in a space-constrained environment where 
they need to show multiple windows.

> >      setlocale(LC_ALL, "");
> >      bindtextdomain("qemu", CONFIG_QEMU_LOCALEDIR);
> >      textdomain("qemu");
> > 
> > @@ -1509,6 +1513,10 @@ void gtk_display_init(DisplayState *ds)
> > 
> >      gtk_widget_show_all(s->window);
> > 
> > +    if (full_screen) {
> > +        gd_menu_full_screen(NULL, s);
> > +    }
> > +
> 
> You should activate the menu item by using gtk_check_menu_item_set_active().
> 
> Otherwise the menu with be out of sync with the UI state.

Alright, I forgot to check that. I will this fix in a next patch where I will 
leave out -no-frame as well.

Thanks for review!

Regards,
Peter

> Regards,
> 
> Anthony Liguori
> 
> >      register_displaychangelistener(&s->dcl);
> >      
> >      global_state = s;
> > 
> > diff --git a/vl.c b/vl.c
> > index 47ab45d..5a00710 100644
> > --- a/vl.c
> > +++ b/vl.c
> > @@ -4347,7 +4347,7 @@ int main(int argc, char **argv, char **envp)
> > 
> >  #endif
> >  #if defined(CONFIG_GTK)
> >  
> >      case DT_GTK:
> > -        gtk_display_init(ds);
> > +        gtk_display_init(ds, full_screen, no_frame);
> > 
> >          break;
> >  
> >  #endif
> >  
> >      default:
> > --
> > 1.8.3
Kevin Wolf June 10, 2013, 12:33 p.m. UTC | #3
Am 09.06.2013 um 12:30 hat Peter Wu geschrieben:
> Aiming for GTK as replacement for SDL, features like -full-screen and -no-frame
> should also be implemented.
> 
> Bringing the window into full-screen mode is done by faking activating the full
> screen menu item with a NULL menu item (which currently is not used by
> gd_menu_full_screen). This is done after showing the windows to make the cursor
> and menu hidden.
> 
> Signed-off-by: Peter Wu <lekensteyn@gmail.com>
> ---
>  include/ui/console.h |  2 +-
>  ui/gtk.c             | 10 +++++++++-
>  vl.c                 |  2 +-
>  3 files changed, 11 insertions(+), 3 deletions(-)
> 
> diff --git a/include/ui/console.h b/include/ui/console.h
> index 4307b5f..7174ba9 100644
> --- a/include/ui/console.h
> +++ b/include/ui/console.h
> @@ -339,6 +339,6 @@ int index_from_keycode(int code);
>  
>  /* gtk.c */
>  void early_gtk_display_init(void);
> -void gtk_display_init(DisplayState *ds);
> +void gtk_display_init(DisplayState *ds, int full_screen, int no_frame);

Should the new arguments be bool?

Kevin
Peter Wu June 10, 2013, 12:43 p.m. UTC | #4
On Monday 10 June 2013 14:33:28 Kevin Wolf wrote:
> Am 09.06.2013 um 12:30 hat Peter Wu geschrieben:
> > Aiming for GTK as replacement for SDL, features like -full-screen and
> > -no-frame should also be implemented.
> >
> > 
> >
> > Bringing the window into full-screen mode is done by faking activating the
> > full screen menu item with a NULL menu item (which currently is not used
> > by gd_menu_full_screen). This is done after showing the windows to make
> > the cursor and menu hidden.
> >
> > 
> >
> > Signed-off-by: Peter Wu <lekensteyn@gmail.com>
> > ---
> >
> >  include/ui/console.h |  2 +-
> >  ui/gtk.c             | 10 +++++++++-
> >  vl.c                 |  2 +-
> >  3 files changed, 11 insertions(+), 3 deletions(-)
> > 
> >
> > diff --git a/include/ui/console.h b/include/ui/console.h
> > index 4307b5f..7174ba9 100644
> > --- a/include/ui/console.h
> > +++ b/include/ui/console.h
> > @@ -339,6 +339,6 @@ int index_from_keycode(int code);
> >
> >  
> >  /* gtk.c */
> >  void early_gtk_display_init(void);
> >
> > -void gtk_display_init(DisplayState *ds);
> > +void gtk_display_init(DisplayState *ds, int full_screen, int no_frame);
> 
> Should the new arguments be bool?

Probably yes, but for consistency with the existing types I kept it as int. A 
future patch could change all uses of "int" to "bool" where 1 or 0 are used, 
do you prefer to use bool here anyway?

Regards,
Peter
Kevin Wolf June 10, 2013, 1:15 p.m. UTC | #5
Am 10.06.2013 um 14:43 hat Peter Wu geschrieben:
> On Monday 10 June 2013 14:33:28 Kevin Wolf wrote:
> > Am 09.06.2013 um 12:30 hat Peter Wu geschrieben:
> > > --- a/include/ui/console.h
> > > +++ b/include/ui/console.h
> > > @@ -339,6 +339,6 @@ int index_from_keycode(int code);
> > >
> > >  
> > >  /* gtk.c */
> > >  void early_gtk_display_init(void);
> > >
> > > -void gtk_display_init(DisplayState *ds);
> > > +void gtk_display_init(DisplayState *ds, int full_screen, int no_frame);
> > 
> > Should the new arguments be bool?
> 
> Probably yes, but for consistency with the existing types I kept it as int. A 
> future patch could change all uses of "int" to "bool" where 1 or 0 are used, 
> do you prefer to use bool here anyway?

Yes, if you have to respin anyway, I would prefer if you changed it to
bool. I mean it's not a big deal, but it moves us one step closer to
consistent use of bool for boolean values, so it can't be bad.

I don't think we'll ever see one big conversion patch, but as the code
is touched over time, ints abused as bools will slowly disappear if we
don't introduce new instances.

Kevin
Michael Tokarev June 10, 2013, 3:39 p.m. UTC | #6
09.06.2013 14:30, Peter Wu wrote:
> Aiming for GTK as replacement for SDL, features like -full-screen and -no-frame
> should also be implemented.

I'm not sure both options really should be implemented.  I think -no-frame makes
little sense actually.  But -full-screen is very useful, and hiding the menu bar --
actually in both full-screen mode and windowed mode -- makes very good sense, it
is something the gtk interface miss alot compared with sdl.

Thanks,

/mjt
diff mbox

Patch

diff --git a/include/ui/console.h b/include/ui/console.h
index 4307b5f..7174ba9 100644
--- a/include/ui/console.h
+++ b/include/ui/console.h
@@ -339,6 +339,6 @@  int index_from_keycode(int code);
 
 /* gtk.c */
 void early_gtk_display_init(void);
-void gtk_display_init(DisplayState *ds);
+void gtk_display_init(DisplayState *ds, int full_screen, int no_frame);
 
 #endif
diff --git a/ui/gtk.c b/ui/gtk.c
index 3bc2842..3df2611 100644
--- a/ui/gtk.c
+++ b/ui/gtk.c
@@ -1433,7 +1433,7 @@  static const DisplayChangeListenerOps dcl_ops = {
     .dpy_cursor_define = gd_cursor_define,
 };
 
-void gtk_display_init(DisplayState *ds)
+void gtk_display_init(DisplayState *ds, int full_screen, int no_frame)
 {
     GtkDisplayState *s = g_malloc0(sizeof(*s));
     char *filename;
@@ -1457,6 +1457,10 @@  void gtk_display_init(DisplayState *ds)
     s->scale_y = 1.0;
     s->free_scale = FALSE;
 
+    if (no_frame) {
+        gtk_window_set_decorated(GTK_WINDOW(s->window), FALSE);
+    }
+
     setlocale(LC_ALL, "");
     bindtextdomain("qemu", CONFIG_QEMU_LOCALEDIR);
     textdomain("qemu");
@@ -1509,6 +1513,10 @@  void gtk_display_init(DisplayState *ds)
 
     gtk_widget_show_all(s->window);
 
+    if (full_screen) {
+        gd_menu_full_screen(NULL, s);
+    }
+
     register_displaychangelistener(&s->dcl);
 
     global_state = s;
diff --git a/vl.c b/vl.c
index 47ab45d..5a00710 100644
--- a/vl.c
+++ b/vl.c
@@ -4347,7 +4347,7 @@  int main(int argc, char **argv, char **envp)
 #endif
 #if defined(CONFIG_GTK)
     case DT_GTK:
-        gtk_display_init(ds);
+        gtk_display_init(ds, full_screen, no_frame);
         break;
 #endif
     default: