From b78b61a0be8c51a35304d412fc20481592cca9a7 Mon Sep 17 00:00:00 2001
From: Carlos Garnacho <carlosg@gnome.org>
Date: Fri, 26 Jan 2024 18:51:14 +0100
Subject: [PATCH] keyboard: Handle number/phone input purposes specifically

Add OSK keymaps for these, with the special keys necessary to
type numbers(positive, negative, fractional, ...) and phone numbers
(with */+/#)

Closes: https://gitlab.gnome.org/GNOME/gnome-shell/-/issues/6550
Part-of: <https://gitlab.gnome.org/GNOME/gnome-shell/-/merge_requests/3162>
---
 data/gnome-shell-osk-layouts.gresource.xml |  2 +
 data/osk-layouts/number.json               | 95 ++++++++++++++++++++++
 data/osk-layouts/phone.json                | 93 +++++++++++++++++++++
 js/ui/keyboard.js                          |  8 +-
 4 files changed, 195 insertions(+), 3 deletions(-)
 create mode 100644 data/osk-layouts/number.json
 create mode 100644 data/osk-layouts/phone.json

diff --git a/data/gnome-shell-osk-layouts.gresource.xml b/data/gnome-shell-osk-layouts.gresource.xml
index efaf47491..57ad33547 100644
--- a/data/gnome-shell-osk-layouts.gresource.xml
+++ b/data/gnome-shell-osk-layouts.gresource.xml
@@ -44,7 +44,9 @@
     <file>my.json</file>
     <file>nl.json</file>
     <file>no.json</file>
+    <file>number.json</file>
     <file>ph.json</file>
+    <file>phone.json</file>
     <file>pl.json</file>
     <file>pt.json</file>
     <file>ro.json</file>
diff --git a/data/osk-layouts/number.json b/data/osk-layouts/number.json
new file mode 100644
index 000000000..db82fb753
--- /dev/null
+++ b/data/osk-layouts/number.json
@@ -0,0 +1,95 @@
+{
+  "levels": [
+    {
+      "level": "",
+      "mode": "default",
+      "rows": [
+        [
+          {
+            "strings": [
+              "7"
+            ]
+          },
+          {
+            "strings": [
+              "8"
+            ]
+          },
+          {
+            "strings": [
+              "9"
+            ]
+          },
+          {
+            "action": "delete",
+            "iconName": "edit-clear-symbolic"
+          }
+        ],
+        [
+          {
+            "strings": [
+              "4"
+            ]
+          },
+          {
+            "strings": [
+              "5"
+            ]
+          },
+          {
+            "strings": [
+              "6"
+            ]
+          },
+          {
+            "iconName": "keyboard-enter-symbolic",
+            "keyval": "0xff0d",
+            "height": 2
+          }
+        ],
+        [
+          {
+            "strings": [
+              "1"
+            ]
+          },
+          {
+            "strings": [
+              "2"
+            ]
+          },
+          {
+            "strings": [
+              "3"
+            ]
+          }
+        ],
+        [
+          {
+            "strings": [
+              "-",
+              "+",
+              "E"
+            ]
+          },
+          {
+            "strings": [
+              "0"
+            ]
+          },
+          {
+            "strings": [
+              ".",
+              ","
+            ]
+          },
+          {
+            "action": "hide",
+            "iconName": "keyboard-hide-symbolic"
+          }
+        ]
+      ]
+    }
+  ],
+  "name": "Numeric Keyboard"
+}
diff --git a/data/osk-layouts/phone.json b/data/osk-layouts/phone.json
new file mode 100644
index 000000000..0708d6790
--- /dev/null
+++ b/data/osk-layouts/phone.json
@@ -0,0 +1,93 @@
+{
+  "levels": [
+    {
+      "level": "",
+      "mode": "default",
+      "rows": [
+        [
+          {
+            "strings": [
+              "7"
+            ]
+          },
+          {
+            "strings": [
+              "8"
+            ]
+          },
+          {
+            "strings": [
+              "9"
+            ]
+          },
+          {
+            "action": "delete",
+            "iconName": "edit-clear-symbolic"
+          }
+        ],
+        [
+          {
+            "strings": [
+              "4"
+            ]
+          },
+          {
+            "strings": [
+              "5"
+            ]
+          },
+          {
+            "strings": [
+              "6"
+            ]
+          },
+          {
+            "iconName": "keyboard-enter-symbolic",
+            "keyval": "0xff0d",
+            "height": 2
+          }
+        ],
+        [
+          {
+            "strings": [
+              "1"
+            ]
+          },
+          {
+            "strings": [
+              "2"
+            ]
+          },
+          {
+            "strings": [
+              "3"
+            ]
+          }
+        ],
+        [
+          {
+            "strings": [
+              "*"
+            ]
+          },
+          {
+            "strings": [
+              "0",
+              "+"
+            ]
+          },
+          {
+            "strings": [
+              "#"
+            ]
+          },
+          {
+            "action": "hide",
+            "iconName": "keyboard-hide-symbolic"
+          }
+        ]
+      ]
+    }
+  ],
+  "name": "Phone"
+}
diff --git a/js/ui/keyboard.js b/js/ui/keyboard.js
index 8f460bb52..f6b01c294 100644
--- a/js/ui/keyboard.js
+++ b/js/ui/keyboard.js
@@ -1391,10 +1391,12 @@ export const Keyboard = GObject.registerClass({
             y_expand: true,
         });
 
-        if (purpose === Clutter.InputContentPurpose.DIGITS ||
-            purpose === Clutter.InputContentPurpose.NUMBER ||
-            purpose === Clutter.InputContentPurpose.PHONE) {
+        if (purpose === Clutter.InputContentPurpose.DIGITS) {
             keyboardModel = new KeyboardModel('digits');
+        } else if (purpose === Clutter.InputContentPurpose.NUMBER) {
+            keyboardModel = new KeyboardModel('number');
+        } else if (purpose === Clutter.InputContentPurpose.PHONE) {
+            keyboardModel = new KeyboardModel('phone');
         } else {
             let groups = [groupName];
             if (groupName.includes('+'))