ephyr: Resize screen automatically when parent window is resized

Bugzilla: https://bugs.freedesktop.org/25804
Reviewed-by: Adam Jackson <ajax@redhat.com>
Signed-off-by: Vic Lee <llyzs@163.com>
Signed-off-by: Keith Packard <keithp@keithp.com>
This commit is contained in:
Vic Lee 2012-07-30 14:32:09 -04:00 committed by Keith Packard
parent b46bbafae6
commit 8843aed82e
3 changed files with 82 additions and 8 deletions

View File

@ -558,6 +558,8 @@ ephyrRandRSetConfig(ScreenPtr pScreen,
if (wasEnabled)
KdEnableScreen(pScreen);
RRScreenSizeNotify(pScreen);
return TRUE;
bail4:
@ -590,6 +592,43 @@ ephyrRandRInit(ScreenPtr pScreen)
pScrPriv->rrSetConfig = ephyrRandRSetConfig;
return TRUE;
}
static Bool
ephyrResizeScreen (ScreenPtr pScreen,
int newwidth,
int newheight)
{
KdScreenPriv(pScreen);
KdScreenInfo *screen = pScreenPriv->screen;
RRScreenSize size = {0};
Bool ret;
int t;
if (screen->randr & (RR_Rotate_90|RR_Rotate_270)) {
t = newwidth;
newwidth = newheight;
newheight = t;
}
if (newwidth == screen->width && newheight == screen->height) {
return FALSE;
}
size.width = newwidth;
size.height = newheight;
ret = ephyrRandRSetConfig (pScreen, screen->randr, 0, &size);
if (ret) {
RROutputPtr output;
output = RRFirstOutput(pScreen);
if (!output)
return FALSE;
RROutputSetModes(output, NULL, 0, 0);
}
return ret;
}
#endif
Bool
@ -930,6 +969,14 @@ ephyrPoll(void)
break;
#endif /* XF86DRI */
#ifdef RANDR
case EPHYR_EV_CONFIGURE:
ephyrResizeScreen(screenInfo.screens[ev.data.configure.screen],
ev.data.configure.width,
ev.data.configure.height);
break;
#endif /* RANDR */
default:
break;
}

View File

@ -348,7 +348,8 @@ hostx_init(void)
| PointerMotionMask
| KeyPressMask
| KeyReleaseMask
| ExposureMask;
| ExposureMask
| StructureNotifyMask;
EPHYR_DBG("mark");
@ -696,12 +697,14 @@ hostx_screen_init(EphyrScreenInfo screen,
XResizeWindow(HostX.dpy, host_screen->win, width, height);
/* Ask the WM to keep our size static */
size_hints = XAllocSizeHints();
size_hints->max_width = size_hints->min_width = width;
size_hints->max_height = size_hints->min_height = height;
size_hints->flags = PMinSize | PMaxSize;
XSetWMNormalHints(HostX.dpy, host_screen->win, size_hints);
XFree(size_hints);
if (host_screen->win_pre_existing == None) {
size_hints = XAllocSizeHints();
size_hints->max_width = size_hints->min_width = width;
size_hints->max_height = size_hints->min_height = height;
size_hints->flags = PMinSize | PMaxSize;
XSetWMNormalHints(HostX.dpy, host_screen->win, size_hints);
XFree(size_hints);
}
XMapWindow(HostX.dpy, host_screen->win);
@ -1004,6 +1007,22 @@ hostx_get_event(EphyrHostXEvent * ev)
ev->data.key_up.scancode = xev.xkey.keycode;
return 1;
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;
}
return 0;
}
default:
break;

View File

@ -47,7 +47,8 @@ typedef enum EphyrHostXEventType {
EPHYR_EV_MOUSE_RELEASE,
EPHYR_EV_KEY_PRESS,
EPHYR_EV_KEY_RELEASE,
EPHYR_EV_EXPOSE
EPHYR_EV_EXPOSE,
EPHYR_EV_CONFIGURE,
} EphyrHostXEventType;
/* I can't believe it's not a KeySymsRec. */
@ -89,6 +90,13 @@ struct EphyrHostXEvent {
int window;
} expose;
struct configure {
int width;
int height;
int screen;
int window;
} configure;
} data;
int key_state;