]>
Commit | Line | Data |
---|---|---|
e3229496 | 1 | --- configure.ac.orig 2008-06-25 23:22:27.000000000 +0200 |
2 | +++ configure.ac 2008-06-25 23:17:51.000000000 +0200 | |
3 | @@ -18,6 +18,8 @@ | |
4 | AC_SEARCH_LIBS(socket, socket) | |
5 | AC_SEARCH_LIBS(inet_aton, resolv) | |
6 | ||
7 | +AC_CHECK_LIB(Xinerama, XineramaQueryScreens, AC_DEFINE(HAVE_XINERAMA) LIBS="$LIBS -lXinerama", [], []) | |
8 | + | |
9 | AC_CHECK_HEADER(sys/select.h, AC_DEFINE(HAVE_SYS_SELECT_H)) | |
10 | AC_CHECK_HEADER(sys/modem.h, AC_DEFINE(HAVE_SYS_MODEM_H)) | |
11 | AC_CHECK_HEADER(sys/filio.h, AC_DEFINE(HAVE_SYS_FILIO_H)) | |
12 | --- xwin.c.orig 2008-06-25 23:50:02.000000000 +0200 | |
13 | +++ xwin.c 2008-06-25 23:49:25.000000000 +0200 | |
14 | @@ -21,6 +21,9 @@ | |
15 | ||
16 | #include <X11/Xlib.h> | |
17 | #include <X11/Xutil.h> | |
18 | +#ifdef HAVE_XINERAMA | |
19 | + #include <X11/extensions/Xinerama.h> | |
20 | +#endif | |
21 | #include <X11/Xproto.h> | |
22 | #include <unistd.h> | |
23 | #include <sys/time.h> | |
24 | @@ -570,6 +573,71 @@ | |
25 | #define LOUT24(o, x) { *(o++) = x; *(o++) = x >> 8; *(o++) = x >> 16; } | |
26 | #define LOUT32(o, x) { *(o++) = x; *(o++) = x >> 8; *(o++) = x >> 16; *(o++) = x >> 24; } | |
27 | ||
28 | +#ifdef HAVE_XINERAMA | |
29 | +// IF XINERAMA LIBRARY | |
30 | + | |
31 | +int g_last_wnd_pos_x; | |
32 | +int g_last_wnd_pos_y; | |
33 | + | |
34 | +void | |
35 | +ScreenSize(XRectangle *screen) | |
36 | +{ | |
37 | + int screens; | |
38 | + int event_base; | |
39 | + int error_base; | |
40 | + | |
41 | + if (XineramaQueryExtension(g_display, &event_base, &error_base)) | |
42 | + { | |
43 | + XineramaScreenInfo *screeninfo; | |
44 | + int i; | |
45 | + | |
46 | + /* Get the Xinerama screen infomation. */ | |
47 | + screeninfo = XineramaQueryScreens(g_display, &screens); | |
48 | + | |
49 | + /* Search for the appropriate screen. */ | |
50 | + i = 0; | |
51 | + while (!(screeninfo[i].x_org <= g_last_wnd_pos_x | |
52 | + && screeninfo[i].y_org <= g_last_wnd_pos_y | |
53 | + && screeninfo[i].x_org + screeninfo[i].width >= g_last_wnd_pos_x | |
54 | + && screeninfo[i].y_org + screeninfo[i].height >= g_last_wnd_pos_y )) | |
55 | + { | |
56 | + i++; | |
57 | + } | |
58 | + if (i >= screens) i = 0; | |
59 | + | |
60 | + /* Position according to the present screen. */ | |
61 | + screen->x = screeninfo[i].x_org; | |
62 | + screen->y = screeninfo[i].y_org; | |
63 | + screen->width = screeninfo[i].width; | |
64 | + screen->height = screeninfo[i].height; | |
65 | + | |
66 | + /* Free allocated memory. */ | |
67 | + XFree(screeninfo); | |
68 | + } | |
69 | + else | |
70 | + { | |
71 | + /* Xinerama is not in use, default to the XLib screensize call. */ | |
72 | + screen->x = 0; | |
73 | + screen->y = 0; | |
74 | + screen->width = WidthOfScreen(g_screen); | |
75 | + screen->height = HeightOfScreen(g_screen); | |
76 | + } | |
77 | +} | |
78 | + | |
79 | +#else | |
80 | +// IF NO XINERAMA LIBRARY | |
81 | + | |
82 | +void | |
83 | +ScreenSize(XRectangle *screen) | |
84 | +{ | |
85 | + screen->x = 0; | |
86 | + screen->y = 0; | |
87 | + screen->width = WidthOfScreen(g_screen); | |
88 | + screen->height = HeightOfScreen(g_screen); | |
89 | +} | |
90 | + | |
91 | +#endif | |
92 | + | |
93 | static uint32 | |
94 | translate_colour(uint32 colour) | |
95 | { | |
96 | @@ -1615,17 +1683,26 @@ | |
97 | */ | |
98 | if (g_fullscreen) | |
99 | { | |
100 | - g_width = WidthOfScreen(g_screen); | |
101 | - g_height = HeightOfScreen(g_screen); | |
102 | + XRectangle screen; | |
103 | + ScreenSize(&screen); | |
104 | + | |
105 | + g_width = screen.width; | |
106 | + g_height = screen.height; | |
107 | g_using_full_workarea = True; | |
108 | } | |
109 | else if (g_width < 0) | |
110 | { | |
111 | + XRectangle screen; | |
112 | + ScreenSize(&screen); | |
113 | + | |
114 | + g_width = screen.width; | |
115 | + g_height = screen.height; | |
116 | + | |
117 | /* Percent of screen */ | |
118 | if (-g_width >= 100) | |
119 | g_using_full_workarea = True; | |
120 | - g_height = HeightOfScreen(g_screen) * (-g_width) / 100; | |
121 | - g_width = WidthOfScreen(g_screen) * (-g_width) / 100; | |
122 | + g_width = screen.width * (-g_width) / 100; | |
123 | + g_height = screen.height * (-g_width) / 100; | |
124 | } | |
125 | else if (g_width == 0) | |
126 | { | |
127 | @@ -1734,14 +1811,19 @@ | |
128 | long input_mask, ic_input_mask; | |
129 | XEvent xevent; | |
130 | ||
131 | - wndwidth = g_fullscreen ? WidthOfScreen(g_screen) : g_width; | |
132 | - wndheight = g_fullscreen ? HeightOfScreen(g_screen) : g_height; | |
133 | + XRectangle screen; | |
134 | + | |
135 | + ScreenSize(&screen); | |
136 | + wndwidth = g_fullscreen ? screen.width : g_width; | |
137 | + wndheight = g_fullscreen ? screen.height : g_height; | |
138 | + g_xpos = g_fullscreen ? screen.x : g_xpos; | |
139 | + g_ypos = g_fullscreen ? screen.y : g_ypos; | |
140 | ||
141 | /* Handle -x-y portion of geometry string */ | |
142 | if (g_xpos < 0 || (g_xpos == 0 && (g_pos & 2))) | |
143 | - g_xpos = WidthOfScreen(g_screen) + g_xpos - g_width; | |
144 | + g_xpos = screen.width + g_xpos - g_width; | |
145 | if (g_ypos < 0 || (g_ypos == 0 && (g_pos & 4))) | |
146 | - g_ypos = HeightOfScreen(g_screen) + g_ypos - g_height; | |
147 | + g_ypos = screen.height + g_ypos - g_height; | |
148 | ||
149 | get_window_attribs(&attribs); | |
150 | ||
151 | @@ -1882,6 +1964,11 @@ | |
152 | void | |
153 | xwin_toggle_fullscreen(void) | |
154 | { | |
155 | +#ifdef HAVE_XINERAMA | |
156 | + Window root, parent, *children; | |
157 | + unsigned int nchildren; | |
158 | + XWindowAttributes win_attrib; | |
159 | +#endif | |
160 | Pixmap contents = 0; | |
161 | ||
162 | if (g_seamless_active) | |
163 | @@ -1895,6 +1982,17 @@ | |
164 | XCopyArea(g_display, g_wnd, contents, g_gc, 0, 0, g_width, g_height, 0, 0); | |
165 | } | |
166 | ||
167 | +#ifdef HAVE_XINERAMA | |
168 | + /* Determine the parent window. */ | |
169 | + XQueryTree(g_display, g_wnd, &root, &parent, &children, &nchildren); | |
170 | + if (children != NULL) XFree(children); | |
171 | + | |
172 | + /* Find the present coordinates of the window. */ | |
173 | + XGetWindowAttributes(g_display, parent, &win_attrib); | |
174 | + g_last_wnd_pos_x = win_attrib.x + 1; | |
175 | + g_last_wnd_pos_y = win_attrib.y + 1; | |
176 | +#endif | |
177 | + | |
178 | ui_destroy_window(); | |
179 | g_fullscreen = !g_fullscreen; | |
180 | ui_create_window(); |