Keyboard shows up on a single ShowKeyboard
This commit is contained in:
		@ -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);
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
				
			|||||||
@ -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;
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
				
			|||||||
@ -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
 | 
				
			||||||
 | 
				
			|||||||
		Reference in New Issue
	
	Block a user