[PATCH] virsh: Add virshKeycodeNameCompleter

Kristina Hanicova posted 1 patch 3 years, 2 months ago
Test syntax-check failed
Patches applied successfully (tree, apply log)
git fetch https://github.com/patchew-project/libvirt tags/patchew/20210218181122.17769-1-khanicov@redhat.com
tools/virsh-completer-domain.c | 72 ++++++++++++++++++++++++++++++++++
tools/virsh-completer-domain.h |  8 +++-
tools/virsh-domain.c           |  1 +
3 files changed, 79 insertions(+), 2 deletions(-)
[PATCH] virsh: Add virshKeycodeNameCompleter
Posted by Kristina Hanicova 3 years, 2 months ago
Signed-off-by: Kristina Hanicova <khanicov@redhat.com>
---
 tools/virsh-completer-domain.c | 72 ++++++++++++++++++++++++++++++++++
 tools/virsh-completer-domain.h |  8 +++-
 tools/virsh-domain.c           |  1 +
 3 files changed, 79 insertions(+), 2 deletions(-)

diff --git a/tools/virsh-completer-domain.c b/tools/virsh-completer-domain.c
index fc4d7b2e52..15993064fa 100644
--- a/tools/virsh-completer-domain.c
+++ b/tools/virsh-completer-domain.c
@@ -32,6 +32,9 @@
 #include "virperf.h"
 #include "virbitmap.h"
 #include "virkeycode.h"
+#include "virkeynametable_linux.h"
+#include "virkeynametable_osx.h"
+#include "virkeynametable_win32.h"
 
 char **
 virshDomainNameCompleter(vshControl *ctl,
@@ -800,3 +803,72 @@ virshCodesetNameCompleter(vshControl *ctl G_GNUC_UNUSED,
 
     return g_steal_pointer(&tmp);
 }
+
+
+char **
+virshKeycodeNameCompleter(vshControl *ctl,
+                          const vshCmd *cmd,
+                          unsigned int flags)
+{
+    g_auto(GStrv) tmp = NULL;
+    size_t i = 0;
+    size_t j = 0;
+    const char *codeset_option;
+    int codeset;
+    const char **names = NULL;
+    size_t len;
+
+    virCheckFlags(0, NULL);
+
+    if (vshCommandOptStringQuiet(ctl, cmd, "codeset", &codeset_option) <= 0)
+        codeset_option = "linux";
+
+    if (STREQ(codeset_option, "rfb"))
+        codeset_option = "qnum";
+
+    codeset = virKeycodeSetTypeFromString(codeset_option);
+
+    if (codeset < 0)
+        return NULL;
+
+    switch ((virKeycodeSet) codeset) {
+    case VIR_KEYCODE_SET_LINUX:
+        names = virKeyNameTable_linux;
+        len = virKeyNameTable_linux_len;
+        break;
+    case VIR_KEYCODE_SET_OSX:
+        names = virKeyNameTable_osx;
+        len = virKeyNameTable_osx_len;
+        break;
+    case VIR_KEYCODE_SET_WIN32:
+        names = virKeyNameTable_win32;
+        len = virKeyNameTable_win32_len;
+        break;
+    case VIR_KEYCODE_SET_XT:
+    case VIR_KEYCODE_SET_ATSET1:
+    case VIR_KEYCODE_SET_ATSET2:
+    case VIR_KEYCODE_SET_ATSET3:
+    case VIR_KEYCODE_SET_XT_KBD:
+    case VIR_KEYCODE_SET_USB:
+    case VIR_KEYCODE_SET_QNUM:
+    case VIR_KEYCODE_SET_LAST:
+        break;
+    }
+
+    if (!names)
+        return NULL;
+
+    tmp = g_new0(char *, len + 1);
+
+    for (i = 0; i < len; i++) {
+        if (!names[i])
+            continue;
+
+        tmp[j] = g_strdup(names[i]);
+        j++;
+    }
+
+    tmp = g_renew(char *, tmp, j + 1);
+
+    return g_steal_pointer(&tmp);
+}
diff --git a/tools/virsh-completer-domain.h b/tools/virsh-completer-domain.h
index 4c01b0ca1f..04a3705ff9 100644
--- a/tools/virsh-completer-domain.h
+++ b/tools/virsh-completer-domain.h
@@ -112,5 +112,9 @@ char ** virshDomainLifecycleActionCompleter(vshControl *ctl,
                                             unsigned int flags);
 
 char ** virshCodesetNameCompleter(vshControl *ctl,
-                              const vshCmd *cmd,
-                              unsigned int flags);
+                                  const vshCmd *cmd,
+                                  unsigned int flags);
+
+char ** virshKeycodeNameCompleter(vshControl *ctl,
+                                  const vshCmd *cmd,
+                                  unsigned int flags);
diff --git a/tools/virsh-domain.c b/tools/virsh-domain.c
index d40995f44d..df33467646 100644
--- a/tools/virsh-domain.c
+++ b/tools/virsh-domain.c
@@ -8802,6 +8802,7 @@ static const vshCmdOptDef opts_send_key[] = {
     {.name = "keycode",
      .type = VSH_OT_ARGV,
      .flags = VSH_OFLAG_REQ,
+     .completer = virshKeycodeNameCompleter,
      .help = N_("the key code")
     },
     {.name = NULL}
-- 
2.29.2

Re: [PATCH] virsh: Add virshKeycodeNameCompleter
Posted by Ján Tomko 3 years, 2 months ago
On a Thursday in 2021, Kristina Hanicova wrote:
>Signed-off-by: Kristina Hanicova <khanicov@redhat.com>
>---
> tools/virsh-completer-domain.c | 72 ++++++++++++++++++++++++++++++++++
> tools/virsh-completer-domain.h |  8 +++-
> tools/virsh-domain.c           |  1 +
> 3 files changed, 79 insertions(+), 2 deletions(-)
>
>diff --git a/tools/virsh-completer-domain.h b/tools/virsh-completer-domain.h
>index 4c01b0ca1f..04a3705ff9 100644
>--- a/tools/virsh-completer-domain.h
>+++ b/tools/virsh-completer-domain.h
>@@ -112,5 +112,9 @@ char ** virshDomainLifecycleActionCompleter(vshControl *ctl,
>                                             unsigned int flags);
>
> char ** virshCodesetNameCompleter(vshControl *ctl,
>-                              const vshCmd *cmd,
>-                              unsigned int flags);
>+                                  const vshCmd *cmd,
>+                                  unsigned int flags);
>+

This indentation change is not related to the rest of the commit,
so I split it out into a separate commit before pushing.

>+char ** virshKeycodeNameCompleter(vshControl *ctl,
>+                                  const vshCmd *cmd,
>+                                  unsigned int flags);
>diff --git a/tools/virsh-domain.c b/tools/virsh-domain.c
>index d40995f44d..df33467646 100644
>--- a/tools/virsh-domain.c
>+++ b/tools/virsh-domain.c
>@@ -8802,6 +8802,7 @@ static const vshCmdOptDef opts_send_key[] = {
>     {.name = "keycode",
>      .type = VSH_OT_ARGV,
>      .flags = VSH_OFLAG_REQ,
>+     .completer = virshKeycodeNameCompleter,
>      .help = N_("the key code")
>     },
>     {.name = NULL}
>-- 
>2.29.2
>

Reviewed-by: Ján Tomko <jtomko@redhat.com>

Jano