Skip site navigation (1)Skip section navigation (2)
Date:      Tue, 17 Nov 2009 20:40:02 GMT
From:      "Joseph S. Atkinson" <jsa.bsd@gmail.com>
To:        freebsd-ports-bugs@FreeBSD.org
Subject:   Re: ports/137635: multimedia/vlc breaks keyboard input processing
Message-ID:  <200911172040.nAHKe2E2087587@freefall.freebsd.org>

next in thread | raw e-mail | index | archive | help
The following reply was made to PR ports/137635; it has been noted by GNATS.

From: "Joseph S. Atkinson" <jsa.bsd@gmail.com>
To: bug-followup@FreeBSD.org, Matti Saarinen <mjsaarin@cc.helsinki.fi>, 
 Doug Barton <dougb@dougbarton.us>,
 Eric Muller <ecmuller@gmail.com>
Cc:  
Subject: Re: ports/137635: multimedia/vlc breaks keyboard input processing
Date: Tue, 17 Nov 2009 15:32:32 -0500

 This is a multi-part message in MIME format.
 --------------070000050208080500000302
 Content-Type: text/plain; charset=ISO-8859-1; format=flowed
 Content-Transfer-Encoding: 7bit
 
 This appears to be a known issue. It's not something I could duplicate 
 personally, but was widely reported. VLC fixed this in git, but I got them to 
 backport it to the bugfix branch from which 1.0.4 will be cut.
 
 This is a diff to apply to 1.0.3.
 
 To test it, put it in ${PORTSDIR}/multimedia/vlc/files/ and `make build 
 deinstall reinstall`.
 
 Sorry that it has taken me so long to address this.
 
 If this works for you all (and I have one report that it does so far), dougb@ 
 should be able to commit it.
 
 --------------070000050208080500000302
 Content-Type: text/plain;
  name="patch-modules__control__globalhotkeys__xcb.c"
 Content-Transfer-Encoding: 7bit
 Content-Disposition: inline;
  filename="patch-modules__control__globalhotkeys__xcb.c"
 
 --- ./modules/control/globalhotkeys/xcb.c.orig	2009-05-10 19:03:55.000000000 -0400
 +++ ./modules/control/globalhotkeys/xcb.c	2009-11-17 13:39:36.000000000 -0500
 @@ -28,6 +28,7 @@
  #include <vlc_interface.h>
  #include <vlc_keys.h>
  #include <ctype.h>
 +#include <errno.h>
  
  #include <xcb/xcb.h>
  #include <xcb/xcb_keysyms.h>
 @@ -56,7 +57,11 @@
  
  typedef struct
  {
 +#ifdef XCB_KEYSYM_OLD_API /* as seen in Debian Lenny */
      xcb_keycode_t i_x11;
 +#else
 +    xcb_keycode_t *p_keys;
 +#endif
      unsigned      i_modifier;
      int           i_action;
  } hotkey_mapping_t;
 @@ -96,7 +101,7 @@
      p_sys->p_connection = xcb_connect( psz_display, &i_screen_default );
      free( psz_display );
  
 -    if( !p_sys->p_connection )
 +    if( xcb_connection_has_error( p_sys->p_connection ) )
          goto error;
  
      /* Get the root windows of the default screen */
 @@ -125,6 +130,10 @@
      if( vlc_clone( &p_sys->thread, Thread, p_intf, VLC_THREAD_PRIORITY_LOW ) )
      {
          Unregister( p_intf );
 +#ifndef XCB_KEYSYM_OLD_API /* as seen in Debian Lenny */
 +        if( p_sys->p_map )
 +            free( p_sys->p_map->p_keys );
 +#endif
          free( p_sys->p_map );
          goto error;
      }
 @@ -133,8 +142,7 @@
  error:
      if( p_sys->p_symbols )
          xcb_key_symbols_free( p_sys->p_symbols );
 -    if( p_sys->p_connection )
 -        xcb_disconnect( p_sys->p_connection );
 +    xcb_disconnect( p_sys->p_connection );
      free( p_sys );
      return VLC_EGENERIC;
  }
 @@ -151,6 +159,10 @@
      vlc_join( p_sys->thread, NULL );
  
      Unregister( p_intf );
 +#ifndef XCB_KEYSYM_OLD_API /* as seen in Debian Lenny */
 +    if( p_sys->p_map )
 +        free( p_sys->p_map->p_keys );
 +#endif
      free( p_sys->p_map );
  
      xcb_key_symbols_free( p_sys->p_symbols );
 @@ -164,16 +176,43 @@
  static unsigned GetModifier( xcb_connection_t *p_connection, xcb_key_symbols_t *p_symbols, xcb_keysym_t sym )
  {
      static const unsigned pi_mask[8] = {
 -        XCB_MOD_MASK_SHIFT, XCB_MOD_MASK_LOCK, XCB_MOD_MASK_CONTROL, XCB_MOD_MASK_1,
 -        XCB_MOD_MASK_2, XCB_MOD_MASK_3, XCB_MOD_MASK_4, XCB_MOD_MASK_5
 +        XCB_MOD_MASK_SHIFT, XCB_MOD_MASK_LOCK, XCB_MOD_MASK_CONTROL,
 +        XCB_MOD_MASK_1, XCB_MOD_MASK_2, XCB_MOD_MASK_3,
 +        XCB_MOD_MASK_4, XCB_MOD_MASK_5
      };
  
 +    if( sym == 0 )
 +        return 0; /* no modifier */
 +
 +#ifdef XCB_KEYSYM_OLD_API /* as seen in Debian Lenny */
      const xcb_keycode_t key = xcb_key_symbols_get_keycode( p_symbols, sym );
      if( key == 0 )
          return 0;
 +#else
 +    const xcb_keycode_t *p_keys = xcb_key_symbols_get_keycode( p_symbols, sym );
 +    if( !p_keys )
 +        return 0;
  
 -    xcb_get_modifier_mapping_cookie_t r = xcb_get_modifier_mapping( p_connection );
 -    xcb_get_modifier_mapping_reply_t *p_map = xcb_get_modifier_mapping_reply( p_connection, r, NULL );
 +    int i = 0;
 +    bool no_modifier = true;
 +    while( p_keys[i] != XCB_NO_SYMBOL )
 +    {
 +        if( p_keys[i] != 0 )
 +        {
 +            no_modifier = false;
 +            break;
 +        }
 +        i++;
 +    }
 +
 +    if( no_modifier )
 +        return 0;
 +#endif
 +
 +    xcb_get_modifier_mapping_cookie_t r =
 +            xcb_get_modifier_mapping( p_connection );
 +    xcb_get_modifier_mapping_reply_t *p_map =
 +            xcb_get_modifier_mapping_reply( p_connection, r, NULL );
      if( !p_map )
          return 0;
  
 @@ -181,20 +220,30 @@
      if( !p_keycode )
          return 0;
  
 -    unsigned i_mask = 0;
      for( int i = 0; i < 8; i++ )
 -    {
          for( int j = 0; j < p_map->keycodes_per_modifier; j++ )
 -        {
 +#ifdef XCB_KEYSYM_OLD_API /* as seen in Debian Lenny */
              if( p_keycode[i * p_map->keycodes_per_modifier + j] == key )
 -                i_mask = pi_mask[i];
 -        }
 -    }
 +            {
 +                free( p_map );
 +                return pi_mask[i];
 +            }
 +#else
 +            for( int k = 0; p_keys[k] != XCB_NO_SYMBOL; k++ )
 +                if( p_keycode[i*p_map->keycodes_per_modifier + j] == p_keys[k])
 +                {
 +                    free( p_map );
 +                    return pi_mask[i];
 +                }
 +#endif
  
      free( p_map ); // FIXME to check
 -    return i_mask;
 +    return 0;
  }
 -static unsigned GetX11Modifier( xcb_connection_t *p_connection, xcb_key_symbols_t *p_symbols, unsigned i_vlc )
 +
 +
 +static unsigned GetX11Modifier( xcb_connection_t *p_connection,
 +        xcb_key_symbols_t *p_symbols, unsigned i_vlc )
  {
      unsigned i_mask = 0;
  
 @@ -225,7 +274,6 @@
  
      { XK_Return, KEY_ENTER },
      { XK_KP_Enter, KEY_ENTER },
 -    { XK_space, KEY_SPACE },
      { XK_Escape, KEY_ESC },
  
      { XK_Menu, KEY_MENU },
 @@ -253,16 +301,16 @@
  };
  static xcb_keysym_t GetX11Key( unsigned i_vlc )
  {
 +    /* X11 and VLC use ASCII for printable ASCII characters */
 +    if( i_vlc >= 32 && i_vlc <= 127 )
 +        return i_vlc;
 +
      for( int i = 0; x11keys_to_vlckeys[i].i_vlc != 0; i++ )
      {
          if( x11keys_to_vlckeys[i].i_vlc == i_vlc )
              return x11keys_to_vlckeys[i].i_x11;
      }
  
 -    /* Copied from xcb, it seems that xcb use ascii code for ascii characters */
 -    if( isascii( i_vlc ) )
 -        return i_vlc;
 -
      return XK_VoidSymbol;
  }
  
 @@ -281,7 +329,7 @@
      p_sys->p_map = NULL;
  
      /* Registering of Hotkeys */
 -    for( struct hotkey *p_hotkey = p_intf->p_libvlc->p_hotkeys;
 +    for( const struct hotkey *p_hotkey = p_intf->p_libvlc->p_hotkeys;
              p_hotkey->psz_action != NULL;
              p_hotkey++ )
      {
 @@ -291,23 +339,34 @@
  
          const int i_vlc_action = p_hotkey->i_action;
          const int i_vlc_key = config_GetInt( p_intf, psz_hotkey );
 -
          free( psz_hotkey );
  
          if( !i_vlc_key )
              continue;
 +#ifdef XCB_KEYSYM_OLD_API /* as seen in Debian Lenny */
 +        const xcb_keycode_t key = xcb_key_symbols_get_keycode(
 +                p_sys->p_symbols, GetX11Key( i_vlc_key & ~KEY_MODIFIER ) );
 +#else
 +        xcb_keycode_t *p_keys = xcb_key_symbols_get_keycode(
 +                p_sys->p_symbols, GetX11Key( i_vlc_key & ~KEY_MODIFIER ) );
 +        if( !p_keys )
 +            continue;
 +#endif
 +        const unsigned i_modifier = GetX11Modifier( p_sys->p_connection,
 +                p_sys->p_symbols, i_vlc_key & KEY_MODIFIER );
  
 -        const xcb_keycode_t key = xcb_key_symbols_get_keycode( p_sys->p_symbols, GetX11Key( i_vlc_key & ~KEY_MODIFIER ) );
 -        const unsigned i_modifier = GetX11Modifier( p_sys->p_connection, p_sys->p_symbols, i_vlc_key & KEY_MODIFIER );
 -
 -        for( int j = 0; j < sizeof(p_x11_modifier_ignored)/sizeof(*p_x11_modifier_ignored); j++ )
 +        const size_t max = sizeof(p_x11_modifier_ignored) /
 +                sizeof(*p_x11_modifier_ignored);
 +        for( unsigned int i = 0; i < max; i++ )
          {
 -            const unsigned i_ignored = GetModifier( p_sys->p_connection, p_sys->p_symbols, p_x11_modifier_ignored[j] );
 -            if( j != 0 && i_ignored == 0x00)
 +            const unsigned i_ignored = GetModifier( p_sys->p_connection,
 +                    p_sys->p_symbols, p_x11_modifier_ignored[i] );
 +            if( i != 0 && i_ignored == 0)
                  continue;
  
              hotkey_mapping_t *p_map_old = p_sys->p_map;
 -            p_sys->p_map = realloc( p_sys->p_map, sizeof(*p_sys->p_map) * (p_sys->i_map+1) );
 +            p_sys->p_map = realloc( p_sys->p_map,
 +                    sizeof(*p_sys->p_map) * (p_sys->i_map+1) );
              if( !p_sys->p_map )
              {
                  p_sys->p_map = p_map_old;
 @@ -315,7 +374,11 @@
              }
              hotkey_mapping_t *p_map = &p_sys->p_map[p_sys->i_map++];
  
 +#ifdef XCB_KEYSYM_OLD_API /* as seen in Debian Lenny */
              p_map->i_x11 = key;
 +#else
 +            p_map->p_keys = p_keys;
 +#endif
              p_map->i_modifier = i_modifier|i_ignored;
              p_map->i_action = i_vlc_action;
          }
 @@ -329,9 +392,18 @@
      for( int i = 0; i < p_sys->i_map; i++ )
      {
          const hotkey_mapping_t *p_map = &p_sys->p_map[i];
 +#ifdef XCB_KEYSYM_OLD_API /* as seen in Debian Lenny */
          xcb_grab_key( p_sys->p_connection, true, p_sys->root,
                        p_map->i_modifier, p_map->i_x11,
                        XCB_GRAB_MODE_ASYNC, XCB_GRAB_MODE_ASYNC );
 +#else
 +        for( int j = 0; p_map->p_keys[j] != XCB_NO_SYMBOL; j++ )
 +        {
 +            xcb_grab_key( p_sys->p_connection, true, p_sys->root,
 +                          p_map->i_modifier, p_map->p_keys[j],
 +                          XCB_GRAB_MODE_ASYNC, XCB_GRAB_MODE_ASYNC );
 +        }
 +#endif
      }
  }
  static void Unregister( intf_thread_t *p_intf )
 @@ -341,7 +413,14 @@
      for( int i = 0; i < p_sys->i_map; i++ )
      {
          const hotkey_mapping_t *p_map = &p_sys->p_map[i];
 -        xcb_ungrab_key( p_sys->p_connection, p_map->i_x11, p_sys->root, p_map->i_modifier );
 +#ifdef XCB_KEYSYM_OLD_API /* as seen in Debian Lenny */
 +        xcb_ungrab_key( p_sys->p_connection, p_map->i_x11, p_sys->root,
 +                p_map->i_modifier );
 +#else
 +        for( int j = 0; p_map->p_keys[j] != XCB_NO_SYMBOL; j++ )
 +            xcb_ungrab_key( p_sys->p_connection, p_map->p_keys[j], p_sys->root,
 +                    p_map->i_modifier );
 +#endif
      }
  }
  
 @@ -387,12 +466,28 @@
              {
                  hotkey_mapping_t *p_map = &p_sys->p_map[i];
  
 +#ifdef XCB_KEYSYM_OLD_API /* as seen in Debian Lenny */
                  if( p_map->i_x11 == e->detail &&
                      p_map->i_modifier == e->state )
                  {
 -                    var_SetInteger( p_intf->p_libvlc, "key-action", p_map->i_action );
 +                    var_SetInteger( p_intf->p_libvlc, "key-action",
 +                            p_map->i_action );
                      break;
                  }
 +#else
 +            bool loop_break = false;
 +            for( int j = 0; p_map->p_keys[j] != XCB_NO_SYMBOL; j++ )
 +                if( p_map->p_keys[j] == e->detail &&
 +                    p_map->i_modifier == e->state )
 +                {
 +                    var_SetInteger( p_intf->p_libvlc, "key-action",
 +                            p_map->i_action );
 +                    loop_break = true;
 +                    break;
 +                }
 +            if( loop_break )
 +                break;
 +#endif
              }
              free( p_event );
          }
 
 --------------070000050208080500000302--



Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?200911172040.nAHKe2E2087587>