nixpkgs/pkgs/tools/X11/xpra/0002-Constant-DPI.patch
2020-03-31 13:29:46 +07:00

97 lines
3 KiB
Diff

--- a/src/dummy.h 2016-12-17 23:02:53.396287041 +0100
+++ b/src/dummy.h 2016-12-17 23:03:30.319616550 +0100
@@ -51,6 +51,7 @@
/* options */
OptionInfoPtr Options;
Bool swCursor;
+ Bool constantDPI;
/* proc pointer */
CloseScreenProcPtr CloseScreen;
xf86CursorInfoPtr CursorInfo;
--- a/src/dummy_driver.c 2016-12-14 21:54:20.000000000 +0100
+++ b/src/dummy_driver.c 2016-12-17 23:04:59.916416126 +0100
@@ -17,6 +17,12 @@
/* All drivers using the mi colormap manipulation need this */
#include "micmap.h"
+#ifdef RANDR
+#include "randrstr.h"
+#endif
+
+#include "windowstr.h"
+
/* identifying atom needed by magnifiers */
#include <X11/Xatom.h>
#include "property.h"
@@ -115,11 +121,15 @@
};
typedef enum {
- OPTION_SW_CURSOR
+ OPTION_SW_CURSOR,
+ OPTION_CONSTANT_DPI
} DUMMYOpts;
static const OptionInfoRec DUMMYOptions[] = {
{ OPTION_SW_CURSOR, "SWcursor", OPTV_BOOLEAN, {0}, FALSE },
+#ifdef RANDR
+ { OPTION_CONSTANT_DPI, "ConstantDPI", OPTV_BOOLEAN, {0}, FALSE },
+#endif
{ -1, NULL, OPTV_NONE, {0}, FALSE }
};
@@ -359,6 +369,7 @@
xf86ProcessOptions(pScrn->scrnIndex, pScrn->options, dPtr->Options);
xf86GetOptValBool(dPtr->Options, OPTION_SW_CURSOR,&dPtr->swCursor);
+ xf86GetOptValBool(dPtr->Options, OPTION_CONSTANT_DPI, &dPtr->constantDPI);
if (device->videoRam != 0) {
pScrn->videoRam = device->videoRam;
@@ -639,10 +650,45 @@
return TRUE;
}
+const char *XDPY_PROPERTY = "dummy-constant-xdpi";
+const char *YDPY_PROPERTY = "dummy-constant-ydpi";
+static int get_dpi_value(WindowPtr root, const char *property_name, int default_dpi)
+{
+ PropertyPtr prop;
+ Atom type_atom = MakeAtom("CARDINAL", 8, TRUE);
+ Atom prop_atom = MakeAtom(property_name, strlen(property_name), FALSE);
+
+ for (prop = wUserProps(root); prop; prop = prop->next) {
+ if (prop->propertyName == prop_atom && prop->type == type_atom && prop->data) {
+ int v = (int) (*((CARD32 *) prop->data));
+ if ((v>0) && (v<4096)) {
+ xf86DrvMsg(0, X_INFO, "get_constant_dpi_value() found property \"%s\" with value=%i\n", property_name, (int) v);
+ return (int) v;
+ }
+ break;
+ }
+ }
+ return default_dpi;
+}
+
/* Mandatory */
Bool
DUMMYSwitchMode(SWITCH_MODE_ARGS_DECL)
{
+ SCRN_INFO_PTR(arg);
+#ifdef RANDR
+ DUMMYPtr dPtr = DUMMYPTR(pScrn);
+ if (dPtr->constantDPI) {
+ int xDpi = get_dpi_value(pScrn->pScreen->root, XDPY_PROPERTY, pScrn->xDpi);
+ int yDpi = get_dpi_value(pScrn->pScreen->root, YDPY_PROPERTY, pScrn->yDpi);
+ //25.4 mm per inch: (254/10)
+ pScrn->pScreen->mmWidth = mode->HDisplay * 254 / xDpi / 10;
+ pScrn->pScreen->mmHeight = mode->VDisplay * 254 / yDpi / 10;
+ xf86DrvMsg(pScrn->scrnIndex, X_INFO, "mm(dpi %ix%i)=%ix%i\n", xDpi, yDpi, pScrn->pScreen->mmWidth, pScrn->pScreen->mmHeight);
+ RRScreenSizeNotify(pScrn->pScreen);
+ RRTellChanged(pScrn->pScreen);
+ }
+#endif
return TRUE;
}