Keyboard shows up on a single ShowKeyboard

This commit is contained in:
Dorota Czaplejewicz
2019-03-16 14:24:07 +00:00
parent 8087c3e5d4
commit d3410fdc61
3 changed files with 59 additions and 133 deletions

View File

@ -31,8 +31,8 @@
#include "eekboard/key-emitter.h" #include "eekboard/key-emitter.h"
#include "eekboard/eekboard-context-service.h" #include "eekboard/eekboard-context-service.h"
#include "eekboard/eekboard-xklutil.h" //#include "eekboard/eekboard-xklutil.h"
#include "eek/eek-xkl.h" //#include "eek/eek-xkl.h"
#define CSW 640 #define CSW 640
#define CSH 480 #define CSH 480
@ -350,28 +350,42 @@ eekboard_context_service_finalize (GObject *object)
finalize (object); finalize (object);
} }
// declaration for eekboard_context_service_constructed
static void
emit_group_changed_signal (EekboardContextService *context,
gint group);
static void static void
eekboard_context_service_constructed (GObject *object) eekboard_context_service_constructed (GObject *object)
{ {
EekboardContextService *context = EEKBOARD_CONTEXT_SERVICE (object); EekboardContextService *context = EEKBOARD_CONTEXT_SERVICE (object);
EekboardContextServiceClass *klass = EEKBOARD_CONTEXT_SERVICE_GET_CLASS(context);
static guint keyboard_id = 0;
const gchar *keyboard_type = "us"; // TODO: fetch from gsettings
EekKeyboard *keyboard;
// create a keyboard
keyboard = klass->create_keyboard (context, keyboard_type);
eek_keyboard_set_modifier_behavior (keyboard,
EEK_MODIFIER_BEHAVIOR_LATCH);
if (context->priv->connection && context->priv->object_path) { keyboard_id++;
GError *error = NULL; g_hash_table_insert (context->priv->keyboard_hash,
context->priv->registration_id = g_dbus_connection_register_object GUINT_TO_POINTER(keyboard_id),
(context->priv->connection, keyboard);
context->priv->object_path, g_object_set_data (G_OBJECT(keyboard),
context->priv->introspection_data->interfaces[0], "keyboard-id",
&interface_vtable, GUINT_TO_POINTER(keyboard_id));
context, // set as current
NULL, if (context->priv->keyboard)
&error); disconnect_keyboard_signals (context);
if (context->priv->registration_id == 0) { context->priv->keyboard = keyboard;
g_warning ("failed to register context object: %s", connect_keyboard_signals (context);
error->message); gint group;
g_error_free (error); group = eek_element_get_group (EEK_ELEMENT(context->priv->keyboard));
} emit_group_changed_signal (context, group);
}
g_object_notify (G_OBJECT(context), "keyboard");
} }
static void static void
@ -570,6 +584,7 @@ static void
emit_visibility_changed_signal (EekboardContextService *context, emit_visibility_changed_signal (EekboardContextService *context,
gboolean visible) gboolean visible)
{ {
return; // FIXME: update Visible property
if (context->priv->connection && context->priv->enabled) { if (context->priv->connection && context->priv->enabled) {
GError *error = NULL; GError *error = NULL;
gboolean retval; gboolean retval;
@ -772,38 +787,6 @@ handle_method_call (GDBusConnection *connection,
context->priv->repeat_timeout_id = 0; context->priv->repeat_timeout_id = 0;
} }
if (g_strcmp0 (method_name, "AddKeyboard") == 0) {
const gchar *keyboard_type;
static guint keyboard_id = 0;
EekKeyboard *keyboard;
g_variant_get (parameters, "(&s)", &keyboard_type);
keyboard = klass->create_keyboard (context, keyboard_type);
if (keyboard == NULL) {
g_dbus_method_invocation_return_error (invocation,
G_IO_ERROR,
G_IO_ERROR_FAILED_HANDLED,
"can't create a keyboard");
return;
}
eek_keyboard_set_modifier_behavior (keyboard,
EEK_MODIFIER_BEHAVIOR_LATCH);
keyboard_id++;
g_hash_table_insert (context->priv->keyboard_hash,
GUINT_TO_POINTER(keyboard_id),
keyboard);
g_object_set_data (G_OBJECT(keyboard),
"keyboard-id",
GUINT_TO_POINTER(keyboard_id));
g_dbus_method_invocation_return_value (invocation,
g_variant_new ("(u)",
keyboard_id));
return;
}
if (g_strcmp0 (method_name, "RemoveKeyboard") == 0) { if (g_strcmp0 (method_name, "RemoveKeyboard") == 0) {
guint keyboard_id, current_keyboard_id; guint keyboard_id, current_keyboard_id;
@ -826,43 +809,6 @@ handle_method_call (GDBusConnection *connection,
return; return;
} }
if (g_strcmp0 (method_name, "SetKeyboard") == 0) {
EekKeyboard *keyboard;
guint keyboard_id;
gint group;
g_variant_get (parameters, "(u)", &keyboard_id);
keyboard = g_hash_table_lookup (context->priv->keyboard_hash,
GUINT_TO_POINTER(keyboard_id));
if (!keyboard) {
g_dbus_method_invocation_return_error (invocation,
G_IO_ERROR,
G_IO_ERROR_FAILED_HANDLED,
"no such keyboard");
return;
}
if (keyboard == context->priv->keyboard) {
g_dbus_method_invocation_return_value (invocation, NULL);
return;
}
if (context->priv->keyboard)
disconnect_keyboard_signals (context);
context->priv->keyboard = keyboard;
connect_keyboard_signals (context);
g_dbus_method_invocation_return_value (invocation, NULL);
group = eek_element_get_group (EEK_ELEMENT(context->priv->keyboard));
emit_group_changed_signal (context, group);
g_object_notify (G_OBJECT(context), "keyboard");
return;
}
if (g_strcmp0 (method_name, "SetFullscreen") == 0) { if (g_strcmp0 (method_name, "SetFullscreen") == 0) {
gboolean fullscreen; gboolean fullscreen;
@ -979,24 +925,7 @@ eekboard_context_service_enable (EekboardContextService *context)
g_return_if_fail (context->priv->connection); g_return_if_fail (context->priv->connection);
if (!context->priv->enabled) { if (!context->priv->enabled) {
gboolean retval;
context->priv->enabled = TRUE; context->priv->enabled = TRUE;
error = NULL;
retval = g_dbus_connection_emit_signal (context->priv->connection,
NULL,
context->priv->object_path,
EEKBOARD_CONTEXT_SERVICE_INTERFACE,
"Enabled",
NULL,
&error);
if (!retval) {
g_warning ("failed to emit Enabled signal: %s",
error->message);
g_error_free (error);
g_assert_not_reached ();
}
g_signal_emit (context, signals[ENABLED], 0); g_signal_emit (context, signals[ENABLED], 0);
} }
} }

View File

@ -30,6 +30,8 @@
#include "eekboard/eekboard-service.h" #include "eekboard/eekboard-service.h"
#include <stdio.h>
enum { enum {
PROP_0, PROP_0,
PROP_OBJECT_PATH, PROP_OBJECT_PATH,
@ -210,6 +212,25 @@ eekboard_service_constructed (GObject *object)
g_error_free (error); g_error_free (error);
} }
} }
// CreateContext
EekboardServiceClass *klass = EEKBOARD_SERVICE_GET_CLASS(service);
EekboardContextService *context;
g_assert (klass->create_context);
context = klass->create_context (service, "client_name", "object_path");
g_object_set_data_full (G_OBJECT(context),
"owner", g_strdup ("sender"),
(GDestroyNotify)g_free);
g_hash_table_insert (service->priv->context_hash,
"object_path",
context);
// PushContext
service->priv->context_stack = g_slist_prepend (service->priv->context_stack,
g_object_ref (context));
eekboard_context_service_enable (context);
} }
static void static void
@ -383,37 +404,10 @@ handle_method_call (GDBusConnection *connection,
EekboardServiceClass *klass = EEKBOARD_SERVICE_GET_CLASS(service); EekboardServiceClass *klass = EEKBOARD_SERVICE_GET_CLASS(service);
if (g_strcmp0 (method_name, "CreateContext") == 0) { if (g_strcmp0 (method_name, "CreateContext") == 0) {
const gchar *client_name; printf("Ignoring CreateContext call\n");
gchar *object_path;
static gint context_id = 0;
EekboardContextService *context;
g_variant_get (parameters, "(&s)", &client_name);
object_path = g_strdup_printf (EEKBOARD_CONTEXT_SERVICE_PATH, context_id++);
g_assert (klass->create_context);
context = klass->create_context (service, client_name, object_path);
g_object_set_data_full (G_OBJECT(context),
"owner", g_strdup (sender),
(GDestroyNotify)g_free);
g_hash_table_insert (service->priv->context_hash,
object_path,
context);
/* the vanished callback is called when clients are disconnected */
g_bus_watch_name_on_connection (service->priv->connection,
sender,
G_BUS_NAME_WATCHER_FLAGS_NONE,
NULL,
service_name_vanished_callback,
service,
NULL);
g_signal_connect (G_OBJECT(context), "destroyed",
G_CALLBACK(context_destroyed_cb), service);
g_dbus_method_invocation_return_value (invocation, g_dbus_method_invocation_return_value (invocation,
g_variant_new ("(s)", g_variant_new ("(s)",
object_path)); "object_path"));
return; return;
} }
@ -482,6 +476,7 @@ handle_method_call (GDBusConnection *connection,
} else { } else {
service->priv->visible = TRUE; service->priv->visible = TRUE;
} }
g_dbus_method_invocation_return_value (invocation, NULL);
return; return;
} }
@ -491,6 +486,7 @@ handle_method_call (GDBusConnection *connection,
} else { } else {
service->priv->visible = FALSE; service->priv->visible = FALSE;
} }
g_dbus_method_invocation_return_value (invocation, NULL);
return; return;
} }

View File

@ -122,6 +122,7 @@ int WaylandFakeKeyEvent(
unsigned long delay unsigned long delay
) { ) {
printf("Sending fake event %d press %d delay %d\n", keycode, is_press, delay); printf("Sending fake event %d press %d delay %d\n", keycode, is_press, delay);
return 0;
} }
static void static void