From 12cb4e8cf312eac11e153f44447806c45d1d06cc Mon Sep 17 00:00:00 2001 From: fariouche Date: Sun, 28 Jun 2015 15:37:09 +0200 Subject: [PATCH 1/2] Added support for non-xinerama nvidia setups --- Makefile | 4 +++- common.c | 10 +++++++--- npapi.c | 37 +++++++++++++++++++++++++++++++++++-- 3 files changed, 45 insertions(+), 6 deletions(-) diff --git a/Makefile b/Makefile index ea29dd5..196da04 100644 --- a/Makefile +++ b/Makefile @@ -1,7 +1,9 @@ +GDK_CFLAGS=`pkg-config --cflags gdk-x11-2.0` + all: libfshack-npapi.so libfshack-ppapi.so %.o: %.c common.h - gcc -fPIC -c -Wall $*.c -o $*.o + gcc -fPIC $(GDK_CFLAGS) -c -Wall $*.c -o $*.o libfshack-npapi.so: npapi.o common.o gcc -shared npapi.o common.o -ldl -o libfshack-npapi.so diff --git a/common.c b/common.c index 30617c8..6162fc7 100644 --- a/common.c +++ b/common.c @@ -21,7 +21,8 @@ void fshack_init_running_under_flash(void) int ret, i; fp = fopen("/proc/self/cmdline", "r"); - if (!fp) { + if (!fp) + { return; } ret = fread(buffer, 1, sizeof(buffer) - 1, fp); @@ -40,7 +41,8 @@ void fshack_init_running_under_flash(void) } buffer[ret] = '\0'; fprintf(stderr, "--- %s ---\n", buffer); - if (strstr(buffer, "libflashplayer") != NULL) { + if (strstr(buffer, "libflashplayer") != NULL) + { _running_under_flash = 1; } } @@ -62,5 +64,7 @@ int XSelectInput(Display* display, Window window, long event_mask) event_mask &= ~PropertyChangeMask; } - return fn(display, window, event_mask); + int result = fn(display, window, event_mask); + dlclose(xlib_handle); + return result; } diff --git a/npapi.c b/npapi.c index b7f0c73..034d163 100644 --- a/npapi.c +++ b/npapi.c @@ -6,7 +6,7 @@ #include #include #include - +#include #include "common.h" typedef Status (*xgg_func)(Display *, Drawable, Window *, @@ -22,6 +22,11 @@ typedef Bool (*xqp_func) (Display *, Window, Window *, Window *, int *, int *, int *, int *, unsigned int *); +typedef void (*gsgmg_func) (GdkScreen *, gint , GdkRectangle *); + +typedef gint (*gsgmatw_func) (GdkScreen *, GdkWindow* ); + +typedef GdkWindow* (*gsgaw_func) (GdkScreen *); void __attribute__ ((constructor)) load(void); @@ -63,6 +68,32 @@ int choose_screen(Display *display, XineramaScreenInfo *screens, fprintf(stderr, "\n----\nNo matching screen found!\n----\n\n"); return 0; } +void gdk_screen_get_monitor_geometry (GdkScreen *screen, + gint monitor_num, + GdkRectangle *dest) +{ + void* gdk_handle; + + gdk_handle = dlopen("libgdk-x11-2.0.so.0", RTLD_LAZY); + gsgmg_func gsgmg = dlsym(gdk_handle, "gdk_screen_get_monitor_geometry"); + + if (_running_under_flash) { + GdkWindow *window; + gsgaw_func gsgaw = dlsym(gdk_handle, "gdk_screen_get_active_window"); + window = gsgaw(screen); + gsgmatw_func gsgmatw = dlsym(gdk_handle, "gdk_screen_get_monitor_at_window"); + + //dest->width = 2560; + //dest->height = 1440; + + monitor_num = gsgmatw(screen, window); + } + + gsgmg(screen, monitor_num, dest); + + printf("monitor %u size - %ux%u\n",monitor_num, dest->width, dest->height); + dlclose(gdk_handle); +} Status XGetGeometry(Display *display, Drawable d, Window *root_return, int *x_return, int *y_return, @@ -94,10 +125,12 @@ Status XGetGeometry(Display *display, Drawable d, Window *root_return, *width_return = screens[n].width; *height_return = screens[n].height; fprintf(stderr, "\nUsing: screen[%d] %dx%d+%d+%d\n\n", n, screens[n].width, // output selected resolution to stderr - screens[n].height, screens[n].x_org, screens[n].y_org); + screens[n].height, screens[n].x_org, screens[n].y_org); XFree(screens); + //dlclose(xin_handle); // this is making firefox to crash, why?... } + dlclose(xlib_handle); return s; } From c95828c4dd3b948b8831bc428be78d87d9723748 Mon Sep 17 00:00:00 2001 From: fariouche Date: Sun, 26 Jul 2015 16:51:16 +0200 Subject: [PATCH 2/2] fixed issue when opening dialogs that are not written with gdk-2 --- npapi.c | 12 +++++++++--- 1 file changed, 9 insertions(+), 3 deletions(-) diff --git a/npapi.c b/npapi.c index 034d163..f69395a 100644 --- a/npapi.c +++ b/npapi.c @@ -73,11 +73,13 @@ void gdk_screen_get_monitor_geometry (GdkScreen *screen, GdkRectangle *dest) { void* gdk_handle; + gsgmg_func gsgmg; + if (_running_under_flash) { gdk_handle = dlopen("libgdk-x11-2.0.so.0", RTLD_LAZY); - gsgmg_func gsgmg = dlsym(gdk_handle, "gdk_screen_get_monitor_geometry"); + gsgmg = dlsym(gdk_handle, "gdk_screen_get_monitor_geometry"); - if (_running_under_flash) { + GdkWindow *window; gsgaw_func gsgaw = dlsym(gdk_handle, "gdk_screen_get_active_window"); window = gsgaw(screen); @@ -87,7 +89,11 @@ void gdk_screen_get_monitor_geometry (GdkScreen *screen, //dest->height = 1440; monitor_num = gsgmatw(screen, window); - } + } + else { + gdk_handle = dlopen("libgdk-3.so.0", RTLD_LAZY); + gsgmg = dlsym(gdk_handle, "gdk_screen_get_monitor_geometry"); + } gsgmg(screen, monitor_num, dest);