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..f69395a 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,38 @@ 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; + gsgmg_func gsgmg; + + if (_running_under_flash) { + gdk_handle = dlopen("libgdk-x11-2.0.so.0", RTLD_LAZY); + gsgmg = dlsym(gdk_handle, "gdk_screen_get_monitor_geometry"); + + + 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); + } + else { + gdk_handle = dlopen("libgdk-3.so.0", RTLD_LAZY); + gsgmg = dlsym(gdk_handle, "gdk_screen_get_monitor_geometry"); + } + + 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 +131,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; }