Blame libxklavier/xklavier.c

Packit Service 93d855
/*
Packit Service 93d855
 * Copyright (C) 2002-2006 Sergey V. Udaltsov <svu@gnome.org>
Packit Service 93d855
 *
Packit Service 93d855
 * This library is free software; you can redistribute it and/or
Packit Service 93d855
 * modify it under the terms of the GNU Lesser General Public
Packit Service 93d855
 * License as published by the Free Software Foundation; either
Packit Service 93d855
 * version 2 of the License, or (at your option) any later version.
Packit Service 93d855
 *
Packit Service 93d855
 * This library is distributed in the hope that it will be useful,
Packit Service 93d855
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
Packit Service 93d855
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
Packit Service 93d855
 * Lesser General Public License for more details.
Packit Service 93d855
 *
Packit Service 93d855
 * You should have received a copy of the GNU Lesser General Public
Packit Service 93d855
 * License along with this library; if not, write to the
Packit Service 93d855
 * Free Software Foundation, Inc., 59 Temple Place - Suite 330,
Packit Service 93d855
 * Boston, MA 02111-1307, USA.
Packit Service 93d855
 */
Packit Service 93d855
Packit Service 93d855
#include <string.h>
Packit Service 93d855
#include <time.h>
Packit Service 93d855
Packit Service 93d855
#include <X11/Xatom.h>
Packit Service 93d855
#include <X11/Xlib.h>
Packit Service 93d855
#include <X11/Xutil.h>
Packit Service 93d855
#include <X11/Xmd.h>
Packit Service 93d855
Packit Service 93d855
#include "xklavier_private.h"
Packit Service 93d855
#include "xkl_engine_marshal.h"
Packit Service 93d855
Packit Service 93d855
static GObjectClass *parent_class = NULL;
Packit Service 93d855
Packit Service 93d855
static XklEngine *the_engine = NULL;
Packit Service 93d855
Packit Service 93d855
gint xkl_debug_level = 0;
Packit Service 93d855
Packit Service 93d855
static XklLogAppender log_appender = xkl_default_log_appender;
Packit Service 93d855
Packit Service 93d855
const gchar *xkl_last_error_message;
Packit Service 93d855
Packit Service 93d855
enum {
Packit Service 93d855
	PROP_0,
Packit Service 93d855
	PROP_DISPLAY,
Packit Service 93d855
	PROP_BACKEND_NAME,
Packit Service 93d855
	PROP_FEATURES,
Packit Service 93d855
	PROP_MAX_NUM_GROUPS,
Packit Service 93d855
	PROP_NUM_GROUPS,
Packit Service 93d855
	PROP_DEFAULT_GROUP,
Packit Service 93d855
	PROP_SECONDARY_GROUPS_MASK,
Packit Service 93d855
	PROP_INDICATORS_HANDLING,
Packit Service 93d855
};
Packit Service 93d855
Packit Service 93d855
void
Packit Service 93d855
xkl_engine_set_indicators_handling(XklEngine * engine,
Packit Service 93d855
				   gboolean whether_handle)
Packit Service 93d855
{
Packit Service 93d855
	xkl_engine_priv(engine, handle_indicators) = whether_handle;
Packit Service 93d855
}
Packit Service 93d855
Packit Service 93d855
gboolean
Packit Service 93d855
xkl_engine_get_indicators_handling(XklEngine * engine)
Packit Service 93d855
{
Packit Service 93d855
	return xkl_engine_priv(engine, handle_indicators);
Packit Service 93d855
}
Packit Service 93d855
Packit Service 93d855
void
Packit Service 93d855
xkl_set_debug_level(int level)
Packit Service 93d855
{
Packit Service 93d855
	xkl_debug_level = level;
Packit Service 93d855
}
Packit Service 93d855
Packit Service 93d855
void
Packit Service 93d855
xkl_engine_set_group_per_toplevel_window(XklEngine * engine,
Packit Service 93d855
					 gboolean is_set)
Packit Service 93d855
{
Packit Service 93d855
	xkl_engine_priv(engine, group_per_toplevel_window) = is_set;
Packit Service 93d855
}
Packit Service 93d855
Packit Service 93d855
gboolean
Packit Service 93d855
xkl_engine_is_group_per_toplevel_window(XklEngine * engine)
Packit Service 93d855
{
Packit Service 93d855
	return xkl_engine_priv(engine, group_per_toplevel_window);
Packit Service 93d855
}
Packit Service 93d855
Packit Service 93d855
static void
Packit Service 93d855
xkl_engine_set_switch_to_secondary_group(XklEngine * engine, gboolean val)
Packit Service 93d855
{
Packit Service 93d855
	gulong propval = (gulong) val == TRUE;
Packit Service 93d855
	Display *dpy = xkl_engine_get_display(engine);
Packit Service 93d855
	XChangeProperty(dpy,
Packit Service 93d855
			xkl_engine_priv(engine, root_window),
Packit Service 93d855
			xkl_engine_priv(engine,
Packit Service 93d855
					atoms)[XKLAVIER_ALLOW_SECONDARY],
Packit Service 93d855
			XA_INTEGER, 32, PropModeReplace,
Packit Service 93d855
			(unsigned char *) &propval, 1);
Packit Service 93d855
	XSync(dpy, False);
Packit Service 93d855
}
Packit Service 93d855
Packit Service 93d855
void
Packit Service 93d855
xkl_engine_allow_one_switch_to_secondary_group(XklEngine * engine)
Packit Service 93d855
{
Packit Service 93d855
	xkl_debug(150,
Packit Service 93d855
		  "Setting allow_one_switch_to_secondary_group flag\n");
Packit Service 93d855
	xkl_engine_set_switch_to_secondary_group(engine, TRUE);
Packit Service 93d855
}
Packit Service 93d855
Packit Service 93d855
gboolean
Packit Service 93d855
xkl_engine_is_one_switch_to_secondary_group_allowed(XklEngine * engine)
Packit Service 93d855
{
Packit Service 93d855
	gboolean rv = FALSE;
Packit Service 93d855
	unsigned char *propval = NULL;
Packit Service 93d855
	Atom actual_type;
Packit Service 93d855
	int actual_format;
Packit Service 93d855
	unsigned long bytes_remaining;
Packit Service 93d855
	unsigned long actual_items;
Packit Service 93d855
	int result;
Packit Service 93d855
Packit Service 93d855
	result =
Packit Service 93d855
	    XGetWindowProperty(xkl_engine_get_display(engine),
Packit Service 93d855
			       xkl_engine_priv(engine, root_window),
Packit Service 93d855
			       xkl_engine_priv(engine, atoms)
Packit Service 93d855
			       [XKLAVIER_ALLOW_SECONDARY], 0L, 1L, False,
Packit Service 93d855
			       XA_INTEGER, &actual_type, &actual_format,
Packit Service 93d855
			       &actual_items, &bytes_remaining, &propval);
Packit Service 93d855
Packit Service 93d855
	if (Success == result) {
Packit Service 93d855
		if (actual_format == 32 && actual_items == 1) {
Packit Service 93d855
			rv = (gboolean) * (Bool *) propval;
Packit Service 93d855
		}
Packit Service 93d855
		XFree(propval);
Packit Service 93d855
	}
Packit Service 93d855
Packit Service 93d855
	return rv;
Packit Service 93d855
}
Packit Service 93d855
Packit Service 93d855
void
Packit Service 93d855
xkl_engine_one_switch_to_secondary_group_performed(XklEngine * engine)
Packit Service 93d855
{
Packit Service 93d855
	xkl_debug(150,
Packit Service 93d855
		  "Resetting allow_one_switch_to_secondary_group flag\n");
Packit Service 93d855
	xkl_engine_set_switch_to_secondary_group(engine, FALSE);
Packit Service 93d855
}
Packit Service 93d855
Packit Service 93d855
void
Packit Service 93d855
xkl_engine_set_default_group(XklEngine * engine, gint group)
Packit Service 93d855
{
Packit Service 93d855
	xkl_engine_priv(engine, default_group) = group;
Packit Service 93d855
}
Packit Service 93d855
Packit Service 93d855
gint
Packit Service 93d855
xkl_engine_get_default_group(XklEngine * engine)
Packit Service 93d855
{
Packit Service 93d855
	return xkl_engine_priv(engine, default_group);
Packit Service 93d855
}
Packit Service 93d855
Packit Service 93d855
void
Packit Service 93d855
xkl_engine_set_secondary_groups_mask(XklEngine * engine, guint mask)
Packit Service 93d855
{
Packit Service 93d855
	xkl_engine_priv(engine, secondary_groups_mask) = mask;
Packit Service 93d855
}
Packit Service 93d855
Packit Service 93d855
guint
Packit Service 93d855
xkl_engine_get_secondary_groups_mask(XklEngine * engine)
Packit Service 93d855
{
Packit Service 93d855
	return xkl_engine_priv(engine, secondary_groups_mask);
Packit Service 93d855
}
Packit Service 93d855
Packit Service 93d855
void
Packit Service 93d855
xkl_set_log_appender(XklLogAppender func)
Packit Service 93d855
{
Packit Service 93d855
	log_appender = func;
Packit Service 93d855
}
Packit Service 93d855
Packit Service 93d855
gint
Packit Service 93d855
xkl_engine_start_listen(XklEngine * engine, guint what)
Packit Service 93d855
{
Packit Service 93d855
	int i;
Packit Service 93d855
	guchar *cntr = xkl_engine_priv(engine, listener_type_counters);
Packit Service 93d855
	for (i = 0; i < XKLL_NUMBER_OF_LISTEN_MODES; i++, cntr++)
Packit Service 93d855
		if (what & (1 << i))
Packit Service 93d855
			(*cntr)++;
Packit Service 93d855
Packit Service 93d855
	if (!
Packit Service 93d855
	    (xkl_engine_priv(engine, features) &
Packit Service 93d855
	     XKLF_REQUIRES_MANUAL_LAYOUT_MANAGEMENT)
Packit Service 93d855
&& (what & XKLL_MANAGE_LAYOUTS))
Packit Service 93d855
		xkl_debug(0,
Packit Service 93d855
			  "The backend does not require manual layout management - "
Packit Service 93d855
			  "but it is provided by the application\n");
Packit Service 93d855
Packit Service 93d855
	xkl_engine_resume_listen(engine);
Packit Service 93d855
	xkl_engine_load_window_tree(engine);
Packit Service 93d855
	XFlush(xkl_engine_get_display(engine));
Packit Service 93d855
	return 0;
Packit Service 93d855
}
Packit Service 93d855
Packit Service 93d855
gint
Packit Service 93d855
xkl_engine_stop_listen(XklEngine * engine, guint what)
Packit Service 93d855
{
Packit Service 93d855
	int i;
Packit Service 93d855
	gboolean no_flags_remains = TRUE;
Packit Service 93d855
	guchar *cntr = xkl_engine_priv(engine, listener_type_counters);
Packit Service 93d855
	for (i = 0; i < XKLL_NUMBER_OF_LISTEN_MODES; i++, cntr++) {
Packit Service 93d855
		int mask = 1 << i;
Packit Service 93d855
		if (what & mask)
Packit Service 93d855
			(*cntr)--;
Packit Service 93d855
Packit Service 93d855
		if (*cntr)
Packit Service 93d855
			no_flags_remains = FALSE;
Packit Service 93d855
	}
Packit Service 93d855
	if (no_flags_remains)
Packit Service 93d855
		xkl_engine_pause_listen(engine);
Packit Service 93d855
Packit Service 93d855
	return 0;
Packit Service 93d855
}
Packit Service 93d855
Packit Service 93d855
XklEngine *
Packit Service 93d855
xkl_engine_get_instance(Display * display)
Packit Service 93d855
{
Packit Service 93d855
	if (the_engine != NULL) {
Packit Service 93d855
		g_object_ref(G_OBJECT(the_engine));
Packit Service 93d855
		return the_engine;
Packit Service 93d855
	}
Packit Service 93d855
Packit Service 93d855
	if (!display) {
Packit Service 93d855
		xkl_debug(10, "xkl_init : display is NULL ?\n");
Packit Service 93d855
		return NULL;
Packit Service 93d855
	}
Packit Service 93d855
Packit Service 93d855
	the_engine =
Packit Service 93d855
	    XKL_ENGINE(g_object_new
Packit Service 93d855
		       (xkl_engine_get_type(), "display", display, NULL));
Packit Service 93d855
Packit Service 93d855
	return the_engine;
Packit Service 93d855
}
Packit Service 93d855
Packit Service 93d855
gboolean
Packit Service 93d855
xkl_engine_grab_key(XklEngine * engine, gint keycode, guint modifiers)
Packit Service 93d855
{
Packit Service 93d855
	gboolean ret_code;
Packit Service 93d855
	gchar *keyname;
Packit Service 93d855
	Display *dpy = xkl_engine_get_display(engine);
Packit Service 93d855
Packit Service 93d855
	if (xkl_debug_level >= 100) {
Packit Service 93d855
		keyname =
Packit Service 93d855
		    XKeysymToString(XKeycodeToKeysym(dpy, keycode, 0));
Packit Service 93d855
		xkl_debug(100, "Listen to the key %d/(%s)/%d\n", keycode,
Packit Service 93d855
			  keyname, modifiers);
Packit Service 93d855
	}
Packit Service 93d855
Packit Service 93d855
	if (0 == keycode)
Packit Service 93d855
		return FALSE;
Packit Service 93d855
Packit Service 93d855
	xkl_engine_priv(engine, last_error_code) = Success;
Packit Service 93d855
Packit Service 93d855
	ret_code =
Packit Service 93d855
	    XGrabKey(dpy, keycode, modifiers,
Packit Service 93d855
		     xkl_engine_priv(engine, root_window), TRUE,
Packit Service 93d855
		     GrabModeAsync, GrabModeAsync);
Packit Service 93d855
	XSync(dpy, False);
Packit Service 93d855
Packit Service 93d855
	xkl_debug(100, "XGrabKey recode %d/error %d\n",
Packit Service 93d855
		  ret_code, xkl_engine_priv(engine, last_error_code));
Packit Service 93d855
Packit Service 93d855
	ret_code = (xkl_engine_priv(engine, last_error_code) == Success);
Packit Service 93d855
Packit Service 93d855
	if (!ret_code)
Packit Service 93d855
		xkl_last_error_message = "Could not grab the key";
Packit Service 93d855
Packit Service 93d855
	return ret_code;
Packit Service 93d855
}
Packit Service 93d855
Packit Service 93d855
gboolean
Packit Service 93d855
xkl_engine_ungrab_key(XklEngine * engine, gint keycode, guint modifiers)
Packit Service 93d855
{
Packit Service 93d855
	if (0 == keycode)
Packit Service 93d855
		return FALSE;
Packit Service 93d855
Packit Service 93d855
	return Success == XUngrabKey(xkl_engine_get_display(engine),
Packit Service 93d855
				     keycode, 0,
Packit Service 93d855
				     xkl_engine_priv(engine, root_window));
Packit Service 93d855
}
Packit Service 93d855
Packit Service 93d855
gint
Packit Service 93d855
xkl_engine_get_next_group(XklEngine * engine)
Packit Service 93d855
{
Packit Service 93d855
	gint n = xkl_engine_get_num_groups(engine);
Packit Service 93d855
	return (xkl_engine_priv(engine, curr_state).group + 1) % n;
Packit Service 93d855
}
Packit Service 93d855
Packit Service 93d855
gint
Packit Service 93d855
xkl_engine_get_prev_group(XklEngine * engine)
Packit Service 93d855
{
Packit Service 93d855
	gint n = xkl_engine_get_num_groups(engine);
Packit Service 93d855
	return (xkl_engine_priv(engine, curr_state).group + n - 1) % n;
Packit Service 93d855
}
Packit Service 93d855
Packit Service 93d855
gint
Packit Service 93d855
xkl_engine_get_current_window_group(XklEngine * engine)
Packit Service 93d855
{
Packit Service 93d855
	XklState state;
Packit Service 93d855
	if (xkl_engine_priv(engine, curr_toplvl_win) == (Window) NULL) {
Packit Service 93d855
		xkl_debug(150, "cannot restore without current client\n");
Packit Service 93d855
	} else
Packit Service 93d855
	    if (xkl_engine_get_toplevel_window_state
Packit Service 93d855
		(engine, xkl_engine_priv(engine, curr_toplvl_win),
Packit Service 93d855
		 &state)) {
Packit Service 93d855
		return state.group;
Packit Service 93d855
	} else
Packit Service 93d855
		xkl_debug(150,
Packit Service 93d855
			  "Unbelievable: current client " WINID_FORMAT
Packit Service 93d855
			  ", '%s' has no group\n",
Packit Service 93d855
			  xkl_engine_priv(engine, curr_toplvl_win),
Packit Service 93d855
			  xkl_get_debug_window_title(engine,
Packit Service 93d855
						     xkl_engine_priv
Packit Service 93d855
						     (engine,
Packit Service 93d855
						      curr_toplvl_win)));
Packit Service 93d855
	return 0;
Packit Service 93d855
}
Packit Service 93d855
Packit Service 93d855
void
Packit Service 93d855
xkl_engine_set_window_transparent(XklEngine * engine, Window win,
Packit Service 93d855
				  gboolean transparent)
Packit Service 93d855
{
Packit Service 93d855
	Window toplevel_win;
Packit Service 93d855
	xkl_debug(150,
Packit Service 93d855
		  "setting transparent flag %d for " WINID_FORMAT "\n",
Packit Service 93d855
		  transparent, win);
Packit Service 93d855
Packit Service 93d855
	if (!xkl_engine_find_toplevel_window(engine, win, &toplevel_win)) {
Packit Service 93d855
		xkl_debug(150, "No toplevel window!\n");
Packit Service 93d855
		/* toplevel_win = win; */
Packit Service 93d855
		return;
Packit Service 93d855
	}
Packit Service 93d855
Packit Service 93d855
	xkl_engine_set_toplevel_window_transparent(engine, toplevel_win,
Packit Service 93d855
						   transparent);
Packit Service 93d855
}
Packit Service 93d855
Packit Service 93d855
gboolean
Packit Service 93d855
xkl_engine_is_window_transparent(XklEngine * engine, Window win)
Packit Service 93d855
{
Packit Service 93d855
	Window toplevel_win;
Packit Service 93d855
Packit Service 93d855
	if (!xkl_engine_find_toplevel_window(engine, win, &toplevel_win))
Packit Service 93d855
		return FALSE;
Packit Service 93d855
	return xkl_engine_is_toplevel_window_transparent(engine,
Packit Service 93d855
							 toplevel_win);
Packit Service 93d855
}
Packit Service 93d855
Packit Service 93d855
/*
Packit Service 93d855
 * Loads the tree recursively.
Packit Service 93d855
 */
Packit Service 93d855
gboolean
Packit Service 93d855
xkl_engine_load_window_tree(XklEngine * engine)
Packit Service 93d855
{
Packit Service 93d855
	Window focused;
Packit Service 93d855
	int revert;
Packit Service 93d855
	gboolean retval = TRUE, have_toplevel_win;
Packit Service 93d855
Packit Service 93d855
	if (xkl_engine_is_listening_for(engine, XKLL_MANAGE_WINDOW_STATES))
Packit Service 93d855
		retval =
Packit Service 93d855
		    xkl_engine_load_subtree(engine,
Packit Service 93d855
					    xkl_engine_priv(engine,
Packit Service 93d855
							    root_window),
Packit Service 93d855
					    0, &xkl_engine_priv(engine,
Packit Service 93d855
								curr_state));
Packit Service 93d855
Packit Service 93d855
	XGetInputFocus(xkl_engine_get_display(engine), &focused, &revert);
Packit Service 93d855
Packit Service 93d855
	xkl_debug(160, "initially focused: " WINID_FORMAT ", '%s'\n",
Packit Service 93d855
		  focused, xkl_get_debug_window_title(engine, focused));
Packit Service 93d855
Packit Service 93d855
	have_toplevel_win =
Packit Service 93d855
	    xkl_engine_find_toplevel_window(engine, focused,
Packit Service 93d855
					    &xkl_engine_priv(engine,
Packit Service 93d855
							     curr_toplvl_win));
Packit Service 93d855
Packit Service 93d855
	if (have_toplevel_win) {
Packit Service 93d855
		XklState old_state;
Packit Service 93d855
Packit Service 93d855
		old_state = xkl_engine_priv (engine, curr_state);
Packit Service 93d855
Packit Service 93d855
		gboolean have_state =
Packit Service 93d855
		    xkl_engine_get_toplevel_window_state(engine,
Packit Service 93d855
							 xkl_engine_priv
Packit Service 93d855
							 (engine,
Packit Service 93d855
							  curr_toplvl_win),
Packit Service 93d855
							 &xkl_engine_priv
Packit Service 93d855
							 (engine,
Packit Service 93d855
							  curr_state));
Packit Service 93d855
		xkl_debug(160,
Packit Service 93d855
			  "initial toplevel: " WINID_FORMAT
Packit Service 93d855
			  ", '%s' %s state %d/%X\n",
Packit Service 93d855
			  xkl_engine_priv(engine, curr_toplvl_win),
Packit Service 93d855
			  xkl_get_debug_window_title(engine,
Packit Service 93d855
						     xkl_engine_priv
Packit Service 93d855
						     (engine,
Packit Service 93d855
						      curr_toplvl_win)),
Packit Service 93d855
			  (have_state ? "with" : "without"),
Packit Service 93d855
			  (have_state ?
Packit Service 93d855
			   xkl_engine_priv(engine, curr_state).group : -1),
Packit Service 93d855
			  (have_state ?
Packit Service 93d855
			   xkl_engine_priv(engine,
Packit Service 93d855
					   curr_state).indicators : -1));
Packit Service 93d855
Packit Service 93d855
		if (old_state.group != xkl_engine_priv (engine, curr_state).group) {
Packit Service 93d855
			xkl_engine_lock_group (engine, xkl_engine_priv (engine, curr_state).group);
Packit Service 93d855
		}
Packit Service 93d855
Packit Service 93d855
	} else {
Packit Service 93d855
		xkl_debug(160,
Packit Service 93d855
			  "Could not find initial app. "
Packit Service 93d855
			  "Probably, focus belongs to some WM service window. "
Packit Service 93d855
			  "Will try to survive:)");
Packit Service 93d855
	}
Packit Service 93d855
Packit Service 93d855
	return retval;
Packit Service 93d855
}
Packit Service 93d855
Packit Service 93d855
void
Packit Service 93d855
_xkl_debug(const gchar file[], const gchar function[], gint level,
Packit Service 93d855
	   const gchar format[], ...)
Packit Service 93d855
{
Packit Service 93d855
	va_list lst;
Packit Service 93d855
Packit Service 93d855
	if (level > xkl_debug_level)
Packit Service 93d855
		return;
Packit Service 93d855
Packit Service 93d855
	va_start(lst, format);
Packit Service 93d855
	if (log_appender != NULL)
Packit Service 93d855
		(*log_appender) (file, function, level, format, lst);
Packit Service 93d855
	va_end(lst);
Packit Service 93d855
}
Packit Service 93d855
Packit Service 93d855
void
Packit Service 93d855
xkl_default_log_appender(const gchar file[], const gchar function[],
Packit Service 93d855
			 gint level, const gchar format[], va_list args)
Packit Service 93d855
{
Packit Service 93d855
	time_t now = time(NULL);
Packit Service 93d855
	fprintf(stdout, "[%08ld,%03d,%s:%s/] \t", (long) now, level, file,
Packit Service 93d855
		function);
Packit Service 93d855
	vfprintf(stdout, format, args);
Packit Service 93d855
}
Packit Service 93d855
Packit Service 93d855
/*
Packit Service 93d855
 * Just selects some events from the window.
Packit Service 93d855
 */
Packit Service 93d855
void
Packit Service 93d855
xkl_engine_select_input(XklEngine * engine, Window win, gulong mask)
Packit Service 93d855
{
Packit Service 93d855
	if (xkl_engine_priv(engine, root_window) == win)
Packit Service 93d855
		xkl_debug(160,
Packit Service 93d855
			  "Someone is looking for %lx on root window ***\n",
Packit Service 93d855
			  mask);
Packit Service 93d855
Packit Service 93d855
	XSelectInput(xkl_engine_get_display(engine), win, mask);
Packit Service 93d855
}
Packit Service 93d855
Packit Service 93d855
void
Packit Service 93d855
xkl_engine_select_input_merging(XklEngine * engine, Window win,
Packit Service 93d855
				gulong mask)
Packit Service 93d855
{
Packit Service 93d855
	XWindowAttributes attrs;
Packit Service 93d855
	gulong oldmask = 0L, newmask;
Packit Service 93d855
	memset(&attrs, 0, sizeof(attrs));
Packit Service 93d855
	if (XGetWindowAttributes
Packit Service 93d855
	    (xkl_engine_get_display(engine), win, &attrs))
Packit Service 93d855
		oldmask = attrs.your_event_mask;
Packit Service 93d855
Packit Service 93d855
	newmask = oldmask | mask;
Packit Service 93d855
	if (newmask != oldmask)
Packit Service 93d855
		xkl_engine_select_input(engine, win, newmask);
Packit Service 93d855
}
Packit Service 93d855
Packit Service 93d855
void
Packit Service 93d855
xkl_engine_try_call_state_func(XklEngine * engine,
Packit Service 93d855
			       XklEngineStateChange change_type,
Packit Service 93d855
			       XklState * old_state)
Packit Service 93d855
{
Packit Service 93d855
	gint group = xkl_engine_priv(engine, curr_state).group;
Packit Service 93d855
	gboolean restore = old_state->group == group;
Packit Service 93d855
Packit Service 93d855
	xkl_debug(150,
Packit Service 93d855
		  "change_type: %d, group: %d, secondary_group_mask: %X, allowsecondary: %d\n",
Packit Service 93d855
		  change_type, group, xkl_engine_priv(engine,
Packit Service 93d855
						      secondary_groups_mask),
Packit Service 93d855
		  xkl_engine_is_one_switch_to_secondary_group_allowed
Packit Service 93d855
		  (engine));
Packit Service 93d855
Packit Service 93d855
	if (change_type == GROUP_CHANGED) {
Packit Service 93d855
		if (!restore) {
Packit Service 93d855
			if ((xkl_engine_priv(engine, secondary_groups_mask)
Packit Service 93d855
			     & (1 << group)) != 0
Packit Service 93d855
			    &&
Packit Service 93d855
			    !xkl_engine_is_one_switch_to_secondary_group_allowed
Packit Service 93d855
			    (engine)) {
Packit Service 93d855
				xkl_debug(150, "secondary -> go next\n");
Packit Service 93d855
				group = xkl_engine_get_next_group(engine);
Packit Service 93d855
				xkl_engine_lock_group(engine, group);
Packit Service 93d855
				return;	/* we do not need to revalidate */
Packit Service 93d855
			}
Packit Service 93d855
		}
Packit Service 93d855
		xkl_engine_one_switch_to_secondary_group_performed(engine);
Packit Service 93d855
	}
Packit Service 93d855
Packit Service 93d855
	g_signal_emit_by_name(engine, "X-state-changed", change_type,
Packit Service 93d855
			      xkl_engine_priv(engine, curr_state).group,
Packit Service 93d855
			      restore);
Packit Service 93d855
Packit Service 93d855
}
Packit Service 93d855
Packit Service 93d855
void
Packit Service 93d855
xkl_engine_ensure_vtable_inited(XklEngine * engine)
Packit Service 93d855
{
Packit Service 93d855
	char *p;
Packit Service 93d855
	if (xkl_engine_priv(engine, backend_id) == NULL) {
Packit Service 93d855
		xkl_debug(0, "ERROR: XKL VTable is NOT initialized.\n");
Packit Service 93d855
		/* force the crash! */
Packit Service 93d855
		p = NULL;
Packit Service 93d855
		*p = '\0';
Packit Service 93d855
	}
Packit Service 93d855
}
Packit Service 93d855
Packit Service 93d855
const gchar *
Packit Service 93d855
xkl_engine_get_backend_name(XklEngine * engine)
Packit Service 93d855
{
Packit Service 93d855
	return xkl_engine_priv(engine, backend_id);
Packit Service 93d855
}
Packit Service 93d855
Packit Service 93d855
guint
Packit Service 93d855
xkl_engine_get_features(XklEngine * engine)
Packit Service 93d855
{
Packit Service 93d855
	return xkl_engine_priv(engine, features);
Packit Service 93d855
}
Packit Service 93d855
Packit Service 93d855
void
Packit Service 93d855
xkl_engine_reset_all_info(XklEngine * engine, gboolean force,
Packit Service 93d855
			  const gchar reason[])
Packit Service 93d855
{
Packit Service 93d855
	xkl_debug(150, "Resetting all the cached info, reason: [%s]\n",
Packit Service 93d855
		  reason);
Packit Service 93d855
	xkl_engine_ensure_vtable_inited(engine);
Packit Service 93d855
	if (force
Packit Service 93d855
	    || !xkl_engine_vcall(engine, if_cached_info_equals_actual)
Packit Service 93d855
	    (engine)) {
Packit Service 93d855
		xkl_engine_vcall(engine, free_all_info) (engine);
Packit Service 93d855
		xkl_engine_vcall(engine, load_all_info) (engine);
Packit Service 93d855
	} else
Packit Service 93d855
		xkl_debug(100,
Packit Service 93d855
			  "NOT Resetting the cache: same configuration\n");
Packit Service 93d855
}
Packit Service 93d855
Packit Service 93d855
/*
Packit Service 93d855
 * Calling through vtable
Packit Service 93d855
 */
Packit Service 93d855
const gchar **
Packit Service 93d855
xkl_engine_get_groups_names(XklEngine * engine)
Packit Service 93d855
{
Packit Service 93d855
	xkl_engine_ensure_vtable_inited(engine);
Packit Service 93d855
	return xkl_engine_vcall(engine, get_groups_names) (engine);
Packit Service 93d855
}
Packit Service 93d855
Packit Service 93d855
const gchar **
Packit Service 93d855
xkl_engine_get_indicators_names(XklEngine * engine)
Packit Service 93d855
{
Packit Service 93d855
	xkl_engine_ensure_vtable_inited(engine);
Packit Service 93d855
	return xkl_engine_vcall(engine, get_indicators_names) (engine);
Packit Service 93d855
}
Packit Service 93d855
Packit Service 93d855
guint
Packit Service 93d855
xkl_engine_get_num_groups(XklEngine * engine)
Packit Service 93d855
{
Packit Service 93d855
	xkl_engine_ensure_vtable_inited(engine);
Packit Service 93d855
	return xkl_engine_vcall(engine, get_num_groups) (engine);
Packit Service 93d855
}
Packit Service 93d855
Packit Service 93d855
void
Packit Service 93d855
xkl_engine_lock_group(XklEngine * engine, int group)
Packit Service 93d855
{
Packit Service 93d855
	xkl_engine_ensure_vtable_inited(engine);
Packit Service 93d855
	xkl_engine_vcall(engine, lock_group) (engine, group);
Packit Service 93d855
}
Packit Service 93d855
Packit Service 93d855
gint
Packit Service 93d855
xkl_engine_pause_listen(XklEngine * engine)
Packit Service 93d855
{
Packit Service 93d855
	xkl_debug(150, "Pause listening\n");
Packit Service 93d855
	xkl_engine_ensure_vtable_inited(engine);
Packit Service 93d855
	return xkl_engine_vcall(engine, pause_listen) (engine);
Packit Service 93d855
}
Packit Service 93d855
Packit Service 93d855
gint
Packit Service 93d855
xkl_engine_resume_listen(XklEngine * engine)
Packit Service 93d855
{
Packit Service 93d855
	xkl_engine_ensure_vtable_inited(engine);
Packit Service 93d855
	guchar *listener_type_counters =
Packit Service 93d855
	    xkl_engine_priv(engine, listener_type_counters);
Packit Service 93d855
	xkl_debug(150, "Resume listening, listenerType: (%s%s%s)\n",
Packit Service 93d855
		  (listener_type_counters
Packit Service 93d855
		   [XKLL_MANAGE_WINDOW_STATES_OFFSET]) ?
Packit Service 93d855
		  "XKLL_MANAGE_WINDOW_STATES " : "",
Packit Service 93d855
		  (listener_type_counters
Packit Service 93d855
		   [XKLL_TRACK_KEYBOARD_STATE_OFFSET]) ?
Packit Service 93d855
		  "XKLL_TRACK_KEYBOARD_STATE " : "",
Packit Service 93d855
		  (listener_type_counters[XKLL_MANAGE_LAYOUTS_OFFSET]) ?
Packit Service 93d855
		  "XKLL_MANAGE_LAYOUTS " : "");
Packit Service 93d855
	if (xkl_engine_vcall(engine, resume_listen) (engine))
Packit Service 93d855
		return 1;
Packit Service 93d855
Packit Service 93d855
	xkl_engine_select_input_merging(engine,
Packit Service 93d855
					xkl_engine_priv(engine,
Packit Service 93d855
							root_window),
Packit Service 93d855
					SubstructureNotifyMask |
Packit Service 93d855
					PropertyChangeMask);
Packit Service 93d855
Packit Service 93d855
	xkl_engine_vcall(engine,
Packit Service 93d855
			 get_server_state) (engine,
Packit Service 93d855
					    &xkl_engine_priv(engine,
Packit Service 93d855
							     curr_state));
Packit Service 93d855
	return 0;
Packit Service 93d855
}
Packit Service 93d855
Packit Service 93d855
guint
Packit Service 93d855
xkl_engine_get_max_num_groups(XklEngine * engine)
Packit Service 93d855
{
Packit Service 93d855
	xkl_engine_ensure_vtable_inited(engine);
Packit Service 93d855
	return xkl_engine_vcall(engine, get_max_num_groups) (engine);
Packit Service 93d855
}
Packit Service 93d855
Packit Service 93d855
XklEngine *
Packit Service 93d855
xkl_get_the_engine()
Packit Service 93d855
{
Packit Service 93d855
	return the_engine;
Packit Service 93d855
}
Packit Service 93d855
Packit Service 93d855
G_DEFINE_TYPE(XklEngine, xkl_engine, G_TYPE_OBJECT)
Packit Service 93d855
Packit Service 93d855
static GObject *
Packit Service 93d855
xkl_engine_constructor(GType type,
Packit Service 93d855
		       guint n_construct_properties,
Packit Service 93d855
		       GObjectConstructParam * construct_properties)
Packit Service 93d855
{
Packit Service 93d855
	GObject *obj;
Packit Service 93d855
	XklEngine *engine;
Packit Service 93d855
	Display *display;
Packit Service 93d855
	int scr;
Packit Service 93d855
	gint rv;
Packit Service 93d855
Packit Service 93d855
	{
Packit Service 93d855
		/* Invoke parent constructor. */
Packit Service 93d855
		g_type_class_peek(XKL_TYPE_ENGINE);
Packit Service 93d855
		obj =
Packit Service 93d855
		    parent_class->constructor(type, n_construct_properties,
Packit Service 93d855
					      construct_properties);
Packit Service 93d855
	}
Packit Service 93d855
Packit Service 93d855
	engine = XKL_ENGINE(obj);
Packit Service 93d855
Packit Service 93d855
	display = (Display *)
Packit Service 93d855
	    g_value_peek_pointer(construct_properties[0].value);
Packit Service 93d855
Packit Service 93d855
	xkl_engine_priv(engine, display) = display;
Packit Service 93d855
Packit Service 93d855
	xkl_engine_priv(engine, default_error_handler) =
Packit Service 93d855
	    XSetErrorHandler(xkl_process_error);
Packit Service 93d855
Packit Service 93d855
	scr = DefaultScreen(display);
Packit Service 93d855
	xkl_engine_priv(engine, root_window) = RootWindow(display, scr);
Packit Service 93d855
Packit Service 93d855
	xkl_engine_priv(engine, skip_one_restore) = FALSE;
Packit Service 93d855
	xkl_engine_priv(engine, default_group) = -1;
Packit Service 93d855
	xkl_engine_priv(engine, secondary_groups_mask) = 0L;
Packit Service 93d855
	xkl_engine_priv(engine, prev_toplvl_win) = 0;
Packit Service 93d855
Packit Service 93d855
	xkl_engine_priv(engine, atoms)[WM_NAME] =
Packit Service 93d855
	    XInternAtom(display, "WM_NAME", False);
Packit Service 93d855
	xkl_engine_priv(engine, atoms)[WM_STATE] =
Packit Service 93d855
	    XInternAtom(display, "WM_STATE", False);
Packit Service 93d855
	xkl_engine_priv(engine, atoms)[XKLAVIER_STATE] =
Packit Service 93d855
	    XInternAtom(display, "XKLAVIER_STATE", False);
Packit Service 93d855
	xkl_engine_priv(engine, atoms)[XKLAVIER_TRANSPARENT] =
Packit Service 93d855
	    XInternAtom(display, "XKLAVIER_TRANSPARENT", False);
Packit Service 93d855
	xkl_engine_priv(engine, atoms)[XKLAVIER_ALLOW_SECONDARY] =
Packit Service 93d855
	    XInternAtom(display, "XKLAVIER_ALLOW_SECONDARY", False);
Packit Service 93d855
Packit Service 93d855
	xkl_engine_one_switch_to_secondary_group_performed(engine);
Packit Service 93d855
Packit Service 93d855
	rv = -1;
Packit Service 93d855
	xkl_debug(150, "Trying all backends:\n");
Packit Service 93d855
#ifdef ENABLE_XKB_SUPPORT
Packit Service 93d855
	xkl_debug(150, "Trying XKB backend\n");
Packit Service 93d855
	rv = xkl_xkb_init(engine);
Packit Service 93d855
#endif
Packit Service 93d855
#ifdef ENABLE_XMODMAP_SUPPORT
Packit Service 93d855
	if (rv != 0) {
Packit Service 93d855
		xkl_debug(150, "Trying xmodmap backend\n");
Packit Service 93d855
		rv = xkl_xmm_init(engine);
Packit Service 93d855
	}
Packit Service 93d855
#endif
Packit Service 93d855
	if (rv == 0) {
Packit Service 93d855
		xkl_debug(150, "Actual backend: %s\n",
Packit Service 93d855
			  xkl_engine_get_backend_name(engine));
Packit Service 93d855
	} else {
Packit Service 93d855
		xkl_debug(0, "All backends failed, last result: %d\n", rv);
Packit Service 93d855
		XSetErrorHandler(xkl_engine_priv
Packit Service 93d855
				 (engine, default_error_handler));
Packit Service 93d855
		xkl_engine_priv(engine, display) = NULL;
Packit Service 93d855
		g_object_unref(G_OBJECT(engine));
Packit Service 93d855
		return NULL;
Packit Service 93d855
	}
Packit Service 93d855
Packit Service 93d855
	xkl_engine_ensure_vtable_inited(engine);
Packit Service 93d855
	if (!xkl_engine_vcall(engine, load_all_info) (engine)) {
Packit Service 93d855
		g_object_unref(G_OBJECT(engine));
Packit Service 93d855
		return NULL;
Packit Service 93d855
	}
Packit Service 93d855
Packit Service 93d855
	return obj;
Packit Service 93d855
}
Packit Service 93d855
Packit Service 93d855
static void
Packit Service 93d855
xkl_engine_init(XklEngine * engine)
Packit Service 93d855
{
Packit Service 93d855
	engine->priv = g_new0(XklEnginePrivate, 1);
Packit Service 93d855
}
Packit Service 93d855
Packit Service 93d855
static void
Packit Service 93d855
xkl_engine_set_property(GObject * object,
Packit Service 93d855
			guint property_id,
Packit Service 93d855
			const GValue * value, GParamSpec * pspec)
Packit Service 93d855
{
Packit Service 93d855
}
Packit Service 93d855
Packit Service 93d855
static void
Packit Service 93d855
xkl_engine_get_property(GObject * object,
Packit Service 93d855
			guint property_id,
Packit Service 93d855
			GValue * value, GParamSpec * pspec)
Packit Service 93d855
{
Packit Service 93d855
	XklEngine *engine = XKL_ENGINE(object);
Packit Service 93d855
Packit Service 93d855
	switch (property_id) {
Packit Service 93d855
	case PROP_DISPLAY:
Packit Service 93d855
		g_value_set_pointer(value, xkl_engine_get_display(engine));
Packit Service 93d855
		break;
Packit Service 93d855
	case PROP_BACKEND_NAME:
Packit Service 93d855
		g_value_set_string(value,
Packit Service 93d855
				   xkl_engine_priv(engine, backend_id));
Packit Service 93d855
		break;
Packit Service 93d855
	case PROP_FEATURES:
Packit Service 93d855
		g_value_set_flags(value,
Packit Service 93d855
				  xkl_engine_priv(engine, features));
Packit Service 93d855
		break;
Packit Service 93d855
	case PROP_MAX_NUM_GROUPS:
Packit Service 93d855
		g_value_set_uint(value,
Packit Service 93d855
				 xkl_engine_vcall(engine,
Packit Service 93d855
						  get_max_num_groups)
Packit Service 93d855
				 (engine));
Packit Service 93d855
		break;
Packit Service 93d855
	case PROP_NUM_GROUPS:
Packit Service 93d855
		g_value_set_uint(value,
Packit Service 93d855
				 xkl_engine_vcall(engine, get_num_groups)
Packit Service 93d855
				 (engine));
Packit Service 93d855
		break;
Packit Service 93d855
	case PROP_DEFAULT_GROUP:
Packit Service 93d855
		g_value_set_uint(value,
Packit Service 93d855
				 xkl_engine_priv(engine, default_group));
Packit Service 93d855
		break;
Packit Service 93d855
	case PROP_SECONDARY_GROUPS_MASK:
Packit Service 93d855
		g_value_set_uint(value,
Packit Service 93d855
				 xkl_engine_priv(engine,
Packit Service 93d855
						 secondary_groups_mask));
Packit Service 93d855
		break;
Packit Service 93d855
	case PROP_INDICATORS_HANDLING:
Packit Service 93d855
		g_value_set_boolean(value,
Packit Service 93d855
				    xkl_engine_priv(engine,
Packit Service 93d855
						    handle_indicators));
Packit Service 93d855
		break;
Packit Service 93d855
	}
Packit Service 93d855
}
Packit Service 93d855
Packit Service 93d855
static void
Packit Service 93d855
xkl_engine_finalize(GObject * obj)
Packit Service 93d855
{
Packit Service 93d855
	XklEngine *engine = (XklEngine *) obj;
Packit Service 93d855
	gpointer backend;
Packit Service 93d855
Packit Service 93d855
	XSetErrorHandler((XErrorHandler)
Packit Service 93d855
			 xkl_engine_priv(engine, default_error_handler));
Packit Service 93d855
Packit Service 93d855
	xkl_engine_ensure_vtable_inited(engine);
Packit Service 93d855
	xkl_engine_vcall(engine, free_all_info) (engine);
Packit Service 93d855
Packit Service 93d855
	xkl_engine_vcall(engine, finalize) (engine);
Packit Service 93d855
Packit Service 93d855
	backend = xkl_engine_priv(engine, backend);
Packit Service 93d855
	if (backend != NULL)
Packit Service 93d855
		g_free(backend);
Packit Service 93d855
	g_free(engine->priv);
Packit Service 93d855
Packit Service 93d855
	G_OBJECT_CLASS(parent_class)->finalize(obj);
Packit Service 93d855
}
Packit Service 93d855
Packit Service 93d855
static void
Packit Service 93d855
xkl_engine_class_init(XklEngineClass * klass)
Packit Service 93d855
{
Packit Service 93d855
	GObjectClass *object_class;
Packit Service 93d855
	GParamSpec *display_param_spec;
Packit Service 93d855
	GParamSpec *backend_name_param_spec;
Packit Service 93d855
	GParamSpec *features_param_spec;
Packit Service 93d855
	GParamSpec *max_num_groups_param_spec;
Packit Service 93d855
	GParamSpec *num_groups_param_spec;
Packit Service 93d855
	GParamSpec *default_group_param_spec;
Packit Service 93d855
	GParamSpec *secondary_groups_mask_param_spec;
Packit Service 93d855
	GParamSpec *indicators_handling_param_spec;
Packit Service 93d855
Packit Service 93d855
	const gchar *sdl;
Packit Service 93d855
Packit Service 93d855
	object_class = (GObjectClass *) klass;
Packit Service 93d855
	parent_class = g_type_class_peek_parent(object_class);
Packit Service 93d855
Packit Service 93d855
	object_class->constructor = xkl_engine_constructor;
Packit Service 93d855
	object_class->finalize = xkl_engine_finalize;
Packit Service 93d855
	object_class->set_property = xkl_engine_set_property;
Packit Service 93d855
	object_class->get_property = xkl_engine_get_property;
Packit Service 93d855
Packit Service 93d855
	display_param_spec = g_param_spec_pointer("display",
Packit Service 93d855
						  "Display",
Packit Service 93d855
						  "X Display pointer",
Packit Service 93d855
						  G_PARAM_CONSTRUCT_ONLY
Packit Service 93d855
						  | G_PARAM_READWRITE);
Packit Service 93d855
Packit Service 93d855
	backend_name_param_spec = g_param_spec_string("backendName",
Packit Service 93d855
						      "backendName",
Packit Service 93d855
						      "Backend name",
Packit Service 93d855
						      NULL,
Packit Service 93d855
						      G_PARAM_READABLE);
Packit Service 93d855
Packit Service 93d855
	features_param_spec = g_param_spec_flags("features",
Packit Service 93d855
						 "Features",
Packit Service 93d855
						 "Backend features",
Packit Service 93d855
						 XKL_TYPE_ENGINE_FEATURES,
Packit Service 93d855
						 0, G_PARAM_READABLE);
Packit Service 93d855
	max_num_groups_param_spec = g_param_spec_uint("max-num-groups",
Packit Service 93d855
						      "maxNumGroups",
Packit Service 93d855
						      "Max number of groups",
Packit Service 93d855
						      0, 0x100, 0,
Packit Service 93d855
						      G_PARAM_READABLE);
Packit Service 93d855
Packit Service 93d855
	num_groups_param_spec = g_param_spec_uint("num-groups",
Packit Service 93d855
						  "numGroups",
Packit Service 93d855
						  "Current number of groups",
Packit Service 93d855
						  0, 0x100, 0,
Packit Service 93d855
						  G_PARAM_READABLE);
Packit Service 93d855
Packit Service 93d855
	default_group_param_spec = g_param_spec_uint("default-group",
Packit Service 93d855
						     "defaultGroup",
Packit Service 93d855
						     "Default group",
Packit Service 93d855
						     0, 0x100, 0,
Packit Service 93d855
						     G_PARAM_READABLE);
Packit Service 93d855
Packit Service 93d855
	secondary_groups_mask_param_spec =
Packit Service 93d855
	    g_param_spec_uint("secondary-groups-mask",
Packit Service 93d855
			      "secondaryGroupsMask",
Packit Service 93d855
			      "Secondary groups mask",
Packit Service 93d855
			      0, 0x100, 0, G_PARAM_READABLE);
Packit Service 93d855
Packit Service 93d855
	indicators_handling_param_spec =
Packit Service 93d855
	    g_param_spec_boolean("indicators-handling",
Packit Service 93d855
				 "indicatorsHandling",
Packit Service 93d855
				 "Whether engine should handle indicators",
Packit Service 93d855
				 FALSE, G_PARAM_READABLE);
Packit Service 93d855
Packit Service 93d855
	g_object_class_install_property(object_class,
Packit Service 93d855
					PROP_DISPLAY, display_param_spec);
Packit Service 93d855
	g_object_class_install_property(object_class,
Packit Service 93d855
					PROP_BACKEND_NAME,
Packit Service 93d855
					backend_name_param_spec);
Packit Service 93d855
	g_object_class_install_property(object_class, PROP_FEATURES,
Packit Service 93d855
					features_param_spec);
Packit Service 93d855
	g_object_class_install_property(object_class, PROP_MAX_NUM_GROUPS,
Packit Service 93d855
					max_num_groups_param_spec);
Packit Service 93d855
	g_object_class_install_property(object_class, PROP_NUM_GROUPS,
Packit Service 93d855
					num_groups_param_spec);
Packit Service 93d855
	g_object_class_install_property(object_class, PROP_DEFAULT_GROUP,
Packit Service 93d855
					default_group_param_spec);
Packit Service 93d855
	g_object_class_install_property(object_class,
Packit Service 93d855
					PROP_SECONDARY_GROUPS_MASK,
Packit Service 93d855
					secondary_groups_mask_param_spec);
Packit Service 93d855
	g_object_class_install_property(object_class,
Packit Service 93d855
					PROP_INDICATORS_HANDLING,
Packit Service 93d855
					indicators_handling_param_spec);
Packit Service 93d855
Packit Service 93d855
Packit Service 93d855
	g_signal_new("X-config-changed", XKL_TYPE_ENGINE,
Packit Service 93d855
		     G_SIGNAL_RUN_LAST, G_STRUCT_OFFSET(XklEngineClass,
Packit Service 93d855
							config_notify),
Packit Service 93d855
		     NULL, NULL, xkl_engine_VOID__VOID, G_TYPE_NONE, 0);
Packit Service 93d855
Packit Service 93d855
	g_signal_new("X-new-device", XKL_TYPE_ENGINE,
Packit Service 93d855
		     G_SIGNAL_RUN_LAST, G_STRUCT_OFFSET(XklEngineClass,
Packit Service 93d855
							new_device_notify),
Packit Service 93d855
		     NULL, NULL, xkl_engine_VOID__VOID, G_TYPE_NONE, 0);
Packit Service 93d855
Packit Service 93d855
	g_signal_new("new-toplevel-window", XKL_TYPE_ENGINE,
Packit Service 93d855
		     G_SIGNAL_RUN_LAST, G_STRUCT_OFFSET(XklEngineClass,
Packit Service 93d855
							new_window_notify),
Packit Service 93d855
		     NULL, NULL, xkl_engine_INT__LONG_LONG,
Packit Service 93d855
		     G_TYPE_INT, 2, G_TYPE_LONG, G_TYPE_LONG);
Packit Service 93d855
Packit Service 93d855
	g_signal_new("X-state-changed", XKL_TYPE_ENGINE,
Packit Service 93d855
		     G_SIGNAL_RUN_LAST, G_STRUCT_OFFSET(XklEngineClass,
Packit Service 93d855
							state_notify),
Packit Service 93d855
		     NULL, NULL,
Packit Service 93d855
		     xkl_engine_VOID__ENUM_INT_BOOLEAN,
Packit Service 93d855
		     G_TYPE_NONE, 3, XKL_TYPE_ENGINE_STATE_CHANGE, G_TYPE_INT,
Packit Service 93d855
		     G_TYPE_BOOLEAN);
Packit Service 93d855
Packit Service 93d855
	/* static stuff initialized */
Packit Service 93d855
Packit Service 93d855
	sdl = g_getenv("XKL_DEBUG");
Packit Service 93d855
Packit Service 93d855
	if (sdl != NULL) {
Packit Service 93d855
		xkl_set_debug_level(atoi(sdl));
Packit Service 93d855
	}
Packit Service 93d855
}