[Bf-blender-cvs] [d6fef73ef11] master: WM: Remove ASCII members from wmEvent & GHOST_TEventKeyData

Campbell Barton noreply at git.blender.org
Thu Jul 14 08:04:46 CEST 2022


Commit: d6fef73ef110eb43756b7b87c2cba80abae3b39f
Author: Campbell Barton
Date:   Thu Jul 14 13:54:26 2022 +1000
Branches: master
https://developer.blender.org/rBd6fef73ef110eb43756b7b87c2cba80abae3b39f

WM: Remove ASCII members from wmEvent & GHOST_TEventKeyData

The `ascii` member was only kept for historic reason as some platforms
didn't support utf8 when it was first introduced.

Remove the `ascii` struct members since many checks used this as a
fall-back for utf8_buf not being set which isn't needed.
There are a few cases where it's convenient to access the ASCII value
of an event (or nil) so a function has been added to do that.

*Details*

- WM_event_utf8_to_ascii() has been added for the few cases an events
  ASCII value needs to be accessed, this just avoids having to do
  multi-byte character checks in-line.

- RNA Event.ascii remains, using utf8_buf[0] for single byte characters.

- GHOST_TEventKeyData.ascii has been removed.

- To avoid regressions non-ASCII Latin1 characters from GHOST are
  converted into multi-byte UTF8, when building X11 without
  XInput & X_HAVE_UTF8_STRING it seems like could still occur.

===================================================================

M	intern/ghost/GHOST_Types.h
M	intern/ghost/intern/GHOST_EventKey.h
M	intern/ghost/test/multitest/EventToBuf.c
M	source/blender/editors/armature/pose_lib.c
M	source/blender/editors/curve/editfont.c
M	source/blender/editors/interface/interface_handlers.c
M	source/blender/editors/space_console/console_ops.c
M	source/blender/editors/space_text/text_ops.c
M	source/blender/editors/util/numinput.c
M	source/blender/makesrna/intern/rna_wm.c
M	source/blender/makesrna/intern/rna_wm_api.c
M	source/blender/windowmanager/WM_api.h
M	source/blender/windowmanager/WM_types.h
M	source/blender/windowmanager/intern/wm_event_query.c
M	source/blender/windowmanager/intern/wm_event_system.cc
M	source/blender/windowmanager/intern/wm_window.c

===================================================================

diff --git a/intern/ghost/GHOST_Types.h b/intern/ghost/GHOST_Types.h
index 2fc84349eb9..fa74bfde866 100644
--- a/intern/ghost/GHOST_Types.h
+++ b/intern/ghost/GHOST_Types.h
@@ -547,17 +547,6 @@ typedef struct {
   /** The key code. */
   GHOST_TKey key;
 
-  /* ascii / utf8: both should always be set when possible,
-   * - ascii may be '\0' however if the user presses a non ascii key
-   * - unicode may not be set if the system has no unicode support
-   *
-   * These values are intended to be used as follows.
-   * For text input use unicode when available, fallback to ascii.
-   * For areas where unicode is not needed, number input for example, always
-   * use ascii, unicode is ignored - campbell.
-   */
-  /** The ascii code for the key event ('\0' if none). */
-  char ascii;
   /** The unicode character. if the length is 6, not NULL terminated if all 6 are set. */
   char utf8_buf[6];
 
diff --git a/intern/ghost/intern/GHOST_EventKey.h b/intern/ghost/intern/GHOST_EventKey.h
index 1c3156c27d2..d3cfbbeddd7 100644
--- a/intern/ghost/intern/GHOST_EventKey.h
+++ b/intern/ghost/intern/GHOST_EventKey.h
@@ -28,7 +28,6 @@ class GHOST_EventKey : public GHOST_Event {
       : GHOST_Event(msec, type, window)
   {
     m_keyEventData.key = key;
-    m_keyEventData.ascii = '\0';
     m_keyEventData.utf8_buf[0] = '\0';
     m_keyEventData.is_repeat = is_repeat;
     m_data = &m_keyEventData;
@@ -51,11 +50,17 @@ class GHOST_EventKey : public GHOST_Event {
       : GHOST_Event(msec, type, window)
   {
     m_keyEventData.key = key;
-    m_keyEventData.ascii = ascii;
-    if (utf8_buf)
+    if (utf8_buf) {
       memcpy(m_keyEventData.utf8_buf, utf8_buf, sizeof(m_keyEventData.utf8_buf));
-    else
+    }
+    else {
       m_keyEventData.utf8_buf[0] = '\0';
+    }
+    /* TODO(@campbellbarton): phase out `ascii` and always use `utf8_buf`, this needs to be done
+     * on all platforms though, so for now write the ascii into the utf8_buf. */
+    if (m_keyEventData.utf8_buf[0] == '\0' && ascii) {
+      m_keyEventData.utf8_buf[0] = ascii;
+    }
     m_keyEventData.is_repeat = is_repeat;
     m_data = &m_keyEventData;
   }
diff --git a/intern/ghost/test/multitest/EventToBuf.c b/intern/ghost/test/multitest/EventToBuf.c
index baab32328c3..846a867a371 100644
--- a/intern/ghost/test/multitest/EventToBuf.c
+++ b/intern/ghost/test/multitest/EventToBuf.c
@@ -218,8 +218,10 @@ void event_to_buf(GHOST_EventHandle evt, char buf[128])
     case GHOST_kEventKeyUp: {
       GHOST_TEventKeyData *kd = data;
       pos += sprintf(pos, " - key: %s (%d)", keytype_to_string(kd->key), kd->key);
-      if (kd->ascii)
-        pos += sprintf(pos, " ascii: '%c' (%d)", kd->ascii, kd->ascii);
+      /* TODO: ideally this would print the unicode character. */
+      if (kd->utf8_buf[0]) {
+        pos += sprintf(pos, " ascii: '%c' (%d)", kd->utf8_buf[0], kd->utf8_buf[0]);
+      }
       break;
     }
   }
diff --git a/source/blender/editors/armature/pose_lib.c b/source/blender/editors/armature/pose_lib.c
index b8e7c2624fd..a6742fbe2bf 100644
--- a/source/blender/editors/armature/pose_lib.c
+++ b/source/blender/editors/armature/pose_lib.c
@@ -1578,7 +1578,7 @@ static int poselib_preview_handle_event(bContext *UNUSED(C), wmOperator *op, con
     case EVT_PADMINUS:
       if (pld->searchstr[0]) {
         /* searching... */
-        poselib_preview_handle_search(pld, event->type, event->ascii);
+        poselib_preview_handle_search(pld, event->type, WM_event_utf8_to_ascii(event));
       }
       else {
         /* view manipulation (see above) */
@@ -1589,7 +1589,7 @@ static int poselib_preview_handle_event(bContext *UNUSED(C), wmOperator *op, con
 
     /* otherwise, assume that searching might be able to handle it */
     default:
-      poselib_preview_handle_search(pld, event->type, event->ascii);
+      poselib_preview_handle_search(pld, event->type, WM_event_utf8_to_ascii(event));
       break;
   }
 
diff --git a/source/blender/editors/curve/editfont.c b/source/blender/editors/curve/editfont.c
index 611dbb2e80c..33e3837c9d4 100644
--- a/source/blender/editors/curve/editfont.c
+++ b/source/blender/editors/curve/editfont.c
@@ -1639,7 +1639,7 @@ static int insert_text_invoke(bContext *C, wmOperator *op, const wmEvent *event)
   Curve *cu = obedit->data;
   EditFont *ef = cu->editfont;
   static int accentcode = 0;
-  uintptr_t ascii = event->ascii;
+  uintptr_t ascii = WM_event_utf8_to_ascii(event);
   const bool alt = event->modifier & KM_ALT;
   const bool shift = event->modifier & KM_SHIFT;
   const bool ctrl = event->modifier & KM_CTRL;
diff --git a/source/blender/editors/interface/interface_handlers.c b/source/blender/editors/interface/interface_handlers.c
index 21fd14b86b7..2ad2cd15c43 100644
--- a/source/blender/editors/interface/interface_handlers.c
+++ b/source/blender/editors/interface/interface_handlers.c
@@ -3172,21 +3172,6 @@ static bool ui_textedit_insert_buf(uiBut *but,
   return changed;
 }
 
-static bool ui_textedit_insert_ascii(uiBut *but, uiHandleButtonData *data, char ascii)
-{
-  const char buf[2] = {ascii, '\0'};
-
-  if (UI_but_is_utf8(but) && (BLI_str_utf8_size(buf) == -1)) {
-    printf(
-        "%s: entering invalid ascii char into an ascii key (%d)\n", __func__, (int)(uchar)ascii);
-
-    return false;
-  }
-
-  /* in some cases we want to allow invalid utf8 chars */
-  return ui_textedit_insert_buf(but, data, buf, 1);
-}
-
 static void ui_textedit_move(uiBut *but,
                              uiHandleButtonData *data,
                              eStrCursorJumpDirection direction,
@@ -3897,30 +3882,27 @@ static void ui_do_but_textedit(
       }
     }
 
-    if ((event->ascii || event->utf8_buf[0]) && (retval == WM_UI_HANDLER_CONTINUE)
+    if ((event->utf8_buf[0]) && (retval == WM_UI_HANDLER_CONTINUE)
 #ifdef WITH_INPUT_IME
         && !is_ime_composing && !WM_event_is_ime_switch(event)
 #endif
     ) {
-      char ascii = event->ascii;
+      char utf8_buf_override[2] = {'\0', '\0'};
       const char *utf8_buf = event->utf8_buf;
 
       /* Exception that's useful for number buttons, some keyboard
        * numpads have a comma instead of a period. */
       if (ELEM(but->type, UI_BTYPE_NUM, UI_BTYPE_NUM_SLIDER)) { /* Could use `data->min`. */
-        if (event->type == EVT_PADPERIOD && ascii == ',') {
-          ascii = '.';
-          utf8_buf = NULL; /* force ascii fallback */
+        if ((event->type == EVT_PADPERIOD) && (utf8_buf[0] == ',')) {
+          utf8_buf_override[0] = '.';
+          utf8_buf = utf8_buf_override;
         }
       }
 
-      if (utf8_buf && utf8_buf[0]) {
+      if (utf8_buf[0]) {
         const int utf8_buf_len = BLI_str_utf8_size(utf8_buf);
         BLI_assert(utf8_buf_len != -1);
-        changed = ui_textedit_insert_buf(but, data, event->utf8_buf, utf8_buf_len);
-      }
-      else {
-        changed = ui_textedit_insert_ascii(but, data, ascii);
+        changed = ui_textedit_insert_buf(but, data, utf8_buf, utf8_buf_len);
       }
 
       retval = WM_UI_HANDLER_BREAK;
diff --git a/source/blender/editors/space_console/console_ops.c b/source/blender/editors/space_console/console_ops.c
index 17fbef23eac..ef22b1b9f0b 100644
--- a/source/blender/editors/space_console/console_ops.c
+++ b/source/blender/editors/space_console/console_ops.c
@@ -413,16 +413,8 @@ static int console_insert_invoke(bContext *C, wmOperator *op, const wmEvent *eve
     }
 
     char str[BLI_UTF8_MAX + 1];
-    size_t len;
-
-    if (event->utf8_buf[0]) {
-      len = BLI_str_utf8_size_safe(event->utf8_buf);
-      memcpy(str, event->utf8_buf, len);
-    }
-    else {
-      /* in theory, ghost can set value to extended ascii here */
-      len = BLI_str_utf8_from_unicode(event->ascii, str, sizeof(str) - 1);
-    }
+    const size_t len = BLI_str_utf8_size_safe(event->utf8_buf);
+    memcpy(str, event->utf8_buf, len);
     str[len] = '\0';
     RNA_string_set(op->ptr, "text", str);
   }
diff --git a/source/blender/editors/space_text/text_ops.c b/source/blender/editors/space_text/text_ops.c
index 05d51cf6362..33219092d20 100644
--- a/source/blender/editors/space_text/text_ops.c
+++ b/source/blender/editors/space_text/text_ops.c
@@ -3396,7 +3396,8 @@ static int text_line_number_invoke(bContext *C, wmOperator *UNUSED(op), const wm
     return OPERATOR_PASS_THROUGH;
   }
 
-  if (!(event->ascii >= '0' && event->ascii <= '9')) {
+  const char event_ascii = WM_event_utf8_to_ascii(event);
+  if (!(event_ascii >= '0' && event_ascii <= '9')) {
     return OPERATOR_PASS_THROUGH;
   }
 
@@ -3406,7 +3407,7 @@ static int text_line_number_invoke(bContext *C, wmOperator *UNUSED(op), const wm
   }
 
   jump_to *= 10;
-  jump_to += (int)(event->ascii - '0');
+  jump_to += (int)(event_ascii - '0');
 
   txt_move_toline(text, jump_to - 1, 0);
   last_jump = time;
@@ -3495,16 +3496,8 @@ static int text_insert_invoke(bContext *C, wmOperator *op, const wmEvent *event)
     }
 
     char str[BLI_UTF8_MAX + 1];
-    size_t len;
-
-    if (event->utf8_buf[0]) {
-      len = BLI_str_utf8_size_safe(event->utf8_buf);
-      memcpy(str, event->utf8_buf, len);
-    }
-    else {
-      /* in theory, ghost can set value to extended ascii here */
-      len = BLI_str_utf8_from_unicode(event->ascii, str, sizeof(str) - 1);
-    }
+    const size_t len = BLI_str_utf8_size_safe(event->utf8_buf);
+    memcpy(str, event->utf8_buf, len);
     str[len] = '\0';
     RNA_string_set(op->ptr, "text", str);
 
diff --git a/source/blender/editors/util/numinput.c b/source/blender/editors/util/numinput.c
index be6ac6e13e6..60cbc2a2df6 100644
--- a/source/blender/editors/util/numinput.c
+++ b/source/blender/editors/util/numinput.c
@@ -311,6 +311,7 @@ static bool editstr_is_simple_numinput(const char ascii)
 bool handleNumInput(bContext *C, NumInput *n, const wmEvent *event)
 {
   const char *utf8_buf = NULL;
+  const char event_ascii = WM_event_utf8_to_ascii(event);
   char ascii[2] = {'\0', '\0'};
   bool updated = false;
   short idx = n->idx, idx_max = n->idx_max;
@@ -321,8 +322,8 @@ bool handleNumInput(bContext *C, NumInput *n, const wmEvent *event)
   if (U.flag & USER_FLAG_NUMINPUT_ADVANCED)
 #endif
   {
-    if (((event->modifier & (KM_CTRL | KM_ALT)) == 0) && (event->ascii != '\0') &

@@ Diff output truncated at 10240 characters. @@



More information about the Bf-blender-cvs mailing list