Blob Blame History Raw
/* panelbinding.c generated by valac 0.40.8, the Vala compiler
 * generated from panelbinding.vala, do not modify */

/* vim:set et sts=4 sw=4:
 *
 * ibus - The Input Bus
 *
 * Copyright(c) 2018 Peng Huang <shawn.p.huang@gmail.com>
 * Copyright(c) 2018 Takao Fujwiara <takao.fujiwara1@gmail.com>
 *
 * This library is free software; you can redistribute it and/or
 * modify it under the terms of the GNU Lesser General Public
 * License as published by the Free Software Foundation; either
 * version 2.1 of the License, or (at your option) any later version.
 *
 * This library is distributed in the hope that it will be useful,
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
 * Lesser General Public License for more details.
 *
 * You should have received a copy of the GNU Lesser General Public
 * License along with this library; if not, write to the Free Software
 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301
 * USA
 */


#include <glib.h>
#include <glib-object.h>
#include <gtk/gtk.h>
#include <ibus.h>
#include <stdlib.h>
#include <string.h>
#include <gio/gio.h>
#include <gdk/gdk.h>
#include <gdk/gdkwayland.h>


#define TYPE_PREEDIT (preedit_get_type ())
#define PREEDIT(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), TYPE_PREEDIT, Preedit))
#define PREEDIT_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST ((klass), TYPE_PREEDIT, PreeditClass))
#define IS_PREEDIT(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), TYPE_PREEDIT))
#define IS_PREEDIT_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE ((klass), TYPE_PREEDIT))
#define PREEDIT_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS ((obj), TYPE_PREEDIT, PreeditClass))

typedef struct _Preedit Preedit;
typedef struct _PreeditClass PreeditClass;
typedef struct _PreeditPrivate PreeditPrivate;
enum  {
	PREEDIT_0_PROPERTY,
	PREEDIT_NUM_PROPERTIES
};
static GParamSpec* preedit_properties[PREEDIT_NUM_PROPERTIES];
#define _g_object_unref0(var) ((var == NULL) ? NULL : (var = (g_object_unref (var), NULL)))
#define _g_free0(var) (var = (g_free (var), NULL))

#define TYPE_PANEL_BINDING (panel_binding_get_type ())
#define PANEL_BINDING(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), TYPE_PANEL_BINDING, PanelBinding))
#define PANEL_BINDING_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST ((klass), TYPE_PANEL_BINDING, PanelBindingClass))
#define IS_PANEL_BINDING(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), TYPE_PANEL_BINDING))
#define IS_PANEL_BINDING_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE ((klass), TYPE_PANEL_BINDING))
#define PANEL_BINDING_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS ((obj), TYPE_PANEL_BINDING, PanelBindingClass))

typedef struct _PanelBinding PanelBinding;
typedef struct _PanelBindingClass PanelBindingClass;
typedef struct _PanelBindingPrivate PanelBindingPrivate;

#define TYPE_IBUS_EMOJIER (ibus_emojier_get_type ())
#define IBUS_EMOJIER(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), TYPE_IBUS_EMOJIER, IBusEmojier))
#define IBUS_EMOJIER_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST ((klass), TYPE_IBUS_EMOJIER, IBusEmojierClass))
#define IS_IBUS_EMOJIER(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), TYPE_IBUS_EMOJIER))
#define IS_IBUS_EMOJIER_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE ((klass), TYPE_IBUS_EMOJIER))
#define IBUS_EMOJIER_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS ((obj), TYPE_IBUS_EMOJIER, IBusEmojierClass))

typedef struct _IBusEmojier IBusEmojier;
typedef struct _IBusEmojierClass IBusEmojierClass;
enum  {
	PANEL_BINDING_0_PROPERTY,
	PANEL_BINDING_NUM_PROPERTIES
};
static GParamSpec* panel_binding_properties[PANEL_BINDING_NUM_PROPERTIES];
#define _g_main_context_unref0(var) ((var == NULL) ? NULL : (var = (g_main_context_unref (var), NULL)))
#define _vala_assert(expr, msg) if G_LIKELY (expr) ; else g_assertion_message_expr (G_LOG_DOMAIN, __FILE__, __LINE__, G_STRFUNC, msg);
#define _vala_return_if_fail(expr, msg) if G_LIKELY (expr) ; else { g_return_if_fail_warning (G_LOG_DOMAIN, G_STRFUNC, msg); return; }
#define _vala_return_val_if_fail(expr, msg, val) if G_LIKELY (expr) ; else { g_return_if_fail_warning (G_LOG_DOMAIN, G_STRFUNC, msg); return val; }
#define _vala_warn_if_fail(expr, msg) if G_LIKELY (expr) ; else g_warn_message (G_LOG_DOMAIN, __FILE__, __LINE__, G_STRFUNC, msg);

struct _Preedit {
	GtkWindow parent_instance;
	PreeditPrivate * priv;
};

struct _PreeditClass {
	GtkWindowClass parent_class;
};

struct _PreeditPrivate {
	GtkLabel* m_extension_preedit_text;
	GtkLabel* m_extension_preedit_emoji;
	IBusText* m_engine_preedit_text;
	gboolean m_engine_preedit_text_show;
	guint m_engine_preedit_cursor_pos;
	gchar* m_prefix;
	gboolean m_is_shown;
};

struct _PanelBinding {
	IBusPanelService parent_instance;
	PanelBindingPrivate * priv;
};

struct _PanelBindingClass {
	IBusPanelServiceClass parent_class;
};

struct _PanelBindingPrivate {
	gboolean m_is_wayland;
	gboolean m_wayland_lookup_table_is_visible;
	IBusBus* m_bus;
	GtkApplication* m_application;
	GSettings* m_settings_panel;
	GSettings* m_settings_emoji;
	gchar* m_current_context_path;
	gchar* m_real_current_context_path;
	IBusEmojier* m_emojier;
	guint m_emojier_set_emoji_lang_id;
	guint m_emojier_focus_commit_text_id;
	gchar** m_emojier_favorites;
	gint m_emojier_favorites_length1;
	gint _m_emojier_favorites_size_;
	GtkCssProvider* m_css_provider;
	gboolean m_load_emoji_at_startup;
	gboolean m_loaded_emoji;
	gboolean m_load_unicode_at_startup;
	gboolean m_loaded_unicode;
	gboolean m_enable_extension;
	gchar* m_extension_name;
	Preedit* m_preedit;
	IBusProcessKeyEventData m_key_event_data;
};


static gpointer preedit_parent_class = NULL;
static gpointer panel_binding_parent_class = NULL;

GType preedit_get_type (void) G_GNUC_CONST;
#define PREEDIT_GET_PRIVATE(o) (G_TYPE_INSTANCE_GET_PRIVATE ((o), TYPE_PREEDIT, PreeditPrivate))
Preedit* preedit_new (void);
Preedit* preedit_construct (GType object_type);
void preedit_hide (Preedit* self);
void preedit_reset (Preedit* self);
gboolean preedit_is_shown (Preedit* self);
void preedit_set_emoji (Preedit* self,
                        const gchar* text);
void preedit_set_text (Preedit* self,
                       const gchar* text);
void preedit_append_text (Preedit* self,
                          const gchar* text);
gchar* preedit_get_text (Preedit* self);
gchar* preedit_get_emoji (Preedit* self);
gboolean preedit_backspace (Preedit* self);
static gchar* preedit_get_extension_text (Preedit* self);
static void preedit_set_preedit_color (Preedit* self,
                                IBusText* text,
                                guint start_index,
                                guint end_index);
IBusText* preedit_get_engine_preedit_text (Preedit* self);
void preedit_set_engine_preedit_text (Preedit* self,
                                      IBusText* text);
void preedit_show_engine_preedit_text (Preedit* self);
void preedit_hide_engine_preedit_text (Preedit* self);
guint preedit_get_engine_preedit_cursor_pos (Preedit* self);
void preedit_set_engine_preedit_cursor_pos (Preedit* self,
                                            guint cursor_pos);
IBusText* preedit_get_commit_text (Preedit* self);
void preedit_set_extension_name (Preedit* self,
                                 const gchar* extension_name);
static void preedit_finalize (GObject * obj);
GType panel_binding_get_type (void) G_GNUC_CONST;
GType ibus_emojier_get_type (void) G_GNUC_CONST;
#define PANEL_BINDING_GET_PRIVATE(o) (G_TYPE_INSTANCE_GET_PRIVATE ((o), TYPE_PANEL_BINDING, PanelBindingPrivate))
#define PANEL_BINDING_PRELOAD_ENGINES_DELAY_TIME ((guint) 30000)
PanelBinding* panel_binding_new (IBusBus* bus,
                                 GtkApplication* application);
PanelBinding* panel_binding_construct (GType object_type,
                                       IBusBus* bus,
                                       GtkApplication* application);
static void panel_binding_init_settings (PanelBinding* self);
static void __lambda28_ (PanelBinding* self,
                  const gchar* key);
void binding_common_set_custom_font (GSettings* settings_panel,
                                     GSettings* settings_emoji,
                                     GtkCssProvider* * css_provider);
static void ___lambda28__g_settings_changed (GSettings* _sender,
                                      const gchar* key,
                                      gpointer self);
static void __lambda29_ (PanelBinding* self,
                  const gchar* key);
static void ___lambda29__g_settings_changed (GSettings* _sender,
                                      const gchar* key,
                                      gpointer self);
static void __lambda30_ (PanelBinding* self,
                  const gchar* key);
static void panel_binding_set_emoji_hotkey (PanelBinding* self);
static void ___lambda30__g_settings_changed (GSettings* _sender,
                                      const gchar* key,
                                      gpointer self);
static void __lambda31_ (PanelBinding* self,
                  const gchar* key);
static void ___lambda31__g_settings_changed (GSettings* _sender,
                                      const gchar* key,
                                      gpointer self);
static void __lambda32_ (PanelBinding* self,
                  const gchar* key);
static void ___lambda32__g_settings_changed (GSettings* _sender,
                                      const gchar* key,
                                      gpointer self);
static void __lambda33_ (PanelBinding* self,
                  const gchar* key);
static void panel_binding_set_emoji_favorites (PanelBinding* self);
static void ___lambda33__g_settings_changed (GSettings* _sender,
                                      const gchar* key,
                                      gpointer self);
static void __lambda34_ (PanelBinding* self,
                  const gchar* key);
static void ___lambda34__g_settings_changed (GSettings* _sender,
                                      const gchar* key,
                                      gpointer self);
static void __lambda35_ (PanelBinding* self,
                  const gchar* key);
static void panel_binding_set_emoji_lang (PanelBinding* self);
static void ___lambda35__g_settings_changed (GSettings* _sender,
                                      const gchar* key,
                                      gpointer self);
static void __lambda37_ (PanelBinding* self,
                  const gchar* key);
static void panel_binding_set_emoji_partial_match (PanelBinding* self);
static void ___lambda37__g_settings_changed (GSettings* _sender,
                                      const gchar* key,
                                      gpointer self);
static void __lambda38_ (PanelBinding* self,
                  const gchar* key);
static void ___lambda38__g_settings_changed (GSettings* _sender,
                                      const gchar* key,
                                      gpointer self);
static void __lambda39_ (PanelBinding* self,
                  const gchar* key);
static void ___lambda39__g_settings_changed (GSettings* _sender,
                                      const gchar* key,
                                      gpointer self);
static void __lambda40_ (PanelBinding* self,
                  const gchar* key);
static void panel_binding_set_load_emoji_at_startup (PanelBinding* self);
static void ___lambda40__g_settings_changed (GSettings* _sender,
                                      const gchar* key,
                                      gpointer self);
static void __lambda41_ (PanelBinding* self,
                  const gchar* key);
static void panel_binding_set_load_unicode_at_startup (PanelBinding* self);
static void ___lambda41__g_settings_changed (GSettings* _sender,
                                      const gchar* key,
                                      gpointer self);
static void panel_binding_parse_accelerator (PanelBinding* self,
                                      const gchar* accelerator);
static void _vala_array_add8 (IBusProcessKeyEventData* * array,
                       int* length,
                       int* size,
                       const IBusProcessKeyEventData* value);
static void _vala_array_add9 (IBusProcessKeyEventData* * array,
                       int* length,
                       int* size,
                       const IBusProcessKeyEventData* value);
static void _vala_array_add10 (IBusProcessKeyEventData* * array,
                        int* length,
                        int* size,
                        const IBusProcessKeyEventData* value);
static void _vala_array_add11 (IBusProcessKeyEventData* * array,
                        int* length,
                        int* size,
                        const IBusProcessKeyEventData* value);
void ibus_emojier_set_favorites (gchar** unowned_favorites,
                                 int unowned_favorites_length1,
                                 gchar** unowned_favorite_annotations,
                                 int unowned_favorite_annotations_length1);
static gboolean __lambda36_ (PanelBinding* self);
void ibus_emojier_set_annotation_lang (const gchar* lang);
void ibus_emojier_load_unicode_dict (void);
static gboolean ___lambda36__gsource_func (gpointer self);
void ibus_emojier_set_partial_match (gboolean has_partial_match);
void ibus_emojier_set_partial_match_length (gint length);
void ibus_emojier_set_partial_match_condition (gint condition);
void panel_binding_load_settings (PanelBinding* self);
void panel_binding_disconnect_signals (PanelBinding* self);
static void panel_binding_commit_text_update_favorites (PanelBinding* self,
                                                 IBusText* text);
static void _vala_array_add12 (gchar** * array,
                        int* length,
                        int* size,
                        gchar* value);
static gboolean panel_binding_emojier_focus_commit_real (PanelBinding* self);
gchar* ibus_emojier_get_selected_string (IBusEmojier* self);
gchar* ibus_emojier_get_input_context_path (IBusEmojier* self);
void ibus_emojier_reset (IBusEmojier* self);
static void panel_binding_emojier_focus_commit (PanelBinding* self);
static gboolean ___lambda42_ (PanelBinding* self);
static gboolean ____lambda42__gsource_func (gpointer self);
static gboolean panel_binding_key_press_escape (PanelBinding* self);
static gboolean panel_binding_is_emoji_lookup_table (PanelBinding* self);
gboolean ibus_emojier_key_press_escape (IBusEmojier* self);
static void panel_binding_convert_preedit_text (PanelBinding* self);
void ibus_emojier_set_annotation (IBusEmojier* self,
                                  const gchar* annotation);
static void panel_binding_hide_emoji_lookup_table (PanelBinding* self);
static gboolean panel_binding_key_press_enter (PanelBinding* self);
gboolean ibus_emojier_key_press_enter (IBusEmojier* self);
guint ibus_emojier_get_number_of_candidates (IBusEmojier* self);
gchar* ibus_emojier_get_current_candidate (IBusEmojier* self);
static gboolean panel_binding_key_press_space (PanelBinding* self);
gboolean ibus_emojier_key_press_cursor_horizontal (IBusEmojier* self,
                                                   guint keyval,
                                                   guint modifiers);
static gboolean panel_binding_key_press_cursor_horizontal (PanelBinding* self,
                                                    guint keyval,
                                                    guint modifiers);
static gboolean panel_binding_key_press_cursor_vertical (PanelBinding* self,
                                                  guint keyval,
                                                  guint modifiers);
gboolean ibus_emojier_key_press_cursor_vertical (IBusEmojier* self,
                                                 guint keyval,
                                                 guint modifiers);
static gboolean panel_binding_key_press_cursor_home_end (PanelBinding* self,
                                                  guint keyval,
                                                  guint modifiers);
gboolean ibus_emojier_key_press_cursor_home_end (IBusEmojier* self,
                                                 guint keyval,
                                                 guint modifiers);
static gboolean panel_binding_key_press_control_keyval (PanelBinding* self,
                                                 guint keyval,
                                                 guint modifiers);
static void panel_binding_hide_wayland_lookup_table (PanelBinding* self);
static void panel_binding_show_wayland_lookup_table (PanelBinding* self,
                                              IBusText* text);
IBusLookupTable* ibus_emojier_get_one_dimension_lookup_table (IBusEmojier* self);
static gboolean panel_binding_is_visible_wayland_lookup_table (PanelBinding* self);
static void panel_binding_show_emoji_lookup_table (PanelBinding* self);
IBusText* ibus_emojier_get_title_text (IBusEmojier* self);
void ibus_emojier_set_input_context_path (IBusEmojier* self,
                                          const gchar* input_context_path);
static void panel_binding_show_preedit_and_candidate (PanelBinding* self,
                                               gboolean show_candidate);
static void panel_binding_real_focus_in (IBusPanelService* base,
                                  const gchar* input_context_path);
static void panel_binding_real_focus_out (IBusPanelService* base,
                                   const gchar* input_context_path);
static void panel_binding_real_panel_extension_received (IBusPanelService* base,
                                                  IBusExtensionEvent* event);
IBusEmojier* ibus_emojier_new (void);
IBusEmojier* ibus_emojier_construct (GType object_type);
static void ___lambda43_ (PanelBinding* self,
                   guint i,
                   guint b,
                   guint s);
static void ____lambda43__ibus_emojier_candidate_clicked (IBusEmojier* _sender,
                                                   guint index,
                                                   guint button,
                                                   guint state,
                                                   gpointer self);
static void panel_binding_real_set_cursor_location (IBusPanelService* base,
                                             gint x,
                                             gint y,
                                             gint width,
                                             gint height);
void ibus_emojier_set_cursor_location (IBusEmojier* self,
                                       gint x,
                                       gint y,
                                       gint width,
                                       gint height);
static void panel_binding_real_update_preedit_text (IBusPanelService* base,
                                             IBusText* text,
                                             guint cursor_pos,
                                             gboolean visible);
static void panel_binding_real_show_preedit_text (IBusPanelService* base);
static void panel_binding_real_hide_preedit_text (IBusPanelService* base);
static gboolean panel_binding_real_process_key_event (IBusPanelService* base,
                                               guint keyval,
                                               guint keycode,
                                               guint state);
static void panel_binding_real_commit_text_received (IBusPanelService* base,
                                              IBusText* text);
static void panel_binding_real_page_up_lookup_table (IBusPanelService* base);
static void panel_binding_real_page_down_lookup_table (IBusPanelService* base);
static void panel_binding_real_cursor_up_lookup_table (IBusPanelService* base);
static void panel_binding_real_cursor_down_lookup_table (IBusPanelService* base);
static void panel_binding_real_candidate_clicked_lookup_table (IBusPanelService* base,
                                                        guint index,
                                                        guint button,
                                                        guint state);
#define IBUS_EMOJIER_BUTTON_CLOSE_BUTTON ((guint) 1000)
void ibus_emojier_set_cursor_pos (IBusEmojier* self,
                                  guint cursor_pos);
gboolean ibus_emojier_has_variants (IBusEmojier* self,
                                    guint index);
static void panel_binding_finalize (GObject * obj);
static void _vala_array_destroy (gpointer array,
                          gint array_length,
                          GDestroyNotify destroy_func);
static void _vala_array_free (gpointer array,
                       gint array_length,
                       GDestroyNotify destroy_func);
static gint _vala_array_length (gpointer array);


Preedit*
preedit_construct (GType object_type)
{
	Preedit * self = NULL;
	GtkLabel* _tmp0_;
	GtkLabel* _tmp1_;
	self = (Preedit*) g_object_new (object_type, "name", "IBusPreedit", "type", GTK_WINDOW_POPUP, NULL);
	_tmp0_ = (GtkLabel*) gtk_label_new ("");
	g_object_ref_sink (_tmp0_);
	_g_object_unref0 (self->priv->m_extension_preedit_text);
	self->priv->m_extension_preedit_text = _tmp0_;
	_tmp1_ = (GtkLabel*) gtk_label_new ("");
	g_object_ref_sink (_tmp1_);
	_g_object_unref0 (self->priv->m_extension_preedit_emoji);
	self->priv->m_extension_preedit_emoji = _tmp1_;
	return self;
}


Preedit*
preedit_new (void)
{
	return preedit_construct (TYPE_PREEDIT);
}


void
preedit_hide (Preedit* self)
{
	g_return_if_fail (self != NULL);
	preedit_reset (self);
	GTK_WIDGET_CLASS (preedit_parent_class)->hide ((GtkWidget*) G_TYPE_CHECK_INSTANCE_CAST (self, gtk_window_get_type (), GtkWindow));
	self->priv->m_is_shown = FALSE;
}


gboolean
preedit_is_shown (Preedit* self)
{
	gboolean result = FALSE;
	gboolean _tmp0_;
	g_return_val_if_fail (self != NULL, FALSE);
	_tmp0_ = self->priv->m_is_shown;
	result = _tmp0_;
	return result;
}


void
preedit_reset (Preedit* self)
{
	g_return_if_fail (self != NULL);
	preedit_set_emoji (self, "");
	preedit_set_text (self, "");
	gtk_window_resize ((GtkWindow*) self, 1, 1);
	self->priv->m_is_shown = TRUE;
}


void
preedit_append_text (Preedit* self,
                     const gchar* text)
{
	gint _tmp0_;
	gint _tmp1_;
	gchar* total = NULL;
	GtkLabel* _tmp2_;
	const gchar* _tmp3_;
	gchar* _tmp4_;
	const gchar* _tmp5_;
	gchar* _tmp6_;
	GtkLabel* _tmp7_;
	const gchar* _tmp8_;
	g_return_if_fail (self != NULL);
	g_return_if_fail (text != NULL);
	_tmp0_ = strlen (text);
	_tmp1_ = _tmp0_;
	if (_tmp1_ == 0) {
		return;
	}
	_tmp2_ = self->priv->m_extension_preedit_text;
	_tmp3_ = gtk_label_get_text (_tmp2_);
	_tmp4_ = g_strdup (_tmp3_);
	total = _tmp4_;
	_tmp5_ = total;
	_tmp6_ = g_strconcat (_tmp5_, text, NULL);
	_g_free0 (total);
	total = _tmp6_;
	_tmp7_ = self->priv->m_extension_preedit_text;
	_tmp8_ = total;
	gtk_label_set_text (_tmp7_, _tmp8_);
	_g_free0 (total);
}


gchar*
preedit_get_text (Preedit* self)
{
	gchar* result = NULL;
	GtkLabel* _tmp0_;
	const gchar* _tmp1_;
	gchar* _tmp2_;
	g_return_val_if_fail (self != NULL, NULL);
	_tmp0_ = self->priv->m_extension_preedit_text;
	_tmp1_ = gtk_label_get_text (_tmp0_);
	_tmp2_ = g_strdup (_tmp1_);
	result = _tmp2_;
	return result;
}


void
preedit_set_text (Preedit* self,
                  const gchar* text)
{
	GtkLabel* _tmp0_;
	g_return_if_fail (self != NULL);
	g_return_if_fail (text != NULL);
	_tmp0_ = self->priv->m_extension_preedit_text;
	gtk_label_set_text (_tmp0_, text);
}


gchar*
preedit_get_emoji (Preedit* self)
{
	gchar* result = NULL;
	GtkLabel* _tmp0_;
	const gchar* _tmp1_;
	gchar* _tmp2_;
	g_return_val_if_fail (self != NULL, NULL);
	_tmp0_ = self->priv->m_extension_preedit_emoji;
	_tmp1_ = gtk_label_get_text (_tmp0_);
	_tmp2_ = g_strdup (_tmp1_);
	result = _tmp2_;
	return result;
}


void
preedit_set_emoji (Preedit* self,
                   const gchar* text)
{
	GtkLabel* _tmp0_;
	g_return_if_fail (self != NULL);
	g_return_if_fail (text != NULL);
	_tmp0_ = self->priv->m_extension_preedit_emoji;
	gtk_label_set_text (_tmp0_, text);
}


static gchar*
string_slice (const gchar* self,
              glong start,
              glong end)
{
	gchar* result = NULL;
	glong string_length = 0L;
	gint _tmp0_;
	gint _tmp1_;
	gboolean _tmp4_ = FALSE;
	gboolean _tmp6_ = FALSE;
	gchar* _tmp8_;
	g_return_val_if_fail (self != NULL, NULL);
	_tmp0_ = strlen (self);
	_tmp1_ = _tmp0_;
	string_length = (glong) _tmp1_;
	if (start < ((glong) 0)) {
		glong _tmp2_;
		_tmp2_ = string_length;
		start = _tmp2_ + start;
	}
	if (end < ((glong) 0)) {
		glong _tmp3_;
		_tmp3_ = string_length;
		end = _tmp3_ + end;
	}
	if (start >= ((glong) 0)) {
		glong _tmp5_;
		_tmp5_ = string_length;
		_tmp4_ = start <= _tmp5_;
	} else {
		_tmp4_ = FALSE;
	}
	g_return_val_if_fail (_tmp4_, NULL);
	if (end >= ((glong) 0)) {
		glong _tmp7_;
		_tmp7_ = string_length;
		_tmp6_ = end <= _tmp7_;
	} else {
		_tmp6_ = FALSE;
	}
	g_return_val_if_fail (_tmp6_, NULL);
	g_return_val_if_fail (start <= end, NULL);
	_tmp8_ = g_strndup (((gchar*) self) + start, (gsize) (end - start));
	result = _tmp8_;
	return result;
}


static gint
string_index_of_nth_char (const gchar* self,
                          glong c)
{
	gint result = 0;
	gchar* _tmp0_;
	g_return_val_if_fail (self != NULL, 0);
	_tmp0_ = g_utf8_offset_to_pointer (self, c);
	result = (gint) (_tmp0_ - ((gchar*) self));
	return result;
}


gboolean
preedit_backspace (Preedit* self)
{
	gboolean result = FALSE;
	gchar* total = NULL;
	GtkLabel* _tmp0_;
	const gchar* _tmp1_;
	gchar* _tmp2_;
	const gchar* _tmp3_;
	gint _tmp4_;
	gint _tmp5_;
	GtkLabel* _tmp7_;
	const gchar* _tmp8_;
	gchar* _tmp9_;
	gint char_count = 0;
	const gchar* _tmp10_;
	gint _tmp11_;
	const gchar* _tmp12_;
	const gchar* _tmp13_;
	gint _tmp14_;
	gchar* _tmp15_;
	GtkLabel* _tmp16_;
	const gchar* _tmp17_;
	const gchar* _tmp18_;
	gint _tmp19_;
	gint _tmp20_;
	g_return_val_if_fail (self != NULL, FALSE);
	_tmp0_ = self->priv->m_extension_preedit_emoji;
	_tmp1_ = gtk_label_get_text (_tmp0_);
	_tmp2_ = g_strdup (_tmp1_);
	total = _tmp2_;
	_tmp3_ = total;
	_tmp4_ = strlen (_tmp3_);
	_tmp5_ = _tmp4_;
	if (_tmp5_ > 0) {
		GtkLabel* _tmp6_;
		_tmp6_ = self->priv->m_extension_preedit_emoji;
		gtk_label_set_text (_tmp6_, "");
		gtk_window_resize ((GtkWindow*) self, 1, 1);
		result = FALSE;
		_g_free0 (total);
		return result;
	}
	_tmp7_ = self->priv->m_extension_preedit_text;
	_tmp8_ = gtk_label_get_text (_tmp7_);
	_tmp9_ = g_strdup (_tmp8_);
	_g_free0 (total);
	total = _tmp9_;
	_tmp10_ = total;
	char_count = g_utf8_strlen (_tmp10_, (gssize) -1);
	_tmp11_ = char_count;
	if (_tmp11_ == 0) {
		result = TRUE;
		_g_free0 (total);
		return result;
	}
	_tmp12_ = total;
	_tmp13_ = total;
	_tmp14_ = char_count;
	_tmp15_ = string_slice (_tmp12_, (glong) 0, (glong) string_index_of_nth_char (_tmp13_, (glong) (_tmp14_ - 1)));
	_g_free0 (total);
	total = _tmp15_;
	gtk_window_resize ((GtkWindow*) self, 1, 1);
	_tmp16_ = self->priv->m_extension_preedit_text;
	_tmp17_ = total;
	gtk_label_set_text (_tmp16_, _tmp17_);
	_tmp18_ = total;
	_tmp19_ = strlen (_tmp18_);
	_tmp20_ = _tmp19_;
	if (_tmp20_ == 0) {
		gtk_window_resize ((GtkWindow*) self, 1, 1);
	}
	result = TRUE;
	_g_free0 (total);
	return result;
}


static gchar*
preedit_get_extension_text (Preedit* self)
{
	gchar* result = NULL;
	gchar* extension_text = NULL;
	GtkLabel* _tmp0_;
	const gchar* _tmp1_;
	gchar* _tmp2_;
	const gchar* _tmp3_;
	gint _tmp4_;
	gint _tmp5_;
	const gchar* _tmp9_;
	const gchar* _tmp10_;
	gchar* _tmp11_;
	g_return_val_if_fail (self != NULL, NULL);
	_tmp0_ = self->priv->m_extension_preedit_emoji;
	_tmp1_ = gtk_label_get_text (_tmp0_);
	_tmp2_ = g_strdup (_tmp1_);
	extension_text = _tmp2_;
	_tmp3_ = extension_text;
	_tmp4_ = strlen (_tmp3_);
	_tmp5_ = _tmp4_;
	if (_tmp5_ == 0) {
		GtkLabel* _tmp6_;
		const gchar* _tmp7_;
		gchar* _tmp8_;
		_tmp6_ = self->priv->m_extension_preedit_text;
		_tmp7_ = gtk_label_get_text (_tmp6_);
		_tmp8_ = g_strdup (_tmp7_);
		_g_free0 (extension_text);
		extension_text = _tmp8_;
	}
	_tmp9_ = self->priv->m_prefix;
	_tmp10_ = extension_text;
	_tmp11_ = g_strconcat (_tmp9_, _tmp10_, NULL);
	result = _tmp11_;
	_g_free0 (extension_text);
	return result;
}


static void
preedit_set_preedit_color (Preedit* self,
                           IBusText* text,
                           guint start_index,
                           guint end_index)
{
	g_return_if_fail (self != NULL);
	g_return_if_fail (text != NULL);
	ibus_text_append_attribute (text, (guint) IBUS_ATTR_TYPE_UNDERLINE, (guint) IBUS_ATTR_UNDERLINE_SINGLE, start_index, (gint) end_index);
}


static gpointer
_g_object_ref0 (gpointer self)
{
	return self ? g_object_ref (self) : NULL;
}


IBusText*
preedit_get_engine_preedit_text (Preedit* self)
{
	IBusText* result = NULL;
	gchar* extension_text = NULL;
	gchar* _tmp0_;
	guint char_count = 0U;
	const gchar* _tmp1_;
	IBusText* retval = NULL;
	gboolean _tmp2_ = FALSE;
	IBusText* _tmp3_;
	const gchar* _tmp9_;
	IBusText* _tmp10_;
	const gchar* _tmp11_;
	gchar* _tmp12_;
	gchar* _tmp13_;
	IBusText* _tmp14_;
	IBusText* _tmp15_;
	guint _tmp16_;
	IBusAttrList* attrs = NULL;
	IBusText* _tmp17_;
	IBusAttrList* _tmp18_;
	IBusAttrList* _tmp19_;
	gint i = 0;
	g_return_val_if_fail (self != NULL, NULL);
	_tmp0_ = preedit_get_extension_text (self);
	extension_text = _tmp0_;
	_tmp1_ = extension_text;
	char_count = (guint) g_utf8_strlen (_tmp1_, (gssize) -1);
	_tmp3_ = self->priv->m_engine_preedit_text;
	if (_tmp3_ == NULL) {
		_tmp2_ = TRUE;
	} else {
		gboolean _tmp4_;
		_tmp4_ = self->priv->m_engine_preedit_text_show;
		_tmp2_ = !_tmp4_;
	}
	if (_tmp2_) {
		const gchar* _tmp5_;
		IBusText* _tmp6_;
		IBusText* _tmp7_;
		guint _tmp8_;
		_tmp5_ = extension_text;
		_tmp6_ = ibus_text_new_from_string (_tmp5_);
		g_object_ref_sink (_tmp6_);
		_g_object_unref0 (retval);
		retval = _tmp6_;
		_tmp7_ = retval;
		_tmp8_ = char_count;
		preedit_set_preedit_color (self, _tmp7_, (guint) 0, _tmp8_);
		result = retval;
		_g_free0 (extension_text);
		return result;
	}
	_tmp9_ = extension_text;
	_tmp10_ = self->priv->m_engine_preedit_text;
	_tmp11_ = ibus_text_get_text (_tmp10_);
	_tmp12_ = g_strconcat (_tmp9_, _tmp11_, NULL);
	_tmp13_ = _tmp12_;
	_tmp14_ = ibus_text_new_from_string (_tmp13_);
	g_object_ref_sink (_tmp14_);
	_g_object_unref0 (retval);
	retval = _tmp14_;
	_g_free0 (_tmp13_);
	_tmp15_ = retval;
	_tmp16_ = char_count;
	preedit_set_preedit_color (self, _tmp15_, (guint) 0, _tmp16_);
	_tmp17_ = self->priv->m_engine_preedit_text;
	_tmp18_ = ibus_text_get_attributes (_tmp17_);
	attrs = _tmp18_;
	_tmp19_ = attrs;
	if (_tmp19_ == NULL) {
		result = retval;
		_g_free0 (extension_text);
		return result;
	}
	i = 0;
	while (TRUE) {
		IBusAttribute* attr = NULL;
		IBusAttrList* _tmp20_;
		gint _tmp21_;
		IBusAttribute* _tmp22_;
		IBusAttribute* _tmp23_;
		IBusAttribute* _tmp24_;
		glong start_index = 0L;
		IBusAttribute* _tmp25_;
		guint _tmp26_;
		glong end_index = 0L;
		IBusAttribute* _tmp27_;
		guint _tmp28_;
		glong _tmp29_;
		glong _tmp30_;
		IBusText* _tmp32_;
		IBusAttribute* _tmp33_;
		guint _tmp34_;
		IBusAttribute* _tmp35_;
		guint _tmp36_;
		guint _tmp37_;
		glong _tmp38_;
		guint _tmp39_;
		glong _tmp40_;
		_tmp20_ = attrs;
		_tmp21_ = i;
		i = _tmp21_ + 1;
		_tmp22_ = ibus_attr_list_get (_tmp20_, (guint) _tmp21_);
		_tmp23_ = _g_object_ref0 (_tmp22_);
		attr = _tmp23_;
		_tmp24_ = attr;
		if (_tmp24_ == NULL) {
			_g_object_unref0 (attr);
			break;
		}
		_tmp25_ = attr;
		_tmp26_ = _tmp25_->start_index;
		start_index = (glong) _tmp26_;
		_tmp27_ = attr;
		_tmp28_ = _tmp27_->end_index;
		end_index = (glong) _tmp28_;
		_tmp29_ = start_index;
		if (_tmp29_ < ((glong) 0)) {
			start_index = (glong) 0;
		}
		_tmp30_ = end_index;
		if (_tmp30_ < ((glong) 0)) {
			IBusText* _tmp31_;
			_tmp31_ = self->priv->m_engine_preedit_text;
			end_index = (glong) ibus_text_get_length (_tmp31_);
		}
		_tmp32_ = retval;
		_tmp33_ = attr;
		_tmp34_ = _tmp33_->type;
		_tmp35_ = attr;
		_tmp36_ = _tmp35_->value;
		_tmp37_ = char_count;
		_tmp38_ = start_index;
		_tmp39_ = char_count;
		_tmp40_ = end_index;
		ibus_text_append_attribute (_tmp32_, _tmp34_, _tmp36_, _tmp37_ + ((guint) _tmp38_), ((gint) _tmp39_) + ((gint) _tmp40_));
		_g_object_unref0 (attr);
	}
	result = retval;
	_g_free0 (extension_text);
	return result;
}


void
preedit_set_engine_preedit_text (Preedit* self,
                                 IBusText* text)
{
	IBusText* _tmp0_;
	g_return_if_fail (self != NULL);
	_tmp0_ = _g_object_ref0 (text);
	_g_object_unref0 (self->priv->m_engine_preedit_text);
	self->priv->m_engine_preedit_text = _tmp0_;
}


void
preedit_show_engine_preedit_text (Preedit* self)
{
	g_return_if_fail (self != NULL);
	self->priv->m_engine_preedit_text_show = TRUE;
}


void
preedit_hide_engine_preedit_text (Preedit* self)
{
	g_return_if_fail (self != NULL);
	self->priv->m_engine_preedit_text_show = FALSE;
}


guint
preedit_get_engine_preedit_cursor_pos (Preedit* self)
{
	guint result = 0U;
	gchar* _tmp0_;
	gchar* _tmp1_;
	guint _tmp2_;
	guint _tmp3_;
	g_return_val_if_fail (self != NULL, 0U);
	_tmp0_ = preedit_get_extension_text (self);
	_tmp1_ = _tmp0_;
	_tmp2_ = self->priv->m_engine_preedit_cursor_pos;
	_tmp3_ = g_utf8_strlen (_tmp1_, (gssize) -1) + _tmp2_;
	_g_free0 (_tmp1_);
	result = _tmp3_;
	return result;
}


void
preedit_set_engine_preedit_cursor_pos (Preedit* self,
                                       guint cursor_pos)
{
	g_return_if_fail (self != NULL);
	self->priv->m_engine_preedit_cursor_pos = cursor_pos;
}


IBusText*
preedit_get_commit_text (Preedit* self)
{
	IBusText* result = NULL;
	gchar* extension_text = NULL;
	GtkLabel* _tmp0_;
	const gchar* _tmp1_;
	gchar* _tmp2_;
	const gchar* _tmp3_;
	gint _tmp4_;
	gint _tmp5_;
	const gchar* _tmp9_;
	IBusText* _tmp10_;
	g_return_val_if_fail (self != NULL, NULL);
	_tmp0_ = self->priv->m_extension_preedit_emoji;
	_tmp1_ = gtk_label_get_text (_tmp0_);
	_tmp2_ = g_strdup (_tmp1_);
	extension_text = _tmp2_;
	_tmp3_ = extension_text;
	_tmp4_ = strlen (_tmp3_);
	_tmp5_ = _tmp4_;
	if (_tmp5_ == 0) {
		GtkLabel* _tmp6_;
		const gchar* _tmp7_;
		gchar* _tmp8_;
		_tmp6_ = self->priv->m_extension_preedit_text;
		_tmp7_ = gtk_label_get_text (_tmp6_);
		_tmp8_ = g_strdup (_tmp7_);
		_g_free0 (extension_text);
		extension_text = _tmp8_;
	}
	_tmp9_ = extension_text;
	_tmp10_ = ibus_text_new_from_string (_tmp9_);
	g_object_ref_sink (_tmp10_);
	result = _tmp10_;
	_g_free0 (extension_text);
	return result;
}


void
preedit_set_extension_name (Preedit* self,
                            const gchar* extension_name)
{
	gint _tmp0_;
	gint _tmp1_;
	g_return_if_fail (self != NULL);
	g_return_if_fail (extension_name != NULL);
	_tmp0_ = strlen (extension_name);
	_tmp1_ = _tmp0_;
	if (_tmp1_ == 0) {
		gchar* _tmp2_;
		_tmp2_ = g_strdup ("@");
		_g_free0 (self->priv->m_prefix);
		self->priv->m_prefix = _tmp2_;
	} else {
		gchar* _tmp3_;
		_tmp3_ = string_slice (extension_name, (glong) 0, (glong) 1);
		_g_free0 (self->priv->m_prefix);
		self->priv->m_prefix = _tmp3_;
	}
}


static void
preedit_class_init (PreeditClass * klass)
{
	preedit_parent_class = g_type_class_peek_parent (klass);
	g_type_class_add_private (klass, sizeof (PreeditPrivate));
	G_OBJECT_CLASS (klass)->finalize = preedit_finalize;
}


static void
preedit_instance_init (Preedit * self)
{
	gchar* _tmp0_;
	self->priv = PREEDIT_GET_PRIVATE (self);
	_tmp0_ = g_strdup ("@");
	self->priv->m_prefix = _tmp0_;
	self->priv->m_is_shown = TRUE;
}


static void
preedit_finalize (GObject * obj)
{
	Preedit * self;
	self = G_TYPE_CHECK_INSTANCE_CAST (obj, TYPE_PREEDIT, Preedit);
	_g_object_unref0 (self->priv->m_extension_preedit_text);
	_g_object_unref0 (self->priv->m_extension_preedit_emoji);
	_g_object_unref0 (self->priv->m_engine_preedit_text);
	_g_free0 (self->priv->m_prefix);
	G_OBJECT_CLASS (preedit_parent_class)->finalize (obj);
}


GType
preedit_get_type (void)
{
	static volatile gsize preedit_type_id__volatile = 0;
	if (g_once_init_enter (&preedit_type_id__volatile)) {
		static const GTypeInfo g_define_type_info = { sizeof (PreeditClass), (GBaseInitFunc) NULL, (GBaseFinalizeFunc) NULL, (GClassInitFunc) preedit_class_init, (GClassFinalizeFunc) NULL, NULL, sizeof (Preedit), 0, (GInstanceInitFunc) preedit_instance_init, NULL };
		GType preedit_type_id;
		preedit_type_id = g_type_register_static (gtk_window_get_type (), "Preedit", &g_define_type_info, 0);
		g_once_init_leave (&preedit_type_id__volatile, preedit_type_id);
	}
	return preedit_type_id__volatile;
}


PanelBinding*
panel_binding_construct (GType object_type,
                         IBusBus* bus,
                         GtkApplication* application)
{
	PanelBinding * self = NULL;
	GDBusConnection* _tmp0_;
	GType instance_type = 0UL;
	GdkDisplay* _tmp1_;
	GType wayland_type = 0UL;
	IBusBus* _tmp2_;
	GtkApplication* _tmp3_;
	Preedit* _tmp4_;
	g_return_val_if_fail (bus != NULL, NULL);
	g_return_val_if_fail (application != NULL, NULL);
	_vala_assert (ibus_bus_is_connected (bus), "bus.is_connected()");
	_tmp0_ = ibus_bus_get_connection (bus);
	self = (PanelBinding*) g_object_new (object_type, "connection", _tmp0_, "object-path", IBUS_PATH_PANEL_EXTENSION_EMOJI, NULL);
	_tmp1_ = gdk_display_get_default ();
	instance_type = G_TYPE_FROM_INSTANCE ((GObject*) _tmp1_);
	wayland_type = gdk_wayland_display_get_type ();
	self->priv->m_is_wayland = g_type_is_a (instance_type, wayland_type);
	_tmp2_ = _g_object_ref0 (bus);
	_g_object_unref0 (self->priv->m_bus);
	self->priv->m_bus = _tmp2_;
	_tmp3_ = _g_object_ref0 (application);
	_g_object_unref0 (self->priv->m_application);
	self->priv->m_application = _tmp3_;
	panel_binding_init_settings (self);
	_tmp4_ = preedit_new ();
	g_object_ref_sink (_tmp4_);
	_g_object_unref0 (self->priv->m_preedit);
	self->priv->m_preedit = _tmp4_;
	return self;
}


PanelBinding*
panel_binding_new (IBusBus* bus,
                   GtkApplication* application)
{
	return panel_binding_construct (TYPE_PANEL_BINDING, bus, application);
}


static void
__lambda28_ (PanelBinding* self,
             const gchar* key)
{
	GSettings* _tmp0_;
	GSettings* _tmp1_;
	g_return_if_fail (key != NULL);
	_tmp0_ = self->priv->m_settings_panel;
	_tmp1_ = self->priv->m_settings_emoji;
	binding_common_set_custom_font (_tmp0_, _tmp1_, &self->priv->m_css_provider);
}


static void
___lambda28__g_settings_changed (GSettings* _sender,
                                 const gchar* key,
                                 gpointer self)
{
	__lambda28_ ((PanelBinding*) self, key);
}


static void
__lambda29_ (PanelBinding* self,
             const gchar* key)
{
	GSettings* _tmp0_;
	GSettings* _tmp1_;
	g_return_if_fail (key != NULL);
	_tmp0_ = self->priv->m_settings_panel;
	_tmp1_ = self->priv->m_settings_emoji;
	binding_common_set_custom_font (_tmp0_, _tmp1_, &self->priv->m_css_provider);
}


static void
___lambda29__g_settings_changed (GSettings* _sender,
                                 const gchar* key,
                                 gpointer self)
{
	__lambda29_ ((PanelBinding*) self, key);
}


static void
__lambda30_ (PanelBinding* self,
             const gchar* key)
{
	g_return_if_fail (key != NULL);
	panel_binding_set_emoji_hotkey (self);
}


static void
___lambda30__g_settings_changed (GSettings* _sender,
                                 const gchar* key,
                                 gpointer self)
{
	__lambda30_ ((PanelBinding*) self, key);
}


static void
__lambda31_ (PanelBinding* self,
             const gchar* key)
{
	GSettings* _tmp0_;
	GSettings* _tmp1_;
	g_return_if_fail (key != NULL);
	_tmp0_ = self->priv->m_settings_panel;
	_tmp1_ = self->priv->m_settings_emoji;
	binding_common_set_custom_font (_tmp0_, _tmp1_, &self->priv->m_css_provider);
}


static void
___lambda31__g_settings_changed (GSettings* _sender,
                                 const gchar* key,
                                 gpointer self)
{
	__lambda31_ ((PanelBinding*) self, key);
}


static void
__lambda32_ (PanelBinding* self,
             const gchar* key)
{
	g_return_if_fail (key != NULL);
	panel_binding_set_emoji_hotkey (self);
}


static void
___lambda32__g_settings_changed (GSettings* _sender,
                                 const gchar* key,
                                 gpointer self)
{
	__lambda32_ ((PanelBinding*) self, key);
}


static void
__lambda33_ (PanelBinding* self,
             const gchar* key)
{
	g_return_if_fail (key != NULL);
	panel_binding_set_emoji_favorites (self);
}


static void
___lambda33__g_settings_changed (GSettings* _sender,
                                 const gchar* key,
                                 gpointer self)
{
	__lambda33_ ((PanelBinding*) self, key);
}


static void
__lambda34_ (PanelBinding* self,
             const gchar* key)
{
	g_return_if_fail (key != NULL);
	panel_binding_set_emoji_favorites (self);
}


static void
___lambda34__g_settings_changed (GSettings* _sender,
                                 const gchar* key,
                                 gpointer self)
{
	__lambda34_ ((PanelBinding*) self, key);
}


static void
__lambda35_ (PanelBinding* self,
             const gchar* key)
{
	g_return_if_fail (key != NULL);
	panel_binding_set_emoji_lang (self);
}


static void
___lambda35__g_settings_changed (GSettings* _sender,
                                 const gchar* key,
                                 gpointer self)
{
	__lambda35_ ((PanelBinding*) self, key);
}


static void
__lambda37_ (PanelBinding* self,
             const gchar* key)
{
	g_return_if_fail (key != NULL);
	panel_binding_set_emoji_partial_match (self);
}


static void
___lambda37__g_settings_changed (GSettings* _sender,
                                 const gchar* key,
                                 gpointer self)
{
	__lambda37_ ((PanelBinding*) self, key);
}


static void
__lambda38_ (PanelBinding* self,
             const gchar* key)
{
	g_return_if_fail (key != NULL);
	panel_binding_set_emoji_partial_match (self);
}


static void
___lambda38__g_settings_changed (GSettings* _sender,
                                 const gchar* key,
                                 gpointer self)
{
	__lambda38_ ((PanelBinding*) self, key);
}


static void
__lambda39_ (PanelBinding* self,
             const gchar* key)
{
	g_return_if_fail (key != NULL);
	panel_binding_set_emoji_partial_match (self);
}


static void
___lambda39__g_settings_changed (GSettings* _sender,
                                 const gchar* key,
                                 gpointer self)
{
	__lambda39_ ((PanelBinding*) self, key);
}


static void
__lambda40_ (PanelBinding* self,
             const gchar* key)
{
	g_return_if_fail (key != NULL);
	panel_binding_set_load_emoji_at_startup (self);
}


static void
___lambda40__g_settings_changed (GSettings* _sender,
                                 const gchar* key,
                                 gpointer self)
{
	__lambda40_ ((PanelBinding*) self, key);
}


static void
__lambda41_ (PanelBinding* self,
             const gchar* key)
{
	g_return_if_fail (key != NULL);
	panel_binding_set_load_unicode_at_startup (self);
}


static void
___lambda41__g_settings_changed (GSettings* _sender,
                                 const gchar* key,
                                 gpointer self)
{
	__lambda41_ ((PanelBinding*) self, key);
}


static void
panel_binding_init_settings (PanelBinding* self)
{
	GSettings* _tmp0_;
	GSettings* _tmp1_;
	GSettings* _tmp2_;
	GSettings* _tmp3_;
	GSettings* _tmp4_;
	GSettings* _tmp5_;
	GSettings* _tmp6_;
	GSettings* _tmp7_;
	GSettings* _tmp8_;
	GSettings* _tmp9_;
	GSettings* _tmp10_;
	GSettings* _tmp11_;
	GSettings* _tmp12_;
	GSettings* _tmp13_;
	GSettings* _tmp14_;
	g_return_if_fail (self != NULL);
	_tmp0_ = g_settings_new ("org.freedesktop.ibus.panel");
	_g_object_unref0 (self->priv->m_settings_panel);
	self->priv->m_settings_panel = _tmp0_;
	_tmp1_ = g_settings_new ("org.freedesktop.ibus.panel.emoji");
	_g_object_unref0 (self->priv->m_settings_emoji);
	self->priv->m_settings_emoji = _tmp1_;
	_tmp2_ = self->priv->m_settings_panel;
	g_signal_connect_object (_tmp2_, "changed::custom-font", (GCallback) ___lambda28__g_settings_changed, self, 0);
	_tmp3_ = self->priv->m_settings_panel;
	g_signal_connect_object (_tmp3_, "changed::use-custom-font", (GCallback) ___lambda29__g_settings_changed, self, 0);
	_tmp4_ = self->priv->m_settings_emoji;
	g_signal_connect_object (_tmp4_, "changed::unicode-hotkey", (GCallback) ___lambda30__g_settings_changed, self, 0);
	_tmp5_ = self->priv->m_settings_emoji;
	g_signal_connect_object (_tmp5_, "changed::font", (GCallback) ___lambda31__g_settings_changed, self, 0);
	_tmp6_ = self->priv->m_settings_emoji;
	g_signal_connect_object (_tmp6_, "changed::hotkey", (GCallback) ___lambda32__g_settings_changed, self, 0);
	_tmp7_ = self->priv->m_settings_emoji;
	g_signal_connect_object (_tmp7_, "changed::favorites", (GCallback) ___lambda33__g_settings_changed, self, 0);
	_tmp8_ = self->priv->m_settings_emoji;
	g_signal_connect_object (_tmp8_, "changed::favorite-annotations", (GCallback) ___lambda34__g_settings_changed, self, 0);
	_tmp9_ = self->priv->m_settings_emoji;
	g_signal_connect_object (_tmp9_, "changed::lang", (GCallback) ___lambda35__g_settings_changed, self, 0);
	_tmp10_ = self->priv->m_settings_emoji;
	g_signal_connect_object (_tmp10_, "changed::has-partial-match", (GCallback) ___lambda37__g_settings_changed, self, 0);
	_tmp11_ = self->priv->m_settings_emoji;
	g_signal_connect_object (_tmp11_, "changed::partial-match-length", (GCallback) ___lambda38__g_settings_changed, self, 0);
	_tmp12_ = self->priv->m_settings_emoji;
	g_signal_connect_object (_tmp12_, "changed::partial-match-condition", (GCallback) ___lambda39__g_settings_changed, self, 0);
	_tmp13_ = self->priv->m_settings_emoji;
	g_signal_connect_object (_tmp13_, "changed::load-emoji-at-startup", (GCallback) ___lambda40__g_settings_changed, self, 0);
	_tmp14_ = self->priv->m_settings_emoji;
	g_signal_connect_object (_tmp14_, "changed::load-unicode-at-startup", (GCallback) ___lambda41__g_settings_changed, self, 0);
}


static void
panel_binding_parse_accelerator (PanelBinding* self,
                                 const gchar* accelerator)
{
	IBusProcessKeyEventData _tmp0_ = {0};
	guint keysym = 0U;
	IBusModifierType modifiers = 0;
	guint _tmp1_ = 0U;
	IBusModifierType _tmp2_ = 0;
	gboolean _tmp3_ = FALSE;
	guint _tmp4_;
	IBusModifierType _tmp8_;
	guint _tmp11_;
	IBusModifierType _tmp12_;
	g_return_if_fail (self != NULL);
	g_return_if_fail (accelerator != NULL);
	self->priv->m_key_event_data = _tmp0_;
	keysym = (guint) 0;
	modifiers = 0;
	ibus_accelerator_parse (accelerator, &_tmp1_, &_tmp2_);
	keysym = _tmp1_;
	modifiers = _tmp2_;
	_tmp4_ = keysym;
	if (_tmp4_ == 0U) {
		IBusModifierType _tmp5_;
		_tmp5_ = modifiers;
		_tmp3_ = _tmp5_ == 0;
	} else {
		_tmp3_ = FALSE;
	}
	if (_tmp3_) {
		gchar* _tmp6_;
		gchar* _tmp7_;
		_tmp6_ = g_strdup_printf ("Failed to parse shortcut key '%s'", accelerator);
		_tmp7_ = _tmp6_;
		g_warning ("panelbinding.vala:325: %s", _tmp7_);
		_g_free0 (_tmp7_);
		return;
	}
	_tmp8_ = modifiers;
	if ((_tmp8_ & IBUS_SUPER_MASK) != 0) {
		IBusModifierType _tmp9_;
		IBusModifierType _tmp10_;
		_tmp9_ = modifiers;
		modifiers = _tmp9_ ^ IBUS_SUPER_MASK;
		_tmp10_ = modifiers;
		modifiers = _tmp10_ | IBUS_MOD4_MASK;
	}
	_tmp11_ = keysym;
	self->priv->m_key_event_data.keyval = _tmp11_;
	_tmp12_ = modifiers;
	self->priv->m_key_event_data.state = (guint) _tmp12_;
}


static void
_vala_array_add8 (IBusProcessKeyEventData* * array,
                  int* length,
                  int* size,
                  const IBusProcessKeyEventData* value)
{
	if ((*length) == (*size)) {
		*size = (*size) ? (2 * (*size)) : 4;
		*array = g_renew (IBusProcessKeyEventData, *array, *size);
	}
	(*array)[(*length)++] = *value;
}


static void
_vala_array_add9 (IBusProcessKeyEventData* * array,
                  int* length,
                  int* size,
                  const IBusProcessKeyEventData* value)
{
	if ((*length) == (*size)) {
		*size = (*size) ? (2 * (*size)) : 4;
		*array = g_renew (IBusProcessKeyEventData, *array, *size);
	}
	(*array)[(*length)++] = *value;
}


static void
_vala_array_add10 (IBusProcessKeyEventData* * array,
                   int* length,
                   int* size,
                   const IBusProcessKeyEventData* value)
{
	if ((*length) == (*size)) {
		*size = (*size) ? (2 * (*size)) : 4;
		*array = g_renew (IBusProcessKeyEventData, *array, *size);
	}
	(*array)[(*length)++] = *value;
}


static void
_vala_array_add11 (IBusProcessKeyEventData* * array,
                   int* length,
                   int* size,
                   const IBusProcessKeyEventData* value)
{
	if ((*length) == (*size)) {
		*size = (*size) ? (2 * (*size)) : 4;
		*array = g_renew (IBusProcessKeyEventData, *array, *size);
	}
	(*array)[(*length)++] = *value;
}


static void
panel_binding_set_emoji_hotkey (PanelBinding* self)
{
	IBusProcessKeyEventData* emoji_keys = NULL;
	IBusProcessKeyEventData* _tmp0_;
	gint emoji_keys_length1;
	gint _emoji_keys_size_;
	IBusProcessKeyEventData key = {0};
	gchar** accelerators = NULL;
	GSettings* _tmp1_;
	gchar** _tmp2_;
	gchar** _tmp3_;
	gint accelerators_length1;
	gint _accelerators_size_;
	gchar** _tmp4_;
	gint _tmp4__length1;
	IBusProcessKeyEventData _tmp9_ = {0};
	IBusProcessKeyEventData* _tmp10_;
	gint _tmp10__length1;
	IBusProcessKeyEventData _tmp11_;
	IBusProcessKeyEventData* unicode_keys = NULL;
	IBusProcessKeyEventData* _tmp12_;
	gint unicode_keys_length1;
	gint _unicode_keys_size_;
	GSettings* _tmp13_;
	gchar** _tmp14_;
	gchar** _tmp15_;
	gchar** _tmp16_;
	gint _tmp16__length1;
	IBusProcessKeyEventData _tmp21_ = {0};
	IBusProcessKeyEventData* _tmp22_;
	gint _tmp22__length1;
	IBusProcessKeyEventData _tmp23_;
	IBusProcessKeyEventData* _tmp24_;
	gint _tmp24__length1;
	IBusProcessKeyEventData* _tmp25_;
	gint _tmp25__length1;
	g_return_if_fail (self != NULL);
	_tmp0_ = g_new0 (IBusProcessKeyEventData, 0);
	emoji_keys = _tmp0_;
	emoji_keys_length1 = 0;
	_emoji_keys_size_ = emoji_keys_length1;
	_tmp1_ = self->priv->m_settings_emoji;
	_tmp3_ = _tmp2_ = g_settings_get_strv (_tmp1_, "hotkey");
	accelerators = _tmp3_;
	accelerators_length1 = _vala_array_length (_tmp2_);
	_accelerators_size_ = accelerators_length1;
	_tmp4_ = accelerators;
	_tmp4__length1 = accelerators_length1;
	{
		gchar** accelerator_collection = NULL;
		gint accelerator_collection_length1 = 0;
		gint _accelerator_collection_size_ = 0;
		gint accelerator_it = 0;
		accelerator_collection = _tmp4_;
		accelerator_collection_length1 = _tmp4__length1;
		for (accelerator_it = 0; accelerator_it < _tmp4__length1; accelerator_it = accelerator_it + 1) {
			gchar* _tmp5_;
			gchar* accelerator = NULL;
			_tmp5_ = g_strdup (accelerator_collection[accelerator_it]);
			accelerator = _tmp5_;
			{
				const gchar* _tmp6_;
				IBusProcessKeyEventData* _tmp7_;
				gint _tmp7__length1;
				IBusProcessKeyEventData _tmp8_;
				_tmp6_ = accelerator;
				panel_binding_parse_accelerator (self, _tmp6_);
				_tmp7_ = emoji_keys;
				_tmp7__length1 = emoji_keys_length1;
				_tmp8_ = self->priv->m_key_event_data;
				_vala_array_add8 (&emoji_keys, &emoji_keys_length1, &_emoji_keys_size_, &_tmp8_);
				_g_free0 (accelerator);
			}
		}
	}
	key = _tmp9_;
	_tmp10_ = emoji_keys;
	_tmp10__length1 = emoji_keys_length1;
	_tmp11_ = key;
	_vala_array_add9 (&emoji_keys, &emoji_keys_length1, &_emoji_keys_size_, &_tmp11_);
	_tmp12_ = g_new0 (IBusProcessKeyEventData, 0);
	unicode_keys = _tmp12_;
	unicode_keys_length1 = 0;
	_unicode_keys_size_ = unicode_keys_length1;
	_tmp13_ = self->priv->m_settings_emoji;
	_tmp15_ = _tmp14_ = g_settings_get_strv (_tmp13_, "unicode-hotkey");
	accelerators = (_vala_array_free (accelerators, accelerators_length1, (GDestroyNotify) g_free), NULL);
	accelerators = _tmp15_;
	accelerators_length1 = _vala_array_length (_tmp14_);
	_accelerators_size_ = accelerators_length1;
	_tmp16_ = accelerators;
	_tmp16__length1 = accelerators_length1;
	{
		gchar** accelerator_collection = NULL;
		gint accelerator_collection_length1 = 0;
		gint _accelerator_collection_size_ = 0;
		gint accelerator_it = 0;
		accelerator_collection = _tmp16_;
		accelerator_collection_length1 = _tmp16__length1;
		for (accelerator_it = 0; accelerator_it < _tmp16__length1; accelerator_it = accelerator_it + 1) {
			gchar* _tmp17_;
			gchar* accelerator = NULL;
			_tmp17_ = g_strdup (accelerator_collection[accelerator_it]);
			accelerator = _tmp17_;
			{
				const gchar* _tmp18_;
				IBusProcessKeyEventData* _tmp19_;
				gint _tmp19__length1;
				IBusProcessKeyEventData _tmp20_;
				_tmp18_ = accelerator;
				panel_binding_parse_accelerator (self, _tmp18_);
				_tmp19_ = unicode_keys;
				_tmp19__length1 = unicode_keys_length1;
				_tmp20_ = self->priv->m_key_event_data;
				_vala_array_add10 (&unicode_keys, &unicode_keys_length1, &_unicode_keys_size_, &_tmp20_);
				_g_free0 (accelerator);
			}
		}
	}
	key = _tmp21_;
	_tmp22_ = unicode_keys;
	_tmp22__length1 = unicode_keys_length1;
	_tmp23_ = key;
	_vala_array_add11 (&unicode_keys, &unicode_keys_length1, &_unicode_keys_size_, &_tmp23_);
	_tmp24_ = emoji_keys;
	_tmp24__length1 = emoji_keys_length1;
	_tmp25_ = unicode_keys;
	_tmp25__length1 = unicode_keys_length1;
	ibus_panel_service_panel_extension_register_keys ((IBusPanelService*) self, "emoji", _tmp24_, "unicode", _tmp25_, NULL);
	unicode_keys = (g_free (unicode_keys), NULL);
	accelerators = (_vala_array_free (accelerators, accelerators_length1, (GDestroyNotify) g_free), NULL);
	emoji_keys = (g_free (emoji_keys), NULL);
}


static void
panel_binding_set_emoji_favorites (PanelBinding* self)
{
	GSettings* _tmp0_;
	gchar** _tmp1_;
	gchar** _tmp2_;
	gchar** _tmp3_;
	gint _tmp3__length1;
	GSettings* _tmp4_;
	gchar** _tmp5_;
	gchar** _tmp6_;
	gchar** _tmp7_;
	gint _tmp7__length1;
	g_return_if_fail (self != NULL);
	_tmp0_ = self->priv->m_settings_emoji;
	_tmp2_ = _tmp1_ = g_settings_get_strv (_tmp0_, "favorites");
	self->priv->m_emojier_favorites = (_vala_array_free (self->priv->m_emojier_favorites, self->priv->m_emojier_favorites_length1, (GDestroyNotify) g_free), NULL);
	self->priv->m_emojier_favorites = _tmp2_;
	self->priv->m_emojier_favorites_length1 = _vala_array_length (_tmp1_);
	self->priv->_m_emojier_favorites_size_ = self->priv->m_emojier_favorites_length1;
	_tmp3_ = self->priv->m_emojier_favorites;
	_tmp3__length1 = self->priv->m_emojier_favorites_length1;
	_tmp4_ = self->priv->m_settings_emoji;
	_tmp6_ = _tmp5_ = g_settings_get_strv (_tmp4_, "favorite-annotations");
	_tmp7_ = _tmp6_;
	_tmp7__length1 = _vala_array_length (_tmp5_);
	ibus_emojier_set_favorites (_tmp3_, _tmp3__length1, _tmp7_, _vala_array_length (_tmp5_));
	_tmp7_ = (_vala_array_free (_tmp7_, _tmp7__length1, (GDestroyNotify) g_free), NULL);
}


static gboolean
__lambda36_ (PanelBinding* self)
{
	gboolean result = FALSE;
	GSettings* _tmp0_;
	gchar* _tmp1_;
	gchar* _tmp2_;
	gboolean _tmp3_ = FALSE;
	gboolean _tmp4_;
	_tmp0_ = self->priv->m_settings_emoji;
	_tmp1_ = g_settings_get_string (_tmp0_, "lang");
	_tmp2_ = _tmp1_;
	ibus_emojier_set_annotation_lang (_tmp2_);
	_g_free0 (_tmp2_);
	self->priv->m_emojier_set_emoji_lang_id = (guint) 0;
	self->priv->m_loaded_emoji = TRUE;
	_tmp4_ = self->priv->m_load_unicode_at_startup;
	if (_tmp4_) {
		gboolean _tmp5_;
		_tmp5_ = self->priv->m_loaded_unicode;
		_tmp3_ = !_tmp5_;
	} else {
		_tmp3_ = FALSE;
	}
	if (_tmp3_) {
		ibus_emojier_load_unicode_dict ();
		self->priv->m_loaded_unicode = TRUE;
	}
	result = FALSE;
	return result;
}


static gboolean
___lambda36__gsource_func (gpointer self)
{
	gboolean result;
	result = __lambda36_ ((PanelBinding*) self);
	return result;
}


static void
panel_binding_set_emoji_lang (PanelBinding* self)
{
	guint _tmp0_;
	g_return_if_fail (self != NULL);
	_tmp0_ = self->priv->m_emojier_set_emoji_lang_id;
	if (_tmp0_ > ((guint) 0)) {
		guint _tmp1_;
		_tmp1_ = self->priv->m_emojier_set_emoji_lang_id;
		g_source_remove (_tmp1_);
		self->priv->m_emojier_set_emoji_lang_id = (guint) 0;
	}
	self->priv->m_emojier_set_emoji_lang_id = g_idle_add_full (G_PRIORITY_DEFAULT_IDLE, ___lambda36__gsource_func, g_object_ref (self), g_object_unref);
}


static void
panel_binding_set_emoji_partial_match (PanelBinding* self)
{
	GSettings* _tmp0_;
	GSettings* _tmp1_;
	GSettings* _tmp2_;
	g_return_if_fail (self != NULL);
	_tmp0_ = self->priv->m_settings_emoji;
	ibus_emojier_set_partial_match (g_settings_get_boolean (_tmp0_, "has-partial-match"));
	_tmp1_ = self->priv->m_settings_emoji;
	ibus_emojier_set_partial_match_length (g_settings_get_int (_tmp1_, "partial-match-length"));
	_tmp2_ = self->priv->m_settings_emoji;
	ibus_emojier_set_partial_match_condition (g_settings_get_int (_tmp2_, "partial-match-condition"));
}


static void
panel_binding_set_load_emoji_at_startup (PanelBinding* self)
{
	GSettings* _tmp0_;
	g_return_if_fail (self != NULL);
	_tmp0_ = self->priv->m_settings_emoji;
	self->priv->m_load_emoji_at_startup = g_settings_get_boolean (_tmp0_, "load-emoji-at-startup");
}


static void
panel_binding_set_load_unicode_at_startup (PanelBinding* self)
{
	GSettings* _tmp0_;
	g_return_if_fail (self != NULL);
	_tmp0_ = self->priv->m_settings_emoji;
	self->priv->m_load_unicode_at_startup = g_settings_get_boolean (_tmp0_, "load-unicode-at-startup");
}


void
panel_binding_load_settings (PanelBinding* self)
{
	GSettings* _tmp0_;
	GSettings* _tmp1_;
	gboolean _tmp2_ = FALSE;
	gboolean _tmp3_;
	g_return_if_fail (self != NULL);
	panel_binding_set_emoji_hotkey (self);
	panel_binding_set_load_emoji_at_startup (self);
	panel_binding_set_load_unicode_at_startup (self);
	_tmp0_ = self->priv->m_settings_panel;
	_tmp1_ = self->priv->m_settings_emoji;
	binding_common_set_custom_font (_tmp0_, _tmp1_, &self->priv->m_css_provider);
	panel_binding_set_emoji_favorites (self);
	_tmp3_ = self->priv->m_load_emoji_at_startup;
	if (_tmp3_) {
		gboolean _tmp4_;
		_tmp4_ = self->priv->m_loaded_emoji;
		_tmp2_ = !_tmp4_;
	} else {
		_tmp2_ = FALSE;
	}
	if (_tmp2_) {
		panel_binding_set_emoji_lang (self);
	}
	panel_binding_set_emoji_partial_match (self);
}


/**
     * disconnect_signals:
     *
     * Call this API before m_panel = null so that the ref_count becomes 0
     */
void
panel_binding_disconnect_signals (PanelBinding* self)
{
	guint _tmp0_;
	IBusEmojier* _tmp2_;
	g_return_if_fail (self != NULL);
	_tmp0_ = self->priv->m_emojier_set_emoji_lang_id;
	if (_tmp0_ > ((guint) 0)) {
		guint _tmp1_;
		_tmp1_ = self->priv->m_emojier_set_emoji_lang_id;
		g_source_remove (_tmp1_);
		self->priv->m_emojier_set_emoji_lang_id = (guint) 0;
	}
	_tmp2_ = self->priv->m_emojier;
	if (_tmp2_ != NULL) {
		GtkApplication* _tmp3_;
		IBusEmojier* _tmp4_;
		_tmp3_ = self->priv->m_application;
		_tmp4_ = self->priv->m_emojier;
		gtk_application_remove_window (_tmp3_, (GtkWindow*) _tmp4_);
		_g_object_unref0 (self->priv->m_emojier);
		self->priv->m_emojier = NULL;
	}
	_g_object_unref0 (self->priv->m_application);
	self->priv->m_application = NULL;
}


static void
_vala_array_add12 (gchar** * array,
                   int* length,
                   int* size,
                   gchar* value)
{
	if ((*length) == (*size)) {
		*size = (*size) ? (2 * (*size)) : 4;
		*array = g_renew (gchar*, *array, (*size) + 1);
	}
	(*array)[(*length)++] = value;
	(*array)[*length] = NULL;
}


static void
panel_binding_commit_text_update_favorites (PanelBinding* self,
                                            IBusText* text)
{
	IBusExtensionEvent* event = NULL;
	const gchar* _tmp0_;
	IBusExtensionEvent* _tmp1_;
	IBusExtensionEvent* _tmp2_;
	IBusExtensionEvent* _tmp3_;
	gchar* committed_string = NULL;
	const gchar* _tmp4_;
	gchar* _tmp5_;
	gchar* preedit_string = NULL;
	Preedit* _tmp6_;
	gchar* _tmp7_;
	Preedit* _tmp8_;
	const gchar* _tmp9_;
	const gchar* _tmp10_;
	gboolean has_favorite = FALSE;
	gchar** _tmp11_;
	gint _tmp11__length1;
	gboolean _tmp14_;
	g_return_if_fail (self != NULL);
	g_return_if_fail (text != NULL);
	ibus_panel_service_commit_text ((IBusPanelService*) self, text);
	_tmp0_ = self->priv->m_extension_name;
	_tmp1_ = ibus_extension_event_new ("name", _tmp0_, "is-enabled", FALSE, "is-extension", TRUE, NULL);
	g_object_ref_sink (_tmp1_);
	event = _tmp1_;
	_tmp2_ = event;
	_tmp3_ = _g_object_ref0 (_tmp2_);
	ibus_panel_service_panel_extension ((IBusPanelService*) self, _tmp3_);
	_tmp4_ = text->text;
	_tmp5_ = g_strdup (_tmp4_);
	committed_string = _tmp5_;
	_tmp6_ = self->priv->m_preedit;
	_tmp7_ = preedit_get_text (_tmp6_);
	preedit_string = _tmp7_;
	_tmp8_ = self->priv->m_preedit;
	preedit_hide (_tmp8_);
	_tmp9_ = preedit_string;
	_tmp10_ = committed_string;
	if (g_strcmp0 (_tmp9_, _tmp10_) == 0) {
		_g_free0 (preedit_string);
		_g_free0 (committed_string);
		_g_object_unref0 (event);
		return;
	}
	has_favorite = FALSE;
	_tmp11_ = self->priv->m_emojier_favorites;
	_tmp11__length1 = self->priv->m_emojier_favorites_length1;
	{
		gchar** favorite_collection = NULL;
		gint favorite_collection_length1 = 0;
		gint _favorite_collection_size_ = 0;
		gint favorite_it = 0;
		favorite_collection = _tmp11_;
		favorite_collection_length1 = _tmp11__length1;
		for (favorite_it = 0; favorite_it < _tmp11__length1; favorite_it = favorite_it + 1) {
			const gchar* favorite = NULL;
			favorite = favorite_collection[favorite_it];
			{
				const gchar* _tmp12_;
				const gchar* _tmp13_;
				_tmp12_ = favorite;
				_tmp13_ = committed_string;
				if (g_strcmp0 (_tmp12_, _tmp13_) == 0) {
					has_favorite = TRUE;
					break;
				}
			}
		}
	}
	_tmp14_ = has_favorite;
	if (!_tmp14_) {
		gchar** _tmp15_;
		gint _tmp15__length1;
		const gchar* _tmp16_;
		gchar* _tmp17_;
		GSettings* _tmp18_;
		gchar** _tmp19_;
		gint _tmp19__length1;
		_tmp15_ = self->priv->m_emojier_favorites;
		_tmp15__length1 = self->priv->m_emojier_favorites_length1;
		_tmp16_ = committed_string;
		_tmp17_ = g_strdup (_tmp16_);
		_vala_array_add12 (&self->priv->m_emojier_favorites, &self->priv->m_emojier_favorites_length1, &self->priv->_m_emojier_favorites_size_, _tmp17_);
		_tmp18_ = self->priv->m_settings_emoji;
		_tmp19_ = self->priv->m_emojier_favorites;
		_tmp19__length1 = self->priv->m_emojier_favorites_length1;
		g_settings_set_strv (_tmp18_, "favorites", _tmp19_);
	}
	_g_free0 (preedit_string);
	_g_free0 (committed_string);
	_g_object_unref0 (event);
}


static gboolean
panel_binding_emojier_focus_commit_real (PanelBinding* self)
{
	gboolean result = FALSE;
	IBusEmojier* _tmp0_;
	gchar* selected_string = NULL;
	IBusEmojier* _tmp1_;
	gchar* _tmp2_;
	gchar* prev_context_path = NULL;
	IBusEmojier* _tmp3_;
	gchar* _tmp4_;
	gboolean _tmp5_ = FALSE;
	gboolean _tmp6_ = FALSE;
	const gchar* _tmp7_;
	g_return_val_if_fail (self != NULL, FALSE);
	_tmp0_ = self->priv->m_emojier;
	if (_tmp0_ == NULL) {
		result = TRUE;
		return result;
	}
	_tmp1_ = self->priv->m_emojier;
	_tmp2_ = ibus_emojier_get_selected_string (_tmp1_);
	selected_string = _tmp2_;
	_tmp3_ = self->priv->m_emojier;
	_tmp4_ = ibus_emojier_get_input_context_path (_tmp3_);
	prev_context_path = _tmp4_;
	_tmp7_ = selected_string;
	if (_tmp7_ != NULL) {
		const gchar* _tmp8_;
		_tmp8_ = prev_context_path;
		_tmp6_ = g_strcmp0 (_tmp8_, "") != 0;
	} else {
		_tmp6_ = FALSE;
	}
	if (_tmp6_) {
		const gchar* _tmp9_;
		const gchar* _tmp10_;
		_tmp9_ = prev_context_path;
		_tmp10_ = self->priv->m_current_context_path;
		_tmp5_ = g_strcmp0 (_tmp9_, _tmp10_) == 0;
	} else {
		_tmp5_ = FALSE;
	}
	if (_tmp5_) {
		IBusText* text = NULL;
		const gchar* _tmp11_;
		IBusText* _tmp12_;
		IBusText* _tmp13_;
		IBusEmojier* _tmp14_;
		_tmp11_ = selected_string;
		_tmp12_ = ibus_text_new_from_string (_tmp11_);
		g_object_ref_sink (_tmp12_);
		text = _tmp12_;
		_tmp13_ = text;
		panel_binding_commit_text_update_favorites (self, _tmp13_);
		_tmp14_ = self->priv->m_emojier;
		ibus_emojier_reset (_tmp14_);
		result = TRUE;
		_g_object_unref0 (text);
		_g_free0 (prev_context_path);
		_g_free0 (selected_string);
		return result;
	}
	result = FALSE;
	_g_free0 (prev_context_path);
	_g_free0 (selected_string);
	return result;
}


static gpointer
_g_main_context_ref0 (gpointer self)
{
	return self ? g_main_context_ref (self) : NULL;
}


static gboolean
___lambda42_ (PanelBinding* self)
{
	gboolean result = FALSE;
	panel_binding_emojier_focus_commit_real (self);
	self->priv->m_emojier_focus_commit_text_id = (guint) -1;
	result = FALSE;
	return result;
}


static gboolean
____lambda42__gsource_func (gpointer self)
{
	gboolean result;
	result = ___lambda42_ ((PanelBinding*) self);
	return result;
}


static void
panel_binding_emojier_focus_commit (PanelBinding* self)
{
	IBusEmojier* _tmp0_;
	gchar* selected_string = NULL;
	IBusEmojier* _tmp1_;
	gchar* _tmp2_;
	gchar* prev_context_path = NULL;
	IBusEmojier* _tmp3_;
	gchar* _tmp4_;
	gboolean _tmp5_ = FALSE;
	const gchar* _tmp6_;
	g_return_if_fail (self != NULL);
	_tmp0_ = self->priv->m_emojier;
	if (_tmp0_ == NULL) {
		return;
	}
	_tmp1_ = self->priv->m_emojier;
	_tmp2_ = ibus_emojier_get_selected_string (_tmp1_);
	selected_string = _tmp2_;
	_tmp3_ = self->priv->m_emojier;
	_tmp4_ = ibus_emojier_get_input_context_path (_tmp3_);
	prev_context_path = _tmp4_;
	_tmp6_ = selected_string;
	if (_tmp6_ == NULL) {
		const gchar* _tmp7_;
		_tmp7_ = prev_context_path;
		_tmp5_ = g_strcmp0 (_tmp7_, "") != 0;
	} else {
		_tmp5_ = FALSE;
	}
	if (_tmp5_) {
		GMainContext* context = NULL;
		GMainContext* _tmp8_;
		GMainContext* _tmp9_;
		gboolean _tmp10_ = FALSE;
		guint _tmp11_;
		_tmp8_ = g_main_context_default ();
		_tmp9_ = _g_main_context_ref0 (_tmp8_);
		context = _tmp9_;
		_tmp11_ = self->priv->m_emojier_focus_commit_text_id;
		if (_tmp11_ > ((guint) 0)) {
			GMainContext* _tmp12_;
			guint _tmp13_;
			GSource* _tmp14_;
			_tmp12_ = context;
			_tmp13_ = self->priv->m_emojier_focus_commit_text_id;
			_tmp14_ = g_main_context_find_source_by_id (_tmp12_, _tmp13_);
			_tmp10_ = _tmp14_ != NULL;
		} else {
			_tmp10_ = FALSE;
		}
		if (_tmp10_) {
			guint _tmp15_;
			_tmp15_ = self->priv->m_emojier_focus_commit_text_id;
			g_source_remove (_tmp15_);
		}
		self->priv->m_emojier_focus_commit_text_id = g_timeout_add_full (G_PRIORITY_DEFAULT, (guint) 100, ____lambda42__gsource_func, g_object_ref (self), g_object_unref);
		_g_main_context_unref0 (context);
	} else {
		if (panel_binding_emojier_focus_commit_real (self)) {
			GMainContext* context = NULL;
			GMainContext* _tmp16_;
			GMainContext* _tmp17_;
			gboolean _tmp18_ = FALSE;
			guint _tmp19_;
			_tmp16_ = g_main_context_default ();
			_tmp17_ = _g_main_context_ref0 (_tmp16_);
			context = _tmp17_;
			_tmp19_ = self->priv->m_emojier_focus_commit_text_id;
			if (_tmp19_ > ((guint) 0)) {
				GMainContext* _tmp20_;
				guint _tmp21_;
				GSource* _tmp22_;
				_tmp20_ = context;
				_tmp21_ = self->priv->m_emojier_focus_commit_text_id;
				_tmp22_ = g_main_context_find_source_by_id (_tmp20_, _tmp21_);
				_tmp18_ = _tmp22_ != NULL;
			} else {
				_tmp18_ = FALSE;
			}
			if (_tmp18_) {
				guint _tmp23_;
				_tmp23_ = self->priv->m_emojier_focus_commit_text_id;
				g_source_remove (_tmp23_);
			}
			self->priv->m_emojier_focus_commit_text_id = (guint) -1;
			_g_main_context_unref0 (context);
		}
	}
	_g_free0 (prev_context_path);
	_g_free0 (selected_string);
}


static gboolean
panel_binding_key_press_escape (PanelBinding* self)
{
	gboolean result = FALSE;
	Preedit* _tmp1_;
	gchar* _tmp2_;
	gchar* _tmp3_;
	gboolean _tmp4_;
	Preedit* _tmp10_;
	IBusExtensionEvent* event = NULL;
	const gchar* _tmp11_;
	IBusExtensionEvent* _tmp12_;
	IBusExtensionEvent* _tmp13_;
	IBusExtensionEvent* _tmp14_;
	g_return_val_if_fail (self != NULL, FALSE);
	if (panel_binding_is_emoji_lookup_table (self)) {
		gboolean show_candidate = FALSE;
		IBusEmojier* _tmp0_;
		_tmp0_ = self->priv->m_emojier;
		show_candidate = ibus_emojier_key_press_escape (_tmp0_);
		panel_binding_convert_preedit_text (self);
		result = show_candidate;
		return result;
	}
	_tmp1_ = self->priv->m_preedit;
	_tmp2_ = preedit_get_emoji (_tmp1_);
	_tmp3_ = _tmp2_;
	_tmp4_ = g_strcmp0 (_tmp3_, "") != 0;
	_g_free0 (_tmp3_);
	if (_tmp4_) {
		Preedit* _tmp5_;
		gchar* annotation = NULL;
		Preedit* _tmp6_;
		gchar* _tmp7_;
		IBusEmojier* _tmp8_;
		const gchar* _tmp9_;
		_tmp5_ = self->priv->m_preedit;
		preedit_set_emoji (_tmp5_, "");
		_tmp6_ = self->priv->m_preedit;
		_tmp7_ = preedit_get_text (_tmp6_);
		annotation = _tmp7_;
		_tmp8_ = self->priv->m_emojier;
		_tmp9_ = annotation;
		ibus_emojier_set_annotation (_tmp8_, _tmp9_);
		result = FALSE;
		_g_free0 (annotation);
		return result;
	}
	self->priv->m_enable_extension = FALSE;
	panel_binding_hide_emoji_lookup_table (self);
	_tmp10_ = self->priv->m_preedit;
	preedit_hide (_tmp10_);
	_tmp11_ = self->priv->m_extension_name;
	_tmp12_ = ibus_extension_event_new ("name", _tmp11_, "is-enabled", FALSE, "is-extension", TRUE, NULL);
	g_object_ref_sink (_tmp12_);
	event = _tmp12_;
	_tmp13_ = event;
	_tmp14_ = _g_object_ref0 (_tmp13_);
	ibus_panel_service_panel_extension ((IBusPanelService*) self, _tmp14_);
	result = FALSE;
	_g_object_unref0 (event);
	return result;
}


static gboolean
panel_binding_key_press_enter (PanelBinding* self)
{
	gboolean result = FALSE;
	gboolean _tmp0_ = FALSE;
	const gchar* _tmp1_;
	IBusText* text = NULL;
	Preedit* _tmp3_;
	IBusText* _tmp4_;
	IBusText* _tmp5_;
	g_return_val_if_fail (self != NULL, FALSE);
	_tmp1_ = self->priv->m_extension_name;
	if (g_strcmp0 (_tmp1_, "unicode") != 0) {
		_tmp0_ = panel_binding_is_emoji_lookup_table (self);
	} else {
		_tmp0_ = FALSE;
	}
	if (_tmp0_) {
		IBusEmojier* _tmp2_;
		_tmp2_ = self->priv->m_emojier;
		if (ibus_emojier_key_press_enter (_tmp2_)) {
			panel_binding_convert_preedit_text (self);
			result = TRUE;
			return result;
		}
	}
	_tmp3_ = self->priv->m_preedit;
	_tmp4_ = preedit_get_commit_text (_tmp3_);
	text = _tmp4_;
	_tmp5_ = text;
	panel_binding_commit_text_update_favorites (self, _tmp5_);
	result = FALSE;
	_g_object_unref0 (text);
	return result;
}


static void
panel_binding_convert_preedit_text (PanelBinding* self)
{
	IBusEmojier* _tmp0_;
	g_return_if_fail (self != NULL);
	_tmp0_ = self->priv->m_emojier;
	if (ibus_emojier_get_number_of_candidates (_tmp0_) > ((guint) 0)) {
		Preedit* _tmp1_;
		IBusEmojier* _tmp2_;
		gchar* _tmp3_;
		gchar* _tmp4_;
		_tmp1_ = self->priv->m_preedit;
		_tmp2_ = self->priv->m_emojier;
		_tmp3_ = ibus_emojier_get_current_candidate (_tmp2_);
		_tmp4_ = _tmp3_;
		preedit_set_emoji (_tmp1_, _tmp4_);
		_g_free0 (_tmp4_);
	} else {
		Preedit* _tmp5_;
		_tmp5_ = self->priv->m_preedit;
		preedit_set_emoji (_tmp5_, "");
	}
}


static gboolean
panel_binding_key_press_space (PanelBinding* self)
{
	gboolean result = FALSE;
	gboolean show_candidate = FALSE;
	Preedit* _tmp0_;
	gchar* _tmp1_;
	gchar* _tmp2_;
	gboolean _tmp3_;
	g_return_val_if_fail (self != NULL, FALSE);
	show_candidate = FALSE;
	_tmp0_ = self->priv->m_preedit;
	_tmp1_ = preedit_get_emoji (_tmp0_);
	_tmp2_ = _tmp1_;
	_tmp3_ = g_strcmp0 (_tmp2_, "") != 0;
	_g_free0 (_tmp2_);
	if (_tmp3_) {
		IBusEmojier* _tmp4_;
		_tmp4_ = self->priv->m_emojier;
		ibus_emojier_key_press_cursor_horizontal (_tmp4_, (guint) GDK_KEY_Right, (guint) 0);
		show_candidate = TRUE;
	} else {
		gchar* annotation = NULL;
		Preedit* _tmp5_;
		gchar* _tmp6_;
		const gchar* _tmp7_;
		gint _tmp8_;
		gint _tmp9_;
		_tmp5_ = self->priv->m_preedit;
		_tmp6_ = preedit_get_text (_tmp5_);
		annotation = _tmp6_;
		_tmp7_ = annotation;
		_tmp8_ = strlen (_tmp7_);
		_tmp9_ = _tmp8_;
		if (_tmp9_ == 0) {
			show_candidate = TRUE;
			if (panel_binding_is_emoji_lookup_table (self)) {
				IBusEmojier* _tmp10_;
				_tmp10_ = self->priv->m_emojier;
				ibus_emojier_key_press_cursor_horizontal (_tmp10_, (guint) GDK_KEY_Right, (guint) 0);
			}
		} else {
			IBusEmojier* _tmp11_;
			const gchar* _tmp12_;
			_tmp11_ = self->priv->m_emojier;
			_tmp12_ = annotation;
			ibus_emojier_set_annotation (_tmp11_, _tmp12_);
		}
		_g_free0 (annotation);
	}
	panel_binding_convert_preedit_text (self);
	result = show_candidate;
	return result;
}


static gboolean
panel_binding_key_press_cursor_horizontal (PanelBinding* self,
                                           guint keyval,
                                           guint modifiers)
{
	gboolean result = FALSE;
	g_return_val_if_fail (self != NULL, FALSE);
	if (panel_binding_is_emoji_lookup_table (self)) {
		IBusEmojier* _tmp0_;
		_tmp0_ = self->priv->m_emojier;
		ibus_emojier_key_press_cursor_horizontal (_tmp0_, keyval, modifiers);
		panel_binding_convert_preedit_text (self);
		result = TRUE;
		return result;
	}
	result = FALSE;
	return result;
}


static gboolean
panel_binding_key_press_cursor_vertical (PanelBinding* self,
                                         guint keyval,
                                         guint modifiers)
{
	gboolean result = FALSE;
	g_return_val_if_fail (self != NULL, FALSE);
	if (panel_binding_is_emoji_lookup_table (self)) {
		IBusEmojier* _tmp0_;
		_tmp0_ = self->priv->m_emojier;
		ibus_emojier_key_press_cursor_vertical (_tmp0_, keyval, modifiers);
		panel_binding_convert_preedit_text (self);
		result = TRUE;
		return result;
	}
	result = FALSE;
	return result;
}


static gboolean
panel_binding_key_press_cursor_home_end (PanelBinding* self,
                                         guint keyval,
                                         guint modifiers)
{
	gboolean result = FALSE;
	g_return_val_if_fail (self != NULL, FALSE);
	if (panel_binding_is_emoji_lookup_table (self)) {
		IBusEmojier* _tmp0_;
		_tmp0_ = self->priv->m_emojier;
		ibus_emojier_key_press_cursor_home_end (_tmp0_, keyval, modifiers);
		panel_binding_convert_preedit_text (self);
		result = TRUE;
		return result;
	}
	result = FALSE;
	return result;
}


static gboolean
panel_binding_key_press_control_keyval (PanelBinding* self,
                                        guint keyval,
                                        guint modifiers)
{
	gboolean result = FALSE;
	gboolean show_candidate = FALSE;
	g_return_val_if_fail (self != NULL, FALSE);
	show_candidate = FALSE;
	switch (keyval) {
		case GDK_KEY_f:
		{
			show_candidate = panel_binding_key_press_cursor_horizontal (self, (guint) GDK_KEY_Right, modifiers);
			break;
		}
		case GDK_KEY_b:
		{
			show_candidate = panel_binding_key_press_cursor_horizontal (self, (guint) GDK_KEY_Left, modifiers);
			break;
		}
		case GDK_KEY_n:
		case GDK_KEY_N:
		{
			show_candidate = panel_binding_key_press_cursor_vertical (self, (guint) GDK_KEY_Down, modifiers);
			break;
		}
		case GDK_KEY_p:
		case GDK_KEY_P:
		{
			show_candidate = panel_binding_key_press_cursor_vertical (self, (guint) GDK_KEY_Up, modifiers);
			break;
		}
		case GDK_KEY_h:
		{
			show_candidate = panel_binding_key_press_cursor_home_end (self, (guint) GDK_KEY_Home, modifiers);
			break;
		}
		case GDK_KEY_e:
		{
			show_candidate = panel_binding_key_press_cursor_home_end (self, (guint) GDK_KEY_End, modifiers);
			break;
		}
		case GDK_KEY_u:
		{
			Preedit* _tmp0_;
			IBusEmojier* _tmp1_;
			_tmp0_ = self->priv->m_preedit;
			preedit_reset (_tmp0_);
			_tmp1_ = self->priv->m_emojier;
			ibus_emojier_set_annotation (_tmp1_, "");
			panel_binding_hide_emoji_lookup_table (self);
			break;
		}
		case GDK_KEY_C:
		case GDK_KEY_c:
		{
			if ((modifiers & GDK_SHIFT_MASK) != ((guint) 0)) {
				gboolean _tmp2_ = FALSE;
				gboolean _tmp3_ = FALSE;
				gboolean _tmp4_;
				_tmp4_ = self->priv->m_is_wayland;
				if (!_tmp4_) {
					IBusEmojier* _tmp5_;
					_tmp5_ = self->priv->m_emojier;
					_tmp3_ = _tmp5_ != NULL;
				} else {
					_tmp3_ = FALSE;
				}
				if (_tmp3_) {
					IBusEmojier* _tmp6_;
					_tmp6_ = self->priv->m_emojier;
					_tmp2_ = ibus_emojier_get_number_of_candidates (_tmp6_) > ((guint) 0);
				} else {
					_tmp2_ = FALSE;
				}
				if (_tmp2_) {
					gchar* text = NULL;
					IBusEmojier* _tmp7_;
					gchar* _tmp8_;
					GtkClipboard* clipboard = NULL;
					GtkClipboard* _tmp9_;
					GtkClipboard* _tmp10_;
					GtkClipboard* _tmp11_;
					const gchar* _tmp12_;
					GtkClipboard* _tmp13_;
					_tmp7_ = self->priv->m_emojier;
					_tmp8_ = ibus_emojier_get_current_candidate (_tmp7_);
					text = _tmp8_;
					_tmp9_ = gtk_clipboard_get (GDK_SELECTION_CLIPBOARD);
					_tmp10_ = _g_object_ref0 (_tmp9_);
					clipboard = _tmp10_;
					_tmp11_ = clipboard;
					_tmp12_ = text;
					gtk_clipboard_set_text (_tmp11_, _tmp12_, -1);
					_tmp13_ = clipboard;
					gtk_clipboard_store (_tmp13_);
					_g_object_unref0 (clipboard);
					_g_free0 (text);
				}
				show_candidate = panel_binding_is_emoji_lookup_table (self);
			}
			break;
		}
		default:
		{
			show_candidate = panel_binding_is_emoji_lookup_table (self);
			break;
		}
	}
	result = show_candidate;
	return result;
}


static void
panel_binding_hide_wayland_lookup_table (PanelBinding* self)
{
	IBusText* text = NULL;
	IBusText* _tmp0_;
	IBusLookupTable* _tmp1_;
	IBusLookupTable* _tmp2_;
	g_return_if_fail (self != NULL);
	self->priv->m_wayland_lookup_table_is_visible = FALSE;
	_tmp0_ = ibus_text_new_from_string ("");
	g_object_ref_sink (_tmp0_);
	text = _tmp0_;
	ibus_panel_service_update_auxiliary_text_received ((IBusPanelService*) self, text, FALSE);
	_tmp1_ = ibus_lookup_table_new ((guint) 1, (guint) 0, FALSE, TRUE);
	g_object_ref_sink (_tmp1_);
	_tmp2_ = _tmp1_;
	ibus_panel_service_update_lookup_table_received ((IBusPanelService*) self, _tmp2_, FALSE);
	_g_object_unref0 (_tmp2_);
	_g_object_unref0 (text);
}


static void
panel_binding_show_wayland_lookup_table (PanelBinding* self,
                                         IBusText* text)
{
	IBusLookupTable* table = NULL;
	IBusEmojier* _tmp0_;
	IBusLookupTable* _tmp1_;
	guint ncandidates = 0U;
	IBusLookupTable* _tmp2_;
	gboolean _tmp3_ = FALSE;
	guint _tmp4_;
	gboolean _tmp5_ = FALSE;
	guint _tmp6_;
	IBusLookupTable* _tmp7_;
	g_return_if_fail (self != NULL);
	g_return_if_fail (text != NULL);
	self->priv->m_wayland_lookup_table_is_visible = TRUE;
	_tmp0_ = self->priv->m_emojier;
	_tmp1_ = ibus_emojier_get_one_dimension_lookup_table (_tmp0_);
	table = _tmp1_;
	_tmp2_ = table;
	ncandidates = ibus_lookup_table_get_number_of_candidates (_tmp2_);
	_tmp4_ = ncandidates;
	if (_tmp4_ > ((guint) 0)) {
		_tmp3_ = TRUE;
	} else {
		_tmp3_ = FALSE;
	}
	ibus_panel_service_update_auxiliary_text_received ((IBusPanelService*) self, text, _tmp3_);
	_tmp6_ = ncandidates;
	if (_tmp6_ > ((guint) 0)) {
		_tmp5_ = TRUE;
	} else {
		_tmp5_ = FALSE;
	}
	_tmp7_ = table;
	ibus_panel_service_update_lookup_table_received ((IBusPanelService*) self, _tmp7_, _tmp5_);
	_g_object_unref0 (table);
}


static gboolean
panel_binding_is_visible_wayland_lookup_table (PanelBinding* self)
{
	gboolean result = FALSE;
	gboolean _tmp0_;
	g_return_val_if_fail (self != NULL, FALSE);
	_tmp0_ = self->priv->m_wayland_lookup_table_is_visible;
	result = _tmp0_;
	return result;
}


static void
panel_binding_hide_emoji_lookup_table (PanelBinding* self)
{
	IBusEmojier* _tmp0_;
	gboolean _tmp1_;
	g_return_if_fail (self != NULL);
	_tmp0_ = self->priv->m_emojier;
	if (_tmp0_ == NULL) {
		return;
	}
	_tmp1_ = self->priv->m_is_wayland;
	if (_tmp1_) {
		panel_binding_hide_wayland_lookup_table (self);
	} else {
		IBusEmojier* _tmp2_;
		_tmp2_ = self->priv->m_emojier;
		gtk_widget_hide ((GtkWidget*) _tmp2_);
	}
}


static void
panel_binding_show_emoji_lookup_table (PanelBinding* self)
{
	gboolean _tmp0_ = FALSE;
	gboolean _tmp1_;
	g_return_if_fail (self != NULL);
	_tmp1_ = self->priv->m_is_wayland;
	if (_tmp1_) {
		Preedit* _tmp2_;
		gchar* _tmp3_;
		gchar* _tmp4_;
		_tmp2_ = self->priv->m_preedit;
		_tmp3_ = preedit_get_text (_tmp2_);
		_tmp4_ = _tmp3_;
		_tmp0_ = g_strcmp0 (_tmp4_, "") != 0;
		_g_free0 (_tmp4_);
	} else {
		_tmp0_ = FALSE;
	}
	if (_tmp0_) {
		IBusText* text = NULL;
		IBusEmojier* _tmp5_;
		IBusText* _tmp6_;
		IBusText* _tmp7_;
		_tmp5_ = self->priv->m_emojier;
		_tmp6_ = ibus_emojier_get_title_text (_tmp5_);
		text = _tmp6_;
		_tmp7_ = text;
		panel_binding_show_wayland_lookup_table (self, _tmp7_);
		_g_object_unref0 (text);
	} else {
		gboolean _tmp8_;
		IBusEmojier* _tmp11_;
		_tmp8_ = self->priv->m_is_wayland;
		if (_tmp8_) {
			IBusEmojier* _tmp9_;
			const gchar* _tmp10_;
			_tmp9_ = self->priv->m_emojier;
			_tmp10_ = self->priv->m_real_current_context_path;
			ibus_emojier_set_input_context_path (_tmp9_, _tmp10_);
		}
		_tmp11_ = self->priv->m_emojier;
		gtk_widget_show_all ((GtkWidget*) _tmp11_);
	}
}


static gboolean
panel_binding_is_emoji_lookup_table (PanelBinding* self)
{
	gboolean result = FALSE;
	gboolean _tmp0_;
	g_return_val_if_fail (self != NULL, FALSE);
	_tmp0_ = self->priv->m_is_wayland;
	if (_tmp0_) {
		result = panel_binding_is_visible_wayland_lookup_table (self);
		return result;
	} else {
		IBusEmojier* _tmp1_;
		_tmp1_ = self->priv->m_emojier;
		result = gtk_widget_get_visible ((GtkWidget*) _tmp1_);
		return result;
	}
}


static void
panel_binding_show_preedit_and_candidate (PanelBinding* self,
                                          gboolean show_candidate)
{
	guint cursor_pos = 0U;
	Preedit* _tmp1_;
	IBusText* _tmp2_;
	IBusText* _tmp3_;
	guint _tmp4_;
	IBusEmojier* _tmp5_;
	g_return_if_fail (self != NULL);
	cursor_pos = (guint) 0;
	if (!show_candidate) {
		Preedit* _tmp0_;
		_tmp0_ = self->priv->m_preedit;
		cursor_pos = preedit_get_engine_preedit_cursor_pos (_tmp0_);
	}
	_tmp1_ = self->priv->m_preedit;
	_tmp2_ = preedit_get_engine_preedit_text (_tmp1_);
	_tmp3_ = _tmp2_;
	_tmp4_ = cursor_pos;
	ibus_panel_service_update_preedit_text_received ((IBusPanelService*) self, _tmp3_, _tmp4_, TRUE);
	_g_object_unref0 (_tmp3_);
	if (!show_candidate) {
		panel_binding_hide_emoji_lookup_table (self);
		return;
	}
	_tmp5_ = self->priv->m_emojier;
	if (_tmp5_ == NULL) {
		return;
	}
	panel_binding_show_emoji_lookup_table (self);
}


static void
panel_binding_real_focus_in (IBusPanelService* base,
                             const gchar* input_context_path)
{
	PanelBinding * self;
	gchar* _tmp0_;
	self = (PanelBinding*) base;
	g_return_if_fail (input_context_path != NULL);
	_tmp0_ = g_strdup (input_context_path);
	_g_free0 (self->priv->m_current_context_path);
	self->priv->m_current_context_path = _tmp0_;
	if (!g_str_has_suffix (input_context_path, "InputContext_1")) {
		const gchar* _tmp1_;
		gchar* _tmp2_;
		_tmp1_ = self->priv->m_current_context_path;
		_tmp2_ = g_strdup (_tmp1_);
		_g_free0 (self->priv->m_real_current_context_path);
		self->priv->m_real_current_context_path = _tmp2_;
		panel_binding_emojier_focus_commit (self);
	}
}


static void
panel_binding_real_focus_out (IBusPanelService* base,
                              const gchar* input_context_path)
{
	PanelBinding * self;
	gchar* _tmp0_;
	self = (PanelBinding*) base;
	g_return_if_fail (input_context_path != NULL);
	_tmp0_ = g_strdup ("");
	_g_free0 (self->priv->m_current_context_path);
	self->priv->m_current_context_path = _tmp0_;
}


static void
___lambda43_ (PanelBinding* self,
              guint i,
              guint b,
              guint s)
{
	gboolean _tmp0_;
	_tmp0_ = self->priv->m_is_wayland;
	if (!_tmp0_) {
		g_signal_emit_by_name ((IBusPanelService*) self, "candidate-clicked-lookup-table", i, b, s);
	}
}


static void
____lambda43__ibus_emojier_candidate_clicked (IBusEmojier* _sender,
                                              guint index,
                                              guint button,
                                              guint state,
                                              gpointer self)
{
	___lambda43_ ((PanelBinding*) self, index, button, state);
}


static void
panel_binding_real_panel_extension_received (IBusPanelService* base,
                                             IBusExtensionEvent* event)
{
	PanelBinding * self;
	const gchar* _tmp0_;
	gchar* _tmp1_;
	gboolean _tmp2_ = FALSE;
	const gchar* _tmp3_;
	gboolean _tmp11_;
	gboolean _tmp12_;
	gboolean _tmp13_;
	gboolean _tmp14_;
	gboolean _tmp15_ = FALSE;
	gboolean _tmp16_;
	IBusEmojier* _tmp18_;
	IBusEmojier* _tmp23_;
	IBusEmojier* _tmp24_;
	Preedit* _tmp25_;
	const gchar* _tmp26_;
	Preedit* _tmp27_;
	Preedit* _tmp28_;
	IBusText* _tmp29_;
	IBusText* _tmp30_;
	Preedit* _tmp31_;
	gchar* params = NULL;
	const gchar* _tmp32_;
	gchar* _tmp33_;
	const gchar* _tmp34_;
	self = (PanelBinding*) base;
	g_return_if_fail (event != NULL);
	_tmp0_ = ibus_extension_event_get_name (event);
	_tmp1_ = g_strdup (_tmp0_);
	_g_free0 (self->priv->m_extension_name);
	self->priv->m_extension_name = _tmp1_;
	_tmp3_ = self->priv->m_extension_name;
	if (g_strcmp0 (_tmp3_, "emoji") != 0) {
		const gchar* _tmp4_;
		_tmp4_ = self->priv->m_extension_name;
		_tmp2_ = g_strcmp0 (_tmp4_, "unicode") != 0;
	} else {
		_tmp2_ = FALSE;
	}
	if (_tmp2_) {
		gchar* format = NULL;
		gchar* _tmp5_;
		const gchar* _tmp6_;
		const gchar* _tmp7_;
		gchar* _tmp8_;
		gchar* _tmp9_;
		gchar* _tmp10_;
		_tmp5_ = g_strdup ("The name %s is not implemented in PanelExtension");
		format = _tmp5_;
		_tmp6_ = format;
		_tmp7_ = self->priv->m_extension_name;
		_tmp8_ = g_strdup_printf (_tmp6_, _tmp7_);
		_tmp9_ = _tmp8_;
		g_warning ("panelbinding.vala:787: %s", _tmp9_);
		_g_free0 (_tmp9_);
		_tmp10_ = g_strdup ("");
		_g_free0 (self->priv->m_extension_name);
		self->priv->m_extension_name = _tmp10_;
		_g_free0 (format);
		return;
	}
	g_object_get (event, "is-enabled", &_tmp11_, NULL);
	_tmp12_ = _tmp11_;
	self->priv->m_enable_extension = _tmp12_;
	_tmp13_ = self->priv->m_enable_extension;
	if (!_tmp13_) {
		panel_binding_hide_emoji_lookup_table (self);
		return;
	}
	_tmp14_ = self->priv->m_loaded_emoji;
	if (!_tmp14_) {
		panel_binding_set_emoji_lang (self);
	}
	_tmp16_ = self->priv->m_loaded_unicode;
	if (!_tmp16_) {
		gboolean _tmp17_;
		_tmp17_ = self->priv->m_loaded_emoji;
		_tmp15_ = _tmp17_;
	} else {
		_tmp15_ = FALSE;
	}
	if (_tmp15_) {
		ibus_emojier_load_unicode_dict ();
		self->priv->m_loaded_unicode = TRUE;
	}
	_tmp18_ = self->priv->m_emojier;
	if (_tmp18_ == NULL) {
		IBusEmojier* _tmp19_;
		GtkApplication* _tmp20_;
		IBusEmojier* _tmp21_;
		IBusEmojier* _tmp22_;
		_tmp19_ = ibus_emojier_new ();
		g_object_ref_sink (_tmp19_);
		_g_object_unref0 (self->priv->m_emojier);
		self->priv->m_emojier = _tmp19_;
		_tmp20_ = self->priv->m_application;
		_tmp21_ = self->priv->m_emojier;
		gtk_application_add_window (_tmp20_, (GtkWindow*) _tmp21_);
		_tmp22_ = self->priv->m_emojier;
		g_signal_connect_object (_tmp22_, "candidate-clicked", (GCallback) ____lambda43__ibus_emojier_candidate_clicked, self, 0);
	}
	_tmp23_ = self->priv->m_emojier;
	ibus_emojier_reset (_tmp23_);
	_tmp24_ = self->priv->m_emojier;
	ibus_emojier_set_annotation (_tmp24_, "");
	_tmp25_ = self->priv->m_preedit;
	_tmp26_ = self->priv->m_extension_name;
	preedit_set_extension_name (_tmp25_, _tmp26_);
	_tmp27_ = self->priv->m_preedit;
	preedit_reset (_tmp27_);
	_tmp28_ = self->priv->m_preedit;
	_tmp29_ = preedit_get_engine_preedit_text (_tmp28_);
	_tmp30_ = _tmp29_;
	_tmp31_ = self->priv->m_preedit;
	ibus_panel_service_update_preedit_text_received ((IBusPanelService*) self, _tmp30_, preedit_get_engine_preedit_cursor_pos (_tmp31_), TRUE);
	_g_object_unref0 (_tmp30_);
	_tmp32_ = ibus_extension_event_get_params (event);
	_tmp33_ = g_strdup (_tmp32_);
	params = _tmp33_;
	_tmp34_ = params;
	if (g_strcmp0 (_tmp34_, "category-list") == 0) {
		panel_binding_key_press_space (self);
		panel_binding_show_preedit_and_candidate (self, TRUE);
	}
	_g_free0 (params);
}


static void
panel_binding_real_set_cursor_location (IBusPanelService* base,
                                        gint x,
                                        gint y,
                                        gint width,
                                        gint height)
{
	PanelBinding * self;
	IBusEmojier* _tmp0_;
	self = (PanelBinding*) base;
	_tmp0_ = self->priv->m_emojier;
	if (_tmp0_ != NULL) {
		IBusEmojier* _tmp1_;
		_tmp1_ = self->priv->m_emojier;
		ibus_emojier_set_cursor_location (_tmp1_, x, y, width, height);
	}
}


static void
panel_binding_real_update_preedit_text (IBusPanelService* base,
                                        IBusText* text,
                                        guint cursor_pos,
                                        gboolean visible)
{
	PanelBinding * self;
	Preedit* _tmp0_;
	Preedit* _tmp3_;
	Preedit* _tmp4_;
	IBusText* _tmp5_;
	IBusText* _tmp6_;
	Preedit* _tmp7_;
	self = (PanelBinding*) base;
	g_return_if_fail (text != NULL);
	_tmp0_ = self->priv->m_preedit;
	preedit_set_engine_preedit_text (_tmp0_, text);
	if (visible) {
		Preedit* _tmp1_;
		_tmp1_ = self->priv->m_preedit;
		preedit_show_engine_preedit_text (_tmp1_);
	} else {
		Preedit* _tmp2_;
		_tmp2_ = self->priv->m_preedit;
		preedit_hide_engine_preedit_text (_tmp2_);
	}
	_tmp3_ = self->priv->m_preedit;
	preedit_set_engine_preedit_cursor_pos (_tmp3_, cursor_pos);
	_tmp4_ = self->priv->m_preedit;
	_tmp5_ = preedit_get_engine_preedit_text (_tmp4_);
	_tmp6_ = _tmp5_;
	_tmp7_ = self->priv->m_preedit;
	ibus_panel_service_update_preedit_text_received ((IBusPanelService*) self, _tmp6_, preedit_get_engine_preedit_cursor_pos (_tmp7_), visible);
	_g_object_unref0 (_tmp6_);
}


static void
panel_binding_real_show_preedit_text (IBusPanelService* base)
{
	PanelBinding * self;
	Preedit* _tmp0_;
	self = (PanelBinding*) base;
	_tmp0_ = self->priv->m_preedit;
	preedit_show_engine_preedit_text (_tmp0_);
	panel_binding_show_preedit_and_candidate (self, FALSE);
}


static void
panel_binding_real_hide_preedit_text (IBusPanelService* base)
{
	PanelBinding * self;
	Preedit* _tmp0_;
	self = (PanelBinding*) base;
	_tmp0_ = self->priv->m_preedit;
	preedit_hide_engine_preedit_text (_tmp0_);
	panel_binding_show_preedit_and_candidate (self, FALSE);
}


static gchar*
g_unichar_to_string (gunichar self)
{
	gchar* result = NULL;
	gchar* str = NULL;
	gchar* _tmp0_;
	const gchar* _tmp1_;
	_tmp0_ = g_new0 (gchar, 7);
	str = (gchar*) _tmp0_;
	_tmp1_ = str;
	g_unichar_to_utf8 (self, _tmp1_);
	result = str;
	return result;
}


static gboolean
panel_binding_real_process_key_event (IBusPanelService* base,
                                      guint keyval,
                                      guint keycode,
                                      guint state)
{
	PanelBinding * self;
	gboolean result = FALSE;
	guint modifiers = 0U;
	gboolean show_candidate = FALSE;
	gboolean _tmp44_;
	self = (PanelBinding*) base;
	if ((state & IBUS_RELEASE_MASK) != ((guint) 0)) {
		result = FALSE;
		return result;
	}
	modifiers = state;
	show_candidate = FALSE;
	switch (keyval) {
		case GDK_KEY_Escape:
		{
			Preedit* _tmp0_;
			show_candidate = panel_binding_key_press_escape (self);
			_tmp0_ = self->priv->m_preedit;
			if (!preedit_is_shown (_tmp0_)) {
				result = TRUE;
				return result;
			}
			break;
		}
		case GDK_KEY_Return:
		case GDK_KEY_KP_Enter:
		{
			const gchar* _tmp1_;
			Preedit* _tmp2_;
			_tmp1_ = self->priv->m_extension_name;
			if (g_strcmp0 (_tmp1_, "unicode") == 0) {
				panel_binding_key_press_space (self);
			}
			show_candidate = panel_binding_key_press_enter (self);
			_tmp2_ = self->priv->m_preedit;
			if (!preedit_is_shown (_tmp2_)) {
				panel_binding_hide_emoji_lookup_table (self);
				result = TRUE;
				return result;
			}
			break;
		}
		case GDK_KEY_BackSpace:
		{
			Preedit* _tmp3_;
			gchar* annotation = NULL;
			Preedit* _tmp4_;
			gchar* _tmp5_;
			gboolean _tmp6_ = FALSE;
			const gchar* _tmp7_;
			IBusEmojier* _tmp9_;
			const gchar* _tmp10_;
			_tmp3_ = self->priv->m_preedit;
			preedit_backspace (_tmp3_);
			_tmp4_ = self->priv->m_preedit;
			_tmp5_ = preedit_get_text (_tmp4_);
			annotation = _tmp5_;
			_tmp7_ = annotation;
			if (g_strcmp0 (_tmp7_, "") == 0) {
				const gchar* _tmp8_;
				_tmp8_ = self->priv->m_extension_name;
				_tmp6_ = g_strcmp0 (_tmp8_, "unicode") == 0;
			} else {
				_tmp6_ = FALSE;
			}
			if (_tmp6_) {
				panel_binding_key_press_escape (self);
				result = TRUE;
				_g_free0 (annotation);
				return result;
			}
			_tmp9_ = self->priv->m_emojier;
			_tmp10_ = annotation;
			ibus_emojier_set_annotation (_tmp9_, _tmp10_);
			_g_free0 (annotation);
			break;
		}
		case GDK_KEY_space:
		case GDK_KEY_KP_Space:
		{
			const gchar* _tmp11_;
			show_candidate = panel_binding_key_press_space (self);
			_tmp11_ = self->priv->m_extension_name;
			if (g_strcmp0 (_tmp11_, "unicode") == 0) {
				panel_binding_key_press_enter (self);
				result = TRUE;
				return result;
			}
			break;
		}
		case GDK_KEY_Right:
		case GDK_KEY_KP_Right:
		{
			gboolean _tmp12_;
			_tmp12_ = self->priv->m_is_wayland;
			if (_tmp12_) {
				guint _tmp13_;
				_tmp13_ = modifiers;
				show_candidate = panel_binding_key_press_cursor_vertical (self, (guint) GDK_KEY_Down, _tmp13_);
			} else {
				guint _tmp14_;
				_tmp14_ = modifiers;
				show_candidate = panel_binding_key_press_cursor_horizontal (self, (guint) GDK_KEY_Right, _tmp14_);
			}
			break;
		}
		case GDK_KEY_Left:
		case GDK_KEY_KP_Left:
		{
			gboolean _tmp15_;
			_tmp15_ = self->priv->m_is_wayland;
			if (_tmp15_) {
				guint _tmp16_;
				_tmp16_ = modifiers;
				show_candidate = panel_binding_key_press_cursor_vertical (self, (guint) GDK_KEY_Up, _tmp16_);
			} else {
				guint _tmp17_;
				_tmp17_ = modifiers;
				show_candidate = panel_binding_key_press_cursor_horizontal (self, (guint) GDK_KEY_Left, _tmp17_);
			}
			break;
		}
		case GDK_KEY_Down:
		case GDK_KEY_KP_Down:
		{
			gboolean _tmp18_;
			_tmp18_ = self->priv->m_is_wayland;
			if (_tmp18_) {
				guint _tmp19_;
				_tmp19_ = modifiers;
				show_candidate = panel_binding_key_press_cursor_horizontal (self, (guint) GDK_KEY_Right, _tmp19_);
			} else {
				guint _tmp20_;
				_tmp20_ = modifiers;
				show_candidate = panel_binding_key_press_cursor_vertical (self, (guint) GDK_KEY_Down, _tmp20_);
			}
			break;
		}
		case GDK_KEY_Up:
		case GDK_KEY_KP_Up:
		{
			gboolean _tmp21_;
			_tmp21_ = self->priv->m_is_wayland;
			if (_tmp21_) {
				guint _tmp22_;
				_tmp22_ = modifiers;
				show_candidate = panel_binding_key_press_cursor_horizontal (self, (guint) GDK_KEY_Left, _tmp22_);
			} else {
				guint _tmp23_;
				_tmp23_ = modifiers;
				show_candidate = panel_binding_key_press_cursor_vertical (self, (guint) GDK_KEY_Up, _tmp23_);
			}
			break;
		}
		case GDK_KEY_Page_Down:
		case GDK_KEY_KP_Page_Down:
		{
			gboolean _tmp24_;
			_tmp24_ = self->priv->m_is_wayland;
			if (_tmp24_) {
				guint _tmp25_;
				_tmp25_ = modifiers;
				show_candidate = panel_binding_key_press_cursor_vertical (self, (guint) GDK_KEY_Down, _tmp25_);
			} else {
				guint _tmp26_;
				_tmp26_ = modifiers;
				show_candidate = panel_binding_key_press_cursor_vertical (self, (guint) GDK_KEY_Page_Down, _tmp26_);
			}
			break;
		}
		case GDK_KEY_Page_Up:
		case GDK_KEY_KP_Page_Up:
		{
			gboolean _tmp27_;
			_tmp27_ = self->priv->m_is_wayland;
			if (_tmp27_) {
				guint _tmp28_;
				_tmp28_ = modifiers;
				show_candidate = panel_binding_key_press_cursor_vertical (self, (guint) GDK_KEY_Up, _tmp28_);
			} else {
				guint _tmp29_;
				_tmp29_ = modifiers;
				show_candidate = panel_binding_key_press_cursor_vertical (self, (guint) GDK_KEY_Page_Up, _tmp29_);
			}
			break;
		}
		case GDK_KEY_Home:
		case GDK_KEY_KP_Home:
		{
			guint _tmp30_;
			_tmp30_ = modifiers;
			show_candidate = panel_binding_key_press_cursor_home_end (self, (guint) GDK_KEY_Home, _tmp30_);
			break;
		}
		case GDK_KEY_End:
		case GDK_KEY_KP_End:
		{
			guint _tmp31_;
			_tmp31_ = modifiers;
			show_candidate = panel_binding_key_press_cursor_home_end (self, (guint) GDK_KEY_End, _tmp31_);
			break;
		}
		default:
		{
			guint _tmp32_;
			gunichar ch = 0U;
			gunichar _tmp34_;
			gchar* str = NULL;
			gunichar _tmp35_;
			gchar* _tmp36_;
			Preedit* _tmp37_;
			const gchar* _tmp38_;
			gchar* annotation = NULL;
			Preedit* _tmp39_;
			gchar* _tmp40_;
			IBusEmojier* _tmp41_;
			const gchar* _tmp42_;
			Preedit* _tmp43_;
			_tmp32_ = modifiers;
			if ((_tmp32_ & GDK_CONTROL_MASK) != ((guint) 0)) {
				guint _tmp33_;
				_tmp33_ = modifiers;
				show_candidate = panel_binding_key_press_control_keyval (self, keyval, _tmp33_);
				break;
			}
			ch = ibus_keyval_to_unicode (keyval);
			_tmp34_ = ch;
			if (g_unichar_iscntrl (_tmp34_)) {
				result = TRUE;
				return result;
			}
			_tmp35_ = ch;
			_tmp36_ = g_unichar_to_string (_tmp35_);
			str = _tmp36_;
			_tmp37_ = self->priv->m_preedit;
			_tmp38_ = str;
			preedit_append_text (_tmp37_, _tmp38_);
			_tmp39_ = self->priv->m_preedit;
			_tmp40_ = preedit_get_text (_tmp39_);
			annotation = _tmp40_;
			_tmp41_ = self->priv->m_emojier;
			_tmp42_ = annotation;
			ibus_emojier_set_annotation (_tmp41_, _tmp42_);
			_tmp43_ = self->priv->m_preedit;
			preedit_set_emoji (_tmp43_, "");
			show_candidate = panel_binding_is_emoji_lookup_table (self);
			_g_free0 (annotation);
			_g_free0 (str);
			break;
		}
	}
	_tmp44_ = show_candidate;
	panel_binding_show_preedit_and_candidate (self, _tmp44_);
	result = TRUE;
	return result;
}


static void
panel_binding_real_commit_text_received (IBusPanelService* base,
                                         IBusText* text)
{
	PanelBinding * self;
	const gchar* str = NULL;
	const gchar* _tmp0_;
	const gchar* _tmp1_;
	Preedit* _tmp2_;
	const gchar* _tmp3_;
	Preedit* _tmp4_;
	gchar* annotation = NULL;
	Preedit* _tmp5_;
	gchar* _tmp6_;
	IBusEmojier* _tmp7_;
	const gchar* _tmp8_;
	self = (PanelBinding*) base;
	g_return_if_fail (text != NULL);
	_tmp0_ = text->text;
	str = _tmp0_;
	_tmp1_ = str;
	if (_tmp1_ == NULL) {
		return;
	}
	_tmp2_ = self->priv->m_preedit;
	_tmp3_ = str;
	preedit_append_text (_tmp2_, _tmp3_);
	_tmp4_ = self->priv->m_preedit;
	preedit_set_emoji (_tmp4_, "");
	_tmp5_ = self->priv->m_preedit;
	_tmp6_ = preedit_get_text (_tmp5_);
	annotation = _tmp6_;
	_tmp7_ = self->priv->m_emojier;
	_tmp8_ = annotation;
	ibus_emojier_set_annotation (_tmp7_, _tmp8_);
	panel_binding_show_preedit_and_candidate (self, FALSE);
	_g_free0 (annotation);
}


static void
panel_binding_real_page_up_lookup_table (IBusPanelService* base)
{
	PanelBinding * self;
	gboolean show_candidate = FALSE;
	self = (PanelBinding*) base;
	show_candidate = panel_binding_key_press_cursor_vertical (self, (guint) GDK_KEY_Up, (guint) 0);
	panel_binding_show_preedit_and_candidate (self, show_candidate);
}


static void
panel_binding_real_page_down_lookup_table (IBusPanelService* base)
{
	PanelBinding * self;
	gboolean show_candidate = FALSE;
	self = (PanelBinding*) base;
	show_candidate = panel_binding_key_press_cursor_vertical (self, (guint) GDK_KEY_Down, (guint) 0);
	panel_binding_show_preedit_and_candidate (self, show_candidate);
}


static void
panel_binding_real_cursor_up_lookup_table (IBusPanelService* base)
{
	PanelBinding * self;
	gboolean show_candidate = FALSE;
	self = (PanelBinding*) base;
	show_candidate = panel_binding_key_press_cursor_horizontal (self, (guint) GDK_KEY_Left, (guint) 0);
	panel_binding_show_preedit_and_candidate (self, show_candidate);
}


static void
panel_binding_real_cursor_down_lookup_table (IBusPanelService* base)
{
	PanelBinding * self;
	gboolean show_candidate = FALSE;
	self = (PanelBinding*) base;
	show_candidate = panel_binding_key_press_cursor_horizontal (self, (guint) GDK_KEY_Right, (guint) 0);
	panel_binding_show_preedit_and_candidate (self, show_candidate);
}


static void
panel_binding_real_candidate_clicked_lookup_table (IBusPanelService* base,
                                                   guint index,
                                                   guint button,
                                                   guint state)
{
	PanelBinding * self;
	IBusEmojier* _tmp5_;
	gboolean show_candidate = FALSE;
	guint ncandidates = 0U;
	IBusEmojier* _tmp6_;
	gboolean _tmp7_ = FALSE;
	guint _tmp8_;
	gboolean _tmp16_;
	gboolean _tmp20_;
	self = (PanelBinding*) base;
	if (button == IBUS_EMOJIER_BUTTON_CLOSE_BUTTON) {
		Preedit* _tmp0_;
		IBusExtensionEvent* event = NULL;
		const gchar* _tmp1_;
		IBusExtensionEvent* _tmp2_;
		IBusExtensionEvent* _tmp3_;
		IBusExtensionEvent* _tmp4_;
		self->priv->m_enable_extension = FALSE;
		panel_binding_hide_emoji_lookup_table (self);
		_tmp0_ = self->priv->m_preedit;
		preedit_hide (_tmp0_);
		_tmp1_ = self->priv->m_extension_name;
		_tmp2_ = ibus_extension_event_new ("name", _tmp1_, "is-enabled", FALSE, "is-extension", TRUE, NULL);
		g_object_ref_sink (_tmp2_);
		event = _tmp2_;
		_tmp3_ = event;
		_tmp4_ = _g_object_ref0 (_tmp3_);
		ibus_panel_service_panel_extension ((IBusPanelService*) self, _tmp4_);
		_g_object_unref0 (event);
		return;
	}
	_tmp5_ = self->priv->m_emojier;
	if (_tmp5_ == NULL) {
		return;
	}
	show_candidate = FALSE;
	_tmp6_ = self->priv->m_emojier;
	ncandidates = ibus_emojier_get_number_of_candidates (_tmp6_);
	_tmp8_ = ncandidates;
	if (_tmp8_ > ((guint) 0)) {
		guint _tmp9_;
		_tmp9_ = ncandidates;
		_tmp7_ = _tmp9_ >= index;
	} else {
		_tmp7_ = FALSE;
	}
	if (_tmp7_) {
		IBusEmojier* _tmp10_;
		IBusEmojier* _tmp11_;
		Preedit* _tmp12_;
		IBusEmojier* _tmp13_;
		gchar* _tmp14_;
		gchar* _tmp15_;
		_tmp10_ = self->priv->m_emojier;
		ibus_emojier_set_cursor_pos (_tmp10_, index);
		_tmp11_ = self->priv->m_emojier;
		show_candidate = ibus_emojier_has_variants (_tmp11_, index);
		_tmp12_ = self->priv->m_preedit;
		_tmp13_ = self->priv->m_emojier;
		_tmp14_ = ibus_emojier_get_current_candidate (_tmp13_);
		_tmp15_ = _tmp14_;
		preedit_set_emoji (_tmp12_, _tmp15_);
		_g_free0 (_tmp15_);
	} else {
		return;
	}
	_tmp16_ = show_candidate;
	if (!_tmp16_) {
		IBusText* text = NULL;
		Preedit* _tmp17_;
		IBusText* _tmp18_;
		IBusText* _tmp19_;
		_tmp17_ = self->priv->m_preedit;
		_tmp18_ = preedit_get_commit_text (_tmp17_);
		text = _tmp18_;
		_tmp19_ = text;
		panel_binding_commit_text_update_favorites (self, _tmp19_);
		panel_binding_hide_emoji_lookup_table (self);
		_g_object_unref0 (text);
		return;
	}
	_tmp20_ = show_candidate;
	panel_binding_show_preedit_and_candidate (self, _tmp20_);
}


static void
panel_binding_class_init (PanelBindingClass * klass)
{
	panel_binding_parent_class = g_type_class_peek_parent (klass);
	g_type_class_add_private (klass, sizeof (PanelBindingPrivate));
	((IBusPanelServiceClass *) klass)->focus_in = (void (*) (IBusPanelService *, const gchar*)) panel_binding_real_focus_in;
	((IBusPanelServiceClass *) klass)->focus_out = (void (*) (IBusPanelService *, const gchar*)) panel_binding_real_focus_out;
	((IBusPanelServiceClass *) klass)->panel_extension_received = (void (*) (IBusPanelService *, IBusExtensionEvent*)) panel_binding_real_panel_extension_received;
	((IBusPanelServiceClass *) klass)->set_cursor_location = (void (*) (IBusPanelService *, gint, gint, gint, gint)) panel_binding_real_set_cursor_location;
	((IBusPanelServiceClass *) klass)->update_preedit_text = (void (*) (IBusPanelService *, IBusText*, guint, gboolean)) panel_binding_real_update_preedit_text;
	((IBusPanelServiceClass *) klass)->show_preedit_text = (void (*) (IBusPanelService *)) panel_binding_real_show_preedit_text;
	((IBusPanelServiceClass *) klass)->hide_preedit_text = (void (*) (IBusPanelService *)) panel_binding_real_hide_preedit_text;
	((IBusPanelServiceClass *) klass)->process_key_event = (gboolean (*) (IBusPanelService *, guint, guint, guint)) panel_binding_real_process_key_event;
	((IBusPanelServiceClass *) klass)->commit_text_received = (void (*) (IBusPanelService *, IBusText*)) panel_binding_real_commit_text_received;
	((IBusPanelServiceClass *) klass)->page_up_lookup_table = (void (*) (IBusPanelService *)) panel_binding_real_page_up_lookup_table;
	((IBusPanelServiceClass *) klass)->page_down_lookup_table = (void (*) (IBusPanelService *)) panel_binding_real_page_down_lookup_table;
	((IBusPanelServiceClass *) klass)->cursor_up_lookup_table = (void (*) (IBusPanelService *)) panel_binding_real_cursor_up_lookup_table;
	((IBusPanelServiceClass *) klass)->cursor_down_lookup_table = (void (*) (IBusPanelService *)) panel_binding_real_cursor_down_lookup_table;
	((IBusPanelServiceClass *) klass)->candidate_clicked_lookup_table = (void (*) (IBusPanelService *, guint, guint, guint)) panel_binding_real_candidate_clicked_lookup_table;
	G_OBJECT_CLASS (klass)->finalize = panel_binding_finalize;
}


static void
panel_binding_instance_init (PanelBinding * self)
{
	gchar* _tmp0_;
	gchar* _tmp1_;
	gchar** _tmp2_;
	gchar* _tmp3_;
	self->priv = PANEL_BINDING_GET_PRIVATE (self);
	self->priv->m_settings_panel = NULL;
	self->priv->m_settings_emoji = NULL;
	_tmp0_ = g_strdup ("");
	self->priv->m_current_context_path = _tmp0_;
	_tmp1_ = g_strdup ("");
	self->priv->m_real_current_context_path = _tmp1_;
	_tmp2_ = g_new0 (gchar*, 0 + 1);
	self->priv->m_emojier_favorites = _tmp2_;
	self->priv->m_emojier_favorites_length1 = 0;
	self->priv->_m_emojier_favorites_size_ = self->priv->m_emojier_favorites_length1;
	self->priv->m_loaded_emoji = FALSE;
	self->priv->m_loaded_unicode = FALSE;
	_tmp3_ = g_strdup ("");
	self->priv->m_extension_name = _tmp3_;
	memset (&self->priv->m_key_event_data, 0, sizeof (IBusProcessKeyEventData));
}


static void
panel_binding_finalize (GObject * obj)
{
	PanelBinding * self;
	self = G_TYPE_CHECK_INSTANCE_CAST (obj, TYPE_PANEL_BINDING, PanelBinding);
	_g_object_unref0 (self->priv->m_bus);
	_g_object_unref0 (self->priv->m_application);
	_g_object_unref0 (self->priv->m_settings_panel);
	_g_object_unref0 (self->priv->m_settings_emoji);
	_g_free0 (self->priv->m_current_context_path);
	_g_free0 (self->priv->m_real_current_context_path);
	_g_object_unref0 (self->priv->m_emojier);
	self->priv->m_emojier_favorites = (_vala_array_free (self->priv->m_emojier_favorites, self->priv->m_emojier_favorites_length1, (GDestroyNotify) g_free), NULL);
	_g_object_unref0 (self->priv->m_css_provider);
	_g_free0 (self->priv->m_extension_name);
	_g_object_unref0 (self->priv->m_preedit);
	G_OBJECT_CLASS (panel_binding_parent_class)->finalize (obj);
}


GType
panel_binding_get_type (void)
{
	static volatile gsize panel_binding_type_id__volatile = 0;
	if (g_once_init_enter (&panel_binding_type_id__volatile)) {
		static const GTypeInfo g_define_type_info = { sizeof (PanelBindingClass), (GBaseInitFunc) NULL, (GBaseFinalizeFunc) NULL, (GClassInitFunc) panel_binding_class_init, (GClassFinalizeFunc) NULL, NULL, sizeof (PanelBinding), 0, (GInstanceInitFunc) panel_binding_instance_init, NULL };
		GType panel_binding_type_id;
		panel_binding_type_id = g_type_register_static (ibus_panel_service_get_type (), "PanelBinding", &g_define_type_info, 0);
		g_once_init_leave (&panel_binding_type_id__volatile, panel_binding_type_id);
	}
	return panel_binding_type_id__volatile;
}


static void
_vala_array_destroy (gpointer array,
                     gint array_length,
                     GDestroyNotify destroy_func)
{
	if ((array != NULL) && (destroy_func != NULL)) {
		int i;
		for (i = 0; i < array_length; i = i + 1) {
			if (((gpointer*) array)[i] != NULL) {
				destroy_func (((gpointer*) array)[i]);
			}
		}
	}
}


static void
_vala_array_free (gpointer array,
                  gint array_length,
                  GDestroyNotify destroy_func)
{
	_vala_array_destroy (array, array_length, destroy_func);
	g_free (array);
}


static gint
_vala_array_length (gpointer array)
{
	int length;
	length = 0;
	if (array) {
		while (((gpointer*) array)[length]) {
			length++;
		}
	}
	return length;
}