Merge remote-tracking branch 'upstream/master' into log
This commit is contained in:
20
Cargo.lock
generated
20
Cargo.lock
generated
@ -5,7 +5,7 @@ name = "aho-corasick"
|
|||||||
version = "0.7.6"
|
version = "0.7.6"
|
||||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
dependencies = [
|
dependencies = [
|
||||||
"memchr 2.2.1 (registry+https://github.com/rust-lang/crates.io-index)",
|
"memchr 2.3.0 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||||
]
|
]
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
@ -69,7 +69,7 @@ dependencies = [
|
|||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "cc"
|
name = "cc"
|
||||||
version = "1.0.49"
|
version = "1.0.50"
|
||||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
@ -221,7 +221,7 @@ dependencies = [
|
|||||||
"bitflags 1.0.4 (registry+https://github.com/rust-lang/crates.io-index)",
|
"bitflags 1.0.4 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||||
"cairo-rs 0.5.0 (registry+https://github.com/rust-lang/crates.io-index)",
|
"cairo-rs 0.5.0 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||||
"cairo-sys-rs 0.7.0 (registry+https://github.com/rust-lang/crates.io-index)",
|
"cairo-sys-rs 0.7.0 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||||
"cc 1.0.49 (registry+https://github.com/rust-lang/crates.io-index)",
|
"cc 1.0.50 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||||
"gdk 0.9.0 (registry+https://github.com/rust-lang/crates.io-index)",
|
"gdk 0.9.0 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||||
"gdk-pixbuf 0.5.0 (registry+https://github.com/rust-lang/crates.io-index)",
|
"gdk-pixbuf 0.5.0 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||||
"gdk-pixbuf-sys 0.7.0 (registry+https://github.com/rust-lang/crates.io-index)",
|
"gdk-pixbuf-sys 0.7.0 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||||
@ -284,7 +284,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index"
|
|||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "memchr"
|
name = "memchr"
|
||||||
version = "2.2.1"
|
version = "2.3.0"
|
||||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
@ -348,15 +348,15 @@ version = "1.1.9"
|
|||||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
dependencies = [
|
dependencies = [
|
||||||
"aho-corasick 0.7.6 (registry+https://github.com/rust-lang/crates.io-index)",
|
"aho-corasick 0.7.6 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||||
"memchr 2.2.1 (registry+https://github.com/rust-lang/crates.io-index)",
|
"memchr 2.3.0 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||||
"regex-syntax 0.6.12 (registry+https://github.com/rust-lang/crates.io-index)",
|
"regex-syntax 0.6.13 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||||
"thread_local 0.3.6 (registry+https://github.com/rust-lang/crates.io-index)",
|
"thread_local 0.3.6 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||||
"utf8-ranges 1.0.4 (registry+https://github.com/rust-lang/crates.io-index)",
|
"utf8-ranges 1.0.4 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||||
]
|
]
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "regex-syntax"
|
name = "regex-syntax"
|
||||||
version = "0.6.12"
|
version = "0.6.13"
|
||||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
@ -504,7 +504,7 @@ dependencies = [
|
|||||||
"checksum bitflags 1.0.4 (registry+https://github.com/rust-lang/crates.io-index)" = "228047a76f468627ca71776ecdebd732a3423081fcf5125585bcd7c49886ce12"
|
"checksum bitflags 1.0.4 (registry+https://github.com/rust-lang/crates.io-index)" = "228047a76f468627ca71776ecdebd732a3423081fcf5125585bcd7c49886ce12"
|
||||||
"checksum cairo-rs 0.5.0 (registry+https://github.com/rust-lang/crates.io-index)" = "dd940f0d609699e343ef71c4af5f66423afbf30d666f796dabd8fd15229cf5b6"
|
"checksum cairo-rs 0.5.0 (registry+https://github.com/rust-lang/crates.io-index)" = "dd940f0d609699e343ef71c4af5f66423afbf30d666f796dabd8fd15229cf5b6"
|
||||||
"checksum cairo-sys-rs 0.7.0 (registry+https://github.com/rust-lang/crates.io-index)" = "d25596627380be4381247dba06c69ad05ca21b3b065bd9827e416882ac41dcd2"
|
"checksum cairo-sys-rs 0.7.0 (registry+https://github.com/rust-lang/crates.io-index)" = "d25596627380be4381247dba06c69ad05ca21b3b065bd9827e416882ac41dcd2"
|
||||||
"checksum cc 1.0.49 (registry+https://github.com/rust-lang/crates.io-index)" = "e450b8da92aa6f274e7c6437692f9f2ce6d701fb73bacfcf87897b3f89a4c20e"
|
"checksum cc 1.0.50 (registry+https://github.com/rust-lang/crates.io-index)" = "95e28fa049fda1c330bcf9d723be7663a899c4679724b34c81e9f5a326aab8cd"
|
||||||
"checksum clap 2.32.0 (registry+https://github.com/rust-lang/crates.io-index)" = "b957d88f4b6a63b9d70d5f454ac8011819c6efa7727858f458ab71c756ce2d3e"
|
"checksum clap 2.32.0 (registry+https://github.com/rust-lang/crates.io-index)" = "b957d88f4b6a63b9d70d5f454ac8011819c6efa7727858f458ab71c756ce2d3e"
|
||||||
"checksum dtoa 0.4.4 (registry+https://github.com/rust-lang/crates.io-index)" = "ea57b42383d091c85abcc2706240b94ab2a8fa1fc81c10ff23c4de06e2a90b5e"
|
"checksum dtoa 0.4.4 (registry+https://github.com/rust-lang/crates.io-index)" = "ea57b42383d091c85abcc2706240b94ab2a8fa1fc81c10ff23c4de06e2a90b5e"
|
||||||
"checksum fragile 0.3.0 (registry+https://github.com/rust-lang/crates.io-index)" = "05f8140122fa0d5dcb9fc8627cfce2b37cc1500f752636d46ea28bc26785c2f9"
|
"checksum fragile 0.3.0 (registry+https://github.com/rust-lang/crates.io-index)" = "05f8140122fa0d5dcb9fc8627cfce2b37cc1500f752636d46ea28bc26785c2f9"
|
||||||
@ -524,7 +524,7 @@ dependencies = [
|
|||||||
"checksum libc 0.2.66 (registry+https://github.com/rust-lang/crates.io-index)" = "d515b1f41455adea1313a4a2ac8a8a477634fbae63cc6100e3aebb207ce61558"
|
"checksum libc 0.2.66 (registry+https://github.com/rust-lang/crates.io-index)" = "d515b1f41455adea1313a4a2ac8a8a477634fbae63cc6100e3aebb207ce61558"
|
||||||
"checksum linked-hash-map 0.5.2 (registry+https://github.com/rust-lang/crates.io-index)" = "ae91b68aebc4ddb91978b11a1b02ddd8602a05ec19002801c5666000e05e0f83"
|
"checksum linked-hash-map 0.5.2 (registry+https://github.com/rust-lang/crates.io-index)" = "ae91b68aebc4ddb91978b11a1b02ddd8602a05ec19002801c5666000e05e0f83"
|
||||||
"checksum maplit 1.0.2 (registry+https://github.com/rust-lang/crates.io-index)" = "3e2e65a1a2e43cfcb47a895c4c8b10d1f4a61097f9f254f183aee60cad9c651d"
|
"checksum maplit 1.0.2 (registry+https://github.com/rust-lang/crates.io-index)" = "3e2e65a1a2e43cfcb47a895c4c8b10d1f4a61097f9f254f183aee60cad9c651d"
|
||||||
"checksum memchr 2.2.1 (registry+https://github.com/rust-lang/crates.io-index)" = "88579771288728879b57485cc7d6b07d648c9f0141eb955f8ab7f9d45394468e"
|
"checksum memchr 2.3.0 (registry+https://github.com/rust-lang/crates.io-index)" = "3197e20c7edb283f87c071ddfc7a2cca8f8e0b888c242959846a6fce03c72223"
|
||||||
"checksum memmap 0.7.0 (registry+https://github.com/rust-lang/crates.io-index)" = "6585fd95e7bb50d6cc31e20d4cf9afb4e2ba16c5846fc76793f11218da9c475b"
|
"checksum memmap 0.7.0 (registry+https://github.com/rust-lang/crates.io-index)" = "6585fd95e7bb50d6cc31e20d4cf9afb4e2ba16c5846fc76793f11218da9c475b"
|
||||||
"checksum pango 0.5.0 (registry+https://github.com/rust-lang/crates.io-index)" = "4c2cb169402a3eb1ba034a7cc7d95b8b1c106e9be5ba4be79a5a93dc1a2795f4"
|
"checksum pango 0.5.0 (registry+https://github.com/rust-lang/crates.io-index)" = "4c2cb169402a3eb1ba034a7cc7d95b8b1c106e9be5ba4be79a5a93dc1a2795f4"
|
||||||
"checksum pango-sys 0.7.0 (registry+https://github.com/rust-lang/crates.io-index)" = "d6eb49268e69dd0c1da5d3001a61aac08e2e9d2bfbe4ae4b19b9963c998f6453"
|
"checksum pango-sys 0.7.0 (registry+https://github.com/rust-lang/crates.io-index)" = "d6eb49268e69dd0c1da5d3001a61aac08e2e9d2bfbe4ae4b19b9963c998f6453"
|
||||||
@ -532,7 +532,7 @@ dependencies = [
|
|||||||
"checksum proc-macro2 1.0.7 (registry+https://github.com/rust-lang/crates.io-index)" = "0319972dcae462681daf4da1adeeaa066e3ebd29c69be96c6abb1259d2ee2bcc"
|
"checksum proc-macro2 1.0.7 (registry+https://github.com/rust-lang/crates.io-index)" = "0319972dcae462681daf4da1adeeaa066e3ebd29c69be96c6abb1259d2ee2bcc"
|
||||||
"checksum quote 1.0.2 (registry+https://github.com/rust-lang/crates.io-index)" = "053a8c8bcc71fcce321828dc897a98ab9760bef03a4fc36693c231e5b3216cfe"
|
"checksum quote 1.0.2 (registry+https://github.com/rust-lang/crates.io-index)" = "053a8c8bcc71fcce321828dc897a98ab9760bef03a4fc36693c231e5b3216cfe"
|
||||||
"checksum regex 1.1.9 (registry+https://github.com/rust-lang/crates.io-index)" = "d9d8297cc20bbb6184f8b45ff61c8ee6a9ac56c156cec8e38c3e5084773c44ad"
|
"checksum regex 1.1.9 (registry+https://github.com/rust-lang/crates.io-index)" = "d9d8297cc20bbb6184f8b45ff61c8ee6a9ac56c156cec8e38c3e5084773c44ad"
|
||||||
"checksum regex-syntax 0.6.12 (registry+https://github.com/rust-lang/crates.io-index)" = "11a7e20d1cce64ef2fed88b66d347f88bd9babb82845b2b858f3edbf59a4f716"
|
"checksum regex-syntax 0.6.13 (registry+https://github.com/rust-lang/crates.io-index)" = "e734e891f5b408a29efbf8309e656876276f49ab6a6ac208600b4419bd893d90"
|
||||||
"checksum serde 1.0.104 (registry+https://github.com/rust-lang/crates.io-index)" = "414115f25f818d7dfccec8ee535d76949ae78584fc4f79a6f45a904bf8ab4449"
|
"checksum serde 1.0.104 (registry+https://github.com/rust-lang/crates.io-index)" = "414115f25f818d7dfccec8ee535d76949ae78584fc4f79a6f45a904bf8ab4449"
|
||||||
"checksum serde_derive 1.0.104 (registry+https://github.com/rust-lang/crates.io-index)" = "128f9e303a5a29922045a830221b8f78ec74a5f544944f3d5984f8ec3895ef64"
|
"checksum serde_derive 1.0.104 (registry+https://github.com/rust-lang/crates.io-index)" = "128f9e303a5a29922045a830221b8f78ec74a5f544944f3d5984f8ec3895ef64"
|
||||||
"checksum serde_yaml 0.8.11 (registry+https://github.com/rust-lang/crates.io-index)" = "691b17f19fc1ec9d94ec0b5864859290dff279dbd7b03f017afda54eb36c3c35"
|
"checksum serde_yaml 0.8.11 (registry+https://github.com/rust-lang/crates.io-index)" = "691b17f19fc1ec9d94ec0b5864859290dff279dbd7b03f017afda54eb36c3c35"
|
||||||
|
|||||||
17
debian/changelog
vendored
17
debian/changelog
vendored
@ -1,3 +1,20 @@
|
|||||||
|
squeekboard (1.8.0) amber-phone; urgency=medium
|
||||||
|
|
||||||
|
[ Dorota Czaplejewicz ]
|
||||||
|
* translations: Use gnome-desktop's xkb info database for layout names
|
||||||
|
* translations: Make the code cleaner
|
||||||
|
* overlay: Add terminal
|
||||||
|
* eek-layout: Remove unused
|
||||||
|
* pre-release: Update deps
|
||||||
|
|
||||||
|
-- Dorota Czaplejewicz <dorota.czaplejewicz@puri.sm> Tue, 14 Jan 2020 13:55:00 +0000
|
||||||
|
|
||||||
|
squeekboard (1.7.0) amber-phone; urgency=medium
|
||||||
|
|
||||||
|
* New terminal layout appearing on terminal input hint
|
||||||
|
|
||||||
|
-- Dorota Czaplejewicz <dorota.czaplejewicz@puri.sm> Wed, 08 Jan 2020 11:53:07 +0000
|
||||||
|
|
||||||
squeekboard (1.7.0) amber-phone; urgency=medium
|
squeekboard (1.7.0) amber-phone; urgency=medium
|
||||||
|
|
||||||
* New terminal layout appearing on terminal input hint
|
* New terminal layout appearing on terminal input hint
|
||||||
|
|||||||
@ -31,7 +31,6 @@
|
|||||||
#include <glib/gprintf.h>
|
#include <glib/gprintf.h>
|
||||||
|
|
||||||
#include "eekboard/eekboard-context-service.h"
|
#include "eekboard/eekboard-context-service.h"
|
||||||
#include "eekboard/key-emitter.h"
|
|
||||||
#include "keymap.h"
|
#include "keymap.h"
|
||||||
#include "eek-keyboard.h"
|
#include "eek-keyboard.h"
|
||||||
|
|
||||||
|
|||||||
@ -37,7 +37,6 @@
|
|||||||
|
|
||||||
#include <gio/gio.h>
|
#include <gio/gio.h>
|
||||||
|
|
||||||
#include "eekboard/key-emitter.h"
|
|
||||||
#include "wayland.h"
|
#include "wayland.h"
|
||||||
|
|
||||||
#include "eek/eek-xml-layout.h"
|
#include "eek/eek-xml-layout.h"
|
||||||
@ -48,13 +47,10 @@
|
|||||||
enum {
|
enum {
|
||||||
PROP_0, // Magic: without this, keyboard is not useable in g_object_notify
|
PROP_0, // Magic: without this, keyboard is not useable in g_object_notify
|
||||||
PROP_KEYBOARD,
|
PROP_KEYBOARD,
|
||||||
PROP_VISIBLE,
|
|
||||||
PROP_LAST
|
PROP_LAST
|
||||||
};
|
};
|
||||||
|
|
||||||
enum {
|
enum {
|
||||||
ENABLED,
|
|
||||||
DISABLED,
|
|
||||||
DESTROYED,
|
DESTROYED,
|
||||||
LAST_SIGNAL
|
LAST_SIGNAL
|
||||||
};
|
};
|
||||||
@ -65,17 +61,18 @@ static guint signals[LAST_SIGNAL] = { 0, };
|
|||||||
(G_TYPE_INSTANCE_GET_PRIVATE ((obj), EEKBOARD_TYPE_CONTEXT_SERVICE, EekboardContextServicePrivate))
|
(G_TYPE_INSTANCE_GET_PRIVATE ((obj), EEKBOARD_TYPE_CONTEXT_SERVICE, EekboardContextServicePrivate))
|
||||||
|
|
||||||
struct _EekboardContextServicePrivate {
|
struct _EekboardContextServicePrivate {
|
||||||
gboolean enabled;
|
|
||||||
gboolean visible;
|
|
||||||
|
|
||||||
LevelKeyboard *keyboard; // currently used keyboard
|
LevelKeyboard *keyboard; // currently used keyboard
|
||||||
GHashTable *keyboard_hash; // a table of available keyboards, per layout
|
GHashTable *keyboard_hash; // a table of available keyboards, per layout
|
||||||
|
|
||||||
char *overlay;
|
char *overlay;
|
||||||
|
|
||||||
GSettings *settings;
|
GSettings *settings; // Owned reference
|
||||||
uint32_t hint;
|
uint32_t hint;
|
||||||
uint32_t purpose;
|
uint32_t purpose;
|
||||||
|
|
||||||
|
// Maybe TODO: it's used only for fetching layout type.
|
||||||
|
// Maybe let UI push the type to this structure?
|
||||||
|
ServerContextService *ui; // unowned reference
|
||||||
};
|
};
|
||||||
|
|
||||||
G_DEFINE_TYPE_WITH_PRIVATE (EekboardContextService, eekboard_context_service, G_TYPE_OBJECT);
|
G_DEFINE_TYPE_WITH_PRIVATE (EekboardContextService, eekboard_context_service, G_TYPE_OBJECT);
|
||||||
@ -135,35 +132,14 @@ eekboard_context_service_real_create_keyboard (EekboardContextService *self,
|
|||||||
return keyboard;
|
return keyboard;
|
||||||
}
|
}
|
||||||
|
|
||||||
static void
|
|
||||||
eekboard_context_service_real_show_keyboard (EekboardContextService *self)
|
|
||||||
{
|
|
||||||
self->priv->visible = TRUE;
|
|
||||||
}
|
|
||||||
|
|
||||||
static void
|
|
||||||
eekboard_context_service_real_hide_keyboard (EekboardContextService *self)
|
|
||||||
{
|
|
||||||
self->priv->visible = FALSE;
|
|
||||||
}
|
|
||||||
|
|
||||||
static void
|
static void
|
||||||
eekboard_context_service_set_property (GObject *object,
|
eekboard_context_service_set_property (GObject *object,
|
||||||
guint prop_id,
|
guint prop_id,
|
||||||
const GValue *value,
|
const GValue *value,
|
||||||
GParamSpec *pspec)
|
GParamSpec *pspec)
|
||||||
{
|
{
|
||||||
EekboardContextService *context = EEKBOARD_CONTEXT_SERVICE(object);
|
(void)value;
|
||||||
|
|
||||||
switch (prop_id) {
|
switch (prop_id) {
|
||||||
case PROP_KEYBOARD:
|
|
||||||
if (context->priv->keyboard)
|
|
||||||
g_object_unref (context->priv->keyboard);
|
|
||||||
context->priv->keyboard = g_value_get_object (value);
|
|
||||||
break;
|
|
||||||
case PROP_VISIBLE:
|
|
||||||
context->priv->visible = g_value_get_boolean (value);
|
|
||||||
break;
|
|
||||||
default:
|
default:
|
||||||
G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
|
G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
|
||||||
break;
|
break;
|
||||||
@ -182,9 +158,6 @@ eekboard_context_service_get_property (GObject *object,
|
|||||||
case PROP_KEYBOARD:
|
case PROP_KEYBOARD:
|
||||||
g_value_set_object (value, context->priv->keyboard);
|
g_value_set_object (value, context->priv->keyboard);
|
||||||
break;
|
break;
|
||||||
case PROP_VISIBLE:
|
|
||||||
g_value_set_boolean (value, context->priv->visible);
|
|
||||||
break;
|
|
||||||
default:
|
default:
|
||||||
G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
|
G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
|
||||||
break;
|
break;
|
||||||
@ -249,6 +222,11 @@ eekboard_context_service_update_layout(EekboardContextService *context, enum squ
|
|||||||
LevelKeyboard *previous_keyboard = context->priv->keyboard;
|
LevelKeyboard *previous_keyboard = context->priv->keyboard;
|
||||||
context->priv->keyboard = keyboard;
|
context->priv->keyboard = keyboard;
|
||||||
|
|
||||||
|
// The keymap will get set even if the window is hidden.
|
||||||
|
// It's not perfect,
|
||||||
|
// but simpler than adding a check in the window showing procedure
|
||||||
|
eekboard_context_service_set_keymap(context, keyboard);
|
||||||
|
|
||||||
g_object_notify (G_OBJECT(context), "keyboard");
|
g_object_notify (G_OBJECT(context), "keyboard");
|
||||||
|
|
||||||
// replacing the keyboard above will cause the previous keyboard to get destroyed from the UI side (eek_gtk_keyboard_dispose)
|
// replacing the keyboard above will cause the previous keyboard to get destroyed from the UI side (eek_gtk_keyboard_dispose)
|
||||||
@ -258,7 +236,12 @@ eekboard_context_service_update_layout(EekboardContextService *context, enum squ
|
|||||||
}
|
}
|
||||||
|
|
||||||
static void update_layout_and_type(EekboardContextService *context) {
|
static void update_layout_and_type(EekboardContextService *context) {
|
||||||
eekboard_context_service_update_layout(context, server_context_service_get_layout_type(context));
|
EekboardContextServicePrivate *priv = EEKBOARD_CONTEXT_SERVICE_GET_PRIVATE(context);
|
||||||
|
enum squeek_arrangement_kind layout_kind = ARRANGEMENT_KIND_BASE;
|
||||||
|
if (priv->ui) {
|
||||||
|
layout_kind = server_context_service_get_layout_type(priv->ui);
|
||||||
|
}
|
||||||
|
eekboard_context_service_update_layout(context, layout_kind);
|
||||||
}
|
}
|
||||||
|
|
||||||
static gboolean
|
static gboolean
|
||||||
@ -294,48 +277,10 @@ eekboard_context_service_class_init (EekboardContextServiceClass *klass)
|
|||||||
GObjectClass *gobject_class = G_OBJECT_CLASS (klass);
|
GObjectClass *gobject_class = G_OBJECT_CLASS (klass);
|
||||||
GParamSpec *pspec;
|
GParamSpec *pspec;
|
||||||
|
|
||||||
klass->show_keyboard = eekboard_context_service_real_show_keyboard;
|
|
||||||
klass->hide_keyboard = eekboard_context_service_real_hide_keyboard;
|
|
||||||
|
|
||||||
gobject_class->constructed = eekboard_context_service_constructed;
|
gobject_class->constructed = eekboard_context_service_constructed;
|
||||||
gobject_class->set_property = eekboard_context_service_set_property;
|
gobject_class->set_property = eekboard_context_service_set_property;
|
||||||
gobject_class->get_property = eekboard_context_service_get_property;
|
gobject_class->get_property = eekboard_context_service_get_property;
|
||||||
gobject_class->dispose = eekboard_context_service_dispose;
|
gobject_class->dispose = eekboard_context_service_dispose;
|
||||||
|
|
||||||
/**
|
|
||||||
* EekboardContextService::enabled:
|
|
||||||
* @context: an #EekboardContextService
|
|
||||||
*
|
|
||||||
* Emitted when @context is enabled.
|
|
||||||
*/
|
|
||||||
signals[ENABLED] =
|
|
||||||
g_signal_new (I_("enabled"),
|
|
||||||
G_TYPE_FROM_CLASS(gobject_class),
|
|
||||||
G_SIGNAL_RUN_LAST,
|
|
||||||
G_STRUCT_OFFSET(EekboardContextServiceClass, enabled),
|
|
||||||
NULL,
|
|
||||||
NULL,
|
|
||||||
g_cclosure_marshal_VOID__VOID,
|
|
||||||
G_TYPE_NONE,
|
|
||||||
0);
|
|
||||||
|
|
||||||
/**
|
|
||||||
* EekboardContextService::disabled:
|
|
||||||
* @context: an #EekboardContextService
|
|
||||||
*
|
|
||||||
* Emitted when @context is enabled.
|
|
||||||
*/
|
|
||||||
signals[DISABLED] =
|
|
||||||
g_signal_new (I_("disabled"),
|
|
||||||
G_TYPE_FROM_CLASS(gobject_class),
|
|
||||||
G_SIGNAL_RUN_LAST,
|
|
||||||
G_STRUCT_OFFSET(EekboardContextServiceClass, disabled),
|
|
||||||
NULL,
|
|
||||||
NULL,
|
|
||||||
g_cclosure_marshal_VOID__VOID,
|
|
||||||
G_TYPE_NONE,
|
|
||||||
0);
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* EekboardContextService::destroyed:
|
* EekboardContextService::destroyed:
|
||||||
* @context: an #EekboardContextService
|
* @context: an #EekboardContextService
|
||||||
@ -361,24 +306,10 @@ eekboard_context_service_class_init (EekboardContextServiceClass *klass)
|
|||||||
pspec = g_param_spec_pointer("keyboard",
|
pspec = g_param_spec_pointer("keyboard",
|
||||||
"Keyboard",
|
"Keyboard",
|
||||||
"Keyboard",
|
"Keyboard",
|
||||||
G_PARAM_READWRITE);
|
G_PARAM_READABLE);
|
||||||
g_object_class_install_property (gobject_class,
|
g_object_class_install_property (gobject_class,
|
||||||
PROP_KEYBOARD,
|
PROP_KEYBOARD,
|
||||||
pspec);
|
pspec);
|
||||||
|
|
||||||
/**
|
|
||||||
* EekboardContextService:visible:
|
|
||||||
*
|
|
||||||
* Flag to indicate if keyboard is visible or not.
|
|
||||||
*/
|
|
||||||
pspec = g_param_spec_boolean ("visible",
|
|
||||||
"Visible",
|
|
||||||
"Visible",
|
|
||||||
FALSE,
|
|
||||||
G_PARAM_READWRITE);
|
|
||||||
g_object_class_install_property (gobject_class,
|
|
||||||
PROP_VISIBLE,
|
|
||||||
pspec);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
static void
|
static void
|
||||||
@ -404,62 +335,6 @@ eekboard_context_service_init (EekboardContextService *self)
|
|||||||
self->priv->overlay = NULL;
|
self->priv->overlay = NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
|
||||||
* eekboard_context_service_enable:
|
|
||||||
* @context: an #EekboardContextService
|
|
||||||
*
|
|
||||||
* Enable @context. This function is called when @context is pushed
|
|
||||||
* by eekboard_service_push_context().
|
|
||||||
*/
|
|
||||||
void
|
|
||||||
eekboard_context_service_enable (EekboardContextService *context)
|
|
||||||
{
|
|
||||||
g_return_if_fail (EEKBOARD_IS_CONTEXT_SERVICE(context));
|
|
||||||
|
|
||||||
if (!context->priv->enabled) {
|
|
||||||
context->priv->enabled = TRUE;
|
|
||||||
g_signal_emit (context, signals[ENABLED], 0);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* eekboard_context_service_disable:
|
|
||||||
* @context: an #EekboardContextService
|
|
||||||
*
|
|
||||||
* Disable @context. This function is called when @context is pushed
|
|
||||||
* by eekboard_service_pop_context().
|
|
||||||
*/
|
|
||||||
void
|
|
||||||
eekboard_context_service_disable (EekboardContextService *context)
|
|
||||||
{
|
|
||||||
g_return_if_fail (EEKBOARD_IS_CONTEXT_SERVICE(context));
|
|
||||||
|
|
||||||
if (context->priv->enabled) {
|
|
||||||
context->priv->enabled = FALSE;
|
|
||||||
g_signal_emit (context, signals[DISABLED], 0);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
void
|
|
||||||
eekboard_context_service_show_keyboard (EekboardContextService *context)
|
|
||||||
{
|
|
||||||
g_return_if_fail (EEKBOARD_IS_CONTEXT_SERVICE(context));
|
|
||||||
|
|
||||||
if (!context->priv->visible) {
|
|
||||||
EEKBOARD_CONTEXT_SERVICE_GET_CLASS(context)->show_keyboard (context);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
void
|
|
||||||
eekboard_context_service_hide_keyboard (EekboardContextService *context)
|
|
||||||
{
|
|
||||||
g_return_if_fail (EEKBOARD_IS_CONTEXT_SERVICE(context));
|
|
||||||
|
|
||||||
if (context->priv->visible) {
|
|
||||||
EEKBOARD_CONTEXT_SERVICE_GET_CLASS(context)->hide_keyboard (context);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* eekboard_context_service_destroy:
|
* eekboard_context_service_destroy:
|
||||||
* @context: an #EekboardContextService
|
* @context: an #EekboardContextService
|
||||||
@ -471,9 +346,6 @@ eekboard_context_service_destroy (EekboardContextService *context)
|
|||||||
{
|
{
|
||||||
g_return_if_fail (EEKBOARD_IS_CONTEXT_SERVICE(context));
|
g_return_if_fail (EEKBOARD_IS_CONTEXT_SERVICE(context));
|
||||||
|
|
||||||
if (context->priv->enabled) {
|
|
||||||
eekboard_context_service_disable (context);
|
|
||||||
}
|
|
||||||
g_free(context->priv->overlay);
|
g_free(context->priv->overlay);
|
||||||
g_signal_emit (context, signals[DESTROYED], 0);
|
g_signal_emit (context, signals[DESTROYED], 0);
|
||||||
}
|
}
|
||||||
@ -521,3 +393,8 @@ const char*
|
|||||||
eekboard_context_service_get_overlay(EekboardContextService *context) {
|
eekboard_context_service_get_overlay(EekboardContextService *context) {
|
||||||
return context->priv->overlay;
|
return context->priv->overlay;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
EekboardContextService *eekboard_context_service_new()
|
||||||
|
{
|
||||||
|
return g_object_new (EEKBOARD_TYPE_CONTEXT_SERVICE, NULL);
|
||||||
|
}
|
||||||
|
|||||||
@ -46,6 +46,8 @@ typedef struct _EekboardContextServicePrivate EekboardContextServicePrivate;
|
|||||||
/**
|
/**
|
||||||
* EekboardContextService:
|
* EekboardContextService:
|
||||||
*
|
*
|
||||||
|
* Handles layout state, gsettings, and virtual-keyboard.
|
||||||
|
*
|
||||||
* TODO: Restrict to managing keyboard layouts, and maybe button repeats,
|
* TODO: Restrict to managing keyboard layouts, and maybe button repeats,
|
||||||
* and the virtual keyboard protocol.
|
* and the virtual keyboard protocol.
|
||||||
*
|
*
|
||||||
@ -63,8 +65,6 @@ struct _EekboardContextService {
|
|||||||
/**
|
/**
|
||||||
* EekboardContextServiceClass:
|
* EekboardContextServiceClass:
|
||||||
* @create_keyboard: virtual function for create a keyboard from string
|
* @create_keyboard: virtual function for create a keyboard from string
|
||||||
* @show_keyboard: virtual function for show a keyboard
|
|
||||||
* @hide_keyboard: virtual function for hide a keyboard
|
|
||||||
* @enabled: class handler for #EekboardContextService::enabled signal
|
* @enabled: class handler for #EekboardContextService::enabled signal
|
||||||
* @disabled: class handler for #EekboardContextService::disabled signal
|
* @disabled: class handler for #EekboardContextService::disabled signal
|
||||||
*/
|
*/
|
||||||
@ -75,12 +75,8 @@ struct _EekboardContextServiceClass {
|
|||||||
/*< public >*/
|
/*< public >*/
|
||||||
struct squeek_view *(*create_keyboard) (EekboardContextService *self,
|
struct squeek_view *(*create_keyboard) (EekboardContextService *self,
|
||||||
const gchar *keyboard_type);
|
const gchar *keyboard_type);
|
||||||
void (*show_keyboard) (EekboardContextService *self);
|
|
||||||
void (*hide_keyboard) (EekboardContextService *self);
|
|
||||||
|
|
||||||
/* signals */
|
/* signals */
|
||||||
void (*enabled) (EekboardContextService *self);
|
|
||||||
void (*disabled) (EekboardContextService *self);
|
|
||||||
void (*destroyed) (EekboardContextService *self);
|
void (*destroyed) (EekboardContextService *self);
|
||||||
|
|
||||||
/*< private >*/
|
/*< private >*/
|
||||||
@ -88,14 +84,10 @@ struct _EekboardContextServiceClass {
|
|||||||
gpointer pdummy[24];
|
gpointer pdummy[24];
|
||||||
};
|
};
|
||||||
|
|
||||||
|
EekboardContextService *eekboard_context_service_new();
|
||||||
GType eekboard_context_service_get_type
|
GType eekboard_context_service_get_type
|
||||||
(void) G_GNUC_CONST;
|
(void) G_GNUC_CONST;
|
||||||
void eekboard_context_service_enable (EekboardContextService *context);
|
EekboardContextService *eekboard_context_service_new(void);
|
||||||
void eekboard_context_service_disable (EekboardContextService *context);
|
|
||||||
void eekboard_context_service_show_keyboard
|
|
||||||
(EekboardContextService *context);
|
|
||||||
void eekboard_context_service_hide_keyboard
|
|
||||||
(EekboardContextService *context);
|
|
||||||
void eekboard_context_service_destroy (EekboardContextService *context);
|
void eekboard_context_service_destroy (EekboardContextService *context);
|
||||||
LevelKeyboard *eekboard_context_service_get_keyboard(EekboardContextService *context);
|
LevelKeyboard *eekboard_context_service_get_keyboard(EekboardContextService *context);
|
||||||
|
|
||||||
|
|||||||
@ -1,310 +0,0 @@
|
|||||||
/*
|
|
||||||
* Copyright (C) 2010-2011 Daiki Ueno <ueno@unixuser.org>
|
|
||||||
* Copyright (C) 2010-2011 Red Hat, Inc.
|
|
||||||
*
|
|
||||||
* This program is free software: you can redistribute it and/or modify
|
|
||||||
* it under the terms of the GNU General Public License as published by
|
|
||||||
* the Free Software Foundation, either version 3 of the License, or
|
|
||||||
* (at your option) any later version.
|
|
||||||
*
|
|
||||||
* This program is distributed in the hope that it will be useful,
|
|
||||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
||||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
||||||
* GNU General Public License for more details.
|
|
||||||
*
|
|
||||||
* You should have received a copy of the GNU General Public License
|
|
||||||
* along with this program. If not, see <http://www.gnu.org/licenses/>.
|
|
||||||
*/
|
|
||||||
|
|
||||||
/**
|
|
||||||
* SECTION:eekboard-service
|
|
||||||
* @short_description: base implementation of eekboard service
|
|
||||||
*
|
|
||||||
* Provides a dbus object, and contains the context.
|
|
||||||
*
|
|
||||||
* The #EekboardService class provides a base server side
|
|
||||||
* implementation of eekboard service.
|
|
||||||
*/
|
|
||||||
|
|
||||||
#include "config.h"
|
|
||||||
|
|
||||||
#include "sm.puri.OSK0.h"
|
|
||||||
|
|
||||||
#include <stdio.h>
|
|
||||||
|
|
||||||
#include <gio/gio.h>
|
|
||||||
|
|
||||||
#include "eekboard/eekboard-service.h"
|
|
||||||
|
|
||||||
enum {
|
|
||||||
PROP_0,
|
|
||||||
PROP_OBJECT_PATH,
|
|
||||||
PROP_CONNECTION,
|
|
||||||
PROP_LAST
|
|
||||||
};
|
|
||||||
|
|
||||||
enum {
|
|
||||||
DESTROYED,
|
|
||||||
LAST_SIGNAL
|
|
||||||
};
|
|
||||||
|
|
||||||
static guint signals[LAST_SIGNAL] = { 0, };
|
|
||||||
|
|
||||||
typedef struct _EekboardServicePrivate
|
|
||||||
{
|
|
||||||
GDBusConnection *connection;
|
|
||||||
SmPuriOSK0 *dbus_interface;
|
|
||||||
GDBusNodeInfo *introspection_data;
|
|
||||||
guint registration_id;
|
|
||||||
char *object_path;
|
|
||||||
|
|
||||||
EekboardContextService *context; // unowned reference
|
|
||||||
} EekboardServicePrivate;
|
|
||||||
|
|
||||||
G_DEFINE_TYPE_WITH_PRIVATE (EekboardService, eekboard_service, G_TYPE_OBJECT)
|
|
||||||
|
|
||||||
static void
|
|
||||||
eekboard_service_set_property (GObject *object,
|
|
||||||
guint prop_id,
|
|
||||||
const GValue *value,
|
|
||||||
GParamSpec *pspec)
|
|
||||||
{
|
|
||||||
EekboardService *service = EEKBOARD_SERVICE(object);
|
|
||||||
EekboardServicePrivate *priv = eekboard_service_get_instance_private (service);
|
|
||||||
GDBusConnection *connection;
|
|
||||||
|
|
||||||
switch (prop_id) {
|
|
||||||
case PROP_OBJECT_PATH:
|
|
||||||
if (priv->object_path)
|
|
||||||
g_free (priv->object_path);
|
|
||||||
priv->object_path = g_value_dup_string (value);
|
|
||||||
break;
|
|
||||||
case PROP_CONNECTION:
|
|
||||||
connection = g_value_get_object (value);
|
|
||||||
if (priv->connection)
|
|
||||||
g_object_unref (priv->connection);
|
|
||||||
priv->connection = g_object_ref (connection);
|
|
||||||
break;
|
|
||||||
default:
|
|
||||||
G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
static void
|
|
||||||
eekboard_service_get_property (GObject *object,
|
|
||||||
guint prop_id,
|
|
||||||
GValue *value,
|
|
||||||
GParamSpec *pspec)
|
|
||||||
{
|
|
||||||
EekboardService *service = EEKBOARD_SERVICE(object);
|
|
||||||
EekboardServicePrivate *priv = eekboard_service_get_instance_private (service);
|
|
||||||
|
|
||||||
switch (prop_id) {
|
|
||||||
case PROP_OBJECT_PATH:
|
|
||||||
g_value_set_string (value, priv->object_path);
|
|
||||||
break;
|
|
||||||
case PROP_CONNECTION:
|
|
||||||
g_value_set_object (value, priv->connection);
|
|
||||||
break;
|
|
||||||
default:
|
|
||||||
G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
static void
|
|
||||||
eekboard_service_dispose (GObject *object)
|
|
||||||
{
|
|
||||||
EekboardService *service = EEKBOARD_SERVICE(object);
|
|
||||||
EekboardServicePrivate *priv = eekboard_service_get_instance_private (service);
|
|
||||||
|
|
||||||
if (priv->connection) {
|
|
||||||
if (priv->registration_id > 0) {
|
|
||||||
g_dbus_connection_unregister_object (priv->connection,
|
|
||||||
priv->registration_id);
|
|
||||||
priv->registration_id = 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
g_object_unref (priv->connection);
|
|
||||||
priv->connection = NULL;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (priv->introspection_data) {
|
|
||||||
g_dbus_node_info_unref (priv->introspection_data);
|
|
||||||
priv->introspection_data = NULL;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (priv->context) {
|
|
||||||
g_signal_handlers_disconnect_by_data (priv->context, service);
|
|
||||||
priv->context = NULL;
|
|
||||||
}
|
|
||||||
|
|
||||||
G_OBJECT_CLASS (eekboard_service_parent_class)->dispose (object);
|
|
||||||
}
|
|
||||||
|
|
||||||
static void
|
|
||||||
eekboard_service_finalize (GObject *object)
|
|
||||||
{
|
|
||||||
EekboardService *service = EEKBOARD_SERVICE(object);
|
|
||||||
EekboardServicePrivate *priv = eekboard_service_get_instance_private (service);
|
|
||||||
|
|
||||||
g_free (priv->object_path);
|
|
||||||
|
|
||||||
G_OBJECT_CLASS (eekboard_service_parent_class)->finalize (object);
|
|
||||||
}
|
|
||||||
|
|
||||||
static gboolean
|
|
||||||
handle_set_visible(SmPuriOSK0 *object, GDBusMethodInvocation *invocation,
|
|
||||||
gboolean arg_visible, gpointer user_data) {
|
|
||||||
EekboardService *service = user_data;
|
|
||||||
EekboardServicePrivate *priv = eekboard_service_get_instance_private (service);
|
|
||||||
|
|
||||||
if (priv->context) {
|
|
||||||
if (arg_visible) {
|
|
||||||
eekboard_context_service_show_keyboard (priv->context);
|
|
||||||
} else {
|
|
||||||
eekboard_context_service_hide_keyboard (priv->context);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
sm_puri_osk0_complete_set_visible(object, invocation);
|
|
||||||
return TRUE;
|
|
||||||
}
|
|
||||||
|
|
||||||
static void on_visible(EekboardService *service,
|
|
||||||
GParamSpec *pspec,
|
|
||||||
EekboardContextService *context)
|
|
||||||
{
|
|
||||||
gboolean visible;
|
|
||||||
EekboardServicePrivate *priv;
|
|
||||||
|
|
||||||
g_return_if_fail (EEKBOARD_IS_SERVICE (service));
|
|
||||||
g_return_if_fail (EEKBOARD_IS_CONTEXT_SERVICE (context));
|
|
||||||
|
|
||||||
priv = eekboard_service_get_instance_private (service);
|
|
||||||
g_object_get (context, "visible", &visible, NULL);
|
|
||||||
|
|
||||||
sm_puri_osk0_set_visible(priv->dbus_interface, visible);
|
|
||||||
}
|
|
||||||
|
|
||||||
static void
|
|
||||||
eekboard_service_constructed (GObject *object)
|
|
||||||
{
|
|
||||||
EekboardService *service = EEKBOARD_SERVICE(object);
|
|
||||||
EekboardServicePrivate *priv = eekboard_service_get_instance_private (service);
|
|
||||||
|
|
||||||
priv->dbus_interface = sm_puri_osk0_skeleton_new();
|
|
||||||
g_signal_connect(priv->dbus_interface, "handle-set-visible",
|
|
||||||
G_CALLBACK(handle_set_visible), service);
|
|
||||||
|
|
||||||
if (priv->connection && priv->object_path) {
|
|
||||||
GError *error = NULL;
|
|
||||||
|
|
||||||
if (!g_dbus_interface_skeleton_export(G_DBUS_INTERFACE_SKELETON(priv->dbus_interface),
|
|
||||||
priv->connection,
|
|
||||||
priv->object_path,
|
|
||||||
&error)) {
|
|
||||||
g_warning("Error registering dbus object: %s\n", error->message);
|
|
||||||
g_clear_error(&error);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
static void
|
|
||||||
eekboard_service_class_init (EekboardServiceClass *klass)
|
|
||||||
{
|
|
||||||
GObjectClass *gobject_class = G_OBJECT_CLASS (klass);
|
|
||||||
GParamSpec *pspec;
|
|
||||||
|
|
||||||
klass->create_context = NULL;
|
|
||||||
|
|
||||||
gobject_class->constructed = eekboard_service_constructed;
|
|
||||||
gobject_class->set_property = eekboard_service_set_property;
|
|
||||||
gobject_class->get_property = eekboard_service_get_property;
|
|
||||||
gobject_class->dispose = eekboard_service_dispose;
|
|
||||||
gobject_class->finalize = eekboard_service_finalize;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* EekboardService::destroyed:
|
|
||||||
* @service: an #EekboardService
|
|
||||||
*
|
|
||||||
* The ::destroyed signal is emitted when the service is vanished.
|
|
||||||
*/
|
|
||||||
signals[DESTROYED] =
|
|
||||||
g_signal_new (I_("destroyed"),
|
|
||||||
G_TYPE_FROM_CLASS(gobject_class),
|
|
||||||
G_SIGNAL_RUN_LAST,
|
|
||||||
0,
|
|
||||||
NULL,
|
|
||||||
NULL,
|
|
||||||
g_cclosure_marshal_VOID__VOID,
|
|
||||||
G_TYPE_NONE,
|
|
||||||
0);
|
|
||||||
|
|
||||||
/**
|
|
||||||
* EekboardService:object-path:
|
|
||||||
*
|
|
||||||
* D-Bus object path.
|
|
||||||
*/
|
|
||||||
pspec = g_param_spec_string ("object-path",
|
|
||||||
"Object-path",
|
|
||||||
"Object-path",
|
|
||||||
NULL,
|
|
||||||
G_PARAM_CONSTRUCT | G_PARAM_READWRITE);
|
|
||||||
g_object_class_install_property (gobject_class,
|
|
||||||
PROP_OBJECT_PATH,
|
|
||||||
pspec);
|
|
||||||
|
|
||||||
/**
|
|
||||||
* EekboardService:connection:
|
|
||||||
*
|
|
||||||
* D-Bus connection.
|
|
||||||
*/
|
|
||||||
pspec = g_param_spec_object ("connection",
|
|
||||||
"Connection",
|
|
||||||
"Connection",
|
|
||||||
G_TYPE_DBUS_CONNECTION,
|
|
||||||
G_PARAM_CONSTRUCT | G_PARAM_READWRITE);
|
|
||||||
g_object_class_install_property (gobject_class,
|
|
||||||
PROP_CONNECTION,
|
|
||||||
pspec);
|
|
||||||
}
|
|
||||||
|
|
||||||
static void
|
|
||||||
eekboard_service_init (EekboardService *self)
|
|
||||||
{
|
|
||||||
EekboardServicePrivate *priv = eekboard_service_get_instance_private (self);
|
|
||||||
|
|
||||||
priv->context = NULL;
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* eekboard_service_new:
|
|
||||||
* @connection: a #GDBusConnection
|
|
||||||
* @object_path: object path
|
|
||||||
*/
|
|
||||||
EekboardService *
|
|
||||||
eekboard_service_new (GDBusConnection *connection,
|
|
||||||
const gchar *object_path)
|
|
||||||
{
|
|
||||||
return g_object_new (EEKBOARD_TYPE_SERVICE,
|
|
||||||
"object-path", object_path,
|
|
||||||
"connection", connection,
|
|
||||||
NULL);
|
|
||||||
}
|
|
||||||
|
|
||||||
void
|
|
||||||
eekboard_service_set_context(EekboardService *service,
|
|
||||||
EekboardContextService *context)
|
|
||||||
{
|
|
||||||
EekboardServicePrivate *priv = eekboard_service_get_instance_private (service);
|
|
||||||
|
|
||||||
g_return_if_fail (!priv->context);
|
|
||||||
|
|
||||||
priv->context = context;
|
|
||||||
|
|
||||||
g_signal_connect_swapped (priv->context,
|
|
||||||
"notify::visible",
|
|
||||||
G_CALLBACK(on_visible),
|
|
||||||
service);
|
|
||||||
}
|
|
||||||
@ -1,55 +0,0 @@
|
|||||||
/*
|
|
||||||
* Copyright (C) 2010-2011 Daiki Ueno <ueno@unixuser.org>
|
|
||||||
* Copyright (C) 2010-2011 Red Hat, Inc.
|
|
||||||
*
|
|
||||||
* This program is free software: you can redistribute it and/or modify
|
|
||||||
* it under the terms of the GNU General Public License as published by
|
|
||||||
* the Free Software Foundation, either version 3 of the License, or
|
|
||||||
* (at your option) any later version.
|
|
||||||
*
|
|
||||||
* This program is distributed in the hope that it will be useful,
|
|
||||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
||||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
||||||
* GNU General Public License for more details.
|
|
||||||
*
|
|
||||||
* You should have received a copy of the GNU General Public License
|
|
||||||
* along with this program. If not, see <http://www.gnu.org/licenses/>.
|
|
||||||
*/
|
|
||||||
#ifndef EEKBOARD_SERVICE_H
|
|
||||||
#define EEKBOARD_SERVICE_H 1
|
|
||||||
|
|
||||||
#define __EEKBOARD_SERVICE_H_INSIDE__ 1
|
|
||||||
|
|
||||||
#include "eekboard/eekboard-context-service.h"
|
|
||||||
|
|
||||||
G_BEGIN_DECLS
|
|
||||||
|
|
||||||
#define EEKBOARD_SERVICE_PATH "/sm/puri/OSK0"
|
|
||||||
#define EEKBOARD_SERVICE_INTERFACE "sm.puri.OSK0"
|
|
||||||
|
|
||||||
#define EEKBOARD_TYPE_SERVICE (eekboard_service_get_type())
|
|
||||||
G_DECLARE_DERIVABLE_TYPE (EekboardService, eekboard_service, EEKBOARD, SERVICE, GObject)
|
|
||||||
|
|
||||||
/**
|
|
||||||
* EekboardServiceClass:
|
|
||||||
* @create_context: virtual function for creating a context
|
|
||||||
*/
|
|
||||||
struct _EekboardServiceClass {
|
|
||||||
/*< private >*/
|
|
||||||
GObjectClass parent_class;
|
|
||||||
|
|
||||||
/*< public >*/
|
|
||||||
EekboardContextService *(*create_context) (EekboardService *self);
|
|
||||||
|
|
||||||
/*< private >*/
|
|
||||||
/* padding */
|
|
||||||
gpointer pdummy[24];
|
|
||||||
};
|
|
||||||
|
|
||||||
GType eekboard_service_get_type (void) G_GNUC_CONST;
|
|
||||||
EekboardService * eekboard_service_new (GDBusConnection *connection,
|
|
||||||
const gchar *object_path);
|
|
||||||
void eekboard_service_set_context(EekboardService *service,
|
|
||||||
EekboardContextService *context);
|
|
||||||
G_END_DECLS
|
|
||||||
#endif /* EEKBOARD_SERVICE_H */
|
|
||||||
@ -1,136 +0,0 @@
|
|||||||
/*
|
|
||||||
* Copyright (C) 2011 Daiki Ueno <ueno@unixuser.org>
|
|
||||||
* Copyright (C) 2011 Red Hat, Inc.
|
|
||||||
* Copyright (C) 2019 Purism, SPC
|
|
||||||
*
|
|
||||||
* This program is free software: you can redistribute it and/or modify
|
|
||||||
* it under the terms of the GNU General Public License as published by
|
|
||||||
* the Free Software Foundation, either version 3 of the License, or
|
|
||||||
* (at your option) any later version.
|
|
||||||
*
|
|
||||||
* This program is distributed in the hope that it will be useful,
|
|
||||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
||||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
||||||
* GNU General Public License for more details.
|
|
||||||
*
|
|
||||||
* You should have received a copy of the GNU General Public License
|
|
||||||
* along with this program. If not, see <http://www.gnu.org/licenses/>.
|
|
||||||
*/
|
|
||||||
|
|
||||||
/* This file is responsible for managing keycode data and emitting keycodes. */
|
|
||||||
|
|
||||||
#include "eekboard/key-emitter.h"
|
|
||||||
|
|
||||||
#include <gdk/gdk.h>
|
|
||||||
#include <X11/XKBlib.h>
|
|
||||||
|
|
||||||
#include "eekboard/eekboard-context-service.h"
|
|
||||||
|
|
||||||
// TODO: decide whether it's this struct that carries the keyboard around in key-emitter or if the whole manager should be dragged around
|
|
||||||
// if this is the carrier, then it should be made part of the manager
|
|
||||||
// hint: check which fields need to be persisted between keypresses; which between keyboards
|
|
||||||
typedef struct {
|
|
||||||
struct zwp_virtual_keyboard_v1 *virtual_keyboard; // unowned copy
|
|
||||||
struct xkb_keymap *keymap; // unowned copy
|
|
||||||
XkbDescRec *xkb;
|
|
||||||
guint modifier_keycodes[8];
|
|
||||||
guint modifier_indices[MOD_IDX_LAST];
|
|
||||||
guint group;
|
|
||||||
} SeatEmitter;
|
|
||||||
|
|
||||||
|
|
||||||
int send_virtual_keyboard_key(
|
|
||||||
struct zwp_virtual_keyboard_v1 *keyboard,
|
|
||||||
unsigned int keycode,
|
|
||||||
unsigned is_press,
|
|
||||||
uint32_t timestamp
|
|
||||||
) {
|
|
||||||
zwp_virtual_keyboard_v1_key(keyboard, timestamp, keycode, (unsigned)is_press);
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
/* Finds the first key code for each modifier and saves it in modifier_keycodes */
|
|
||||||
static void
|
|
||||||
update_modifier_info (SeatEmitter *client)
|
|
||||||
{
|
|
||||||
client->modifier_indices[MOD_IDX_SHIFT] = xkb_keymap_mod_get_index(client->keymap, XKB_MOD_NAME_SHIFT);
|
|
||||||
client->modifier_indices[MOD_IDX_CAPS] = xkb_keymap_mod_get_index(client->keymap, XKB_MOD_NAME_CAPS);
|
|
||||||
client->modifier_indices[MOD_IDX_CTRL] = xkb_keymap_mod_get_index(client->keymap, XKB_MOD_NAME_CTRL);
|
|
||||||
client->modifier_indices[MOD_IDX_ALT] = xkb_keymap_mod_get_index(client->keymap, XKB_MOD_NAME_ALT);
|
|
||||||
client->modifier_indices[MOD_IDX_NUM] = xkb_keymap_mod_get_index(client->keymap, XKB_MOD_NAME_NUM);
|
|
||||||
client->modifier_indices[MOD_IDX_MOD3] = xkb_keymap_mod_get_index(client->keymap, "Mod3");
|
|
||||||
client->modifier_indices[MOD_IDX_LOGO] = xkb_keymap_mod_get_index(client->keymap, XKB_MOD_NAME_LOGO);
|
|
||||||
client->modifier_indices[MOD_IDX_ALTGR] = xkb_keymap_mod_get_index(client->keymap, "Mod5");
|
|
||||||
client->modifier_indices[MOD_IDX_NUMLK] = xkb_keymap_mod_get_index(client->keymap, "NumLock");
|
|
||||||
client->modifier_indices[MOD_IDX_ALSO_ALT] = xkb_keymap_mod_get_index(client->keymap, "Alt");
|
|
||||||
client->modifier_indices[MOD_IDX_LVL3] = xkb_keymap_mod_get_index(client->keymap, "LevelThree");
|
|
||||||
client->modifier_indices[MOD_IDX_LALT] = xkb_keymap_mod_get_index(client->keymap, "LAlt");
|
|
||||||
client->modifier_indices[MOD_IDX_RALT] = xkb_keymap_mod_get_index(client->keymap, "RAlt");
|
|
||||||
client->modifier_indices[MOD_IDX_RCONTROL] = xkb_keymap_mod_get_index(client->keymap, "RControl");
|
|
||||||
client->modifier_indices[MOD_IDX_LCONTROL] = xkb_keymap_mod_get_index(client->keymap, "LControl");
|
|
||||||
client->modifier_indices[MOD_IDX_SCROLLLK] = xkb_keymap_mod_get_index(client->keymap, "ScrollLock");
|
|
||||||
client->modifier_indices[MOD_IDX_LVL5] = xkb_keymap_mod_get_index(client->keymap, "LevelFive");
|
|
||||||
client->modifier_indices[MOD_IDX_ALSO_ALTGR] = xkb_keymap_mod_get_index(client->keymap, "AltGr");
|
|
||||||
client->modifier_indices[MOD_IDX_META] = xkb_keymap_mod_get_index(client->keymap, "Meta");
|
|
||||||
client->modifier_indices[MOD_IDX_SUPER] = xkb_keymap_mod_get_index(client->keymap, "Super");
|
|
||||||
client->modifier_indices[MOD_IDX_HYPER] = xkb_keymap_mod_get_index(client->keymap, "Hyper");
|
|
||||||
|
|
||||||
/*
|
|
||||||
for (xkb_mod_index_t i = 0;
|
|
||||||
i < xkb_keymap_num_mods(client->keymap);
|
|
||||||
i++) {
|
|
||||||
g_log("squeek", G_LOG_LEVEL_DEBUG, "%s", xkb_keymap_mod_get_name(client->keymap, i));
|
|
||||||
}*/
|
|
||||||
}
|
|
||||||
|
|
||||||
static void
|
|
||||||
send_fake_key (SeatEmitter *emitter,
|
|
||||||
LevelKeyboard *keyboard,
|
|
||||||
guint keycode,
|
|
||||||
gboolean pressed,
|
|
||||||
uint32_t timestamp)
|
|
||||||
{
|
|
||||||
zwp_virtual_keyboard_v1_modifiers(emitter->virtual_keyboard, 0, 0, 0, 0);
|
|
||||||
send_virtual_keyboard_key (emitter->virtual_keyboard, keycode - 8, (unsigned)pressed, timestamp);
|
|
||||||
zwp_virtual_keyboard_v1_modifiers(emitter->virtual_keyboard, 0, 0, 0, 0);
|
|
||||||
}
|
|
||||||
|
|
||||||
void
|
|
||||||
emit_key_activated (EekboardContextService *manager,
|
|
||||||
LevelKeyboard *keyboard,
|
|
||||||
guint keycode,
|
|
||||||
gboolean pressed,
|
|
||||||
uint32_t timestamp)
|
|
||||||
{
|
|
||||||
/* FIXME: figure out how to deal with Client after key presses go through
|
|
||||||
if (g_strcmp0 (eek_symbol_get_name (symbol), "cycle-keyboard") == 0) {
|
|
||||||
client->keyboards_head = g_slist_next (client->keyboards_head);
|
|
||||||
if (client->keyboards_head == NULL)
|
|
||||||
client->keyboards_head = client->keyboards;
|
|
||||||
eekboard_context_set_keyboard (client->context,
|
|
||||||
GPOINTER_TO_UINT(client->keyboards_head->data),
|
|
||||||
NULL);
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (g_strcmp0 (eek_symbol_get_name (symbol), "preferences") == 0) {
|
|
||||||
gchar *argv[2];
|
|
||||||
GError *error;
|
|
||||||
|
|
||||||
argv[0] = g_build_filename (LIBEXECDIR, "eekboard-setup", NULL);
|
|
||||||
argv[1] = NULL;
|
|
||||||
|
|
||||||
error = NULL;
|
|
||||||
if (!g_spawn_async (NULL, argv, NULL, 0, NULL, NULL, NULL, &error)) {
|
|
||||||
g_warning ("can't spawn %s: %s", argv[0], error->message);
|
|
||||||
g_error_free (error);
|
|
||||||
}
|
|
||||||
g_free (argv[0]);
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
*/
|
|
||||||
SeatEmitter emitter = {0};
|
|
||||||
emitter.virtual_keyboard = manager->virtual_keyboard;
|
|
||||||
update_modifier_info (&emitter);
|
|
||||||
send_fake_key (&emitter, keyboard, keycode, pressed, timestamp);
|
|
||||||
}
|
|
||||||
@ -1,45 +0,0 @@
|
|||||||
#ifndef KEYEMITTER_H
|
|
||||||
#define KEYEMITTER_H
|
|
||||||
|
|
||||||
#include <inttypes.h>
|
|
||||||
#include <glib.h>
|
|
||||||
|
|
||||||
#include "eek/eek.h"
|
|
||||||
|
|
||||||
#include "virtual-keyboard-unstable-v1-client-protocol.h"
|
|
||||||
|
|
||||||
/// Indices obtained by xkb_keymap_mod_get_name
|
|
||||||
enum mod_indices {
|
|
||||||
MOD_IDX_SHIFT,
|
|
||||||
MOD_IDX_CAPS,
|
|
||||||
MOD_IDX_CTRL,
|
|
||||||
MOD_IDX_ALT,
|
|
||||||
MOD_IDX_NUM,
|
|
||||||
MOD_IDX_MOD3,
|
|
||||||
MOD_IDX_LOGO,
|
|
||||||
MOD_IDX_ALTGR,
|
|
||||||
MOD_IDX_NUMLK, // Caution, not sure which is the right one
|
|
||||||
MOD_IDX_ALSO_ALT, // Not sure why, alt emits the first alt on my setup
|
|
||||||
MOD_IDX_LVL3,
|
|
||||||
|
|
||||||
// Not sure if the next 4 are used at all
|
|
||||||
MOD_IDX_LALT,
|
|
||||||
MOD_IDX_RALT,
|
|
||||||
MOD_IDX_RCONTROL,
|
|
||||||
MOD_IDX_LCONTROL,
|
|
||||||
|
|
||||||
MOD_IDX_SCROLLLK,
|
|
||||||
MOD_IDX_LVL5,
|
|
||||||
MOD_IDX_ALSO_ALTGR, // Not used on my layout
|
|
||||||
MOD_IDX_META,
|
|
||||||
MOD_IDX_SUPER,
|
|
||||||
MOD_IDX_HYPER,
|
|
||||||
|
|
||||||
MOD_IDX_LAST,
|
|
||||||
};
|
|
||||||
|
|
||||||
void
|
|
||||||
emit_key_activated (EekboardContextService *manager, LevelKeyboard *keyboard,
|
|
||||||
guint keycode,
|
|
||||||
gboolean pressed, uint32_t timestamp);
|
|
||||||
#endif // KEYEMITTER_H
|
|
||||||
@ -1,7 +1,7 @@
|
|||||||
project(
|
project(
|
||||||
'squeekboard',
|
'squeekboard',
|
||||||
'c', 'rust',
|
'c', 'rust',
|
||||||
version: '1.7.0',
|
version: '1.8.0',
|
||||||
license: 'GPLv3',
|
license: 'GPLv3',
|
||||||
meson_version: '>=0.51.0',
|
meson_version: '>=0.51.0',
|
||||||
default_options: [
|
default_options: [
|
||||||
|
|||||||
124
src/dbus.c
Normal file
124
src/dbus.c
Normal file
@ -0,0 +1,124 @@
|
|||||||
|
/*
|
||||||
|
* Copyright (C) 2010-2011 Daiki Ueno <ueno@unixuser.org>
|
||||||
|
* Copyright (C) 2010-2011 Red Hat, Inc.
|
||||||
|
*
|
||||||
|
* This program is free software: you can redistribute it and/or modify
|
||||||
|
* it under the terms of the GNU General Public License as published by
|
||||||
|
* the Free Software Foundation, either version 3 of the License, or
|
||||||
|
* (at your option) any later version.
|
||||||
|
*
|
||||||
|
* This program is distributed in the hope that it will be useful,
|
||||||
|
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
|
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||||
|
* GNU General Public License for more details.
|
||||||
|
*
|
||||||
|
* You should have received a copy of the GNU General Public License
|
||||||
|
* along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||||
|
*/
|
||||||
|
|
||||||
|
#include "config.h"
|
||||||
|
|
||||||
|
#include "dbus.h"
|
||||||
|
|
||||||
|
#include <stdio.h>
|
||||||
|
#include <gio/gio.h>
|
||||||
|
|
||||||
|
void
|
||||||
|
dbus_handler_destroy(DBusHandler *service)
|
||||||
|
{
|
||||||
|
g_free (service->object_path);
|
||||||
|
|
||||||
|
if (service->connection) {
|
||||||
|
if (service->registration_id > 0) {
|
||||||
|
g_dbus_connection_unregister_object (service->connection,
|
||||||
|
service->registration_id);
|
||||||
|
service->registration_id = 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
g_object_unref (service->connection);
|
||||||
|
service->connection = NULL;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (service->introspection_data) {
|
||||||
|
g_dbus_node_info_unref (service->introspection_data);
|
||||||
|
service->introspection_data = NULL;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (service->context) {
|
||||||
|
g_signal_handlers_disconnect_by_data (service->context, service);
|
||||||
|
service->context = NULL;
|
||||||
|
}
|
||||||
|
|
||||||
|
free(service);
|
||||||
|
}
|
||||||
|
|
||||||
|
static gboolean
|
||||||
|
handle_set_visible(SmPuriOSK0 *object, GDBusMethodInvocation *invocation,
|
||||||
|
gboolean arg_visible, gpointer user_data) {
|
||||||
|
DBusHandler *service = user_data;
|
||||||
|
|
||||||
|
if (service->context) {
|
||||||
|
if (arg_visible) {
|
||||||
|
server_context_service_show_keyboard (service->context);
|
||||||
|
} else {
|
||||||
|
server_context_service_hide_keyboard (service->context);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
sm_puri_osk0_complete_set_visible(object, invocation);
|
||||||
|
return TRUE;
|
||||||
|
}
|
||||||
|
|
||||||
|
static void on_visible(DBusHandler *service,
|
||||||
|
GParamSpec *pspec,
|
||||||
|
ServerContextService *context)
|
||||||
|
{
|
||||||
|
(void)pspec;
|
||||||
|
gboolean visible;
|
||||||
|
|
||||||
|
g_return_if_fail (SERVER_IS_CONTEXT_SERVICE (context));
|
||||||
|
|
||||||
|
g_object_get (context, "visible", &visible, NULL);
|
||||||
|
|
||||||
|
sm_puri_osk0_set_visible(service->dbus_interface, visible);
|
||||||
|
}
|
||||||
|
|
||||||
|
DBusHandler *
|
||||||
|
dbus_handler_new (GDBusConnection *connection,
|
||||||
|
const gchar *object_path)
|
||||||
|
{
|
||||||
|
DBusHandler *self = calloc(1, sizeof(DBusHandler));
|
||||||
|
self->object_path = g_strdup(object_path);
|
||||||
|
self->connection = connection;
|
||||||
|
|
||||||
|
self->dbus_interface = sm_puri_osk0_skeleton_new();
|
||||||
|
g_signal_connect(self->dbus_interface, "handle-set-visible",
|
||||||
|
G_CALLBACK(handle_set_visible), self);
|
||||||
|
|
||||||
|
if (self->connection && self->object_path) {
|
||||||
|
GError *error = NULL;
|
||||||
|
|
||||||
|
if (!g_dbus_interface_skeleton_export(G_DBUS_INTERFACE_SKELETON(self->dbus_interface),
|
||||||
|
self->connection,
|
||||||
|
self->object_path,
|
||||||
|
&error)) {
|
||||||
|
g_warning("Error registering dbus object: %s\n", error->message);
|
||||||
|
g_clear_error(&error);
|
||||||
|
// TODO: return an error
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return self;
|
||||||
|
}
|
||||||
|
|
||||||
|
void
|
||||||
|
dbus_handler_set_ui_context(DBusHandler *service,
|
||||||
|
ServerContextService *context)
|
||||||
|
{
|
||||||
|
g_return_if_fail (!service->context);
|
||||||
|
|
||||||
|
service->context = context;
|
||||||
|
|
||||||
|
g_signal_connect_swapped (service->context,
|
||||||
|
"notify::visible",
|
||||||
|
G_CALLBACK(on_visible),
|
||||||
|
service);
|
||||||
|
}
|
||||||
48
src/dbus.h
Normal file
48
src/dbus.h
Normal file
@ -0,0 +1,48 @@
|
|||||||
|
/*
|
||||||
|
* Copyright (C) 2010-2011 Daiki Ueno <ueno@unixuser.org>
|
||||||
|
* Copyright (C) 2010-2011 Red Hat, Inc.
|
||||||
|
* Copyright (C) 2019-2020 Purism, SPC
|
||||||
|
*
|
||||||
|
* This program is free software: you can redistribute it and/or modify
|
||||||
|
* it under the terms of the GNU General Public License as published by
|
||||||
|
* the Free Software Foundation, either version 3 of the License, or
|
||||||
|
* (at your option) any later version.
|
||||||
|
*
|
||||||
|
* This program is distributed in the hope that it will be useful,
|
||||||
|
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
|
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||||
|
* GNU General Public License for more details.
|
||||||
|
*
|
||||||
|
* You should have received a copy of the GNU General Public License
|
||||||
|
* along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||||
|
*/
|
||||||
|
#ifndef DBUS_H_
|
||||||
|
#define DBUS_H_ 1
|
||||||
|
|
||||||
|
#include "server-context-service.h"
|
||||||
|
|
||||||
|
#include "sm.puri.OSK0.h"
|
||||||
|
|
||||||
|
G_BEGIN_DECLS
|
||||||
|
|
||||||
|
#define DBUS_SERVICE_PATH "/sm/puri/OSK0"
|
||||||
|
#define DBUS_SERVICE_INTERFACE "sm.puri.OSK0"
|
||||||
|
|
||||||
|
typedef struct _DBusHandler
|
||||||
|
{
|
||||||
|
GDBusConnection *connection;
|
||||||
|
SmPuriOSK0 *dbus_interface;
|
||||||
|
GDBusNodeInfo *introspection_data;
|
||||||
|
guint registration_id;
|
||||||
|
char *object_path;
|
||||||
|
|
||||||
|
ServerContextService *context; // unowned reference
|
||||||
|
} DBusHandler;
|
||||||
|
|
||||||
|
DBusHandler * dbus_handler_new (GDBusConnection *connection,
|
||||||
|
const gchar *object_path);
|
||||||
|
void dbus_handler_set_ui_context(DBusHandler *service,
|
||||||
|
ServerContextService *context);
|
||||||
|
void dbus_handler_destroy(DBusHandler*);
|
||||||
|
G_END_DECLS
|
||||||
|
#endif /* DBUS_H_ */
|
||||||
@ -2,9 +2,6 @@
|
|||||||
|
|
||||||
#include <glib.h>
|
#include <glib.h>
|
||||||
|
|
||||||
#include "eekboard/eekboard-context-service.h"
|
|
||||||
|
|
||||||
|
|
||||||
static const struct zwp_input_method_v2_listener input_method_listener = {
|
static const struct zwp_input_method_v2_listener input_method_listener = {
|
||||||
.activate = imservice_handle_input_method_activate,
|
.activate = imservice_handle_input_method_activate,
|
||||||
.deactivate = imservice_handle_input_method_deactivate,
|
.deactivate = imservice_handle_input_method_deactivate,
|
||||||
@ -15,11 +12,11 @@ static const struct zwp_input_method_v2_listener input_method_listener = {
|
|||||||
.unavailable = imservice_handle_unavailable,
|
.unavailable = imservice_handle_unavailable,
|
||||||
};
|
};
|
||||||
|
|
||||||
struct imservice* get_imservice(EekboardContextService *context,
|
struct imservice* get_imservice(struct zwp_input_method_manager_v2 *manager,
|
||||||
struct zwp_input_method_manager_v2 *manager,
|
struct wl_seat *seat,
|
||||||
struct wl_seat *seat) {
|
EekboardContextService *state) {
|
||||||
struct zwp_input_method_v2 *im = zwp_input_method_manager_v2_get_input_method(manager, seat);
|
struct zwp_input_method_v2 *im = zwp_input_method_manager_v2_get_input_method(manager, seat);
|
||||||
struct imservice *imservice = imservice_new(im, context);
|
struct imservice *imservice = imservice_new(im, state);
|
||||||
|
|
||||||
/* Add a listener, passing the imservice instance to make it available to
|
/* Add a listener, passing the imservice instance to make it available to
|
||||||
callbacks. */
|
callbacks. */
|
||||||
@ -28,14 +25,6 @@ struct imservice* get_imservice(EekboardContextService *context,
|
|||||||
return imservice;
|
return imservice;
|
||||||
}
|
}
|
||||||
|
|
||||||
void imservice_make_visible(EekboardContextService *context) {
|
|
||||||
eekboard_context_service_show_keyboard (context);
|
|
||||||
}
|
|
||||||
|
|
||||||
void imservice_try_hide(EekboardContextService *context) {
|
|
||||||
eekboard_context_service_hide_keyboard (context);
|
|
||||||
}
|
|
||||||
|
|
||||||
/// Declared explicitly because _destroy is inline,
|
/// Declared explicitly because _destroy is inline,
|
||||||
/// making it unavailable in Rust
|
/// making it unavailable in Rust
|
||||||
void imservice_destroy_im(struct zwp_input_method_v2 *im) {
|
void imservice_destroy_im(struct zwp_input_method_v2 *im) {
|
||||||
|
|||||||
@ -3,16 +3,18 @@
|
|||||||
|
|
||||||
#include "input-method-unstable-v2-client-protocol.h"
|
#include "input-method-unstable-v2-client-protocol.h"
|
||||||
#include "eek/eek-types.h"
|
#include "eek/eek-types.h"
|
||||||
|
#include "src/server-context-service.h"
|
||||||
|
|
||||||
struct imservice;
|
struct imservice;
|
||||||
|
|
||||||
struct imservice* get_imservice(EekboardContextService *context,
|
struct imservice* get_imservice(struct zwp_input_method_manager_v2 *manager,
|
||||||
struct zwp_input_method_manager_v2 *manager,
|
struct wl_seat *seat,
|
||||||
struct wl_seat *seat);
|
EekboardContextService *state);
|
||||||
|
|
||||||
// Defined in Rust
|
// Defined in Rust
|
||||||
struct imservice* imservice_new(struct zwp_input_method_v2 *im,
|
struct imservice* imservice_new(struct zwp_input_method_v2 *im, EekboardContextService *state);
|
||||||
EekboardContextService *context);
|
void imservice_set_ui(struct imservice *self, ServerContextService *ui_context);
|
||||||
|
|
||||||
void imservice_handle_input_method_activate(void *data, struct zwp_input_method_v2 *input_method);
|
void imservice_handle_input_method_activate(void *data, struct zwp_input_method_v2 *input_method);
|
||||||
void imservice_handle_input_method_deactivate(void *data, struct zwp_input_method_v2 *input_method);
|
void imservice_handle_input_method_deactivate(void *data, struct zwp_input_method_v2 *input_method);
|
||||||
void imservice_handle_surrounding_text(void *data, struct zwp_input_method_v2 *input_method,
|
void imservice_handle_surrounding_text(void *data, struct zwp_input_method_v2 *input_method,
|
||||||
|
|||||||
@ -24,27 +24,35 @@ pub mod c {
|
|||||||
#[repr(transparent)]
|
#[repr(transparent)]
|
||||||
pub struct InputMethod(*const c_void);
|
pub struct InputMethod(*const c_void);
|
||||||
|
|
||||||
/// EekboardContextService*
|
/// ServerContextService*
|
||||||
#[repr(transparent)]
|
#[repr(transparent)]
|
||||||
pub struct UIManager(*const c_void);
|
pub struct UIManager(*const c_void);
|
||||||
|
|
||||||
|
/// EekboardContextService*
|
||||||
|
#[repr(transparent)]
|
||||||
|
pub struct StateManager(*const c_void);
|
||||||
|
|
||||||
#[no_mangle]
|
#[no_mangle]
|
||||||
extern "C" {
|
extern "C" {
|
||||||
fn imservice_destroy_im(im: *mut c::InputMethod);
|
fn imservice_destroy_im(im: *mut c::InputMethod);
|
||||||
fn eekboard_context_service_set_hint_purpose(imservice: *const UIManager, hint: u32, purpose: u32);
|
fn eekboard_context_service_set_hint_purpose(state: *const StateManager, hint: u32, purpose: u32);
|
||||||
fn eekboard_context_service_show_keyboard(imservice: *const UIManager);
|
fn server_context_service_show_keyboard(imservice: *const UIManager);
|
||||||
fn eekboard_context_service_hide_keyboard(imservice: *const UIManager);
|
fn server_context_service_hide_keyboard(imservice: *const UIManager);
|
||||||
}
|
}
|
||||||
|
|
||||||
// The following defined in Rust. TODO: wrap naked pointers to Rust data inside RefCells to prevent multiple writers
|
// The following defined in Rust. TODO: wrap naked pointers to Rust data inside RefCells to prevent multiple writers
|
||||||
|
|
||||||
#[no_mangle]
|
#[no_mangle]
|
||||||
pub unsafe extern "C"
|
pub extern "C"
|
||||||
fn imservice_new(im: *const InputMethod, ui_manager: *const UIManager) -> *mut IMService {
|
fn imservice_new(
|
||||||
|
im: *const InputMethod,
|
||||||
|
state_manager: *const StateManager
|
||||||
|
) -> *mut IMService {
|
||||||
Box::<IMService>::into_raw(Box::new(
|
Box::<IMService>::into_raw(Box::new(
|
||||||
IMService {
|
IMService {
|
||||||
im: im,
|
im: im,
|
||||||
ui_manager: ui_manager,
|
state_manager: state_manager,
|
||||||
|
ui_manager: None,
|
||||||
pending: IMProtocolState::default(),
|
pending: IMProtocolState::default(),
|
||||||
current: IMProtocolState::default(),
|
current: IMProtocolState::default(),
|
||||||
preedit_string: String::new(),
|
preedit_string: String::new(),
|
||||||
@ -52,6 +60,20 @@ pub mod c {
|
|||||||
}
|
}
|
||||||
))
|
))
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#[no_mangle]
|
||||||
|
pub extern "C"
|
||||||
|
fn imservice_set_ui(imservice: *mut IMService, ui_manager: *const UIManager) {
|
||||||
|
if imservice.is_null() {
|
||||||
|
panic!("Null imservice pointer");
|
||||||
|
}
|
||||||
|
let imservice: &mut IMService = unsafe { &mut *imservice };
|
||||||
|
imservice.ui_manager = if ui_manager.is_null() {
|
||||||
|
None
|
||||||
|
} else {
|
||||||
|
Some(ui_manager)
|
||||||
|
};
|
||||||
|
}
|
||||||
|
|
||||||
// TODO: is unsafe needed here?
|
// TODO: is unsafe needed here?
|
||||||
#[no_mangle]
|
#[no_mangle]
|
||||||
@ -157,15 +179,20 @@ pub mod c {
|
|||||||
active: imservice.current.active,
|
active: imservice.current.active,
|
||||||
..IMProtocolState::default()
|
..IMProtocolState::default()
|
||||||
};
|
};
|
||||||
|
|
||||||
if active_changed {
|
if active_changed {
|
||||||
if imservice.current.active {
|
if imservice.current.active {
|
||||||
eekboard_context_service_show_keyboard(imservice.ui_manager);
|
if let Some(ui) = imservice.ui_manager {
|
||||||
|
server_context_service_show_keyboard(ui);
|
||||||
|
}
|
||||||
eekboard_context_service_set_hint_purpose(
|
eekboard_context_service_set_hint_purpose(
|
||||||
imservice.ui_manager,
|
imservice.state_manager,
|
||||||
imservice.current.content_hint.bits(),
|
imservice.current.content_hint.bits(),
|
||||||
imservice.current.content_purpose.clone() as u32);
|
imservice.current.content_purpose.clone() as u32);
|
||||||
} else {
|
} else {
|
||||||
eekboard_context_service_hide_keyboard(imservice.ui_manager);
|
if let Some(ui) = imservice.ui_manager {
|
||||||
|
server_context_service_hide_keyboard(ui);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -182,7 +209,9 @@ pub mod c {
|
|||||||
// the keyboard is already decommissioned
|
// the keyboard is already decommissioned
|
||||||
imservice.current.active = false;
|
imservice.current.active = false;
|
||||||
|
|
||||||
eekboard_context_service_hide_keyboard(imservice.ui_manager);
|
if let Some(ui) = imservice.ui_manager {
|
||||||
|
server_context_service_hide_keyboard(ui);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// FIXME: destroy and deallocate
|
// FIXME: destroy and deallocate
|
||||||
@ -334,7 +363,9 @@ pub struct IMService {
|
|||||||
/// Owned reference (still created and destroyed in C)
|
/// Owned reference (still created and destroyed in C)
|
||||||
pub im: *const c::InputMethod,
|
pub im: *const c::InputMethod,
|
||||||
/// Unowned reference. Be careful, it's shared with C at large
|
/// Unowned reference. Be careful, it's shared with C at large
|
||||||
ui_manager: *const c::UIManager,
|
ui_manager: Option<*const c::UIManager>,
|
||||||
|
/// Unowned reference. Be careful, it's shared with C at large
|
||||||
|
state_manager: *const c::StateManager,
|
||||||
|
|
||||||
pending: IMProtocolState,
|
pending: IMProtocolState,
|
||||||
current: IMProtocolState, // turn current into an idiomatic representation?
|
current: IMProtocolState, // turn current into an idiomatic representation?
|
||||||
|
|||||||
@ -336,11 +336,12 @@ pub mod c {
|
|||||||
.map(|place| place.button.state.clone())
|
.map(|place| place.button.state.clone())
|
||||||
};
|
};
|
||||||
|
|
||||||
if let Some(mut state) = state {
|
if let Some(state) = state {
|
||||||
layout.press_key(
|
seat::handle_press_key(
|
||||||
|
layout,
|
||||||
&VirtualKeyboard(virtual_keyboard),
|
&VirtualKeyboard(virtual_keyboard),
|
||||||
&mut state,
|
|
||||||
Timestamp(time),
|
Timestamp(time),
|
||||||
|
&state,
|
||||||
);
|
);
|
||||||
// maybe TODO: draw on the display buffer here
|
// maybe TODO: draw on the display buffer here
|
||||||
drawing::queue_redraw(ui_keyboard);
|
drawing::queue_redraw(ui_keyboard);
|
||||||
@ -383,7 +384,7 @@ pub mod c {
|
|||||||
)})
|
)})
|
||||||
};
|
};
|
||||||
|
|
||||||
if let Some((mut state, _button, _view_position)) = button_info {
|
if let Some((state, _button, _view_position)) = button_info {
|
||||||
let mut found = false;
|
let mut found = false;
|
||||||
for wrapped_key in pressed {
|
for wrapped_key in pressed {
|
||||||
let key: &Rc<RefCell<KeyState>> = wrapped_key.borrow();
|
let key: &Rc<RefCell<KeyState>> = wrapped_key.borrow();
|
||||||
@ -401,7 +402,12 @@ pub mod c {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
if !found {
|
if !found {
|
||||||
layout.press_key(&virtual_keyboard, &mut state, time);
|
seat::handle_press_key(
|
||||||
|
layout,
|
||||||
|
&virtual_keyboard,
|
||||||
|
time,
|
||||||
|
&state,
|
||||||
|
);
|
||||||
// maybe TODO: draw on the display buffer here
|
// maybe TODO: draw on the display buffer here
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
@ -663,27 +669,6 @@ impl Layout {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
fn press_key(
|
|
||||||
&mut self,
|
|
||||||
virtual_keyboard: &VirtualKeyboard,
|
|
||||||
rckey: &mut Rc<RefCell<KeyState>>,
|
|
||||||
time: Timestamp,
|
|
||||||
) {
|
|
||||||
if !self.pressed_keys.insert(::util::Pointer(rckey.clone())) {
|
|
||||||
log_print!(
|
|
||||||
logging::Level::Bug,
|
|
||||||
"Key {:?} was already pressed", rckey,
|
|
||||||
);
|
|
||||||
}
|
|
||||||
let mut key = rckey.borrow_mut();
|
|
||||||
virtual_keyboard.switch(
|
|
||||||
&key.keycodes,
|
|
||||||
PressType::Pressed,
|
|
||||||
time,
|
|
||||||
);
|
|
||||||
key.pressed = PressType::Pressed;
|
|
||||||
}
|
|
||||||
|
|
||||||
/// Calculates size without margins
|
/// Calculates size without margins
|
||||||
fn calculate_inner_size(&self) -> Size {
|
fn calculate_inner_size(&self) -> Size {
|
||||||
Size {
|
Size {
|
||||||
@ -879,6 +864,24 @@ mod seat {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
pub fn handle_press_key(
|
||||||
|
layout: &mut Layout,
|
||||||
|
virtual_keyboard: &VirtualKeyboard,
|
||||||
|
time: Timestamp,
|
||||||
|
rckey: &Rc<RefCell<KeyState>>,
|
||||||
|
) {
|
||||||
|
if !layout.pressed_keys.insert(::util::Pointer(rckey.clone())) {
|
||||||
|
eprintln!("Warning: key {:?} was already pressed", rckey);
|
||||||
|
}
|
||||||
|
let mut key = rckey.borrow_mut();
|
||||||
|
virtual_keyboard.switch(
|
||||||
|
&key.keycodes,
|
||||||
|
PressType::Pressed,
|
||||||
|
time,
|
||||||
|
);
|
||||||
|
key.pressed = PressType::Pressed;
|
||||||
|
}
|
||||||
|
|
||||||
pub fn handle_release_key(
|
pub fn handle_release_key(
|
||||||
layout: &mut Layout,
|
layout: &mut Layout,
|
||||||
virtual_keyboard: &VirtualKeyboard,
|
virtual_keyboard: &VirtualKeyboard,
|
||||||
|
|||||||
@ -12,6 +12,7 @@ config_h = configure_file(
|
|||||||
|
|
||||||
sources = [
|
sources = [
|
||||||
config_h,
|
config_h,
|
||||||
|
'dbus.c',
|
||||||
'imservice.c',
|
'imservice.c',
|
||||||
'server-context-service.c',
|
'server-context-service.c',
|
||||||
'wayland.c',
|
'wayland.c',
|
||||||
@ -24,9 +25,7 @@ sources = [
|
|||||||
'../eek/eek-xml-layout.c',
|
'../eek/eek-xml-layout.c',
|
||||||
'../eek/layersurface.c',
|
'../eek/layersurface.c',
|
||||||
dbus_src,
|
dbus_src,
|
||||||
'../eekboard/key-emitter.c',
|
|
||||||
'../eekboard/eekboard-context-service.c',
|
'../eekboard/eekboard-context-service.c',
|
||||||
'../eekboard/eekboard-service.c',
|
|
||||||
# '../eekboard/eekboard-xklutil.c',
|
# '../eekboard/eekboard-xklutil.c',
|
||||||
squeekboard_resources,
|
squeekboard_resources,
|
||||||
wl_proto_sources,
|
wl_proto_sources,
|
||||||
|
|||||||
@ -23,22 +23,26 @@
|
|||||||
#include "eek/eek.h"
|
#include "eek/eek.h"
|
||||||
#include "eek/eek-gtk-keyboard.h"
|
#include "eek/eek-gtk-keyboard.h"
|
||||||
#include "eek/layersurface.h"
|
#include "eek/layersurface.h"
|
||||||
|
#include "eekboard/eekboard-context-service.h"
|
||||||
#include "wayland.h"
|
#include "wayland.h"
|
||||||
|
|
||||||
#include "server-context-service.h"
|
#include "server-context-service.h"
|
||||||
|
|
||||||
enum {
|
enum {
|
||||||
PROP_0,
|
PROP_0,
|
||||||
PROP_SIZE_CONSTRAINT_LANDSCAPE,
|
PROP_SIZE_CONSTRAINT_LANDSCAPE,
|
||||||
PROP_SIZE_CONSTRAINT_PORTRAIT,
|
PROP_SIZE_CONSTRAINT_PORTRAIT,
|
||||||
|
PROP_VISIBLE,
|
||||||
PROP_LAST
|
PROP_LAST
|
||||||
};
|
};
|
||||||
|
|
||||||
typedef struct _ServerContextServiceClass ServerContextServiceClass;
|
typedef struct _ServerContextServiceClass ServerContextServiceClass;
|
||||||
|
|
||||||
struct _ServerContextService {
|
struct _ServerContextService {
|
||||||
EekboardContextService parent;
|
GObject parent;
|
||||||
|
|
||||||
|
EekboardContextService *state; // unowned
|
||||||
|
|
||||||
|
gboolean visible;
|
||||||
PhoshLayerSurface *window;
|
PhoshLayerSurface *window;
|
||||||
GtkWidget *widget;
|
GtkWidget *widget;
|
||||||
guint hiding;
|
guint hiding;
|
||||||
@ -50,10 +54,10 @@ struct _ServerContextService {
|
|||||||
};
|
};
|
||||||
|
|
||||||
struct _ServerContextServiceClass {
|
struct _ServerContextServiceClass {
|
||||||
EekboardContextServiceClass parent_class;
|
GObjectClass parent_class;
|
||||||
};
|
};
|
||||||
|
|
||||||
G_DEFINE_TYPE (ServerContextService, server_context_service, EEKBOARD_TYPE_CONTEXT_SERVICE);
|
G_DEFINE_TYPE(ServerContextService, server_context_service, G_TYPE_OBJECT);
|
||||||
|
|
||||||
static void
|
static void
|
||||||
on_destroy (GtkWidget *widget, gpointer user_data)
|
on_destroy (GtkWidget *widget, gpointer user_data)
|
||||||
@ -65,7 +69,7 @@ on_destroy (GtkWidget *widget, gpointer user_data)
|
|||||||
context->window = NULL;
|
context->window = NULL;
|
||||||
context->widget = NULL;
|
context->widget = NULL;
|
||||||
|
|
||||||
eekboard_context_service_destroy (EEKBOARD_CONTEXT_SERVICE (context));
|
//eekboard_context_service_destroy (EEKBOARD_CONTEXT_SERVICE (context));
|
||||||
}
|
}
|
||||||
|
|
||||||
static void
|
static void
|
||||||
@ -76,17 +80,6 @@ on_notify_keyboard (GObject *object,
|
|||||||
GParamSpec *spec,
|
GParamSpec *spec,
|
||||||
ServerContextService *context)
|
ServerContextService *context)
|
||||||
{
|
{
|
||||||
const LevelKeyboard *keyboard = eekboard_context_service_get_keyboard (EEKBOARD_CONTEXT_SERVICE(context));
|
|
||||||
|
|
||||||
if (!keyboard)
|
|
||||||
g_error("Programmer error: keyboard layout was unset!");
|
|
||||||
|
|
||||||
// The keymap will get set even if the window is hidden.
|
|
||||||
// It's not perfect,
|
|
||||||
// but simpler than adding a check in the window showing procedure
|
|
||||||
eekboard_context_service_set_keymap(EEKBOARD_CONTEXT_SERVICE(context),
|
|
||||||
keyboard);
|
|
||||||
|
|
||||||
/* Recreate the keyboard widget to keep in sync with the keymap. */
|
/* Recreate the keyboard widget to keep in sync with the keymap. */
|
||||||
if (context->window)
|
if (context->window)
|
||||||
make_widget(context);
|
make_widget(context);
|
||||||
@ -95,8 +88,8 @@ on_notify_keyboard (GObject *object,
|
|||||||
g_object_get (context, "visible", &visible, NULL);
|
g_object_get (context, "visible", &visible, NULL);
|
||||||
|
|
||||||
if (visible) {
|
if (visible) {
|
||||||
eekboard_context_service_hide_keyboard(EEKBOARD_CONTEXT_SERVICE(context));
|
server_context_service_hide_keyboard(context);
|
||||||
eekboard_context_service_show_keyboard(EEKBOARD_CONTEXT_SERVICE(context));
|
server_context_service_show_keyboard(context);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -229,7 +222,7 @@ make_widget (ServerContextService *context)
|
|||||||
context->widget = NULL;
|
context->widget = NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
LevelKeyboard *keyboard = eekboard_context_service_get_keyboard (EEKBOARD_CONTEXT_SERVICE(context));
|
LevelKeyboard *keyboard = eekboard_context_service_get_keyboard (context->state);
|
||||||
|
|
||||||
context->widget = eek_gtk_keyboard_new (keyboard);
|
context->widget = eek_gtk_keyboard_new (keyboard);
|
||||||
|
|
||||||
@ -238,26 +231,6 @@ make_widget (ServerContextService *context)
|
|||||||
gtk_widget_show (context->widget);
|
gtk_widget_show (context->widget);
|
||||||
}
|
}
|
||||||
|
|
||||||
static void
|
|
||||||
server_context_service_real_show_keyboard (EekboardContextService *_context)
|
|
||||||
{
|
|
||||||
ServerContextService *context = SERVER_CONTEXT_SERVICE(_context);
|
|
||||||
|
|
||||||
if (context->hiding) {
|
|
||||||
g_source_remove (context->hiding);
|
|
||||||
context->hiding = 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (!context->window)
|
|
||||||
make_window (context);
|
|
||||||
if (!context->widget)
|
|
||||||
make_widget (context);
|
|
||||||
|
|
||||||
EEKBOARD_CONTEXT_SERVICE_CLASS (server_context_service_parent_class)->
|
|
||||||
show_keyboard (_context);
|
|
||||||
gtk_widget_show (GTK_WIDGET(context->window));
|
|
||||||
}
|
|
||||||
|
|
||||||
static gboolean
|
static gboolean
|
||||||
on_hide (ServerContextService *context)
|
on_hide (ServerContextService *context)
|
||||||
{
|
{
|
||||||
@ -268,20 +241,49 @@ on_hide (ServerContextService *context)
|
|||||||
}
|
}
|
||||||
|
|
||||||
static void
|
static void
|
||||||
server_context_service_real_hide_keyboard (EekboardContextService *_context)
|
server_context_service_real_show_keyboard (ServerContextService *context)
|
||||||
{
|
{
|
||||||
ServerContextService *context = SERVER_CONTEXT_SERVICE(_context);
|
if (context->hiding) {
|
||||||
|
g_source_remove (context->hiding);
|
||||||
|
context->hiding = 0;
|
||||||
|
}
|
||||||
|
|
||||||
if (!context->hiding)
|
if (!context->window)
|
||||||
context->hiding = g_timeout_add (200, (GSourceFunc) on_hide, context);
|
make_window (context);
|
||||||
|
if (!context->widget)
|
||||||
|
make_widget (context);
|
||||||
|
|
||||||
EEKBOARD_CONTEXT_SERVICE_CLASS (server_context_service_parent_class)->
|
context->visible = TRUE;
|
||||||
hide_keyboard (_context);
|
gtk_widget_show (GTK_WIDGET(context->window));
|
||||||
}
|
}
|
||||||
|
|
||||||
static void
|
static void
|
||||||
server_context_service_real_destroyed (EekboardContextService *_context)
|
server_context_service_real_hide_keyboard (ServerContextService *context)
|
||||||
{
|
{
|
||||||
|
if (!context->hiding)
|
||||||
|
context->hiding = g_timeout_add (200, (GSourceFunc) on_hide, context);
|
||||||
|
|
||||||
|
context->visible = FALSE;
|
||||||
|
}
|
||||||
|
|
||||||
|
void
|
||||||
|
server_context_service_show_keyboard (ServerContextService *context)
|
||||||
|
{
|
||||||
|
g_return_if_fail (SERVER_IS_CONTEXT_SERVICE(context));
|
||||||
|
|
||||||
|
if (!context->visible) {
|
||||||
|
server_context_service_real_show_keyboard (context);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void
|
||||||
|
server_context_service_hide_keyboard (ServerContextService *context)
|
||||||
|
{
|
||||||
|
g_return_if_fail (SERVER_IS_CONTEXT_SERVICE(context));
|
||||||
|
|
||||||
|
if (context->visible) {
|
||||||
|
server_context_service_real_hide_keyboard (context);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
static void
|
static void
|
||||||
@ -306,6 +308,9 @@ server_context_service_set_property (GObject *object,
|
|||||||
&context->size_constraint_portrait[0],
|
&context->size_constraint_portrait[0],
|
||||||
&context->size_constraint_portrait[1]);
|
&context->size_constraint_portrait[1]);
|
||||||
break;
|
break;
|
||||||
|
case PROP_VISIBLE:
|
||||||
|
context->visible = g_value_get_boolean (value);
|
||||||
|
break;
|
||||||
|
|
||||||
default:
|
default:
|
||||||
G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
|
G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
|
||||||
@ -313,6 +318,23 @@ server_context_service_set_property (GObject *object,
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static void
|
||||||
|
server_context_service_get_property (GObject *object,
|
||||||
|
guint prop_id,
|
||||||
|
GValue *value,
|
||||||
|
GParamSpec *pspec)
|
||||||
|
{
|
||||||
|
ServerContextService *context = SERVER_CONTEXT_SERVICE(object);
|
||||||
|
switch (prop_id) {
|
||||||
|
case PROP_VISIBLE:
|
||||||
|
g_value_set_boolean (value, context->visible);
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
static void
|
static void
|
||||||
server_context_service_dispose (GObject *object)
|
server_context_service_dispose (GObject *object)
|
||||||
{
|
{
|
||||||
@ -327,15 +349,11 @@ server_context_service_dispose (GObject *object)
|
|||||||
static void
|
static void
|
||||||
server_context_service_class_init (ServerContextServiceClass *klass)
|
server_context_service_class_init (ServerContextServiceClass *klass)
|
||||||
{
|
{
|
||||||
EekboardContextServiceClass *context_class = EEKBOARD_CONTEXT_SERVICE_CLASS(klass);
|
|
||||||
GObjectClass *gobject_class = G_OBJECT_CLASS (klass);
|
GObjectClass *gobject_class = G_OBJECT_CLASS (klass);
|
||||||
GParamSpec *pspec;
|
GParamSpec *pspec;
|
||||||
|
|
||||||
context_class->show_keyboard = server_context_service_real_show_keyboard;
|
|
||||||
context_class->hide_keyboard = server_context_service_real_hide_keyboard;
|
|
||||||
context_class->destroyed = server_context_service_real_destroyed;
|
|
||||||
|
|
||||||
gobject_class->set_property = server_context_service_set_property;
|
gobject_class->set_property = server_context_service_set_property;
|
||||||
|
gobject_class->get_property = server_context_service_get_property;
|
||||||
gobject_class->dispose = server_context_service_dispose;
|
gobject_class->dispose = server_context_service_dispose;
|
||||||
|
|
||||||
pspec = g_param_spec_variant ("size-constraint-landscape",
|
pspec = g_param_spec_variant ("size-constraint-landscape",
|
||||||
@ -357,24 +375,38 @@ server_context_service_class_init (ServerContextServiceClass *klass)
|
|||||||
g_object_class_install_property (gobject_class,
|
g_object_class_install_property (gobject_class,
|
||||||
PROP_SIZE_CONSTRAINT_PORTRAIT,
|
PROP_SIZE_CONSTRAINT_PORTRAIT,
|
||||||
pspec);
|
pspec);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Flag to indicate if keyboard is visible or not.
|
||||||
|
*/
|
||||||
|
pspec = g_param_spec_boolean ("visible",
|
||||||
|
"Visible",
|
||||||
|
"Visible",
|
||||||
|
FALSE,
|
||||||
|
G_PARAM_READWRITE);
|
||||||
|
g_object_class_install_property (gobject_class,
|
||||||
|
PROP_VISIBLE,
|
||||||
|
pspec);
|
||||||
}
|
}
|
||||||
|
|
||||||
static void
|
static void
|
||||||
server_context_service_init (ServerContextService *context)
|
server_context_service_init (ServerContextService *state) {
|
||||||
|
(void)state;
|
||||||
|
}
|
||||||
|
|
||||||
|
ServerContextService *
|
||||||
|
server_context_service_new (EekboardContextService *state)
|
||||||
{
|
{
|
||||||
g_signal_connect (context,
|
ServerContextService *ui = g_object_new (SERVER_TYPE_CONTEXT_SERVICE, NULL);
|
||||||
|
ui->state = state;
|
||||||
|
g_signal_connect (state,
|
||||||
"notify::keyboard",
|
"notify::keyboard",
|
||||||
G_CALLBACK(on_notify_keyboard),
|
G_CALLBACK(on_notify_keyboard),
|
||||||
context);
|
ui);
|
||||||
|
return ui;
|
||||||
}
|
}
|
||||||
|
|
||||||
EekboardContextService *
|
enum squeek_arrangement_kind server_context_service_get_layout_type(ServerContextService *service)
|
||||||
server_context_service_new ()
|
|
||||||
{
|
{
|
||||||
return EEKBOARD_CONTEXT_SERVICE(g_object_new (SERVER_TYPE_CONTEXT_SERVICE, NULL));
|
return service->last_type;
|
||||||
}
|
|
||||||
|
|
||||||
enum squeek_arrangement_kind server_context_service_get_layout_type(EekboardContextService *service)
|
|
||||||
{
|
|
||||||
return SERVER_CONTEXT_SERVICE(service)->last_type;
|
|
||||||
}
|
}
|
||||||
|
|||||||
@ -18,7 +18,6 @@
|
|||||||
#ifndef SERVER_CONTEXT_SERVICE_H
|
#ifndef SERVER_CONTEXT_SERVICE_H
|
||||||
#define SERVER_CONTEXT_SERVICE_H 1
|
#define SERVER_CONTEXT_SERVICE_H 1
|
||||||
|
|
||||||
#include "eekboard/eekboard-service.h"
|
|
||||||
#include "src/layout.h"
|
#include "src/layout.h"
|
||||||
|
|
||||||
G_BEGIN_DECLS
|
G_BEGIN_DECLS
|
||||||
@ -30,12 +29,16 @@ G_BEGIN_DECLS
|
|||||||
#define SERVER_IS_CONTEXT_SERVICE_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE ((klass), SERVER_TYPE_CONTEXT_SERVICE))
|
#define SERVER_IS_CONTEXT_SERVICE_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE ((klass), SERVER_TYPE_CONTEXT_SERVICE))
|
||||||
#define SERVER_CONTEXT_SERVICE_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS ((obj), SERVER_TYPE_CONTEXT_SERVICE, ServerContextServiceClass))
|
#define SERVER_CONTEXT_SERVICE_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS ((obj), SERVER_TYPE_CONTEXT_SERVICE, ServerContextServiceClass))
|
||||||
|
|
||||||
/** Manages the liecycle of the window displaying layouts. */
|
/** Manages the lifecycle of the window displaying layouts. */
|
||||||
typedef struct _ServerContextService ServerContextService;
|
typedef struct _ServerContextService ServerContextService;
|
||||||
|
|
||||||
EekboardContextService *server_context_service_new ();
|
GType server_context_service_get_type
|
||||||
enum squeek_arrangement_kind server_context_service_get_layout_type(EekboardContextService*);
|
(void) G_GNUC_CONST;
|
||||||
|
|
||||||
|
ServerContextService *server_context_service_new(EekboardContextService *state);
|
||||||
|
enum squeek_arrangement_kind server_context_service_get_layout_type(ServerContextService *);
|
||||||
|
void server_context_service_show_keyboard (ServerContextService *context);
|
||||||
|
void server_context_service_hide_keyboard (ServerContextService *context);
|
||||||
G_END_DECLS
|
G_END_DECLS
|
||||||
#endif /* SERVER_CONTEXT_SERVICE_H */
|
#endif /* SERVER_CONTEXT_SERVICE_H */
|
||||||
|
|
||||||
|
|||||||
@ -25,8 +25,9 @@
|
|||||||
|
|
||||||
#include "config.h"
|
#include "config.h"
|
||||||
|
|
||||||
#include "eekboard/eekboard-service.h"
|
|
||||||
#include "eek/eek.h"
|
#include "eek/eek.h"
|
||||||
|
#include "eekboard/eekboard-context-service.h"
|
||||||
|
#include "dbus.h"
|
||||||
#include "imservice.h"
|
#include "imservice.h"
|
||||||
#include "outputs.h"
|
#include "outputs.h"
|
||||||
#include "server-context-service.h"
|
#include "server-context-service.h"
|
||||||
@ -38,7 +39,9 @@
|
|||||||
/// Global application state
|
/// Global application state
|
||||||
struct squeekboard {
|
struct squeekboard {
|
||||||
struct squeek_wayland wayland;
|
struct squeek_wayland wayland;
|
||||||
EekboardContextService *context;
|
DBusHandler *dbus_handler;
|
||||||
|
EekboardContextService *settings_context;
|
||||||
|
ServerContextService *ui_context;
|
||||||
struct imservice *imservice;
|
struct imservice *imservice;
|
||||||
};
|
};
|
||||||
|
|
||||||
@ -64,31 +67,14 @@ on_name_lost (GDBusConnection *connection,
|
|||||||
gpointer user_data)
|
gpointer user_data)
|
||||||
{
|
{
|
||||||
// TODO: could conceivable continue working
|
// TODO: could conceivable continue working
|
||||||
|
// if intrnal changes stop sending dbus changes
|
||||||
(void)connection;
|
(void)connection;
|
||||||
(void)name;
|
(void)name;
|
||||||
(void)user_data;
|
(void)user_data;
|
||||||
|
g_error("DBus unavailable, unclear how to continue.");
|
||||||
exit (1);
|
exit (1);
|
||||||
}
|
}
|
||||||
|
|
||||||
static void
|
|
||||||
on_destroyed (EekboardService *service,
|
|
||||||
gpointer user_data)
|
|
||||||
{
|
|
||||||
(void)service;
|
|
||||||
GMainLoop *loop = user_data;
|
|
||||||
|
|
||||||
g_main_loop_quit (loop);
|
|
||||||
}
|
|
||||||
|
|
||||||
static EekboardContextService *create_context() {
|
|
||||||
EekboardContextService *context = server_context_service_new ();
|
|
||||||
g_object_set_data_full (G_OBJECT(context),
|
|
||||||
"owner", g_strdup ("sender"),
|
|
||||||
(GDestroyNotify)g_free);
|
|
||||||
eekboard_context_service_enable (context);
|
|
||||||
return context;
|
|
||||||
}
|
|
||||||
|
|
||||||
// Wayland
|
// Wayland
|
||||||
|
|
||||||
static void
|
static void
|
||||||
@ -209,7 +195,7 @@ main (int argc, char **argv)
|
|||||||
exit(1);
|
exit(1);
|
||||||
}
|
}
|
||||||
|
|
||||||
instance.context = create_context();
|
instance.settings_context = eekboard_context_service_new();
|
||||||
|
|
||||||
// set up dbus
|
// set up dbus
|
||||||
|
|
||||||
@ -257,17 +243,16 @@ main (int argc, char **argv)
|
|||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
EekboardService *service = eekboard_service_new (connection, EEKBOARD_SERVICE_PATH);
|
DBusHandler *service = dbus_handler_new(connection, DBUS_SERVICE_PATH);
|
||||||
|
|
||||||
if (service == NULL) {
|
if (service == NULL) {
|
||||||
g_printerr ("Can't create dbus server\n");
|
g_printerr ("Can't create dbus server\n");
|
||||||
exit (1);
|
exit (1);
|
||||||
} else {
|
|
||||||
eekboard_service_set_context(service, instance.context);
|
|
||||||
}
|
}
|
||||||
|
instance.dbus_handler = service;
|
||||||
|
|
||||||
guint owner_id = g_bus_own_name_on_connection (connection,
|
guint owner_id = g_bus_own_name_on_connection (connection,
|
||||||
EEKBOARD_SERVICE_INTERFACE,
|
DBUS_SERVICE_INTERFACE,
|
||||||
G_BUS_NAME_OWNER_FLAGS_NONE,
|
G_BUS_NAME_OWNER_FLAGS_NONE,
|
||||||
on_name_acquired,
|
on_name_acquired,
|
||||||
on_name_lost,
|
on_name_lost,
|
||||||
@ -280,9 +265,9 @@ main (int argc, char **argv)
|
|||||||
|
|
||||||
struct imservice *imservice = NULL;
|
struct imservice *imservice = NULL;
|
||||||
if (instance.wayland.input_method_manager) {
|
if (instance.wayland.input_method_manager) {
|
||||||
imservice = get_imservice(instance.context,
|
imservice = get_imservice(instance.wayland.input_method_manager,
|
||||||
instance.wayland.input_method_manager,
|
instance.wayland.seat,
|
||||||
instance.wayland.seat);
|
instance.settings_context);
|
||||||
if (imservice) {
|
if (imservice) {
|
||||||
instance.imservice = imservice;
|
instance.imservice = imservice;
|
||||||
} else {
|
} else {
|
||||||
@ -290,12 +275,23 @@ main (int argc, char **argv)
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
ServerContextService *ui_context = server_context_service_new(instance.settings_context);
|
||||||
|
if (!ui_context) {
|
||||||
|
g_error("Could not initialize GUI");
|
||||||
|
exit(1);
|
||||||
|
}
|
||||||
|
instance.ui_context = ui_context;
|
||||||
|
if (instance.imservice) {
|
||||||
|
imservice_set_ui(instance.imservice, instance.ui_context);
|
||||||
|
}
|
||||||
|
if (instance.dbus_handler) {
|
||||||
|
dbus_handler_set_ui_context(instance.dbus_handler, instance.ui_context);
|
||||||
|
}
|
||||||
|
|
||||||
session_register();
|
session_register();
|
||||||
|
|
||||||
GMainLoop *loop = g_main_loop_new (NULL, FALSE);
|
GMainLoop *loop = g_main_loop_new (NULL, FALSE);
|
||||||
|
|
||||||
g_signal_connect (service, "destroyed", G_CALLBACK(on_destroyed), loop);
|
|
||||||
|
|
||||||
g_main_loop_run (loop);
|
g_main_loop_run (loop);
|
||||||
|
|
||||||
g_bus_unown_name (owner_id);
|
g_bus_unown_name (owner_id);
|
||||||
|
|||||||
Reference in New Issue
Block a user