Back to index

nux  3.0.0
Public Member Functions | Static Protected Member Functions | Private Member Functions | Static Private Member Functions | Private Attributes | Static Private Attributes
nux::IBusIMEContext Class Reference

#include <InputMethodIBus.h>

Inheritance diagram for nux::IBusIMEContext:
Inheritance graph
[legend]
Collaboration diagram for nux::IBusIMEContext:
Collaboration graph
[legend]

List of all members.

Public Member Functions

 IBusIMEContext (TextEntry *text_entry)
virtual ~IBusIMEContext ()
virtual void Focus ()
virtual void Blur ()
virtual void Reset ()
virtual bool FilterKeyEvent (const KeyEvent &event)
virtual void SetSurrounding (const std::wstring &text, int cursor_pos)
bool IsConnected () const
bool IsHotkeyEvent (EventType type, unsigned long keysym, unsigned long modifiers) const

Static Protected Member Functions

static std::vector< EventParseIBusHotkeys (const gchar **keybindings)

Private Member Functions

void CreateContext ()
void DestroyContext ()
void UpdateCursorLocation ()
void OnConnected (IBusBus *bus)
void OnDisconnected (IBusBus *bus)
void OnConfigChanged (IBusConfig *config, gchar *section, gchar *name, GVariant *value)
void OnCommitText (IBusInputContext *context, IBusText *text)
void OnUpdatePreeditText (IBusInputContext *context, IBusText *text, guint cursor_pos, gboolean visible)
void OnShowPreeditText (IBusInputContext *context)
void OnHidePreeditText (IBusInputContext *context)
void OnEnable (IBusInputContext *context)
void OnDisable (IBusInputContext *context)
void OnDestroy (IBusInputContext *context)
 IBusIMEContext (const IBusIMEContext &)
void operator= (const IBusIMEContext &)

Static Private Member Functions

static void UpdateHotkeys ()
static void OnConnected_ (IBusBus *bus, void *data)
static void OnDisconnected_ (IBusBus *bus, void *data)
static void OnConfigChanged_ (IBusConfig *config, gchar *section, gchar *name, GVariant *value, gpointer data)
static void OnCommitText_ (IBusInputContext *context, IBusText *text, void *data)
static void OnUpdatePreeditText_ (IBusInputContext *context, IBusText *text, guint cursor_pos, gboolean visible, void *data)
static void OnShowPreeditText_ (IBusInputContext *context, void *data)
static void OnHidePreeditText_ (IBusInputContext *context, void *data)
static void OnEnable_ (IBusInputContext *context, void *data)
static void OnDisable_ (IBusInputContext *context, void *data)
static void OnDestroy_ (IBusInputContext *context, void *data)
static void ProcessKeyEventDone (IBusInputContext *context, GAsyncResult *res, ProcessKeyEventData *data)

Private Attributes

TextEntrytext_entry_
IBusInputContext * context_
bool is_focused_

Static Private Attributes

static IBusBus * bus_ = NULL
static std::vector< Eventhotkeys_

Detailed Description

Definition at line 91 of file InputMethodIBus.h.


Constructor & Destructor Documentation

nux::IBusIMEContext::IBusIMEContext ( TextEntry text_entry) [explicit]

Definition at line 35 of file InputMethodIBus.cpp.

    : text_entry_(text_entry),
      context_(NULL),
      is_focused_(false)
  {
    // init ibus
    if (!bus_)
    {
      ibus_init();
      bus_ = ibus_bus_new();
    }

    // connect bus signals
    g_signal_connect(bus_, "connected",    G_CALLBACK(OnConnected_),     this);
    g_signal_connect(bus_, "disconnected", G_CALLBACK(OnDisconnected_),  this);

    if (ibus_bus_is_connected(bus_))
    {
      CreateContext();
    }
    else
    {
      nuxDebugMsg("[IBusIMEContext::IBusIMEContext] Can not connect to ibus");
    }
  }

Here is the call graph for this function:

Definition at line 61 of file InputMethodIBus.cpp.

  {
    // disconnect bus signals
    g_signal_handlers_disconnect_by_func(bus_, reinterpret_cast<gpointer>(OnConnected_),    this);
    g_signal_handlers_disconnect_by_func(bus_, reinterpret_cast<gpointer>(OnDisconnected_), this);

    DestroyContext();
  }

Here is the call graph for this function:


Member Function Documentation

void nux::IBusIMEContext::Blur ( ) [virtual]

Definition at line 80 of file InputMethodIBus.cpp.

  {
    if (!is_focused_)
      return;

    is_focused_ = false;

    if (context_)
      ibus_input_context_focus_out(context_);
  }

Definition at line 136 of file InputMethodIBus.cpp.

                                     {
    nuxAssert(bus_ != NULL);
    nuxAssert(ibus_bus_is_connected(bus_));

    if (!(context_ = ibus_bus_create_input_context(bus_, "nux")))
    {
      nuxDebugMsg("[IBusIMEContext::IBusIMEContext] Cannot create InputContext");
      return;
    }

    text_entry_->ime_active_ = false;

    // connect input context signals
    g_signal_connect(context_, "commit-text",         G_CALLBACK(OnCommitText_),        this);
    g_signal_connect(context_, "update-preedit-text", G_CALLBACK(OnUpdatePreeditText_), this);
    g_signal_connect(context_, "show-preedit-text",   G_CALLBACK(OnShowPreeditText_),   this);
    g_signal_connect(context_, "hide-preedit-text",   G_CALLBACK(OnHidePreeditText_),   this);
    g_signal_connect(context_, "enabled",             G_CALLBACK(OnEnable_),            this);
    g_signal_connect(context_, "disabled",            G_CALLBACK(OnDisable_),           this);
    g_signal_connect(context_, "destroy",             G_CALLBACK(OnDestroy_),           this);

    guint32 caps = IBUS_CAP_PREEDIT_TEXT |
      IBUS_CAP_FOCUS |
      IBUS_CAP_SURROUNDING_TEXT;
    ibus_input_context_set_capabilities(context_, caps);

    if (is_focused_)
      ibus_input_context_focus_in(context_);

    UpdateCursorLocation();

    IBusConfig* bus_conf = ibus_bus_get_config(bus_);
    g_signal_handlers_disconnect_by_func(bus_conf, reinterpret_cast<gpointer>(OnConfigChanged_), this);
    g_signal_connect(bus_conf, "value-changed", G_CALLBACK(OnConfigChanged_), this);
    UpdateHotkeys();
  }

Here is the call graph for this function:

Here is the caller graph for this function:

Definition at line 173 of file InputMethodIBus.cpp.

  {
    //nuxDebugMsg("***IBusIMEContext::DestroyContext***");

    if (ibus_bus_is_connected(bus_))
    {
      IBusConfig* bus_conf = ibus_bus_get_config(bus_);
      g_signal_handlers_disconnect_by_func(bus_conf, reinterpret_cast<gpointer>(OnConfigChanged_), this);
    }

    if (!context_)
      return;

    text_entry_->ResetPreedit();
    ibus_proxy_destroy(reinterpret_cast<IBusProxy *>(context_));

    nuxAssert(!context_);
  }

Here is the call graph for this function:

Here is the caller graph for this function:

bool nux::IBusIMEContext::FilterKeyEvent ( const KeyEvent event) [virtual]

Definition at line 97 of file InputMethodIBus.cpp.

  {
    guint keyval = event.key_sym(); // todo(jaytaoko): ui::GdkKeyCodeForWindowsKeyCode(event.key_code(), event.IsShiftDown() ^ event.IsCapsLockDown());

    if (context_) {
      guint modifiers = 0;

      if (event.flags() & IBUS_IGNORED_MASK)
        return false;

      if (event.type() == EVENT_KEY_UP)
        modifiers |= IBUS_RELEASE_MASK;

      if (event.IsShiftDown())
        modifiers |= IBUS_SHIFT_MASK;
      if (event.IsControlDown())
        modifiers |= IBUS_CONTROL_MASK;
      if (event.IsAltDown())
        modifiers |= IBUS_MOD1_MASK;
      if (event.IsCapsLockDown())
        modifiers |= IBUS_LOCK_MASK;

      ibus_input_context_process_key_event_async(context_,
        keyval, event.key_code() - 8, modifiers,
        -1,
        NULL,
        reinterpret_cast<GAsyncReadyCallback>(ProcessKeyEventDone),
        new ProcessKeyEventData(this, event));

      return true;
    }
    return false;
  }

Here is the call graph for this function:

void nux::IBusIMEContext::Focus ( ) [virtual]

Definition at line 70 of file InputMethodIBus.cpp.

  {
    if (is_focused_)
      return;
    is_focused_ = true;

    if (context_)
      ibus_input_context_focus_in(context_);
  }

Definition at line 192 of file InputMethodIBus.cpp.

  {
    return context_;
  }
bool nux::IBusIMEContext::IsHotkeyEvent ( EventType  type,
unsigned long  keysym,
unsigned long  modifiers 
) const

Definition at line 503 of file InputMethodIBus.cpp.

  {
    for (Event const& ev : hotkeys_)
    {
      if (ev.x11_keysym == keysym && (ev.type == type || type == EVENT_KEY_DOWN))
      {
        if (ev.type == EVENT_KEY_UP)
          return (modifiers & ev.key_modifiers);
        else
          return (ev.key_modifiers == modifiers);
      }
    }

    return false;
  }
void nux::IBusIMEContext::OnCommitText ( IBusInputContext *  context,
IBusText *  text 
) [private]

Definition at line 243 of file InputMethodIBus.cpp.

  {
    //nuxDebugMsg("***IBusIMEContext::OnCommitText::%s***", text->text);
    nuxAssert(context_ == context);

    text_entry_->DeleteSelection();

    if (text->text)
    {
      int cursor = text_entry_->cursor_;
      std::string new_text(text_entry_->GetText());
      std::string commit_text (text->text);
      new_text.insert (cursor, commit_text);

      text_entry_->SetText(new_text.c_str());
      text_entry_->SetCursor(cursor + commit_text.length());
      UpdateCursorLocation();
    }
  }

Here is the call graph for this function:

Here is the caller graph for this function:

static void nux::IBusIMEContext::OnCommitText_ ( IBusInputContext *  context,
IBusText *  text,
void *  data 
) [inline, static, private]

Definition at line 131 of file InputMethodIBus.h.

{static_cast<IBusIMEContext*>(data)->OnCommitText(context, text);}

Here is the call graph for this function:

Here is the caller graph for this function:

void nux::IBusIMEContext::OnConfigChanged ( IBusConfig *  config,
gchar *  section,
gchar *  name,
GVariant *  value 
) [private]

Definition at line 234 of file InputMethodIBus.cpp.

  {
    if (g_strcmp0(section, "general/hotkey") == 0)
    {
      if (g_strcmp0(name, "trigger") == 0)
        UpdateHotkeys();
    }
  }

Here is the call graph for this function:

Here is the caller graph for this function:

static void nux::IBusIMEContext::OnConfigChanged_ ( IBusConfig *  config,
gchar *  section,
gchar *  name,
GVariant *  value,
gpointer  data 
) [inline, static, private]

Definition at line 126 of file InputMethodIBus.h.

{static_cast<IBusIMEContext*>(data)->OnConfigChanged(config, section, name, value);}

Here is the call graph for this function:

Here is the caller graph for this function:

void nux::IBusIMEContext::OnConnected ( IBusBus *  bus) [private]

Definition at line 215 of file InputMethodIBus.cpp.

  {
    //nuxDebugMsg("***IBusIMEContext::OnConnected***");
    nuxAssert(bus_ == bus);
    if (ibus_bus_is_connected(bus_))
    {
      DestroyContext();
      CreateContext();
    }
  }

Here is the call graph for this function:

Here is the caller graph for this function:

static void nux::IBusIMEContext::OnConnected_ ( IBusBus *  bus,
void *  data 
) [inline, static, private]

Definition at line 119 of file InputMethodIBus.h.

{nuxDebugMsg("***IBusIMEContext::OnConnected***"); static_cast<IBusIMEContext*>(data)->OnConnected(bus);}

Here is the call graph for this function:

Here is the caller graph for this function:

void nux::IBusIMEContext::OnDestroy ( IBusInputContext *  context) [private]

Definition at line 364 of file InputMethodIBus.cpp.

  {
    //nuxDebugMsg("***IBusIMEContext::OnDestroy***");
    nuxAssert(context_ == context);

    g_object_unref(context_);
    context_ = NULL;
  }

Here is the caller graph for this function:

static void nux::IBusIMEContext::OnDestroy_ ( IBusInputContext *  context,
void *  data 
) [inline, static, private]

Definition at line 155 of file InputMethodIBus.h.

{static_cast<IBusIMEContext*>(data)->OnDestroy(context);}

Here is the call graph for this function:

Here is the caller graph for this function:

void nux::IBusIMEContext::OnDisable ( IBusInputContext *  context) [private]

Definition at line 355 of file InputMethodIBus.cpp.

  {
    //nuxDebugMsg("***IBusIMEContext::OnDisable***");
    nuxAssert(context_ == context);
    text_entry_->ime_active_ = false;
    text_entry_->ResetPreedit();
    text_entry_->QueueRefresh (true, true);
  }

Here is the call graph for this function:

Here is the caller graph for this function:

static void nux::IBusIMEContext::OnDisable_ ( IBusInputContext *  context,
void *  data 
) [inline, static, private]

Definition at line 151 of file InputMethodIBus.h.

{static_cast<IBusIMEContext*>(data)->OnDisable(context);}

Here is the call graph for this function:

Here is the caller graph for this function:

void nux::IBusIMEContext::OnDisconnected ( IBusBus *  bus) [private]

Definition at line 226 of file InputMethodIBus.cpp.

  {
    //nuxDebugMsg("***IBusIMEContext::OnDisonnected***");
    hotkeys_.clear();

    DestroyContext();
  }

Here is the call graph for this function:

Here is the caller graph for this function:

static void nux::IBusIMEContext::OnDisconnected_ ( IBusBus *  bus,
void *  data 
) [inline, static, private]

Definition at line 123 of file InputMethodIBus.h.

{static_cast<IBusIMEContext*>(data)->OnDisconnected(bus);}

Here is the call graph for this function:

Here is the caller graph for this function:

void nux::IBusIMEContext::OnEnable ( IBusInputContext *  context) [private]

Definition at line 345 of file InputMethodIBus.cpp.

  {
    //nuxDebugMsg("***IBusIMEContext::OnEnable***");
    nuxAssert(context_ == context);

    text_entry_->ime_active_ = true;
    text_entry_->text_changed.emit(text_entry_);
    UpdateCursorLocation();
  }

Here is the call graph for this function:

Here is the caller graph for this function:

static void nux::IBusIMEContext::OnEnable_ ( IBusInputContext *  context,
void *  data 
) [inline, static, private]

Definition at line 147 of file InputMethodIBus.h.

{static_cast<IBusIMEContext*>(data)->OnEnable(context);}

Here is the call graph for this function:

Here is the caller graph for this function:

void nux::IBusIMEContext::OnHidePreeditText ( IBusInputContext *  context) [private]

Definition at line 336 of file InputMethodIBus.cpp.

  {
    //nuxDebugMsg("***IBusIMEContext::OnHidePreeditText***");
    nuxAssert(context_ == context);

    text_entry_->ResetPreedit();
    text_entry_->QueueRefresh (true, true);
  }

Here is the call graph for this function:

Here is the caller graph for this function:

static void nux::IBusIMEContext::OnHidePreeditText_ ( IBusInputContext *  context,
void *  data 
) [inline, static, private]

Definition at line 143 of file InputMethodIBus.h.

{static_cast<IBusIMEContext*>(data)->OnHidePreeditText(context);}

Here is the call graph for this function:

Here is the caller graph for this function:

void nux::IBusIMEContext::OnShowPreeditText ( IBusInputContext *  context) [private]

Definition at line 330 of file InputMethodIBus.cpp.

  {
    //nuxDebugMsg("***IBusIMEContext::OnShowPreeditText***");
    nuxAssert(context_ == context);
  }

Here is the caller graph for this function:

static void nux::IBusIMEContext::OnShowPreeditText_ ( IBusInputContext *  context,
void *  data 
) [inline, static, private]

Definition at line 139 of file InputMethodIBus.h.

{static_cast<IBusIMEContext*>(data)->OnShowPreeditText(context);}

Here is the call graph for this function:

Here is the caller graph for this function:

void nux::IBusIMEContext::OnUpdatePreeditText ( IBusInputContext *  context,
IBusText *  text,
guint  cursor_pos,
gboolean  visible 
) [private]

Definition at line 263 of file InputMethodIBus.cpp.

  {
    //nuxDebugMsg("***IBusIMEContext::OnUpdatePreeditText***");
    nuxAssert(context_ == context);
    nuxAssert(IBUS_IS_TEXT(text));

    if (text_entry_->preedit_.empty())
      UpdateCursorLocation();

    if (visible)
    {
      IBusAttrList* attrs = text->attrs;
      if (attrs)
      {
        PangoAttrList* preedit_attrs = pango_attr_list_new();
        int i = 0;
        while (1)
        {
          IBusAttribute* attr = ibus_attr_list_get(attrs, i++);
          PangoAttribute* pango_attr;
          if (!attr)
            break;
          switch (attr->type)
          {
             case IBUS_ATTR_TYPE_UNDERLINE:
              pango_attr = pango_attr_underline_new ((PangoUnderline)attr->value);
              break;
            case IBUS_ATTR_TYPE_FOREGROUND:
              pango_attr = pango_attr_foreground_new (
                            ((attr->value & 0xff0000) >> 8) | 0xff,
                            ((attr->value & 0x00ff00)) | 0xff,
                            ((attr->value & 0x0000ff) << 8) | 0xff);
              break;
            case IBUS_ATTR_TYPE_BACKGROUND:
              pango_attr = pango_attr_background_new (
                            ((attr->value & 0xff0000) >> 8) | 0xff,
                            ((attr->value & 0x00ff00)) | 0xff,
                            ((attr->value & 0x0000ff) << 8) | 0xff);
              break;
            default:
              continue;
          }
          pango_attr->start_index = g_utf8_offset_to_pointer (text->text, attr->start_index) - text->text;
          pango_attr->end_index = g_utf8_offset_to_pointer (text->text, attr->end_index) - text->text;
          pango_attr_list_insert (preedit_attrs, pango_attr);
        }
        if (text_entry_->preedit_attrs_)
        {
          pango_attr_list_unref(text_entry_->preedit_attrs_);
          text_entry_->preedit_attrs_ = NULL;
        }
        text_entry_->preedit_attrs_ = preedit_attrs;
      }
      if (text->text)
      {
        std::string preedit(text->text);
        text_entry_->preedit_ = preedit;
        text_entry_->preedit_cursor_ = preedit.length();
        text_entry_->QueueRefresh (true, true);
      }
    }
    else
    {
      OnHidePreeditText(context_);
    }
  }

Here is the call graph for this function:

Here is the caller graph for this function:

static void nux::IBusIMEContext::OnUpdatePreeditText_ ( IBusInputContext *  context,
IBusText *  text,
guint  cursor_pos,
gboolean  visible,
void *  data 
) [inline, static, private]

Definition at line 135 of file InputMethodIBus.h.

{reinterpret_cast<IBusIMEContext*>(data)->OnUpdatePreeditText(context, text, cursor_pos, visible);}

Here is the call graph for this function:

Here is the caller graph for this function:

void nux::IBusIMEContext::operator= ( const IBusIMEContext ) [private]
std::vector< Event > nux::IBusIMEContext::ParseIBusHotkeys ( const gchar **  keybindings) [static, protected]

Reimplemented in MockIBusIMEContext.

Definition at line 401 of file InputMethodIBus.cpp.

  {
    std::vector<Event> hotkeys;

    for (int i = 0; keybindings && keybindings[i]; ++i)
    {
      gchar** binding = g_strsplit (keybindings[i], "+", -1);

      if (binding)
      {
        Event ev;
        ev.type = EVENT_KEY_DOWN;

        for (int j = 0; binding && binding[j]; ++j)
        {
          if (strcmp(binding[j], "Release") == 0)
          {
            ev.type = EVENT_KEY_UP;
            continue;
          }

          KeySym key = XStringToKeysym(binding[j]);
          bool is_modifier = false;

          if (key)
          {
            switch (key)
            {
              case XK_Caps_Lock:
              case XK_Shift_Lock:
              case XK_Num_Lock:
              case XK_Scroll_Lock:
                is_modifier = true;
            }
          }
          else
          {
            // Checking if the current key is a generic modifier key
            key = XStringToKeysym((std::string(binding[j]) + "_L").c_str());
            is_modifier = (key != 0);
          }

          if (is_modifier)
          {
            switch (key)
            {
              case XK_Control_L:
              case XK_Control_R:
                ev.key_modifiers |= KEY_MODIFIER_CTRL;
                break;
              case XK_Shift_L:
              case XK_Shift_R:
              case XK_Shift_Lock:
                ev.key_modifiers |= KEY_MODIFIER_SHIFT;
                break;
              case XK_Alt_L:
              case XK_Alt_R:
                ev.key_modifiers |= KEY_MODIFIER_ALT;
                break;
              case XK_Super_L:
              case XK_Super_R:
                ev.key_modifiers |= KEY_MODIFIER_SUPER;
              case XK_Caps_Lock:
                ev.key_modifiers |= KEY_MODIFIER_CAPS_LOCK;
                break;
              case XK_Num_Lock:
                ev.key_modifiers |= KEY_MODIFIER_NUMLOCK;
                break;
              case XK_Scroll_Lock:
                ev.key_modifiers |= KEY_MODIFIER_SCROLLLOCK;
                break;
              // FIXME add support to Hyper and Meta keys in nux::Event
            }
          }

          if (!is_modifier && key)
            ev.x11_keysym = key;
        }

        if (ev.x11_keysym)
        {
          hotkeys.push_back(ev);
        }

        g_strfreev(binding);
      }
    }

    return hotkeys;
  }

Here is the caller graph for this function:

void nux::IBusIMEContext::ProcessKeyEventDone ( IBusInputContext *  context,
GAsyncResult *  res,
ProcessKeyEventData data 
) [static, private]

Definition at line 373 of file InputMethodIBus.cpp.

  {
    //nuxDebugMsg("***IBusIMEContext::ProcessKeyEventDone***");
      std::unique_ptr<ProcessKeyEventData> key_ev(data);
      nuxAssert(key_ev->context->context_ == context);

      GError *error = NULL;
      gboolean processed = ibus_input_context_process_key_event_async_finish (
                            context,
                            res,
                            &error);

      if (error)
      {
        g_warning ("Process Key Event failed: %s.", error->message);
        g_error_free (error);
      }

      if (!processed)
      {
        key_ev->context->text_entry_->ProcessKeyEvent(key_ev->event.type(),
                                                      key_ev->event.key_sym(),
                                                      key_ev->event.flags() | IBUS_IGNORED_MASK,
                                                      key_ev->event.character().c_str(),
                                                      0);
      }
  }

Here is the caller graph for this function:

void nux::IBusIMEContext::Reset ( ) [virtual]

Definition at line 91 of file InputMethodIBus.cpp.

  {
    if (context_)
      ibus_input_context_reset(context_);
  }
void nux::IBusIMEContext::SetSurrounding ( const std::wstring &  text,
int  cursor_pos 
) [virtual]

Definition at line 131 of file InputMethodIBus.cpp.

  {
      // TODO(penghuang) support surrounding
  }

Definition at line 197 of file InputMethodIBus.cpp.

  {
    nux::Rect strong, weak;
    text_entry_->GetCursorRects(&strong, &weak);

    // Get the position of the TextEntry in the Window.
    nux::Geometry geo = text_entry_->GetAbsoluteGeometry();

    // Get the Geometry of the window on the display.
    nux::Geometry window_geo = nux::GetGraphicsDisplay()->GetWindowGeometry();

    ibus_input_context_set_cursor_location(context_,
      geo.x + window_geo.x + strong.x,
      geo.y + window_geo.y,
      0,
      geo.height);
  }

Here is the call graph for this function:

Here is the caller graph for this function:

void nux::IBusIMEContext::UpdateHotkeys ( ) [static, private]

Definition at line 492 of file InputMethodIBus.cpp.

  {
    IBusConfig* conf = ibus_bus_get_config(bus_);
    GVariant* val = ibus_config_get_value(conf, "general", "hotkey/trigger");
    const gchar** keybindings = g_variant_get_strv(val, NULL);

    hotkeys_ = ParseIBusHotkeys(keybindings);

    g_variant_unref(val);
  }

Here is the call graph for this function:

Here is the caller graph for this function:


Member Data Documentation

IBusBus * nux::IBusIMEContext::bus_ = NULL [static, private]

Definition at line 166 of file InputMethodIBus.h.

IBusInputContext* nux::IBusIMEContext::context_ [private]

Definition at line 163 of file InputMethodIBus.h.

std::vector< Event > nux::IBusIMEContext::hotkeys_ [static, private]

Definition at line 167 of file InputMethodIBus.h.

Definition at line 164 of file InputMethodIBus.h.

Definition at line 162 of file InputMethodIBus.h.


The documentation for this class was generated from the following files: