[gtk/wip/chergert/quartz4u: 3/3] macos: begin porting GtkIMContextQuartz to GDK_WINDOWING_MACOS



commit 625436aa1ebf8e50bcbeb0d599b0bf0406d004d7
Author: Christian Hergert <chergert redhat com>
Date:   Tue Jul 21 18:30:27 2020 -0700

    macos: begin porting GtkIMContextQuartz to GDK_WINDOWING_MACOS
    
    This still needs some more work to translate NSEvent data and access it
    from the imcontext implementation.

 gtk/gtkimcontextquartz.c | 142 ++++++++++++++++++++++++++---------------------
 1 file changed, 79 insertions(+), 63 deletions(-)
---
diff --git a/gtk/gtkimcontextquartz.c b/gtk/gtkimcontextquartz.c
index c56c998ea7..7e7440f5ac 100644
--- a/gtk/gtkimcontextquartz.c
+++ b/gtk/gtkimcontextquartz.c
@@ -21,17 +21,19 @@
 #include "config.h"
 #include <string.h>
 
-#include "gtk/gtkimcontextquartz.h"
-#include "gtk/gtkintl.h"
-#include "gtk/gtkimmoduleprivate.h"
+#include "gtkimcontextquartz.h"
+#include "gtkimmoduleprivate.h"
+#include "gtkintl.h"
 
-#include "gdk/quartz/gdkquartz.h"
-#include "gdk/quartz/GdkQuartzView.h"
+#include "gdk/macos/gdkmacos.h"
+#include "gdk/macos/gdkmacossurface-private.h"
+#include "gdk/macos/GdkMacosBaseView.h"
 
-#define GTK_IM_CONTEXT_TYPE_QUARTZ (type_quartz)
-#define GTK_IM_CONTEXT_QUARTZ(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), GTK_IM_CONTEXT_TYPE_QUARTZ, 
GtkIMContextQuartz))
+#define GTK_IM_CONTEXT_TYPE_QUARTZ           (gtk_im_context_quartz_get_type())
+#define GTK_IM_CONTEXT_QUARTZ(obj)           (G_TYPE_CHECK_INSTANCE_CAST ((obj), GTK_IM_CONTEXT_TYPE_QUARTZ, 
GtkIMContextQuartz))
 #define GTK_IM_CONTEXT_QUARTZ_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS((obj), GTK_IM_CONTEXT_TYPE_QUARTZ, 
GtkIMContextQuartzClass))
 
+G_GNUC_BEGIN_IGNORE_DEPRECATIONS
 
 typedef struct _GtkIMContextQuartz
 {
@@ -51,21 +53,21 @@ typedef struct _GtkIMContextQuartzClass
 } GtkIMContextQuartzClass;
 
 G_DEFINE_TYPE_WITH_CODE (GtkIMContextQuartz, gtk_im_context_quartz, GTK_TYPE_IM_CONTEXT,
-                        gtk_im_module_ensure_extension_point ();
+                         gtk_im_module_ensure_extension_point ();
                          g_io_extension_point_implement (GTK_IM_MODULE_EXTENSION_POINT_NAME,
                                                          g_define_type_id,
                                                          "quartz",
                                                          0))
 
 static void
-quartz_get_preedit_string (GtkIMContext *context,
-                           gchar **str,
+quartz_get_preedit_string (GtkIMContext   *context,
+                           gchar         **str,
                            PangoAttrList **attrs,
-                           gint *cursor_pos)
+                           gint           *cursor_pos)
 {
   GtkIMContextQuartz *qc = GTK_IM_CONTEXT_QUARTZ (context);
 
-  GTK_NOTE (MISC, g_print ("quartz_get_preedit_string\n"));
+  GDK_NOTE (MISC, g_print ("quartz_get_preedit_string\n"));
 
   if (str)
     *str = qc->preedit_str ? g_strdup (qc->preedit_str) : g_strdup ("");
@@ -85,7 +87,7 @@ quartz_get_preedit_string (GtkIMContext *context,
               ch = g_utf8_next_char (ch);
 
               if (i >= qc->cursor_index &&
-                 i < qc->cursor_index + qc->selected_len)
+                  i < qc->cursor_index + qc->selected_len)
                 attr = pango_attr_underline_new (PANGO_UNDERLINE_DOUBLE);
               else
                 attr = pango_attr_underline_new (PANGO_UNDERLINE_SINGLE);
@@ -110,7 +112,7 @@ quartz_get_preedit_string (GtkIMContext *context,
 
 static gboolean
 output_result (GtkIMContext *context,
-               GdkSurface *surface)
+               GdkSurface   *surface)
 {
   GtkIMContextQuartz *qc = GTK_IM_CONTEXT_QUARTZ (context);
   gboolean retval = FALSE;
@@ -120,7 +122,7 @@ output_result (GtkIMContext *context,
   marked_str = g_strdup (g_object_get_data (G_OBJECT (surface), TIC_MARKED_TEXT));
   if (fixed_str)
     {
-      GTK_NOTE (MISC, g_print ("tic-insert-text: %s\n", fixed_str));
+      GDK_NOTE (MISC, g_print ("tic-insert-text: %s\n", fixed_str));
       g_free (qc->preedit_str);
       qc->preedit_str = NULL;
       g_object_set_data (G_OBJECT (surface), TIC_INSERT_TEXT, NULL);
@@ -128,9 +130,9 @@ output_result (GtkIMContext *context,
       g_signal_emit_by_name (context, "preedit_changed");
 
       unsigned int filtered =
-          GPOINTER_TO_UINT (g_object_get_data (G_OBJECT (surface),
-                                               GIC_FILTER_KEY));
-      GTK_NOTE (MISC, g_print ("filtered, %d\n", filtered));
+           GPOINTER_TO_UINT (g_object_get_data (G_OBJECT (surface),
+                                                GIC_FILTER_KEY));
+      GDK_NOTE (MISC, g_print ("filtered, %d\n", filtered));
       if (filtered)
         retval = TRUE;
       else
@@ -138,13 +140,13 @@ output_result (GtkIMContext *context,
     }
   if (marked_str)
     {
-      GTK_NOTE (MISC, g_print ("tic-marked-text: %s\n", marked_str));
+      GDK_NOTE (MISC, g_print ("tic-marked-text: %s\n", marked_str));
       qc->cursor_index =
-          GPOINTER_TO_UINT (g_object_get_data (G_OBJECT (surface),
-                                               TIC_SELECTED_POS));
+           GPOINTER_TO_UINT (g_object_get_data (G_OBJECT (surface),
+                                                TIC_SELECTED_POS));
       qc->selected_len =
-          GPOINTER_TO_UINT (g_object_get_data (G_OBJECT (surface),
-                                               TIC_SELECTED_LEN));
+           GPOINTER_TO_UINT (g_object_get_data (G_OBJECT (surface),
+                                                TIC_SELECTED_LEN));
       g_free (qc->preedit_str);
       qc->preedit_str = g_strdup (marked_str);
       g_object_set_data (G_OBJECT (surface), TIC_MARKED_TEXT, NULL);
@@ -168,25 +170,28 @@ quartz_filter_keypress (GtkIMContext *context,
   GtkIMContextQuartz *qc = GTK_IM_CONTEXT_QUARTZ (context);
   gboolean retval;
   NSView *nsview;
-  GdkSurface *surface;
 
-  GTK_NOTE (MISC, g_print ("quartz_filter_keypress\n"));
+  GDK_NOTE (MISC, g_print ("quartz_filter_keypress\n"));
 
-  if (!GDK_IS_QUARTZ_SURFACE (qc->client_surface))
+  if (!GDK_IS_MACOS_SURFACE (qc->client_surface))
     return FALSE;
 
-  nsview = gdk_quartz_surface_get_nsview (qc->client_surface);
-  surface = (GdkSurface *)[ (GdkQuartzView *)nsview gdkSurface];
-  GTK_NOTE (MISC, g_print ("client_surface: %p, win: %p, nsview: %p\n",
-                          qc->client_surface, surface, nsview));
+  nsview = _gdk_macos_surface_get_view (GDK_MACOS_SURFACE (qc->client_surface));
+  GDK_NOTE (MISC, g_print ("client_surface: %p, win: %p, nsview: %p\n",
+                           qc->client_surface, qc->client_surface, nsview));
 
+#if 0
   NSEvent *nsevent = gdk_quartz_event_get_nsevent ((GdkEvent *)event);
+#else
+  /* TODO: Fix this to get actual NSEvent */
+  NSEvent *nsevent = nil;
+#endif
 
   if (!nsevent)
     {
       if (event->hardware_keycode == 0 && event->keyval == 0xffffff)
         /* update text input changes by mouse events */
-        return output_result (context, surface);
+        return output_result (context, qc->client_surface);
       else
         return gtk_im_context_filter_keypress (qc->helper, event);
     }
@@ -194,24 +199,26 @@ quartz_filter_keypress (GtkIMContext *context,
   if (event->type == GDK_KEY_RELEASE)
     return FALSE;
 
-  if (event->hardware_keycode == 55)   /* Command */
+  if (event->hardware_keycode == 55)    /* Command */
     return FALSE;
 
   NSEventType etype = [nsevent type];
-  if (etype == NSKeyDown)
+  if (etype == NSEventTypeKeyDown)
     {
-       g_object_set_data (G_OBJECT (surface), TIC_IN_KEY_DOWN,
-                                          GUINT_TO_POINTER (TRUE));
-       [nsview keyDown: nsevent];
+      g_object_set_data (G_OBJECT (qc->client_surface),
+                         TIC_IN_KEY_DOWN,
+                         GUINT_TO_POINTER (TRUE));
+      [nsview keyDown: nsevent];
     }
   /* JIS_Eisu || JIS_Kana */
   if (event->hardware_keycode == 102 || event->hardware_keycode == 104)
     return FALSE;
 
-  retval = output_result(context, surface);
-  g_object_set_data (G_OBJECT (surface), TIC_IN_KEY_DOWN,
-                                     GUINT_TO_POINTER (FALSE));
-  GTK_NOTE (MISC, g_print ("quartz_filter_keypress done\n"));
+  retval = output_result(context, qc->client_surface);
+  g_object_set_data (G_OBJECT (qc->client_surface),
+                     TIC_IN_KEY_DOWN,
+                     GUINT_TO_POINTER (FALSE));
+  GDK_NOTE (MISC, g_print ("quartz_filter_keypress done\n"));
 
   return retval;
 }
@@ -224,15 +231,15 @@ discard_preedit (GtkIMContext *context)
   if (!qc->client_surface)
     return;
 
-  if (!GDK_IS_QUARTZ_SURFACE (qc->client_surface))
+  if (!GDK_IS_MACOS_SURFACE (qc->client_surface))
     return;
 
-  NSView *nsview = gdk_quartz_surface_get_nsview (qc->client_surface);
+  NSView *nsview = _gdk_macos_surface_get_view (GDK_MACOS_SURFACE (qc->client_surface));
   if (!nsview)
     return;
 
   /* reset any partial input for this NSView */
-  [(GdkQuartzView *)nsview unmarkText];
+  [(GdkMacosBaseView *)nsview unmarkText];
   NSInputManager *currentInputManager = [NSInputManager currentInputManager];
   [currentInputManager markedTextAbandoned:nsview];
 
@@ -249,24 +256,29 @@ discard_preedit (GtkIMContext *context)
 static void
 quartz_reset (GtkIMContext *context)
 {
-  GTK_NOTE (MISC, g_print ("quartz_reset\n"));
+  GDK_NOTE (MISC, g_print ("quartz_reset\n"));
   discard_preedit (context);
 }
 
 static void
-quartz_set_client_surface (GtkIMContext *context, GtkWidget *widget)
+quartz_set_client_surface (GtkIMContext *context,
+                           GtkWidget    *widget)
 {
   GtkIMContextQuartz *qc = GTK_IM_CONTEXT_QUARTZ (context);
+  GtkNative *native = gtk_widget_get_native (widget);
 
-  GTK_NOTE (MISC, g_print ("quartz_set_client_surface: %p\n", widget));
+  GDK_NOTE (MISC, g_print ("quartz_set_client_surface: %p\n", widget));
 
-  qc->client_surface = gtk_widget_get_parent_surface (widget);
+  if (native)
+    qc->client_surface = gtk_native_get_surface (native);
+  else
+    qc->client_surface = NULL;
 }
 
 static void
 quartz_focus_in (GtkIMContext *context)
 {
-  GTK_NOTE (MISC, g_print ("quartz_focus_in\n"));
+  GDK_NOTE (MISC, g_print ("quartz_focus_in\n"));
 
   GtkIMContextQuartz *qc = GTK_IM_CONTEXT_QUARTZ (context);
   qc->focused = TRUE;
@@ -275,7 +287,7 @@ quartz_focus_in (GtkIMContext *context)
 static void
 quartz_focus_out (GtkIMContext *context)
 {
-  GTK_NOTE (MISC, g_print ("quartz_focus_out\n"));
+  GDK_NOTE (MISC, g_print ("quartz_focus_out\n"));
 
   GtkIMContextQuartz *qc = GTK_IM_CONTEXT_QUARTZ (context);
   qc->focused = FALSE;
@@ -285,14 +297,14 @@ quartz_focus_out (GtkIMContext *context)
 }
 
 static void
-quartz_set_cursor_location (GtkIMContext *context, GdkRectangle *area)
+quartz_set_cursor_location (GtkIMContext *context,
+                            GdkRectangle *area)
 {
   GtkIMContextQuartz *qc = GTK_IM_CONTEXT_QUARTZ (context);
   gint x, y;
   NSView *nsview;
-  GdkSurface *surface;
 
-  GTK_NOTE (MISC, g_print ("quartz_set_cursor_location\n"));
+  GDK_NOTE (MISC, g_print ("quartz_set_cursor_location\n"));
 
   if (!qc->client_surface)
     return;
@@ -310,22 +322,24 @@ quartz_set_cursor_location (GtkIMContext *context, GdkRectangle *area)
   qc->cursor_rect->x = area->x + x;
   qc->cursor_rect->y = area->y + y;
 
-  if (!GDK_IS_QUARTZ_SURFACE (qc->client_surface))
+  if (!GDK_IS_MACOS_SURFACE (qc->client_surface))
     return;
 
-  nsview = gdk_quartz_surface_get_nsview (qc->client_surface);
-  surface = (GdkSurface *)[ (GdkQuartzView*)nsview gdkSurface];
-  g_object_set_data (G_OBJECT (surface), GIC_CURSOR_RECT, qc->cursor_rect);
+  nsview = _gdk_macos_surface_get_view (GDK_MACOS_SURFACE (qc->client_surface));
+  g_object_set_data (G_OBJECT (qc->client_surface), GIC_CURSOR_RECT, qc->cursor_rect);
 }
 
 static void
-quartz_set_use_preedit (GtkIMContext *context, gboolean use_preedit)
+quartz_set_use_preedit (GtkIMContext *context,
+                        gboolean      use_preedit)
 {
-  GTK_NOTE (MISC, g_print ("quartz_set_use_preedit: %d\n", use_preedit));
+  GDK_NOTE (MISC, g_print ("quartz_set_use_preedit: %d\n", use_preedit));
 }
 
 static void
-commit_cb (GtkIMContext *context, const gchar *str, GtkIMContextQuartz *qc)
+commit_cb (GtkIMContext       *context,
+           const gchar        *str,
+           GtkIMContextQuartz *qc)
 {
   g_signal_emit_by_name (qc, "commit", str);
 }
@@ -333,7 +347,7 @@ commit_cb (GtkIMContext *context, const gchar *str, GtkIMContextQuartz *qc)
 static void
 imquartz_finalize (GObject *obj)
 {
-  GTK_NOTE (MISC, g_print ("imquartz_finalize\n"));
+  GDK_NOTE (MISC, g_print ("imquartz_finalize\n"));
 
   GtkIMContextQuartz *qc = GTK_IM_CONTEXT_QUARTZ (obj);
   g_free (qc->preedit_str);
@@ -344,13 +358,13 @@ imquartz_finalize (GObject *obj)
   g_signal_handlers_disconnect_by_func (qc->helper, (gpointer)commit_cb, qc);
   g_object_unref (qc->helper);
 
-  gtk_im_context_quartz_parent_class->finalize (obj);
+  G_OBJECT_CLASS (gtk_im_context_quartz_parent_class)->finalize (obj);
 }
 
 static void
 gtk_im_context_quartz_class_init (GtkIMContextQuartzClass *class)
 {
-  GTK_NOTE (MISC, g_print ("gtk_im_context_quartz_class_init\n"));
+  GDK_NOTE (MISC, g_print ("gtk_im_context_quartz_class_init\n"));
 
   GtkIMContextClass *klass = GTK_IM_CONTEXT_CLASS (class);
   GObjectClass *object_class = G_OBJECT_CLASS (class);
@@ -370,7 +384,7 @@ gtk_im_context_quartz_class_init (GtkIMContextQuartzClass *class)
 static void
 gtk_im_context_quartz_init (GtkIMContextQuartz *qc)
 {
-  GTK_NOTE (MISC, g_print ("gtk_im_context_quartz_init\n"));
+  GDK_NOTE (MISC, g_print ("gtk_im_context_quartz_init\n"));
 
   qc->preedit_str = g_strdup ("");
   qc->cursor_index = 0;
@@ -381,3 +395,5 @@ gtk_im_context_quartz_init (GtkIMContextQuartz *qc)
   qc->helper = g_object_new (GTK_TYPE_IM_CONTEXT_SIMPLE, NULL);
   g_signal_connect (G_OBJECT (qc->helper), "commit", G_CALLBACK (commit_cb), qc);
 }
+
+G_GNUC_END_IGNORE_DEPRECATIONS


[Date Prev][Date Next]   [Thread Prev][Thread Next]   [Thread Index] [Date Index] [Author Index]