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:
parent
b46bbafae6
commit
8843aed82e
|
@ -558,6 +558,8 @@ ephyrRandRSetConfig(ScreenPtr pScreen,
|
||||||
if (wasEnabled)
|
if (wasEnabled)
|
||||||
KdEnableScreen(pScreen);
|
KdEnableScreen(pScreen);
|
||||||
|
|
||||||
|
RRScreenSizeNotify(pScreen);
|
||||||
|
|
||||||
return TRUE;
|
return TRUE;
|
||||||
|
|
||||||
bail4:
|
bail4:
|
||||||
|
@ -590,6 +592,43 @@ ephyrRandRInit(ScreenPtr pScreen)
|
||||||
pScrPriv->rrSetConfig = ephyrRandRSetConfig;
|
pScrPriv->rrSetConfig = ephyrRandRSetConfig;
|
||||||
return TRUE;
|
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
|
#endif
|
||||||
|
|
||||||
Bool
|
Bool
|
||||||
|
@ -930,6 +969,14 @@ ephyrPoll(void)
|
||||||
break;
|
break;
|
||||||
#endif /* XF86DRI */
|
#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:
|
default:
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
|
@ -348,7 +348,8 @@ hostx_init(void)
|
||||||
| PointerMotionMask
|
| PointerMotionMask
|
||||||
| KeyPressMask
|
| KeyPressMask
|
||||||
| KeyReleaseMask
|
| KeyReleaseMask
|
||||||
| ExposureMask;
|
| ExposureMask
|
||||||
|
| StructureNotifyMask;
|
||||||
|
|
||||||
EPHYR_DBG("mark");
|
EPHYR_DBG("mark");
|
||||||
|
|
||||||
|
@ -696,12 +697,14 @@ hostx_screen_init(EphyrScreenInfo screen,
|
||||||
XResizeWindow(HostX.dpy, host_screen->win, width, height);
|
XResizeWindow(HostX.dpy, host_screen->win, width, height);
|
||||||
|
|
||||||
/* Ask the WM to keep our size static */
|
/* Ask the WM to keep our size static */
|
||||||
size_hints = XAllocSizeHints();
|
if (host_screen->win_pre_existing == None) {
|
||||||
size_hints->max_width = size_hints->min_width = width;
|
size_hints = XAllocSizeHints();
|
||||||
size_hints->max_height = size_hints->min_height = height;
|
size_hints->max_width = size_hints->min_width = width;
|
||||||
size_hints->flags = PMinSize | PMaxSize;
|
size_hints->max_height = size_hints->min_height = height;
|
||||||
XSetWMNormalHints(HostX.dpy, host_screen->win, size_hints);
|
size_hints->flags = PMinSize | PMaxSize;
|
||||||
XFree(size_hints);
|
XSetWMNormalHints(HostX.dpy, host_screen->win, size_hints);
|
||||||
|
XFree(size_hints);
|
||||||
|
}
|
||||||
|
|
||||||
XMapWindow(HostX.dpy, host_screen->win);
|
XMapWindow(HostX.dpy, host_screen->win);
|
||||||
|
|
||||||
|
@ -1004,6 +1007,22 @@ hostx_get_event(EphyrHostXEvent * ev)
|
||||||
ev->data.key_up.scancode = xev.xkey.keycode;
|
ev->data.key_up.scancode = xev.xkey.keycode;
|
||||||
return 1;
|
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:
|
default:
|
||||||
break;
|
break;
|
||||||
|
|
||||||
|
|
|
@ -47,7 +47,8 @@ typedef enum EphyrHostXEventType {
|
||||||
EPHYR_EV_MOUSE_RELEASE,
|
EPHYR_EV_MOUSE_RELEASE,
|
||||||
EPHYR_EV_KEY_PRESS,
|
EPHYR_EV_KEY_PRESS,
|
||||||
EPHYR_EV_KEY_RELEASE,
|
EPHYR_EV_KEY_RELEASE,
|
||||||
EPHYR_EV_EXPOSE
|
EPHYR_EV_EXPOSE,
|
||||||
|
EPHYR_EV_CONFIGURE,
|
||||||
} EphyrHostXEventType;
|
} EphyrHostXEventType;
|
||||||
|
|
||||||
/* I can't believe it's not a KeySymsRec. */
|
/* I can't believe it's not a KeySymsRec. */
|
||||||
|
@ -89,6 +90,13 @@ struct EphyrHostXEvent {
|
||||||
int window;
|
int window;
|
||||||
} expose;
|
} expose;
|
||||||
|
|
||||||
|
struct configure {
|
||||||
|
int width;
|
||||||
|
int height;
|
||||||
|
int screen;
|
||||||
|
int window;
|
||||||
|
} configure;
|
||||||
|
|
||||||
} data;
|
} data;
|
||||||
|
|
||||||
int key_state;
|
int key_state;
|
||||||
|
|
Loading…
Reference in New Issue