last_ch = *accelerator; while (last_ch && last_ch != '>')
{
accelerator += 1;
len -= 1;
last_ch = *accelerator;
}
if (!last_ch)
{ /* The opened '<' has never been closed with '>' */
error = TRUE; goto out;
}
}
} else
{ if (len >= 4 && is_keycode (accelerator))
{ char keystring[5]; char *endptr; int tmp_keycode;
if (endptr == NULL || *endptr != '\000')
{
error = TRUE; goto out;
} elseif (accelerator_codes != NULL)
{ /* 0x00 is an invalid keycode too. */ if (tmp_keycode == 0)
{
error = TRUE; goto out;
} else
{
*accelerator_codes = g_new0 (guint, 2);
(*accelerator_codes)[0] = tmp_keycode;
}
} else
{ /* There was a keycode in the string, but
* we cannot store it, so we have an error */
error = TRUE; goto out;
}
} else
{
keyval = gdk_keyval_from_name (accelerator); if (keyval == GDK_KEY_VoidSymbol)
{
error = TRUE; goto out;
}
}
if (keyval && accelerator_codes != NULL)
{
GdkKeymapKey *keys; int n_keys, i, j;
if (!gdk_display_map_keyval (display, keyval, &keys, &n_keys))
{ /* Not in keymap */
error = TRUE; goto out;
} else
{
*accelerator_codes = g_new0 (guint, n_keys + 1);
/* Prefer level-0 group-0 keys to modified keys */ for (i = 0, j = 0; i < n_keys; ++i)
{ if (keys[i].level == 0 && keys[i].group == 0)
(*accelerator_codes)[j++] = keys[i].keycode;
}
/* No level-0 group-0 keys? Find in the whole group-0 */ if (j == 0)
{ for (i = 0, j = 0; i < n_keys; ++i)
{ if (keys[i].group == 0)
(*accelerator_codes)[j++] = keys[i].keycode;
}
}
/* Still nothing? Try in other groups */ if (j == 0)
{ for (i = 0, j = 0; i < n_keys; ++i)
(*accelerator_codes)[j++] = keys[i].keycode;
}
if (j == 0)
{
g_clear_pointer (accelerator_codes, g_free); /* Not in keymap */
error = TRUE; goto out;
}
g_free (keys);
}
}
accelerator += len;
len -= len;
}
}
out: if (error)
keyval = mods = 0;
if (accelerator_key)
*accelerator_key = gdk_keyval_to_lower (keyval); if (accelerator_mods)
*accelerator_mods = mods;
/* Underscores in key names are better displayed as spaces *E.g.,Page_Upshouldbe“PageUp”. * *Somekeynamesalsohaveprefixesthatarenotsuitable *fordisplay,e.gXF86AudioMute,sostripthoseout,too. * *Thisfunctionisonlycalledonuntranslatedkeynames, *sononeedtobeUTF-8safe.
*/ staticvoid
append_without_underscores (GString *s, constchar *str)
{ constchar *p;
if (g_str_has_prefix (str, "XF86"))
p = str + 4; elseif (g_str_has_prefix (str, "ISO_"))
p = str + 4; else
p = str;
for ( ; *p; p++)
{ if (*p == '_')
g_string_append_c (s, ' '); else
g_string_append_c (s, *p);
}
}
/* On Mac, if the key has symbolic representation (e.g. arrow keys), *appendittogstringandreturnTRUE;otherwisereturnFALSE. *Seehttp://docs.info.apple.com/article.html?path=Mac/10.5/en/cdb_symbs.html
* for the list of special keys. */ static gboolean
append_keyval_symbol (guint accelerator_key,
GString *gstring)
{ #ifdef GDK_WINDOWING_MACOS switch (accelerator_key)
{ case GDK_KEY_Return: /* U+21A9 LEFTWARDS ARROW WITH HOOK */
g_string_append (gstring, "\xe2\x86\xa9"); returnTRUE;
case GDK_KEY_ISO_Enter: /* U+2324 UP ARROWHEAD BETWEEN TWO HORIZONTAL BARS */
g_string_append (gstring, "\xe2\x8c\xa4"); returnTRUE;
if (accelerator_mods & GDK_SHIFT_MASK)
{ #ifndef GDK_WINDOWING_MACOS /* This is the text that should appear next to menu accelerators *thatusetheshiftkey.Ifthetextonthiskeyisn'ttypically *translatedonkeyboardsusedforyourlanguage,don'ttranslate *this.
*/
g_string_append (gstring, C_("keyboard label", "Shift")); #else /* U+21E7 UPWARDS WHITE ARROW */
g_string_append (gstring, "⇧"); #endif
seen_mod = TRUE;
}
if (accelerator_mods & GDK_CONTROL_MASK)
{ if (seen_mod)
append_separator (gstring);
#ifndef GDK_WINDOWING_MACOS /* This is the text that should appear next to menu accelerators *thatusethecontrolkey.Ifthetextonthiskeyisn'ttypically *translatedonkeyboardsusedforyourlanguage,don'ttranslate *this.
*/
g_string_append (gstring, C_("keyboard label", "Ctrl")); #else /* U+2303 UP ARROWHEAD */
g_string_append (gstring, "⌃"); #endif
seen_mod = TRUE;
}
if (accelerator_mods & GDK_ALT_MASK)
{ if (seen_mod)
append_separator (gstring);
#ifndef GDK_WINDOWING_MACOS /* This is the text that should appear next to menu accelerators *thatusethealtkey.Ifthetextonthiskeyisn'ttypically *translatedonkeyboardsusedforyourlanguage,don'ttranslate *this.
*/
g_string_append (gstring, C_("keyboard label", "Alt")); #else /* U+2325 OPTION KEY */
g_string_append (gstring, "⌥"); #endif
seen_mod = TRUE;
}
if (accelerator_mods & GDK_SUPER_MASK)
{ if (seen_mod)
append_separator (gstring);
/* This is the text that should appear next to menu accelerators *thatusethesuperkey.Ifthetextonthiskeyisn'ttypically *translatedonkeyboardsusedforyourlanguage,don'ttranslate *this.
*/
g_string_append (gstring, C_("keyboard label", "Super"));
seen_mod = TRUE;
}
if (accelerator_mods & GDK_HYPER_MASK)
{ if (seen_mod)
append_separator (gstring);
/* This is the text that should appear next to menu accelerators *thatusethehyperkey.Ifthetextonthiskeyisn'ttypically *translatedonkeyboardsusedforyourlanguage,don'ttranslate *this.
*/
g_string_append (gstring, C_("keyboard label", "Hyper"));
seen_mod = TRUE;
}
if (accelerator_mods & GDK_META_MASK)
{ if (seen_mod)
append_separator (gstring);
#ifndef GDK_WINDOWING_MACOS /* This is the text that should appear next to menu accelerators *thatusethemetakey.Ifthetextonthiskeyisn'ttypically *translatedonkeyboardsusedforyourlanguage,don'ttranslate *this.
*/
g_string_append (gstring, C_("keyboard label", "Meta")); #else
g_string_append (gstring, "⌘"); #endif
seen_mod = TRUE;
}
ch = gdk_keyval_to_unicode (accelerator_key); if (ch && (ch == ' ' || g_unichar_isgraph (ch)))
{ if (seen_mod)
append_separator (gstring);
if (accelerator_key >= GDK_KEY_KP_Space &&
accelerator_key <= GDK_KEY_KP_9)
{ /* Translators: "KP" means "numeric key pad". This string will *beusedinacceleratorssuchas"Ctrl+Shift+KP1"inmenus, *andthereforethetranslationneedstobeveryshort.
*/
g_string_append (gstring, C_("keyboard label", "KP"));
g_string_append (gstring, " ");
}
/* See https://www.w3.org/TR/uievents-key/#named-key-attribute-values for the
* list of WAI-ARIA named key attribute values. */ staticconst gchar *
keyval_get_accessible_name (guint accelerator_key)
{ switch (accelerator_key)
{ case GDK_KEY_Alt_L: case GDK_KEY_Alt_R: return"Alt";
case GDK_KEY_Mode_switch: case GDK_KEY_ISO_Level3_Shift: case GDK_KEY_ISO_Level3_Latch: case GDK_KEY_ISO_Level3_Lock: case GDK_KEY_ISO_Level5_Shift: case GDK_KEY_ISO_Level5_Latch: case GDK_KEY_ISO_Level5_Lock: return"AltGraph";
case GDK_KEY_Caps_Lock: return"CapsLock";
case GDK_KEY_Control_L: case GDK_KEY_Control_R: return"Control";
/* Firefox treats these as "Alt" */ case GDK_KEY_Meta_L: case GDK_KEY_Meta_R: return"Meta";
case GDK_KEY_Num_Lock: return"NumLock";
case GDK_KEY_Scroll_Lock: return"ScrollLock";
case GDK_KEY_Shift_L: case GDK_KEY_Shift_R: case GDK_KEY_Shift_Lock: return"Shift";
/* Firefox treats these as "Meta" */ case GDK_KEY_Super_L: case GDK_KEY_Super_R: return"Super";
/* Firefox treats these as "Meta" */ case GDK_KEY_Hyper_L: case GDK_KEY_Hyper_R: return"Hyper";
case GDK_KEY_Return: case GDK_KEY_KP_Enter: case GDK_KEY_ISO_Enter: case GDK_KEY_3270_Enter: return"Enter";
case GDK_KEY_Tab: case GDK_KEY_ISO_Left_Tab: case GDK_KEY_KP_Tab: return"Tab";
case GDK_KEY_Down: case GDK_KEY_KP_Down: return"ArrowDown";
case GDK_KEY_Left: case GDK_KEY_KP_Left: return"ArrowLeft";
case GDK_KEY_Right: case GDK_KEY_KP_Right: return"ArrowRight";
case GDK_KEY_Up: case GDK_KEY_KP_Up: return"ArrowUp";
case GDK_KEY_End: case GDK_KEY_KP_End: return"End";
case GDK_KEY_Home: case GDK_KEY_KP_Home: return"Home";
case GDK_KEY_Page_Down: case GDK_KEY_KP_Page_Down: return"PageDown";
case GDK_KEY_Page_Up: case GDK_KEY_KP_Page_Up: return"PageUp";
case GDK_KEY_BackSpace: return"Backspace";
case GDK_KEY_Clear: return"Clear";
case GDK_KEY_Copy: return"Copy";
case GDK_KEY_3270_CursorSelect: return"CrSel";
case GDK_KEY_Cut: return"Cut";
case GDK_KEY_Delete: case GDK_KEY_KP_Delete: return"Delete";
case GDK_KEY_3270_EraseEOF: return"EraseEof";
case GDK_KEY_3270_ExSelect: return"ExSel";
case GDK_KEY_Insert: case GDK_KEY_KP_Insert: return"Insert";
case GDK_KEY_Paste: return"Paste";
case GDK_KEY_Redo: return"Redo";
case GDK_KEY_Undo: return"Undo";
case GDK_KEY_3270_Attn: return"Attn";
case GDK_KEY_Cancel: return"Cancel";
case GDK_KEY_Menu: return"ContextMenu";
case GDK_KEY_Escape: return"Escape";
case GDK_KEY_Execute: return"Execute";
case GDK_KEY_Find: return"Find";
case GDK_KEY_Help: return"Help";
case GDK_KEY_Pause: case GDK_KEY_Break: return"Pause";
case GDK_KEY_3270_Play: return"Play";
case GDK_KEY_Select: return"Select";
case GDK_KEY_ZoomIn: return"ZoomIn";
case GDK_KEY_ZoomOut: return"ZoomOut";
case GDK_KEY_MonBrightnessDown: return"BrightnessDown";
case GDK_KEY_MonBrightnessUp: return"BrightnessUp";
case GDK_KEY_Eject: return"Eject";
case GDK_KEY_LogOff: return"LogOff";
case GDK_KEY_PowerDown: case GDK_KEY_PowerOff: return"PowerOff";
case GDK_KEY_3270_PrintScreen: case GDK_KEY_Print: case GDK_KEY_Sys_Req: return"PrintScreen";
case GDK_KEY_Hibernate: return"Hibernate";
case GDK_KEY_Standby: case GDK_KEY_Suspend: case GDK_KEY_Sleep: return"Standby";
case GDK_KEY_WakeUp: return"WakeUp";
case GDK_KEY_MultipleCandidate: return"AllCandidates";
case GDK_KEY_Eisu_Shift: case GDK_KEY_Eisu_toggle: return"Alphanumeric";
case GDK_KEY_Codeinput: return"CodeInput";
case GDK_KEY_Multi_key: return"Compose";
case GDK_KEY_Henkan: return"Convert";
case GDK_KEY_dead_grave: case GDK_KEY_dead_acute: case GDK_KEY_dead_circumflex: case GDK_KEY_dead_tilde: case GDK_KEY_dead_macron: case GDK_KEY_dead_breve: case GDK_KEY_dead_abovedot: case GDK_KEY_dead_diaeresis: case GDK_KEY_dead_abovering: case GDK_KEY_dead_doubleacute: case GDK_KEY_dead_caron: case GDK_KEY_dead_cedilla: case GDK_KEY_dead_ogonek: case GDK_KEY_dead_iota: case GDK_KEY_dead_voiced_sound: case GDK_KEY_dead_semivoiced_sound: case GDK_KEY_dead_belowdot: case GDK_KEY_dead_hook: case GDK_KEY_dead_horn: case GDK_KEY_dead_stroke: case GDK_KEY_dead_abovecomma: case GDK_KEY_dead_abovereversedcomma: case GDK_KEY_dead_doublegrave: case GDK_KEY_dead_belowring: case GDK_KEY_dead_belowmacron: case GDK_KEY_dead_belowcircumflex: case GDK_KEY_dead_belowtilde: case GDK_KEY_dead_belowbreve: case GDK_KEY_dead_belowdiaeresis: case GDK_KEY_dead_invertedbreve: case GDK_KEY_dead_belowcomma: case GDK_KEY_dead_currency: case GDK_KEY_dead_a: case GDK_KEY_dead_A: case GDK_KEY_dead_e: case GDK_KEY_dead_E: case GDK_KEY_dead_i: case GDK_KEY_dead_I: case GDK_KEY_dead_o: case GDK_KEY_dead_O: case GDK_KEY_dead_u: case GDK_KEY_dead_U: case GDK_KEY_dead_small_schwa: case GDK_KEY_dead_capital_schwa: case GDK_KEY_dead_greek: return"Dead";
case GDK_KEY_ISO_First_Group: return"GroupFirst";
case GDK_KEY_ISO_Last_Group: return"GroupLast";
case GDK_KEY_ISO_Next_Group: return"GroupNext";
case GDK_KEY_ISO_Prev_Group: return"GroupPrevious";
case GDK_KEY_Muhenkan: return"NonConvert";
case GDK_KEY_PreviousCandidate: return"PreviousCandidate";
case GDK_KEY_SingleCandidate: return"SingleCandidate";
case GDK_KEY_Hankaku: return"Hankaku";
case GDK_KEY_Hiragana: return"Hiragana";
case GDK_KEY_Hiragana_Katakana: return"HiraganaKatakana";
case GDK_KEY_Kana_Lock: case GDK_KEY_Kana_Shift: return"KanaMode";
case GDK_KEY_Kanji: return"KanjiMode";
case GDK_KEY_Katakana: return"Katakana";
case GDK_KEY_Romaji: return"Romaji";
case GDK_KEY_Zenkaku: return"Zenkaku";
case GDK_KEY_Zenkaku_Hankaku: return"ZenkakuHankaku";
case GDK_KEY_F1: case GDK_KEY_KP_F1: return"F1";
case GDK_KEY_F2: case GDK_KEY_KP_F2: return"F2";
case GDK_KEY_F3: case GDK_KEY_KP_F3: return"F3";
case GDK_KEY_F4: case GDK_KEY_KP_F4: return"F4";
case GDK_KEY_F5: return"F5";
case GDK_KEY_F6: return"F6";
case GDK_KEY_F7: return"F7";
case GDK_KEY_F8: return"F8";
case GDK_KEY_F9: return"F9";
case GDK_KEY_F10: return"F10";
case GDK_KEY_F11: return"F11";
case GDK_KEY_F12: return"F12";
case GDK_KEY_F13: return"F13";
case GDK_KEY_F14: return"F14";
case GDK_KEY_F15: return"F15";
case GDK_KEY_F16: return"F16";
case GDK_KEY_F17: return"F17";
case GDK_KEY_F18: return"F18";
case GDK_KEY_F19: return"F19";
case GDK_KEY_F20: return"F20";
case GDK_KEY_F21: return"F21";
case GDK_KEY_F22: return"F22";
case GDK_KEY_F23: return"F23";
case GDK_KEY_F24: return"F24";
case GDK_KEY_F25: return"F25";
case GDK_KEY_F26: return"F26";
case GDK_KEY_F27: return"F27";
case GDK_KEY_F28: return"F28";
case GDK_KEY_F29: return"F29";
case GDK_KEY_F30: return"F30";
case GDK_KEY_F31: return"F31";
case GDK_KEY_F32: return"F32";
case GDK_KEY_F33: return"F33";
case GDK_KEY_F34: return"F34";
case GDK_KEY_F35: return"F35";
case GDK_KEY_Close: return"Close";
case GDK_KEY_MailForward: return"MailForward";
case GDK_KEY_Reply: return"MailReply";
case GDK_KEY_Send: return"MailSend";
case GDK_KEY_AudioForward: return"MediaFastForward";
case GDK_KEY_AudioPause: return"MediaPause";
case GDK_KEY_AudioPlay: return"MediaPlay";
case GDK_KEY_AudioRecord: return"MediaRecord";
case GDK_KEY_AudioRewind: return"MediaRewind";
case GDK_KEY_AudioStop: return"MediaStop";
case GDK_KEY_AudioNext: return"MediaTrackNext";
case GDK_KEY_AudioPrev: return"MediaTrackPrevious";
case GDK_KEY_New: return"New";
case GDK_KEY_Open: return"Open";
case GDK_KEY_Save: return"Save";
case GDK_KEY_Spell: return"SpellCheck";
case GDK_KEY_AudioLowerVolume: return"AudioVolumeDown";
case GDK_KEY_AudioRaiseVolume: return"AudioVolumeUp";
case GDK_KEY_AudioMute: return"AudioVolumeMute";
case GDK_KEY_Calculator: return"LaunchCalculator";
case GDK_KEY_Calendar: return"LaunchCalendar";
case GDK_KEY_Mail: return"LaunchMail";
case GDK_KEY_CD: case GDK_KEY_Video: case GDK_KEY_AudioMedia: return"LaunchMediaPlayer";
case GDK_KEY_Music: return"LaunchMusicPlayer";
case GDK_KEY_MyComputer: case GDK_KEY_Explorer: return"LaunchMyComputer";
case GDK_KEY_ScreenSaver: return"LaunchScreenSaver";
case GDK_KEY_Excel: return"LaunchSpreadsheet";
case GDK_KEY_WWW: return"LaunchWebBrowser";
case GDK_KEY_WebCam: return"LaunchWebCam";
case GDK_KEY_Word: return"LaunchWordProcessor";
case GDK_KEY_Launch0: return"LaunchApplication1";
case GDK_KEY_Launch1: return"LaunchApplication2";
case GDK_KEY_Launch2: return"LaunchApplication3";
case GDK_KEY_Launch3: return"LaunchApplication4";
case GDK_KEY_Launch4: return"LaunchApplication5";
case GDK_KEY_Launch5: return"LaunchApplication6";
case GDK_KEY_Launch6: return"LaunchApplication7";
case GDK_KEY_Launch7: return"LaunchApplication8";
case GDK_KEY_Launch8: return"LaunchApplication9";
case GDK_KEY_Launch9: return"LaunchApplication10";
case GDK_KEY_LaunchA: return"LaunchApplication11";
case GDK_KEY_LaunchB: return"LaunchApplication12";
case GDK_KEY_LaunchC: return"LaunchApplication13";
case GDK_KEY_LaunchD: return"LaunchApplication14";
case GDK_KEY_LaunchE: return"LaunchApplication15";
case GDK_KEY_LaunchF: return"LaunchApplication16";
case GDK_KEY_Back: return"BrowserBack";
case GDK_KEY_Forward: return"BrowserForward";
case GDK_KEY_HomePage: return"BrowserHome";
case GDK_KEY_Refresh: case GDK_KEY_Reload: return"BrowserRefresh";
case GDK_KEY_Search: return"BrowserSearch";
case GDK_KEY_Stop: return"BrowserStop";
case GDK_KEY_Red: return"ColorF0Red";
case GDK_KEY_Green: return"ColorF1Green";
case GDK_KEY_Yellow: return"ColorF2Yellow";
case GDK_KEY_Blue: return"ColorF3Blue";
case GDK_KEY_BrightnessAdjust: return"Dimmer";
case GDK_KEY_AudioRandomPlay: return"RandomToggle";
Die Informationen auf dieser Webseite wurden
nach bestem Wissen sorgfältig zusammengestellt. Es wird jedoch weder Vollständigkeit, noch Richtigkeit,
noch Qualität der bereit gestellten Informationen zugesichert.
Bemerkung:
Die farbliche Syntaxdarstellung und die Messung sind noch experimentell.