[PATCH] ephyr: Add -resizeable option

Peter Hutterer peter.hutterer at who-t.net
Wed Dec 12 22:10:51 PST 2012


On Tue, Dec 11, 2012 at 05:23:55PM +0100, Daniel Martin wrote:
> From: Daniel Martin <daniel.martin at secunet.com>
> 
> With this option passed, ephyr windows can be resized like normal
> windows on the fly, without the need of an explicit parent window.
> 
> Signed-off-by: Daniel Martin <daniel.martin at secunet.com>

Acked-by: Peter Hutterer <peter.hutterer at who-t.net>

Cheers,
   Peter

> ---
>  hw/kdrive/ephyr/ephyr.c     |    1 +
>  hw/kdrive/ephyr/ephyrinit.c |    6 ++++++
>  hw/kdrive/ephyr/hostx.c     |   34 ++++++++++++++++++++++------------
>  3 files changed, 29 insertions(+), 12 deletions(-)
> 
> diff --git a/hw/kdrive/ephyr/ephyr.c b/hw/kdrive/ephyr/ephyr.c
> index e6520d0..f32e432 100644
> --- a/hw/kdrive/ephyr/ephyr.c
> +++ b/hw/kdrive/ephyr/ephyr.c
> @@ -56,6 +56,7 @@ typedef struct _EphyrInputPrivate {
>  } EphyrKbdPrivate, EphyrPointerPrivate;
>  
>  Bool EphyrWantGrayScale = 0;
> +Bool EphyrWantResize = 0;
>  
>  Bool
>  ephyrInitialize(KdCardInfo * card, EphyrPriv * priv)
> diff --git a/hw/kdrive/ephyr/ephyrinit.c b/hw/kdrive/ephyr/ephyrinit.c
> index 5e2eb67..adacac9 100644
> --- a/hw/kdrive/ephyr/ephyrinit.c
> +++ b/hw/kdrive/ephyr/ephyrinit.c
> @@ -31,6 +31,7 @@
>  
>  extern Window EphyrPreExistingHostWin;
>  extern Bool EphyrWantGrayScale;
> +extern Bool EphyrWantResize;
>  extern Bool kdHasPointer;
>  extern Bool kdHasKbd;
>  
> @@ -116,6 +117,7 @@ ddxUseMsg(void)
>      ErrorF("-host-cursor         Re-use exisiting X host server cursor\n");
>      ErrorF("-fullscreen          Attempt to run Xephyr fullscreen\n");
>      ErrorF("-grayscale           Simulate 8bit grayscale\n");
> +    ErrorF("-resizeable          Make Xephyr windows resizeable\n");
>      ErrorF
>          ("-fakexa              Simulate acceleration using software rendering\n");
>      ErrorF("-verbosity <level>   Set log verbosity level\n");
> @@ -210,6 +212,10 @@ ddxProcessArgument(int argc, char **argv, int i)
>          EphyrWantGrayScale = 1;
>          return 1;
>      }
> +    else if (!strcmp(argv[i], "-resizeable")) {
> +        EphyrWantResize = 1;
> +        return 1;
> +    }
>      else if (!strcmp(argv[i], "-fakexa")) {
>          ephyrFuncs.initAccel = ephyrDrawInit;
>          ephyrFuncs.enableAccel = ephyrDrawEnable;
> diff --git a/hw/kdrive/ephyr/hostx.c b/hw/kdrive/ephyr/hostx.c
> index 157ac36..54cd2af 100644
> --- a/hw/kdrive/ephyr/hostx.c
> +++ b/hw/kdrive/ephyr/hostx.c
> @@ -117,6 +117,8 @@ extern EphyrKeySyms ephyrKeySyms;
>  
>  extern int monitorResolution;
>  
> +extern Bool EphyrWantResize;
> +
>  char *ephyrResName = NULL;
>  int ephyrResNameFromCmd = 0;
>  char *ephyrTitle = NULL;
> @@ -697,7 +699,7 @@ hostx_screen_init(EphyrScreenInfo screen,
>      XResizeWindow(HostX.dpy, host_screen->win, width, height);
>  
>      /* Ask the WM to keep our size static */
> -    if (host_screen->win_pre_existing == None) {
> +    if (host_screen->win_pre_existing == None && !EphyrWantResize) {
>          size_hints = XAllocSizeHints();
>          size_hints->max_width = size_hints->min_width = width;
>          size_hints->max_height = size_hints->min_height = height;
> @@ -1011,19 +1013,27 @@ hostx_get_event(EphyrHostXEvent * ev)
>  
>          case ConfigureNotify:
>          {
> -            struct EphyrHostScreen *host_screen =
> -                host_screen_from_window(xev.xconfigure.window);
> -
> -            if (host_screen && host_screen->win_pre_existing != None) {
> -                ev->type = EPHYR_EV_CONFIGURE;
> -                ev->data.configure.width = xev.xconfigure.width;
> -                ev->data.configure.height = xev.xconfigure.height;
> -                ev->data.configure.window = xev.xconfigure.window;
> -                ev->data.configure.screen = host_screen->mynum;
> -                return 1;
> +            struct EphyrHostScreen *host_screen;
> +
> +            /* event compression as for Expose events, cause
> +             * we don't want to resize the framebuffer for
> +             * every single change */
> +            while (XCheckTypedWindowEvent(HostX.dpy, xev.xconfigure.window,
> +                                          ConfigureNotify, &xev));
> +            host_screen = host_screen_from_window(xev.xconfigure.window);
> +
> +            if (!host_screen ||
> +                (host_screen->win_pre_existing == None && !EphyrWantResize)) {
> +                return 0;
>              }
>  
> -            return 0;
> +            ev->type = EPHYR_EV_CONFIGURE;
> +            ev->data.configure.width = xev.xconfigure.width;
> +            ev->data.configure.height = xev.xconfigure.height;
> +            ev->data.configure.window = xev.xconfigure.window;
> +            ev->data.configure.screen = host_screen->mynum;
> +
> +            return 1;
>          }
>          default:
>              break;
> -- 
> 1.7.9.5
> 
> _______________________________________________
> xorg-devel at lists.x.org: X.Org development
> Archives: http://lists.x.org/archives/xorg-devel
> Info: http://lists.x.org/mailman/listinfo/xorg-devel
> 


More information about the xorg-devel mailing list