layout: Split out choice to a struct on its own

This commit is contained in:
Dorota Czaplejewicz
2020-02-24 13:21:08 +00:00
parent 46cbaf8e87
commit 61e1ab5c5a
8 changed files with 153 additions and 133 deletions

View File

@ -8,12 +8,21 @@
#include "eek/eek-renderer.h"
#include "eek/eek-types.h"
#include "virtual-keyboard-unstable-v1-client-protocol.h"
#include "text-input-unstable-v3-client-protocol.h"
enum squeek_arrangement_kind {
ARRANGEMENT_KIND_BASE = 0,
ARRANGEMENT_KIND_WIDE = 1,
};
struct squeek_layout_state {
enum squeek_arrangement_kind arrangement;
enum zwp_text_input_v3_content_purpose purpose;
enum zwp_text_input_v3_content_hint hint;
char *layout_name;
char *overlay_name;
};
struct squeek_layout;
EekBounds squeek_button_get_bounds(const struct squeek_button*);

View File

@ -42,13 +42,13 @@ struct _ServerContextService {
EekboardContextService *state; // unowned
/// Needed for instantiating the widget
struct submission *submission; // unowned
struct squeek_layout_state *layout;
gboolean visible;
PhoshLayerSurface *window;
GtkWidget *widget; // nullable
guint hiding;
guint last_requested_height;
enum squeek_arrangement_kind last_type;
};
struct _ServerContextServiceClass {
@ -70,27 +70,6 @@ on_destroy (GtkWidget *widget, gpointer user_data)
//eekboard_context_service_destroy (EEKBOARD_CONTEXT_SERVICE (context));
}
static void
make_widget (ServerContextService *context);
static void
on_notify_keyboard (GObject *object,
GParamSpec *spec,
ServerContextService *context)
{
/* Recreate the keyboard widget to keep in sync with the keymap. */
if (context->window)
make_widget(context);
gboolean visible;
g_object_get (context, "visible", &visible, NULL);
if (visible) {
server_context_service_hide_keyboard(context);
server_context_service_show_keyboard(context);
}
}
static void
on_notify_map (GObject *object,
ServerContextService *context)
@ -119,14 +98,6 @@ calculate_height(int32_t width)
return height;
}
enum squeek_arrangement_kind get_type(uint32_t width, uint32_t height) {
(void)height;
if (width < 540) {
return ARRANGEMENT_KIND_BASE;
}
return ARRANGEMENT_KIND_WIDE;
}
static void
on_surface_configure(PhoshLayerSurface *surface, ServerContextService *context)
{
@ -136,12 +107,6 @@ on_surface_configure(PhoshLayerSurface *surface, ServerContextService *context)
"configured-width", &width,
"configured-height", &height,
NULL);
// check if the change would switch types
enum squeek_arrangement_kind new_type = get_type((uint32_t)width, (uint32_t)height);
if (context->last_type != new_type) {
context->last_type = new_type;
eekboard_context_service_update_layout(context->state, context->last_type);
}
guint desired_height = calculate_height(width);
guint configured_height = (guint)height;
@ -219,14 +184,11 @@ make_widget (ServerContextService *context)
gtk_widget_destroy(context->widget);
context->widget = NULL;
}
LevelKeyboard *keyboard = eekboard_context_service_get_keyboard (context->state);
context->widget = eek_gtk_keyboard_new (keyboard, context->state, context->submission);
context->widget = eek_gtk_keyboard_new (context->state, context->submission, context->layout);
gtk_widget_set_has_tooltip (context->widget, TRUE);
gtk_container_add (GTK_CONTAINER(context->window), context->widget);
gtk_widget_show (context->widget);
gtk_widget_show_all(context->widget);
}
static gboolean
@ -360,19 +322,11 @@ server_context_service_init (ServerContextService *state) {
}
ServerContextService *
server_context_service_new (EekboardContextService *state, struct submission *submission)
server_context_service_new (EekboardContextService *state, struct submission *submission, struct squeek_layout_state *layout)
{
ServerContextService *ui = g_object_new (SERVER_TYPE_CONTEXT_SERVICE, NULL);
ui->submission = submission;
ui->state = state;
g_signal_connect (state,
"notify::keyboard",
G_CALLBACK(on_notify_keyboard),
ui);
ui->layout = layout;
return ui;
}
enum squeek_arrangement_kind server_context_service_get_layout_type(ServerContextService *service)
{
return service->last_type;
}

View File

@ -36,7 +36,7 @@ typedef struct _ServerContextService ServerContextService;
GType server_context_service_get_type
(void) G_GNUC_CONST;
ServerContextService *server_context_service_new(EekboardContextService *state, struct submission *submission);
ServerContextService *server_context_service_new(EekboardContextService *state, struct submission *submission, struct squeek_layout_state *layout);
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);

View File

@ -28,6 +28,7 @@
#include "eek/eek.h"
#include "eekboard/eekboard-context-service.h"
#include "dbus.h"
#include "layout.h"
#include "outputs.h"
#include "submission.h"
#include "server-context-service.h"
@ -38,11 +39,12 @@
/// Global application state
struct squeekboard {
struct squeek_wayland wayland;
DBusHandler *dbus_handler;
EekboardContextService *settings_context;
ServerContextService *ui_context;
struct submission *submission;
struct squeek_wayland wayland; // Just hooks.
DBusHandler *dbus_handler; // Controls visibility of the OSK.
EekboardContextService *settings_context; // Gsettings hooks.
ServerContextService *ui_context; // mess, includes the entire UI
struct submission *submission; // Wayland text input handling.
struct squeek_layout_state layout_choice; // Currently wanted layout.
};
@ -199,7 +201,7 @@ main (int argc, char **argv)
g_warning("Wayland input method interface not available");
}
instance.settings_context = eekboard_context_service_new();
instance.settings_context = eekboard_context_service_new(&instance.layout_choice);
// set up dbus
@ -276,7 +278,8 @@ main (int argc, char **argv)
ServerContextService *ui_context = server_context_service_new(
instance.settings_context,
instance.submission);
instance.submission,
&instance.layout_choice);
if (!ui_context) {
g_error("Could not initialize GUI");
exit(1);