|
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 |
}
|