From 896ea693267f07e7658ab62f9bd6e8d53d6557d5 Mon Sep 17 00:00:00 2001 From: Gildas Bazin Date: Tue, 28 Oct 2003 21:59:13 +0000 Subject: [PATCH] * modules/video_output/x11/xcommon.c: hotkeys handling cleanup and support for ctrl/alt/shift modifiers. * modules/gui/wxwindows/preferences_widgets.cpp: correctly select the active hotkey (needed on win32). --- modules/gui/wxwindows/preferences_widgets.cpp | 6 +- modules/video_output/x11/xcommon.c | 170 ++++++++---------- 2 files changed, 77 insertions(+), 99 deletions(-) diff --git a/modules/gui/wxwindows/preferences_widgets.cpp b/modules/gui/wxwindows/preferences_widgets.cpp index 6d7a83fc1d..db7f894dd0 100644 --- a/modules/gui/wxwindows/preferences_widgets.cpp +++ b/modules/gui/wxwindows/preferences_widgets.cpp @@ -2,7 +2,7 @@ * preferences_widgets.cpp : wxWindows plugin for vlc ***************************************************************************** * Copyright (C) 2000-2001 VideoLAN - * $Id: preferences_widgets.cpp,v 1.5 2003/10/21 12:30:40 hartman Exp $ + * $Id: preferences_widgets.cpp,v 1.6 2003/10/28 21:59:13 gbazin Exp $ * * Authors: Gildas Bazin * Sigmund Augdal @@ -153,11 +153,13 @@ KeyConfigControl::KeyConfigControl( module_config_t *p_item, wxWindow *parent ) /* HPReg says casting the int to void * is fine */ combo->Append( wxU(_(keys[i].psz_key_string)), (void*)keys[i].i_key_code ); - if( keys[i].i_key_code == ( p_item->i_value & ~KEY_MODIFIER ) ) + if( keys[i].i_key_code == ( ((unsigned int)p_item->i_value) & ~KEY_MODIFIER ) ) { combo->SetSelection( i ); + combo->SetValue( wxU(_(keys[i].psz_key_string)) ); } } + sizer->Add( label, 2, wxALIGN_CENTER_VERTICAL | wxALL | wxEXPAND, 5 ); sizer->Add( alt, 1, wxALIGN_CENTER_VERTICAL | wxALL | wxEXPAND, 5 ); sizer->Add( ctrl, 1, wxALIGN_CENTER_VERTICAL | wxALL | wxEXPAND, 5 ); diff --git a/modules/video_output/x11/xcommon.c b/modules/video_output/x11/xcommon.c index 8099892e4d..fd8b01c547 100644 --- a/modules/video_output/x11/xcommon.c +++ b/modules/video_output/x11/xcommon.c @@ -2,7 +2,7 @@ * xcommon.c: Functions common to the X11 and XVideo plugins ***************************************************************************** * Copyright (C) 1998-2001 VideoLAN - * $Id: xcommon.c,v 1.36 2003/10/26 23:03:47 sigmunau Exp $ + * $Id: xcommon.c,v 1.37 2003/10/28 21:59:12 gbazin Exp $ * * Authors: Vincent Seguin * Samuel Hocevar @@ -120,6 +120,8 @@ static void SetPalette ( vout_thread_t *, static void TestNetWMSupport( vout_thread_t * ); +static int ConvertKey( int ); + /***************************************************************************** * Activate: allocate X11 video thread output method ***************************************************************************** @@ -485,8 +487,6 @@ static void DisplayVideo( vout_thread_t *p_vout, picture_t *p_pic ) static int ManageVideo( vout_thread_t *p_vout ) { XEvent xevent; /* X11 event */ - char i_key; /* ISO Latin-1 key */ - KeySym x_key_symbol; vlc_value_t val; /* Handle X11 events: ConfigureNotify events are parsed to know if the @@ -518,117 +518,45 @@ static int ManageVideo( vout_thread_t *p_vout ) /* Keyboard event */ else if( xevent.type == KeyPress ) { - vlc_value_t val; - val.i_int = 0; + unsigned int state = xevent.xkey.state; + KeySym x_key_symbol; + char i_key; /* ISO Latin-1 key */ + /* We may have keys like F1 trough F12, ESC ... */ x_key_symbol = XKeycodeToKeysym( p_vout->p_sys->p_display, xevent.xkey.keycode, 0 ); - switch( (int)x_key_symbol ) - { - case XK_F1: - val.i_int = KEY_F1; - break; - case XK_F2: - val.i_int = KEY_F2; - break; - case XK_F3: - val.i_int = KEY_F3; - break; - case XK_F4: - val.i_int = KEY_F4; - break; - case XK_F5: - val.i_int = KEY_F5; - break; - case XK_F6: - val.i_int = KEY_F6; - break; - case XK_F7: - val.i_int = KEY_F7; - break; - case XK_F8: - val.i_int = KEY_F8; - break; - case XK_F9: - val.i_int = KEY_F9; - break; - case XK_F10: - val.i_int = KEY_F10; - break; - case XK_F11: - val.i_int = KEY_F11; - break; - case XK_F12: - val.i_int = KEY_F12; - break; - - case XK_Return: - case XK_KP_Enter: - val.i_int = KEY_ENTER; - break; - case XK_Escape: - val.i_int = KEY_ESC; - break; - case XK_Menu: - val.i_int = KEY_MENU; - break; - case XK_Left: - val.i_int = KEY_LEFT; - break; - case XK_Right: - val.i_int = KEY_RIGHT; - break; - case XK_Up: - val.i_int = KEY_UP; - break; - case XK_Down: - val.i_int = KEY_DOWN; - break; - case XK_Home: - val.i_int = KEY_HOME; - break; - case XK_End: - val.i_int = KEY_END; - break; - case XK_Page_Up: - val.i_int = KEY_PAGEUP; - break; - case XK_Page_Down: - val.i_int = KEY_PAGEDOWN; - break; - case XK_space: - val.i_int = KEY_SPACE; - break; + val.i_int = ConvertKey( (int)x_key_symbol ); - default: + xevent.xkey.state &= ~ShiftMask; + xevent.xkey.state &= ~ControlMask; + xevent.xkey.state &= ~Mod1Mask; + + if( !val.i_int && + XLookupString( &xevent.xkey, &i_key, 1, NULL, NULL ) ) + { /* "Normal Keys" * The reason why I use this instead of XK_0 is that * with XLookupString, we don't have to care about * keymaps. */ - - if( XLookupString( &xevent.xkey, &i_key, 1, NULL, NULL ) ) - { - /* FIXME: handle stuff here */ - val.i_int = i_key; - } - break; + val.i_int = i_key; } - if ( val.i_int ) + + if( val.i_int ) { - if ( xevent.xkey.state & ShiftMask ) + if( state & ShiftMask ) { val.i_int |= KEY_MODIFIER_SHIFT; } - if ( xevent.xkey.state & ControlMask ) + if( state & ControlMask ) { - msg_Dbg( p_vout, "control pressed, key value is %x", val.i_int ); val.i_int |= KEY_MODIFIER_CTRL; } - if ( xevent.xkey.state & Mod1Mask ) + if( state & Mod1Mask ) { val.i_int |= KEY_MODIFIER_ALT; } - if ( val.i_int == config_GetInt( p_vout, "fullscreen-key" ) ) + + if( val.i_int == config_GetInt( p_vout, "fullscreen-key" ) ) { p_vout->i_changes |= VOUT_FULLSCREEN_CHANGE; } @@ -1167,8 +1095,8 @@ static int NewPicture( vout_thread_t *p_vout, picture_t *p_pic ) /* Fill in picture_t fields */ vout_InitPicture( VLC_OBJECT(p_vout), p_pic, p_vout->output.i_chroma, - p_vout->output.i_width, p_vout->output.i_height, - p_vout->output.i_aspect ); + p_vout->output.i_width, p_vout->output.i_height, + p_vout->output.i_aspect ); #ifdef HAVE_SYS_SHM_H if( p_vout->p_sys->b_shm ) @@ -2214,3 +2142,51 @@ static void TestNetWMSupport( vout_thread_t *p_vout ) XFree( p_args ); } + +/***************************************************************************** + * Key events handling + *****************************************************************************/ +static struct +{ + int i_x11key; + int i_vlckey; + +} x11keys_to_vlckeys[] = +{ + { XK_F1, KEY_F1 }, { XK_F2, KEY_F2 }, { XK_F3, KEY_F3 }, { XK_F4, KEY_F4 }, + { XK_F5, KEY_F5 }, { XK_F6, KEY_F6 }, { XK_F7, KEY_F7 }, { XK_F8, KEY_F8 }, + { XK_F9, KEY_F9 }, { XK_F10, KEY_F10 }, { XK_F11, KEY_F11 }, + { XK_F12, KEY_F12 }, + + { XK_Return, KEY_ENTER }, + { XK_KP_Enter, KEY_ENTER }, + { XK_space, KEY_SPACE }, + { XK_Escape, KEY_ESC }, + + { XK_Menu, KEY_MENU }, + { XK_Left, KEY_LEFT }, + { XK_Right, KEY_RIGHT }, + { XK_Up, KEY_UP }, + { XK_Down, KEY_DOWN }, + + { XK_Home, KEY_HOME }, + { XK_End, KEY_END }, + { XK_Page_Up, KEY_PAGEUP }, + { XK_Page_Down, KEY_PAGEDOWN }, + { 0, 0 } +}; + +static int ConvertKey( int i_key ) +{ + int i; + + for( i = 0; x11keys_to_vlckeys[i].i_x11key != 0; i++ ) + { + if( x11keys_to_vlckeys[i].i_x11key == i_key ) + { + return x11keys_to_vlckeys[i].i_vlckey; + } + } + + return 0; +} -- 2.39.2