All of lore.kernel.org
 help / color / mirror / Atom feed
From: Andreas Vogel <Andreas.Vogel@anvo-it.de>
To: grub-devel@gnu.org
Subject: [PATCH] Enhanced hotkey handling for menuentry
Date: Sat, 03 Mar 2012 21:43:52 +0100	[thread overview]
Message-ID: <4F528288.7030200@anvo-it.de> (raw)

[-- Attachment #1: Type: text/plain, Size: 402 bytes --]

Here is a small patch which enhances the hotkey handling for menu entries.
        - new static function parse_key()
        - hotkey aliases are now case insensitive
        - additional hotkey aliases
        - handling now <SHIFT> and <CTRL> modifiers for hotkeys

Any chance that this is included (Vladimir: taking into account that
might do some work in these area anyway)? Any comments?

Andreas

[-- Attachment #2: 01-menuentry_enhanced_hotkeys.patch --]
[-- Type: text/plain, Size: 4795 bytes --]

------------------------------------------------------------
revno: 4098
committer: Andreas Vogel <Andreas.F.Vogel@gmail.com>
branch nick: 01-menuentry_enhanced_hotkeys
timestamp: Thu 2012-03-01 22:38:32 +0100
message:
  	* grub-core/commands/menuentry.c: enhanced hotkey handling:
  	  - new static function parse_key()
  	  - hotkey aliases are now case insensitive
  	  - additional hotkey aliases
  	  - handling now <SHIFT> and <CTRL> modifiers for hotkeys
diff:
=== modified file 'grub-core/commands/menuentry.c'
--- grub-core/commands/menuentry.c	2012-02-26 16:28:05 +0000
+++ grub-core/commands/menuentry.c	2012-03-01 21:38:32 +0000
@@ -45,24 +45,110 @@
   int key;
 } hotkey_aliases[] =
   {
-    {"backspace", '\b'},
-    {"tab", '\t'},
-    {"delete", GRUB_TERM_KEY_DC},
-    {"insert", GRUB_TERM_KEY_INSERT},
-    {"f1", GRUB_TERM_KEY_F1},
-    {"f2", GRUB_TERM_KEY_F2},
-    {"f3", GRUB_TERM_KEY_F3},
-    {"f4", GRUB_TERM_KEY_F4},
-    {"f5", GRUB_TERM_KEY_F5},
-    {"f6", GRUB_TERM_KEY_F6},
-    {"f7", GRUB_TERM_KEY_F7},
-    {"f8", GRUB_TERM_KEY_F8},
-    {"f9", GRUB_TERM_KEY_F9},
-    {"f10", GRUB_TERM_KEY_F10},
-    {"f11", GRUB_TERM_KEY_F11},
-    {"f12", GRUB_TERM_KEY_F12},
+    { "backspace", '\b'},
+    { "tab",       '\t'},
+    { "delete",    GRUB_TERM_KEY_DC },
+    { "insert",    GRUB_TERM_KEY_INSERT },
+    { "up",        GRUB_TERM_KEY_UP },
+    { "down",      GRUB_TERM_KEY_DOWN },
+    { "left",      GRUB_TERM_KEY_LEFT },
+    { "right",     GRUB_TERM_KEY_RIGHT },
+    { "prev",      GRUB_TERM_KEY_PPAGE },
+    { "next",      GRUB_TERM_KEY_NPAGE },
+    { "home",      GRUB_TERM_KEY_HOME },
+    { "end",       GRUB_TERM_KEY_END },
+    { "f1",        GRUB_TERM_KEY_F1 },
+    { "f2",        GRUB_TERM_KEY_F2 },
+    { "f3",        GRUB_TERM_KEY_F3 },
+    { "f4",        GRUB_TERM_KEY_F4 },
+    { "f5",        GRUB_TERM_KEY_F5 },
+    { "f6",        GRUB_TERM_KEY_F6 },
+    { "f7",        GRUB_TERM_KEY_F7 },
+    { "f8",        GRUB_TERM_KEY_F8 },
+    { "f9",        GRUB_TERM_KEY_F9 },
+    { "f10",       GRUB_TERM_KEY_F10 },
+    { "f11",       GRUB_TERM_KEY_F11 },
+    { "f12",       GRUB_TERM_KEY_F12 },
   };
 
+
+/* Parse the given string and return a GRUB_TERM key.
+   The given string can be one of the predefined key names (aliases),
+   otherwise the first character of the given str is taken as key.
+   Modifiers like "<SHIFT>" or "<CTRL>" are handled. They may appear
+   in any order but need to be in front of the alias or key.
+   Spaces between the modifiers and key are silently ignored.
+   Comparison with alias names is case independent. */
+
+static int
+parse_key (const char *string)
+{
+  char *str, *ptr, *keystr;
+  int key = 0;
+  int i;
+
+  if (string == 0 || *string == 0)
+    return 0;
+
+  str = grub_strdup (string);
+  if (!str)
+    return 0;
+
+#define STRING_CTRL  "<CTRL>"
+#define STRING_SHIFT "<SHIFT>"
+
+  /* check for CTRL modifier */
+  ptr = grub_strstr (str, STRING_CTRL);
+  if (ptr)
+  {
+    /* replace modifier string with spaces */
+    for (i = 0; i < grub_strlen (STRING_CTRL); i++)
+      *(ptr + i) = ' ';
+    key |= GRUB_TERM_CTRL;
+  }
+
+  /* check for SHIFT modifier */
+  ptr = grub_strstr (str, STRING_SHIFT);
+  if (ptr)
+  {
+    /* replace modifier string with spaces */
+    for (i = 0; i < grub_strlen (STRING_SHIFT); i++)
+      *(ptr + i) = ' ';
+    key |= GRUB_TERM_SHIFT;
+  }
+
+  /* remove/zero trailing spaces */
+  for (ptr = str + grub_strlen (str) - 1; ptr >= str && *ptr == ' '; ptr--)
+  *ptr = 0;
+
+  /* skip leading spaces */
+  for (ptr = str; *ptr == ' '; ptr++) /*NOTHING*/;
+
+  /* the remaining chars are the real key string */
+  keystr = ptr;
+
+  /* check if the key string is an alias name */
+  for (i = 0; i < ARRAY_SIZE (hotkey_aliases); i++)
+  {
+    /* case is not significant for key aliases */
+    if (grub_strcasecmp (keystr, hotkey_aliases[i].name) == 0)
+    {
+      key |= hotkey_aliases[i].key;
+      break;
+    }
+  }
+
+  if (i == ARRAY_SIZE (hotkey_aliases))
+  {
+    /* no alias matched, so use the first char in the given string as the key */
+    key |= keystr[0];
+  }
+
+  grub_free (str);
+
+  return key;
+}
+
 /* Add a menu entry to the current menu context (as given by the environment
    variable data slot `menu').  As the configuration file is read, the script
    parser calls this when a menu entry is to be created.  */
@@ -117,17 +203,7 @@
     }
 
   if (hotkey)
-    {
-      unsigned i;
-      for (i = 0; i < ARRAY_SIZE (hotkey_aliases); i++)
-	if (grub_strcmp (hotkey, hotkey_aliases[i].name) == 0)
-	  {
-	    menu_hotkey = hotkey_aliases[i].key;
-	    break;
-	  }
-      if (i == ARRAY_SIZE (hotkey_aliases))
-	menu_hotkey = hotkey[0];
-    }
+    menu_hotkey = parse_key (hotkey);
 
   if (! argc)
     {

             reply	other threads:[~2012-03-03 20:44 UTC|newest]

Thread overview: 4+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2012-03-03 20:43 Andreas Vogel [this message]
2012-03-03 21:01 ` [PATCH] Enhanced hotkey handling for menuentry Vladimir 'φ-coder/phcoder' Serbinenko
2012-03-03 21:30   ` Andreas Vogel
2012-03-04 12:23     ` Andreas Vogel

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=4F528288.7030200@anvo-it.de \
    --to=andreas.vogel@anvo-it.de \
    --cc=grub-devel@gnu.org \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.