Blame modules/input/imquartz.c

Packit Service fb6fa5
/*
Packit Service fb6fa5
 * gtkimmodulequartz
Packit Service fb6fa5
 * Copyright (C) 2011 Hiroyuki Yamamoto
Packit Service fb6fa5
 *
Packit Service fb6fa5
 * This library is free software; you can redistribute it and/or
Packit Service fb6fa5
 * modify it under the terms of the GNU Lesser General Public
Packit Service fb6fa5
 * License as published by the Free Software Foundation; either
Packit Service fb6fa5
 * version 2 of the License, or (at your option) any later version.
Packit Service fb6fa5
 *
Packit Service fb6fa5
 * This library is distributed in the hope that it will be useful,
Packit Service fb6fa5
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
Packit Service fb6fa5
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
Packit Service fb6fa5
 * Lesser General Public License for more details.
Packit Service fb6fa5
 *
Packit Service fb6fa5
 * You should have received a copy of the GNU Lesser General Public
Packit Service fb6fa5
 * License along with this library; if not, write to the
Packit Service fb6fa5
 * Free Software Foundation, Inc., 59 Temple Place - Suite 330,
Packit Service fb6fa5
 * Boston, MA 02111-1307, USA.
Packit Service fb6fa5
 *
Packit Service fb6fa5
 * $Id:$
Packit Service fb6fa5
 */
Packit Service fb6fa5
Packit Service fb6fa5
#include "config.h"
Packit Service fb6fa5
#include <string.h>
Packit Service fb6fa5
Packit Service fb6fa5
#include <gtk/gtk.h>
Packit Service fb6fa5
#include "gtk/gtkintl.h"
Packit Service fb6fa5
#include "gtk/gtkimmodule.h"
Packit Service fb6fa5
Packit Service fb6fa5
#include "gdk/quartz/gdkquartz.h"
Packit Service fb6fa5
#include "gdk/quartz/GdkQuartzView.h"
Packit Service fb6fa5
Packit Service fb6fa5
#define GTK_IM_CONTEXT_TYPE_QUARTZ (type_quartz)
Packit Service fb6fa5
#define GTK_IM_CONTEXT_QUARTZ(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), GTK_IM_CONTEXT_TYPE_QUARTZ, GtkIMContextQuartz))
Packit Service fb6fa5
#define GTK_IM_CONTEXT_QUARTZ_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS((obj), GTK_IM_CONTEXT_TYPE_QUARTZ, GtkIMContextQuartzClass))
Packit Service fb6fa5
Packit Service fb6fa5
typedef struct _GtkIMContextQuartz
Packit Service fb6fa5
{
Packit Service fb6fa5
  GtkIMContext parent;
Packit Service fb6fa5
  GtkIMContext *slave;
Packit Service fb6fa5
  GdkWindow *client_window;
Packit Service fb6fa5
  gchar *preedit_str;
Packit Service fb6fa5
  unsigned int cursor_index;
Packit Service fb6fa5
  unsigned int selected_len;
Packit Service fb6fa5
  GdkRectangle *cursor_rect;
Packit Service fb6fa5
  gboolean focused;
Packit Service fb6fa5
} GtkIMContextQuartz;
Packit Service fb6fa5
Packit Service fb6fa5
typedef struct _GtkIMContextQuartzClass
Packit Service fb6fa5
{
Packit Service fb6fa5
  GtkIMContextClass parent_class;
Packit Service fb6fa5
} GtkIMContextQuartzClass;
Packit Service fb6fa5
Packit Service fb6fa5
GType type_quartz = 0;
Packit Service fb6fa5
static GObjectClass *parent_class;
Packit Service fb6fa5
Packit Service fb6fa5
static const GtkIMContextInfo imquartz_info =
Packit Service fb6fa5
{
Packit Service fb6fa5
  "quartz",
Packit Service fb6fa5
  "Mac OS X Quartz",
Packit Service fb6fa5
  GETTEXT_PACKAGE,
Packit Service fb6fa5
  GTK_LOCALEDIR,
Packit Service fb6fa5
  "ja:ko:zh:*",
Packit Service fb6fa5
};
Packit Service fb6fa5
Packit Service fb6fa5
static const GtkIMContextInfo *info_list[] =
Packit Service fb6fa5
{
Packit Service fb6fa5
  &imquartz_info,
Packit Service fb6fa5
};
Packit Service fb6fa5
Packit Service fb6fa5
#ifndef INCLUDE_IM_quartz
Packit Service fb6fa5
#define MODULE_ENTRY(type,function) G_MODULE_EXPORT type im_module_ ## function
Packit Service fb6fa5
#else
Packit Service fb6fa5
#define MODULE_ENTRY(type, function) type _gtk_immodule_quartz_ ## function
Packit Service fb6fa5
#endif
Packit Service fb6fa5
Packit Service fb6fa5
static void
Packit Service fb6fa5
quartz_get_preedit_string (GtkIMContext *context,
Packit Service fb6fa5
                           gchar **str,
Packit Service fb6fa5
                           PangoAttrList **attrs,
Packit Service fb6fa5
                           gint *cursor_pos)
Packit Service fb6fa5
{
Packit Service fb6fa5
  GtkIMContextQuartz *qc = GTK_IM_CONTEXT_QUARTZ (context);
Packit Service fb6fa5
Packit Service fb6fa5
  GTK_NOTE (MISC, g_print ("quartz_get_preedit_string\n"));
Packit Service fb6fa5
Packit Service fb6fa5
  if (str)
Packit Service fb6fa5
    *str = qc->preedit_str ? g_strdup (qc->preedit_str) : g_strdup ("");
Packit Service fb6fa5
Packit Service fb6fa5
  if (attrs)
Packit Service fb6fa5
    {
Packit Service fb6fa5
      *attrs = pango_attr_list_new ();
Packit Service fb6fa5
      int len = g_utf8_strlen (*str, -1);
Packit Service fb6fa5
      gchar *ch = *str;
Packit Service fb6fa5
      if (len > 0)
Packit Service fb6fa5
        {
Packit Service fb6fa5
          PangoAttribute *attr;
Packit Service fb6fa5
          int i = 0;
Packit Service fb6fa5
          for (;;)
Packit Service fb6fa5
            {
Packit Service fb6fa5
              gchar *s = ch;
Packit Service fb6fa5
              ch = g_utf8_next_char (ch);
Packit Service fb6fa5
Packit Service fb6fa5
              if (i >= qc->cursor_index &&
Packit Service fb6fa5
		  i < qc->cursor_index + qc->selected_len)
Packit Service fb6fa5
                attr = pango_attr_underline_new (PANGO_UNDERLINE_DOUBLE);
Packit Service fb6fa5
              else
Packit Service fb6fa5
                attr = pango_attr_underline_new (PANGO_UNDERLINE_SINGLE);
Packit Service fb6fa5
Packit Service fb6fa5
              attr->start_index = s - *str;
Packit Service fb6fa5
              if (!*ch)
Packit Service fb6fa5
                attr->end_index = attr->start_index + strlen (s);
Packit Service fb6fa5
              else
Packit Service fb6fa5
                attr->end_index = ch - *str;
Packit Service fb6fa5
Packit Service fb6fa5
              pango_attr_list_change (*attrs, attr);
Packit Service fb6fa5
Packit Service fb6fa5
              if (!*ch)
Packit Service fb6fa5
                break;
Packit Service fb6fa5
              i++;
Packit Service fb6fa5
            }
Packit Service fb6fa5
        }
Packit Service fb6fa5
    }
Packit Service fb6fa5
  if (cursor_pos)
Packit Service fb6fa5
    *cursor_pos = qc->cursor_index;
Packit Service fb6fa5
}
Packit Service fb6fa5
Packit Service fb6fa5
static gboolean
Packit Service fb6fa5
output_result (GtkIMContext *context,
Packit Service fb6fa5
               GdkWindow *win)
Packit Service fb6fa5
{
Packit Service fb6fa5
  GtkIMContextQuartz *qc = GTK_IM_CONTEXT_QUARTZ (context);
Packit Service fb6fa5
  gboolean retval = FALSE;
Packit Service fb6fa5
  gchar *fixed_str, *marked_str;
Packit Service fb6fa5
Packit Service fb6fa5
  fixed_str = g_object_get_data (G_OBJECT (win), TIC_INSERT_TEXT);
Packit Service fb6fa5
  marked_str = g_object_get_data (G_OBJECT (win), TIC_MARKED_TEXT);
Packit Service fb6fa5
  if (fixed_str)
Packit Service fb6fa5
    {
Packit Service fb6fa5
      GTK_NOTE (MISC, g_print ("tic-insert-text: %s\n", fixed_str));
Packit Service fb6fa5
      g_free (qc->preedit_str);
Packit Service fb6fa5
      qc->preedit_str = NULL;
Packit Service fb6fa5
      g_object_set_data (G_OBJECT (win), TIC_INSERT_TEXT, NULL);
Packit Service fb6fa5
      g_signal_emit_by_name (context, "commit", fixed_str);
Packit Service fb6fa5
      g_signal_emit_by_name (context, "preedit_changed");
Packit Service fb6fa5
Packit Service fb6fa5
      unsigned int filtered =
Packit Service fb6fa5
	   GPOINTER_TO_UINT (g_object_get_data (G_OBJECT (win),
Packit Service fb6fa5
						GIC_FILTER_KEY));
Packit Service fb6fa5
      GTK_NOTE (MISC, g_print ("filtered, %d\n", filtered));
Packit Service fb6fa5
      if (filtered)
Packit Service fb6fa5
        retval = TRUE;
Packit Service fb6fa5
      else
Packit Service fb6fa5
        retval = FALSE;
Packit Service fb6fa5
    }
Packit Service fb6fa5
  if (marked_str)
Packit Service fb6fa5
    {
Packit Service fb6fa5
      GTK_NOTE (MISC, g_print ("tic-marked-text: %s\n", marked_str));
Packit Service fb6fa5
      qc->cursor_index =
Packit Service fb6fa5
	   GPOINTER_TO_UINT (g_object_get_data (G_OBJECT (win),
Packit Service fb6fa5
						TIC_SELECTED_POS));
Packit Service fb6fa5
      qc->selected_len =
Packit Service fb6fa5
	   GPOINTER_TO_UINT (g_object_get_data (G_OBJECT (win),
Packit Service fb6fa5
						TIC_SELECTED_LEN));
Packit Service fb6fa5
      g_free (qc->preedit_str);
Packit Service fb6fa5
      qc->preedit_str = g_strdup (marked_str);
Packit Service fb6fa5
      g_object_set_data (G_OBJECT (win), TIC_MARKED_TEXT, NULL);
Packit Service fb6fa5
      g_signal_emit_by_name (context, "preedit_changed");
Packit Service fb6fa5
      retval = TRUE;
Packit Service fb6fa5
    }
Packit Service fb6fa5
  if (!fixed_str && !marked_str)
Packit Service fb6fa5
    {
Packit Service fb6fa5
      if (qc->preedit_str && strlen (qc->preedit_str) > 0)
Packit Service fb6fa5
        retval = TRUE;
Packit Service fb6fa5
    }
Packit Service fb6fa5
Packit Service fb6fa5
  g_free (fixed_str);
Packit Service fb6fa5
  g_free (marked_str);
Packit Service fb6fa5
Packit Service fb6fa5
  return retval;
Packit Service fb6fa5
}
Packit Service fb6fa5
Packit Service fb6fa5
static gboolean
Packit Service fb6fa5
quartz_filter_keypress (GtkIMContext *context,
Packit Service fb6fa5
                        GdkEventKey *event)
Packit Service fb6fa5
{
Packit Service fb6fa5
  GtkIMContextQuartz *qc = GTK_IM_CONTEXT_QUARTZ (context);
Packit Service fb6fa5
  gboolean retval;
Packit Service fb6fa5
  NSView *nsview;
Packit Service fb6fa5
  GdkWindow *win;
Packit Service fb6fa5
Packit Service fb6fa5
  GTK_NOTE (MISC, g_print ("quartz_filter_keypress\n"));
Packit Service fb6fa5
Packit Service fb6fa5
  if (!qc->client_window)
Packit Service fb6fa5
    return FALSE;
Packit Service fb6fa5
Packit Service fb6fa5
  if (!gdk_quartz_window_is_quartz (qc->client_window))
Packit Service fb6fa5
    return gtk_im_context_filter_keypress (qc->slave, event);
Packit Service fb6fa5
Packit Service fb6fa5
  nsview = gdk_quartz_window_get_nsview (qc->client_window);
Packit Service fb6fa5
  win = (GdkWindow *)[ (GdkQuartzView *)nsview gdkWindow];
Packit Service fb6fa5
  GTK_NOTE (MISC, g_print ("client_window: %p, win: %p, nsview: %p\n",
Packit Service fb6fa5
			   qc->client_window, win, nsview));
Packit Service fb6fa5
Packit Service fb6fa5
  NSEvent *nsevent = gdk_quartz_event_get_nsevent ((GdkEvent *)event);
Packit Service fb6fa5
Packit Service fb6fa5
  if (!nsevent)
Packit Service fb6fa5
    {
Packit Service fb6fa5
      if (event->hardware_keycode == 0 && event->keyval == 0xffffff)
Packit Service fb6fa5
        /* update text input changes by mouse events */
Packit Service fb6fa5
        return output_result (context, win);
Packit Service fb6fa5
      else
Packit Service fb6fa5
        return gtk_im_context_filter_keypress (qc->slave, event);
Packit Service fb6fa5
    }
Packit Service fb6fa5
Packit Service fb6fa5
  if (event->type == GDK_KEY_RELEASE)
Packit Service fb6fa5
    return FALSE;
Packit Service fb6fa5
Packit Service fb6fa5
  if (event->hardware_keycode == 55)	/* Command */
Packit Service fb6fa5
    return FALSE;
Packit Service fb6fa5
Packit Service fb6fa5
  NSEventType etype = [nsevent type];
Packit Service fb6fa5
  if (etype == NSKeyDown)
Packit Service fb6fa5
    {
Packit Service fb6fa5
       g_object_set_data (G_OBJECT (win), TIC_IN_KEY_DOWN,
Packit Service fb6fa5
                                          GUINT_TO_POINTER (TRUE));
Packit Service fb6fa5
       [nsview keyDown: nsevent];
Packit Service fb6fa5
    }
Packit Service fb6fa5
  /* JIS_Eisu || JIS_Kana */
Packit Service fb6fa5
  if (event->hardware_keycode == 102 || event->hardware_keycode == 104)
Packit Service fb6fa5
    return FALSE;
Packit Service fb6fa5
Packit Service fb6fa5
  retval = output_result(context, win);
Packit Service fb6fa5
  g_object_set_data (G_OBJECT (win), TIC_IN_KEY_DOWN,
Packit Service fb6fa5
                                     GUINT_TO_POINTER (FALSE));
Packit Service fb6fa5
  GTK_NOTE (MISC, g_print ("quartz_filter_keypress done\n"));
Packit Service fb6fa5
Packit Service fb6fa5
  return retval;
Packit Service fb6fa5
}
Packit Service fb6fa5
Packit Service fb6fa5
static void
Packit Service fb6fa5
discard_preedit (GtkIMContext *context)
Packit Service fb6fa5
{
Packit Service fb6fa5
  GtkIMContextQuartz *qc = GTK_IM_CONTEXT_QUARTZ (context);
Packit Service fb6fa5
Packit Service fb6fa5
  if (!qc->client_window)
Packit Service fb6fa5
    return;
Packit Service fb6fa5
Packit Service fb6fa5
  if (!gdk_quartz_window_is_quartz (qc->client_window))
Packit Service fb6fa5
    return;
Packit Service fb6fa5
Packit Service fb6fa5
  NSView *nsview = gdk_quartz_window_get_nsview (qc->client_window);
Packit Service fb6fa5
  if (!nsview)
Packit Service fb6fa5
    return;
Packit Service fb6fa5
Packit Service fb6fa5
  /* reset any partial input for this NSView */
Packit Service fb6fa5
  [(GdkQuartzView *)nsview unmarkText];
Packit Service fb6fa5
  NSInputManager *currentInputManager = [NSInputManager currentInputManager];
Packit Service fb6fa5
  [currentInputManager markedTextAbandoned:nsview];
Packit Service fb6fa5
Packit Service fb6fa5
  if (qc->preedit_str && strlen (qc->preedit_str) > 0)
Packit Service fb6fa5
    {
Packit Service fb6fa5
      g_signal_emit_by_name (context, "commit", qc->preedit_str);
Packit Service fb6fa5
Packit Service fb6fa5
      g_free (qc->preedit_str);
Packit Service fb6fa5
      qc->preedit_str = NULL;
Packit Service fb6fa5
      g_signal_emit_by_name (context, "preedit_changed");
Packit Service fb6fa5
    }
Packit Service fb6fa5
}
Packit Service fb6fa5
Packit Service fb6fa5
static void
Packit Service fb6fa5
quartz_reset (GtkIMContext *context)
Packit Service fb6fa5
{
Packit Service fb6fa5
  GTK_NOTE (MISC, g_print ("quartz_reset\n"));
Packit Service fb6fa5
  discard_preedit (context);
Packit Service fb6fa5
}
Packit Service fb6fa5
Packit Service fb6fa5
static void
Packit Service fb6fa5
quartz_set_client_window (GtkIMContext *context, GdkWindow *window)
Packit Service fb6fa5
{
Packit Service fb6fa5
  GtkIMContextQuartz *qc = GTK_IM_CONTEXT_QUARTZ (context);
Packit Service fb6fa5
Packit Service fb6fa5
  GTK_NOTE (MISC, g_print ("quartz_set_client_window: %p\n", window));
Packit Service fb6fa5
Packit Service fb6fa5
  qc->client_window = window;
Packit Service fb6fa5
}
Packit Service fb6fa5
Packit Service fb6fa5
static void
Packit Service fb6fa5
quartz_focus_in (GtkIMContext *context)
Packit Service fb6fa5
{
Packit Service fb6fa5
  GTK_NOTE (MISC, g_print ("quartz_focus_in\n"));
Packit Service fb6fa5
Packit Service fb6fa5
  GtkIMContextQuartz *qc = GTK_IM_CONTEXT_QUARTZ (context);
Packit Service fb6fa5
  qc->focused = TRUE;
Packit Service fb6fa5
}
Packit Service fb6fa5
Packit Service fb6fa5
static void
Packit Service fb6fa5
quartz_focus_out (GtkIMContext *context)
Packit Service fb6fa5
{
Packit Service fb6fa5
  GTK_NOTE (MISC, g_print ("quartz_focus_out\n"));
Packit Service fb6fa5
Packit Service fb6fa5
  GtkIMContextQuartz *qc = GTK_IM_CONTEXT_QUARTZ (context);
Packit Service fb6fa5
  qc->focused = FALSE;
Packit Service fb6fa5
Packit Service fb6fa5
  /* Commit any partially built strings or it'll mess up other GTK+ widgets in the window */
Packit Service fb6fa5
  discard_preedit (context);
Packit Service fb6fa5
}
Packit Service fb6fa5
Packit Service fb6fa5
static void
Packit Service fb6fa5
quartz_set_cursor_location (GtkIMContext *context, GdkRectangle *area)
Packit Service fb6fa5
{
Packit Service fb6fa5
  GtkIMContextQuartz *qc = GTK_IM_CONTEXT_QUARTZ (context);
Packit Service fb6fa5
  gint x, y;
Packit Service fb6fa5
  NSView *nsview;
Packit Service fb6fa5
  GdkWindow *win;
Packit Service fb6fa5
Packit Service fb6fa5
  GTK_NOTE (MISC, g_print ("quartz_set_cursor_location\n"));
Packit Service fb6fa5
Packit Service fb6fa5
  if (!qc->client_window)
Packit Service fb6fa5
    return;
Packit Service fb6fa5
Packit Service fb6fa5
  if (!gdk_quartz_window_is_quartz (qc->client_window))
Packit Service fb6fa5
    return;
Packit Service fb6fa5
Packit Service fb6fa5
  if (!qc->focused)
Packit Service fb6fa5
    return;
Packit Service fb6fa5
Packit Service fb6fa5
  qc->cursor_rect->x = area->x;
Packit Service fb6fa5
  qc->cursor_rect->y = area->y;
Packit Service fb6fa5
  qc->cursor_rect->width = area->width;
Packit Service fb6fa5
  qc->cursor_rect->height = area->height;
Packit Service fb6fa5
Packit Service fb6fa5
  gdk_window_get_origin (qc->client_window, &x, &y);
Packit Service fb6fa5
Packit Service fb6fa5
  qc->cursor_rect->x = area->x + x;
Packit Service fb6fa5
  qc->cursor_rect->y = area->y + y;
Packit Service fb6fa5
Packit Service fb6fa5
  nsview = gdk_quartz_window_get_nsview (qc->client_window);
Packit Service fb6fa5
Packit Service fb6fa5
  win = (GdkWindow *)[ (GdkQuartzView*)nsview gdkWindow];
Packit Service fb6fa5
  g_object_set_data (G_OBJECT (win), GIC_CURSOR_RECT, qc->cursor_rect);
Packit Service fb6fa5
}
Packit Service fb6fa5
Packit Service fb6fa5
static void
Packit Service fb6fa5
quartz_set_use_preedit (GtkIMContext *context, gboolean use_preedit)
Packit Service fb6fa5
{
Packit Service fb6fa5
  GTK_NOTE (MISC, g_print ("quartz_set_use_preedit: %d\n", use_preedit));
Packit Service fb6fa5
}
Packit Service fb6fa5
Packit Service fb6fa5
static void
Packit Service fb6fa5
commit_cb (GtkIMContext *context, const gchar *str, GtkIMContextQuartz *qc)
Packit Service fb6fa5
{
Packit Service fb6fa5
  g_signal_emit_by_name (qc, "commit", str);
Packit Service fb6fa5
}
Packit Service fb6fa5
Packit Service fb6fa5
static void
Packit Service fb6fa5
imquartz_finalize (GObject *obj)
Packit Service fb6fa5
{
Packit Service fb6fa5
  GTK_NOTE (MISC, g_print ("imquartz_finalize\n"));
Packit Service fb6fa5
Packit Service fb6fa5
  GtkIMContextQuartz *qc = GTK_IM_CONTEXT_QUARTZ (obj);
Packit Service fb6fa5
  g_free (qc->preedit_str);
Packit Service fb6fa5
  qc->preedit_str = NULL;
Packit Service fb6fa5
  g_free (qc->cursor_rect);
Packit Service fb6fa5
  qc->cursor_rect = NULL;
Packit Service fb6fa5
Packit Service fb6fa5
  g_signal_handlers_disconnect_by_func (qc->slave, (gpointer)commit_cb, qc);
Packit Service fb6fa5
  g_object_unref (qc->slave);
Packit Service fb6fa5
Packit Service fb6fa5
  parent_class->finalize (obj);
Packit Service fb6fa5
}
Packit Service fb6fa5
Packit Service fb6fa5
static void
Packit Service fb6fa5
gtk_im_context_quartz_class_init (GtkIMContextClass *klass)
Packit Service fb6fa5
{
Packit Service fb6fa5
  GTK_NOTE (MISC, g_print ("gtk_im_context_quartz_class_init\n"));
Packit Service fb6fa5
Packit Service fb6fa5
  GObjectClass *object_class = G_OBJECT_CLASS (klass);
Packit Service fb6fa5
  parent_class = g_type_class_peek_parent (klass);
Packit Service fb6fa5
Packit Service fb6fa5
  klass->get_preedit_string = quartz_get_preedit_string;
Packit Service fb6fa5
  klass->filter_keypress = quartz_filter_keypress;
Packit Service fb6fa5
  klass->reset = quartz_reset;
Packit Service fb6fa5
  klass->set_client_window = quartz_set_client_window;
Packit Service fb6fa5
  klass->focus_in = quartz_focus_in;
Packit Service fb6fa5
  klass->focus_out = quartz_focus_out;
Packit Service fb6fa5
  klass->set_cursor_location = quartz_set_cursor_location;
Packit Service fb6fa5
  klass->set_use_preedit = quartz_set_use_preedit;
Packit Service fb6fa5
Packit Service fb6fa5
  object_class->finalize = imquartz_finalize;
Packit Service fb6fa5
}
Packit Service fb6fa5
Packit Service fb6fa5
static void
Packit Service fb6fa5
gtk_im_context_quartz_init (GtkIMContext *im_context)
Packit Service fb6fa5
{
Packit Service fb6fa5
  GTK_NOTE (MISC, g_print ("gtk_im_context_quartz_init\n"));
Packit Service fb6fa5
Packit Service fb6fa5
  GtkIMContextQuartz *qc = GTK_IM_CONTEXT_QUARTZ (im_context);
Packit Service fb6fa5
  qc->preedit_str = g_strdup ("");
Packit Service fb6fa5
  qc->cursor_index = 0;
Packit Service fb6fa5
  qc->selected_len = 0;
Packit Service fb6fa5
  qc->cursor_rect = g_malloc (sizeof (GdkRectangle));
Packit Service fb6fa5
  qc->focused = FALSE;
Packit Service fb6fa5
Packit Service fb6fa5
  qc->slave = g_object_new (GTK_TYPE_IM_CONTEXT_SIMPLE, NULL);
Packit Service fb6fa5
  g_signal_connect (G_OBJECT (qc->slave), "commit", G_CALLBACK (commit_cb), qc);
Packit Service fb6fa5
}
Packit Service fb6fa5
Packit Service fb6fa5
static void
Packit Service fb6fa5
gtk_im_context_quartz_register_type (GTypeModule *module)
Packit Service fb6fa5
{
Packit Service fb6fa5
  const GTypeInfo object_info =
Packit Service fb6fa5
  {
Packit Service fb6fa5
    sizeof (GtkIMContextQuartzClass),
Packit Service fb6fa5
    (GBaseInitFunc) NULL,
Packit Service fb6fa5
    (GBaseFinalizeFunc) NULL,
Packit Service fb6fa5
    (GClassInitFunc) gtk_im_context_quartz_class_init,
Packit Service fb6fa5
    NULL,           /* class_finalize */
Packit Service fb6fa5
    NULL,           /* class_data */
Packit Service fb6fa5
    sizeof (GtkIMContextQuartz),
Packit Service fb6fa5
    0,
Packit Service fb6fa5
    (GInstanceInitFunc) gtk_im_context_quartz_init,
Packit Service fb6fa5
  };
Packit Service fb6fa5
Packit Service fb6fa5
  type_quartz =
Packit Service fb6fa5
    g_type_module_register_type (module,
Packit Service fb6fa5
                                 GTK_TYPE_IM_CONTEXT,
Packit Service fb6fa5
                                 "GtkIMContextQuartz",
Packit Service fb6fa5
                                 &object_info, 0);
Packit Service fb6fa5
}
Packit Service fb6fa5
Packit Service fb6fa5
MODULE_ENTRY (void, init) (GTypeModule * module)
Packit Service fb6fa5
{
Packit Service fb6fa5
  gtk_im_context_quartz_register_type (module);
Packit Service fb6fa5
}
Packit Service fb6fa5
Packit Service fb6fa5
MODULE_ENTRY (void, exit) (void)
Packit Service fb6fa5
{
Packit Service fb6fa5
}
Packit Service fb6fa5
Packit Service fb6fa5
MODULE_ENTRY (void, list) (const GtkIMContextInfo *** contexts, int *n_contexts)
Packit Service fb6fa5
{
Packit Service fb6fa5
  *contexts = info_list;
Packit Service fb6fa5
  *n_contexts = G_N_ELEMENTS (info_list);
Packit Service fb6fa5
}
Packit Service fb6fa5
Packit Service fb6fa5
MODULE_ENTRY (GtkIMContext *, create) (const gchar * context_id)
Packit Service fb6fa5
{
Packit Service fb6fa5
  g_return_val_if_fail (context_id, NULL);
Packit Service fb6fa5
Packit Service fb6fa5
  if (!strcmp (context_id, "quartz"))
Packit Service fb6fa5
    {
Packit Service fb6fa5
      GTK_NOTE (MISC, g_print ("immodule_quartz create\n"));
Packit Service fb6fa5
      return g_object_new (type_quartz, NULL);
Packit Service fb6fa5
    }
Packit Service fb6fa5
  else
Packit Service fb6fa5
    return NULL;
Packit Service fb6fa5
}