* modules/gui/skins/x11/x11_api.cpp: fixed OSAPI_GetScreenSize
authorCyril Deguet <asmax@videolan.org>
Sun, 1 Jun 2003 22:11:24 +0000 (22:11 +0000)
committerCyril Deguet <asmax@videolan.org>
Sun, 1 Jun 2003 22:11:24 +0000 (22:11 +0000)
* all: added locks around X calls to make them thread safe (will be
  useful in the next commit ;-)

modules/gui/skins/src/skin_common.h
modules/gui/skins/src/skin_main.cpp
modules/gui/skins/x11/x11_api.cpp
modules/gui/skins/x11/x11_bitmap.cpp
modules/gui/skins/x11/x11_font.cpp
modules/gui/skins/x11/x11_graphics.cpp
modules/gui/skins/x11/x11_run.cpp
modules/gui/skins/x11/x11_theme.cpp
modules/gui/skins/x11/x11_theme.h
modules/gui/skins/x11/x11_window.cpp

index 49a4c18..c61f088 100644 (file)
@@ -2,7 +2,7 @@
  * skin_common.h: Private Skin interface description
  *****************************************************************************
  * Copyright (C) 2003 VideoLAN
- * $Id: skin_common.h,v 1.11 2003/06/01 16:39:49 asmax Exp $
+ * $Id: skin_common.h,v 1.12 2003/06/01 22:11:24 asmax Exp $
  *
  * Authors: Olivier Teulière <ipkiss@via.ecp.fr>
  *          Emmanuel Puig    <karibu@via.ecp.fr>
@@ -88,6 +88,7 @@ struct intf_sys_t
 #ifdef X11_SKINS
     Display *display;
     Window mainWin;    // Window which receives "broadcast" events
+    vlc_mutex_t xlock;
 #endif
 
 #ifdef WIN32
index a27cd9e..15e2a62 100644 (file)
@@ -2,7 +2,7 @@
  * skin-main.cpp: skins plugin for VLC
  *****************************************************************************
  * Copyright (C) 2003 VideoLAN
- * $Id: skin_main.cpp,v 1.29 2003/06/01 16:39:49 asmax Exp $
+ * $Id: skin_main.cpp,v 1.30 2003/06/01 22:11:24 asmax Exp $
  *
  * Authors: Olivier Teulière <ipkiss@via.ecp.fr>
  *          Emmanuel Puig    <karibu@via.ecp.fr>
@@ -128,6 +128,7 @@ static int Open ( vlc_object_t *p_this )
 #elif defined X11_SKINS
     // Initialize X11
     p_intf->p_sys->display = XOpenDisplay( NULL );
+    vlc_mutex_init( p_intf, &p_intf->p_sys->xlock );
 
 #elif defined WIN32
     // We dynamically load msimg32.dll to get a pointer to TransparentBlt()
@@ -191,6 +192,8 @@ static void Close ( vlc_object_t *p_this )
         FreeLibrary( p_intf->p_sys->h_msimg32_dll );
     if( p_intf->p_sys->h_user32_dll )
         FreeLibrary( p_intf->p_sys->h_user32_dll );
+#elif defined X11_SKINS
+    vlc_mutex_destroy( &p_intf->p_sys->xlock );
 #endif
 
     // Destroy structure
index 248e874..cf2c50b 100644 (file)
@@ -2,7 +2,7 @@
  * x11_api.cpp: Various x11-specific functions
  *****************************************************************************
  * Copyright (C) 2003 VideoLAN
- * $Id: x11_api.cpp,v 1.4 2003/06/01 16:39:49 asmax Exp $
+ * $Id: x11_api.cpp,v 1.5 2003/06/01 22:11:24 asmax Exp $
  *
  * Authors: Cyril Deguet  <asmax@videolan.org>
  *
@@ -32,6 +32,7 @@
 #include "../src/skin_common.h"
 #include "../src/theme.h"
 #include "../src/window.h"
+#include "../os_theme.h"
 #include "../os_window.h"
 #include "../os_api.h"
 #include "../src/event.h"       // for MAX_PARAM_SIZE
@@ -74,7 +75,10 @@ void OSAPI_PostMessage( SkinWindow *win, unsigned int message, unsigned int para
     {
         event.xclient.window = (( X11Window *)win)->GetHandle();
     }
-    XSendEvent( g_pIntf->p_sys->display, event.xclient.window, False, 0, &event );
+    XLOCK;
+    XSendEvent( g_pIntf->p_sys->display, event.xclient.window, False, 0, 
+                &event );
+    XUNLOCK;
 }
 //---------------------------------------------------------------------------
 
@@ -117,8 +121,10 @@ int OSAPI_GetTime()
 //---------------------------------------------------------------------------
 void OSAPI_GetScreenSize( int &w, int &h )
 {
-/*    w = GetSystemMetrics(SM_CXSCREEN);
-    h = GetSystemMetrics(SM_CYSCREEN);*/
+    Display *display = g_pIntf->p_sys->display;
+    int screen = DefaultScreen( display );
+    w = DisplayWidth( display, screen );
+    h = DisplayHeight( display, screen );
 }
 //---------------------------------------------------------------------------
 void OSAPI_GetMousePos( int &x, int &y )
@@ -129,8 +135,10 @@ void OSAPI_GetMousePos( int &x, int &y )
     unsigned int xmask;
     
     Window root = DefaultRootWindow( g_pIntf->p_sys->display );
+    XLOCK;
     XQueryPointer( g_pIntf->p_sys->display, root, &rootReturn, &childReturn, 
                    &rootx, &rooty, &winx, &winy, &xmask );
+    XUNLOCK;
     x = rootx;
     y = rooty;
 }
index c9442b5..31e34c0 100644 (file)
@@ -2,7 +2,7 @@
  * x11_bitmap.cpp: X11 implementation of the Bitmap class
  *****************************************************************************
  * Copyright (C) 2003 VideoLAN
- * $Id: x11_bitmap.cpp,v 1.8 2003/06/01 16:39:49 asmax Exp $
+ * $Id: x11_bitmap.cpp,v 1.9 2003/06/01 22:11:24 asmax Exp $
  *
  * Authors: Cyril Deguet     <asmax@videolan.org>
  *
@@ -73,7 +73,8 @@ X11Bitmap::X11Bitmap( intf_thread_t *_p_intf, string FileName, int AColor )
  
     AlphaColor = (AColor & 0xff) << 16 | (AColor & 0xff00) | 
                  (AColor & 0xff0000) >> 16;
-                 
+     
+    XLOCK;
     imlib_context_set_display( display );
     imlib_context_set_visual( visual );
     imlib_context_set_colormap( DefaultColormap( display, screen ) );
@@ -107,6 +108,7 @@ X11Bitmap::X11Bitmap( intf_thread_t *_p_intf, string FileName, int AColor )
     imlib_image_set_has_alpha( 1 );
     imlib_image_set_irrelevant_alpha( 0 );
     imlib_image_put_back_data( data );
+    XUNLOCK;
 }
 //---------------------------------------------------------------------------
 X11Bitmap::X11Bitmap( intf_thread_t *_p_intf, Graphics *from, int x, int y,
@@ -151,8 +153,10 @@ X11Bitmap::~X11Bitmap()
 {
     if( Img )
     {
+        XLOCK;
         imlib_context_set_image( Img );
         imlib_free_image();
+        XUNLOCK;
     }
 }
 //---------------------------------------------------------------------------
@@ -161,10 +165,12 @@ void X11Bitmap::DrawBitmap( int x, int y, int w, int h, int xRef, int yRef,
 {
     if( Img )
     {
+        XLOCK;
         Drawable destImg = ( (X11Graphics *)dest )->GetImage();
         imlib_context_set_image( Img );
         imlib_context_set_drawable( destImg );
         imlib_render_image_part_on_drawable_at_size( x, y, w, h, xRef, yRef, w, h );
+        XUNLOCK;
     }
 }
 //---------------------------------------------------------------------------
index cbd4848..73c479b 100644 (file)
@@ -2,7 +2,7 @@
  * x11_font.cpp: X11 implementation of the Font class
  *****************************************************************************
  * Copyright (C) 2003 VideoLAN
- * $Id: x11_font.cpp,v 1.4 2003/06/01 16:39:49 asmax Exp $
+ * $Id: x11_font.cpp,v 1.5 2003/06/01 22:11:24 asmax Exp $
  *
  * Authors: Cyril Deguet     <asmax@videolan.org>
  *
@@ -36,9 +36,8 @@
 #include "../os_graphics.h"
 #include "../src/font.h"
 #include "../os_font.h"
-
-// FIXME ...
-extern intf_thread_t *g_pIntf;
+#include "../src/theme.h"
+#include "../os_theme.h"
 
 //---------------------------------------------------------------------------
 // Font object
@@ -50,7 +49,9 @@ X11Font::X11Font( intf_thread_t *_p_intf, string fontname, int size,
     display = g_pIntf->p_sys->display;
 
     // FIXME: just a beginning...
+    XLOCK;
     font = XLoadFont( display, "-misc-fixed-*-*-*-*-*-*-*-*-*-*-*-*" );
+    XUNLOCK;
 }
 //---------------------------------------------------------------------------
 X11Font::~X11Font()
@@ -66,8 +67,10 @@ void X11Font::GetSize( string text, int &w, int &h )
     int direction, fontAscent, fontDescent;
     XCharStruct overall;
     
-    XQueryTextExtents( display, font, text.c_str(), text.size(), &direction,
-                       &fontAscent, &fontDescent, &overall );
+    XLOCK;
+    XQueryTextExtents( display, font, text.c_str(), text.size(), 
+                        &direction, &fontAscent, &fontDescent, &overall );
+    XUNLOCK;
 
     w = overall.rbearing - overall.lbearing;
     h = overall.ascent + overall.descent;
@@ -83,10 +86,13 @@ void X11Font::GenericPrint( Graphics *dest, string text, int x, int y,
     XGCValues gcVal;
     gcVal.foreground = (color == 0 ? 10 : color);
     gcVal.font = font;
-    XChangeGC( display, gc, GCForeground|GCFont,  &gcVal );
-
+    
     // Render text on buffer
-    XDrawString( display, drawable, gc, x, y+h, text.c_str(), text.size());
+    XLOCK;
+    XChangeGC( display, gc, GCForeground|GCFont,  &gcVal );
+    XDrawString( display, drawable, gc, x, y+h, text.c_str(), 
+                 text.size());
+    XUNLOCK;
 }
 
 //---------------------------------------------------------------------------
index ae3fdec..3c6b3eb 100644 (file)
@@ -2,7 +2,7 @@
  * x11_graphics.cpp: X11 implementation of the Graphics and Region classes
  *****************************************************************************
  * Copyright (C) 2003 VideoLAN
- * $Id: x11_graphics.cpp,v 1.5 2003/06/01 16:39:49 asmax Exp $
+ * $Id: x11_graphics.cpp,v 1.6 2003/06/01 22:11:24 asmax Exp $
  *
  * Authors: Cyril Deguet     <asmax@videolan.org>
  *          Emmanuel Puig    <karibu@via.ecp.fr>
@@ -35,6 +35,8 @@
 #include "../src/graphics.h"
 #include "../src/window.h"
 #include "../os_window.h"
+#include "../src/theme.h"
+#include "../os_theme.h"
 #include "x11_graphics.h"
 #include "../src/skin_common.h"
 
@@ -55,36 +57,45 @@ X11Graphics::X11Graphics( intf_thread_t *p_intf, int w, int h,
         Window fromWnd = ( (X11Window *)from )->GetHandle();
 
         XWindowAttributes attr;
+        XLOCK;
         XGetWindowAttributes( display, fromWnd, &attr);
-
         Image = XCreatePixmap( display, fromWnd, w, h, attr.depth );
+        XUNLOCK;
         Gc = DefaultGC( display, screen );
     }
     else
     {
         Window root = DefaultRootWindow( display );
+        XLOCK;
         Image = XCreatePixmap( display, root, w, h,
                                DefaultDepth( display, screen ) );
+        XUNLOCK;
         Gc = DefaultGC( display, screen );
     }
 
     // Set the background color to black
     XGCValues gcVal;
     gcVal.foreground = 0;
+    XLOCK;
     XChangeGC( display, Gc, GCForeground,  &gcVal );
     XFillRectangle( display, Image, Gc, 0, 0, w, h );    
+    XUNLOCK;
 }
 //---------------------------------------------------------------------------
 X11Graphics::~X11Graphics()
 {
+    XLOCK;
     XFreePixmap( display, Image );
+    XUNLOCK;
 }
 //---------------------------------------------------------------------------
 void X11Graphics::CopyFrom( int dx, int dy, int dw, int dh, Graphics *Src,
                               int sx, int sy, int Flag )
 {
+    XLOCK;
     XCopyArea( display, (( X11Graphics* )Src )->GetImage(), Image, Gc, 
-            sx, sy, dw, dh, dx, dy );
+               sx, sy, dw, dh, dx, dy );
+    XUNLOCK;
 }
 //---------------------------------------------------------------------------
 void X11Graphics::DrawRect( int x, int y, int w, int h, int color )
index f80dc8b..c972f07 100644 (file)
@@ -2,7 +2,7 @@
  * x11_run.cpp:
  *****************************************************************************
  * Copyright (C) 2003 VideoLAN
- * $Id: x11_run.cpp,v 1.12 2003/06/01 16:39:49 asmax Exp $
+ * $Id: x11_run.cpp,v 1.13 2003/06/01 22:11:24 asmax Exp $
  *
  * Authors: Cyril Deguet     <asmax@videolan.org>
  *
@@ -276,10 +276,19 @@ void OSRun( intf_thread_t *p_intf )
     while( !close )
     {
         XEvent event;
-        while( !close && XPending( display ) > 0 )
+        int nPending;
+        XLOCK;
+        nPending = XPending( display );
+        XUNLOCK;
+        while( !close && nPending > 0 )
         {
+            XLOCK;
             XNextEvent( display, &event );
+            XUNLOCK;
             close = ProcessEvent( p_intf, proc, &event );
+            XLOCK;
+            nPending = XPending( display );
+            XUNLOCK;
         }
         
         msleep( 1000 );
index 94e702d..65fbba9 100644 (file)
@@ -2,7 +2,7 @@
  * x11_theme.cpp: X11 implementation of the Theme class
  *****************************************************************************
  * Copyright (C) 2003 VideoLAN
- * $Id: x11_theme.cpp,v 1.8 2003/06/01 16:39:49 asmax Exp $
+ * $Id: x11_theme.cpp,v 1.9 2003/06/01 22:11:24 asmax Exp $
  *
  * Authors: Cyril Deguet     <asmax@videolan.org>
  *
@@ -90,9 +90,11 @@ void X11Theme::OnLoadTheme()
     CreateSystemMenu();
 */
     Window root = DefaultRootWindow( display );
-    p_intf->p_sys->mainWin = XCreateSimpleWindow( display, root, 0, 0, 1, 1, 
-                                                  0, 0, 0 );
+    XLOCK;
+    p_intf->p_sys->mainWin = XCreateSimpleWindow( display, root, 0, 0, 
+                                                  1, 1, 0, 0, 0 );
     XStoreName( display, p_intf->p_sys->mainWin, "VLC Media Player" );
+    XUNLOCK;
 }
 //---------------------------------------------------------------------------
 void X11Theme::AddSystemMenu( string name, Event *event )
@@ -110,7 +112,9 @@ void X11Theme::AddSystemMenu( string name, Event *event )
 //---------------------------------------------------------------------------
 void X11Theme::ChangeClientWindowName( string name )
 {
+    XLOCK;
     XStoreName( display, p_intf->p_sys->mainWin, name.c_str() );
+    XUNLOCK;
 }
 //---------------------------------------------------------------------------
 void X11Theme::AddWindow( string name, int x, int y, bool visible,
@@ -119,11 +123,14 @@ void X11Theme::AddWindow( string name, int x, int y, bool visible,
     // Create the window
     Window root = DefaultRootWindow( display );
     XSetWindowAttributes attr;
+    XLOCK;
     Window wnd = XCreateWindow( display, root, 0, 0, 1, 1, 0, 0, InputOutput,
                                 CopyFromParent, 0, &attr );
     XSelectInput( display, wnd, ExposureMask|StructureNotifyMask|
-            KeyPressMask|KeyReleaseMask|ButtonPressMask|ButtonReleaseMask|
-            PointerMotionMask|EnterWindowMask|LeaveWindowMask);
+                  KeyPressMask|KeyReleaseMask|ButtonPressMask|
+                  ButtonReleaseMask|PointerMotionMask|EnterWindowMask|
+                  LeaveWindowMask);
+    XUNLOCK;
 
     // Changing decorations
     struct {
@@ -138,6 +145,7 @@ void X11Theme::AddWindow( string name, int x, int y, bool visible,
     
     motifWmHints.flags = 2;    // MWM_HINTS_DECORATIONS;
     motifWmHints.decorations = 0;
+    XLOCK;
     XChangeProperty( display, wnd, hints_atom, hints_atom, 32, 
                      PropModeReplace, (unsigned char *)&motifWmHints, 
                      sizeof( motifWmHints ) / sizeof( long ) );
@@ -153,6 +161,7 @@ void X11Theme::AddWindow( string name, int x, int y, bool visible,
     {
         XNextEvent( display, &evt );
     } while( evt.type != MapNotify );
+    XUNLOCK;
 
     WindowList.push_back( (SkinWindow *)new OSWindow( p_intf, wnd, x, y, 
         visible, fadetime, alpha, movealpha, dragdrop, name ) ) ;
index 173ac66..60fdc36 100644 (file)
@@ -2,7 +2,7 @@
  * x11_theme.h: X11 implementation of the Theme class
  *****************************************************************************
  * Copyright (C) 2003 VideoLAN
- * $Id: x11_theme.h,v 1.2 2003/06/01 16:39:49 asmax Exp $
+ * $Id: x11_theme.h,v 1.3 2003/06/01 22:11:24 asmax Exp $
  *
  * Authors: Cyril Deguet     <asmax@videolan.org>
  *
@@ -33,6 +33,12 @@ using namespace std;
 //--- X11 -------------------------------------------------------------------
 #include <X11/Xlib.h>
 
+// macros to make X calls thread safe
+extern intf_thread_t *g_pIntf;
+#define XLOCK vlc_mutex_lock( &g_pIntf->p_sys->xlock )
+#define XUNLOCK vlc_mutex_unlock( &g_pIntf->p_sys->xlock )
+
+
 //---------------------------------------------------------------------------
 struct intf_thread_t;
 class SkinWindow;
@@ -40,6 +46,7 @@ class EventBank;
 class BitmapBank;
 class FontBank;
 
+
 //---------------------------------------------------------------------------
 class X11Theme : public Theme
 {
index 50e8ffe..693f9bc 100644 (file)
@@ -2,7 +2,7 @@
  * x11_window.cpp: X11 implementation of the Window class
  *****************************************************************************
  * Copyright (C) 2003 VideoLAN
- * $Id: x11_window.cpp,v 1.8 2003/06/01 17:13:04 asmax Exp $
+ * $Id: x11_window.cpp,v 1.9 2003/06/01 22:11:24 asmax Exp $
  *
  * Authors: Cyril Deguet     <asmax@videolan.org>
  *
@@ -46,6 +46,7 @@
 #include "../os_graphics.h"
 #include "../src/skin_common.h"
 #include "../src/theme.h"
+#include "../os_theme.h"
 
 
 //---------------------------------------------------------------------------
@@ -112,10 +113,6 @@ X11Window::X11Window( intf_thread_t *p_intf, Window wnd, int x, int y,
     attr.wclass = GDK_INPUT_OUTPUT;
     gint mask = 0;
     ToolTipWindow = gdk_window_new( gwnd, &attr, mask);*/
-
-    Open();
-    //fprintf(stderr, "kludge in x11_window.cpp\n");
-
 }
 //---------------------------------------------------------------------------
 X11Window::~X11Window()
@@ -149,13 +146,16 @@ void X11Window::OSShow( bool show )
 {
     if( show )
     {
+        XLOCK;
         XMapWindow( display, Wnd );
         XMoveWindow( display, Wnd, Left, Top );
+        XUNLOCK;
     }
     else
     {
-        //XWithdrawWindow( display, Wnd, 0 );
+        XLOCK;
         XUnmapWindow( display, Wnd );
+        XUNLOCK;
     }
 }
 //---------------------------------------------------------------------------
@@ -190,7 +190,9 @@ bool X11Window::ProcessOSEvent( Event *evt )
                     p_intf->p_sys->p_theme->WindowList.begin();
                     win != p_intf->p_sys->p_theme->WindowList.end(); win++ )
             {
+                XLOCK;
                 XRaiseWindow( display, ( (X11Window *)(*win) )->GetHandle() );
+                XUNLOCK;
             }
 
             switch( ( (XButtonEvent *)p2 )->button )
@@ -280,6 +282,7 @@ void X11Window::RefreshFromImage( int x, int y, int w, int h )
 {
     Drawable drawable = (( X11Graphics* )Image )->GetImage();
     
+    XLOCK;
     XCopyArea( display, drawable, Wnd, Gc, x, y, w, h, x, y );
  
     XImage *image = XGetImage( display, drawable, 0, 0, Width, Height, 
@@ -317,6 +320,7 @@ void X11Window::RefreshFromImage( int x, int y, int w, int h )
     XDestroyRegion( region );
 
     XSync( display, 0);
+    XUNLOCK;
 }
 //---------------------------------------------------------------------------
 void X11Window::WindowManualMove()