about summary refs log tree commit diff stats
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to 'src')
-rw-r--r--src/libtools/my_x11_conv.c53
-rw-r--r--src/libtools/my_x11_conv.h3
-rw-r--r--src/libtools/my_x11_defs.h15
-rw-r--r--src/libtools/my_x11_defs_32.h15
-rw-r--r--src/wrapped32/generated/functions_list.txt4
-rw-r--r--src/wrapped32/generated/wrappedlibxrandrtypes32.h3
-rw-r--r--src/wrapped32/generated/wrapper32.c2
-rw-r--r--src/wrapped32/generated/wrapper32.h1
-rw-r--r--src/wrapped32/wrappedlibxrandr.c14
-rw-r--r--src/wrapped32/wrappedlibxrandr_private.h4
10 files changed, 112 insertions, 2 deletions
diff --git a/src/libtools/my_x11_conv.c b/src/libtools/my_x11_conv.c
index 816f9b9b..7a26313b 100644
--- a/src/libtools/my_x11_conv.c
+++ b/src/libtools/my_x11_conv.c
@@ -1439,3 +1439,56 @@ void* inplace_XFilters_enlarge(void* a)
     }
     return a;
 }
+
+void* inplace_XRRMonitorInfo_shrink(void* a, int n)
+{
+    if(a) {
+        my_XRRMonitorInfo_t* src = a;
+        my_XRRMonitorInfo_32_t* dst = a;
+        for(int i=0; i<n; ++i) {
+            for(int j=0; j<src->noutput; ++j)
+                ((ulong_t*)src->outputs)[j] = to_ulong(src->outputs[j]);
+            dst->name = to_ulong(src->name);
+            dst->primary = src->primary;
+            dst->automatic = src->automatic;
+            dst->noutput = src->noutput;
+            dst->x = src->x;
+            dst->y = src->y;
+            dst->width = src->width;
+            dst->height = src->height;
+            dst->mwidth = src->mwidth;
+            dst->mheight = src->mheight;
+            dst->outputs = to_ptrv(src->outputs);
+            src++;
+            dst++;
+        }
+        src->name = 0;  // mark the last record...
+    }
+    return a;
+}
+
+void* inplace_XRRMonitorInfo_enlarge(void* a, int n)
+{
+    if(a) {
+        my_XRRMonitorInfo_32_t* src = a;
+        my_XRRMonitorInfo_t* dst = a;
+        for(int i=0; i<n; ++i) {
+            dst->name = from_ulong(src->name);
+            dst->primary = src->primary;
+            dst->automatic = src->automatic;
+            dst->noutput = src->noutput;
+            dst->x = src->x;
+            dst->y = src->y;
+            dst->width = src->width;
+            dst->height = src->height;
+            dst->mwidth = src->mwidth;
+            dst->mheight = src->mheight;
+            dst->outputs = from_ptrv(src->outputs);
+            for(int j=dst->noutput-1; j>=0; --j)
+                ((unsigned long*)dst->outputs)[j] = from_ulong(dst->outputs[j]);
+            src++;
+            dst++;
+        }
+    }
+    return a;
+}
diff --git a/src/libtools/my_x11_conv.h b/src/libtools/my_x11_conv.h
index 01596f78..0d9fd314 100644
--- a/src/libtools/my_x11_conv.h
+++ b/src/libtools/my_x11_conv.h
@@ -116,4 +116,7 @@ void* inplace_XDeviceInfo_enlarge(void* a);
 void* inplace_XFilters_shrink(void* a);
 void* inplace_XFilters_enlarge(void* a);
 
+void* inplace_XRRMonitorInfo_shrink(void* a, int n);
+void* inplace_XRRMonitorInfo_enlarge(void* a, int n);
+
 #endif//MY_X11_CONV
\ No newline at end of file
diff --git a/src/libtools/my_x11_defs.h b/src/libtools/my_x11_defs.h
index b2b64dad..a0f87321 100644
--- a/src/libtools/my_x11_defs.h
+++ b/src/libtools/my_x11_defs.h
@@ -1472,4 +1472,19 @@ typedef struct my_XFilters_s {
     short *alias;
 } my_XFilters_t;
 
+typedef struct my__XRRMonitorInfo_s {
+    XID     name;
+    int     primary;
+    int     automatic;
+    int     noutput;
+    int     x;
+    int     y;
+    int     width;
+    int     height;
+    int     mwidth;
+    int     mheight;
+    XID*    outputs;
+} my_XRRMonitorInfo_t;
+
+
 #endif//MY_X11_DEFS
\ No newline at end of file
diff --git a/src/libtools/my_x11_defs_32.h b/src/libtools/my_x11_defs_32.h
index 5d596485..0f24a865 100644
--- a/src/libtools/my_x11_defs_32.h
+++ b/src/libtools/my_x11_defs_32.h
@@ -1414,4 +1414,19 @@ typedef struct my_XFilters_32_s {
     ptr_t alias;    //short *
 } my_XFilters_32_t;
 
+typedef struct my__XRRMonitorInfo_32_s {
+    XID_32  name;
+    int     primary;
+    int     automatic;
+    int     noutput;
+    int     x;
+    int     y;
+    int     width;
+    int     height;
+    int     mwidth;
+    int     mheight;
+    ptr_t   outputs;   //XID*
+} my_XRRMonitorInfo_32_t;
+
+
 #endif//MY_X11_DEFS_32
\ No newline at end of file
diff --git a/src/wrapped32/generated/functions_list.txt b/src/wrapped32/generated/functions_list.txt
index cc18d84f..22b7296b 100644
--- a/src/wrapped32/generated/functions_list.txt
+++ b/src/wrapped32/generated/functions_list.txt
@@ -1506,6 +1506,7 @@
 #() pFEXipp -> pFEXipp
 #() pFEXCip -> pFEXCip
 #() pFEXlpp -> pFEXlpp
+#() pFEXLip -> pFEXLip
 #() pFEXpip -> pFEXpip
 #() pFEXppi -> pFEXppi
 #() pFuiupp -> pFuiupp
@@ -3260,6 +3261,7 @@ wrappedlibxi:
   - XGrabDevice
 wrappedlibxrandr:
 - vFp:
+  - XRRFreeMonitors
   - XRRFreeProviderInfo
   - XRRFreeProviderResources
 - iFp:
@@ -3281,6 +3283,8 @@ wrappedlibxrandr:
   - XRRGetProviderInfo
 - iFXpLp:
   - XRRSetPanning
+- pFXLip:
+  - XRRGetMonitors
 - iFXpLLiiLWpi:
   - XRRSetCrtcConfig
 wrappedlibxrender:
diff --git a/src/wrapped32/generated/wrappedlibxrandrtypes32.h b/src/wrapped32/generated/wrappedlibxrandrtypes32.h
index efaa1d1d..f17bd9d9 100644
--- a/src/wrapped32/generated/wrappedlibxrandrtypes32.h
+++ b/src/wrapped32/generated/wrappedlibxrandrtypes32.h
@@ -19,9 +19,11 @@ typedef void* (*pFXLL_t)(void*, uintptr_t, uintptr_t);
 typedef void* (*pFXLp_t)(void*, uintptr_t, void*);
 typedef void* (*pFXpL_t)(void*, void*, uintptr_t);
 typedef int32_t (*iFXpLp_t)(void*, void*, uintptr_t, void*);
+typedef void* (*pFXLip_t)(void*, uintptr_t, int32_t, void*);
 typedef int32_t (*iFXpLLiiLWpi_t)(void*, void*, uintptr_t, uintptr_t, int32_t, int32_t, uintptr_t, uint16_t, void*, int32_t);
 
 #define SUPER() ADDED_FUNCTIONS() \
+	GO(XRRFreeMonitors, vFp_t) \
 	GO(XRRFreeProviderInfo, vFp_t) \
 	GO(XRRFreeProviderResources, vFp_t) \
 	GO(XRRUpdateConfiguration, iFp_t) \
@@ -36,6 +38,7 @@ typedef int32_t (*iFXpLLiiLWpi_t)(void*, void*, uintptr_t, uintptr_t, int32_t, i
 	GO(XRRGetPanning, pFXpL_t) \
 	GO(XRRGetProviderInfo, pFXpL_t) \
 	GO(XRRSetPanning, iFXpLp_t) \
+	GO(XRRGetMonitors, pFXLip_t) \
 	GO(XRRSetCrtcConfig, iFXpLLiiLWpi_t)
 
 #endif // __wrappedlibxrandrTYPES32_H_
diff --git a/src/wrapped32/generated/wrapper32.c b/src/wrapped32/generated/wrapper32.c
index 0139b26b..96413f89 100644
--- a/src/wrapped32/generated/wrapper32.c
+++ b/src/wrapped32/generated/wrapper32.c
@@ -1600,6 +1600,7 @@ typedef void* (*pFEpnup_t)(x64emu_t*, void*, void*, uint32_t, void*);
 typedef void* (*pFEXipp_t)(x64emu_t*, void*, int32_t, void*, void*);
 typedef void* (*pFEXCip_t)(x64emu_t*, void*, uint8_t, int32_t, void*);
 typedef void* (*pFEXlpp_t)(x64emu_t*, void*, intptr_t, void*, void*);
+typedef void* (*pFEXLip_t)(x64emu_t*, void*, uintptr_t, int32_t, void*);
 typedef void* (*pFEXpip_t)(x64emu_t*, void*, void*, int32_t, void*);
 typedef void* (*pFEXppi_t)(x64emu_t*, void*, void*, void*, int32_t);
 typedef void* (*pFuiupp_t)(uint32_t, int32_t, uint32_t, void*, void*);
@@ -3769,6 +3770,7 @@ void pFEpnup_32(x64emu_t *emu, uintptr_t fcn) { pFEpnup_t fn = (pFEpnup_t)fcn; v
 void pFEXipp_32(x64emu_t *emu, uintptr_t fcn) { pFEXipp_t fn = (pFEXipp_t)fcn; R_EAX = to_ptrv(fn(emu, getDisplay(from_ptriv(R_ESP + 4)), from_ptri(int32_t, R_ESP + 8), from_ptriv(R_ESP + 12), from_ptriv(R_ESP + 16))); }
 void pFEXCip_32(x64emu_t *emu, uintptr_t fcn) { pFEXCip_t fn = (pFEXCip_t)fcn; R_EAX = to_ptrv(fn(emu, getDisplay(from_ptriv(R_ESP + 4)), from_ptri(uint8_t, R_ESP + 8), from_ptri(int32_t, R_ESP + 12), from_ptriv(R_ESP + 16))); }
 void pFEXlpp_32(x64emu_t *emu, uintptr_t fcn) { pFEXlpp_t fn = (pFEXlpp_t)fcn; R_EAX = to_ptrv(fn(emu, getDisplay(from_ptriv(R_ESP + 4)), from_long(from_ptri(long_t, R_ESP + 8)), from_ptriv(R_ESP + 12), from_ptriv(R_ESP + 16))); }
+void pFEXLip_32(x64emu_t *emu, uintptr_t fcn) { pFEXLip_t fn = (pFEXLip_t)fcn; R_EAX = to_ptrv(fn(emu, getDisplay(from_ptriv(R_ESP + 4)), from_ulong(from_ptri(ulong_t, R_ESP + 8)), from_ptri(int32_t, R_ESP + 12), from_ptriv(R_ESP + 16))); }
 void pFEXpip_32(x64emu_t *emu, uintptr_t fcn) { pFEXpip_t fn = (pFEXpip_t)fcn; R_EAX = to_ptrv(fn(emu, getDisplay(from_ptriv(R_ESP + 4)), from_ptriv(R_ESP + 8), from_ptri(int32_t, R_ESP + 12), from_ptriv(R_ESP + 16))); }
 void pFEXppi_32(x64emu_t *emu, uintptr_t fcn) { pFEXppi_t fn = (pFEXppi_t)fcn; R_EAX = to_ptrv(fn(emu, getDisplay(from_ptriv(R_ESP + 4)), from_ptriv(R_ESP + 8), from_ptriv(R_ESP + 12), from_ptri(int32_t, R_ESP + 16))); }
 void pFuiupp_32(x64emu_t *emu, uintptr_t fcn) { pFuiupp_t fn = (pFuiupp_t)fcn; R_EAX = to_ptrv(fn(from_ptri(uint32_t, R_ESP + 4), from_ptri(int32_t, R_ESP + 8), from_ptri(uint32_t, R_ESP + 12), from_ptriv(R_ESP + 16), from_ptriv(R_ESP + 20))); }
diff --git a/src/wrapped32/generated/wrapper32.h b/src/wrapped32/generated/wrapper32.h
index 59e28768..40fe80a0 100644
--- a/src/wrapped32/generated/wrapper32.h
+++ b/src/wrapped32/generated/wrapper32.h
@@ -1547,6 +1547,7 @@ void pFEpnup_32(x64emu_t *emu, uintptr_t fnc);
 void pFEXipp_32(x64emu_t *emu, uintptr_t fnc);
 void pFEXCip_32(x64emu_t *emu, uintptr_t fnc);
 void pFEXlpp_32(x64emu_t *emu, uintptr_t fnc);
+void pFEXLip_32(x64emu_t *emu, uintptr_t fnc);
 void pFEXpip_32(x64emu_t *emu, uintptr_t fnc);
 void pFEXppi_32(x64emu_t *emu, uintptr_t fnc);
 void pFuiupp_32(x64emu_t *emu, uintptr_t fnc);
diff --git a/src/wrapped32/wrappedlibxrandr.c b/src/wrapped32/wrappedlibxrandr.c
index 80079554..dfc60b56 100644
--- a/src/wrapped32/wrappedlibxrandr.c
+++ b/src/wrapped32/wrappedlibxrandr.c
@@ -166,6 +166,20 @@ EXPORT int my32_XRRUpdateConfiguration(x64emu_t* emu, my_XEvent_32_t* evt)
     return my->XRRUpdateConfiguration(&evt_l);
 }
 
+EXPORT void* my32_XRRGetMonitors(x64emu_t* emu, void* dpy, XID window, int get_active, int* nmonitors)
+{
+    void* ret = my->XRRGetMonitors(dpy, window, get_active, nmonitors);
+    return inplace_XRRMonitorInfo_shrink(ret, *nmonitors);
+}
+
+EXPORT void my32_XRRFreeMonitors(x64emu_t* emu, void* monitors)
+{
+    if(!monitors) return;
+    int n = 0;
+    while(((my_XRRMonitorInfo_32_t*)monitors)[n].name) ++n;
+    my->XRRFreeMonitors(inplace_XRRMonitorInfo_enlarge(monitors, n));
+}
+
 #ifdef ANDROID
 #define NEEDED_LIBS "libX11.so", "libXext.so", "libXrender.so"
 #else
diff --git a/src/wrapped32/wrappedlibxrandr_private.h b/src/wrapped32/wrappedlibxrandr_private.h
index a2611c5c..925cdf66 100644
--- a/src/wrapped32/wrappedlibxrandr_private.h
+++ b/src/wrapped32/wrappedlibxrandr_private.h
@@ -68,6 +68,6 @@ GO(XRRDeleteOutputMode, vFXLL)
 GOM(XRRGetOutputInfo, pFEXpL)
 GO(XRRConfigureProviderProperty, vFXLLiiibl_)
 //GO(XRRAllocateMonitor, bLiiiiiiiiibL__FXi)
-//GO(XRRGetMonitors, bLiiiiiiiiibL__FXLip)
+GOM(XRRGetMonitors, pFEXLip)
 //GO(XRRSetMonitor, vFXLbLiiiiiiiiibL__)
-//GO(XRRFreeMonitors, vFbLiiiiiiiiibL__)
+GOM(XRRFreeMonitors, vFEp)