forked from pool/xorg-x11-server
Accepting request 253132 from home:lbssousa:branches:X11:XOrg
Backport upstream patches to enable Xephyr window placement via new "-output" option or new "-screen WxH+X+Y" syntax. OBS-URL: https://build.opensuse.org/request/show/253132 OBS-URL: https://build.opensuse.org/package/show/X11:XOrg/xorg-x11-server?expand=0&rev=545
This commit is contained in:
parent
4c589ba2ce
commit
e4bc356daa
392
U_ephyr_add_output_option_support.patch
Normal file
392
U_ephyr_add_output_option_support.patch
Normal file
@ -0,0 +1,392 @@
|
||||
From 3a51418b2db353519a1779cf3cebbcc9afba2520 Mon Sep 17 00:00:00 2001
|
||||
From: =?UTF-8?q?La=C3=A9rcio=20de=20Sousa?=
|
||||
<laerciosousa@sme-mogidascruzes.sp.gov.br>
|
||||
Date: Mon, 18 Aug 2014 08:45:43 -0300
|
||||
Subject: ephyr: set screen size & origin from host X server output's CRTC
|
||||
geometry
|
||||
MIME-Version: 1.0
|
||||
Content-Type: text/plain; charset=UTF-8
|
||||
Content-Transfer-Encoding: 8bit
|
||||
|
||||
If a given output is passed via new -output option, Xephyr will query
|
||||
host X server for its info. If the following conditions are met:
|
||||
|
||||
a. RandR extension is enabled in host X server;
|
||||
b. supported RandR version in host X server is 1.2 or newer;
|
||||
c. the given output name is valid;
|
||||
d. the given output is connected;
|
||||
|
||||
then Xephyr will get output's CRTC geometry and use it to set its own
|
||||
screen size and origin. It's just like starting Xephyr in fullscreen mode,
|
||||
but restricted to the given output's CRTC geometry (fake "Zaphod mode").
|
||||
|
||||
This is the main feature needed for Xephyr-based single-card multiseat
|
||||
setups where we don't have separate screens to start Xephyr in fullscreen
|
||||
mode safely.
|
||||
|
||||
Signed-off-by: Laércio de Sousa <laerciosousa@sme-mogidascruzes.sp.gov.br>
|
||||
Reviewed-by: Keith Packard <keithp@keithp.com>
|
||||
Signed-off-by: Keith Packard <keithp@keithp.com>
|
||||
|
||||
diff --git a/configure.ac b/configure.ac
|
||||
index f3d9654..cba7d24 100644
|
||||
--- a/configure.ac
|
||||
+++ b/configure.ac
|
||||
@@ -2364,7 +2364,7 @@ if test "$KDRIVE" = yes; then
|
||||
AC_DEFINE(KDRIVE_MOUSE, 1, [Enable KDrive mouse driver])
|
||||
fi
|
||||
|
||||
- XEPHYR_REQUIRED_LIBS="xau xdmcp xcb xcb-shape xcb-aux xcb-image xcb-icccm xcb-shm xcb-keysyms"
|
||||
+ XEPHYR_REQUIRED_LIBS="xau xdmcp xcb xcb-shape xcb-aux xcb-image xcb-icccm xcb-shm xcb-keysyms xcb-randr"
|
||||
if test "x$XV" = xyes; then
|
||||
XEPHYR_REQUIRED_LIBS="$XEPHYR_REQUIRED_LIBS xcb-xv"
|
||||
fi
|
||||
diff --git a/hw/kdrive/ephyr/ephyr.c b/hw/kdrive/ephyr/ephyr.c
|
||||
index b039c68..85d4193 100644
|
||||
--- a/hw/kdrive/ephyr/ephyr.c
|
||||
+++ b/hw/kdrive/ephyr/ephyr.c
|
||||
@@ -111,13 +111,16 @@ Bool
|
||||
ephyrScreenInitialize(KdScreenInfo *screen)
|
||||
{
|
||||
EphyrScrPriv *scrpriv = screen->driver;
|
||||
+ int x = 0, y = 0;
|
||||
int width = 640, height = 480;
|
||||
CARD32 redMask, greenMask, blueMask;
|
||||
|
||||
- if (hostx_want_screen_size(screen, &width, &height)
|
||||
+ if (hostx_want_screen_geometry(screen, &width, &height, &x, &y)
|
||||
|| !screen->width || !screen->height) {
|
||||
screen->width = width;
|
||||
screen->height = height;
|
||||
+ screen->x = x;
|
||||
+ screen->y = y;
|
||||
}
|
||||
|
||||
if (EphyrWantGrayScale)
|
||||
diff --git a/hw/kdrive/ephyr/ephyr.h b/hw/kdrive/ephyr/ephyr.h
|
||||
index 5c4936b..4e753f1 100644
|
||||
--- a/hw/kdrive/ephyr/ephyr.h
|
||||
+++ b/hw/kdrive/ephyr/ephyr.h
|
||||
@@ -74,8 +74,10 @@ typedef struct _ephyrScrPriv {
|
||||
xcb_window_t peer_win; /* Used for GL; should be at most one */
|
||||
xcb_image_t *ximg;
|
||||
Bool win_explicit_position;
|
||||
+ int win_x, win_y;
|
||||
int win_width, win_height;
|
||||
int server_depth;
|
||||
+ const char *output; /* Set via -output option */
|
||||
unsigned char *fb_data; /* only used when host bpp != server bpp */
|
||||
xcb_shm_segment_info_t shminfo;
|
||||
|
||||
diff --git a/hw/kdrive/ephyr/ephyrinit.c b/hw/kdrive/ephyr/ephyrinit.c
|
||||
index e04c8dc..38acc52 100644
|
||||
--- a/hw/kdrive/ephyr/ephyrinit.c
|
||||
+++ b/hw/kdrive/ephyr/ephyrinit.c
|
||||
@@ -47,6 +47,8 @@ extern KdPointerDriver LinuxEvdevMouseDriver;
|
||||
extern KdKeyboardDriver LinuxEvdevKeyboardDriver;
|
||||
#endif
|
||||
|
||||
+void processScreenOrOutputArg(const char *screen_size, const char *output, char *parent_id);
|
||||
+void processOutputArg(const char *output, char *parent_id);
|
||||
void processScreenArg(const char *screen_size, char *parent_id);
|
||||
|
||||
void
|
||||
@@ -134,6 +136,7 @@ ddxUseMsg(void)
|
||||
ErrorF("-parent <XID> Use existing window as Xephyr root win\n");
|
||||
ErrorF("-sw-cursor Render cursors in software in Xephyr\n");
|
||||
ErrorF("-fullscreen Attempt to run Xephyr fullscreen\n");
|
||||
+ ErrorF("-output <NAME> Attempt to run Xephyr fullscreen (restricted to given output geometry)\n");
|
||||
ErrorF("-grayscale Simulate 8bit grayscale\n");
|
||||
ErrorF("-resizeable Make Xephyr windows resizeable\n");
|
||||
#ifdef GLAMOR
|
||||
@@ -154,7 +157,7 @@ ddxUseMsg(void)
|
||||
}
|
||||
|
||||
void
|
||||
-processScreenArg(const char *screen_size, char *parent_id)
|
||||
+processScreenOrOutputArg(const char *screen_size, const char *output, char *parent_id)
|
||||
{
|
||||
KdCardInfo *card;
|
||||
|
||||
@@ -178,13 +181,25 @@ processScreenArg(const char *screen_size, char *parent_id)
|
||||
|
||||
use_geometry = (strchr(screen_size, '+') != NULL);
|
||||
EPHYR_DBG("screen number:%d\n", screen->mynum);
|
||||
- hostx_add_screen(screen, p_id, screen->mynum, use_geometry);
|
||||
+ hostx_add_screen(screen, p_id, screen->mynum, use_geometry, output);
|
||||
}
|
||||
else {
|
||||
ErrorF("No matching card found!\n");
|
||||
}
|
||||
}
|
||||
|
||||
+void
|
||||
+processScreenArg(const char *screen_size, char *parent_id)
|
||||
+{
|
||||
+ processScreenOrOutputArg(screen_size, NULL, parent_id);
|
||||
+}
|
||||
+
|
||||
+void
|
||||
+processOutputArg(const char *output, char *parent_id)
|
||||
+{
|
||||
+ processScreenOrOutputArg("100x100+0+0", output, parent_id);
|
||||
+}
|
||||
+
|
||||
int
|
||||
ddxProcessArgument(int argc, char **argv, int i)
|
||||
{
|
||||
@@ -226,6 +241,15 @@ ddxProcessArgument(int argc, char **argv, int i)
|
||||
UseMsg();
|
||||
exit(1);
|
||||
}
|
||||
+ else if (!strcmp(argv[i], "-output")) {
|
||||
+ if (i + 1 < argc) {
|
||||
+ processOutputArg(argv[i + 1], NULL);
|
||||
+ return 2;
|
||||
+ }
|
||||
+
|
||||
+ UseMsg();
|
||||
+ exit(1);
|
||||
+ }
|
||||
else if (!strcmp(argv[i], "-sw-cursor")) {
|
||||
hostx_use_sw_cursor();
|
||||
return 1;
|
||||
diff --git a/hw/kdrive/ephyr/hostx.c b/hw/kdrive/ephyr/hostx.c
|
||||
index 92a8ada..2161ad5 100644
|
||||
--- a/hw/kdrive/ephyr/hostx.c
|
||||
+++ b/hw/kdrive/ephyr/hostx.c
|
||||
@@ -51,6 +51,7 @@
|
||||
#include <xcb/xcb_image.h>
|
||||
#include <xcb/shape.h>
|
||||
#include <xcb/xcb_keysyms.h>
|
||||
+#include <xcb/randr.h>
|
||||
#ifdef XF86DRI
|
||||
#include <xcb/xf86dri.h>
|
||||
#include <xcb/glx.h>
|
||||
@@ -104,12 +105,15 @@ static void
|
||||
#define host_depth_matches_server(_vars) (HostX.depth == (_vars)->server_depth)
|
||||
|
||||
int
|
||||
-hostx_want_screen_size(KdScreenInfo *screen, int *width, int *height)
|
||||
+hostx_want_screen_geometry(KdScreenInfo *screen, int *width, int *height, int *x, int *y)
|
||||
{
|
||||
EphyrScrPriv *scrpriv = screen->driver;
|
||||
|
||||
if (scrpriv && (scrpriv->win_pre_existing != None ||
|
||||
+ scrpriv->output != NULL ||
|
||||
HostX.use_fullscreen == TRUE)) {
|
||||
+ *x = scrpriv->win_x;
|
||||
+ *y = scrpriv->win_y;
|
||||
*width = scrpriv->win_width;
|
||||
*height = scrpriv->win_height;
|
||||
return 1;
|
||||
@@ -119,7 +123,7 @@ hostx_want_screen_size(KdScreenInfo *screen, int *width, int *height)
|
||||
}
|
||||
|
||||
void
|
||||
-hostx_add_screen(KdScreenInfo *screen, unsigned long win_id, int screen_num, Bool use_geometry)
|
||||
+hostx_add_screen(KdScreenInfo *screen, unsigned long win_id, int screen_num, Bool use_geometry, const char *output)
|
||||
{
|
||||
EphyrScrPriv *scrpriv = screen->driver;
|
||||
int index = HostX.n_screens;
|
||||
@@ -132,6 +136,7 @@ hostx_add_screen(KdScreenInfo *screen, unsigned long win_id, int screen_num, Boo
|
||||
scrpriv->screen = screen;
|
||||
scrpriv->win_pre_existing = win_id;
|
||||
scrpriv->win_explicit_position = use_geometry;
|
||||
+ scrpriv->output = output;
|
||||
}
|
||||
|
||||
void
|
||||
@@ -211,6 +216,119 @@ hostx_want_preexisting_window(KdScreenInfo *screen)
|
||||
}
|
||||
|
||||
void
|
||||
+hostx_get_output_geometry(const char *output,
|
||||
+ int *x, int *y,
|
||||
+ int *width, int *height)
|
||||
+{
|
||||
+ int i, name_len = 0, output_found = FALSE;
|
||||
+ char *name = NULL;
|
||||
+ xcb_generic_error_t *error;
|
||||
+ xcb_randr_query_version_cookie_t version_c;
|
||||
+ xcb_randr_query_version_reply_t *version_r;
|
||||
+ xcb_randr_get_screen_resources_cookie_t screen_resources_c;
|
||||
+ xcb_randr_get_screen_resources_reply_t *screen_resources_r;
|
||||
+ xcb_randr_output_t *randr_outputs;
|
||||
+ xcb_randr_get_output_info_cookie_t output_info_c;
|
||||
+ xcb_randr_get_output_info_reply_t *output_info_r;
|
||||
+ xcb_randr_get_crtc_info_cookie_t crtc_info_c;
|
||||
+ xcb_randr_get_crtc_info_reply_t *crtc_info_r;
|
||||
+
|
||||
+ /* First of all, check for extension */
|
||||
+ if (!xcb_get_extension_data(HostX.conn, &xcb_randr_id)->present)
|
||||
+ {
|
||||
+ fprintf(stderr, "\nHost X server does not support RANDR extension (or it's disabled).\n");
|
||||
+ exit(1);
|
||||
+ }
|
||||
+
|
||||
+ /* Check RandR version */
|
||||
+ version_c = xcb_randr_query_version(HostX.conn, 1, 2);
|
||||
+ version_r = xcb_randr_query_version_reply(HostX.conn,
|
||||
+ version_c,
|
||||
+ &error);
|
||||
+
|
||||
+ if (error != NULL || version_r == NULL)
|
||||
+ {
|
||||
+ fprintf(stderr, "\nFailed to get RandR version supported by host X server.\n");
|
||||
+ exit(1);
|
||||
+ }
|
||||
+ else if (version_r->major_version < 1 || version_r->minor_version < 2)
|
||||
+ {
|
||||
+ free(version_r);
|
||||
+ fprintf(stderr, "\nHost X server doesn't support RandR 1.2, needed for -output usage.\n");
|
||||
+ exit(1);
|
||||
+ }
|
||||
+
|
||||
+ free(version_r);
|
||||
+
|
||||
+ /* Get list of outputs from screen resources */
|
||||
+ screen_resources_c = xcb_randr_get_screen_resources(HostX.conn,
|
||||
+ HostX.winroot);
|
||||
+ screen_resources_r = xcb_randr_get_screen_resources_reply(HostX.conn,
|
||||
+ screen_resources_c,
|
||||
+ NULL);
|
||||
+ randr_outputs = xcb_randr_get_screen_resources_outputs(screen_resources_r);
|
||||
+
|
||||
+ for (i = 0; !output_found && i < screen_resources_r->num_outputs; i++)
|
||||
+ {
|
||||
+ /* Get info on the output */
|
||||
+ output_info_c = xcb_randr_get_output_info(HostX.conn,
|
||||
+ randr_outputs[i],
|
||||
+ XCB_CURRENT_TIME);
|
||||
+ output_info_r = xcb_randr_get_output_info_reply(HostX.conn,
|
||||
+ output_info_c,
|
||||
+ NULL);
|
||||
+
|
||||
+ /* Get output name */
|
||||
+ name_len = xcb_randr_get_output_info_name_length(output_info_r);
|
||||
+ name = malloc(name_len + 1);
|
||||
+ strncpy(name, (char*)xcb_randr_get_output_info_name(output_info_r), name_len);
|
||||
+ name[name_len] = '\0';
|
||||
+
|
||||
+ if (!strcmp(name, output))
|
||||
+ {
|
||||
+ output_found = TRUE;
|
||||
+
|
||||
+ /* Check if output is connected */
|
||||
+ if (output_info_r->crtc == XCB_NONE)
|
||||
+ {
|
||||
+ free(name);
|
||||
+ free(output_info_r);
|
||||
+ free(screen_resources_r);
|
||||
+ fprintf(stderr, "\nOutput %s is currently disabled (or not connected).\n", output);
|
||||
+ exit(1);
|
||||
+ }
|
||||
+
|
||||
+ /* Get CRTC from output info */
|
||||
+ crtc_info_c = xcb_randr_get_crtc_info(HostX.conn,
|
||||
+ output_info_r->crtc,
|
||||
+ XCB_CURRENT_TIME);
|
||||
+ crtc_info_r = xcb_randr_get_crtc_info_reply(HostX.conn,
|
||||
+ crtc_info_c,
|
||||
+ NULL);
|
||||
+
|
||||
+ /* Get CRTC geometry */
|
||||
+ *x = crtc_info_r->x;
|
||||
+ *y = crtc_info_r->y;
|
||||
+ *width = crtc_info_r->width;
|
||||
+ *height = crtc_info_r->height;
|
||||
+
|
||||
+ free(crtc_info_r);
|
||||
+ }
|
||||
+
|
||||
+ free(name);
|
||||
+ free(output_info_r);
|
||||
+ }
|
||||
+
|
||||
+ free(screen_resources_r);
|
||||
+
|
||||
+ if (!output_found)
|
||||
+ {
|
||||
+ fprintf(stderr, "\nOutput %s not available in host X server.\n", output);
|
||||
+ exit(1);
|
||||
+ }
|
||||
+}
|
||||
+
|
||||
+void
|
||||
hostx_use_fullscreen(void)
|
||||
{
|
||||
HostX.use_fullscreen = TRUE;
|
||||
@@ -359,6 +477,8 @@ hostx_init(void)
|
||||
scrpriv->win = xcb_generate_id(HostX.conn);
|
||||
scrpriv->server_depth = HostX.depth;
|
||||
scrpriv->ximg = NULL;
|
||||
+ scrpriv->win_x = 0;
|
||||
+ scrpriv->win_y = 0;
|
||||
|
||||
if (scrpriv->win_pre_existing != XCB_WINDOW_NONE) {
|
||||
xcb_get_geometry_reply_t *prewin_geom;
|
||||
@@ -416,6 +536,17 @@ hostx_init(void)
|
||||
|
||||
hostx_set_fullscreen_hint();
|
||||
}
|
||||
+ else if (scrpriv->output) {
|
||||
+ hostx_get_output_geometry(scrpriv->output,
|
||||
+ &scrpriv->win_x,
|
||||
+ &scrpriv->win_y,
|
||||
+ &scrpriv->win_width,
|
||||
+ &scrpriv->win_height);
|
||||
+
|
||||
+ HostX.use_fullscreen = TRUE;
|
||||
+ hostx_set_fullscreen_hint();
|
||||
+ }
|
||||
+
|
||||
|
||||
tmpstr = getenv("RESOURCE_NAME");
|
||||
if (tmpstr && (!ephyrResNameFromCmd))
|
||||
@@ -759,6 +890,8 @@ hostx_screen_init(KdScreenInfo *screen,
|
||||
|
||||
scrpriv->win_width = width;
|
||||
scrpriv->win_height = height;
|
||||
+ scrpriv->win_x = x;
|
||||
+ scrpriv->win_y = y;
|
||||
|
||||
#ifdef GLAMOR
|
||||
if (ephyr_glamor) {
|
||||
diff --git a/hw/kdrive/ephyr/hostx.h b/hw/kdrive/ephyr/hostx.h
|
||||
index c554ca3..80894c8 100644
|
||||
--- a/hw/kdrive/ephyr/hostx.h
|
||||
+++ b/hw/kdrive/ephyr/hostx.h
|
||||
@@ -74,7 +74,7 @@ typedef struct {
|
||||
} EphyrRect;
|
||||
|
||||
int
|
||||
-hostx_want_screen_size(KdScreenInfo *screen, int *width, int *height);
|
||||
+hostx_want_screen_geometry(KdScreenInfo *screen, int *width, int *height, int *x, int *y);
|
||||
|
||||
int
|
||||
hostx_want_host_cursor(void);
|
||||
@@ -83,6 +83,11 @@ void
|
||||
hostx_use_sw_cursor(void);
|
||||
|
||||
void
|
||||
+ hostx_get_output_geometry(const char *output,
|
||||
+ int *x, int *y,
|
||||
+ int *width, int *height);
|
||||
+
|
||||
+void
|
||||
hostx_use_fullscreen(void);
|
||||
|
||||
int
|
||||
@@ -107,7 +112,7 @@ int
|
||||
hostx_init(void);
|
||||
|
||||
void
|
||||
-hostx_add_screen(KdScreenInfo *screen, unsigned long win_id, int screen_num, Bool use_geometry);
|
||||
+hostx_add_screen(KdScreenInfo *screen, unsigned long win_id, int screen_num, Bool use_geometry, const char *output);
|
||||
|
||||
void
|
||||
hostx_set_display_name(char *name);
|
||||
--
|
||||
cgit v0.10.2
|
||||
|
156
U_ephyr_enable_screen_window_placement.patch
Normal file
156
U_ephyr_enable_screen_window_placement.patch
Normal file
@ -0,0 +1,156 @@
|
||||
From 84b02469ef97e6f85d074d220a517d752180045f Mon Sep 17 00:00:00 2001
|
||||
From: =?UTF-8?q?La=C3=A9rcio=20de=20Sousa?=
|
||||
<laerciosousa@sme-mogidascruzes.sp.gov.br>
|
||||
Date: Mon, 18 Aug 2014 08:45:42 -0300
|
||||
Subject: ephyr: enable screen window placement following kdrive -screen option
|
||||
extended syntax
|
||||
MIME-Version: 1.0
|
||||
Content-Type: text/plain; charset=UTF-8
|
||||
Content-Transfer-Encoding: 8bit
|
||||
|
||||
With this patch, one can launch Xephyr with option "-screen WxH+X+Y"
|
||||
to place its window origin at (X,Y). This patch relies on a previous
|
||||
one that extends kdrive -screen option syntax to parse +X+Y substring
|
||||
as expected.
|
||||
|
||||
If +X+Y is not passed in -screen argument string, let the WM place
|
||||
the window for us, as before.
|
||||
|
||||
Signed-off-by: Laércio de Sousa <laerciosousa@sme-mogidascruzes.sp.gov.br>
|
||||
Reviewed-by: Keith Packard <keithp@keithp.com>
|
||||
Signed-off-by: Keith Packard <keithp@keithp.com>
|
||||
|
||||
diff --git a/hw/kdrive/ephyr/ephyr.c b/hw/kdrive/ephyr/ephyr.c
|
||||
index d57e9f3..b039c68 100644
|
||||
--- a/hw/kdrive/ephyr/ephyr.c
|
||||
+++ b/hw/kdrive/ephyr/ephyr.c
|
||||
@@ -242,7 +242,8 @@ ephyrMapFramebuffer(KdScreenInfo * screen)
|
||||
buffer_height = ephyrBufferHeight(screen);
|
||||
|
||||
priv->base =
|
||||
- hostx_screen_init(screen, screen->width, screen->height, buffer_height,
|
||||
+ hostx_screen_init(screen, screen->x, screen->y,
|
||||
+ screen->width, screen->height, buffer_height,
|
||||
&priv->bytes_per_line, &screen->fb.bitsPerPixel);
|
||||
|
||||
if ((scrpriv->randr & RR_Rotate_0) && !(scrpriv->randr & RR_Reflect_All)) {
|
||||
diff --git a/hw/kdrive/ephyr/ephyr.h b/hw/kdrive/ephyr/ephyr.h
|
||||
index dfd93c9..5c4936b 100644
|
||||
--- a/hw/kdrive/ephyr/ephyr.h
|
||||
+++ b/hw/kdrive/ephyr/ephyr.h
|
||||
@@ -73,6 +73,7 @@ typedef struct _ephyrScrPriv {
|
||||
xcb_window_t win_pre_existing; /* Set via -parent option like xnest */
|
||||
xcb_window_t peer_win; /* Used for GL; should be at most one */
|
||||
xcb_image_t *ximg;
|
||||
+ Bool win_explicit_position;
|
||||
int win_width, win_height;
|
||||
int server_depth;
|
||||
unsigned char *fb_data; /* only used when host bpp != server bpp */
|
||||
diff --git a/hw/kdrive/ephyr/ephyrinit.c b/hw/kdrive/ephyr/ephyrinit.c
|
||||
index fc00010..e04c8dc 100644
|
||||
--- a/hw/kdrive/ephyr/ephyrinit.c
|
||||
+++ b/hw/kdrive/ephyr/ephyrinit.c
|
||||
@@ -164,6 +164,7 @@ processScreenArg(const char *screen_size, char *parent_id)
|
||||
if (card) {
|
||||
KdScreenInfo *screen;
|
||||
unsigned long p_id = 0;
|
||||
+ Bool use_geometry;
|
||||
|
||||
screen = KdScreenInfoAdd(card);
|
||||
KdParseScreen(screen, screen_size);
|
||||
@@ -174,8 +175,10 @@ processScreenArg(const char *screen_size, char *parent_id)
|
||||
if (parent_id) {
|
||||
p_id = strtol(parent_id, NULL, 0);
|
||||
}
|
||||
+
|
||||
+ use_geometry = (strchr(screen_size, '+') != NULL);
|
||||
EPHYR_DBG("screen number:%d\n", screen->mynum);
|
||||
- hostx_add_screen(screen, p_id, screen->mynum);
|
||||
+ hostx_add_screen(screen, p_id, screen->mynum, use_geometry);
|
||||
}
|
||||
else {
|
||||
ErrorF("No matching card found!\n");
|
||||
diff --git a/hw/kdrive/ephyr/hostx.c b/hw/kdrive/ephyr/hostx.c
|
||||
index 1c75974..92a8ada 100644
|
||||
--- a/hw/kdrive/ephyr/hostx.c
|
||||
+++ b/hw/kdrive/ephyr/hostx.c
|
||||
@@ -119,7 +119,7 @@ hostx_want_screen_size(KdScreenInfo *screen, int *width, int *height)
|
||||
}
|
||||
|
||||
void
|
||||
-hostx_add_screen(KdScreenInfo *screen, unsigned long win_id, int screen_num)
|
||||
+hostx_add_screen(KdScreenInfo *screen, unsigned long win_id, int screen_num, Bool use_geometry)
|
||||
{
|
||||
EphyrScrPriv *scrpriv = screen->driver;
|
||||
int index = HostX.n_screens;
|
||||
@@ -131,6 +131,7 @@ hostx_add_screen(KdScreenInfo *screen, unsigned long win_id, int screen_num)
|
||||
|
||||
scrpriv->screen = screen;
|
||||
scrpriv->win_pre_existing = win_id;
|
||||
+ scrpriv->win_explicit_position = use_geometry;
|
||||
}
|
||||
|
||||
void
|
||||
@@ -637,6 +638,7 @@ hostx_set_cmap_entry(unsigned char idx,
|
||||
*/
|
||||
void *
|
||||
hostx_screen_init(KdScreenInfo *screen,
|
||||
+ int x, int y,
|
||||
int width, int height, int buffer_height,
|
||||
int *bytes_per_line, int *bits_per_pixel)
|
||||
{
|
||||
@@ -648,8 +650,8 @@ hostx_screen_init(KdScreenInfo *screen,
|
||||
exit(1);
|
||||
}
|
||||
|
||||
- EPHYR_DBG("host_screen=%p wxh=%dx%d, buffer_height=%d",
|
||||
- host_screen, width, height, buffer_height);
|
||||
+ EPHYR_DBG("host_screen=%p x=%d, y=%d, wxh=%dx%d, buffer_height=%d",
|
||||
+ host_screen, x, y, width, height, buffer_height);
|
||||
|
||||
if (scrpriv->ximg != NULL) {
|
||||
/* Free up the image data if previously used
|
||||
@@ -740,6 +742,19 @@ hostx_screen_init(KdScreenInfo *screen,
|
||||
|
||||
xcb_map_window(HostX.conn, scrpriv->win);
|
||||
|
||||
+ /* Set explicit window position if it was informed in
|
||||
+ * -screen option (WxH+X or WxH+X+Y). Otherwise, accept the
|
||||
+ * position set by WM.
|
||||
+ * The trick here is putting this code after xcb_map_window() call,
|
||||
+ * so these values won't be overriden by WM. */
|
||||
+ if (scrpriv->win_explicit_position)
|
||||
+ {
|
||||
+ uint32_t mask = XCB_CONFIG_WINDOW_X | XCB_CONFIG_WINDOW_Y;
|
||||
+ uint32_t values[2] = {x, y};
|
||||
+ xcb_configure_window(HostX.conn, scrpriv->win, mask, values);
|
||||
+ }
|
||||
+
|
||||
+
|
||||
xcb_aux_sync(HostX.conn);
|
||||
|
||||
scrpriv->win_width = width;
|
||||
diff --git a/hw/kdrive/ephyr/hostx.h b/hw/kdrive/ephyr/hostx.h
|
||||
index e83323a..c554ca3 100644
|
||||
--- a/hw/kdrive/ephyr/hostx.h
|
||||
+++ b/hw/kdrive/ephyr/hostx.h
|
||||
@@ -107,7 +107,7 @@ int
|
||||
hostx_init(void);
|
||||
|
||||
void
|
||||
-hostx_add_screen(KdScreenInfo *screen, unsigned long win_id, int screen_num);
|
||||
+hostx_add_screen(KdScreenInfo *screen, unsigned long win_id, int screen_num, Bool use_geometry);
|
||||
|
||||
void
|
||||
hostx_set_display_name(char *name);
|
||||
@@ -136,6 +136,7 @@ hostx_set_cmap_entry(unsigned char idx,
|
||||
unsigned char r, unsigned char g, unsigned char b);
|
||||
|
||||
void *hostx_screen_init(KdScreenInfo *screen,
|
||||
+ int x, int y,
|
||||
int width, int height, int buffer_height,
|
||||
int *bytes_per_line, int *bits_per_pixel);
|
||||
|
||||
--
|
||||
cgit v0.10.2
|
||||
|
108
U_kdrive_extend_screen_option_syntax.patch
Normal file
108
U_kdrive_extend_screen_option_syntax.patch
Normal file
@ -0,0 +1,108 @@
|
||||
From 376f4de8ae927748417046390c24afbda24b0583 Mon Sep 17 00:00:00 2001
|
||||
From: =?UTF-8?q?La=C3=A9rcio=20de=20Sousa?=
|
||||
<laerciosousa@sme-mogidascruzes.sp.gov.br>
|
||||
Date: Mon, 18 Aug 2014 08:45:41 -0300
|
||||
Subject: kdrive: add support to +X+Y syntax in -screen option parsing
|
||||
MIME-Version: 1.0
|
||||
Content-Type: text/plain; charset=UTF-8
|
||||
Content-Transfer-Encoding: 8bit
|
||||
|
||||
This patch enhances current -screen option parsing for kdrive-based
|
||||
applications. It can parse strings like
|
||||
<WIDTH>x<HEIGHT>+<XOFFSET>+<YOFFSET>, storing X and Y offsets
|
||||
in KdScreenInfo instances.
|
||||
|
||||
For negative values, this patch supports +-X+-Y (not -X-Y) syntax.
|
||||
|
||||
It will allow e.g. proper Xephyr window placement for multiseat
|
||||
purposes.
|
||||
|
||||
Signed-off-by: Laércio de Sousa <laerciosousa@sme-mogidascruzes.sp.gov.br>
|
||||
Reviewed-by: Keith Packard <keithp@keithp.com>
|
||||
Signed-off-by: Keith Packard <keithp@keithp.com>
|
||||
|
||||
diff --git a/hw/kdrive/src/kdrive.c b/hw/kdrive/src/kdrive.c
|
||||
index b5b91c0..5dbff3f 100644
|
||||
--- a/hw/kdrive/src/kdrive.c
|
||||
+++ b/hw/kdrive/src/kdrive.c
|
||||
@@ -300,6 +300,8 @@ KdParseScreen(KdScreenInfo * screen, const char *arg)
|
||||
screen->softCursor = kdSoftCursor;
|
||||
screen->origin = kdOrigin;
|
||||
screen->randr = RR_Rotate_0;
|
||||
+ screen->x = 0;
|
||||
+ screen->y = 0;
|
||||
screen->width = 0;
|
||||
screen->height = 0;
|
||||
screen->width_mm = 0;
|
||||
@@ -313,7 +315,7 @@ KdParseScreen(KdScreenInfo * screen, const char *arg)
|
||||
return;
|
||||
|
||||
for (i = 0; i < 2; i++) {
|
||||
- arg = KdParseFindNext(arg, "x/@XY", save, &delim);
|
||||
+ arg = KdParseFindNext(arg, "x/+@XY", save, &delim);
|
||||
if (!save[0])
|
||||
return;
|
||||
|
||||
@@ -321,7 +323,7 @@ KdParseScreen(KdScreenInfo * screen, const char *arg)
|
||||
mm = 0;
|
||||
|
||||
if (delim == '/') {
|
||||
- arg = KdParseFindNext(arg, "x@XY", save, &delim);
|
||||
+ arg = KdParseFindNext(arg, "x+@XY", save, &delim);
|
||||
if (!save[0])
|
||||
return;
|
||||
mm = atoi(save);
|
||||
@@ -335,7 +337,8 @@ KdParseScreen(KdScreenInfo * screen, const char *arg)
|
||||
screen->height = pixels;
|
||||
screen->height_mm = mm;
|
||||
}
|
||||
- if (delim != 'x' && delim != '@' && delim != 'X' && delim != 'Y' &&
|
||||
+ if (delim != 'x' && delim != '+' && delim != '@' &&
|
||||
+ delim != 'X' && delim != 'Y' &&
|
||||
(delim != '\0' || i == 0))
|
||||
return;
|
||||
}
|
||||
@@ -346,6 +349,18 @@ KdParseScreen(KdScreenInfo * screen, const char *arg)
|
||||
kdSoftCursor = FALSE;
|
||||
kdSubpixelOrder = SubPixelUnknown;
|
||||
|
||||
+ if (delim == '+') {
|
||||
+ arg = KdParseFindNext(arg, "+@xXY", save, &delim);
|
||||
+ if (save[0])
|
||||
+ screen->x = atoi(save);
|
||||
+ }
|
||||
+
|
||||
+ if (delim == '+') {
|
||||
+ arg = KdParseFindNext(arg, "@xXY", save, &delim);
|
||||
+ if (save[0])
|
||||
+ screen->y = atoi(save);
|
||||
+ }
|
||||
+
|
||||
if (delim == '@') {
|
||||
arg = KdParseFindNext(arg, "xXY", save, &delim);
|
||||
if (save[0]) {
|
||||
@@ -425,7 +440,7 @@ KdUseMsg(void)
|
||||
{
|
||||
ErrorF("\nTinyX Device Dependent Usage:\n");
|
||||
ErrorF
|
||||
- ("-screen WIDTH[/WIDTHMM]xHEIGHT[/HEIGHTMM][@ROTATION][X][Y][xDEPTH/BPP[xFREQ]] Specify screen characteristics\n");
|
||||
+ ("-screen WIDTH[/WIDTHMM]xHEIGHT[/HEIGHTMM][+[-]XOFFSET][+[-]YOFFSET][@ROTATION][X][Y][xDEPTH/BPP[xFREQ]] Specify screen characteristics\n");
|
||||
ErrorF
|
||||
("-rgba rgb/bgr/vrgb/vbgr/none Specify subpixel ordering for LCD panels\n");
|
||||
ErrorF
|
||||
diff --git a/hw/kdrive/src/kdrive.h b/hw/kdrive/src/kdrive.h
|
||||
index 08b1681..066a134 100644
|
||||
--- a/hw/kdrive/src/kdrive.h
|
||||
+++ b/hw/kdrive/src/kdrive.h
|
||||
@@ -89,6 +89,8 @@ typedef struct _KdScreenInfo {
|
||||
ScreenPtr pScreen;
|
||||
void *driver;
|
||||
Rotation randr; /* rotation and reflection */
|
||||
+ int x;
|
||||
+ int y;
|
||||
int width;
|
||||
int height;
|
||||
int rate;
|
||||
--
|
||||
cgit v0.10.2
|
||||
|
@ -1,3 +1,9 @@
|
||||
-------------------------------------------------------------------
|
||||
Mon Sep 29 14:53:45 UTC 2014 - lbsousajr@gmail.com
|
||||
|
||||
- Backport upstream patches to enable Xephyr window placement
|
||||
via new "-output" option or new "-screen WxH+X+Y" syntax.
|
||||
|
||||
-------------------------------------------------------------------
|
||||
Sun Sep 21 17:31:53 UTC 2014 - tobias.johannes.klausmann@mni.thm.de
|
||||
|
||||
|
@ -164,6 +164,10 @@ Patch1162: b_cache-xkbcomp-output-for-fast-start-up.patch
|
||||
Patch1211: b_0001-Prevent-XSync-Alarms-from-senslessly-calling-CheckTr.patch
|
||||
Patch1222: b_sync-fix.patch
|
||||
|
||||
Patch200: U_kdrive_extend_screen_option_syntax.patch
|
||||
Patch201: U_ephyr_enable_screen_window_placement.patch
|
||||
Patch202: U_ephyr_add_output_option_support.patch
|
||||
|
||||
%description
|
||||
This package contains the X.Org Server.
|
||||
|
||||
@ -248,6 +252,10 @@ cp %{SOURCE90} .
|
||||
### patch222 might not be applicable anymore
|
||||
#%patch1222 -p1
|
||||
|
||||
%patch200 -p1
|
||||
%patch201 -p1
|
||||
%patch202 -p1
|
||||
|
||||
%build
|
||||
autoreconf -fi
|
||||
%configure CFLAGS="%{optflags} -fno-strict-aliasing" \
|
||||
|
Loading…
Reference in New Issue
Block a user