--- rdesktop/configure.ac +++ rdesktop/configure.ac @@ -30,6 +30,8 @@ AC_SEARCH_LIBS(socket, socket) AC_SEARCH_LIBS(inet_aton, resolv) +AC_CHECK_LIB(Xinerama, XineramaQueryScreens, AC_DEFINE(HAVE_XINERAMA) LIBS="$LIBS -lXinerama", [], []) + AC_CHECK_HEADER(sys/select.h, AC_DEFINE(HAVE_SYS_SELECT_H)) AC_CHECK_HEADER(sys/modem.h, AC_DEFINE(HAVE_SYS_MODEM_H)) AC_CHECK_HEADER(sys/filio.h, AC_DEFINE(HAVE_SYS_FILIO_H)) --- rdesktop/xwin.c +++ rdesktop/xwin.c @@ -31,6 +31,9 @@ #ifdef HAVE_XRANDR #include #endif +#ifdef HAVE_XINERAMA +#include +#endif extern int g_sizeopt; extern int g_width; @@ -816,6 +819,66 @@ #define LOUT24(o, x) { *(o++) = x; *(o++) = x >> 8; *(o++) = x >> 16; } #define LOUT32(o, x) { *(o++) = x; *(o++) = x >> 8; *(o++) = x >> 16; *(o++) = x >> 24; } +#ifdef HAVE_XINERAMA +void +ScreenSize(XRectangle *screen) +{ + int screens; + int event_base; + int error_base; + int x, y, i, __unused_int; + unsigned int __unused_uint; + Window __unused_win; + + if ((XineramaQueryExtension(g_display, &event_base, &error_base)) && (XineramaIsActive(g_display))) + { + XineramaScreenInfo *screeninfo; + + /* getting current cursor position */ + XQueryPointer(g_display, RootWindowOfScreen(g_screen), &__unused_win, &__unused_win, &x, &y, &__unused_int, &__unused_int, &__unused_uint); + + /* Get the Xinerama screen infomation */ + screeninfo = XineramaQueryScreens(g_display, &screens); + + /* Search for the appropriate screen */ + i = 0; + while (! (screeninfo[i].x_org <= x + && screeninfo[i].y_org <= y + && screeninfo[i].x_org + screeninfo[i].width >= x + && screeninfo[i].y_org + screeninfo[i].height >= y )) + i++; + if (i >= screens) + i = 0; + + /* Position according to the present screen */ + screen->x = screeninfo[i].x_org; + screen->y = screeninfo[i].y_org; + screen->width = screeninfo[i].width; + screen->height = screeninfo[i].height; + + /* Free allocated memory */ + XFree(screeninfo); + } + else + { + /* Xinerama is not in use, default to the XLib screensize call. */ + screen->x = 0; + screen->y = 0; + screen->width = WidthOfScreen(g_screen); + screen->height = HeightOfScreen(g_screen); + } +} +#else +void +ScreenSize(XRectangle *screen) +{ + screen->x = 0; + screen->y = 0; + screen->width = WidthOfScreen(g_screen); + screen->height = HeightOfScreen(g_screen); +} +#endif + static uint32 translate_colour(uint32 colour) { @@ -1912,17 +1975,26 @@ */ if (g_fullscreen) { - g_width = WidthOfScreen(g_screen); - g_height = HeightOfScreen(g_screen); + XRectangle screen; + ScreenSize(&screen); + + g_width = screen.width; + g_height = screen.height; g_using_full_workarea = True; } else if (g_sizeopt < 0) { + XRectangle screen; + ScreenSize(&screen); + + g_width = screen.width; + g_height = screen.height; + /* Percent of screen */ if (-g_sizeopt >= 100) g_using_full_workarea = True; - g_height = HeightOfScreen(g_screen) * (-g_sizeopt) / 100; - g_width = WidthOfScreen(g_screen) * (-g_sizeopt) / 100; + g_width = screen.width * (-g_width) / 100; + g_height = screen.height * (-g_width) / 100; } else if (g_sizeopt == 1) { @@ -2005,14 +2077,19 @@ long input_mask, ic_input_mask; XEvent xevent; - wndwidth = g_fullscreen ? WidthOfScreen(g_screen) : g_width; - wndheight = g_fullscreen ? HeightOfScreen(g_screen) : g_height; + XRectangle screen; + ScreenSize(&screen); + wndwidth = g_fullscreen ? screen.width : g_width; + wndheight = g_fullscreen ? screen.height : g_height; + g_xpos = g_fullscreen ? screen.x : g_xpos; + g_ypos = g_fullscreen ? screen.y : g_ypos; + /* Handle -x-y portion of geometry string */ if (g_xpos < 0 || (g_xpos == 0 && (g_pos & 2))) - g_xpos = WidthOfScreen(g_screen) + g_xpos - g_width; + g_xpos = screen.width + g_xpos - g_width; if (g_ypos < 0 || (g_ypos == 0 && (g_pos & 4))) - g_ypos = HeightOfScreen(g_screen) + g_ypos - g_height; + g_ypos = screen.height + g_ypos - g_height; get_window_attribs(&attribs);