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