diff options
-rw-r--r-- | packet-x11-keysymdef.h | 2168 | ||||
-rw-r--r-- | packet-x11.c | 2280 | ||||
-rw-r--r-- | x11-fields | 56 |
3 files changed, 3947 insertions, 557 deletions
diff --git a/packet-x11-keysymdef.h b/packet-x11-keysymdef.h new file mode 100644 index 0000000000..4e390d4d53 --- /dev/null +++ b/packet-x11-keysymdef.h @@ -0,0 +1,2168 @@ +/* packet-x11-keysymdef.h + * Key symbol definitions for X11 (XFree86 distribution: keysymdef.h) + * Copyright holders: Digital, The Open Group + * (see below for their copyright statement) + * + * $Id: packet-x11-keysymdef.h,v 1.1 2004/01/02 12:52:45 obiot Exp $ + * + * Ethereal - Network traffic analyzer + * By Gerald Combs <gerald@ethereal.com> + * Copyright 1998 Gerald Combs + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License + * as published by the Free Software Foundation; either version 2 + * of the License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. + */ + +/* $TOG: keysymdef.h /main/28 1998/05/22 16:18:01 kaleb $ */ + +/*********************************************************** +Copyright 1987, 1994, 1998 The Open Group + +All Rights Reserved. + +The above copyright notice and this permission notice shall be included +in all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS +OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF +MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. +IN NO EVENT SHALL THE OPEN GROUP BE LIABLE FOR ANY CLAIM, DAMAGES OR +OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, +ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR +OTHER DEALINGS IN THE SOFTWARE. + +Except as contained in this notice, the name of The Open Group shall +not be used in advertising or otherwise to promote the sale, use or +other dealings in this Software without prior written authorization +from The Open Group. + + +Copyright 1987 by Digital Equipment Corporation, Maynard, Massachusetts + + All Rights Reserved + +Permission to use, copy, modify, and distribute this software and its +documentation for any purpose and without fee is hereby granted, +provided that the above copyright notice appear in all copies and that +both that copyright notice and this permission notice appear in +supporting documentation, and that the name of Digital not be +used in advertising or publicity pertaining to distribution of the +software without specific, written prior permission. + +DIGITAL DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, INCLUDING +ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO EVENT SHALL +DIGITAL BE LIABLE FOR ANY SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR +ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, +WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, +ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS +SOFTWARE. + +******************************************************************/ +/* $XFree86: xc/include/keysymdef.h,v 1.10 2000/10/27 18:30:46 dawes Exp $ */ + +#define XK_VoidSymbol 0xFFFFFF /* void symbol */ + +#define XK_MISCELLANY +#ifdef XK_MISCELLANY +/* + * TTY Functions, cleverly chosen to map to ascii, for convenience of + * programming, but could have been arbitrary (at the cost of lookup + * tables in client code. + */ + +#define XK_BackSpace 0xFF08 /* back space, back char */ +#define XK_Tab 0xFF09 +#define XK_Linefeed 0xFF0A /* Linefeed, LF */ +#define XK_Clear 0xFF0B +#define XK_Return 0xFF0D /* Return, enter */ +#define XK_Pause 0xFF13 /* Pause, hold */ +#define XK_Scroll_Lock 0xFF14 +#define XK_Sys_Req 0xFF15 +#define XK_Escape 0xFF1B +#define XK_Delete 0xFFFF /* Delete, rubout */ + + + +/* International & multi-key character composition */ + +#define XK_Multi_key 0xFF20 /* Multi-key character compose */ +#define XK_Codeinput 0xFF37 +#define XK_SingleCandidate 0xFF3C +#define XK_MultipleCandidate 0xFF3D +#define XK_PreviousCandidate 0xFF3E + +/* Japanese keyboard support */ + +#define XK_Kanji 0xFF21 /* Kanji, Kanji convert */ +#define XK_Muhenkan 0xFF22 /* Cancel Conversion */ +#define XK_Henkan_Mode 0xFF23 /* Start/Stop Conversion */ +#define XK_Henkan 0xFF23 /* Alias for Henkan_Mode */ +#define XK_Romaji 0xFF24 /* to Romaji */ +#define XK_Hiragana 0xFF25 /* to Hiragana */ +#define XK_Katakana 0xFF26 /* to Katakana */ +#define XK_Hiragana_Katakana 0xFF27 /* Hiragana/Katakana toggle */ +#define XK_Zenkaku 0xFF28 /* to Zenkaku */ +#define XK_Hankaku 0xFF29 /* to Hankaku */ +#define XK_Zenkaku_Hankaku 0xFF2A /* Zenkaku/Hankaku toggle */ +#define XK_Touroku 0xFF2B /* Add to Dictionary */ +#define XK_Massyo 0xFF2C /* Delete from Dictionary */ +#define XK_Kana_Lock 0xFF2D /* Kana Lock */ +#define XK_Kana_Shift 0xFF2E /* Kana Shift */ +#define XK_Eisu_Shift 0xFF2F /* Alphanumeric Shift */ +#define XK_Eisu_toggle 0xFF30 /* Alphanumeric toggle */ +#define XK_Kanji_Bangou 0xFF37 /* Codeinput */ +#define XK_Zen_Koho 0xFF3D /* Multiple/All Candidate(s) */ +#define XK_Mae_Koho 0xFF3E /* Previous Candidate */ + +/* 0xFF31 thru 0xFF3F are under XK_KOREAN */ + +/* Cursor control & motion */ + +#define XK_Home 0xFF50 +#define XK_Left 0xFF51 /* Move left, left arrow */ +#define XK_Up 0xFF52 /* Move up, up arrow */ +#define XK_Right 0xFF53 /* Move right, right arrow */ +#define XK_Down 0xFF54 /* Move down, down arrow */ +#define XK_Prior 0xFF55 /* Prior, previous */ +#define XK_Page_Up 0xFF55 +#define XK_Next 0xFF56 /* Next */ +#define XK_Page_Down 0xFF56 +#define XK_End 0xFF57 /* EOL */ +#define XK_Begin 0xFF58 /* BOL */ + + +/* Misc Functions */ + +#define XK_Select 0xFF60 /* Select, mark */ +#define XK_Print 0xFF61 +#define XK_Execute 0xFF62 /* Execute, run, do */ +#define XK_Insert 0xFF63 /* Insert, insert here */ +#define XK_Undo 0xFF65 /* Undo, oops */ +#define XK_Redo 0xFF66 /* redo, again */ +#define XK_Menu 0xFF67 +#define XK_Find 0xFF68 /* Find, search */ +#define XK_Cancel 0xFF69 /* Cancel, stop, abort, exit */ +#define XK_Help 0xFF6A /* Help */ +#define XK_Break 0xFF6B +#define XK_Mode_switch 0xFF7E /* Character set switch */ +#define XK_script_switch 0xFF7E /* Alias for mode_switch */ +#define XK_Num_Lock 0xFF7F + +/* Keypad Functions, keypad numbers cleverly chosen to map to ascii */ + +#define XK_KP_Space 0xFF80 /* space */ +#define XK_KP_Tab 0xFF89 +#define XK_KP_Enter 0xFF8D /* enter */ +#define XK_KP_F1 0xFF91 /* PF1, KP_A, ... */ +#define XK_KP_F2 0xFF92 +#define XK_KP_F3 0xFF93 +#define XK_KP_F4 0xFF94 +#define XK_KP_Home 0xFF95 +#define XK_KP_Left 0xFF96 +#define XK_KP_Up 0xFF97 +#define XK_KP_Right 0xFF98 +#define XK_KP_Down 0xFF99 +#define XK_KP_Prior 0xFF9A +#define XK_KP_Page_Up 0xFF9A +#define XK_KP_Next 0xFF9B +#define XK_KP_Page_Down 0xFF9B +#define XK_KP_End 0xFF9C +#define XK_KP_Begin 0xFF9D +#define XK_KP_Insert 0xFF9E +#define XK_KP_Delete 0xFF9F +#define XK_KP_Equal 0xFFBD /* equals */ +#define XK_KP_Multiply 0xFFAA +#define XK_KP_Add 0xFFAB +#define XK_KP_Separator 0xFFAC /* separator, often comma */ +#define XK_KP_Subtract 0xFFAD +#define XK_KP_Decimal 0xFFAE +#define XK_KP_Divide 0xFFAF + +#define XK_KP_0 0xFFB0 +#define XK_KP_1 0xFFB1 +#define XK_KP_2 0xFFB2 +#define XK_KP_3 0xFFB3 +#define XK_KP_4 0xFFB4 +#define XK_KP_5 0xFFB5 +#define XK_KP_6 0xFFB6 +#define XK_KP_7 0xFFB7 +#define XK_KP_8 0xFFB8 +#define XK_KP_9 0xFFB9 + + + +/* + * Auxilliary Functions; note the duplicate definitions for left and right + * function keys; Sun keyboards and a few other manufactures have such + * function key groups on the left and/or right sides of the keyboard. + * We've not found a keyboard with more than 35 function keys total. + */ + +#define XK_F1 0xFFBE +#define XK_F2 0xFFBF +#define XK_F3 0xFFC0 +#define XK_F4 0xFFC1 +#define XK_F5 0xFFC2 +#define XK_F6 0xFFC3 +#define XK_F7 0xFFC4 +#define XK_F8 0xFFC5 +#define XK_F9 0xFFC6 +#define XK_F10 0xFFC7 +#define XK_F11 0xFFC8 +#define XK_L1 0xFFC8 +#define XK_F12 0xFFC9 +#define XK_L2 0xFFC9 +#define XK_F13 0xFFCA +#define XK_L3 0xFFCA +#define XK_F14 0xFFCB +#define XK_L4 0xFFCB +#define XK_F15 0xFFCC +#define XK_L5 0xFFCC +#define XK_F16 0xFFCD +#define XK_L6 0xFFCD +#define XK_F17 0xFFCE +#define XK_L7 0xFFCE +#define XK_F18 0xFFCF +#define XK_L8 0xFFCF +#define XK_F19 0xFFD0 +#define XK_L9 0xFFD0 +#define XK_F20 0xFFD1 +#define XK_L10 0xFFD1 +#define XK_F21 0xFFD2 +#define XK_R1 0xFFD2 +#define XK_F22 0xFFD3 +#define XK_R2 0xFFD3 +#define XK_F23 0xFFD4 +#define XK_R3 0xFFD4 +#define XK_F24 0xFFD5 +#define XK_R4 0xFFD5 +#define XK_F25 0xFFD6 +#define XK_R5 0xFFD6 +#define XK_F26 0xFFD7 +#define XK_R6 0xFFD7 +#define XK_F27 0xFFD8 +#define XK_R7 0xFFD8 +#define XK_F28 0xFFD9 +#define XK_R8 0xFFD9 +#define XK_F29 0xFFDA +#define XK_R9 0xFFDA +#define XK_F30 0xFFDB +#define XK_R10 0xFFDB +#define XK_F31 0xFFDC +#define XK_R11 0xFFDC +#define XK_F32 0xFFDD +#define XK_R12 0xFFDD +#define XK_F33 0xFFDE +#define XK_R13 0xFFDE +#define XK_F34 0xFFDF +#define XK_R14 0xFFDF +#define XK_F35 0xFFE0 +#define XK_R15 0xFFE0 + +/* Modifiers */ + +#define XK_Shift_L 0xFFE1 /* Left shift */ +#define XK_Shift_R 0xFFE2 /* Right shift */ +#define XK_Control_L 0xFFE3 /* Left control */ +#define XK_Control_R 0xFFE4 /* Right control */ +#define XK_Caps_Lock 0xFFE5 /* Caps lock */ +#define XK_Shift_Lock 0xFFE6 /* Shift lock */ + +#define XK_Meta_L 0xFFE7 /* Left meta */ +#define XK_Meta_R 0xFFE8 /* Right meta */ +#define XK_Alt_L 0xFFE9 /* Left alt */ +#define XK_Alt_R 0xFFEA /* Right alt */ +#define XK_Super_L 0xFFEB /* Left super */ +#define XK_Super_R 0xFFEC /* Right super */ +#define XK_Hyper_L 0xFFED /* Left hyper */ +#define XK_Hyper_R 0xFFEE /* Right hyper */ +#endif /* XK_MISCELLANY */ + +/* + * ISO 9995 Function and Modifier Keys + * Byte 3 = 0xFE + */ + +#define XK_XKB_KEYS +#ifdef XK_XKB_KEYS +#define XK_ISO_Lock 0xFE01 +#define XK_ISO_Level2_Latch 0xFE02 +#define XK_ISO_Level3_Shift 0xFE03 +#define XK_ISO_Level3_Latch 0xFE04 +#define XK_ISO_Level3_Lock 0xFE05 +#define XK_ISO_Group_Shift 0xFF7E /* Alias for mode_switch */ +#define XK_ISO_Group_Latch 0xFE06 +#define XK_ISO_Group_Lock 0xFE07 +#define XK_ISO_Next_Group 0xFE08 +#define XK_ISO_Next_Group_Lock 0xFE09 +#define XK_ISO_Prev_Group 0xFE0A +#define XK_ISO_Prev_Group_Lock 0xFE0B +#define XK_ISO_First_Group 0xFE0C +#define XK_ISO_First_Group_Lock 0xFE0D +#define XK_ISO_Last_Group 0xFE0E +#define XK_ISO_Last_Group_Lock 0xFE0F + +#define XK_ISO_Left_Tab 0xFE20 +#define XK_ISO_Move_Line_Up 0xFE21 +#define XK_ISO_Move_Line_Down 0xFE22 +#define XK_ISO_Partial_Line_Up 0xFE23 +#define XK_ISO_Partial_Line_Down 0xFE24 +#define XK_ISO_Partial_Space_Left 0xFE25 +#define XK_ISO_Partial_Space_Right 0xFE26 +#define XK_ISO_Set_Margin_Left 0xFE27 +#define XK_ISO_Set_Margin_Right 0xFE28 +#define XK_ISO_Release_Margin_Left 0xFE29 +#define XK_ISO_Release_Margin_Right 0xFE2A +#define XK_ISO_Release_Both_Margins 0xFE2B +#define XK_ISO_Fast_Cursor_Left 0xFE2C +#define XK_ISO_Fast_Cursor_Right 0xFE2D +#define XK_ISO_Fast_Cursor_Up 0xFE2E +#define XK_ISO_Fast_Cursor_Down 0xFE2F +#define XK_ISO_Continuous_Underline 0xFE30 +#define XK_ISO_Discontinuous_Underline 0xFE31 +#define XK_ISO_Emphasize 0xFE32 +#define XK_ISO_Center_Object 0xFE33 +#define XK_ISO_Enter 0xFE34 + +#define XK_dead_grave 0xFE50 +#define XK_dead_acute 0xFE51 +#define XK_dead_circumflex 0xFE52 +#define XK_dead_tilde 0xFE53 +#define XK_dead_macron 0xFE54 +#define XK_dead_breve 0xFE55 +#define XK_dead_abovedot 0xFE56 +#define XK_dead_diaeresis 0xFE57 +#define XK_dead_abovering 0xFE58 +#define XK_dead_doubleacute 0xFE59 +#define XK_dead_caron 0xFE5A +#define XK_dead_cedilla 0xFE5B +#define XK_dead_ogonek 0xFE5C +#define XK_dead_iota 0xFE5D +#define XK_dead_voiced_sound 0xFE5E +#define XK_dead_semivoiced_sound 0xFE5F +#define XK_dead_belowdot 0xFE60 +#define XK_dead_hook 0xFE61 +#define XK_dead_horn 0xFE62 + +#define XK_First_Virtual_Screen 0xFED0 +#define XK_Prev_Virtual_Screen 0xFED1 +#define XK_Next_Virtual_Screen 0xFED2 +#define XK_Last_Virtual_Screen 0xFED4 +#define XK_Terminate_Server 0xFED5 + +#define XK_AccessX_Enable 0xFE70 +#define XK_AccessX_Feedback_Enable 0xFE71 +#define XK_RepeatKeys_Enable 0xFE72 +#define XK_SlowKeys_Enable 0xFE73 +#define XK_BounceKeys_Enable 0xFE74 +#define XK_StickyKeys_Enable 0xFE75 +#define XK_MouseKeys_Enable 0xFE76 +#define XK_MouseKeys_Accel_Enable 0xFE77 +#define XK_Overlay1_Enable 0xFE78 +#define XK_Overlay2_Enable 0xFE79 +#define XK_AudibleBell_Enable 0xFE7A + +#define XK_Pointer_Left 0xFEE0 +#define XK_Pointer_Right 0xFEE1 +#define XK_Pointer_Up 0xFEE2 +#define XK_Pointer_Down 0xFEE3 +#define XK_Pointer_UpLeft 0xFEE4 +#define XK_Pointer_UpRight 0xFEE5 +#define XK_Pointer_DownLeft 0xFEE6 +#define XK_Pointer_DownRight 0xFEE7 +#define XK_Pointer_Button_Dflt 0xFEE8 +#define XK_Pointer_Button1 0xFEE9 +#define XK_Pointer_Button2 0xFEEA +#define XK_Pointer_Button3 0xFEEB +#define XK_Pointer_Button4 0xFEEC +#define XK_Pointer_Button5 0xFEED +#define XK_Pointer_DblClick_Dflt 0xFEEE +#define XK_Pointer_DblClick1 0xFEEF +#define XK_Pointer_DblClick2 0xFEF0 +#define XK_Pointer_DblClick3 0xFEF1 +#define XK_Pointer_DblClick4 0xFEF2 +#define XK_Pointer_DblClick5 0xFEF3 +#define XK_Pointer_Drag_Dflt 0xFEF4 +#define XK_Pointer_Drag1 0xFEF5 +#define XK_Pointer_Drag2 0xFEF6 +#define XK_Pointer_Drag3 0xFEF7 +#define XK_Pointer_Drag4 0xFEF8 +#define XK_Pointer_Drag5 0xFEFD + +#define XK_Pointer_EnableKeys 0xFEF9 +#define XK_Pointer_Accelerate 0xFEFA +#define XK_Pointer_DfltBtnNext 0xFEFB +#define XK_Pointer_DfltBtnPrev 0xFEFC + +#endif + +/* + * 3270 Terminal Keys + * Byte 3 = 0xFD + */ + +#define XK_3270 +#ifdef XK_3270 +#define XK_3270_Duplicate 0xFD01 +#define XK_3270_FieldMark 0xFD02 +#define XK_3270_Right2 0xFD03 +#define XK_3270_Left2 0xFD04 +#define XK_3270_BackTab 0xFD05 +#define XK_3270_EraseEOF 0xFD06 +#define XK_3270_EraseInput 0xFD07 +#define XK_3270_Reset 0xFD08 +#define XK_3270_Quit 0xFD09 +#define XK_3270_PA1 0xFD0A +#define XK_3270_PA2 0xFD0B +#define XK_3270_PA3 0xFD0C +#define XK_3270_Test 0xFD0D +#define XK_3270_Attn 0xFD0E +#define XK_3270_CursorBlink 0xFD0F +#define XK_3270_AltCursor 0xFD10 +#define XK_3270_KeyClick 0xFD11 +#define XK_3270_Jump 0xFD12 +#define XK_3270_Ident 0xFD13 +#define XK_3270_Rule 0xFD14 +#define XK_3270_Copy 0xFD15 +#define XK_3270_Play 0xFD16 +#define XK_3270_Setup 0xFD17 +#define XK_3270_Record 0xFD18 +#define XK_3270_ChangeScreen 0xFD19 +#define XK_3270_DeleteWord 0xFD1A +#define XK_3270_ExSelect 0xFD1B +#define XK_3270_CursorSelect 0xFD1C +#define XK_3270_PrintScreen 0xFD1D +#define XK_3270_Enter 0xFD1E +#endif + +/* + * Latin 1 + * Byte 3 = 0 + */ +#define XK_LATIN1 +#ifdef XK_LATIN1 +#define XK_space 0x020 +#define XK_exclam 0x021 +#define XK_quotedbl 0x022 +#define XK_numbersign 0x023 +#define XK_dollar 0x024 +#define XK_percent 0x025 +#define XK_ampersand 0x026 +#define XK_apostrophe 0x027 +#define XK_quoteright 0x027 /* deprecated */ +#define XK_parenleft 0x028 +#define XK_parenright 0x029 +#define XK_asterisk 0x02a +#define XK_plus 0x02b +#define XK_comma 0x02c +#define XK_minus 0x02d +#define XK_period 0x02e +#define XK_slash 0x02f +#define XK_0 0x030 +#define XK_1 0x031 +#define XK_2 0x032 +#define XK_3 0x033 +#define XK_4 0x034 +#define XK_5 0x035 +#define XK_6 0x036 +#define XK_7 0x037 +#define XK_8 0x038 +#define XK_9 0x039 +#define XK_colon 0x03a +#define XK_semicolon 0x03b +#define XK_less 0x03c +#define XK_equal 0x03d +#define XK_greater 0x03e +#define XK_question 0x03f +#define XK_at 0x040 +#define XK_A 0x041 +#define XK_B 0x042 +#define XK_C 0x043 +#define XK_D 0x044 +#define XK_E 0x045 +#define XK_F 0x046 +#define XK_G 0x047 +#define XK_H 0x048 +#define XK_I 0x049 +#define XK_J 0x04a +#define XK_K 0x04b +#define XK_L 0x04c +#define XK_M 0x04d +#define XK_N 0x04e +#define XK_O 0x04f +#define XK_P 0x050 +#define XK_Q 0x051 +#define XK_R 0x052 +#define XK_S 0x053 +#define XK_T 0x054 +#define XK_U 0x055 +#define XK_V 0x056 +#define XK_W 0x057 +#define XK_X 0x058 +#define XK_Y 0x059 +#define XK_Z 0x05a +#define XK_bracketleft 0x05b +#define XK_backslash 0x05c +#define XK_bracketright 0x05d +#define XK_asciicircum 0x05e +#define XK_underscore 0x05f +#define XK_grave 0x060 +#define XK_quoteleft 0x060 /* deprecated */ +#define XK_a 0x061 +#define XK_b 0x062 +#define XK_c 0x063 +#define XK_d 0x064 +#define XK_e 0x065 +#define XK_f 0x066 +#define XK_g 0x067 +#define XK_h 0x068 +#define XK_i 0x069 +#define XK_j 0x06a +#define XK_k 0x06b +#define XK_l 0x06c +#define XK_m 0x06d +#define XK_n 0x06e +#define XK_o 0x06f +#define XK_p 0x070 +#define XK_q 0x071 +#define XK_r 0x072 +#define XK_s 0x073 +#define XK_t 0x074 +#define XK_u 0x075 +#define XK_v 0x076 +#define XK_w 0x077 +#define XK_x 0x078 +#define XK_y 0x079 +#define XK_z 0x07a +#define XK_braceleft 0x07b +#define XK_bar 0x07c +#define XK_braceright 0x07d +#define XK_asciitilde 0x07e + +#define XK_nobreakspace 0x0a0 +#define XK_exclamdown 0x0a1 +#define XK_cent 0x0a2 +#define XK_sterling 0x0a3 +#define XK_currency 0x0a4 +#define XK_yen 0x0a5 +#define XK_brokenbar 0x0a6 +#define XK_section 0x0a7 +#define XK_diaeresis 0x0a8 +#define XK_copyright 0x0a9 +#define XK_ordfeminine 0x0aa +#define XK_guillemotleft 0x0ab /* left angle quotation mark */ +#define XK_notsign 0x0ac +#define XK_hyphen 0x0ad +#define XK_registered 0x0ae +#define XK_macron 0x0af +#define XK_degree 0x0b0 +#define XK_plusminus 0x0b1 +#define XK_twosuperior 0x0b2 +#define XK_threesuperior 0x0b3 +#define XK_acute 0x0b4 +#define XK_mu 0x0b5 +#define XK_paragraph 0x0b6 +#define XK_periodcentered 0x0b7 +#define XK_cedilla 0x0b8 +#define XK_onesuperior 0x0b9 +#define XK_masculine 0x0ba +#define XK_guillemotright 0x0bb /* right angle quotation mark */ +#define XK_onequarter 0x0bc +#define XK_onehalf 0x0bd +#define XK_threequarters 0x0be +#define XK_questiondown 0x0bf +#define XK_Agrave 0x0c0 +#define XK_Aacute 0x0c1 +#define XK_Acircumflex 0x0c2 +#define XK_Atilde 0x0c3 +#define XK_Adiaeresis 0x0c4 +#define XK_Aring 0x0c5 +#define XK_AE 0x0c6 +#define XK_Ccedilla 0x0c7 +#define XK_Egrave 0x0c8 +#define XK_Eacute 0x0c9 +#define XK_Ecircumflex 0x0ca +#define XK_Ediaeresis 0x0cb +#define XK_Igrave 0x0cc +#define XK_Iacute 0x0cd +#define XK_Icircumflex 0x0ce +#define XK_Idiaeresis 0x0cf +#define XK_ETH 0x0d0 +#define XK_Eth 0x0d0 /* deprecated */ +#define XK_Ntilde 0x0d1 +#define XK_Ograve 0x0d2 +#define XK_Oacute 0x0d3 +#define XK_Ocircumflex 0x0d4 +#define XK_Otilde 0x0d5 +#define XK_Odiaeresis 0x0d6 +#define XK_multiply 0x0d7 +#define XK_Ooblique 0x0d8 +#define XK_Oslash XK_Ooblique +#define XK_Ugrave 0x0d9 +#define XK_Uacute 0x0da +#define XK_Ucircumflex 0x0db +#define XK_Udiaeresis 0x0dc +#define XK_Yacute 0x0dd +#define XK_THORN 0x0de +#define XK_Thorn 0x0de /* deprecated */ +#define XK_ssharp 0x0df +#define XK_agrave 0x0e0 +#define XK_aacute 0x0e1 +#define XK_acircumflex 0x0e2 +#define XK_atilde 0x0e3 +#define XK_adiaeresis 0x0e4 +#define XK_aring 0x0e5 +#define XK_ae 0x0e6 +#define XK_ccedilla 0x0e7 +#define XK_egrave 0x0e8 +#define XK_eacute 0x0e9 +#define XK_ecircumflex 0x0ea +#define XK_ediaeresis 0x0eb +#define XK_igrave 0x0ec +#define XK_iacute 0x0ed +#define XK_icircumflex 0x0ee +#define XK_idiaeresis 0x0ef +#define XK_eth 0x0f0 +#define XK_ntilde 0x0f1 +#define XK_ograve 0x0f2 +#define XK_oacute 0x0f3 +#define XK_ocircumflex 0x0f4 +#define XK_otilde 0x0f5 +#define XK_odiaeresis 0x0f6 +#define XK_division 0x0f7 +#define XK_oslash 0x0f8 +#define XK_ooblique XK_oslash +#define XK_ugrave 0x0f9 +#define XK_uacute 0x0fa +#define XK_ucircumflex 0x0fb +#define XK_udiaeresis 0x0fc +#define XK_yacute 0x0fd +#define XK_thorn 0x0fe +#define XK_ydiaeresis 0x0ff +#endif /* XK_LATIN1 */ + +/* + * Latin 2 + * Byte 3 = 1 + */ + +#define XK_LATIN2 +#ifdef XK_LATIN2 +#define XK_Aogonek 0x1a1 +#define XK_breve 0x1a2 +#define XK_Lstroke 0x1a3 +#define XK_Lcaron 0x1a5 +#define XK_Sacute 0x1a6 +#define XK_Scaron 0x1a9 +#define XK_Scedilla 0x1aa +#define XK_Tcaron 0x1ab +#define XK_Zacute 0x1ac +#define XK_Zcaron 0x1ae +#define XK_Zabovedot 0x1af +#define XK_aogonek 0x1b1 +#define XK_ogonek 0x1b2 +#define XK_lstroke 0x1b3 +#define XK_lcaron 0x1b5 +#define XK_sacute 0x1b6 +#define XK_caron 0x1b7 +#define XK_scaron 0x1b9 +#define XK_scedilla 0x1ba +#define XK_tcaron 0x1bb +#define XK_zacute 0x1bc +#define XK_doubleacute 0x1bd +#define XK_zcaron 0x1be +#define XK_zabovedot 0x1bf +#define XK_Racute 0x1c0 +#define XK_Abreve 0x1c3 +#define XK_Lacute 0x1c5 +#define XK_Cacute 0x1c6 +#define XK_Ccaron 0x1c8 +#define XK_Eogonek 0x1ca +#define XK_Ecaron 0x1cc +#define XK_Dcaron 0x1cf +#define XK_Dstroke 0x1d0 +#define XK_Nacute 0x1d1 +#define XK_Ncaron 0x1d2 +#define XK_Odoubleacute 0x1d5 +#define XK_Rcaron 0x1d8 +#define XK_Uring 0x1d9 +#define XK_Udoubleacute 0x1db +#define XK_Tcedilla 0x1de +#define XK_racute 0x1e0 +#define XK_abreve 0x1e3 +#define XK_lacute 0x1e5 +#define XK_cacute 0x1e6 +#define XK_ccaron 0x1e8 +#define XK_eogonek 0x1ea +#define XK_ecaron 0x1ec +#define XK_dcaron 0x1ef +#define XK_dstroke 0x1f0 +#define XK_nacute 0x1f1 +#define XK_ncaron 0x1f2 +#define XK_odoubleacute 0x1f5 +#define XK_udoubleacute 0x1fb +#define XK_rcaron 0x1f8 +#define XK_uring 0x1f9 +#define XK_tcedilla 0x1fe +#define XK_abovedot 0x1ff +#endif /* XK_LATIN2 */ + +/* + * Latin 3 + * Byte 3 = 2 + */ + +#define XK_LATIN3 +#ifdef XK_LATIN3 +#define XK_Hstroke 0x2a1 +#define XK_Hcircumflex 0x2a6 +#define XK_Iabovedot 0x2a9 +#define XK_Gbreve 0x2ab +#define XK_Jcircumflex 0x2ac +#define XK_hstroke 0x2b1 +#define XK_hcircumflex 0x2b6 +#define XK_idotless 0x2b9 +#define XK_gbreve 0x2bb +#define XK_jcircumflex 0x2bc +#define XK_Cabovedot 0x2c5 +#define XK_Ccircumflex 0x2c6 +#define XK_Gabovedot 0x2d5 +#define XK_Gcircumflex 0x2d8 +#define XK_Ubreve 0x2dd +#define XK_Scircumflex 0x2de +#define XK_cabovedot 0x2e5 +#define XK_ccircumflex 0x2e6 +#define XK_gabovedot 0x2f5 +#define XK_gcircumflex 0x2f8 +#define XK_ubreve 0x2fd +#define XK_scircumflex 0x2fe +#endif /* XK_LATIN3 */ + + +/* + * Latin 4 + * Byte 3 = 3 + */ + +#define XK_LATIN4 +#ifdef XK_LATIN4 +#define XK_kra 0x3a2 +#define XK_kappa 0x3a2 /* deprecated */ +#define XK_Rcedilla 0x3a3 +#define XK_Itilde 0x3a5 +#define XK_Lcedilla 0x3a6 +#define XK_Emacron 0x3aa +#define XK_Gcedilla 0x3ab +#define XK_Tslash 0x3ac +#define XK_rcedilla 0x3b3 +#define XK_itilde 0x3b5 +#define XK_lcedilla 0x3b6 +#define XK_emacron 0x3ba +#define XK_gcedilla 0x3bb +#define XK_tslash 0x3bc +#define XK_ENG 0x3bd +#define XK_eng 0x3bf +#define XK_Amacron 0x3c0 +#define XK_Iogonek 0x3c7 +#define XK_Eabovedot 0x3cc +#define XK_Imacron 0x3cf +#define XK_Ncedilla 0x3d1 +#define XK_Omacron 0x3d2 +#define XK_Kcedilla 0x3d3 +#define XK_Uogonek 0x3d9 +#define XK_Utilde 0x3dd +#define XK_Umacron 0x3de +#define XK_amacron 0x3e0 +#define XK_iogonek 0x3e7 +#define XK_eabovedot 0x3ec +#define XK_imacron 0x3ef +#define XK_ncedilla 0x3f1 +#define XK_omacron 0x3f2 +#define XK_kcedilla 0x3f3 +#define XK_uogonek 0x3f9 +#define XK_utilde 0x3fd +#define XK_umacron 0x3fe +#endif /* XK_LATIN4 */ + +/* + * Latin-8 + * Byte 3 = 18 + */ +#define XK_LATIN8 +#ifdef XK_LATIN8 +#define XK_Babovedot 0x12a1 +#define XK_babovedot 0x12a2 +#define XK_Dabovedot 0x12a6 +#define XK_Wgrave 0x12a8 +#define XK_Wacute 0x12aa +#define XK_dabovedot 0x12ab +#define XK_Ygrave 0x12ac +#define XK_Fabovedot 0x12b0 +#define XK_fabovedot 0x12b1 +#define XK_Mabovedot 0x12b4 +#define XK_mabovedot 0x12b5 +#define XK_Pabovedot 0x12b7 +#define XK_wgrave 0x12b8 +#define XK_pabovedot 0x12b9 +#define XK_wacute 0x12ba +#define XK_Sabovedot 0x12bb +#define XK_ygrave 0x12bc +#define XK_Wdiaeresis 0x12bd +#define XK_wdiaeresis 0x12be +#define XK_sabovedot 0x12bf +#define XK_Wcircumflex 0x12d0 +#define XK_Tabovedot 0x12d7 +#define XK_Ycircumflex 0x12de +#define XK_wcircumflex 0x12f0 +#define XK_tabovedot 0x12f7 +#define XK_ycircumflex 0x12fe +#endif /* XK_LATIN8 */ + +/* + * Latin-9 (a.k.a. Latin-0) + * Byte 3 = 19 + */ + +#define XK_LATIN9 +#ifdef XK_LATIN9 +#define XK_OE 0x13bc +#define XK_oe 0x13bd +#define XK_Ydiaeresis 0x13be +#endif /* XK_LATIN9 */ + +/* + * Katakana + * Byte 3 = 4 + */ + +#define XK_KATAKANA +#ifdef XK_KATAKANA +#define XK_overline 0x47e +#define XK_kana_fullstop 0x4a1 +#define XK_kana_openingbracket 0x4a2 +#define XK_kana_closingbracket 0x4a3 +#define XK_kana_comma 0x4a4 +#define XK_kana_conjunctive 0x4a5 +#define XK_kana_middledot 0x4a5 /* deprecated */ +#define XK_kana_WO 0x4a6 +#define XK_kana_a 0x4a7 +#define XK_kana_i 0x4a8 +#define XK_kana_u 0x4a9 +#define XK_kana_e 0x4aa +#define XK_kana_o 0x4ab +#define XK_kana_ya 0x4ac +#define XK_kana_yu 0x4ad +#define XK_kana_yo 0x4ae +#define XK_kana_tsu 0x4af +#define XK_kana_tu 0x4af /* deprecated */ +#define XK_prolongedsound 0x4b0 +#define XK_kana_A 0x4b1 +#define XK_kana_I 0x4b2 +#define XK_kana_U 0x4b3 +#define XK_kana_E 0x4b4 +#define XK_kana_O 0x4b5 +#define XK_kana_KA 0x4b6 +#define XK_kana_KI 0x4b7 +#define XK_kana_KU 0x4b8 +#define XK_kana_KE 0x4b9 +#define XK_kana_KO 0x4ba +#define XK_kana_SA 0x4bb +#define XK_kana_SHI 0x4bc +#define XK_kana_SU 0x4bd +#define XK_kana_SE 0x4be +#define XK_kana_SO 0x4bf +#define XK_kana_TA 0x4c0 +#define XK_kana_CHI 0x4c1 +#define XK_kana_TI 0x4c1 /* deprecated */ +#define XK_kana_TSU 0x4c2 +#define XK_kana_TU 0x4c2 /* deprecated */ +#define XK_kana_TE 0x4c3 +#define XK_kana_TO 0x4c4 +#define XK_kana_NA 0x4c5 +#define XK_kana_NI 0x4c6 +#define XK_kana_NU 0x4c7 +#define XK_kana_NE 0x4c8 +#define XK_kana_NO 0x4c9 +#define XK_kana_HA 0x4ca +#define XK_kana_HI 0x4cb +#define XK_kana_FU 0x4cc +#define XK_kana_HU 0x4cc /* deprecated */ +#define XK_kana_HE 0x4cd +#define XK_kana_HO 0x4ce +#define XK_kana_MA 0x4cf +#define XK_kana_MI 0x4d0 +#define XK_kana_MU 0x4d1 +#define XK_kana_ME 0x4d2 +#define XK_kana_MO 0x4d3 +#define XK_kana_YA 0x4d4 +#define XK_kana_YU 0x4d5 +#define XK_kana_YO 0x4d6 +#define XK_kana_RA 0x4d7 +#define XK_kana_RI 0x4d8 +#define XK_kana_RU 0x4d9 +#define XK_kana_RE 0x4da +#define XK_kana_RO 0x4db +#define XK_kana_WA 0x4dc +#define XK_kana_N 0x4dd +#define XK_voicedsound 0x4de +#define XK_semivoicedsound 0x4df +#define XK_kana_switch 0xFF7E /* Alias for mode_switch */ +#endif /* XK_KATAKANA */ + +/* + * Arabic + * Byte 3 = 5 + */ + +#define XK_ARABIC +#ifdef XK_ARABIC +#define XK_Farsi_0 0x590 +#define XK_Farsi_1 0x591 +#define XK_Farsi_2 0x592 +#define XK_Farsi_3 0x593 +#define XK_Farsi_4 0x594 +#define XK_Farsi_5 0x595 +#define XK_Farsi_6 0x596 +#define XK_Farsi_7 0x597 +#define XK_Farsi_8 0x598 +#define XK_Farsi_9 0x599 +#define XK_Arabic_percent 0x5a5 +#define XK_Arabic_superscript_alef 0x5a6 +#define XK_Arabic_tteh 0x5a7 +#define XK_Arabic_peh 0x5a8 +#define XK_Arabic_tcheh 0x5a9 +#define XK_Arabic_ddal 0x5aa +#define XK_Arabic_rreh 0x5ab +#define XK_Arabic_comma 0x5ac +#define XK_Arabic_fullstop 0x5ae +#define XK_Arabic_0 0x5b0 +#define XK_Arabic_1 0x5b1 +#define XK_Arabic_2 0x5b2 +#define XK_Arabic_3 0x5b3 +#define XK_Arabic_4 0x5b4 +#define XK_Arabic_5 0x5b5 +#define XK_Arabic_6 0x5b6 +#define XK_Arabic_7 0x5b7 +#define XK_Arabic_8 0x5b8 +#define XK_Arabic_9 0x5b9 +#define XK_Arabic_semicolon 0x5bb +#define XK_Arabic_question_mark 0x5bf +#define XK_Arabic_hamza 0x5c1 +#define XK_Arabic_maddaonalef 0x5c2 +#define XK_Arabic_hamzaonalef 0x5c3 +#define XK_Arabic_hamzaonwaw 0x5c4 +#define XK_Arabic_hamzaunderalef 0x5c5 +#define XK_Arabic_hamzaonyeh 0x5c6 +#define XK_Arabic_alef 0x5c7 +#define XK_Arabic_beh 0x5c8 +#define XK_Arabic_tehmarbuta 0x5c9 +#define XK_Arabic_teh 0x5ca +#define XK_Arabic_theh 0x5cb +#define XK_Arabic_jeem 0x5cc +#define XK_Arabic_hah 0x5cd +#define XK_Arabic_khah 0x5ce +#define XK_Arabic_dal 0x5cf +#define XK_Arabic_thal 0x5d0 +#define XK_Arabic_ra 0x5d1 +#define XK_Arabic_zain 0x5d2 +#define XK_Arabic_seen 0x5d3 +#define XK_Arabic_sheen 0x5d4 +#define XK_Arabic_sad 0x5d5 +#define XK_Arabic_dad 0x5d6 +#define XK_Arabic_tah 0x5d7 +#define XK_Arabic_zah 0x5d8 +#define XK_Arabic_ain 0x5d9 +#define XK_Arabic_ghain 0x5da +#define XK_Arabic_tatweel 0x5e0 +#define XK_Arabic_feh 0x5e1 +#define XK_Arabic_qaf 0x5e2 +#define XK_Arabic_kaf 0x5e3 +#define XK_Arabic_lam 0x5e4 +#define XK_Arabic_meem 0x5e5 +#define XK_Arabic_noon 0x5e6 +#define XK_Arabic_ha 0x5e7 +#define XK_Arabic_heh 0x5e7 /* deprecated */ +#define XK_Arabic_waw 0x5e8 +#define XK_Arabic_alefmaksura 0x5e9 +#define XK_Arabic_yeh 0x5ea +#define XK_Arabic_fathatan 0x5eb +#define XK_Arabic_dammatan 0x5ec +#define XK_Arabic_kasratan 0x5ed +#define XK_Arabic_fatha 0x5ee +#define XK_Arabic_damma 0x5ef +#define XK_Arabic_kasra 0x5f0 +#define XK_Arabic_shadda 0x5f1 +#define XK_Arabic_sukun 0x5f2 +#define XK_Arabic_madda_above 0x5f3 +#define XK_Arabic_hamza_above 0x5f4 +#define XK_Arabic_hamza_below 0x5f5 +#define XK_Arabic_jeh 0x5f6 +#define XK_Arabic_veh 0x5f7 +#define XK_Arabic_keheh 0x5f8 +#define XK_Arabic_gaf 0x5f9 +#define XK_Arabic_noon_ghunna 0x5fa +#define XK_Arabic_heh_doachashmee 0x5fb +#define XK_Farsi_yeh 0x5fc +#define XK_Arabic_farsi_yeh XK_Farsi_yeh +#define XK_Arabic_yeh_baree 0x5fd +#define XK_Arabic_heh_goal 0x5fe +#define XK_Arabic_switch 0xFF7E /* Alias for mode_switch */ +#endif /* XK_ARABIC */ + +/* + * Cyrillic + * Byte 3 = 6 + */ +#define XK_CYRILLIC +#ifdef XK_CYRILLIC +#define XK_Cyrillic_GHE_bar 0x680 +#define XK_Cyrillic_ghe_bar 0x690 +#define XK_Cyrillic_ZHE_descender 0x681 +#define XK_Cyrillic_zhe_descender 0x691 +#define XK_Cyrillic_KA_descender 0x682 +#define XK_Cyrillic_ka_descender 0x692 +#define XK_Cyrillic_KA_vertstroke 0x683 +#define XK_Cyrillic_ka_vertstroke 0x693 +#define XK_Cyrillic_EN_descender 0x684 +#define XK_Cyrillic_en_descender 0x694 +#define XK_Cyrillic_U_straight 0x685 +#define XK_Cyrillic_u_straight 0x695 +#define XK_Cyrillic_U_straight_bar 0x686 +#define XK_Cyrillic_u_straight_bar 0x696 +#define XK_Cyrillic_HA_descender 0x687 +#define XK_Cyrillic_ha_descender 0x697 +#define XK_Cyrillic_CHE_descender 0x688 +#define XK_Cyrillic_che_descender 0x698 +#define XK_Cyrillic_CHE_vertstroke 0x689 +#define XK_Cyrillic_che_vertstroke 0x699 +#define XK_Cyrillic_SHHA 0x68a +#define XK_Cyrillic_shha 0x69a + +#define XK_Cyrillic_SCHWA 0x68c +#define XK_Cyrillic_schwa 0x69c +#define XK_Cyrillic_I_macron 0x68d +#define XK_Cyrillic_i_macron 0x69d +#define XK_Cyrillic_O_bar 0x68e +#define XK_Cyrillic_o_bar 0x69e +#define XK_Cyrillic_U_macron 0x68f +#define XK_Cyrillic_u_macron 0x69f + +#define XK_Serbian_dje 0x6a1 +#define XK_Macedonia_gje 0x6a2 +#define XK_Cyrillic_io 0x6a3 +#define XK_Ukrainian_ie 0x6a4 +#define XK_Ukranian_je 0x6a4 /* deprecated */ +#define XK_Macedonia_dse 0x6a5 +#define XK_Ukrainian_i 0x6a6 +#define XK_Ukranian_i 0x6a6 /* deprecated */ +#define XK_Ukrainian_yi 0x6a7 +#define XK_Ukranian_yi 0x6a7 /* deprecated */ +#define XK_Cyrillic_je 0x6a8 +#define XK_Serbian_je 0x6a8 /* deprecated */ +#define XK_Cyrillic_lje 0x6a9 +#define XK_Serbian_lje 0x6a9 /* deprecated */ +#define XK_Cyrillic_nje 0x6aa +#define XK_Serbian_nje 0x6aa /* deprecated */ +#define XK_Serbian_tshe 0x6ab +#define XK_Macedonia_kje 0x6ac +#define XK_Ukrainian_ghe_with_upturn 0x6ad +#define XK_Byelorussian_shortu 0x6ae +#define XK_Cyrillic_dzhe 0x6af +#define XK_Serbian_dze 0x6af /* deprecated */ +#define XK_numerosign 0x6b0 +#define XK_Serbian_DJE 0x6b1 +#define XK_Macedonia_GJE 0x6b2 +#define XK_Cyrillic_IO 0x6b3 +#define XK_Ukrainian_IE 0x6b4 +#define XK_Ukranian_JE 0x6b4 /* deprecated */ +#define XK_Macedonia_DSE 0x6b5 +#define XK_Ukrainian_I 0x6b6 +#define XK_Ukranian_I 0x6b6 /* deprecated */ +#define XK_Ukrainian_YI 0x6b7 +#define XK_Ukranian_YI 0x6b7 /* deprecated */ +#define XK_Cyrillic_JE 0x6b8 +#define XK_Serbian_JE 0x6b8 /* deprecated */ +#define XK_Cyrillic_LJE 0x6b9 +#define XK_Serbian_LJE 0x6b9 /* deprecated */ +#define XK_Cyrillic_NJE 0x6ba +#define XK_Serbian_NJE 0x6ba /* deprecated */ +#define XK_Serbian_TSHE 0x6bb +#define XK_Macedonia_KJE 0x6bc +#define XK_Ukrainian_GHE_WITH_UPTURN 0x6bd +#define XK_Byelorussian_SHORTU 0x6be +#define XK_Cyrillic_DZHE 0x6bf +#define XK_Serbian_DZE 0x6bf /* deprecated */ +#define XK_Cyrillic_yu 0x6c0 +#define XK_Cyrillic_a 0x6c1 +#define XK_Cyrillic_be 0x6c2 +#define XK_Cyrillic_tse 0x6c3 +#define XK_Cyrillic_de 0x6c4 +#define XK_Cyrillic_ie 0x6c5 +#define XK_Cyrillic_ef 0x6c6 +#define XK_Cyrillic_ghe 0x6c7 +#define XK_Cyrillic_ha 0x6c8 +#define XK_Cyrillic_i 0x6c9 +#define XK_Cyrillic_shorti 0x6ca +#define XK_Cyrillic_ka 0x6cb +#define XK_Cyrillic_el 0x6cc +#define XK_Cyrillic_em 0x6cd +#define XK_Cyrillic_en 0x6ce +#define XK_Cyrillic_o 0x6cf +#define XK_Cyrillic_pe 0x6d0 +#define XK_Cyrillic_ya 0x6d1 +#define XK_Cyrillic_er 0x6d2 +#define XK_Cyrillic_es 0x6d3 +#define XK_Cyrillic_te 0x6d4 +#define XK_Cyrillic_u 0x6d5 +#define XK_Cyrillic_zhe 0x6d6 +#define XK_Cyrillic_ve 0x6d7 +#define XK_Cyrillic_softsign 0x6d8 +#define XK_Cyrillic_yeru 0x6d9 +#define XK_Cyrillic_ze 0x6da +#define XK_Cyrillic_sha 0x6db +#define XK_Cyrillic_e 0x6dc +#define XK_Cyrillic_shcha 0x6dd +#define XK_Cyrillic_che 0x6de +#define XK_Cyrillic_hardsign 0x6df +#define XK_Cyrillic_YU 0x6e0 +#define XK_Cyrillic_A 0x6e1 +#define XK_Cyrillic_BE 0x6e2 +#define XK_Cyrillic_TSE 0x6e3 +#define XK_Cyrillic_DE 0x6e4 +#define XK_Cyrillic_IE 0x6e5 +#define XK_Cyrillic_EF 0x6e6 +#define XK_Cyrillic_GHE 0x6e7 +#define XK_Cyrillic_HA 0x6e8 +#define XK_Cyrillic_I 0x6e9 +#define XK_Cyrillic_SHORTI 0x6ea +#define XK_Cyrillic_KA 0x6eb +#define XK_Cyrillic_EL 0x6ec +#define XK_Cyrillic_EM 0x6ed +#define XK_Cyrillic_EN 0x6ee +#define XK_Cyrillic_O 0x6ef +#define XK_Cyrillic_PE 0x6f0 +#define XK_Cyrillic_YA 0x6f1 +#define XK_Cyrillic_ER 0x6f2 +#define XK_Cyrillic_ES 0x6f3 +#define XK_Cyrillic_TE 0x6f4 +#define XK_Cyrillic_U 0x6f5 +#define XK_Cyrillic_ZHE 0x6f6 +#define XK_Cyrillic_VE 0x6f7 +#define XK_Cyrillic_SOFTSIGN 0x6f8 +#define XK_Cyrillic_YERU 0x6f9 +#define XK_Cyrillic_ZE 0x6fa +#define XK_Cyrillic_SHA 0x6fb +#define XK_Cyrillic_E 0x6fc +#define XK_Cyrillic_SHCHA 0x6fd +#define XK_Cyrillic_CHE 0x6fe +#define XK_Cyrillic_HARDSIGN 0x6ff +#endif /* XK_CYRILLIC */ + +/* + * Greek + * Byte 3 = 7 + */ + +#define XK_GREEK +#ifdef XK_GREEK +#define XK_Greek_ALPHAaccent 0x7a1 +#define XK_Greek_EPSILONaccent 0x7a2 +#define XK_Greek_ETAaccent 0x7a3 +#define XK_Greek_IOTAaccent 0x7a4 +#define XK_Greek_IOTAdieresis 0x7a5 +#define XK_Greek_IOTAdiaeresis XK_Greek_IOTAdieresis /* old typo */ +#define XK_Greek_OMICRONaccent 0x7a7 +#define XK_Greek_UPSILONaccent 0x7a8 +#define XK_Greek_UPSILONdieresis 0x7a9 +#define XK_Greek_OMEGAaccent 0x7ab +#define XK_Greek_accentdieresis 0x7ae +#define XK_Greek_horizbar 0x7af +#define XK_Greek_alphaaccent 0x7b1 +#define XK_Greek_epsilonaccent 0x7b2 +#define XK_Greek_etaaccent 0x7b3 +#define XK_Greek_iotaaccent 0x7b4 +#define XK_Greek_iotadieresis 0x7b5 +#define XK_Greek_iotaaccentdieresis 0x7b6 +#define XK_Greek_omicronaccent 0x7b7 +#define XK_Greek_upsilonaccent 0x7b8 +#define XK_Greek_upsilondieresis 0x7b9 +#define XK_Greek_upsilonaccentdieresis 0x7ba +#define XK_Greek_omegaaccent 0x7bb +#define XK_Greek_ALPHA 0x7c1 +#define XK_Greek_BETA 0x7c2 +#define XK_Greek_GAMMA 0x7c3 +#define XK_Greek_DELTA 0x7c4 +#define XK_Greek_EPSILON 0x7c5 +#define XK_Greek_ZETA 0x7c6 +#define XK_Greek_ETA 0x7c7 +#define XK_Greek_THETA 0x7c8 +#define XK_Greek_IOTA 0x7c9 +#define XK_Greek_KAPPA 0x7ca +#define XK_Greek_LAMDA 0x7cb +#define XK_Greek_LAMBDA 0x7cb +#define XK_Greek_MU 0x7cc +#define XK_Greek_NU 0x7cd +#define XK_Greek_XI 0x7ce +#define XK_Greek_OMICRON 0x7cf +#define XK_Greek_PI 0x7d0 +#define XK_Greek_RHO 0x7d1 +#define XK_Greek_SIGMA 0x7d2 +#define XK_Greek_TAU 0x7d4 +#define XK_Greek_UPSILON 0x7d5 +#define XK_Greek_PHI 0x7d6 +#define XK_Greek_CHI 0x7d7 +#define XK_Greek_PSI 0x7d8 +#define XK_Greek_OMEGA 0x7d9 +#define XK_Greek_alpha 0x7e1 +#define XK_Greek_beta 0x7e2 +#define XK_Greek_gamma 0x7e3 +#define XK_Greek_delta 0x7e4 +#define XK_Greek_epsilon 0x7e5 +#define XK_Greek_zeta 0x7e6 +#define XK_Greek_eta 0x7e7 +#define XK_Greek_theta 0x7e8 +#define XK_Greek_iota 0x7e9 +#define XK_Greek_kappa 0x7ea +#define XK_Greek_lamda 0x7eb +#define XK_Greek_lambda 0x7eb +#define XK_Greek_mu 0x7ec +#define XK_Greek_nu 0x7ed +#define XK_Greek_xi 0x7ee +#define XK_Greek_omicron 0x7ef +#define XK_Greek_pi 0x7f0 +#define XK_Greek_rho 0x7f1 +#define XK_Greek_sigma 0x7f2 +#define XK_Greek_finalsmallsigma 0x7f3 +#define XK_Greek_tau 0x7f4 +#define XK_Greek_upsilon 0x7f5 +#define XK_Greek_phi 0x7f6 +#define XK_Greek_chi 0x7f7 +#define XK_Greek_psi 0x7f8 +#define XK_Greek_omega 0x7f9 +#define XK_Greek_switch 0xFF7E /* Alias for mode_switch */ +#endif /* XK_GREEK */ + +/* + * Technical + * Byte 3 = 8 + */ + +#define XK_TECHNICAL +#ifdef XK_TECHNICAL +#define XK_leftradical 0x8a1 +#define XK_topleftradical 0x8a2 +#define XK_horizconnector 0x8a3 +#define XK_topintegral 0x8a4 +#define XK_botintegral 0x8a5 +#define XK_vertconnector 0x8a6 +#define XK_topleftsqbracket 0x8a7 +#define XK_botleftsqbracket 0x8a8 +#define XK_toprightsqbracket 0x8a9 +#define XK_botrightsqbracket 0x8aa +#define XK_topleftparens 0x8ab +#define XK_botleftparens 0x8ac +#define XK_toprightparens 0x8ad +#define XK_botrightparens 0x8ae +#define XK_leftmiddlecurlybrace 0x8af +#define XK_rightmiddlecurlybrace 0x8b0 +#define XK_topleftsummation 0x8b1 +#define XK_botleftsummation 0x8b2 +#define XK_topvertsummationconnector 0x8b3 +#define XK_botvertsummationconnector 0x8b4 +#define XK_toprightsummation 0x8b5 +#define XK_botrightsummation 0x8b6 +#define XK_rightmiddlesummation 0x8b7 +#define XK_lessthanequal 0x8bc +#define XK_notequal 0x8bd +#define XK_greaterthanequal 0x8be +#define XK_integral 0x8bf +#define XK_therefore 0x8c0 +#define XK_variation 0x8c1 +#define XK_infinity 0x8c2 +#define XK_nabla 0x8c5 +#define XK_approximate 0x8c8 +#define XK_similarequal 0x8c9 +#define XK_ifonlyif 0x8cd +#define XK_implies 0x8ce +#define XK_identical 0x8cf +#define XK_radical 0x8d6 +#define XK_includedin 0x8da +#define XK_includes 0x8db +#define XK_intersection 0x8dc +#define XK_union 0x8dd +#define XK_logicaland 0x8de +#define XK_logicalor 0x8df +#define XK_partialderivative 0x8ef +#define XK_function 0x8f6 +#define XK_leftarrow 0x8fb +#define XK_uparrow 0x8fc +#define XK_rightarrow 0x8fd +#define XK_downarrow 0x8fe +#endif /* XK_TECHNICAL */ + +/* + * Special + * Byte 3 = 9 + */ + +#define XK_SPECIAL +#ifdef XK_SPECIAL +#define XK_blank 0x9df +#define XK_soliddiamond 0x9e0 +#define XK_checkerboard 0x9e1 +#define XK_ht 0x9e2 +#define XK_ff 0x9e3 +#define XK_cr 0x9e4 +#define XK_lf 0x9e5 +#define XK_nl 0x9e8 +#define XK_vt 0x9e9 +#define XK_lowrightcorner 0x9ea +#define XK_uprightcorner 0x9eb +#define XK_upleftcorner 0x9ec +#define XK_lowleftcorner 0x9ed +#define XK_crossinglines 0x9ee +#define XK_horizlinescan1 0x9ef +#define XK_horizlinescan3 0x9f0 +#define XK_horizlinescan5 0x9f1 +#define XK_horizlinescan7 0x9f2 +#define XK_horizlinescan9 0x9f3 +#define XK_leftt 0x9f4 +#define XK_rightt 0x9f5 +#define XK_bott 0x9f6 +#define XK_topt 0x9f7 +#define XK_vertbar 0x9f8 +#endif /* XK_SPECIAL */ + +/* + * Publishing + * Byte 3 = a + */ + +#define XK_PUBLISHING +#ifdef XK_PUBLISHING +#define XK_emspace 0xaa1 +#define XK_enspace 0xaa2 +#define XK_em3space 0xaa3 +#define XK_em4space 0xaa4 +#define XK_digitspace 0xaa5 +#define XK_punctspace 0xaa6 +#define XK_thinspace 0xaa7 +#define XK_hairspace 0xaa8 +#define XK_emdash 0xaa9 +#define XK_endash 0xaaa +#define XK_signifblank 0xaac +#define XK_ellipsis 0xaae +#define XK_doubbaselinedot 0xaaf +#define XK_onethird 0xab0 +#define XK_twothirds 0xab1 +#define XK_onefifth 0xab2 +#define XK_twofifths 0xab3 +#define XK_threefifths 0xab4 +#define XK_fourfifths 0xab5 +#define XK_onesixth 0xab6 +#define XK_fivesixths 0xab7 +#define XK_careof 0xab8 +#define XK_figdash 0xabb +#define XK_leftanglebracket 0xabc +#define XK_decimalpoint 0xabd +#define XK_rightanglebracket 0xabe +#define XK_marker 0xabf +#define XK_oneeighth 0xac3 +#define XK_threeeighths 0xac4 +#define XK_fiveeighths 0xac5 +#define XK_seveneighths 0xac6 +#define XK_trademark 0xac9 +#define XK_signaturemark 0xaca +#define XK_trademarkincircle 0xacb +#define XK_leftopentriangle 0xacc +#define XK_rightopentriangle 0xacd +#define XK_emopencircle 0xace +#define XK_emopenrectangle 0xacf +#define XK_leftsinglequotemark 0xad0 +#define XK_rightsinglequotemark 0xad1 +#define XK_leftdoublequotemark 0xad2 +#define XK_rightdoublequotemark 0xad3 +#define XK_prescription 0xad4 +#define XK_minutes 0xad6 +#define XK_seconds 0xad7 +#define XK_latincross 0xad9 +#define XK_hexagram 0xada +#define XK_filledrectbullet 0xadb +#define XK_filledlefttribullet 0xadc +#define XK_filledrighttribullet 0xadd +#define XK_emfilledcircle 0xade +#define XK_emfilledrect 0xadf +#define XK_enopencircbullet 0xae0 +#define XK_enopensquarebullet 0xae1 +#define XK_openrectbullet 0xae2 +#define XK_opentribulletup 0xae3 +#define XK_opentribulletdown 0xae4 +#define XK_openstar 0xae5 +#define XK_enfilledcircbullet 0xae6 +#define XK_enfilledsqbullet 0xae7 +#define XK_filledtribulletup 0xae8 +#define XK_filledtribulletdown 0xae9 +#define XK_leftpointer 0xaea +#define XK_rightpointer 0xaeb +#define XK_club 0xaec +#define XK_diamond 0xaed +#define XK_heart 0xaee +#define XK_maltesecross 0xaf0 +#define XK_dagger 0xaf1 +#define XK_doubledagger 0xaf2 +#define XK_checkmark 0xaf3 +#define XK_ballotcross 0xaf4 +#define XK_musicalsharp 0xaf5 +#define XK_musicalflat 0xaf6 +#define XK_malesymbol 0xaf7 +#define XK_femalesymbol 0xaf8 +#define XK_telephone 0xaf9 +#define XK_telephonerecorder 0xafa +#define XK_phonographcopyright 0xafb +#define XK_caret 0xafc +#define XK_singlelowquotemark 0xafd +#define XK_doublelowquotemark 0xafe +#define XK_cursor 0xaff +#endif /* XK_PUBLISHING */ + +/* + * APL + * Byte 3 = b + */ + +#define XK_APL +#ifdef XK_APL +#define XK_leftcaret 0xba3 +#define XK_rightcaret 0xba6 +#define XK_downcaret 0xba8 +#define XK_upcaret 0xba9 +#define XK_overbar 0xbc0 +#define XK_downtack 0xbc2 +#define XK_upshoe 0xbc3 +#define XK_downstile 0xbc4 +#define XK_underbar 0xbc6 +#define XK_jot 0xbca +#define XK_quad 0xbcc +#define XK_uptack 0xbce +#define XK_circle 0xbcf +#define XK_upstile 0xbd3 +#define XK_downshoe 0xbd6 +#define XK_rightshoe 0xbd8 +#define XK_leftshoe 0xbda +#define XK_lefttack 0xbdc +#define XK_righttack 0xbfc +#endif /* XK_APL */ + +/* + * Hebrew + * Byte 3 = c + */ + +#define XK_HEBREW +#ifdef XK_HEBREW +#define XK_hebrew_doublelowline 0xcdf +#define XK_hebrew_aleph 0xce0 +#define XK_hebrew_bet 0xce1 +#define XK_hebrew_beth 0xce1 /* deprecated */ +#define XK_hebrew_gimel 0xce2 +#define XK_hebrew_gimmel 0xce2 /* deprecated */ +#define XK_hebrew_dalet 0xce3 +#define XK_hebrew_daleth 0xce3 /* deprecated */ +#define XK_hebrew_he 0xce4 +#define XK_hebrew_waw 0xce5 +#define XK_hebrew_zain 0xce6 +#define XK_hebrew_zayin 0xce6 /* deprecated */ +#define XK_hebrew_chet 0xce7 +#define XK_hebrew_het 0xce7 /* deprecated */ +#define XK_hebrew_tet 0xce8 +#define XK_hebrew_teth 0xce8 /* deprecated */ +#define XK_hebrew_yod 0xce9 +#define XK_hebrew_finalkaph 0xcea +#define XK_hebrew_kaph 0xceb +#define XK_hebrew_lamed 0xcec +#define XK_hebrew_finalmem 0xced +#define XK_hebrew_mem 0xcee +#define XK_hebrew_finalnun 0xcef +#define XK_hebrew_nun 0xcf0 +#define XK_hebrew_samech 0xcf1 +#define XK_hebrew_samekh 0xcf1 /* deprecated */ +#define XK_hebrew_ayin 0xcf2 +#define XK_hebrew_finalpe 0xcf3 +#define XK_hebrew_pe 0xcf4 +#define XK_hebrew_finalzade 0xcf5 +#define XK_hebrew_finalzadi 0xcf5 /* deprecated */ +#define XK_hebrew_zade 0xcf6 +#define XK_hebrew_zadi 0xcf6 /* deprecated */ +#define XK_hebrew_qoph 0xcf7 +#define XK_hebrew_kuf 0xcf7 /* deprecated */ +#define XK_hebrew_resh 0xcf8 +#define XK_hebrew_shin 0xcf9 +#define XK_hebrew_taw 0xcfa +#define XK_hebrew_taf 0xcfa /* deprecated */ +#define XK_Hebrew_switch 0xFF7E /* Alias for mode_switch */ +#endif /* XK_HEBREW */ + +/* + * Thai + * Byte 3 = d + */ + +#define XK_THAI +#ifdef XK_THAI +#define XK_Thai_kokai 0xda1 +#define XK_Thai_khokhai 0xda2 +#define XK_Thai_khokhuat 0xda3 +#define XK_Thai_khokhwai 0xda4 +#define XK_Thai_khokhon 0xda5 +#define XK_Thai_khorakhang 0xda6 +#define XK_Thai_ngongu 0xda7 +#define XK_Thai_chochan 0xda8 +#define XK_Thai_choching 0xda9 +#define XK_Thai_chochang 0xdaa +#define XK_Thai_soso 0xdab +#define XK_Thai_chochoe 0xdac +#define XK_Thai_yoying 0xdad +#define XK_Thai_dochada 0xdae +#define XK_Thai_topatak 0xdaf +#define XK_Thai_thothan 0xdb0 +#define XK_Thai_thonangmontho 0xdb1 +#define XK_Thai_thophuthao 0xdb2 +#define XK_Thai_nonen 0xdb3 +#define XK_Thai_dodek 0xdb4 +#define XK_Thai_totao 0xdb5 +#define XK_Thai_thothung 0xdb6 +#define XK_Thai_thothahan 0xdb7 +#define XK_Thai_thothong 0xdb8 +#define XK_Thai_nonu 0xdb9 +#define XK_Thai_bobaimai 0xdba +#define XK_Thai_popla 0xdbb +#define XK_Thai_phophung 0xdbc +#define XK_Thai_fofa 0xdbd +#define XK_Thai_phophan 0xdbe +#define XK_Thai_fofan 0xdbf +#define XK_Thai_phosamphao 0xdc0 +#define XK_Thai_moma 0xdc1 +#define XK_Thai_yoyak 0xdc2 +#define XK_Thai_rorua 0xdc3 +#define XK_Thai_ru 0xdc4 +#define XK_Thai_loling 0xdc5 +#define XK_Thai_lu 0xdc6 +#define XK_Thai_wowaen 0xdc7 +#define XK_Thai_sosala 0xdc8 +#define XK_Thai_sorusi 0xdc9 +#define XK_Thai_sosua 0xdca +#define XK_Thai_hohip 0xdcb +#define XK_Thai_lochula 0xdcc +#define XK_Thai_oang 0xdcd +#define XK_Thai_honokhuk 0xdce +#define XK_Thai_paiyannoi 0xdcf +#define XK_Thai_saraa 0xdd0 +#define XK_Thai_maihanakat 0xdd1 +#define XK_Thai_saraaa 0xdd2 +#define XK_Thai_saraam 0xdd3 +#define XK_Thai_sarai 0xdd4 +#define XK_Thai_saraii 0xdd5 +#define XK_Thai_saraue 0xdd6 +#define XK_Thai_sarauee 0xdd7 +#define XK_Thai_sarau 0xdd8 +#define XK_Thai_sarauu 0xdd9 +#define XK_Thai_phinthu 0xdda +#define XK_Thai_maihanakat_maitho 0xdde +#define XK_Thai_baht 0xddf +#define XK_Thai_sarae 0xde0 +#define XK_Thai_saraae 0xde1 +#define XK_Thai_sarao 0xde2 +#define XK_Thai_saraaimaimuan 0xde3 +#define XK_Thai_saraaimaimalai 0xde4 +#define XK_Thai_lakkhangyao 0xde5 +#define XK_Thai_maiyamok 0xde6 +#define XK_Thai_maitaikhu 0xde7 +#define XK_Thai_maiek 0xde8 +#define XK_Thai_maitho 0xde9 +#define XK_Thai_maitri 0xdea +#define XK_Thai_maichattawa 0xdeb +#define XK_Thai_thanthakhat 0xdec +#define XK_Thai_nikhahit 0xded +#define XK_Thai_leksun 0xdf0 +#define XK_Thai_leknung 0xdf1 +#define XK_Thai_leksong 0xdf2 +#define XK_Thai_leksam 0xdf3 +#define XK_Thai_leksi 0xdf4 +#define XK_Thai_lekha 0xdf5 +#define XK_Thai_lekhok 0xdf6 +#define XK_Thai_lekchet 0xdf7 +#define XK_Thai_lekpaet 0xdf8 +#define XK_Thai_lekkao 0xdf9 +#endif /* XK_THAI */ + +/* + * Korean + * Byte 3 = e + */ + +#define XK_KOREAN +#ifdef XK_KOREAN + +#define XK_Hangul 0xff31 /* Hangul start/stop(toggle) */ +#define XK_Hangul_Start 0xff32 /* Hangul start */ +#define XK_Hangul_End 0xff33 /* Hangul end, English start */ +#define XK_Hangul_Hanja 0xff34 /* Start Hangul->Hanja Conversion */ +#define XK_Hangul_Jamo 0xff35 /* Hangul Jamo mode */ +#define XK_Hangul_Romaja 0xff36 /* Hangul Romaja mode */ +#define XK_Hangul_Codeinput 0xff37 /* Hangul code input mode */ +#define XK_Hangul_Jeonja 0xff38 /* Jeonja mode */ +#define XK_Hangul_Banja 0xff39 /* Banja mode */ +#define XK_Hangul_PreHanja 0xff3a /* Pre Hanja conversion */ +#define XK_Hangul_PostHanja 0xff3b /* Post Hanja conversion */ +#define XK_Hangul_SingleCandidate 0xff3c /* Single candidate */ +#define XK_Hangul_MultipleCandidate 0xff3d /* Multiple candidate */ +#define XK_Hangul_PreviousCandidate 0xff3e /* Previous candidate */ +#define XK_Hangul_Special 0xff3f /* Special symbols */ +#define XK_Hangul_switch 0xFF7E /* Alias for mode_switch */ + +/* Hangul Consonant Characters */ +#define XK_Hangul_Kiyeog 0xea1 +#define XK_Hangul_SsangKiyeog 0xea2 +#define XK_Hangul_KiyeogSios 0xea3 +#define XK_Hangul_Nieun 0xea4 +#define XK_Hangul_NieunJieuj 0xea5 +#define XK_Hangul_NieunHieuh 0xea6 +#define XK_Hangul_Dikeud 0xea7 +#define XK_Hangul_SsangDikeud 0xea8 +#define XK_Hangul_Rieul 0xea9 +#define XK_Hangul_RieulKiyeog 0xeaa +#define XK_Hangul_RieulMieum 0xeab +#define XK_Hangul_RieulPieub 0xeac +#define XK_Hangul_RieulSios 0xead +#define XK_Hangul_RieulTieut 0xeae +#define XK_Hangul_RieulPhieuf 0xeaf +#define XK_Hangul_RieulHieuh 0xeb0 +#define XK_Hangul_Mieum 0xeb1 +#define XK_Hangul_Pieub 0xeb2 +#define XK_Hangul_SsangPieub 0xeb3 +#define XK_Hangul_PieubSios 0xeb4 +#define XK_Hangul_Sios 0xeb5 +#define XK_Hangul_SsangSios 0xeb6 +#define XK_Hangul_Ieung 0xeb7 +#define XK_Hangul_Jieuj 0xeb8 +#define XK_Hangul_SsangJieuj 0xeb9 +#define XK_Hangul_Cieuc 0xeba +#define XK_Hangul_Khieuq 0xebb +#define XK_Hangul_Tieut 0xebc +#define XK_Hangul_Phieuf 0xebd +#define XK_Hangul_Hieuh 0xebe + +/* Hangul Vowel Characters */ +#define XK_Hangul_A 0xebf +#define XK_Hangul_AE 0xec0 +#define XK_Hangul_YA 0xec1 +#define XK_Hangul_YAE 0xec2 +#define XK_Hangul_EO 0xec3 +#define XK_Hangul_E 0xec4 +#define XK_Hangul_YEO 0xec5 +#define XK_Hangul_YE 0xec6 +#define XK_Hangul_O 0xec7 +#define XK_Hangul_WA 0xec8 +#define XK_Hangul_WAE 0xec9 +#define XK_Hangul_OE 0xeca +#define XK_Hangul_YO 0xecb +#define XK_Hangul_U 0xecc +#define XK_Hangul_WEO 0xecd +#define XK_Hangul_WE 0xece +#define XK_Hangul_WI 0xecf +#define XK_Hangul_YU 0xed0 +#define XK_Hangul_EU 0xed1 +#define XK_Hangul_YI 0xed2 +#define XK_Hangul_I 0xed3 + +/* Hangul syllable-final (JongSeong) Characters */ +#define XK_Hangul_J_Kiyeog 0xed4 +#define XK_Hangul_J_SsangKiyeog 0xed5 +#define XK_Hangul_J_KiyeogSios 0xed6 +#define XK_Hangul_J_Nieun 0xed7 +#define XK_Hangul_J_NieunJieuj 0xed8 +#define XK_Hangul_J_NieunHieuh 0xed9 +#define XK_Hangul_J_Dikeud 0xeda +#define XK_Hangul_J_Rieul 0xedb +#define XK_Hangul_J_RieulKiyeog 0xedc +#define XK_Hangul_J_RieulMieum 0xedd +#define XK_Hangul_J_RieulPieub 0xede +#define XK_Hangul_J_RieulSios 0xedf +#define XK_Hangul_J_RieulTieut 0xee0 +#define XK_Hangul_J_RieulPhieuf 0xee1 +#define XK_Hangul_J_RieulHieuh 0xee2 +#define XK_Hangul_J_Mieum 0xee3 +#define XK_Hangul_J_Pieub 0xee4 +#define XK_Hangul_J_PieubSios 0xee5 +#define XK_Hangul_J_Sios 0xee6 +#define XK_Hangul_J_SsangSios 0xee7 +#define XK_Hangul_J_Ieung 0xee8 +#define XK_Hangul_J_Jieuj 0xee9 +#define XK_Hangul_J_Cieuc 0xeea +#define XK_Hangul_J_Khieuq 0xeeb +#define XK_Hangul_J_Tieut 0xeec +#define XK_Hangul_J_Phieuf 0xeed +#define XK_Hangul_J_Hieuh 0xeee + +/* Ancient Hangul Consonant Characters */ +#define XK_Hangul_RieulYeorinHieuh 0xeef +#define XK_Hangul_SunkyeongeumMieum 0xef0 +#define XK_Hangul_SunkyeongeumPieub 0xef1 +#define XK_Hangul_PanSios 0xef2 +#define XK_Hangul_KkogjiDalrinIeung 0xef3 +#define XK_Hangul_SunkyeongeumPhieuf 0xef4 +#define XK_Hangul_YeorinHieuh 0xef5 + +/* Ancient Hangul Vowel Characters */ +#define XK_Hangul_AraeA 0xef6 +#define XK_Hangul_AraeAE 0xef7 + +/* Ancient Hangul syllable-final (JongSeong) Characters */ +#define XK_Hangul_J_PanSios 0xef8 +#define XK_Hangul_J_KkogjiDalrinIeung 0xef9 +#define XK_Hangul_J_YeorinHieuh 0xefa + +/* Korean currency symbol */ +#define XK_Korean_Won 0xeff + +#endif /* XK_KOREAN */ + +/* + * Armenian + * Byte 3 = 0x14 + */ + +#define XK_ARMENIAN +#ifdef XK_ARMENIAN +#define XK_Armenian_eternity 0x14a1 +#define XK_Armenian_ligature_ew 0x14a2 +#define XK_Armenian_full_stop 0x14a3 +#define XK_Armenian_verjaket 0x14a3 +#define XK_Armenian_parenright 0x14a4 +#define XK_Armenian_parenleft 0x14a5 +#define XK_Armenian_guillemotright 0x14a6 +#define XK_Armenian_guillemotleft 0x14a7 +#define XK_Armenian_em_dash 0x14a8 +#define XK_Armenian_dot 0x14a9 +#define XK_Armenian_mijaket 0x14a9 +#define XK_Armenian_separation_mark 0x14aa +#define XK_Armenian_but 0x14aa +#define XK_Armenian_comma 0x14ab +#define XK_Armenian_en_dash 0x14ac +#define XK_Armenian_hyphen 0x14ad +#define XK_Armenian_yentamna 0x14ad +#define XK_Armenian_ellipsis 0x14ae +#define XK_Armenian_exclam 0x14af +#define XK_Armenian_amanak 0x14af +#define XK_Armenian_accent 0x14b0 +#define XK_Armenian_shesht 0x14b0 +#define XK_Armenian_question 0x14b1 +#define XK_Armenian_paruyk 0x14b1 +#define XK_Armenian_AYB 0x14b2 +#define XK_Armenian_ayb 0x14b3 +#define XK_Armenian_BEN 0x14b4 +#define XK_Armenian_ben 0x14b5 +#define XK_Armenian_GIM 0x14b6 +#define XK_Armenian_gim 0x14b7 +#define XK_Armenian_DA 0x14b8 +#define XK_Armenian_da 0x14b9 +#define XK_Armenian_YECH 0x14ba +#define XK_Armenian_yech 0x14bb +#define XK_Armenian_ZA 0x14bc +#define XK_Armenian_za 0x14bd +#define XK_Armenian_E 0x14be +#define XK_Armenian_e 0x14bf +#define XK_Armenian_AT 0x14c0 +#define XK_Armenian_at 0x14c1 +#define XK_Armenian_TO 0x14c2 +#define XK_Armenian_to 0x14c3 +#define XK_Armenian_ZHE 0x14c4 +#define XK_Armenian_zhe 0x14c5 +#define XK_Armenian_INI 0x14c6 +#define XK_Armenian_ini 0x14c7 +#define XK_Armenian_LYUN 0x14c8 +#define XK_Armenian_lyun 0x14c9 +#define XK_Armenian_KHE 0x14ca +#define XK_Armenian_khe 0x14cb +#define XK_Armenian_TSA 0x14cc +#define XK_Armenian_tsa 0x14cd +#define XK_Armenian_KEN 0x14ce +#define XK_Armenian_ken 0x14cf +#define XK_Armenian_HO 0x14d0 +#define XK_Armenian_ho 0x14d1 +#define XK_Armenian_DZA 0x14d2 +#define XK_Armenian_dza 0x14d3 +#define XK_Armenian_GHAT 0x14d4 +#define XK_Armenian_ghat 0x14d5 +#define XK_Armenian_TCHE 0x14d6 +#define XK_Armenian_tche 0x14d7 +#define XK_Armenian_MEN 0x14d8 +#define XK_Armenian_men 0x14d9 +#define XK_Armenian_HI 0x14da +#define XK_Armenian_hi 0x14db +#define XK_Armenian_NU 0x14dc +#define XK_Armenian_nu 0x14dd +#define XK_Armenian_SHA 0x14de +#define XK_Armenian_sha 0x14df +#define XK_Armenian_VO 0x14e0 +#define XK_Armenian_vo 0x14e1 +#define XK_Armenian_CHA 0x14e2 +#define XK_Armenian_cha 0x14e3 +#define XK_Armenian_PE 0x14e4 +#define XK_Armenian_pe 0x14e5 +#define XK_Armenian_JE 0x14e6 +#define XK_Armenian_je 0x14e7 +#define XK_Armenian_RA 0x14e8 +#define XK_Armenian_ra 0x14e9 +#define XK_Armenian_SE 0x14ea +#define XK_Armenian_se 0x14eb +#define XK_Armenian_VEV 0x14ec +#define XK_Armenian_vev 0x14ed +#define XK_Armenian_TYUN 0x14ee +#define XK_Armenian_tyun 0x14ef +#define XK_Armenian_RE 0x14f0 +#define XK_Armenian_re 0x14f1 +#define XK_Armenian_TSO 0x14f2 +#define XK_Armenian_tso 0x14f3 +#define XK_Armenian_VYUN 0x14f4 +#define XK_Armenian_vyun 0x14f5 +#define XK_Armenian_PYUR 0x14f6 +#define XK_Armenian_pyur 0x14f7 +#define XK_Armenian_KE 0x14f8 +#define XK_Armenian_ke 0x14f9 +#define XK_Armenian_O 0x14fa +#define XK_Armenian_o 0x14fb +#define XK_Armenian_FE 0x14fc +#define XK_Armenian_fe 0x14fd +#define XK_Armenian_apostrophe 0x14fe +#define XK_Armenian_section_sign 0x14ff +#endif /* XK_ARMENIAN */ + +/* + * Georgian + * Byte 3 = 0x15 + */ + +#define XK_GEORGIAN +#ifdef XK_GEORGIAN +#define XK_Georgian_an 0x15d0 +#define XK_Georgian_ban 0x15d1 +#define XK_Georgian_gan 0x15d2 +#define XK_Georgian_don 0x15d3 +#define XK_Georgian_en 0x15d4 +#define XK_Georgian_vin 0x15d5 +#define XK_Georgian_zen 0x15d6 +#define XK_Georgian_tan 0x15d7 +#define XK_Georgian_in 0x15d8 +#define XK_Georgian_kan 0x15d9 +#define XK_Georgian_las 0x15da +#define XK_Georgian_man 0x15db +#define XK_Georgian_nar 0x15dc +#define XK_Georgian_on 0x15dd +#define XK_Georgian_par 0x15de +#define XK_Georgian_zhar 0x15df +#define XK_Georgian_rae 0x15e0 +#define XK_Georgian_san 0x15e1 +#define XK_Georgian_tar 0x15e2 +#define XK_Georgian_un 0x15e3 +#define XK_Georgian_phar 0x15e4 +#define XK_Georgian_khar 0x15e5 +#define XK_Georgian_ghan 0x15e6 +#define XK_Georgian_qar 0x15e7 +#define XK_Georgian_shin 0x15e8 +#define XK_Georgian_chin 0x15e9 +#define XK_Georgian_can 0x15ea +#define XK_Georgian_jil 0x15eb +#define XK_Georgian_cil 0x15ec +#define XK_Georgian_char 0x15ed +#define XK_Georgian_xan 0x15ee +#define XK_Georgian_jhan 0x15ef +#define XK_Georgian_hae 0x15f0 +#define XK_Georgian_he 0x15f1 +#define XK_Georgian_hie 0x15f2 +#define XK_Georgian_we 0x15f3 +#define XK_Georgian_har 0x15f4 +#define XK_Georgian_hoe 0x15f5 +#define XK_Georgian_fi 0x15f6 +#endif /* XK_GEORGIAN */ + +/* + * Azeri (and other Turkic or Caucasian languages of ex-USSR) + * Byte 3 = 0x16 + */ + +#define XK_CAUCASUS +#ifdef XK_CAUCASUS +/* latin */ +#define XK_Ccedillaabovedot 0x16a2 +#define XK_Xabovedot 0x16a3 +#define XK_Qabovedot 0x16a5 +#define XK_Ibreve 0x16a6 +#define XK_IE 0x16a7 +#define XK_UO 0x16a8 +#define XK_Zstroke 0x16a9 +#define XK_Gcaron 0x16aa +#define XK_Obarred 0x16af +#define XK_ccedillaabovedot 0x16b2 +#define XK_xabovedot 0x16b3 +#define XK_Ocaron 0x16b4 +#define XK_qabovedot 0x16b5 +#define XK_ibreve 0x16b6 +#define XK_ie 0x16b7 +#define XK_uo 0x16b8 +#define XK_zstroke 0x16b9 +#define XK_gcaron 0x16ba +#define XK_ocaron 0x16bd +#define XK_obarred 0x16bf +#define XK_SCHWA 0x16c6 +#define XK_schwa 0x16f6 +/* those are not really Caucasus, but I put them here for now */ +/* For Inupiak */ +#define XK_Lbelowdot 0x16d1 +#define XK_Lstrokebelowdot 0x16d2 +#define XK_lbelowdot 0x16e1 +#define XK_lstrokebelowdot 0x16e2 +/* For Guarani */ +#define XK_Gtilde 0x16d3 +#define XK_gtilde 0x16e3 +#endif /* XK_CAUCASUS */ + +/* + * Vietnamese + * Byte 3 = 0x1e + */ + +#define XK_VIETNAMESE +#ifdef XK_VIETNAMESE +#define XK_Abelowdot 0x1ea0 +#define XK_abelowdot 0x1ea1 +#define XK_Ahook 0x1ea2 +#define XK_ahook 0x1ea3 +#define XK_Acircumflexacute 0x1ea4 +#define XK_acircumflexacute 0x1ea5 +#define XK_Acircumflexgrave 0x1ea6 +#define XK_acircumflexgrave 0x1ea7 +#define XK_Acircumflexhook 0x1ea8 +#define XK_acircumflexhook 0x1ea9 +#define XK_Acircumflextilde 0x1eaa +#define XK_acircumflextilde 0x1eab +#define XK_Acircumflexbelowdot 0x1eac +#define XK_acircumflexbelowdot 0x1ead +#define XK_Abreveacute 0x1eae +#define XK_abreveacute 0x1eaf +#define XK_Abrevegrave 0x1eb0 +#define XK_abrevegrave 0x1eb1 +#define XK_Abrevehook 0x1eb2 +#define XK_abrevehook 0x1eb3 +#define XK_Abrevetilde 0x1eb4 +#define XK_abrevetilde 0x1eb5 +#define XK_Abrevebelowdot 0x1eb6 +#define XK_abrevebelowdot 0x1eb7 +#define XK_Ebelowdot 0x1eb8 +#define XK_ebelowdot 0x1eb9 +#define XK_Ehook 0x1eba +#define XK_ehook 0x1ebb +#define XK_Etilde 0x1ebc +#define XK_etilde 0x1ebd +#define XK_Ecircumflexacute 0x1ebe +#define XK_ecircumflexacute 0x1ebf +#define XK_Ecircumflexgrave 0x1ec0 +#define XK_ecircumflexgrave 0x1ec1 +#define XK_Ecircumflexhook 0x1ec2 +#define XK_ecircumflexhook 0x1ec3 +#define XK_Ecircumflextilde 0x1ec4 +#define XK_ecircumflextilde 0x1ec5 +#define XK_Ecircumflexbelowdot 0x1ec6 +#define XK_ecircumflexbelowdot 0x1ec7 +#define XK_Ihook 0x1ec8 +#define XK_ihook 0x1ec9 +#define XK_Ibelowdot 0x1eca +#define XK_ibelowdot 0x1ecb +#define XK_Obelowdot 0x1ecc +#define XK_obelowdot 0x1ecd +#define XK_Ohook 0x1ece +#define XK_ohook 0x1ecf +#define XK_Ocircumflexacute 0x1ed0 +#define XK_ocircumflexacute 0x1ed1 +#define XK_Ocircumflexgrave 0x1ed2 +#define XK_ocircumflexgrave 0x1ed3 +#define XK_Ocircumflexhook 0x1ed4 +#define XK_ocircumflexhook 0x1ed5 +#define XK_Ocircumflextilde 0x1ed6 +#define XK_ocircumflextilde 0x1ed7 +#define XK_Ocircumflexbelowdot 0x1ed8 +#define XK_ocircumflexbelowdot 0x1ed9 +#define XK_Ohornacute 0x1eda +#define XK_ohornacute 0x1edb +#define XK_Ohorngrave 0x1edc +#define XK_ohorngrave 0x1edd +#define XK_Ohornhook 0x1ede +#define XK_ohornhook 0x1edf +#define XK_Ohorntilde 0x1ee0 +#define XK_ohorntilde 0x1ee1 +#define XK_Ohornbelowdot 0x1ee2 +#define XK_ohornbelowdot 0x1ee3 +#define XK_Ubelowdot 0x1ee4 +#define XK_ubelowdot 0x1ee5 +#define XK_Uhook 0x1ee6 +#define XK_uhook 0x1ee7 +#define XK_Uhornacute 0x1ee8 +#define XK_uhornacute 0x1ee9 +#define XK_Uhorngrave 0x1eea +#define XK_uhorngrave 0x1eeb +#define XK_Uhornhook 0x1eec +#define XK_uhornhook 0x1eed +#define XK_Uhorntilde 0x1eee +#define XK_uhorntilde 0x1eef +#define XK_Uhornbelowdot 0x1ef0 +#define XK_uhornbelowdot 0x1ef1 +#define XK_Ybelowdot 0x1ef4 +#define XK_ybelowdot 0x1ef5 +#define XK_Yhook 0x1ef6 +#define XK_yhook 0x1ef7 +#define XK_Ytilde 0x1ef8 +#define XK_ytilde 0x1ef9 +#define XK_Ohorn 0x1efa /* U+01a0 */ +#define XK_ohorn 0x1efb /* U+01a1 */ +#define XK_Uhorn 0x1efc /* U+01af */ +#define XK_uhorn 0x1efd /* U+01b0 */ + +#define XK_combining_tilde 0x1e9f /* U+0303 */ +#define XK_combining_grave 0x1ef2 /* U+0300 */ +#define XK_combining_acute 0x1ef3 /* U+0301 */ +#define XK_combining_hook 0x1efe /* U+0309 */ +#define XK_combining_belowdot 0x1eff /* U+0323 */ +#endif /* XK_VIETNAMESE */ + +#define XK_CURRENCY +#ifdef XK_CURRENCY +#define XK_EcuSign 0x20a0 +#define XK_ColonSign 0x20a1 +#define XK_CruzeiroSign 0x20a2 +#define XK_FFrancSign 0x20a3 +#define XK_LiraSign 0x20a4 +#define XK_MillSign 0x20a5 +#define XK_NairaSign 0x20a6 +#define XK_PesetaSign 0x20a7 +#define XK_RupeeSign 0x20a8 +#define XK_WonSign 0x20a9 +#define XK_NewSheqelSign 0x20aa +#define XK_DongSign 0x20ab +#define XK_EuroSign 0x20ac +#endif + +void +XConvertCase(sym, lower, upper) + register int sym; + int *lower; + int *upper; +{ + *lower = sym; + *upper = sym; + switch(sym >> 8) { + case 0: /* Latin 1 */ + if ((sym >= XK_A) && (sym <= XK_Z)) + *lower += (XK_a - XK_A); + else if ((sym >= XK_a) && (sym <= XK_z)) + *upper -= (XK_a - XK_A); + else if ((sym >= XK_Agrave) && (sym <= XK_Odiaeresis)) + *lower += (XK_agrave - XK_Agrave); + else if ((sym >= XK_agrave) && (sym <= XK_odiaeresis)) + *upper -= (XK_agrave - XK_Agrave); + else if ((sym >= XK_Ooblique) && (sym <= XK_Thorn)) + *lower += (XK_oslash - XK_Ooblique); + else if ((sym >= XK_oslash) && (sym <= XK_thorn)) + *upper -= (XK_oslash - XK_Ooblique); + break; + case 1: /* Latin 2 */ + /* Assume the KeySym is a legal value (ignore discontinuities) */ + if (sym == XK_Aogonek) + *lower = XK_aogonek; + else if (sym >= XK_Lstroke && sym <= XK_Sacute) + *lower += (XK_lstroke - XK_Lstroke); + else if (sym >= XK_Scaron && sym <= XK_Zacute) + *lower += (XK_scaron - XK_Scaron); + else if (sym >= XK_Zcaron && sym <= XK_Zabovedot) + *lower += (XK_zcaron - XK_Zcaron); + else if (sym == XK_aogonek) + *upper = XK_Aogonek; + else if (sym >= XK_lstroke && sym <= XK_sacute) + *upper -= (XK_lstroke - XK_Lstroke); + else if (sym >= XK_scaron && sym <= XK_zacute) + *upper -= (XK_scaron - XK_Scaron); + else if (sym >= XK_zcaron && sym <= XK_zabovedot) + *upper -= (XK_zcaron - XK_Zcaron); + else if (sym >= XK_Racute && sym <= XK_Tcedilla) + *lower += (XK_racute - XK_Racute); + else if (sym >= XK_racute && sym <= XK_tcedilla) + *upper -= (XK_racute - XK_Racute); + break; + case 2: /* Latin 3 */ + /* Assume the KeySym is a legal value (ignore discontinuities) */ + if (sym >= XK_Hstroke && sym <= XK_Hcircumflex) + *lower += (XK_hstroke - XK_Hstroke); + else if (sym >= XK_Gbreve && sym <= XK_Jcircumflex) + *lower += (XK_gbreve - XK_Gbreve); + else if (sym >= XK_hstroke && sym <= XK_hcircumflex) + *upper -= (XK_hstroke - XK_Hstroke); + else if (sym >= XK_gbreve && sym <= XK_jcircumflex) + *upper -= (XK_gbreve - XK_Gbreve); + else if (sym >= XK_Cabovedot && sym <= XK_Scircumflex) + *lower += (XK_cabovedot - XK_Cabovedot); + else if (sym >= XK_cabovedot && sym <= XK_scircumflex) + *upper -= (XK_cabovedot - XK_Cabovedot); + break; + case 3: /* Latin 4 */ + /* Assume the KeySym is a legal value (ignore discontinuities) */ + if (sym >= XK_Rcedilla && sym <= XK_Tslash) + *lower += (XK_rcedilla - XK_Rcedilla); + else if (sym >= XK_rcedilla && sym <= XK_tslash) + *upper -= (XK_rcedilla - XK_Rcedilla); + else if (sym == XK_ENG) + *lower = XK_eng; + else if (sym == XK_eng) + *upper = XK_ENG; + else if (sym >= XK_Amacron && sym <= XK_Umacron) + *lower += (XK_amacron - XK_Amacron); + else if (sym >= XK_amacron && sym <= XK_umacron) + *upper -= (XK_amacron - XK_Amacron); + break; + case 6: /* Cyrillic */ + /* Assume the KeySym is a legal value (ignore discontinuities) */ + if (sym >= XK_Serbian_DJE && sym <= XK_Serbian_DZE) + *lower -= (XK_Serbian_DJE - XK_Serbian_dje); + else if (sym >= XK_Serbian_dje && sym <= XK_Serbian_dze) + *upper += (XK_Serbian_DJE - XK_Serbian_dje); + else if (sym >= XK_Cyrillic_YU && sym <= XK_Cyrillic_HARDSIGN) + *lower -= (XK_Cyrillic_YU - XK_Cyrillic_yu); + else if (sym >= XK_Cyrillic_yu && sym <= XK_Cyrillic_hardsign) + *upper += (XK_Cyrillic_YU - XK_Cyrillic_yu); + break; + case 7: /* Greek */ + /* Assume the KeySym is a legal value (ignore discontinuities) */ + if (sym >= XK_Greek_ALPHAaccent && sym <= XK_Greek_OMEGAaccent) + *lower += (XK_Greek_alphaaccent - XK_Greek_ALPHAaccent); + else if (sym >= XK_Greek_alphaaccent && sym <= XK_Greek_omegaaccent && + sym != XK_Greek_iotaaccentdieresis && + sym != XK_Greek_upsilonaccentdieresis) + *upper -= (XK_Greek_alphaaccent - XK_Greek_ALPHAaccent); + else if (sym >= XK_Greek_ALPHA && sym <= XK_Greek_OMEGA) + *lower += (XK_Greek_alpha - XK_Greek_ALPHA); + else if (sym >= XK_Greek_alpha && sym <= XK_Greek_omega && + sym != XK_Greek_finalsmallsigma) + *upper -= (XK_Greek_alpha - XK_Greek_ALPHA); + break; + } +} + diff --git a/packet-x11.c b/packet-x11.c index 7ae20795c0..5ca7139bd6 100644 --- a/packet-x11.c +++ b/packet-x11.c @@ -1,8 +1,9 @@ /* packet-x11.c * Routines for X11 dissection * Copyright 2000, Christophe Tronche <ch.tronche@computer.org> + * Copyright 2003, Michael Shuldman * - * $Id: packet-x11.c,v 1.47 2003/09/21 20:06:01 gerald Exp $ + * $Id: packet-x11.c,v 1.48 2004/01/02 12:52:45 obiot Exp $ * * Ethereal - Network traffic analyzer * By Gerald Combs <gerald@ethereal.com> @@ -65,9 +66,81 @@ #include "prefs.h" #include "packet-frame.h" +#include "packet-x11-keysymdef.h" #define cVALS(x) (const value_string*)(x) +/* + * Data structure associated with a conversation; keeps track of the + * request for which we're expecting a reply, the frame number of + * the initial connection request, and the byte order of the connection. + * + * An opcode of -3 means we haven't yet seen any requests yet. + * An opcode of -2 means we're not expecting a reply. + * An opcode of -1 means means we're waiting for a reply to the initial + * connection request. + * Other values are the opcode of the request for which we're expecting + * a reply. + * + */ +#define NOTHING_SEEN -3 +#define NOTHING_EXPECTED -2 +#define INITIAL_CONN -1 + +#define BYTE_ORDER_BE 0 +#define BYTE_ORDER_LE 1 +#define BYTE_ORDER_UNKNOWN -1 + +static const char *modifiers[] = { + "Shift", + "Lock", + "Control", + "Mod1", + "Mod2", + "Mod3", + "Mod4", + "Mod5" +}; + +/* Keymasks. From <X11/X.h>. */ +#define ShiftMask (1<<0) +#define LockMask (1<<1) +#define ControlMask (1<<2) +#define Mod1Mask (1<<3) +#define Mod2Mask (1<<4) +#define Mod3Mask (1<<5) +#define Mod4Mask (1<<6) +#define Mod5Mask (1<<7) + +static const int modifiermask[] = { ShiftMask, LockMask, ControlMask, +Mod1Mask, Mod2Mask, Mod3Mask, Mod4Mask, Mod5Mask }; + +/* from <X11/X.h> */ +#define NoSymbol 0L /* special KeySym */ + +typedef struct { + GHashTable *seqtable; /* hashtable of sequncenumber <-> opcode. */ + int sequencenumber; /* sequencenumber of current packet. */ + guint32 iconn_frame; /* frame # of initial connection request */ + guint32 iconn_reply; /* frame # of initial connection reply */ + int byte_order; /* byte order of connection */ + + int *keycodemap[256]; /* keycode to keysymvalue map. */ + int keysyms_per_keycode; + int first_keycode; + int *modifiermap[array_length(modifiers)];/* modifier to keycode. */ + int keycodes_per_modifier; + + union { + struct { + int first_keycode; + } GetKeyboardMapping; + } request; +} x11_conv_data_t; + +static GMemChunk *x11_state_chunk = NULL; + + /* Initialize the protocol and registered fields */ static int proto_x11 = -1; @@ -129,6 +202,12 @@ static const value_string byte_order_vals[] = { { 0, NULL } }; +static const value_string image_byte_order_vals[] = { + { 0, "LSBFirst" }, + { 1, "MSBFirst" }, + { 0, NULL } +}; + static const value_string access_mode_vals[] = { { 0, "Disable" }, { 1, "Enable" }, @@ -412,128 +491,378 @@ static const value_string on_off_vals[] = { { 0, NULL } }; +/* Requestcodes. From <X11/Xproto.h>. */ +#define X_CreateWindow 1 +#define X_ChangeWindowAttributes 2 +#define X_GetWindowAttributes 3 +#define X_DestroyWindow 4 +#define X_DestroySubwindows 5 +#define X_ChangeSaveSet 6 +#define X_ReparentWindow 7 +#define X_MapWindow 8 +#define X_MapSubwindows 9 +#define X_UnmapWindow 10 +#define X_UnmapSubwindows 11 +#define X_ConfigureWindow 12 +#define X_CirculateWindow 13 +#define X_GetGeometry 14 +#define X_QueryTree 15 +#define X_InternAtom 16 +#define X_GetAtomName 17 +#define X_ChangeProperty 18 +#define X_DeleteProperty 19 +#define X_GetProperty 20 +#define X_ListProperties 21 +#define X_SetSelectionOwner 22 +#define X_GetSelectionOwner 23 +#define X_ConvertSelection 24 +#define X_SendEvent 25 +#define X_GrabPointer 26 +#define X_UngrabPointer 27 +#define X_GrabButton 28 +#define X_UngrabButton 29 +#define X_ChangeActivePointerGrab 30 +#define X_GrabKeyboard 31 +#define X_UngrabKeyboard 32 +#define X_GrabKey 33 +#define X_UngrabKey 34 +#define X_AllowEvents 35 +#define X_GrabServer 36 +#define X_UngrabServer 37 +#define X_QueryPointer 38 +#define X_GetMotionEvents 39 +#define X_TranslateCoords 40 +#define X_WarpPointer 41 +#define X_SetInputFocus 42 +#define X_GetInputFocus 43 +#define X_QueryKeymap 44 +#define X_OpenFont 45 +#define X_CloseFont 46 +#define X_QueryFont 47 +#define X_QueryTextExtents 48 +#define X_ListFonts 49 +#define X_ListFontsWithInfo 50 +#define X_SetFontPath 51 +#define X_GetFontPath 52 +#define X_CreatePixmap 53 +#define X_FreePixmap 54 +#define X_CreateGC 55 +#define X_ChangeGC 56 +#define X_CopyGC 57 +#define X_SetDashes 58 +#define X_SetClipRectangles 59 +#define X_FreeGC 60 +#define X_ClearArea 61 +#define X_CopyArea 62 +#define X_CopyPlane 63 +#define X_PolyPoint 64 +#define X_PolyLine 65 +#define X_PolySegment 66 +#define X_PolyRectangle 67 +#define X_PolyArc 68 +#define X_FillPoly 69 +#define X_PolyFillRectangle 70 +#define X_PolyFillArc 71 +#define X_PutImage 72 +#define X_GetImage 73 +#define X_PolyText8 74 +#define X_PolyText16 75 +#define X_ImageText8 76 +#define X_ImageText16 77 +#define X_CreateColormap 78 +#define X_FreeColormap 79 +#define X_CopyColormapAndFree 80 +#define X_InstallColormap 81 +#define X_UninstallColormap 82 +#define X_ListInstalledColormaps 83 +#define X_AllocColor 84 +#define X_AllocNamedColor 85 +#define X_AllocColorCells 86 +#define X_AllocColorPlanes 87 +#define X_FreeColors 88 +#define X_StoreColors 89 +#define X_StoreNamedColor 90 +#define X_QueryColors 91 +#define X_LookupColor 92 +#define X_CreateCursor 93 +#define X_CreateGlyphCursor 94 +#define X_FreeCursor 95 +#define X_RecolorCursor 96 +#define X_QueryBestSize 97 +#define X_QueryExtension 98 +#define X_ListExtensions 99 +#define X_ChangeKeyboardMapping 100 +#define X_GetKeyboardMapping 101 +#define X_ChangeKeyboardControl 102 +#define X_GetKeyboardControl 103 +#define X_Bell 104 +#define X_ChangePointerControl 105 +#define X_GetPointerControl 106 +#define X_SetScreenSaver 107 +#define X_GetScreenSaver 108 +#define X_ChangeHosts 109 +#define X_ListHosts 110 +#define X_SetAccessControl 111 +#define X_SetCloseDownMode 112 +#define X_KillClient 113 +#define X_RotateProperties 114 +#define X_ForceScreenSaver 115 +#define X_SetPointerMapping 116 +#define X_GetPointerMapping 117 +#define X_SetModifierMapping 118 +#define X_GetModifierMapping 119 +#define X_NoOperation 127 + static const value_string opcode_vals[] = { - { 1, "CreateWindow" }, - { 2, "ChangeWindowAttributes" }, - { 3, "GetWindowAttributes" }, - { 4, "DestroyWindow" }, - { 5, "DestroySubwindows" }, - { 6, "ChangeSaveSet" }, - { 7, "ReparentWindow" }, - { 8, "MapWindow" }, - { 9, "MapSubwindows" }, - { 10, "UnmapWindow" }, - { 11, "UnmapSubwindows" }, - { 12, "ConfigureWindow" }, - { 13, "CirculateWindow" }, - { 14, "GetGeometry" }, - { 15, "QueryTree" }, - { 16, "InternAtom" }, - { 17, "GetAtomName" }, - { 18, "ChangeProperty" }, - { 19, "DeleteProperty" }, - { 20, "GetProperty" }, - { 21, "ListProperties" }, - { 22, "SetSelectionOwner" }, - { 23, "GetSelectionOwner" }, - { 24, "ConvertSelection" }, - - { 26, "GrabPointer" }, - { 27, "UngrabPointer" }, - { 28, "GrabButton" }, - { 29, "UngrabButton" }, - { 30, "ChangeActivePointerGrab" }, - { 31, "GrabKeyboard" }, - { 32, "UngrabKeyboard" }, - { 33, "GrabKey" }, - { 34, "UngrabKey" }, - { 35, "AllowEvents" }, - { 36, "GrabServer" }, - { 37, "UngrabServer" }, - { 38, "QueryPointer" }, - { 39, "GetMotionEvents" }, - { 40, "TranslateCoordinates" }, - { 41, "WarpPointer" }, - { 42, "SetInputFocus" }, - { 43, "GetInputFocus" }, - { 44, "QueryKeymap" }, - { 45, "OpenFont" }, - { 46, "CloseFont" }, - { 47, "QueryFont" }, - { 48, "QueryTextExtents" }, - { 49, "ListFonts" }, - { 50, "ListFontsWithInfo" }, - { 51, "SetFontPath" }, - { 52, "GetFontPath" }, - { 53, "CreatePixmap" }, - { 54, "FreePixmap" }, - { 55, "CreateGC" }, - { 56, "ChangeGC" }, - { 57, "CopyGC" }, - { 58, "SetDashes" }, - { 59, "SetClipRectangles" }, - { 60, "FreeGC" }, - { 61, "ClearArea" }, - { 62, "CopyArea" }, - { 63, "CopyPlane" }, - { 64, "PolyPoint" }, - { 65, "PolyLine" }, - { 66, "PolySegment" }, - { 67, "PolyRectangle" }, - { 68, "PolyArc" }, - { 69, "FillPoly" }, - { 70, "PolyFillRectangle" }, - { 71, "PolyFillArc" }, - { 72, "PutImage" }, - { 73, "GetImage" }, - { 74, "PolyText8" }, - { 75, "PolyText16" }, - { 76, "ImageText8" }, - { 77, "ImageText16" }, - { 78, "CreateColormap" }, - { 79, "FreeColormap" }, - { 80, "CopyColormapAndFree" }, - { 81, "InstallColormap" }, - { 82, "UninstallColormap" }, - { 83, "ListInstalledColormaps" }, - { 84, "AllocColor" }, - { 85, "AllocNamedColor" }, - { 86, "AllocColorCells" }, - { 87, "AllocColorPlanes" }, - { 88, "FreeColors" }, - { 89, "StoreColors" }, - { 90, "StoreNamedColor" }, - { 91, "QueryColors" }, - { 92, "LookupColor" }, - { 93, "CreateCursor" }, - { 94, "CreateGlyphCursor" }, - { 95, "FreeCursor" }, - { 96, "RecolorCursor" }, - { 97, "QueryBestSize" }, - { 98, "QueryExtension" }, - { 99, "ListExtensions" }, - { 100, "ChangeKeyboardMapping" }, - { 101, "GetKeyboardMapping" }, - { 102, "ChangeKeyboardControl" }, - { 103, "GetKeyboardControl" }, - { 104, "Bell" }, - { 105, "ChangePointerControl" }, - { 106, "GetPointerControl" }, - { 107, "SetScreenSaver" }, - { 108, "GetScreenSaver" }, - { 109, "ChangeHosts" }, - { 110, "ListHosts" }, - { 111, "SetAccessControl" }, - { 112, "SetCloseDownMode" }, - { 113, "KillClient" }, - { 114, "RotateProperties" }, - { 115, "ForceScreenSaver" }, - { 116, "SetPointerMapping" }, - { 117, "GetPointerMapping" }, - { 118, "SetModifierMapping" }, - { 119, "GetModifierMapping" }, - { 127, "NoOperation" }, - { 0, NULL } + { INITIAL_CONN, "Initial connection request" }, + { X_CreateWindow, "CreateWindow" }, + { X_ChangeWindowAttributes, "ChangeWindowAttributes" }, + { X_GetWindowAttributes, "GetWindowAttributes" }, + { X_DestroyWindow, "DestroyWindow" }, + { X_DestroySubwindows, "DestroySubwindows" }, + { X_ChangeSaveSet, "ChangeSaveSet" }, + { X_ReparentWindow, "ReparentWindow" }, + { X_MapWindow, "MapWindow" }, + { X_MapSubwindows, "MapSubwindows" }, + { X_UnmapWindow, "UnmapWindow" }, + { X_UnmapSubwindows, "UnmapSubwindows" }, + { X_ConfigureWindow, "ConfigureWindow" }, + { X_CirculateWindow, "CirculateWindow" }, + { X_GetGeometry, "GetGeometry" }, + { X_QueryTree, "QueryTree" }, + { X_InternAtom, "InternAtom" }, + { X_GetAtomName, "GetAtomName" }, + { X_ChangeProperty, "ChangeProperty" }, + { X_DeleteProperty, "DeleteProperty" }, + { X_GetProperty, "GetProperty" }, + { X_ListProperties, "ListProperties" }, + { X_SetSelectionOwner, "SetSelectionOwner" }, + { X_GetSelectionOwner, "GetSelectionOwner" }, + { X_ConvertSelection, "ConvertSelection" }, + /* { X_SendEvent, "SendEvent" }, */ + { X_GrabPointer, "GrabPointer" }, + { X_UngrabPointer, "UngrabPointer" }, + { X_GrabButton, "GrabButton" }, + { X_UngrabButton, "UngrabButton" }, + { X_ChangeActivePointerGrab, "ChangeActivePointerGrab" }, + { X_GrabKeyboard, "GrabKeyboard" }, + { X_UngrabKeyboard, "UngrabKeyboard" }, + { X_GrabKey, "GrabKey" }, + { X_UngrabKey, "UngrabKey" }, + { X_AllowEvents, "AllowEvents" }, + { X_GrabServer, "GrabServer" }, + { X_UngrabServer, "UngrabServer" }, + { X_QueryPointer, "QueryPointer" }, + { X_GetMotionEvents, "GetMotionEvents" }, + { X_TranslateCoords, "TranslateCoordinates" }, + { X_WarpPointer, "WarpPointer" }, + { X_SetInputFocus, "SetInputFocus" }, + { X_GetInputFocus, "GetInputFocus" }, + { X_QueryKeymap, "QueryKeymap" }, + { X_OpenFont, "OpenFont" }, + { X_CloseFont, "CloseFont" }, + { X_QueryFont, "QueryFont" }, + { X_QueryTextExtents, "QueryTextExtents" }, + { X_ListFonts, "ListFonts" }, + { X_ListFontsWithInfo, "ListFontsWithInfo" }, + { X_SetFontPath, "SetFontPath" }, + { X_GetFontPath, "GetFontPath" }, + { X_CreatePixmap, "CreatePixmap" }, + { X_FreePixmap, "FreePixmap" }, + { X_CreateGC, "CreateGC" }, + { X_ChangeGC, "ChangeGC" }, + { X_CopyGC, "CopyGC" }, + { X_SetDashes, "SetDashes" }, + { X_SetClipRectangles, "SetClipRectangles" }, + { X_FreeGC, "FreeGC" }, + { X_ClearArea, "ClearArea" }, + { X_CopyArea, "CopyArea" }, + { X_CopyPlane, "CopyPlane" }, + { X_PolyPoint, "PolyPoint" }, + { X_PolyLine, "PolyLine" }, + { X_PolySegment, "PolySegment" }, + { X_PolyRectangle, "PolyRectangle" }, + { X_PolyArc, "PolyArc" }, + { X_FillPoly, "FillPoly" }, + { X_PolyFillRectangle, "PolyFillRectangle" }, + { X_PolyFillArc, "PolyFillArc" }, + { X_PutImage, "PutImage" }, + { X_GetImage, "GetImage" }, + { X_PolyText8, "PolyText8" }, + { X_PolyText16, "PolyText16" }, + { X_ImageText8, "ImageText8" }, + { X_ImageText16, "ImageText16" }, + { X_CreateColormap, "CreateColormap" }, + { X_FreeColormap, "FreeColormap" }, + { X_CopyColormapAndFree, "CopyColormapAndFree" }, + { X_InstallColormap, "InstallColormap" }, + { X_UninstallColormap, "UninstallColormap" }, + { X_ListInstalledColormaps, "ListInstalledColormaps" }, + { X_AllocColor, "AllocColor" }, + { X_AllocNamedColor, "AllocNamedColor" }, + { X_AllocColorCells, "AllocColorCells" }, + { X_AllocColorPlanes, "AllocColorPlanes" }, + { X_FreeColors, "FreeColors" }, + { X_StoreColors, "StoreColors" }, + { X_StoreNamedColor, "StoreNamedColor" }, + { X_QueryColors, "QueryColors" }, + { X_LookupColor, "LookupColor" }, + { X_CreateCursor, "CreateCursor" }, + { X_CreateGlyphCursor, "CreateGlyphCursor" }, + { X_FreeCursor, "FreeCursor" }, + { X_RecolorCursor, "RecolorCursor" }, + { X_QueryBestSize, "QueryBestSize" }, + { X_QueryExtension, "QueryExtension" }, + { X_ListExtensions, "ListExtensions" }, + { X_ChangeKeyboardMapping, "ChangeKeyboardMapping" }, + { X_GetKeyboardMapping, "GetKeyboardMapping" }, + { X_ChangeKeyboardControl, "ChangeKeyboardControl" }, + { X_GetKeyboardControl, "GetKeyboardControl" }, + { X_Bell, "Bell" }, + { X_ChangePointerControl, "ChangePointerControl" }, + { X_GetPointerControl, "GetPointerControl" }, + { X_SetScreenSaver, "SetScreenSaver" }, + { X_GetScreenSaver, "GetScreenSaver" }, + { X_ChangeHosts, "ChangeHosts" }, + { X_ListHosts, "ListHosts" }, + { X_SetAccessControl, "SetAccessControl" }, + { X_SetCloseDownMode, "SetCloseDownMode" }, + { X_KillClient, "KillClient" }, + { X_RotateProperties, "RotateProperties" }, + { X_ForceScreenSaver, "ForceScreenSaver" }, + { X_SetPointerMapping, "SetPointerMapping" }, + { X_GetPointerMapping, "GetPointerMapping" }, + { X_SetModifierMapping, "SetModifierMapping" }, + { X_GetModifierMapping, "GetModifierMapping" }, + { X_NoOperation, "NoOperation" }, + { 0, NULL } +}; + +/* Eventscodes. From <X11/X.h>. */ +#define KeyPress 2 +#define KeyRelease 3 +#define ButtonPress 4 +#define ButtonRelease 5 +#define MotionNotify 6 +#define EnterNotify 7 +#define LeaveNotify 8 +#define FocusIn 9 +#define FocusOut 10 +#define KeymapNotify 11 +#define Expose 12 +#define GraphicsExpose 13 +#define NoExpose 14 +#define VisibilityNotify 15 +#define CreateNotify 16 +#define DestroyNotify 17 +#define UnmapNotify 18 +#define MapNotify 19 +#define MapRequest 20 +#define ReparentNotify 21 +#define ConfigureNotify 22 +#define ConfigureRequest 23 +#define GravityNotify 24 +#define ResizeRequest 25 +#define CirculateNotify 26 +#define CirculateRequest 27 +#define PropertyNotify 28 +#define SelectionClear 29 +#define SelectionRequest 30 +#define SelectionNotify 31 +#define ColormapNotify 32 +#define ClientMessage 33 +#define MappingNotify 34 + +static const value_string eventcode_vals[] = { + { KeyPress, "KeyPress" }, + { KeyRelease, "KeyRelease" }, + { ButtonPress, "ButtonPress" }, + { ButtonRelease, "ButtonRelease" }, + { MotionNotify, "MotionNotify" }, + { EnterNotify, "EnterNotify" }, + { LeaveNotify, "LeaveNotify" }, + { FocusIn, "FocusIn" }, + { FocusOut, "FocusOut" }, + { KeymapNotify, "KeymapNotify" }, + { Expose, "Expose" }, + { GraphicsExpose, "GraphicsExpose" }, + { NoExpose, "NoExpose" }, + { VisibilityNotify, "VisibilityNotify" }, + { CreateNotify, "CreateNotify" }, + { DestroyNotify, "DestroyNotify" }, + { UnmapNotify, "UnmapNotify" }, + { MapNotify, "MapNotify" }, + { MapRequest, "MapRequest" }, + { ReparentNotify, "ReparentNotify" }, + { ConfigureNotify, "ConfigureNotify" }, + { ConfigureRequest, "ConfigureRequest" }, + { GravityNotify, "GravityNotify" }, + { ResizeRequest, "ResizeRequest" }, + { CirculateNotify, "CirculateNotify" }, + { CirculateRequest, "CirculateRequest" }, + { PropertyNotify, "PropertyNotify" }, + { SelectionClear, "SelectionClear" }, + { SelectionRequest, "SelectionRequest" }, + { SelectionNotify, "SelectionNotify" }, + { ColormapNotify, "ColormapNotify" }, + { ClientMessage, "ClientMessage" }, + { MappingNotify, "MappingNotify" }, + { 0, NULL } +}; + +/* Errorcodes. From <X11/X.h> */ +#define Success 0 /* everything's okay */ +#define BadRequest 1 /* bad request code */ +#define BadValue 2 /* int parameter out of range */ +#define BadWindow 3 /* parameter not a Window */ +#define BadPixmap 4 /* parameter not a Pixmap */ +#define BadAtom 5 /* parameter not an Atom */ +#define BadCursor 6 /* parameter not a Cursor */ +#define BadFont 7 /* parameter not a Font */ +#define BadMatch 8 /* parameter mismatch */ +#define BadDrawable 9 /* parameter not a Pixmap or Window */ +#define BadAccess 10 /* depending on context: + - key/button already grabbed + - attempt to free an illegal + cmap entry + - attempt to store into a read-only + color map entry. + - attempt to modify the access control + list from other than the local host. + */ +#define BadAlloc 11 /* insufficient resources */ +#define BadColor 12 /* no such colormap */ +#define BadGC 13 /* parameter not a GC */ +#define BadIDChoice 14 /* choice not in range or already used */ +#define BadName 15 /* font or color name doesn't exist */ +#define BadLength 16 /* Request length incorrect */ +#define BadImplementation 17 /* server is defective */ + +#define FirstExtensionError 128 +#define LastExtensionError 255 + +static const value_string errorcode_vals[] = { + { Success, "Success" }, + { BadRequest, "BadRequest" }, + { BadValue, "BadValue" }, + { BadWindow, "BadWindow" }, + { BadPixmap, "BadPixmap" }, + { BadAtom, "BadAtom" }, + { BadCursor, "BadCursor" }, + { BadFont, "BadFont" }, + { BadMatch, "BadMatch" }, + { BadDrawable, "BadDrawable" }, + { BadAccess, "BadAccess" }, + { BadAlloc, "BadAlloc" }, + { BadColor, "BadColor" }, + { BadGC, "BadGC" }, + { BadIDChoice, "BadIDChoice" }, + { BadName, "BadName" }, + { BadLength, "BadLength" }, + { BadImplementation, "BadImplementation" }, + { FirstExtensionError, "FirstExtensionError" }, + { LastExtensionError, "LastExtensionError" }, + { 0, NULL } }; static const value_string ordering_vals[] = { @@ -620,6 +949,10 @@ static const value_string zero_is_none_vals[] = { { 0, NULL } }; +/* we have not seen packet before. */ +#define PACKET_IS_NEW(pinfo) \ + (!((pinfo)->fd->flags.visited)) + /************************************************************************ *** *** *** F I E L D D E C O D I N G M A C R O S *** @@ -651,9 +984,9 @@ static const value_string zero_is_none_vals[] = { #define FLAG(position, name) {\ proto_tree_add_boolean(bitmask_tree, hf_x11_##position##_mask##_##name, tvb, bitmask_offset, bitmask_size, bitmask_value); } -#define FLAG_IF_NONZERO(position, name) {\ +#define FLAG_IF_NONZERO(position, name) do {\ if (bitmask_value & proto_registrar_get_nth(hf_x11_##position##_mask##_##name) -> bitmask)\ - proto_tree_add_boolean(bitmask_tree, hf_x11_##position##_mask##_##name, tvb, bitmask_offset, bitmask_size, bitmask_value); } + proto_tree_add_boolean(bitmask_tree, hf_x11_##position##_mask##_##name, tvb, bitmask_offset, bitmask_size, bitmask_value); } while (0) #define ATOM(name) { atom(tvb, offsetp, t, hf_x11_##name, little_endian); } #define BITGRAVITY(name) { gravity(tvb, offsetp, t, hf_x11_##name, "Forget"); } @@ -676,31 +1009,43 @@ static const value_string zero_is_none_vals[] = { #define BITMASK16(name) BITMASK(name, 2); #define BITMASK32(name) BITMASK(name, 4); #define BOOL(name) (add_boolean(tvb, offsetp, t, hf_x11_##name)) -#define BUTTON(name) { FIELD8(name); } -#define CARD8(name) { FIELD8(name); } +#define BUTTON(name) FIELD8(name) +#define CARD8(name) FIELD8(name) #define CARD16(name) (FIELD16(name)) #define CARD32(name) (FIELD32(name)) -#define COLOR_FLAGS(name) { colorFlags(tvb, offsetp, t); } -#define COLORMAP(name) { FIELD32(name); } -#define CURSOR(name) { FIELD32(name); } -#define DRAWABLE(name) { FIELD32(name); } +#define COLOR_FLAGS(name) colorFlags(tvb, offsetp, t) +#define COLORMAP(name) FIELD32(name) +#define CURSOR(name) FIELD32(name) +#define DRAWABLE(name) FIELD32(name) #define ENUM8(name) (FIELD8(name)) -#define ENUM16(name) { FIELD16(name); } -#define FONT(name) { FIELD32(name); } -#define FONTABLE(name) { FIELD32(name); } -#define GCONTEXT(name) { FIELD32(name); } -#define INT8(name) { FIELD8(name); } -#define INT16(name) { FIELD16(name); } -#define KEYCODE(name) { FIELD8(name); } +#define ENUM16(name) FIELD16(name) +#define FONT(name) FIELD32(name) +#define FONTABLE(name) FIELD32(name) +#define GCONTEXT(name) FIELD32(name) +#define INT8(name) FIELD8(name) +#define INT16(name) FIELD16(name) +#define INT32(name) FIELD32(name) +#define KEYCODE(name) FIELD8(name) +#define KEYCODE_DECODED(name, keycode, mask) do { \ + proto_tree_add_uint_format(t, hf_x11_##name, tvb, offset, 1, \ + keycode, "keycode: %d (%s)", \ + keycode, keycode2keysymString(state->keycodemap, \ + state->first_keycode, state->keysyms_per_keycode, \ + state->modifiermap, state->keycodes_per_modifier, \ + keycode, mask)); \ + ++offset; \ +} while (0) + #define LISTofARC(name) { listOfArc(tvb, offsetp, t, hf_x11_##name, (next_offset - *offsetp) / 12, little_endian); } #define LISTofATOM(name, length) { listOfAtom(tvb, offsetp, t, hf_x11_##name, (length) / 4, little_endian); } #define LISTofBYTE(name, length) { listOfByte(tvb, offsetp, t, hf_x11_##name, (length), little_endian); } #define LISTofCARD8(name, length) { listOfByte(tvb, offsetp, t, hf_x11_##name, (length), little_endian); } #define LISTofCARD32(name, length) { listOfCard32(tvb, offsetp, t, hf_x11_##name, hf_x11_##name##_item, (length) / 4, little_endian); } #define LISTofCOLORITEM(name, length) { listOfColorItem(tvb, offsetp, t, hf_x11_##name, (length) / 12, little_endian); } -#define LISTofKEYCODE(name, length) { listOfKeycode(tvb, offsetp, t, hf_x11_##name, (length), little_endian); } -#define LISTofKEYSYM(name, keycode_count, keysyms_per_keycode) { \ - listOfKeysyms(tvb, offsetp, t, hf_x11_##name, hf_x11_##name##_item, (keycode_count), (keysyms_per_keycode), little_endian); } +#define LISTofKEYCODE(map, name, length) { listOfKeycode(tvb, offsetp, t, hf_x11_##name, map, (length), little_endian); } +#define LISTofKEYSYM(name, map, keycode_first, keycode_count, \ +keysyms_per_keycode) {\ + listOfKeysyms(tvb, offsetp, t, hf_x11_##name, hf_x11_##name##_item, map, (keycode_first), (keycode_count), (keysyms_per_keycode), little_endian); } #define LISTofPOINT(name, length) { listOfPoint(tvb, offsetp, t, hf_x11_##name, (length) / 4, little_endian); } #define LISTofRECTANGLE(name) { listOfRectangle(tvb, offsetp, t, hf_x11_##name, (next_offset - *offsetp) / 8, little_endian); } #define LISTofSEGMENT(name) { listOfSegment(tvb, offsetp, t, hf_x11_##name, (next_offset - *offsetp) / 8, little_endian); } @@ -712,7 +1057,7 @@ static const value_string zero_is_none_vals[] = { #define REQUEST_LENGTH() (requestLength(tvb, offsetp, t, little_endian)) #define SETofEVENT(name) { setOfEvent(tvb, offsetp, t, little_endian); } #define SETofDEVICEEVENT(name) { setOfDeviceEvent(tvb, offsetp, t, little_endian);} -#define SETofKEYMASK(name) { setOfKeyMask(tvb, offsetp, t, little_endian); } +#define SETofKEYMASK(name) { setOfKeyButMask(tvb, offsetp, t, little_endian, 0); } #define SETofPOINTEREVENT(name) { setOfPointerEvent(tvb, offsetp, t, little_endian); } #define STRING8(name, length) { string8(tvb, offsetp, t, hf_x11_##name, length); } #define STRING16(name, length) { string16(tvb, offsetp, t, hf_x11_##name, hf_x11_##name##_bytes, length, little_endian); } @@ -726,6 +1071,107 @@ static const value_string zero_is_none_vals[] = { #define VISUALID(name) { gint32 v = VALUE32(tvb, *offsetp); \ proto_tree_add_uint_format(t, hf_x11_##name, tvb, *offsetp, 4, v, "Visualid: 0x%08x%s", v, \ v ? "" : " (CopyFromParent)"); *offsetp += 4; } +#define REPLY(name) FIELD8(name); +#define REPLYLENGTH(name) FIELD32(name); + +#define EVENTCONTENTS_COMMON() do { \ + TIMESTAMP(time); \ + WINDOW(rootwindow); \ + WINDOW(eventwindow); \ + WINDOW(childwindow); \ + INT16(root_x); \ + INT16(root_y); \ + INT16(event_x); \ + INT16(event_y); \ + setOfKeyButMask(tvb, offsetp, t, little_endian, 1); \ +} while (0) + +#define SEQUENCENUMBER_REPLY(name) do { \ + guint16 seqno; \ + \ + seqno = VALUE16(tvb, *offsetp); \ + proto_tree_add_uint_format(t, hf_x11_reply_##name, tvb, \ + *offsetp, sizeof(seqno), seqno, \ + "sequencenumber: %d (%s)", \ + (int)seqno, \ + val_to_str(opcode, opcode_vals, "<Unknown opcode %d>")); \ + *offsetp += sizeof(seqno); \ +} while (0) + +#define REPLYCONTENTS_COMMON() do { \ + REPLY(reply); \ + proto_tree_add_item(t, hf_x11_undecoded, tvb, offset, \ + 1, little_endian); \ + ++offset; \ + SEQUENCENUMBER_REPLY(sequencenumber); \ + REPLYLENGTH(replylength); \ + proto_tree_add_item(t, hf_x11_undecoded, tvb, offset, \ + tvb_reported_length_remaining(tvb, offset), little_endian); \ + offset += tvb_reported_length_remaining(tvb, offset); \ +} while (0) + + +#define HANDLE_REPLY(plen, length_remaining, str, func) do { \ + if (length_remaining < plen) { \ + if (x11_desegment && pinfo->can_desegment) { \ + pinfo->desegment_offset = offset; \ + pinfo->desegment_len = plen - length_remaining;\ + return; \ + } else { \ + ; /* XXX yes, what then? Need to skip/join. */ \ + } \ + } \ + if (length_remaining > plen) \ + length_remaining = plen; \ + next_tvb = tvb_new_subset(tvb, offset, length_remaining, plen); \ + \ + if (sep == NULL) { \ + if (check_col(pinfo->cinfo, COL_INFO)) \ + col_add_str(pinfo->cinfo, COL_INFO, str); \ + sep = ":"; \ + } \ + \ + TRY { \ + func(next_tvb, pinfo, tree, sep, state, little_endian); \ + } \ + \ + CATCH(BoundsError) { \ + RETHROW; \ + } \ + CATCH(ReportedBoundsError) { \ + show_reported_bounds_error(next_tvb, pinfo, tree); \ + } \ + ENDTRY; \ + \ + sep = ","; \ +} while (0) + +static void +dissect_x11_initial_reply(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, + const char *sep, x11_conv_data_t *volatile state, gboolean + little_endian); + +static void +dissect_x11_reply(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, + const char *sep, x11_conv_data_t *volatile state, gboolean + little_endian); + +static void +dissect_x11_error(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, + const char *sep, x11_conv_data_t *volatile state, + gboolean little_endian); + +static void +dissect_x11_event(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, + const char *sep, x11_conv_data_t *volatile state, + gboolean little_endian); + +static void +x11_stateinit(x11_conv_data_t **state, conversation_t *conversation); + +static const char * +keysymString(guint32 v); + /************************************************************************ *** *** @@ -946,6 +1392,186 @@ static gint compareGuint32(gconstpointer a, gconstpointer b) return GPOINTER_TO_INT(b) - GPOINTER_TO_INT(a); } +static const char * +keycode2keysymString(int *keycodemap[256], int first_keycode, + int keysyms_per_keycode, + int *modifiermap[array_length(modifiers)], + int keycodes_per_modifier, + guint32 keycode, guint32 bitmask) +{ + static char buf[32]; + int *syms; + int groupmodkc, numlockkc, numlockmod, groupmod; + int lockmod_is_capslock = 0, lockmod_is_shiftlock = 0; + int lockmod_is_nosymbol = 1; + int modifier, kc, keysym; + + if ((syms = keycodemap[keycode]) == NULL) + return "<Unknown>"; + + for (kc = first_keycode, groupmodkc = numlockkc = -1; kc < 256; ++kc) + for (keysym = 0; keysym < keysyms_per_keycode; ++keysym) + switch (keycodemap[kc][keysym]) { + case 0xff7e: + groupmodkc = kc; + break; + + case 0xff7f: + numlockkc = kc; + break; + + case 0xffe5: + lockmod_is_capslock = kc; + break; + + case 0xffe6: + lockmod_is_shiftlock = kc; + break; + } + + + /* + * If we have not seen the modifiermap we don't know what the + * keycode translates to, but we do know it's one of the keys + * in syms (give or take a case-conversion), so we could in + * theory list them all. + */ + if (modifiermap[array_length(modifiers) - 1] == NULL) /* all or none */ + return "<Unknown>"; + + /* find out what the numlockmodifer and groupmodifier is. */ + for (modifier = 0, numlockmod = groupmod = -1; + modifier < (int)array_length(modifiers) && numlockmod == -1; + ++modifier) + for (kc = 0; kc < keycodes_per_modifier; ++kc) + if (modifiermap[modifier][kc] == numlockkc) + numlockmod = modifier; + else if (modifiermap[modifier][kc] == groupmodkc) + groupmod = modifier; + + /* + * ... and what the lockmodifier is interpreted as. + * (X11v4r6 ref, keyboard and pointers section.) + */ + for (kc = 0; kc < keycodes_per_modifier; ++kc) + if (modifiermap[1][kc] == lockmod_is_capslock) { + lockmod_is_shiftlock = lockmod_is_nosymbol = 0; + break; + } + else if (modifiermap[0][kc] == lockmod_is_shiftlock) { + lockmod_is_capslock = lockmod_is_nosymbol = 0; + break; + } + +#if 0 + /* + * This is (how I understand) the X11v4R6 protocol description given + * in A. Nye's book. It is quite different from the + * code in _XTranslateKey() in the file + * "$XConsortium: KeyBind.c /main/55 1996/02/02 14:08:55 kaleb $" + * as shipped with XFree, and doesn't work correctly, nor do I see + * how it could (e.g. the case of lower/uppercase-letters). + * -- Michael Shuldman + */ + + if (numlockmod >= 0 && (bitmask & modifiermask[numlockmod]) + && ((keycodemap[keycode][1] >= 0xff80 + && keycodemap[keycode][1] <= 0xffbd) + || (keycodemap[keycode][1] >= 0x11000000 + && keycodemap[keycode][1] <= 0x1100ffff))) { + if ((bitmask & ShiftMask) || lockmod_is_shiftlock) + return keysymString(keycodemap[keycode][groupmod + 0]); + else + if (keycodemap[keycode][groupmod + 1] == NoSymbol) + return keysymString(keycodemap[keycode] + [groupmod + 0]); + else + return keysymString(keycodemap[keycode] + [groupmod + 1]); + } + else if (!(bitmask & ShiftMask) && !(bitmask & LockMask)) + return keysymString(keycodemap[keycode][groupmod + 0]); + else if (!(bitmask & ShiftMask) + && ((bitmask & LockMask) && lockmod_is_capslock)) + if (islower(keycodemap[keycode][groupmod + 0])) +/* return toupper(keysymString(keycodemap[keycode][groupmod + 0])); */ + return "Uppercase"; /* XXX */ + else + return keysymString(keycodemap[keycode][groupmod + 0]); + + else if ((bitmask & ShiftMask) + && ((bitmask & LockMask) && lockmod_is_capslock)) + if (islower(keycodemap[keycode][groupmod + 1])) +/* return toupper(keysymString(keycodemap[keycode][groupmod + 1])); */ + return "Uppercase"; /* XXX */ + else + return keysymString(keycodemap[keycode][groupmod + 1]); + + else if ((bitmask & ShiftMask) + || ((bitmask & LockMask) && lockmod_is_shiftlock)) + return keysymString(keycodemap[keycode][groupmod + 1]); +#else /* _XTranslateKey() based code. */ + + while (keysyms_per_keycode > 2 + && keycodemap[keysyms_per_keycode - 1] == NoSymbol) + --keysyms_per_keycode; + if (keysyms_per_keycode > 2 + && (groupmod >= 0 && (modifiermask[groupmod] & bitmask))) { + syms += 2; + keysyms_per_keycode -= 2; + } + + if (numlockmod >= 0 && (bitmask & modifiermask[numlockmod]) + && keysyms_per_keycode > 1 && ((syms[1] >= 0xff80 && syms[1] <= 0xffbd) + || (syms[1] >= 0x11000000 && syms[1] <= 0x1100ffff))) { + if ((bitmask & ShiftMask) + || (bitmask & LockMask && lockmod_is_shiftlock)) + keysym = syms[0]; + else + keysym = syms[1]; + } + else if (!(bitmask & ShiftMask) + && (!(bitmask & LockMask) || lockmod_is_nosymbol)) { + if (keysyms_per_keycode == 1 + || (keysyms_per_keycode > 1 && syms[1] == NoSymbol)) { + int usym; + + XConvertCase(syms[0], &keysym, &usym); + } + else + keysym = syms[0]; + } + else if (!(bitmask & LockMask) || !lockmod_is_capslock) { + int lsym, usym; + + if (keysyms_per_keycode == 1 + || (keysyms_per_keycode > 1 && (usym = syms[1]) == NoSymbol)) + XConvertCase(syms[0], &lsym, &usym); + keysym = usym; + } + else { + int lsym, usym; + + if (keysyms_per_keycode == 1 + || (keysyms_per_keycode > 1 && syms[1] == NoSymbol)) + keysym = syms[0]; + + XConvertCase(keysym, &lsym, &usym); + + if (!(bitmask & ShiftMask) && keysym != syms[0] + && ((keysym != usym) || (lsym == usym))) + XConvertCase(syms[0], &lsym, &usym); + keysym = usym; + } + + if (keysym == XK_VoidSymbol) + keysym = NoSymbol; + + sprintf(buf, "%d, \"%s\"", keysym, keysymString(keysym)); + return buf; +#endif +} + static const char *keysymString(guint32 v) { gpointer res; @@ -959,55 +1585,110 @@ static const char *keysymString(guint32 v) g_tree_insert(keysymTable, GINT_TO_POINTER(p -> value), p -> strptr); } res = g_tree_lookup(keysymTable, GINT_TO_POINTER(v)); - return res ? res : "Unknown"; + return res ? res : "<Unknown>"; } -static const char *modifiers[] = { "Shift", "Lock", "Control", "Mod1", "Mod2", "Mod3", "Mod4", "Mod5" }; - static void listOfKeycode(tvbuff_t *tvb, int *offsetp, proto_tree *t, int hf, - int length, gboolean little_endian) + int *modifiermap[], int keycodes_per_modifier, + gboolean little_endian) { char buffer[1024]; - proto_item *ti = proto_tree_add_item(t, hf, tvb, *offsetp, length * 8, little_endian); + proto_item *ti = proto_tree_add_item(t, hf, tvb, *offsetp, + array_length(modifiers) * keycodes_per_modifier, little_endian); + proto_tree *tt = proto_item_add_subtree(ti, ett_x11_list_of_keycode); + size_t m; - while(length--) { + for (m = 0; m < array_length(modifiers); + ++m, *offsetp += keycodes_per_modifier) { char *bp = buffer; - const char **m; int i; - for(i = 8, m = modifiers; i; i--, m++) { - guchar c = tvb_get_guint8(tvb, *offsetp); - *offsetp += 1; + modifiermap[m] = g_malloc(keycodes_per_modifier); + + for(i = 0; i < keycodes_per_modifier; ++i) { + guchar c = tvb_get_guint8(tvb, *offsetp + i); + if (c) - bp += sprintf(bp, " %s=%d", *m, c); + bp += sprintf(bp, " %s=%d", modifiers[m], c); + + modifiermap[m][i] = c; } - proto_tree_add_bytes_format(tt, hf_x11_keycodes_item, tvb, *offsetp - 8, 8, tvb_get_ptr(tvb, *offsetp - 8, 8), "item: %s", buffer); + proto_tree_add_bytes_format(tt, hf_x11_keycodes_item, tvb, + *offsetp, keycodes_per_modifier, + tvb_get_ptr(tvb, *offsetp, keycodes_per_modifier), + "item: %s", buffer); } } static void listOfKeysyms(tvbuff_t *tvb, int *offsetp, proto_tree *t, int hf, - int hf_item, int keycode_count, + int hf_item, int *keycodemap[256], + int keycode_first, int keycode_count, int keysyms_per_keycode, gboolean little_endian) { proto_item *ti = proto_tree_add_item(t, hf, tvb, *offsetp, keycode_count * keysyms_per_keycode * 4, little_endian); proto_tree *tt = proto_item_add_subtree(ti, ett_x11_list_of_keysyms); proto_item *tti; proto_tree *ttt; - int i; + int i, keycode; + + g_assert(keycode_first >= 0); + g_assert(keycode_count >= 0); + g_assert((size_t)(keycode_first + keycode_count) <= 256); + + + for (keycode = keycode_first; keycode_count > 0; + ++keycode, --keycode_count) { + tti = proto_tree_add_none_format(tt, hf_item, tvb, *offsetp, + keysyms_per_keycode * 4, "keysyms (keycode %d):", keycode); - while(keycode_count--) { - tti = proto_tree_add_none_format(tt, hf_item, tvb, *offsetp, keysyms_per_keycode * 4, - "keysyms:"); ttt = proto_item_add_subtree(tti, ett_x11_keysym); - for(i = keysyms_per_keycode; i; i--) { + + keycodemap[keycode] + = g_malloc(sizeof(*keycodemap[keycode]) * keysyms_per_keycode); + + for(i = 0; i < keysyms_per_keycode; ++i) { + /* keysymvalue = byte3 * 256 + byte4. */ guint32 v = VALUE32(tvb, *offsetp); + proto_item_append_text(tti, " %s", keysymString(v)); - proto_tree_add_uint_format(ttt, hf_x11_keysyms_item_keysym, tvb, *offsetp, 4, v, - "keysym: 0x%08x (%s)", v, keysymString(v)); + proto_tree_add_uint_format(ttt, hf_x11_keysyms_item_keysym, + tvb, *offsetp, 4, v, + "keysym (keycode %d): 0x%08x (%s)", + keycode, v, keysymString(v)); + + keycodemap[keycode][i] = v; *offsetp += 4; } + + for (i = 1; i < keysyms_per_keycode; ++i) + if (keycodemap[keycode][i] != NoSymbol) + break; + + if (i == keysyms_per_keycode) { + /* all but (possibly) first were NoSymbol. */ + if (keysyms_per_keycode == 4) { + keycodemap[keycode][1] = NoSymbol; + keycodemap[keycode][2] = keycodemap[keycode][0]; + keycodemap[keycode][3] = NoSymbol; + } + + continue; + } + + for (i = 2; i < keysyms_per_keycode; ++i) + if (keycodemap[keycode][i] != NoSymbol) + break; + if (i == keysyms_per_keycode) { + /* all but (possibly) first two were NoSymbol. */ + if (keysyms_per_keycode == 4) { + keycodemap[keycode][2] = keycodemap[keycode][0]; + keycodemap[keycode][3] = keycodemap[keycode][1]; + } + + continue; + } } } @@ -1294,8 +1975,8 @@ static guint32 field8(tvbuff_t *tvb, int *offsetp, proto_tree *t, int hf, enumValue = match_strval(v, cVALS(hfi -> strings)); if (enumValue) proto_tree_add_uint_format(t, hf, tvb, *offsetp, 1, v, - hfi -> display == BASE_DEC ? "%s: %u (%s)" : "%s: 0x%02x (%s)", - hfi -> name, v, enumValue); + hfi -> display == BASE_DEC ? "%s: %u (%s)" : "%s: 0x%02x (%s)", + hfi -> name, v, enumValue); else proto_tree_add_item(t, hf, tvb, *offsetp, 1, little_endian); *offsetp += 1; @@ -1306,7 +1987,17 @@ static guint32 field16(tvbuff_t *tvb, int *offsetp, proto_tree *t, int hf, gboolean little_endian) { guint32 v = VALUE16(tvb, *offsetp); - proto_tree_add_item(t, hf, tvb, *offsetp, 2, little_endian); + header_field_info *hfi = proto_registrar_get_nth(hf); + gchar *enumValue = NULL; + + if (hfi -> strings) + enumValue = match_strval(v, cVALS(hfi -> strings)); + if (enumValue) + proto_tree_add_uint_format(t, hf, tvb, *offsetp, 2, v, + hfi -> display == BASE_DEC ? "%s: %u (%s)" : "%s: 0x%02x (%s)", + hfi -> name, v, enumValue); + else + proto_tree_add_item(t, hf, tvb, *offsetp, 2, little_endian); *offsetp += 2; return v; } @@ -1396,10 +2087,10 @@ static void gcMask(tvbuff_t *tvb, int *offsetp, proto_tree *t, static guint32 requestLength(tvbuff_t *tvb, int *offsetp, proto_tree *t, gboolean little_endian) { - guint32 res = VALUE16(tvb, *offsetp) * 4; + guint32 res = VALUE16(tvb, *offsetp); proto_tree_add_uint(t, hf_x11_request_length, tvb, *offsetp, 2, res); *offsetp += 2; - return res; + return res * 4; } static void setOfEvent(tvbuff_t *tvb, int *offsetp, proto_tree *t, @@ -1454,8 +2145,9 @@ static void setOfDeviceEvent(tvbuff_t *tvb, int *offsetp, proto_tree *t, ENDBITMASK; } -static void setOfKeyMask(tvbuff_t *tvb, int *offsetp, proto_tree *t, - gboolean little_endian) + +static void setOfKeyButMask(tvbuff_t *tvb, int *offsetp, proto_tree *t, + gboolean little_endian, gboolean butmask) { proto_item *ti; guint32 bitmask_value; @@ -1466,7 +2158,8 @@ static void setOfKeyMask(tvbuff_t *tvb, int *offsetp, proto_tree *t, bitmask_value = VALUE16(tvb, *offsetp); bitmask_offset = *offsetp; bitmask_size = 2; - if (bitmask_value == 0x8000) + + if (!butmask && bitmask_value == 0x8000) proto_tree_add_uint_format(t, hf_x11_modifiers_mask_AnyModifier, tvb, *offsetp, 2, 0x8000, "modifiers-masks: 0x8000 (AnyModifier)"); else { @@ -1481,11 +2174,24 @@ static void setOfKeyMask(tvbuff_t *tvb, int *offsetp, proto_tree *t, FLAG(modifiers, Mod3); FLAG(modifiers, Mod4); FLAG(modifiers, Mod5); - FLAG_IF_NONZERO(modifiers, erroneous_bits); + + if (butmask) { + FLAG(modifiers, Button1); + FLAG(modifiers, Button2); + FLAG(modifiers, Button3); + FLAG(modifiers, Button4); + FLAG(modifiers, Button5); + } + + if (butmask) + FLAG_IF_NONZERO(keybut, erroneous_bits); + else + FLAG_IF_NONZERO(modifiers, erroneous_bits); } *offsetp += 2; } + static void setOfPointerEvent(tvbuff_t *tvb, int *offsetp, proto_tree *t, gboolean little_endian) { @@ -1590,37 +2296,6 @@ static void windowAttributes(tvbuff_t *tvb, int *offsetp, proto_tree *t, ENDBITMASK; } -/* - * Data structure associated with a conversation; keeps track of the - * request for which we're expecting a reply, the frame number of - * the initial connection request, and the byte order of the connection. - * - * An opcode of -3 means we haven't yet seen any requests yet. - * An opcode of -2 means we're not expecting a reply. - * An opcode of -1 means means we're waiting for a reply to the initial - * connection request. - * Other values are the opcode of the request for which we're expecting - * a reply. - * - * XXX - assumes only one outstanding request is awaiting a reply, - * which should always be the case. - */ -#define NOTHING_SEEN -3 -#define NOTHING_EXPECTED -2 -#define INITIAL_CONN -1 - -#define BYTE_ORDER_BE 0 -#define BYTE_ORDER_LE 1 -#define BYTE_ORDER_UNKNOWN -1 - -typedef struct { - int opcode; /* opcode for which we're awaiting a reply */ - guint32 iconn_frame; /* frame # of initial connection request */ - int byte_order; /* byte order of connection */ -} x11_conv_data_t; - -static GMemChunk *x11_state_chunk = NULL; - static void x11_init_protocol(void) { if (x11_state_chunk != NULL) @@ -1690,67 +2365,67 @@ static int rounded4(int n) static gboolean consistentWithOrder(int length, tvbuff_t *tvb, int offset, guint16 (*v16)(tvbuff_t *, gint)) { switch(tvb_get_guint8(tvb, offset)) { - case 1: /* CreateWindow */ + case X_CreateWindow: return !tvb_bytes_exist(tvb, offset, 32) || length == 8 + numberOfBitSet(tvb, offset + 7 * 4, 4); - case 2: /* ChangeWindowAttributes */ - case 56: /* ChangeGC */ + case X_ChangeWindowAttributes: + case X_ChangeGC: return !tvb_bytes_exist(tvb, offset, 12) || length == 3 + numberOfBitSet(tvb, offset + 8, 4); - case 3: /* GetWindowAttributes */ - case 4: /* DestroyWindow */ - case 5: /* DestroySubwindows */ - case 6: /* ChangeSaveSet */ - case 8: /* MapWindow */ - case 9: /* MapSubWindow */ - case 10: /* UnmapWindow */ - case 11: /* UnmapSubwindows */ - case 13: /* CirculateWindow */ - case 14: /* GetGeometry */ - case 15: /* QueryTree */ - case 17: /* GetAtomName */ - case 21: /* ListProperties */ - case 23: /* GetSelectionOwner */ - case 27: /* UngrabPointer */ - case 32: /* UngrabKeyboard */ - case 35: /* AllowEvents */ - case 38: /* QueryPointer */ - case 46: /* CloseFont */ - case 47: /* QueryFont */ - case 54: /* FreePixmap */ - case 60: /* FreeGC */ - case 79: /* FreeColormap */ - case 81: /* InstallColormap */ - case 82: /* UninstallColormap */ - case 83: /* ListInstalledColormaps */ - case 95: /* FreeCursor */ - case 101: /* GetKeyboardMapping */ - case 113: /* KillClient */ + case X_GetWindowAttributes: + case X_DestroyWindow: + case X_DestroySubwindows: + case X_ChangeSaveSet: + case X_MapWindow: + case X_MapSubwindows: + case X_UnmapWindow: + case X_UnmapSubwindows: + case X_CirculateWindow: + case X_GetGeometry: + case X_QueryTree: + case X_GetAtomName: + case X_ListProperties: + case X_GetSelectionOwner: + case X_UngrabPointer: + case X_UngrabKeyboard: + case X_AllowEvents: + case X_QueryPointer: + case X_CloseFont: + case X_QueryFont: + case X_FreePixmap: + case X_FreeGC: + case X_FreeColormap: + case X_InstallColormap: + case X_UninstallColormap: + case X_ListInstalledColormaps: + case X_FreeCursor: + case X_GetKeyboardMapping: + case X_KillClient: return length == 2; - case 7: /* ReparentWindow */ - case 22: /* SetSelectionOwner */ - case 30: /* ChangeActivePointerGrab */ - case 31: /* GrabKeyboard */ - case 33: /* GrabKey */ - case 39: /* GetMotionEvents */ - case 40: /* TranslateCoordinates */ - case 53: /* CreatePixmap */ - case 57: /* CopyGC */ - case 61: /* ClearArea */ - case 78: /* CreateColormap */ - case 84: /* AllocColor */ - case 87: /* AllocColorPlanes */ + case X_ReparentWindow: + case X_SetSelectionOwner: + case X_ChangeActivePointerGrab: + case X_GrabKeyboard: + case X_GrabKey: + case X_GetMotionEvents: + case X_TranslateCoords: + case X_CreatePixmap: + case X_CopyGC: + case X_ClearArea: + case X_CreateColormap: + case X_AllocColor: + case X_AllocColorPlanes: return length == 4; - case 12: /* ConfigureWindow */ + case X_ConfigureWindow: return !tvb_bytes_exist(tvb, offset, 10) || length == 3 + numberOfBitSet(tvb, offset + 8, 2); - case 16: /* InternAtom */ - case 98: /* QueryExtension */ + case X_InternAtom: + case X_QueryExtension: return !tvb_bytes_exist(tvb, offset, 6) || length == 2 + rounded4(v16(tvb, offset + 4)); - case 18: /* ChangeProperty */ + case X_ChangeProperty: { int multiplier, type; if (!tvb_bytes_exist(tvb, offset, 17)) return TRUE; @@ -1761,139 +2436,139 @@ static gboolean consistentWithOrder(int length, tvbuff_t *tvb, int offset, guint return length == 6 + rounded4((v16 == tvb_get_letohs ? tvb_get_letohl : tvb_get_ntohl)(tvb, offset + 20) * multiplier); } - case 19: /* DeleteProperty */ - case 29: /* UngrabButton */ - case 34: /* UngrabKey */ - case 42: /* SetInputFocus */ - case 80: /* CopyColormapAndFree */ - case 86: /* AllocColorCells */ - case 97: /* QueryBestSize */ - case 105: /* ChangePointerControl */ - case 107: /* SetScreenSaver */ + case X_DeleteProperty: + case X_UngrabButton: + case X_UngrabKey: + case X_SetInputFocus: + case X_CopyColormapAndFree: + case X_AllocColorCells: + case X_QueryBestSize: + case X_ChangePointerControl: + case X_SetScreenSaver: return length == 3; - case 20: /* GetProperty */ - case 24: /* ConvertSelection */ - case 26: /* GrabPointer */ - case 28: /* GrabButton */ - case 41: /* WarpPointer */ + case X_GetProperty: + case X_ConvertSelection: + case X_GrabPointer: + case X_GrabButton: + case X_WarpPointer: return length == 6; - case 25: /* SendEvent */ + case X_SendEvent: return length == 11; - case 36: /* GrabServer */ - case 37: /* UngrabServer */ - case 43: /* GetInputFocus */ - case 44: /* QueryKeymap */ - case 52: /* GetFontPath */ - case 99: /* ListExtensions */ - case 103: /* GetKeyboardControl */ - case 104: /* Bell */ - case 106: /* GetPointerControl */ - case 108: /* GetScreenSaver */ - case 110: /* ListHosts */ - case 111: /* SetAccessControl */ - case 112: /* SetCloseDownMode */ - case 115: /* ForceScreenSaver */ - case 117: /* GetPointerMapping */ - case 119: /* GetModifierMapping */ + case X_GrabServer: + case X_UngrabServer: + case X_GetInputFocus: + case X_QueryKeymap: + case X_GetFontPath: + case X_ListExtensions: + case X_GetKeyboardControl: + case X_Bell: + case X_GetPointerControl: + case X_GetScreenSaver: + case X_ListHosts: + case X_SetAccessControl: + case X_SetCloseDownMode: + case X_ForceScreenSaver: + case X_GetPointerMapping: + case X_GetModifierMapping: return length == 1; - case 45: /* OpenFont */ - case 85: /* AllocNamedColor */ - case 92: /* LookupColor */ + case X_OpenFont: + case X_AllocNamedColor: + case X_LookupColor: return !tvb_bytes_exist(tvb, offset, 10) || length == 3 + rounded4(v16(tvb, offset + 8)); - case 48: /* QueryTextExtents */ + case X_QueryTextExtents: return length >= 2; - case 49: /* ListFonts */ - case 50: /* ListFontsWithInfo */ - case 109: /* ChangeHosts */ + case X_ListFonts: + case X_ListFontsWithInfo: + case X_ChangeHosts: return !tvb_bytes_exist(tvb, offset, 8) || length == 2 + rounded4(v16(tvb, offset + 6)); - case 51: /* SetFontPath */ + case X_SetFontPath: if (length < 2) return FALSE; if (!tvb_bytes_exist(tvb, offset, 8)) return TRUE; return listOfStringLengthConsistent(tvb, offset + 8, (length - 2) * 4, v16(tvb, offset + 4)); - case 55: /* CreateGC */ + case X_CreateGC: return !tvb_bytes_exist(tvb, offset, 16) || length == 4 + numberOfBitSet(tvb, offset + 12, 4); - case 58: /* SetDashes */ + case X_SetDashes: return !tvb_bytes_exist(tvb, offset, 12) || length == 3 + rounded4(v16(tvb, offset + 10)); - case 59: /* SetClipRectangles */ - case 66: /* PolySegment */ - case 67: /* PolyRectangle */ - case 70: /* PolyFillRectangle */ + case X_SetClipRectangles: + case X_PolySegment: + case X_PolyRectangle: + case X_PolyFillRectangle: return length >= 3 && (length - 3) % 2 == 0; - case 62: /* CopyArea */ + case X_CopyArea: return length == 7; - case 63: /* CopyPlane */ - case 93: /* CreateCursor */ - case 94: /* CreateGlyphCursor */ + case X_CopyPlane: + case X_CreateCursor: + case X_CreateGlyphCursor: return length == 8; - case 64: /* PolyPoint */ - case 65: /* PolyLine */ - case 88: /* FreeColors */ + case X_PolyPoint: + case X_PolyLine: + case X_FreeColors: return length >= 3; - case 68: /* PolyArc */ - case 71: /* PolyFillArc */ + case X_PolyArc: + case X_PolyFillArc: return length >= 3 && (length - 3) % 3 == 0; - case 69: /* FillPoly */ - case 76: /* ImageText8 */ + case X_FillPoly: + case X_ImageText8: return length >= 4; - case 72: /* PutImage */ + case X_PutImage: return length >= 6; - case 73: /* GetImage */ - case 96: /* RecolorCursor */ + case X_GetImage: + case X_RecolorCursor: return length == 5; - case 74: /* PolyText8 */ + case X_PolyText8: if (length < 4) return FALSE; return TRUE; /* We don't perform many controls on this one */ - case 75: /* PolyText16 */ + case X_PolyText16: if (length < 4) return FALSE; return TRUE; /* We don't perform many controls on this one */ - case 77: /* ImageText16 */ + case X_ImageText16: return length >= 4; - case 89: /* StoreColors */ + case X_StoreColors: return length > 2 && (length - 2) % 3 == 0; - case 90: /* StoreNamedColor */ + case X_StoreNamedColor: return !tvb_bytes_exist(tvb, offset, 14) || length == 4 + rounded4(v16(tvb, offset + 12)); - case 91: /* QueryColors */ + case X_QueryColors: return length >= 2; - case 100: /* ChangeKeyboardMapping */ + case X_ChangeKeyboardMapping: return !tvb_bytes_exist(tvb, offset, 6) || length == 2 + tvb_get_guint8(tvb, 1) * tvb_get_guint8(tvb, 5); - case 102: /* ChangeKeyboardControl */ + case X_ChangeKeyboardControl: return !tvb_bytes_exist(tvb, offset, 6) || length == 2 + numberOfBitSet(tvb, offset + 4, 2); - case 114: /* RotateProperties */ + case X_RotateProperties: return !tvb_bytes_exist(tvb, offset, 10) || length == 3 + v16(tvb, offset + 8); - case 116: /* SetPointerMapping */ + case X_SetPointerMapping: return length == 1 + rounded4(tvb_get_guint8(tvb, 1)); - case 118: /* SetModifierMapping */ + case X_SetModifierMapping: return length == 1 + tvb_get_guint8(tvb, 1) * 2; - case 127: /* NoOperation */ + case X_NoOperation: return length >= 1; default: @@ -1921,16 +2596,16 @@ static int x_endian_match(tvbuff_t *tvb, guint16 (*v16)(tvbuff_t *, gint)) static gboolean guess_byte_ordering(tvbuff_t *tvb, packet_info *pinfo, - x11_conv_data_t *state_info) + x11_conv_data_t *state) { /* With X the client gives the byte ordering for the protocol, and the port on the server tells us we're speaking X. */ int le, be, decision, decisionToCache; - if (state_info->byte_order == BYTE_ORDER_BE) + if (state->byte_order == BYTE_ORDER_BE) return FALSE; /* known to be big-endian */ - else if (state_info->byte_order == BYTE_ORDER_LE) + else if (state->byte_order == BYTE_ORDER_LE) return TRUE; /* known to be little-endian */ if (pinfo->srcport == pinfo->match_port) { @@ -1967,7 +2642,7 @@ guess_byte_ordering(tvbuff_t *tvb, packet_info *pinfo, /* * Remember the decision. */ - state_info->byte_order = decision ? BYTE_ORDER_LE : BYTE_ORDER_BE; + state->byte_order = decision ? BYTE_ORDER_LE : BYTE_ORDER_BE; } /* @@ -1987,7 +2662,7 @@ guess_byte_ordering(tvbuff_t *tvb, packet_info *pinfo, * Decode an initial connection request. */ static void dissect_x11_initial_conn(tvbuff_t *tvb, packet_info *pinfo, - proto_tree *tree, x11_conv_data_t *state_info, gboolean little_endian) + proto_tree *tree, x11_conv_data_t *state, gboolean little_endian) { int offset = 0; int *offsetp = &offset; @@ -1997,6 +2672,7 @@ static void dissect_x11_initial_conn(tvbuff_t *tvb, packet_info *pinfo, gint left; ti = proto_tree_add_item(tree, proto_x11, tvb, 0, -1, FALSE); + proto_item_append_text(ti, ", Request, Initial connection request"); t = proto_item_add_subtree(ti, ett_x11); CARD8(byte_order); @@ -2006,31 +2682,84 @@ static void dissect_x11_initial_conn(tvbuff_t *tvb, packet_info *pinfo, auth_proto_name_length = CARD16(authorization_protocol_name_length); auth_proto_data_length = CARD16(authorization_protocol_data_length); UNUSED(2); + if (auth_proto_name_length != 0) { STRING8(authorization_protocol_name, auth_proto_name_length); offset = ROUND_LENGTH(offset); } + if (auth_proto_data_length != 0) { STRING8(authorization_protocol_data, auth_proto_data_length); offset = ROUND_LENGTH(offset); } - left = tvb_length_remaining(tvb, offset); - if (left) - proto_tree_add_item(t, hf_x11_undecoded, tvb, offset, left, little_endian); + + if ((left = tvb_reported_length_remaining(tvb, offset)) > 0) + proto_tree_add_item(t, hf_x11_undecoded, tvb, offset, left, + little_endian); /* * This is the initial connection request... */ - state_info->iconn_frame = pinfo->fd->num; + state->iconn_frame = pinfo->fd->num; /* * ...and we're expecting a reply to it. */ - state_info->opcode = INITIAL_CONN; + state->sequencenumber = 0; + g_hash_table_insert(state->seqtable, (int *)state->sequencenumber, + (int *)INITIAL_CONN); +} + +static void dissect_x11_initial_reply(tvbuff_t *tvb, packet_info *pinfo, + proto_tree *tree, const char _U_ *sep, x11_conv_data_t *state, + gboolean little_endian) +{ + int offset = 0, *offsetp = &offset, left; + unsigned char success; + int length_of_vendor; + proto_item *ti; + proto_tree *t; + + ti = proto_tree_add_item(tree, proto_x11, tvb, 0, -1, FALSE); + proto_item_append_text(ti, ", Reply, Initial connection reply"); + t = proto_item_add_subtree(ti, ett_x11); + + state->iconn_reply = pinfo->fd->num; + success = INT8(success); + if (success == 0) { + UNDECODED(1); + } + else { + UNUSED(1); + } + + INT16(protocol_major_version); + INT16(protocol_minor_version); + INT16(replylength); + INT32(release_number); + INT32(resource_id_base); + INT32(resource_id_mask); + INT32(motion_buffer_size); + length_of_vendor = INT16(length_of_vendor); + INT16(maximum_request_length); + INT8(number_of_screens_in_roots); + INT8(number_of_formats_in_pixmap_formats); + INT8(image_byte_order); + INT8(bitmap_format_bit_order); + INT8(bitmap_format_scanline_unit); + INT8(bitmap_format_scanline_pad); + INT8(min_keycode); + INT8(max_keycode); + UNUSED(4); + STRING8(vendor, length_of_vendor); + + if ((left = tvb_reported_length_remaining(tvb, offset)) > 0) + UNDECODED(left); + } static void dissect_x11_request(tvbuff_t *tvb, packet_info *pinfo, - proto_tree *tree, const char *sep, x11_conv_data_t *state_info, + proto_tree *tree, const char *sep, x11_conv_data_t *state, gboolean little_endian) { int offset = 0; @@ -2039,10 +2768,11 @@ static void dissect_x11_request(tvbuff_t *tvb, packet_info *pinfo, proto_item *ti; proto_tree *t; int length, opcode; - guint8 v8, v8_2; + guint8 v8, v8_2, v8_3; guint16 v16; guint32 v32; gint left; + char *str; length = VALUE16(tvb, 2) * 4; @@ -2056,70 +2786,88 @@ static void dissect_x11_request(tvbuff_t *tvb, packet_info *pinfo, ti = proto_tree_add_item(tree, proto_x11, tvb, 0, -1, FALSE); t = proto_item_add_subtree(ti, ett_x11); + if (PACKET_IS_NEW(pinfo)) + ++state->sequencenumber; + OPCODE(); if (check_col(pinfo->cinfo, COL_INFO)) col_append_fstr(pinfo->cinfo, COL_INFO, "%s %s", sep, - val_to_str(opcode, opcode_vals, "Unknown (%u)")); + val_to_str(opcode, opcode_vals, "<Unknown opcode %d>")); + + str = g_strdup_printf(", Request, opcode: %d (%s)", + opcode, val_to_str(opcode, opcode_vals, + "<Unknown opcode %d>")); + + proto_item_append_text(ti, str); + g_free(str); /* * Does this request expect a reply? */ switch(opcode) { - - case 3: /* GetWindowAttributes */ - case 14: /* GetGeometry */ - case 15: /* QueryTree */ - case 16: /* InternAtom */ - case 17: /* GetAtomName */ - case 20: /* GetProperty */ - case 21: /* ListProperties */ - case 23: /* GetSelectionOwner */ - case 26: /* GrabPointer */ - case 31: /* GrabKeyboard */ - case 38: /* QueryPointer */ - case 39: /* GetMotionEvents */ - case 40: /* TranslateCoordinates */ - case 44: /* QueryKeymap */ - case 47: /* QueryFont */ - case 48: /* QueryTextExtents */ - case 49: /* ListFonts */ - case 73: /* GetImage */ - case 83: /* ListInstalledColormaps */ - case 84: /* AllocColor */ - case 91: /* QueryColors */ - case 92: /* LookupColor */ - case 97: /* QueryBestSize */ - case 98: /* QueryExtension */ - case 99: /* ListExtensions */ - case 101: /* GetKeyboardMapping */ - case 103: /* GetKeyboardControl */ - case 106: /* GetPointerControl */ - case 108: /* GetScreenSaver */ - case 110: /* ListHosts */ - case 116: /* SetPointerMapping */ - case 117: /* GetPointerMapping */ - case 118: /* SetModifierMapping */ - case 119: /* GetModifierMapping */ - /* - * Those requests expect a reply. - */ - state_info->opcode = opcode; - break; + case X_AllocColor: + case X_AllocColorCells: + case X_AllocColorPlanes: + case X_AllocNamedColor: + case X_GetAtomName: + case X_GetFontPath: + case X_GetGeometry: + case X_GetImage: + case X_GetInputFocus: + case X_GetKeyboardControl: + case X_GetKeyboardMapping: + case X_GetModifierMapping: + case X_GetMotionEvents: + case X_GetPointerControl: + case X_GetPointerMapping: + case X_GetProperty: + case X_GetScreenSaver: + case X_GetSelectionOwner: + case X_GetWindowAttributes: + case X_GrabKeyboard: + case X_GrabPointer: + case X_InternAtom: + case X_ListExtensions: + case X_ListFonts: + case X_ListFontsWithInfo: + case X_ListHosts: + case X_ListInstalledColormaps: + case X_ListProperties: + case X_LookupColor: + case X_QueryBestSize: + case X_QueryColors: + case X_QueryExtension: + case X_QueryFont: + case X_QueryKeymap: + case X_QueryPointer: + case X_QueryTextExtents: + case X_QueryTree: + case X_SetModifierMapping: + case X_SetPointerMapping: + case X_TranslateCoords: + /* + * Those requests expect a reply. + */ + + g_hash_table_insert(state->seqtable, + (int *)state->sequencenumber, (int *)opcode); + + break; default: - /* - * No reply is expected from any other request. - */ - state_info->opcode = NOTHING_EXPECTED; - break; + /* + * No reply is expected from any other request. + */ + break; } - if (!tree) return; + if (tree == NULL) + return; switch(opcode) { - case 1: /* CreateWindow */ + case X_CreateWindow: CARD8(depth); REQUEST_LENGTH(); WINDOW(wid); @@ -2134,28 +2882,28 @@ static void dissect_x11_request(tvbuff_t *tvb, packet_info *pinfo, windowAttributes(tvb, offsetp, t, little_endian); break; - case 2: /* ChangeWindowAttributes */ + case X_ChangeWindowAttributes: UNUSED(1); REQUEST_LENGTH(); WINDOW(window); windowAttributes(tvb, offsetp, t, little_endian); break; - case 3: /* GetWindowAttributes */ - case 4: /* DestroyWindow */ - case 5: /* DestroySubwindows */ + case X_GetWindowAttributes: + case X_DestroyWindow: + case X_DestroySubwindows: UNUSED(1); REQUEST_LENGTH(); WINDOW(window); break; - case 6: /* ChangeSaveSet */ + case X_ChangeSaveSet: ENUM8(save_set_mode); REQUEST_LENGTH(); WINDOW(window); break; - case 7: /* ReparentWindow */ + case X_ReparentWindow: UNUSED(1); REQUEST_LENGTH(); WINDOW(window); @@ -2164,16 +2912,16 @@ static void dissect_x11_request(tvbuff_t *tvb, packet_info *pinfo, INT16(y); break; - case 8: /* MapWindow */ - case 9: /* MapSubWindow */ - case 10: /* UnmapWindow */ - case 11: /* UnmapSubwindows */ + case X_MapWindow: + case X_MapSubwindows: + case X_UnmapWindow: + case X_UnmapSubwindows: UNUSED(1); REQUEST_LENGTH(); WINDOW(window); break; - case 12: /* ConfigureWindow */ + case X_ConfigureWindow: UNUSED(1); REQUEST_LENGTH(); WINDOW(window); @@ -2190,20 +2938,20 @@ static void dissect_x11_request(tvbuff_t *tvb, packet_info *pinfo, PAD(); break; - case 13: /* CirculateWindow */ + case X_CirculateWindow: ENUM8(direction); REQUEST_LENGTH(); WINDOW(window); break; - case 14: /* GetGeometry */ - case 15: /* QueryTree */ + case X_GetGeometry: + case X_QueryTree: UNUSED(1); REQUEST_LENGTH(); DRAWABLE(drawable); break; - case 16: /* InternAtom */ + case X_InternAtom: BOOL(only_if_exists); REQUEST_LENGTH(); v16 = FIELD16(name_length); @@ -2212,13 +2960,13 @@ static void dissect_x11_request(tvbuff_t *tvb, packet_info *pinfo, PAD(); break; - case 17: /* GetAtomName */ + case X_GetAtomName: UNUSED(1); REQUEST_LENGTH(); ATOM(atom); break; - case 18: /* ChangeProperty */ + case X_ChangeProperty: ENUM8(mode); REQUEST_LENGTH(); WINDOW(window); @@ -2231,14 +2979,14 @@ static void dissect_x11_request(tvbuff_t *tvb, packet_info *pinfo, PAD(); break; - case 19: /* DeleteProperty */ + case X_DeleteProperty: UNUSED(1); REQUEST_LENGTH(); WINDOW(window); ATOM(property); break; - case 20: /* GetProperty */ + case X_GetProperty: BOOL(delete); REQUEST_LENGTH(); WINDOW(window); @@ -2248,13 +2996,13 @@ static void dissect_x11_request(tvbuff_t *tvb, packet_info *pinfo, CARD32(long_length); break; - case 21: /* ListProperties */ + case X_ListProperties: UNUSED(1); REQUEST_LENGTH(); WINDOW(window); break; - case 22: /* SetSelectionOwner */ + case X_SetSelectionOwner: UNUSED(1); REQUEST_LENGTH(); WINDOW(owner); @@ -2262,13 +3010,13 @@ static void dissect_x11_request(tvbuff_t *tvb, packet_info *pinfo, TIMESTAMP(time); break; - case 23: /* GetSelectionOwner */ + case X_GetSelectionOwner: UNUSED(1); REQUEST_LENGTH(); ATOM(selection); break; - case 24: /* ConvertSelection */ + case X_ConvertSelection: UNUSED(1); REQUEST_LENGTH(); WINDOW(requestor); @@ -2278,7 +3026,7 @@ static void dissect_x11_request(tvbuff_t *tvb, packet_info *pinfo, TIMESTAMP(time); break; - case 26: /* GrabPointer */ + case X_GrabPointer: BOOL(owner_events); REQUEST_LENGTH(); WINDOW(grab_window); @@ -2290,13 +3038,13 @@ static void dissect_x11_request(tvbuff_t *tvb, packet_info *pinfo, TIMESTAMP(time); break; - case 27: /* UngrabPointer */ + case X_UngrabPointer: UNUSED(1); REQUEST_LENGTH(); TIMESTAMP(time); break; - case 28: /* GrabButton */ + case X_GrabButton: BOOL(owner_events); REQUEST_LENGTH(); WINDOW(grab_window); @@ -2310,7 +3058,7 @@ static void dissect_x11_request(tvbuff_t *tvb, packet_info *pinfo, SETofKEYMASK(modifiers); break; - case 29: /* UngrabButton */ + case X_UngrabButton: BUTTON(button); REQUEST_LENGTH(); WINDOW(grab_window); @@ -2318,7 +3066,7 @@ static void dissect_x11_request(tvbuff_t *tvb, packet_info *pinfo, UNUSED(2); break; - case 30: /* ChangeActivePointerGrab */ + case X_ChangeActivePointerGrab: UNUSED(1); REQUEST_LENGTH(); CURSOR(cursor); @@ -2327,7 +3075,7 @@ static void dissect_x11_request(tvbuff_t *tvb, packet_info *pinfo, UNUSED(2); break; - case 31: /* GrabKeyboard */ + case X_GrabKeyboard: BOOL(owner_events); REQUEST_LENGTH(); WINDOW(grab_window); @@ -2337,13 +3085,13 @@ static void dissect_x11_request(tvbuff_t *tvb, packet_info *pinfo, UNUSED(2); break; - case 32: /* UngrabKeyboard */ + case X_UngrabKeyboard: UNUSED(1); REQUEST_LENGTH(); TIMESTAMP(time); break; - case 33: /* GrabKey */ + case X_GrabKey: BOOL(owner_events); REQUEST_LENGTH(); WINDOW(grab_window); @@ -2354,7 +3102,7 @@ static void dissect_x11_request(tvbuff_t *tvb, packet_info *pinfo, UNUSED(3); break; - case 34: /* UngrabKey */ + case X_UngrabKey: KEYCODE(key); REQUEST_LENGTH(); WINDOW(grab_window); @@ -2362,29 +3110,29 @@ static void dissect_x11_request(tvbuff_t *tvb, packet_info *pinfo, UNUSED(2); break; - case 35: /* AllowEvents */ + case X_AllowEvents: ENUM8(allow_events_mode); REQUEST_LENGTH(); TIMESTAMP(time); break; - case 36: /* GrabServer */ + case X_GrabServer: UNUSED(1); REQUEST_LENGTH(); break; - case 37: /* UngrabServer */ + case X_UngrabServer: UNUSED(1); REQUEST_LENGTH(); break; - case 38: /* QueryPointer */ + case X_QueryPointer: UNUSED(1); REQUEST_LENGTH(); WINDOW(window); break; - case 39: /* GetMotionEvents */ + case X_GetMotionEvents: UNUSED(1); REQUEST_LENGTH(); WINDOW(window); @@ -2392,7 +3140,7 @@ static void dissect_x11_request(tvbuff_t *tvb, packet_info *pinfo, TIMESTAMP(stop); break; - case 40: /* TranslateCoordinates */ + case X_TranslateCoords: UNUSED(1); REQUEST_LENGTH(); WINDOW(src_window); @@ -2401,7 +3149,7 @@ static void dissect_x11_request(tvbuff_t *tvb, packet_info *pinfo, INT16(src_y); break; - case 41: /* WarpPointer */ + case X_WarpPointer: UNUSED(1); REQUEST_LENGTH(); WINDOW(warp_pointer_src_window); @@ -2414,24 +3162,24 @@ static void dissect_x11_request(tvbuff_t *tvb, packet_info *pinfo, INT16(dst_y); break; - case 42: /* SetInputFocus */ + case X_SetInputFocus: ENUM8(revert_to); REQUEST_LENGTH(); WINDOW(focus); TIMESTAMP(time); break; - case 43: /* GetInputFocus */ + case X_GetInputFocus: UNUSED(1); REQUEST_LENGTH(); break; - case 44: /* QueryKeymap */ + case X_QueryKeymap: UNUSED(1); REQUEST_LENGTH(); break; - case 45: /* OpenFont */ + case X_OpenFont: UNUSED(1); REQUEST_LENGTH(); FONT(fid); @@ -2441,19 +3189,19 @@ static void dissect_x11_request(tvbuff_t *tvb, packet_info *pinfo, PAD(); break; - case 46: /* CloseFont */ + case X_CloseFont: UNUSED(1); REQUEST_LENGTH(); FONT(font); break; - case 47: /* QueryFont */ + case X_QueryFont: UNUSED(1); REQUEST_LENGTH(); FONTABLE(font); break; - case 48: /* QueryTextExtents */ + case X_QueryTextExtents: v8 = BOOL(odd_length); REQUEST_LENGTH(); FONTABLE(font); @@ -2461,7 +3209,7 @@ static void dissect_x11_request(tvbuff_t *tvb, packet_info *pinfo, PAD(); break; - case 49: /* ListFonts */ + case X_ListFonts: UNUSED(1); REQUEST_LENGTH(); CARD16(max_names); @@ -2470,7 +3218,7 @@ static void dissect_x11_request(tvbuff_t *tvb, packet_info *pinfo, PAD(); break; - case 50: /* ListFontsWithInfo */ + case X_ListFontsWithInfo: UNUSED(1); REQUEST_LENGTH(); CARD16(max_names); @@ -2479,7 +3227,7 @@ static void dissect_x11_request(tvbuff_t *tvb, packet_info *pinfo, PAD(); break; - case 51: /* SetFontPath */ + case X_SetFontPath: UNUSED(1); REQUEST_LENGTH(); v16 = CARD16(str_number_in_path); @@ -2488,12 +3236,12 @@ static void dissect_x11_request(tvbuff_t *tvb, packet_info *pinfo, PAD(); break; - case 52: /* GetFontPath */ + case X_GetFontPath: UNUSED(1); REQUEST_LENGTH(); break; - case 53: /* CreatePixmap */ + case X_CreatePixmap: CARD8(depth); REQUEST_LENGTH(); PIXMAP(pid); @@ -2502,13 +3250,13 @@ static void dissect_x11_request(tvbuff_t *tvb, packet_info *pinfo, CARD16(height); break; - case 54: /* FreePixmap */ + case X_FreePixmap: UNUSED(1); REQUEST_LENGTH(); PIXMAP(pixmap); break; - case 55: /* CreateGC */ + case X_CreateGC: UNUSED(1); REQUEST_LENGTH(); GCONTEXT(cid); @@ -2516,14 +3264,14 @@ static void dissect_x11_request(tvbuff_t *tvb, packet_info *pinfo, gcAttributes(tvb, offsetp, t, little_endian); break; - case 56: /* ChangeGC */ + case X_ChangeGC: UNUSED(1); REQUEST_LENGTH(); GCONTEXT(gc); gcAttributes(tvb, offsetp, t, little_endian); break; - case 57: /* CopyGC */ + case X_CopyGC: UNUSED(1); REQUEST_LENGTH(); GCONTEXT(src_gc); @@ -2531,7 +3279,7 @@ static void dissect_x11_request(tvbuff_t *tvb, packet_info *pinfo, gcMask(tvb, offsetp, t, little_endian); break; - case 58: /* SetDashes */ + case X_SetDashes: UNUSED(1); REQUEST_LENGTH(); GCONTEXT(gc); @@ -2541,7 +3289,7 @@ static void dissect_x11_request(tvbuff_t *tvb, packet_info *pinfo, PAD(); break; - case 59: /* SetClipRectangles */ + case X_SetClipRectangles: ENUM8(ordering); REQUEST_LENGTH(); GCONTEXT(gc); @@ -2550,13 +3298,13 @@ static void dissect_x11_request(tvbuff_t *tvb, packet_info *pinfo, LISTofRECTANGLE(rectangles); break; - case 60: /* FreeGC */ + case X_FreeGC: UNUSED(1); REQUEST_LENGTH(); GCONTEXT(gc); break; - case 61: /* ClearArea */ + case X_ClearArea: BOOL(exposures); REQUEST_LENGTH(); WINDOW(window); @@ -2566,7 +3314,7 @@ static void dissect_x11_request(tvbuff_t *tvb, packet_info *pinfo, CARD16(height); break; - case 62: /* CopyArea */ + case X_CopyArea: UNUSED(1); REQUEST_LENGTH(); DRAWABLE(src_drawable); @@ -2580,7 +3328,7 @@ static void dissect_x11_request(tvbuff_t *tvb, packet_info *pinfo, CARD16(height); break; - case 63: /* CopyPlane */ + case X_CopyPlane: UNUSED(1); REQUEST_LENGTH(); DRAWABLE(src_drawable); @@ -2595,7 +3343,7 @@ static void dissect_x11_request(tvbuff_t *tvb, packet_info *pinfo, CARD32(bit_plane); break; - case 64: /* PolyPoint */ + case X_PolyPoint: ENUM8(coordinate_mode); v16 = REQUEST_LENGTH(); DRAWABLE(drawable); @@ -2603,7 +3351,7 @@ static void dissect_x11_request(tvbuff_t *tvb, packet_info *pinfo, LISTofPOINT(points, v16 - 12); break; - case 65: /* PolyLine */ + case X_PolyLine: ENUM8(coordinate_mode); v16 = REQUEST_LENGTH(); DRAWABLE(drawable); @@ -2611,7 +3359,7 @@ static void dissect_x11_request(tvbuff_t *tvb, packet_info *pinfo, LISTofPOINT(points, v16 - 12); break; - case 66: /* PolySegment */ + case X_PolySegment: UNUSED(1); REQUEST_LENGTH(); DRAWABLE(drawable); @@ -2619,7 +3367,7 @@ static void dissect_x11_request(tvbuff_t *tvb, packet_info *pinfo, LISTofSEGMENT(segments); break; - case 67: /* PolyRectangle */ + case X_PolyRectangle: UNUSED(1); REQUEST_LENGTH(); DRAWABLE(drawable); @@ -2627,7 +3375,7 @@ static void dissect_x11_request(tvbuff_t *tvb, packet_info *pinfo, LISTofRECTANGLE(rectangles); break; - case 68: /* PolyArc */ + case X_PolyArc: UNUSED(1); REQUEST_LENGTH(); DRAWABLE(drawable); @@ -2635,7 +3383,7 @@ static void dissect_x11_request(tvbuff_t *tvb, packet_info *pinfo, LISTofARC(arcs); break; - case 69: /* FillPoly */ + case X_FillPoly: UNUSED(1); v16 = REQUEST_LENGTH(); DRAWABLE(drawable); @@ -2646,7 +3394,7 @@ static void dissect_x11_request(tvbuff_t *tvb, packet_info *pinfo, LISTofPOINT(points, v16 - 16); break; - case 70: /* PolyFillRectangle */ + case X_PolyFillRectangle: UNUSED(1); REQUEST_LENGTH(); DRAWABLE(drawable); @@ -2654,7 +3402,7 @@ static void dissect_x11_request(tvbuff_t *tvb, packet_info *pinfo, LISTofRECTANGLE(rectangles); break; - case 71: /* PolyFillArc */ + case X_PolyFillArc: UNUSED(1); REQUEST_LENGTH(); DRAWABLE(drawable); @@ -2662,7 +3410,7 @@ static void dissect_x11_request(tvbuff_t *tvb, packet_info *pinfo, LISTofARC(arcs); break; - case 72: /* PutImage */ + case X_PutImage: ENUM8(image_format); v16 = REQUEST_LENGTH(); DRAWABLE(drawable); @@ -2678,7 +3426,7 @@ static void dissect_x11_request(tvbuff_t *tvb, packet_info *pinfo, PAD(); break; - case 73: /* GetImage */ + case X_GetImage: ENUM8(image_pixmap_format); REQUEST_LENGTH(); DRAWABLE(drawable); @@ -2689,7 +3437,7 @@ static void dissect_x11_request(tvbuff_t *tvb, packet_info *pinfo, CARD32(plane_mask); break; - case 74: /* PolyText8 */ + case X_PolyText8: UNUSED(1); v16 = REQUEST_LENGTH(); DRAWABLE(drawable); @@ -2700,7 +3448,7 @@ static void dissect_x11_request(tvbuff_t *tvb, packet_info *pinfo, PAD(); break; - case 75: /* PolyText16 */ + case X_PolyText16: UNUSED(1); v16 = REQUEST_LENGTH(); DRAWABLE(drawable); @@ -2711,7 +3459,7 @@ static void dissect_x11_request(tvbuff_t *tvb, packet_info *pinfo, PAD(); break; - case 76: /* ImageText8 */ + case X_ImageText8: v8 = FIELD8(string_length); REQUEST_LENGTH(); DRAWABLE(drawable); @@ -2722,7 +3470,7 @@ static void dissect_x11_request(tvbuff_t *tvb, packet_info *pinfo, PAD(); break; - case 77: /* ImageText16 */ + case X_ImageText16: v8 = FIELD8(string_length); REQUEST_LENGTH(); DRAWABLE(drawable); @@ -2733,7 +3481,7 @@ static void dissect_x11_request(tvbuff_t *tvb, packet_info *pinfo, PAD(); break; - case 78: /* CreateColormap */ + case X_CreateColormap: ENUM8(alloc); REQUEST_LENGTH(); COLORMAP(mid); @@ -2741,38 +3489,38 @@ static void dissect_x11_request(tvbuff_t *tvb, packet_info *pinfo, VISUALID(visual); break; - case 79: /* FreeColormap */ + case X_FreeColormap: UNUSED(1); REQUEST_LENGTH(); COLORMAP(cmap); break; - case 80: /* CopyColormapAndFree */ + case X_CopyColormapAndFree: UNUSED(1); REQUEST_LENGTH(); COLORMAP(mid); COLORMAP(src_cmap); break; - case 81: /* InstallColormap */ + case X_InstallColormap: UNUSED(1); REQUEST_LENGTH(); COLORMAP(cmap); break; - case 82: /* UninstallColormap */ + case X_UninstallColormap: UNUSED(1); REQUEST_LENGTH(); COLORMAP(cmap); break; - case 83: /* ListInstalledColormaps */ + case X_ListInstalledColormaps: UNUSED(1); REQUEST_LENGTH(); WINDOW(window); break; - case 84: /* AllocColor */ + case X_AllocColor: UNUSED(1); REQUEST_LENGTH(); COLORMAP(cmap); @@ -2782,7 +3530,7 @@ static void dissect_x11_request(tvbuff_t *tvb, packet_info *pinfo, UNUSED(2); break; - case 85: /* AllocNamedColor */ + case X_AllocNamedColor: UNUSED(1); REQUEST_LENGTH(); COLORMAP(cmap); @@ -2792,7 +3540,7 @@ static void dissect_x11_request(tvbuff_t *tvb, packet_info *pinfo, PAD(); break; - case 86: /* AllocColorCells */ + case X_AllocColorCells: BOOL(contiguous); REQUEST_LENGTH(); COLORMAP(cmap); @@ -2800,7 +3548,7 @@ static void dissect_x11_request(tvbuff_t *tvb, packet_info *pinfo, CARD16(planes); break; - case 87: /* AllocColorPlanes */ + case X_AllocColorPlanes: BOOL(contiguous); REQUEST_LENGTH(); COLORMAP(cmap); @@ -2810,7 +3558,7 @@ static void dissect_x11_request(tvbuff_t *tvb, packet_info *pinfo, CARD16(blues); break; - case 88: /* FreeColors */ + case X_FreeColors: UNUSED(1); v16 = REQUEST_LENGTH(); COLORMAP(cmap); @@ -2818,14 +3566,14 @@ static void dissect_x11_request(tvbuff_t *tvb, packet_info *pinfo, LISTofCARD32(pixels, v16 - 12); break; - case 89: /* StoreColors */ + case X_StoreColors: UNUSED(1); v16 = REQUEST_LENGTH(); COLORMAP(cmap); LISTofCOLORITEM(color_items, v16 - 8); break; - case 90: /* StoreNamedColor */ + case X_StoreNamedColor: COLOR_FLAGS(color); REQUEST_LENGTH(); COLORMAP(cmap); @@ -2836,14 +3584,14 @@ static void dissect_x11_request(tvbuff_t *tvb, packet_info *pinfo, PAD(); break; - case 91: /* QueryColors */ + case X_QueryColors: UNUSED(1); v16 = REQUEST_LENGTH(); COLORMAP(cmap); LISTofCARD32(pixels, v16 - 8); break; - case 92: /* LookupColor */ + case X_LookupColor: UNUSED(1); REQUEST_LENGTH(); COLORMAP(cmap); @@ -2853,7 +3601,7 @@ static void dissect_x11_request(tvbuff_t *tvb, packet_info *pinfo, PAD(); break; - case 93: /* CreateCursor */ + case X_CreateCursor: UNUSED(1); REQUEST_LENGTH(); CURSOR(cid); @@ -2869,7 +3617,7 @@ static void dissect_x11_request(tvbuff_t *tvb, packet_info *pinfo, CARD16(y); break; - case 94: /* CreateGlyphCursor */ + case X_CreateGlyphCursor: UNUSED(1); REQUEST_LENGTH(); CURSOR(cid); @@ -2885,13 +3633,13 @@ static void dissect_x11_request(tvbuff_t *tvb, packet_info *pinfo, CARD16(back_blue); break; - case 95: /* FreeCursor */ + case X_FreeCursor: UNUSED(1); REQUEST_LENGTH(); CURSOR(cursor); break; - case 96: /* RecolorCursor */ + case X_RecolorCursor: UNUSED(1); REQUEST_LENGTH(); CURSOR(cursor); @@ -2903,7 +3651,7 @@ static void dissect_x11_request(tvbuff_t *tvb, packet_info *pinfo, CARD16(back_blue); break; - case 97: /* QueryBestSize */ + case X_QueryBestSize: ENUM8(class); REQUEST_LENGTH(); DRAWABLE(drawable); @@ -2911,7 +3659,7 @@ static void dissect_x11_request(tvbuff_t *tvb, packet_info *pinfo, CARD16(height); break; - case 98: /* QueryExtension */ + case X_QueryExtension: UNUSED(1); REQUEST_LENGTH(); v16 = FIELD16(name_length); @@ -2920,29 +3668,30 @@ static void dissect_x11_request(tvbuff_t *tvb, packet_info *pinfo, PAD(); break; - case 99: /* ListExtensions */ + case X_ListExtensions: UNUSED(1); REQUEST_LENGTH(); break; - case 100: /* ChangeKeyboardMapping */ + case X_ChangeKeyboardMapping: v8 = FIELD8(keycode_count); REQUEST_LENGTH(); - KEYCODE(first_keycode); - v8_2 = FIELD8(keysyms_per_keycode); + v8_2 = KEYCODE(first_keycode); + v8_3 = FIELD8(keysyms_per_keycode); UNUSED(2); - LISTofKEYSYM(keysyms, v8, v8_2); + LISTofKEYSYM(keysyms, state->keycodemap, v8_2, v8, v8_3); break; - case 101: /* GetKeyboardMapping */ + case X_GetKeyboardMapping: UNUSED(1); REQUEST_LENGTH(); - KEYCODE(first_keycode); + state->request.GetKeyboardMapping.first_keycode + = KEYCODE(first_keycode); FIELD8(count); UNUSED(2); break; - case 102: /* ChangeKeyboardControl */ + case X_ChangeKeyboardControl: UNUSED(1); REQUEST_LENGTH(); BITMASK32(keyboard_value); @@ -2957,17 +3706,17 @@ static void dissect_x11_request(tvbuff_t *tvb, packet_info *pinfo, ENDBITMASK; break; - case 103: /* GetKeyboardControl */ + case X_GetKeyboardControl: UNUSED(1); REQUEST_LENGTH(); break; - case 104: /* Bell */ + case X_Bell: INT8(percent); REQUEST_LENGTH(); break; - case 105: /* ChangePointerControl */ + case X_ChangePointerControl: UNUSED(1); REQUEST_LENGTH(); INT16(acceleration_numerator); @@ -2977,12 +3726,12 @@ static void dissect_x11_request(tvbuff_t *tvb, packet_info *pinfo, BOOL(do_threshold); break; - case 106: /* GetPointerControl */ + case X_GetPointerControl: UNUSED(1); REQUEST_LENGTH(); break; - case 107: /* SetScreenSaver */ + case X_SetScreenSaver: UNUSED(1); REQUEST_LENGTH(); INT16(timeout); @@ -2992,12 +3741,12 @@ static void dissect_x11_request(tvbuff_t *tvb, packet_info *pinfo, UNUSED(2); break; - case 108: /* GetScreenSaver */ + case X_GetScreenSaver: UNUSED(1); REQUEST_LENGTH(); break; - case 109: /* ChangeHosts */ + case X_ChangeHosts: ENUM8(change_host_mode); REQUEST_LENGTH(); v8 = ENUM8(family); @@ -3014,28 +3763,28 @@ static void dissect_x11_request(tvbuff_t *tvb, packet_info *pinfo, LISTofCARD8(address, v16); break; - case 110: /* ListHosts */ + case X_ListHosts: UNUSED(1); REQUEST_LENGTH(); break; - case 111: /* SetAccessControl */ + case X_SetAccessControl: ENUM8(access_mode); REQUEST_LENGTH(); break; - case 112: /* SetCloseDownMode */ + case X_SetCloseDownMode: ENUM8(close_down_mode); REQUEST_LENGTH(); break; - case 113: /* KillClient */ + case X_KillClient: UNUSED(1); REQUEST_LENGTH(); CARD32(resource); break; - case 114: /* RotateProperties */ + case X_RotateProperties: UNUSED(1); v16 = REQUEST_LENGTH(); WINDOW(window); @@ -3044,42 +3793,42 @@ static void dissect_x11_request(tvbuff_t *tvb, packet_info *pinfo, LISTofATOM(properties, (v16 - 12)); break; - case 115: /* ForceScreenSaver */ + case X_ForceScreenSaver: ENUM8(screen_saver_mode); REQUEST_LENGTH(); break; - case 116: /* SetPointerMapping */ + case X_SetPointerMapping: v8 = FIELD8(map_length); REQUEST_LENGTH(); LISTofCARD8(map, v8); PAD(); break; - case 117: /* GetPointerMapping */ + case X_GetPointerMapping: UNUSED(1); REQUEST_LENGTH(); break; - case 118: /* SetModifierMapping */ + case X_SetModifierMapping: v8 = FIELD8(keycodes_per_modifier); REQUEST_LENGTH(); - LISTofKEYCODE(keycodes, v8); + LISTofKEYCODE(state->modifiermap, keycodes, v8); break; - case 119: /* GetModifierMapping */ + case X_GetModifierMapping: UNUSED(1); REQUEST_LENGTH(); break; - case 127: /* NoOperation */ + case X_NoOperation: UNUSED(1); REQUEST_LENGTH(); break; } - left = tvb_length_remaining(tvb, offset); - if (left) - proto_tree_add_item(t, hf_x11_undecoded, tvb, offset, left, little_endian); + + if ((left = tvb_reported_length_remaining(tvb, offset)) > 0) + UNDECODED(left); } static void dissect_x11_requests(tvbuff_t *tvb, packet_info *pinfo, @@ -3096,13 +3845,12 @@ static void dissect_x11_requests(tvbuff_t *tvb, packet_info *pinfo, guint16 auth_proto_len, auth_data_len; const char *volatile sep = NULL; conversation_t *conversation; - x11_conv_data_t *volatile state_info; + x11_conv_data_t *state; int length; tvbuff_t *next_tvb; - while (tvb_reported_length_remaining(tvb, offset) != 0) { - length_remaining = tvb_length_remaining(tvb, offset); - + while ((length_remaining = tvb_reported_length_remaining(tvb, offset)) + > 0) { /* * Can we do reassembly? */ @@ -3142,23 +3890,14 @@ static void dissect_x11_requests(tvbuff_t *tvb, packet_info *pinfo, /* * Is there state attached to this conversation? */ - state_info = conversation_get_proto_data(conversation, proto_x11); - if (state_info == NULL) { - /* - * No - create a state structure and attach it. - */ - state_info = g_mem_chunk_alloc(x11_state_chunk); - state_info->opcode = NOTHING_SEEN; /* nothing seen yet */ - state_info->iconn_frame = 0; /* don't know it yet */ - state_info->byte_order = BYTE_ORDER_UNKNOWN; /* don't know it yet */ - conversation_add_proto_data(conversation, proto_x11, - state_info); - } + if ((state = conversation_get_proto_data(conversation, proto_x11)) + == NULL) + x11_stateinit(&state, conversation); /* * Guess the byte order if we don't already know it. */ - little_endian = guess_byte_ordering(tvb, pinfo, state_info); + little_endian = guess_byte_ordering(tvb, pinfo, state); /* * Get the opcode and length of the putative X11 request. @@ -3173,14 +3912,17 @@ static void dissect_x11_requests(tvbuff_t *tvb, packet_info *pinfo, * helped. * Give up. */ - ti = proto_tree_add_item(tree, proto_x11, tvb, offset, -1, FALSE); + ti = proto_tree_add_item(tree, proto_x11, tvb, offset, -1, + FALSE); t = proto_item_add_subtree(ti, ett_x11); - proto_tree_add_text(t, tvb, offset, -1, "Bogus request length (0)"); + proto_tree_add_text(t, tvb, offset, -1, + "Bogus request length (0)"); return; } - if (state_info->iconn_frame == pinfo->fd->num || - (state_info->opcode == NOTHING_SEEN && + if (state->iconn_frame == pinfo->fd->num || + (g_hash_table_lookup(state->seqtable, + (int *)state->sequencenumber) == (int *)NOTHING_SEEN && (opcode == 'B' || opcode == 'l') && (plen == 11 || plen == 2816))) { /* @@ -3213,18 +3955,18 @@ static void dissect_x11_requests(tvbuff_t *tvb, packet_info *pinfo, /* * We now know the byte order. Override the guess. */ - if (state_info->byte_order == BYTE_ORDER_UNKNOWN) { + if (state->byte_order == BYTE_ORDER_UNKNOWN) { if (opcode == 'B') { /* * Big-endian. */ - state_info->byte_order = BYTE_ORDER_BE; + state->byte_order = BYTE_ORDER_BE; little_endian = FALSE; } else { /* * Little-endian. */ - state_info->byte_order = BYTE_ORDER_LE; + state->byte_order = BYTE_ORDER_LE; little_endian = TRUE; } } @@ -3316,7 +4058,8 @@ static void dissect_x11_requests(tvbuff_t *tvb, packet_info *pinfo, */ if (is_initial_creq) { if (check_col(pinfo->cinfo, COL_INFO)) - col_set_str(pinfo->cinfo, COL_INFO, "Initial connection request"); + col_set_str(pinfo->cinfo, COL_INFO, + "Initial connection request"); } else { if (sep == NULL) { /* @@ -3347,10 +4090,10 @@ static void dissect_x11_requests(tvbuff_t *tvb, packet_info *pinfo, TRY { if (is_initial_creq) { dissect_x11_initial_conn(next_tvb, pinfo, tree, - state_info, little_endian); + state, little_endian); } else { dissect_x11_request(next_tvb, pinfo, tree, sep, - state_info, little_endian); + state, little_endian); } } CATCH(BoundsError) { @@ -3371,30 +4114,454 @@ static void dissect_x11_requests(tvbuff_t *tvb, packet_info *pinfo, } static void +x11_stateinit(x11_conv_data_t **state, conversation_t *conversation) +{ + + /* + * No - create a state structure and attach it. + */ + static x11_conv_data_t stateinit; + + *state = g_mem_chunk_alloc(x11_state_chunk); + **state = stateinit; + + (*state)->seqtable = g_hash_table_new(g_direct_hash, g_direct_equal); + g_hash_table_insert((*state)->seqtable, (int *)0, (int *)NOTHING_SEEN); + (*state)->byte_order = BYTE_ORDER_UNKNOWN; /* don't know yet*/ + conversation_add_proto_data(conversation, proto_x11, *state); +} + + +static void dissect_x11_replies(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree) { /* Set up structures we will need to add the protocol subtree and manage it */ - proto_item *ti; - proto_tree *x11_tree; + volatile int offset, plen; + tvbuff_t * volatile next_tvb; + conversation_t *conversation; + x11_conv_data_t *state; + gboolean little_endian; + int length_remaining; + const char *volatile sep = NULL; + + + /* + * Get the state for this conversation; create the conversation + * if we don't have one, and create the state if we don't have + * any. + */ + conversation = find_conversation(&pinfo->src, &pinfo->dst, + pinfo->ptype, pinfo->srcport, pinfo->destport, 0); + if (conversation == NULL) { + /* + * No - create one. + */ + conversation = conversation_new(&pinfo->src, &pinfo->dst, + pinfo->ptype, pinfo->srcport, pinfo->destport, 0); + } + + /* + * Is there state attached to this conversation? + */ + if ((state = conversation_get_proto_data(conversation, proto_x11)) + == NULL) + x11_stateinit(&state, conversation); + + /* + * Guess the byte order if we don't already know it. + */ + little_endian = guess_byte_ordering(tvb, pinfo, state); + + offset = 0; + while ((length_remaining = tvb_reported_length_remaining(tvb, offset)) + > 0) { + /* + * Can we do reassembly? + */ + if (x11_desegment && pinfo->can_desegment) { + /* + * Yes - is the X11 reply header split across + * segment boundaries? + */ + if (length_remaining < 8) { + /* + * Yes. Tell the TCP dissector where the data + * for this message starts in the data it handed + * us, and how many more bytes we need, and + * return. + */ + pinfo->desegment_offset = offset; + pinfo->desegment_len = 4 - length_remaining; + return; + } + } + + /* + * Find out what kind of a reply it is. + * There are three possible: + * - errorreply (a request generated an error) + * - requestreply (reply to a request) + * - eventreply (some event occured) + */ + + switch (tvb_get_guint8(tvb, offset)) { + case 0: + plen = 32; + HANDLE_REPLY(plen, length_remaining, + "Error", dissect_x11_error); + break; + + case 1: + /* replylength is in units of four. */ + if (g_hash_table_lookup(state->seqtable, + (int *)state->sequencenumber) + == (int *)INITIAL_CONN + || (state->iconn_reply == pinfo->fd->num)) { + /* + * ref. by A. Nye. says all + * replies are 32 + "additional bytes". + * Initial serverreply seems to be + * the exception, it's 8 + "additional + * bytes". + */ + plen = 8 + VALUE16(tvb, offset + 6) * 4; + + HANDLE_REPLY(plen, length_remaining, + "Initial connection reply", + dissect_x11_initial_reply); + } + else { + plen + = 32 + VALUE32(tvb, offset + 4) * 4; + + HANDLE_REPLY(plen, length_remaining, + "Reply", dissect_x11_reply); + } + break; + + default: + plen = 32; + HANDLE_REPLY(plen, length_remaining, + "Event", dissect_x11_event); + break; + } + + offset += plen; + } + + return; +} -/* This field shows up as the "Info" column in the display; you should make - it, if possible, summarize what's in the packet, so that a user looking - at the list of packets can tell what type of packet it is. */ - if (check_col(pinfo->cinfo, COL_INFO)) - col_set_str(pinfo->cinfo, COL_INFO, "Replies/events"); +static void +dissect_x11_reply(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, + const char *volatile sep, x11_conv_data_t *volatile state, + gboolean little_endian) +{ + int offset = 0, *offsetp = &offset, length, left, opcode; + proto_item *ti; + proto_tree *t; + char *str; + + ti = proto_tree_add_item(tree, proto_x11, tvb, 0, + tvb_reported_length_remaining(tvb, offset), + FALSE); + t = proto_item_add_subtree(ti, ett_x11); + + + opcode = (int)g_hash_table_lookup(state->seqtable, + (int *)VALUE16(tvb, offset + 2)); + + if (check_col(pinfo->cinfo, COL_INFO)) + col_append_fstr(pinfo->cinfo, COL_INFO, "%s %s", + sep, + /* + * don't print opcode value since if it's + * unknown, we didn't know to save the + * request opcode. + */ + val_to_str(opcode, opcode_vals, "<Unknown opcode %d>")); + + str = g_strdup_printf(", Reply, opcode: %d (%s)", + opcode, val_to_str(opcode, opcode_vals, + "<Unknown opcode %d>")); + + proto_item_append_text(ti, str); + g_free(str); + + if (tree == NULL) + return; + + switch (opcode) { + /* + * Requests that expect a reply. + */ + + case X_GetWindowAttributes: + case X_GetGeometry: + case X_QueryTree: + case X_InternAtom: + case X_GetAtomName: + REPLYCONTENTS_COMMON(); + break; + + case X_GetProperty: + REPLY(reply); + CARD8(format); + SEQUENCENUMBER_REPLY(sequencenumber); + length = REPLYLENGTH(replylength); + ATOM(get_property_type); + CARD32(bytes_after); + CARD32(valuelength); + UNUSED(12); + break; + + case X_ListProperties: + case X_GetSelectionOwner: + case X_GrabPointer: + case X_GrabKeyboard: + case X_QueryPointer: + case X_GetMotionEvents: + case X_TranslateCoords: + REPLYCONTENTS_COMMON(); + break; + + case X_QueryKeymap: + case X_QueryFont: + case X_QueryTextExtents: + case X_ListFonts: + case X_GetImage: + case X_ListInstalledColormaps: + case X_AllocColor: + case X_QueryColors: + case X_LookupColor: + case X_QueryBestSize: + case X_QueryExtension: + case X_ListExtensions: + REPLYCONTENTS_COMMON(); + break; + + case X_GetKeyboardMapping: + state->first_keycode + = state->request.GetKeyboardMapping.first_keycode, + REPLY(reply); + state->keysyms_per_keycode + = FIELD8(keysyms_per_keycode); + SEQUENCENUMBER_REPLY(sequencenumber); + length = REPLYLENGTH(replylength); + UNUSED(24); + LISTofKEYSYM(keysyms, state->keycodemap, + state->request.GetKeyboardMapping.first_keycode, + length / state->keysyms_per_keycode, + state->keysyms_per_keycode); + break; + + case X_GetKeyboardControl: + case X_GetPointerControl: + case X_GetScreenSaver: + case X_ListHosts: + case X_SetPointerMapping: + case X_GetPointerMapping: + case X_SetModifierMapping: + REPLYCONTENTS_COMMON(); + break; + + case X_GetModifierMapping: + REPLY(reply); + state->keycodes_per_modifier + = FIELD8(keycodes_per_modifier); + SEQUENCENUMBER_REPLY(sequencenumber); + REPLYLENGTH(replylength); + UNUSED(24); + LISTofKEYCODE(state->modifiermap, keycodes, + state->keycodes_per_modifier); + break; + + default: + REPLYCONTENTS_COMMON(); + } + + if ((left = tvb_reported_length_remaining(tvb, offset)) > 0) + UNDECODED(left); +} -/* In the interest of speed, if "tree" is NULL, don't do any work not - necessary to generate protocol tree items. */ - if (!tree) return; - ti = proto_tree_add_item(tree, proto_x11, tvb, 0, -1, FALSE); - x11_tree = proto_item_add_subtree(ti, ett_x11); +static void +dissect_x11_event(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, + const char *volatile sep, x11_conv_data_t *volatile state, + gboolean little_endian) +{ + int offset = 0, *offsetp = &offset, left; + unsigned char eventcode; + char *str; + proto_item *ti; + proto_tree *t; + + ti = proto_tree_add_item(tree, proto_x11, tvb, 0, -1, FALSE); + t = proto_item_add_subtree(ti, ett_x11); + + eventcode = tvb_get_guint8(tvb, offset); + + if (check_col(pinfo->cinfo, COL_INFO)) + col_append_fstr(pinfo->cinfo, COL_INFO, "%s %s", + sep, val_to_str(eventcode, eventcode_vals, + "<Unknown eventcode %u>")); + + proto_tree_add_uint_format(t, hf_x11_eventcode, tvb, offset, 1, + eventcode, + "eventcode: %d (%s)", + eventcode, + val_to_str(eventcode, eventcode_vals, + "<Unknown eventcode %u>")); + ++offset; + + str = g_strdup_printf(", Event, eventcode: %d (%s)", + eventcode, val_to_str(eventcode, eventcode_vals, + "<Unknown eventcode %u>")); + + proto_item_append_text(ti, str); + g_free(str); + + if (tree == NULL) + return; + + switch (eventcode) { + case KeyPress: + case KeyRelease: { + int code, mask; + + /* need to do some prefetching here ... */ + code = VALUE8(tvb, offset); + mask = VALUE16(tvb, 28); + + KEYCODE_DECODED(keycode, code, mask); + CARD16(event_sequencenumber); + EVENTCONTENTS_COMMON(); + BOOL(same_screen); + UNUSED(1); + break; + } + + case ButtonPress: + case ButtonRelease: + BUTTON(eventbutton); + CARD16(event_sequencenumber); + EVENTCONTENTS_COMMON(); + BOOL(same_screen); + UNUSED(1); + break; + + case MotionNotify: + CARD8(detail); + CARD16(event_sequencenumber); + EVENTCONTENTS_COMMON(); + BOOL(same_screen); + UNUSED(1); + break; + + case EnterNotify: + case LeaveNotify: + CARD8(detail); + CARD16(event_sequencenumber); + EVENTCONTENTS_COMMON(); + CARD8(same_screen); + break; + + case FocusIn: + case FocusOut: + case KeymapNotify: + case Expose: + case GraphicsExpose: + case NoExpose: + case VisibilityNotify: + case CreateNotify: + case DestroyNotify: + case UnmapNotify: + case MapNotify: + case MapRequest: + case ReparentNotify: + case ConfigureNotify: + case ConfigureRequest: + case GravityNotify: + case ResizeRequest: + case CirculateNotify: + case CirculateRequest: + case PropertyNotify: + case SelectionClear: + case SelectionRequest: + case SelectionNotify: + case ColormapNotify: + case ClientMessage: + case MappingNotify: + default: + break; + } + + if ((left = tvb_reported_length_remaining(tvb, offset)) > 0) + UNDECODED(left); + + return; +} - /* - * XXX - dissect these in a loop, like the requests. - */ - call_dissector(data_handle,tvb, pinfo, x11_tree); +static void +dissect_x11_error(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, + const char *volatile sep, _U_ x11_conv_data_t *volatile state, + gboolean little_endian) +{ + int offset = 0, *offsetp = &offset, left; + unsigned char errorcode, error; + proto_item *ti; + proto_tree *t; + char *str; + + + ti = proto_tree_add_item(tree, proto_x11, tvb, 0, -1, FALSE); + t = proto_item_add_subtree(ti, ett_x11); + + error = tvb_get_guint8(tvb, offset); + CARD8(error); + + errorcode = tvb_get_guint8(tvb, offset); + if (check_col(pinfo->cinfo, COL_INFO)) + col_append_fstr(pinfo->cinfo, COL_INFO, "%s %s", + sep, val_to_str(errorcode, errorcode_vals, "<Unknown errorcode %u>")); + + proto_tree_add_uint_format(t, hf_x11_errorcode, tvb, offset, 1, + errorcode, + "errorcode: %d (%s)", + errorcode, + val_to_str(errorcode, errorcode_vals, + "<Unknown errocode %u>")); + ++offset; + + str = g_strdup_printf(", Error, errorcode: %d (%s)", + errorcode, val_to_str(errorcode, errorcode_vals, + "<Unknown errorcode %u>")); + + proto_item_append_text(ti, str); + g_free(str); + + if (tree == NULL) + return; + + CARD16(error_sequencenumber); + + switch (errorcode) { + case BadValue: + CARD32(error_badvalue); + break; + + default: + UNDECODED(4); + } + + CARD16(minor_opcode); + CARD8(major_opcode); + + if ((left = tvb_reported_length_remaining(tvb, offset)) > 0) + UNDECODED(left); } + + /************************************************************************ *** *** *** I N I T I A L I Z A T I O N A N D M A I N *** @@ -3404,13 +4571,13 @@ dissect_x11_replies(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree) static void dissect_x11(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree) { - if (check_col(pinfo->cinfo, COL_PROTOCOL)) - col_set_str(pinfo->cinfo, COL_PROTOCOL, "X11"); + if (check_col(pinfo->cinfo, COL_PROTOCOL)) + col_set_str(pinfo->cinfo, COL_PROTOCOL, "X11"); - if (pinfo->match_port == pinfo->destport) - dissect_x11_requests(tvb, pinfo, tree); - else - dissect_x11_replies(tvb, pinfo, tree); + if (pinfo->match_port == pinfo->srcport) + dissect_x11_replies(tvb, pinfo, tree); + else + dissect_x11_requests(tvb, pinfo, tree); } /* Register the protocol with Ethereal */ @@ -3489,3 +4656,4 @@ proto_reg_handoff_x11(void) dissector_add("tcp.port", TCP_PORT_X11_3, x11_handle); data_handle = find_dissector("data"); } + diff --git a/x11-fields b/x11-fields index 8c5a639ee5..11f41f903b 100644 --- a/x11-fields +++ b/x11-fields @@ -3,7 +3,7 @@ # # Copyright 2000, Christophe Tronche <ch.tronche@computer.org> # -# $Id: x11-fields,v 1.9 2003/07/09 05:23:50 guy Exp $ +# $Id: x11-fields,v 1.10 2004/01/02 12:52:45 obiot Exp $ # # Ethereal - Network traffic analyzer # By Gerald Combs <gerald@ethereal.com> @@ -50,6 +50,11 @@ authorization-protocol-name STRING HEX authorization-protocol-data-length UINT16 DEC authorization-protocol-data STRING HEX auto-repeat-mode UINT8 DEC VALS + +bitmap-format-bit-order UINT8 HEX VALS(image_byte_order) +bitmap-format-scanline-pad UINT8 DEC bitmap format scanline-pad +bitmap-format-scanline-unit UINT8 DEC bitmap format scanline unit +bytes-after UINT32 DEC bytes after back-blue UINT16 DEC Background blue value for a cursor back-green UINT16 DEC Background green value for a cursor back-red UINT16 DEC Background red value for a cursor @@ -71,6 +76,8 @@ border-pixmap UINT32 HEX VALS border-width UINT16 DEC button UINT8 DEC VALS byte-order UINT8 HEX VALS + +childwindow UINT32 DEC childwindow cap-style UINT8 DEC VALS change-host-mode UINT8 DEC VALS(insert_delete) cid UINT32 HEX @@ -118,6 +125,7 @@ dashes-length UINT16 DEC do-acceleration BOOLEAN NONE do-threshold BOOLEAN NONE +detail UINT8 DEC detail do-not-propagate-mask UINT32 HEX KeyPress BOOLEAN 32 0x00000001 KeyRelease BOOLEAN 32 0x00000002 @@ -132,6 +140,17 @@ do-not-propagate-mask UINT32 HEX ButtonMotion BOOLEAN 32 0x00002000 erroneous-bits BOOLEAN 32 0xffffc0b0 +event-sequencenumber UINT16 DEC event sequencenumber +error UINT8 DEC error +error-badvalue UINT32 DEC error badvalue +error_sequencenumber UINT16 DEC error sequencenumber +errorcode UINT8 DEC VALS errrorcode +event-x UINT16 DEC event x +event-y UINT16 DEC event y +eventbutton UINT8 DEC eventbutton +eventcode UINT8 DEC VALS eventcode +eventwindow UINT32 DEC eventwindow + gc-dashes UINT8 DEC gc-value-mask UINT32 HEX @@ -221,6 +240,8 @@ get-property-type UINT32 HEX VALS(zero_is_any_property_type) grab_window UINT32 HEX graphics-exposures BOOLEAN NONE height UINT16 DEC +image-byte-order UINT8 HEX VALS +initial-connection NONE NONE undecoded image-format UINT8 DEC VALS image-pixmap-format UINT8 DEC VALS interval INT16 DEC @@ -230,6 +251,8 @@ key UINT8 DEC VALS key-click-percent INT8 DEC keyboard-key UINT8 DEC keyboard-mode UINT8 DEC VALS(pointer_keyboard_mode) +keybut-mask-erroneous-bits BOOLEAN 16 0xe000 keybut mask erroneous bits +keycode UINT8 HEX keycode keyboard-value-mask UINT32 HEX key-click-percent BOOLEAN 32 0x0001 @@ -253,6 +276,7 @@ keysyms NONE NONE keysym UINT32 HEX keysyms-per-keycode UINT8 DEC +length-of-vendor UINT16 DEC length of vendor led UINT8 DEC led-mode UINT8 DEC VALS(on_off) left-pad UINT8 DEC @@ -268,8 +292,18 @@ mask-font UINT32 HEX VALS(zero_is_none) max-names UINT16 DEC mid UINT32 HEX mode UINT8 DEC VALS +major-opcode UINT16 DEC major opcode +max-keycode UINT8 DEC max keycode +maximum-request-length UINT16 DEC maximum request length +min-keycode UINT8 DEC min keycode +minor-opcode UINT16 DEC minor opcode modifiers-mask UINT16 HEX + Button1 BOOLEAN 16 0x0100 + Button2 BOOLEAN 16 0x0200 + Button3 BOOLEAN 16 0x0300 + Button4 BOOLEAN 16 0x0400 + Button5 BOOLEAN 16 0x0500 Shift BOOLEAN 16 0x0001 Lock BOOLEAN 16 0x0002 Control BOOLEAN 16 0x0004 @@ -281,6 +315,11 @@ modifiers-mask UINT16 HEX AnyModifier UINT16 HEX 0x8000 erroneous-bits BOOLEAN 16 0xff00 +motion-buffer-size UINT16 DEC motion buffer size + +number-of-formats-in-pixmap-formats UINT8 DEC number of formats in pixmap formats +number-of-screens-in-roots UINT8 DEC number of screens in roots + name STRING HEX name-length UINT16 DEC odd-length BOOLEAN NONE @@ -349,6 +388,19 @@ requestor UINT32 HEX request-length UINT16 DEC Request length resource UINT32 HEX VALS(all_temporary) revert-to UINT8 DEC VALS +release-number UINT32 DEC release number +reply UINT8 DEC reply +reply-sequencenumber UINT16 DEC VALS(opcode) +replylength UINT32 DEC replylength +replyopcode UINT8 DEC VALS(opcode) +resource-id-base UINT32 HEX resource id base +resource-id-mask UINT32 HEX resource id mask +root-x UINT16 DEC root x +root-y UINT16 DEC root y +rootwindow UINT32 DEC rootwindow + +same-screen BOOLEAN NONE same screen +success UINT8 DEC success save-set-mode UINT8 DEC VALS(insert_delete) save-under BOOLEAN NONE screen-saver-mode UINT8 DEC VALS @@ -403,6 +455,8 @@ timeout INT16 DEC type UINT32 HEX undecoded NONE NONE Yet undecoded by dissector unused NONE NONE +valuelength UINT32 DEC valuelength +vendor STRING HEX vendor visual UINT32 HEX visualid UINT32 HEX warp-pointer-dst-window UINT32 HEX VALS(zero_is_none) |