Don't close gdk default display.
This commit is contained in:
60
src/client.c
60
src/client.c
@ -65,7 +65,6 @@ struct _EekboardClient {
|
|||||||
EekboardContext *context;
|
EekboardContext *context;
|
||||||
|
|
||||||
EekKeyboard *keyboard;
|
EekKeyboard *keyboard;
|
||||||
GdkDisplay *display;
|
|
||||||
XklEngine *xkl_engine;
|
XklEngine *xkl_engine;
|
||||||
XklConfigRegistry *xkl_config_registry;
|
XklConfigRegistry *xkl_config_registry;
|
||||||
gboolean use_xkl_layout;
|
gboolean use_xkl_layout;
|
||||||
@ -237,11 +236,6 @@ eekboard_client_dispose (GObject *object)
|
|||||||
client->keyboard = NULL;
|
client->keyboard = NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (client->display) {
|
|
||||||
gdk_display_close (client->display);
|
|
||||||
client->display = NULL;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (client->settings) {
|
if (client->settings) {
|
||||||
g_object_unref (client->settings);
|
g_object_unref (client->settings);
|
||||||
client->settings = NULL;
|
client->settings = NULL;
|
||||||
@ -293,7 +287,6 @@ eekboard_client_init (EekboardClient *client)
|
|||||||
{
|
{
|
||||||
client->eekboard = NULL;
|
client->eekboard = NULL;
|
||||||
client->context = NULL;
|
client->context = NULL;
|
||||||
client->display = NULL;
|
|
||||||
client->xkl_engine = NULL;
|
client->xkl_engine = NULL;
|
||||||
client->xkl_config_registry = NULL;
|
client->xkl_config_registry = NULL;
|
||||||
client->keyboard = NULL;
|
client->keyboard = NULL;
|
||||||
@ -340,14 +333,12 @@ eekboard_client_load_keyboard_from_xkl (EekboardClient *client,
|
|||||||
gboolean
|
gboolean
|
||||||
eekboard_client_enable_xkl (EekboardClient *client)
|
eekboard_client_enable_xkl (EekboardClient *client)
|
||||||
{
|
{
|
||||||
if (!client->display) {
|
GdkDisplay *display = gdk_display_get_default ();
|
||||||
client->display = gdk_display_get_default ();
|
g_assert (display);
|
||||||
}
|
|
||||||
g_assert (client->display);
|
|
||||||
|
|
||||||
if (!client->xkl_engine) {
|
if (!client->xkl_engine) {
|
||||||
client->xkl_engine =
|
client->xkl_engine =
|
||||||
xkl_engine_get_instance (GDK_DISPLAY_XDISPLAY (client->display));
|
xkl_engine_get_instance (GDK_DISPLAY_XDISPLAY (display));
|
||||||
}
|
}
|
||||||
g_assert (client->xkl_engine);
|
g_assert (client->xkl_engine);
|
||||||
|
|
||||||
@ -828,15 +819,16 @@ on_xkl_state_changed (XklEngine *xklengine,
|
|||||||
static guint
|
static guint
|
||||||
get_replaced_keycode (EekboardClient *client)
|
get_replaced_keycode (EekboardClient *client)
|
||||||
{
|
{
|
||||||
Display *display = GDK_DISPLAY_XDISPLAY (client->display);
|
GdkDisplay *display = gdk_display_get_default ();
|
||||||
|
Display *xdisplay = GDK_DISPLAY_XDISPLAY (display);
|
||||||
gint i;
|
gint i;
|
||||||
|
|
||||||
for (i = client->xkb->max_key_code; i >= client->xkb->min_key_code; --i)
|
for (i = client->xkb->max_key_code; i >= client->xkb->min_key_code; --i)
|
||||||
if (client->xkb->map->key_sym_map[i].kt_index[0] == XkbOneLevelIndex &&
|
if (client->xkb->map->key_sym_map[i].kt_index[0] == XkbOneLevelIndex &&
|
||||||
XKeycodeToKeysym (display, i, 0) != 0)
|
XKeycodeToKeysym (xdisplay, i, 0) != 0)
|
||||||
return i;
|
return i;
|
||||||
|
|
||||||
return XKeysymToKeycode (display, 0x0023); /* XK_numbersign */
|
return XKeysymToKeycode (xdisplay, 0x0023); /* XK_numbersign */
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Replace keysym assigned to KEYCODE to KEYSYM. Both args are used
|
/* Replace keysym assigned to KEYCODE to KEYSYM. Both args are used
|
||||||
@ -851,7 +843,8 @@ replace_keycode (EekboardClient *client,
|
|||||||
guint *keycode,
|
guint *keycode,
|
||||||
guint *keysym)
|
guint *keysym)
|
||||||
{
|
{
|
||||||
Display *display = GDK_DISPLAY_XDISPLAY (client->display);
|
GdkDisplay *display = gdk_display_get_default ();
|
||||||
|
Display *xdisplay = GDK_DISPLAY_XDISPLAY (display);
|
||||||
guint offset;
|
guint offset;
|
||||||
XkbMapChangesRec changes;
|
XkbMapChangesRec changes;
|
||||||
guint replaced_keycode, replaced_keysym;
|
guint replaced_keycode, replaced_keysym;
|
||||||
@ -862,8 +855,8 @@ replace_keycode (EekboardClient *client,
|
|||||||
replaced_keycode = get_replaced_keycode (client);
|
replaced_keycode = get_replaced_keycode (client);
|
||||||
if (replaced_keycode == 0)
|
if (replaced_keycode == 0)
|
||||||
return FALSE;
|
return FALSE;
|
||||||
replaced_keysym = XKeycodeToKeysym (display, replaced_keycode, 0);
|
replaced_keysym = XKeycodeToKeysym (xdisplay, replaced_keycode, 0);
|
||||||
XFlush (display);
|
XFlush (xdisplay);
|
||||||
|
|
||||||
offset = client->xkb->map->key_sym_map[replaced_keycode].offset;
|
offset = client->xkb->map->key_sym_map[replaced_keycode].offset;
|
||||||
client->xkb->map->syms[offset] = *keysym;
|
client->xkb->map->syms[offset] = *keysym;
|
||||||
@ -872,8 +865,8 @@ replace_keycode (EekboardClient *client,
|
|||||||
changes.first_key_sym = replaced_keycode;
|
changes.first_key_sym = replaced_keycode;
|
||||||
changes.num_key_syms = 1;
|
changes.num_key_syms = 1;
|
||||||
|
|
||||||
XkbChangeMap (display, client->xkb, &changes);
|
XkbChangeMap (xdisplay, client->xkb, &changes);
|
||||||
XFlush (display);
|
XFlush (xdisplay);
|
||||||
|
|
||||||
*keycode = replaced_keycode;
|
*keycode = replaced_keycode;
|
||||||
*keysym = replaced_keysym;
|
*keysym = replaced_keysym;
|
||||||
@ -911,6 +904,7 @@ send_fake_modifier_key_event (EekboardClient *client,
|
|||||||
EekModifierType modifiers,
|
EekModifierType modifiers,
|
||||||
gboolean is_pressed)
|
gboolean is_pressed)
|
||||||
{
|
{
|
||||||
|
GdkDisplay *display = gdk_display_get_default ();
|
||||||
gint i;
|
gint i;
|
||||||
|
|
||||||
for (i = 0; i < G_N_ELEMENTS(client->modifier_keycodes); i++) {
|
for (i = 0; i < G_N_ELEMENTS(client->modifier_keycodes); i++) {
|
||||||
@ -919,7 +913,7 @@ send_fake_modifier_key_event (EekboardClient *client,
|
|||||||
|
|
||||||
g_return_if_fail (keycode > 0);
|
g_return_if_fail (keycode > 0);
|
||||||
|
|
||||||
XTestFakeKeyEvent (GDK_DISPLAY_XDISPLAY (client->display),
|
XTestFakeKeyEvent (GDK_DISPLAY_XDISPLAY (display),
|
||||||
keycode,
|
keycode,
|
||||||
is_pressed,
|
is_pressed,
|
||||||
CurrentTime);
|
CurrentTime);
|
||||||
@ -932,6 +926,7 @@ send_fake_key_event (EekboardClient *client,
|
|||||||
EekKey *key,
|
EekKey *key,
|
||||||
gboolean is_pressed)
|
gboolean is_pressed)
|
||||||
{
|
{
|
||||||
|
GdkDisplay *display = gdk_display_get_default ();
|
||||||
EekSymbol *symbol;
|
EekSymbol *symbol;
|
||||||
EekModifierType keyboard_modifiers, modifiers;
|
EekModifierType keyboard_modifiers, modifiers;
|
||||||
guint xkeysym;
|
guint xkeysym;
|
||||||
@ -965,17 +960,17 @@ send_fake_key_event (EekboardClient *client,
|
|||||||
modifiers |= keyboard_modifiers;
|
modifiers |= keyboard_modifiers;
|
||||||
|
|
||||||
send_fake_modifier_key_event (client, modifiers, is_pressed);
|
send_fake_modifier_key_event (client, modifiers, is_pressed);
|
||||||
XSync (GDK_DISPLAY_XDISPLAY (client->display), False);
|
XSync (GDK_DISPLAY_XDISPLAY (display), False);
|
||||||
|
|
||||||
keycode = XKeysymToKeycode (GDK_DISPLAY_XDISPLAY (client->display),
|
keycode = XKeysymToKeycode (GDK_DISPLAY_XDISPLAY (display),
|
||||||
xkeysym);
|
xkeysym);
|
||||||
g_return_if_fail (keycode > 0);
|
g_return_if_fail (keycode > 0);
|
||||||
|
|
||||||
XTestFakeKeyEvent (GDK_DISPLAY_XDISPLAY (client->display),
|
XTestFakeKeyEvent (GDK_DISPLAY_XDISPLAY (display),
|
||||||
keycode,
|
keycode,
|
||||||
is_pressed,
|
is_pressed,
|
||||||
CurrentTime);
|
CurrentTime);
|
||||||
XSync (GDK_DISPLAY_XDISPLAY (client->display), False);
|
XSync (GDK_DISPLAY_XDISPLAY (display), False);
|
||||||
|
|
||||||
if (replaced_keysym)
|
if (replaced_keysym)
|
||||||
replace_keycode (client, &keycode, &replaced_keysym);
|
replace_keycode (client, &keycode, &replaced_keysym);
|
||||||
@ -1001,10 +996,11 @@ on_key_released (EekKeyboard *keyboard,
|
|||||||
static void
|
static void
|
||||||
update_modifier_keycodes (EekboardClient *client)
|
update_modifier_keycodes (EekboardClient *client)
|
||||||
{
|
{
|
||||||
|
GdkDisplay *display = gdk_display_get_default ();
|
||||||
XModifierKeymap *mods;
|
XModifierKeymap *mods;
|
||||||
gint i, j;
|
gint i, j;
|
||||||
|
|
||||||
mods = XGetModifierMapping (GDK_DISPLAY_XDISPLAY (client->display));
|
mods = XGetModifierMapping (GDK_DISPLAY_XDISPLAY (display));
|
||||||
for (i = 0; i < 8; i++) {
|
for (i = 0; i < 8; i++) {
|
||||||
client->modifier_keycodes[i] = 0;
|
client->modifier_keycodes[i] = 0;
|
||||||
for (j = 0; j < mods->max_keypermod; j++) {
|
for (j = 0; j < mods->max_keypermod; j++) {
|
||||||
@ -1020,21 +1016,19 @@ update_modifier_keycodes (EekboardClient *client)
|
|||||||
gboolean
|
gboolean
|
||||||
eekboard_client_enable_xtest (EekboardClient *client)
|
eekboard_client_enable_xtest (EekboardClient *client)
|
||||||
{
|
{
|
||||||
|
GdkDisplay *display = gdk_display_get_default ();
|
||||||
int opcode, event_base, error_base, major_version, minor_version;
|
int opcode, event_base, error_base, major_version, minor_version;
|
||||||
|
|
||||||
if (!client->display) {
|
g_assert (display);
|
||||||
client->display = gdk_display_get_default ();
|
|
||||||
}
|
|
||||||
g_assert (client->display);
|
|
||||||
|
|
||||||
if (!XTestQueryExtension (GDK_DISPLAY_XDISPLAY (client->display),
|
if (!XTestQueryExtension (GDK_DISPLAY_XDISPLAY (display),
|
||||||
&event_base, &error_base,
|
&event_base, &error_base,
|
||||||
&major_version, &minor_version)) {
|
&major_version, &minor_version)) {
|
||||||
g_warning ("XTest extension is not available");
|
g_warning ("XTest extension is not available");
|
||||||
return FALSE;
|
return FALSE;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (!XkbQueryExtension (GDK_DISPLAY_XDISPLAY (client->display),
|
if (!XkbQueryExtension (GDK_DISPLAY_XDISPLAY (display),
|
||||||
&opcode, &event_base, &error_base,
|
&opcode, &event_base, &error_base,
|
||||||
&major_version, &minor_version)) {
|
&major_version, &minor_version)) {
|
||||||
g_warning ("Xkb extension is not available");
|
g_warning ("Xkb extension is not available");
|
||||||
@ -1042,7 +1036,7 @@ eekboard_client_enable_xtest (EekboardClient *client)
|
|||||||
}
|
}
|
||||||
|
|
||||||
if (!client->xkb)
|
if (!client->xkb)
|
||||||
client->xkb = XkbGetMap (GDK_DISPLAY_XDISPLAY (client->display),
|
client->xkb = XkbGetMap (GDK_DISPLAY_XDISPLAY (display),
|
||||||
XkbKeySymsMask,
|
XkbKeySymsMask,
|
||||||
XkbUseCoreKbd);
|
XkbUseCoreKbd);
|
||||||
g_assert (client->xkb);
|
g_assert (client->xkb);
|
||||||
|
|||||||
Reference in New Issue
Block a user