Mercurial > mplayer.hg
comparison Gui/wm/ws.c @ 10194:2608bf0037b6
From: Ben Low <ben@bdlow.net>
[PATCH] xineramascreen for gmplayer (the right way)
author | pontscho |
---|---|
date | Mon, 26 May 2003 08:45:43 +0000 |
parents | 2f9e8ff57e9e |
children | 35f52ad860a0 |
comparison
equal
deleted
inserted
replaced
10193:f0bcaf5ea675 | 10194:2608bf0037b6 |
---|---|
31 #include <X11/extensions/XShm.h> | 31 #include <X11/extensions/XShm.h> |
32 #ifdef HAVE_XSHAPE | 32 #ifdef HAVE_XSHAPE |
33 #include <X11/extensions/shape.h> | 33 #include <X11/extensions/shape.h> |
34 #endif | 34 #endif |
35 | 35 |
36 #ifdef HAVE_XINERAMA | |
37 #include <X11/extensions/Xinerama.h> | |
38 #endif | |
39 | |
36 #include <sys/ipc.h> | 40 #include <sys/ipc.h> |
37 #include <sys/shm.h> | 41 #include <sys/shm.h> |
38 | 42 |
39 #undef ENABLE_DPMS | 43 #undef ENABLE_DPMS |
44 | |
45 #ifdef HAVE_XINERAMA | |
46 extern int xinerama_screen; | |
47 #endif | |
40 | 48 |
41 typedef struct | 49 typedef struct |
42 { | 50 { |
43 unsigned long flags; | 51 unsigned long flags; |
44 unsigned long functions; | 52 unsigned long functions; |
49 | 57 |
50 Atom wsMotifHints; | 58 Atom wsMotifHints; |
51 | 59 |
52 int wsMaxX = 0; // Screen width. | 60 int wsMaxX = 0; // Screen width. |
53 int wsMaxY = 0; // Screen height. | 61 int wsMaxY = 0; // Screen height. |
62 int wsOrgX = 0; // Screen origin x. | |
63 int wsOrgY = 0; // Screen origin y. | |
54 | 64 |
55 Display * wsDisplay; | 65 Display * wsDisplay; |
56 int wsScreen; | 66 int wsScreen; |
57 Window wsRootWin; | 67 Window wsRootWin; |
58 XEvent wsEvent; | 68 XEvent wsEvent; |
225 | 235 |
226 XSynchronize( wsDisplay,True ); | 236 XSynchronize( wsDisplay,True ); |
227 | 237 |
228 wsScreen=DefaultScreen( wsDisplay ); | 238 wsScreen=DefaultScreen( wsDisplay ); |
229 wsRootWin=RootWindow( wsDisplay,wsScreen ); | 239 wsRootWin=RootWindow( wsDisplay,wsScreen ); |
240 #ifdef HAVE_XINERAMA | |
241 if(XineramaIsActive(wsDisplay)) | |
242 { | |
243 XineramaScreenInfo *screens; | |
244 int num_screens; | |
245 | |
246 screens = XineramaQueryScreens(wsDisplay, &num_screens); | |
247 if(xinerama_screen >= num_screens) xinerama_screen = 0; | |
248 wsOrgX = screens[xinerama_screen].x_org; | |
249 wsOrgY = screens[xinerama_screen].y_org; | |
250 wsMaxX=screens[xinerama_screen].width; | |
251 wsMaxY=screens[xinerama_screen].height; | |
252 mp_msg( MSGT_GPLAYER,MSGL_STATUS,"[ws] screens %d Max %d, %d Org %d,%d\n", | |
253 num_screens, wsMaxX, wsMaxY, wsOrgX, wsOrgY); | |
254 XFree(screens); | |
255 } | |
256 else | |
257 #endif | |
258 { | |
259 wsOrgX = wsOrgY = 0; | |
230 wsMaxX=DisplayWidth( wsDisplay,wsScreen ); | 260 wsMaxX=DisplayWidth( wsDisplay,wsScreen ); |
231 wsMaxY=DisplayHeight( wsDisplay,wsScreen ); | 261 wsMaxY=DisplayHeight( wsDisplay,wsScreen ); |
262 } | |
232 | 263 |
233 wsGetDepthOnScreen(); | 264 wsGetDepthOnScreen(); |
234 #ifdef DEBUG | 265 #ifdef DEBUG |
235 { | 266 { |
236 int minor,major,shp; | 267 int minor,major,shp; |
237 mp_msg( MSGT_GPLAYER,MSGL_DBG2,"[ws] Screen depth: %d\n",wsDepthOnScreen ); | 268 mp_msg( MSGT_GPLAYER,MSGL_DBG2,"[ws] Screen depth: %d\n",wsDepthOnScreen ); |
238 mp_msg( MSGT_GPLAYER,MSGL_DBG2,"[ws] size: %dx%d\n",wsMaxX,wsMaxY ); | 269 mp_msg( MSGT_GPLAYER,MSGL_DBG2,"[ws] size: %dx%d\n",wsMaxX,wsMaxY ); |
270 #ifdef HAVE_XINERAMA | |
271 mp_msg( MSGT_GPLAYER,MSGL_DBG2,"[ws] origin: +%d+%d\n",wsOrgX,wsOrgY ); | |
272 #endif | |
239 mp_msg( MSGT_GPLAYER,MSGL_DBG2,"[ws] red mask: 0x%x\n",wsRedMask ); | 273 mp_msg( MSGT_GPLAYER,MSGL_DBG2,"[ws] red mask: 0x%x\n",wsRedMask ); |
240 mp_msg( MSGT_GPLAYER,MSGL_DBG2,"[ws] green mask: 0x%x\n",wsGreenMask ); | 274 mp_msg( MSGT_GPLAYER,MSGL_DBG2,"[ws] green mask: 0x%x\n",wsGreenMask ); |
241 mp_msg( MSGT_GPLAYER,MSGL_DBG2,"[ws] blue mask: 0x%x\n",wsBlueMask ); | 275 mp_msg( MSGT_GPLAYER,MSGL_DBG2,"[ws] blue mask: 0x%x\n",wsBlueMask ); |
242 if ( wsUseXShm ) | 276 if ( wsUseXShm ) |
243 { | 277 { |
316 if ( D & wsShowFrame ) win->Decorations=1; | 350 if ( D & wsShowFrame ) win->Decorations=1; |
317 wsHGC=DefaultGC( wsDisplay,wsScreen ); | 351 wsHGC=DefaultGC( wsDisplay,wsScreen ); |
318 // The window position and size. | 352 // The window position and size. |
319 switch ( X ) | 353 switch ( X ) |
320 { | 354 { |
321 case -1: win->X=( wsMaxX / 2 ) - ( wX / 2 ); break; | 355 case -1: win->X=( wsMaxX / 2 ) - ( wX / 2 ) + wsOrgX; break; |
322 case -2: win->X=wsMaxX - wX - 1; break; | 356 case -2: win->X=wsMaxX - wX - 1 + wsOrgX; break; |
323 default: win->X=X; break; | 357 default: win->X=X; break; |
324 } | 358 } |
325 switch ( Y ) | 359 switch ( Y ) |
326 { | 360 { |
327 case -1: win->Y=( wsMaxY / 2 ) - ( hY / 2 ); break; | 361 case -1: win->Y=( wsMaxY / 2 ) - ( hY / 2 ) + wsOrgY; break; |
328 case -2: win->Y=wsMaxY - hY - 1; break; | 362 case -2: win->Y=wsMaxY - hY - 1 + wsOrgY; break; |
329 default: win->Y=Y; break; | 363 default: win->Y=Y; break; |
330 } | 364 } |
331 win->Width=wX; | 365 win->Width=wX; |
332 win->Height=hY; | 366 win->Height=hY; |
333 win->OldX=win->X; | 367 win->OldX=win->X; |
738 } | 772 } |
739 else | 773 else |
740 { | 774 { |
741 win->OldX=win->X; win->OldY=win->Y; | 775 win->OldX=win->X; win->OldY=win->Y; |
742 win->OldWidth=win->Width; win->OldHeight=win->Height; | 776 win->OldWidth=win->Width; win->OldHeight=win->Height; |
743 win->X=0; win->Y=0; | 777 win->X=wsOrgX; win->Y=wsOrgY; |
744 win->Width=wsMaxX; win->Height=wsMaxY; | 778 win->Width=wsMaxX; win->Height=wsMaxY; |
745 win->isFullScreen=True; | 779 win->isFullScreen=True; |
746 #ifdef ENABLE_DPMS | 780 #ifdef ENABLE_DPMS |
747 wsScreenSaverOff( wsDisplay ); | 781 wsScreenSaverOff( wsDisplay ); |
748 #endif | 782 #endif |
809 { | 843 { |
810 if ( b ) | 844 if ( b ) |
811 { | 845 { |
812 switch ( x ) | 846 switch ( x ) |
813 { | 847 { |
814 case -1: win->X=( wsMaxX / 2 ) - ( win->Width / 2 ); break; | 848 case -1: win->X=( wsMaxX / 2 ) - ( win->Width / 2 ) + wsOrgX; break; |
815 case -2: win->X=wsMaxX - win->Width; break; | 849 case -2: win->X=wsMaxX - win->Width + wsOrgX; break; |
816 default: win->X=x; break; | 850 default: win->X=x; break; |
817 } | 851 } |
818 switch ( y ) | 852 switch ( y ) |
819 { | 853 { |
820 case -1: win->Y=( wsMaxY / 2 ) - ( win->Height / 2 ); break; | 854 case -1: win->Y=( wsMaxY / 2 ) - ( win->Height / 2 ) + wsOrgY; break; |
821 case -2: win->Y=wsMaxY - win->Height; break; | 855 case -2: win->Y=wsMaxY - win->Height + wsOrgY; break; |
822 default: win->Y=y; break; | 856 default: win->Y=y; break; |
823 } | 857 } |
824 } | 858 } |
825 else { win->X=x; win->Y=y; } | 859 else { win->X=x; win->Y=y; } |
826 | 860 |