Use --x11-display whenever calling XOpenDisplay (except Qt4 this far)
[vlc.git] / modules / control / globalhotkeys / x11.c
index 74f9bcb..7a0099e 100644 (file)
@@ -43,14 +43,14 @@ static void Close( vlc_object_t *p_this );
 /*****************************************************************************
  * Module descriptor
  *****************************************************************************/
-vlc_module_begin();
-    set_shortname( _("Global Hotkeys") );
-    set_category( CAT_INTERFACE );
-    set_subcategory( SUBCAT_INTERFACE_HOTKEYS );
-    set_description( _("Global Hotkeys interface") );
-    set_capability( "interface", 0 );
-    set_callbacks( Open, Close );
-vlc_module_end();
+vlc_module_begin()
+    set_shortname( N_("Global Hotkeys") )
+    set_category( CAT_INTERFACE )
+    set_subcategory( SUBCAT_INTERFACE_HOTKEYS )
+    set_description( N_("Global Hotkeys interface") )
+    set_capability( "interface", 0 )
+    set_callbacks( Open, Close )
+vlc_module_end()
 
 typedef struct
 {
@@ -72,6 +72,7 @@ static void Mapping( intf_thread_t *p_intf );
 static void Register( intf_thread_t *p_intf );
 static void Unregister( intf_thread_t *p_intf );
 static void *Thread( void *p_data );
+static int X11ErrorHandler( Display *, XErrorEvent * );
 
 /*****************************************************************************
  * Open:
@@ -80,10 +81,13 @@ static int Open( vlc_object_t *p_this )
 {
     intf_thread_t *p_intf = (intf_thread_t *)p_this;
     intf_sys_t *p_sys;
+    char *psz_display = var_CreateGetNonEmptyString( p_intf, "x11-display" );
 
-    Display *p_display = XOpenDisplay( NULL );
+    Display *p_display = XOpenDisplay( psz_display );
+    free( psz_display );
     if( !p_display )
         return VLC_EGENERIC;
+    XSetErrorHandler( X11ErrorHandler );
 
     p_intf->p_sys = p_sys = malloc( sizeof(*p_sys) );
     if( !p_sys )
@@ -125,8 +129,24 @@ static void Close( vlc_object_t *p_this )
 }
 
 /*****************************************************************************
- * Thread:
+ *
  *****************************************************************************/
+static int X11ErrorHandler( Display *p_display, XErrorEvent *p_event )
+{
+#if 0
+    char psz_txt[1024];
+
+    XGetErrorText( p_display, p_event->error_code, psz_txt, sizeof(psz_txt) );
+    fprintf( stderr,
+             "[????????] globalhotkeys interface error: X11 request %u.%u failed "
+              "with error code %u:\n %s\n",
+             p_event->request_code, p_event->minor_code, p_event->error_code, psz_txt );
+#else
+    VLC_UNUSED(p_display); VLC_UNUSED(p_event);
+#endif
+    /* Ignore them */
+    return 0;
+}
 static unsigned GetModifier( Display *p_display, KeySym sym )
 {
     static const unsigned pi_mask[8] = {
@@ -331,6 +351,7 @@ static void *Thread( void *p_data )
         {
             if( errno != EINTR )
                 break;
+            canc = vlc_savecancel();
             continue;
         }
         canc = vlc_savecancel();
@@ -357,7 +378,6 @@ static void *Thread( void *p_data )
         }
     }
 
-    vlc_restorecancel( canc );
     return NULL;
 }