From 9dd2830e0c01e163a3ba92cb07476c02fd132b99 Mon Sep 17 00:00:00 2001 From: Simon Matter Date: Mon, 9 Oct 2017 11:36:23 +0200 Subject: nxagent: Auto-detect client-side DPI at session startup. --- nx-X11/programs/Xserver/hw/nxagent/Args.c | 8 +++++ nx-X11/programs/Xserver/hw/nxagent/Extensions.c | 17 ++++++++-- nx-X11/programs/Xserver/hw/nxagent/Screen.c | 42 ++++++++++++++++++++++-- nx-X11/programs/Xserver/hw/nxagent/man/nxagent.1 | 3 ++ 4 files changed, 64 insertions(+), 6 deletions(-) diff --git a/nx-X11/programs/Xserver/hw/nxagent/Args.c b/nx-X11/programs/Xserver/hw/nxagent/Args.c index 63433f4da..a51ad0c01 100644 --- a/nx-X11/programs/Xserver/hw/nxagent/Args.c +++ b/nx-X11/programs/Xserver/hw/nxagent/Args.c @@ -130,6 +130,8 @@ char nxagentDisplayName[NXAGENTDISPLAYNAMELENGTH]; Bool nxagentSynchronize = False; Bool nxagentRealWindowProp = False; +Bool nxagentAutoDPI = False; + char nxagentShadowDisplayName[NXAGENTSHADOWDISPLAYNAMELENGTH] = {0}; char nxagentWindowName[NXAGENTWINDOWNAMELENGTH]; @@ -743,6 +745,11 @@ int ddxProcessArgument(int argc, char *argv[], int i) return 1; } + if (!strcmp(argv[i], "-autodpi")) { + nxagentAutoDPI = True; + return 1; + } + /* * The original -noreset option, disabling * dispatchExceptionAtReset, is the default. @@ -2091,6 +2098,7 @@ void ddxUseMsg(void) ErrorF("-class string default visual class\n"); ErrorF("-depth int default depth\n"); ErrorF("-geometry WxH+X+Y window size and position\n"); + ErrorF("-autodpi detect real server's DPI and use that in the session\n"); ErrorF("-bw int window border width\n"); ErrorF("-name string window name\n"); ErrorF("-scrns int number of screens to generate\n"); diff --git a/nx-X11/programs/Xserver/hw/nxagent/Extensions.c b/nx-X11/programs/Xserver/hw/nxagent/Extensions.c index 211af8ccf..05a4b4f13 100644 --- a/nx-X11/programs/Xserver/hw/nxagent/Extensions.c +++ b/nx-X11/programs/Xserver/hw/nxagent/Extensions.c @@ -338,15 +338,26 @@ static int nxagentRandRInitSizes(ScreenPtr pScreen) width = w[i]; height = h[i]; - mmWidth = (width * 254 + monitorResolution * 5) / (monitorResolution * 10); + if (monitorResolution < 0) + { + mmWidth = width * DisplayWidthMM(nxagentDisplay, DefaultScreen(nxagentDisplay)) / + DisplayWidth(nxagentDisplay, DefaultScreen(nxagentDisplay)); + + mmHeight = height * DisplayHeightMM(nxagentDisplay, DefaultScreen(nxagentDisplay)) / + DisplayHeight(nxagentDisplay, DefaultScreen(nxagentDisplay)); + } + else + { + mmWidth = (width * 254 + monitorResolution * 5) / (monitorResolution * 10); + mmHeight = (height * 254 + monitorResolution * 5) / (monitorResolution * 10); + + } if (mmWidth < 1) { mmWidth = 1; } - mmHeight = (height * 254 + monitorResolution * 5) / (monitorResolution * 10); - if (mmHeight < 1) { mmHeight = 1; diff --git a/nx-X11/programs/Xserver/hw/nxagent/Screen.c b/nx-X11/programs/Xserver/hw/nxagent/Screen.c index 36da8b905..d4a083a1b 100644 --- a/nx-X11/programs/Xserver/hw/nxagent/Screen.c +++ b/nx-X11/programs/Xserver/hw/nxagent/Screen.c @@ -210,6 +210,9 @@ void nxagentShadowAdaptDepth(unsigned int, unsigned int, unsigned int, char **); RegionRec nxagentShadowUpdateRegion; #define NXAGENT_DEFAULT_DPI 75 +#define NXAGENT_AUTO_DPI -1 + +extern Bool nxagentAutoDPI; /* * From randr/randr.c. This was originally static @@ -1327,10 +1330,14 @@ Bool nxagentOpenScreen(ScreenPtr pScreen, rootDepth, (long unsigned int)defaultVisual); #endif - if (monitorResolution < 1) + if ((monitorResolution < 1) && (nxagentAutoDPI == False)) { monitorResolution = NXAGENT_DEFAULT_DPI; } + else if ((monitorResolution < 1) && (nxagentAutoDPI == True)) + { + monitorResolution = NXAGENT_AUTO_DPI; + } if (!fbScreenInit(pScreen, pFrameBufferBits, nxagentOption(RootWidth), nxagentOption(RootHeight), monitorResolution, monitorResolution, PixmapBytePad(nxagentOption(RootWidth), rootDepth), bitsPerPixel)) @@ -1474,6 +1481,17 @@ N/A * return FALSE; */ + if (monitorResolution < 0) + { + pScreen->mmWidth = nxagentOption(RootWidth) * DisplayWidthMM(nxagentDisplay, + DefaultScreen(nxagentDisplay)) / DisplayWidth(nxagentDisplay, + DefaultScreen(nxagentDisplay)); + + pScreen->mmHeight = nxagentOption(RootHeight) * DisplayHeightMM(nxagentDisplay, + DefaultScreen(nxagentDisplay)) / DisplayHeight(nxagentDisplay, + DefaultScreen(nxagentDisplay)); + } + pScreen->defColormap = (Colormap) FakeClientID(0); pScreen->minInstalledCmaps = MINCMAPS; pScreen->maxInstalledCmaps = MAXCMAPS; @@ -2294,22 +2312,40 @@ Bool nxagentResizeScreen(ScreenPtr pScreen, int width, int height, if (mmWidth == 0) { - mmWidth = (width * 254 + monitorResolution * 5) / (monitorResolution * 10); + if (monitorResolution < 0) + { + mmWidth = width * DisplayWidthMM(nxagentDisplay, DefaultScreen(nxagentDisplay)) / + DisplayWidth(nxagentDisplay, DefaultScreen(nxagentDisplay)); + } + else + { + mmWidth = (width * 254 + monitorResolution * 5) / (monitorResolution * 10); + } if (mmWidth < 1) { mmWidth = 1; } + } if (mmHeight == 0) { - mmHeight = (height * 254 + monitorResolution * 5) / (monitorResolution * 10); + if (monitorResolution < 0) + { + mmHeight = height * DisplayHeightMM(nxagentDisplay, DefaultScreen(nxagentDisplay)) / + DisplayHeight(nxagentDisplay, DefaultScreen(nxagentDisplay)); + } + else + { + mmHeight = (height * 254 + monitorResolution * 5) / (monitorResolution * 10); + } if (mmHeight < 1) { mmHeight = 1; } + } pScreen -> mmWidth = mmWidth; diff --git a/nx-X11/programs/Xserver/hw/nxagent/man/nxagent.1 b/nx-X11/programs/Xserver/hw/nxagent/man/nxagent.1 index d6ed4d0fe..eb7307b77 100644 --- a/nx-X11/programs/Xserver/hw/nxagent/man/nxagent.1 +++ b/nx-X11/programs/Xserver/hw/nxagent/man/nxagent.1 @@ -393,6 +393,9 @@ auto-disconnect timeout in seconds (minimum allowed: 60) .B \-norootlessexit don't exit if there are no clients in rootless mode .TP 8 +.B \-autodpi +detect real server's DPI and set it in the agent session; the \fI-dpi \fR cmdline option overrides \fI-autodpi\fR +.TP 8 .B \-nomagicpixel disable magic pixel support at session startup, can be re-enabled via nx/nx option on session resumption -- cgit v1.2.3 From 29c166dbed16cbc3112b4915f4e6938b92983999 Mon Sep 17 00:00:00 2001 From: Mike Gabriel Date: Wed, 21 Feb 2018 22:21:15 +0100 Subject: nxagent: Also provide auto DPI feature via nx/nx option 'autodpi', taking only effect on session startups. --- nx-X11/programs/Xserver/hw/nxagent/Args.c | 19 +++++++++++++++++++ nx-X11/programs/Xserver/hw/nxagent/man/nxagent.1 | 5 +++++ nxcomp/src/Loop.cpp | 3 ++- nxcomp/src/Misc.cpp | 1 + nxproxy/man/nxproxy.1 | 1 + 5 files changed, 28 insertions(+), 1 deletion(-) diff --git a/nx-X11/programs/Xserver/hw/nxagent/Args.c b/nx-X11/programs/Xserver/hw/nxagent/Args.c index a51ad0c01..c31acc26a 100644 --- a/nx-X11/programs/Xserver/hw/nxagent/Args.c +++ b/nx-X11/programs/Xserver/hw/nxagent/Args.c @@ -1278,6 +1278,25 @@ static void nxagentParseOptions(char *name, char *value) return; } + else if (!strcmp(name, "autodpi")) + { + if (nxagentReconnectTrap == True) + { + #ifdef DEBUG + fprintf(stderr, "nxagentParseOptions: Ignoring option 'autodpi' at reconnection.\n"); + #endif + } + else if (!strcmp(value, "0")) + { + nxagentAutoDPI = False; + } + else + { + nxagentAutoDPI = True; + } + + return; + } else if (strcmp(name, "shadowuid") == 0) { nxagentShadowUid = atoi(value); diff --git a/nx-X11/programs/Xserver/hw/nxagent/man/nxagent.1 b/nx-X11/programs/Xserver/hw/nxagent/man/nxagent.1 index eb7307b77..d3069bffd 100644 --- a/nx-X11/programs/Xserver/hw/nxagent/man/nxagent.1 +++ b/nx-X11/programs/Xserver/hw/nxagent/man/nxagent.1 @@ -606,6 +606,11 @@ proxy <-> agent remote sessions) .B magicpixel= enable/disable magic pixel support in fullscreen mode (default: 1, enabled) .TP 8 +.B autodpi= +enable/disable deriving session DPI automatically from real server +(default: 0, disabled); only takes effect on session startups, gets +ignored when reconnecting to a suspended session +.TP 8 .B sleep= delay X server operations when suspended (provided in msec), set to \fI0\fR to keep \fBnxagent\fR session fully functional when suspended diff --git a/nxcomp/src/Loop.cpp b/nxcomp/src/Loop.cpp index 251eb04f3..5365a99cf 100644 --- a/nxcomp/src/Loop.cpp +++ b/nxcomp/src/Loop.cpp @@ -8476,7 +8476,8 @@ int ParseEnvironmentOptions(const char *env, int force) strcasecmp(name, "tile") == 0 || strcasecmp(name, "menu") == 0 || strcasecmp(name, "magicpixel") == 0 || - strcasecmp(name, "state") == 0 ) + strcasecmp(name, "autodpi") == 0 || + strcasecmp(name, "state") == 0 ) { nxdbg << "Loop: Ignoring agent option '" << name << "' with value '" << value << "'.\n" diff --git a/nxcomp/src/Misc.cpp b/nxcomp/src/Misc.cpp index b6bf24578..4f1af0ec4 100644 --- a/nxcomp/src/Misc.cpp +++ b/nxcomp/src/Misc.cpp @@ -344,6 +344,7 @@ defer=n\n\ tile=s\n\ menu=n\n\ magicpixel=n\n\ +autodpi=n\n\ sleep=n\n\ tolerancechecks=s\n\ keyconv=s\n\ diff --git a/nxproxy/man/nxproxy.1 b/nxproxy/man/nxproxy.1 index 1bf070c96..b5ab89340 100644 --- a/nxproxy/man/nxproxy.1 +++ b/nxproxy/man/nxproxy.1 @@ -328,6 +328,7 @@ encryption of the point to point communication. tile= menu= magicpixel= + autodpi= sleep= .SH NX ENVIRONMENT VARIABLES -- cgit v1.2.3