[Debian-on-mobile-maintainers] [Git][DebianOnMobile-team/phoc][upstream/latest] 9 commits: desktop: Refresh all views when auto-maximize changes
Arnaud Ferraris
gitlab at salsa.debian.org
Wed Oct 28 10:19:47 GMT 2020
Arnaud Ferraris pushed to branch upstream/latest at Debian On Mobile / phoc
Commits:
cde70286 by Guido Günther at 2020-10-08T18:35:29+02:00
desktop: Refresh all views when auto-maximize changes
So far this only affected new views but when e.g. unplugging an
external (switching to 'phone' mode) we want running apps to
behave.
- - - - -
37744a7b by Guido Günther at 2020-10-15T09:01:31+02:00
phosh: Drop rotate-display
The rotate_display served us well but it's too simplistic (no events,
degrees instead of transforms, ...). Since phosh now uses
wlr-output-management for bid to use this part of the private protocol.
- - - - -
983c3497 by Guido Günther at 2020-10-15T09:03:01+02:00
d/control: Add breaks for older phosh
These require the rotate_display private protocol bit
- - - - -
488a3ea1 by Clayton Craft at 2020-10-15T09:17:38-07:00
input: convert roots_input to PhocInput gobject
- - - - -
60f06033 by Clayton Craft at 2020-10-15T09:17:38-07:00
input: apply phosh code formatting styles
This is a cosmetic change that applies code formatting styles from
Phosh's style guidelines to input.c/h.
- - - - -
626c81fb by Clayton Craft at 2020-10-15T09:17:39-07:00
Use PhocInput objects instead of roots_input
- - - - -
5efd5b2c by Guido Günther at 2020-10-21T19:28:38+02:00
phosh: Fix indentation
- - - - -
f153f896 by Guido Günther at 2020-10-21T19:28:38+02:00
phosh: Ungrab accelerators
This lead to a compositor crash so far
- - - - -
b3b55d11 by Guido Günther at 2020-10-27T19:16:24+01:00
Document changes and release 0.4.4
- - - - -
21 changed files:
- debian/changelog
- debian/control
- meson.build
- src/desktop.c
- src/desktop.h
- src/gtk-shell.c
- src/input.c
- src/input.h
- src/layer_shell.c
- src/output.c
- src/output.h
- src/phosh.c
- src/render.c
- src/seat.c
- src/seat.h
- src/server.c
- src/server.h
- src/view.c
- src/virtual.c
- src/xdg_shell.c
- src/xwayland.c
Changes:
=====================================
debian/changelog
=====================================
@@ -1,3 +1,29 @@
+phoc (0.4.4) amber-phone; urgency=medium
+
+ [ Guido Günther ]
+ * desktop: Refresh all views when auto-maximize changes.
+ So far this only affected new views but when e.g. unplugging an
+ external (switching to 'phone' mode) we want running apps to
+ behave.
+ * phosh: Drop rotate-display.
+ The rotate_display served us well but it's too simplistic (no events,
+ degrees instead of transforms, ...). Since phosh now uses
+ wlr-output-management for bid to use this part of the private protocol.
+ * d/control: Add breaks for older phosh.
+ These require the rotate_display private protocol bit
+ * phosh: Fix indentation
+ * phosh: Ungrab accelerators.
+ This lead to a compositor crash so far
+
+ [ Clayton Craft ]
+ * input: convert roots_input to PhocInput gobject
+ * input: apply phosh code formatting styles.
+ This is a cosmetic change that applies code formatting styles from
+ Phosh's style guidelines to input.c/h.
+ * Use PhocInput objects instead of roots_input
+
+ -- Guido Günther <agx at sigxcpu.org> Tue, 27 Oct 2020 09:01:06 +0100
+
phoc (0.4.3) amber-phone; urgency=medium
[ Guido Günther ]
=====================================
debian/control
=====================================
@@ -53,7 +53,7 @@ Depends:
mutter-common,
Recommends: phosh
Breaks:
- phosh (<< 0.2.0),
+ phosh (<< 0.4.5),
Description: Wayland compositor for mobile phones
Tiny wayland compositor based on wlroots for use on mobile phones like the
Librem 5.
=====================================
meson.build
=====================================
@@ -1,5 +1,5 @@
project('phoc', 'c',
- version: '0.4.3',
+ version: '0.4.4',
license: 'GPLv3+',
meson_version: '>= 0.47.0',
default_options: [
=====================================
src/desktop.c
=====================================
@@ -712,8 +712,17 @@ phoc_desktop_toggle_output_blank (PhocDesktop *self)
void
phoc_desktop_set_auto_maximize (PhocDesktop *self, gboolean enable)
{
+ struct roots_view *view;
+
g_debug ("auto-maximize: %d", enable);
self->maximize = enable;
+
+ /* Disabling auto-maximize leaves all views in their current position */
+ if (!enable)
+ return;
+
+ wl_list_for_each (view, &self->views, link)
+ view_auto_maximize (view);
}
gboolean
=====================================
src/desktop.h
=====================================
@@ -44,6 +44,7 @@ G_DECLARE_FINAL_TYPE (PhocDesktop, phoc_desktop, PHOC, DESKTOP, GObject);
/* These need to know about PhocDesktop so we have them after the type definition.
* This will fix itself once output / view / phosh are gobjects and have their
* most of their members made non-public */
+#include "input.h"
#include "output.h"
#include "view.h"
#include "phosh.h"
=====================================
src/gtk-shell.c
=====================================
@@ -65,7 +65,7 @@ handle_request_focus(struct wl_client *client,
PhocGtkSurface *gtk_surface =
gtk_surface_from_resource (resource);
PhocServer *server = phoc_server_get_default ();
- struct roots_input *input = server->input;
+ PhocInput *input = server->input;
struct roots_seat *seat = input_last_active_seat(input);
struct roots_view *view;
=====================================
src/input.c
=====================================
@@ -15,11 +15,18 @@
#ifdef PHOC_XWAYLAND
#include <wlr/xwayland.h>
#endif
-#include "settings.h"
#include "input.h"
#include "keyboard.h"
#include "seat.h"
-#include "server.h"
+
+G_DEFINE_TYPE (PhocInput, phoc_input, G_TYPE_OBJECT);
+
+enum {
+ PROP_0,
+ PROP_CONFIG,
+ PROP_LAST_PROP,
+};
+static GParamSpec *props[PROP_LAST_PROP];
const char *
phoc_input_get_device_type (enum wlr_input_device_type type)
@@ -42,114 +49,219 @@ phoc_input_get_device_type (enum wlr_input_device_type type)
}
}
-struct roots_seat *input_get_seat(struct roots_input *input, char *name) {
- struct roots_seat *seat = NULL;
- wl_list_for_each(seat, &input->seats, link) {
- if (strcmp(seat->seat->name, name) == 0) {
- return seat;
- }
- }
+static void
+phoc_input_set_property (GObject *object,
+ guint property_id,
+ const GValue *value,
+ GParamSpec *pspec)
+{
+ PhocInput *self = PHOC_INPUT (object);
+
+ switch (property_id) {
+ case PROP_CONFIG:
+ self->config = g_value_get_pointer (value);
+ g_object_notify_by_pspec (G_OBJECT (self), props[PROP_CONFIG]);
+ break;
+ default:
+ G_OBJECT_WARN_INVALID_PROPERTY_ID (object, property_id, pspec);
+ break;
+ }
+}
+
+static void
+phoc_input_get_property (GObject *object,
+ guint property_id,
+ GValue *value,
+ GParamSpec *pspec)
+{
+ PhocInput *self = PHOC_INPUT (object);
+
+ switch (property_id) {
+ case PROP_CONFIG:
+ g_value_set_pointer (value, self->config);
+ break;
+ default:
+ G_OBJECT_WARN_INVALID_PROPERTY_ID (object, property_id, pspec);
+ break;
+ }
+}
+
+struct roots_seat *
+phoc_input_get_seat (PhocInput *self, char *name)
+{
+ struct roots_seat *seat = NULL;
+
+ wl_list_for_each (seat, &self->seats, link) {
+ if (strcmp (seat->seat->name, name) == 0) {
+ return seat;
+ }
+ }
+
+ seat = roots_seat_create (self, name);
+ return seat;
+}
+
+static void
+handle_new_input (struct wl_listener *listener, void *data)
+{
+ struct wlr_input_device *device = data;
+ PhocInput *input = wl_container_of (listener, input, new_input);
+
+ char *seat_name = ROOTS_CONFIG_DEFAULT_SEAT_NAME;
+ struct roots_device_config *dc =
+ roots_config_get_device (input->config, device);
+
+ if (dc) {
+ seat_name = dc->seat;
+ }
+
+ struct roots_seat *seat = phoc_input_get_seat (input, seat_name);
+
+ if (!seat) {
+ g_warning ("could not create roots seat");
+ return;
+ }
+
+ g_debug ("New input device: %s (%d:%d) %s seat:%s", device->name,
+ device->vendor, device->product,
+ phoc_input_get_device_type (device->type), seat_name);
+
+ roots_seat_add_device (seat, device);
+
+ if (dc && wlr_input_device_is_libinput (device)) {
+ struct libinput_device *libinput_dev =
+ wlr_libinput_get_device_handle (device);
+
+ g_debug ("input has config, tap_enabled: %d\n", dc->tap_enabled);
+ if (dc->tap_enabled) {
+ libinput_device_config_tap_set_enabled (libinput_dev,
+ LIBINPUT_CONFIG_TAP_ENABLED);
+ }
+ }
+}
+
+static void
+phoc_input_init (PhocInput *self)
+{
+}
- seat = roots_seat_create(input, name);
- return seat;
+PhocInput *
+phoc_input_new (struct roots_config *config)
+{
+ return g_object_new (PHOC_TYPE_INPUT,
+ "config", config,
+ NULL);
}
-static void handle_new_input(struct wl_listener *listener, void *data) {
- struct wlr_input_device *device = data;
- struct roots_input *input = wl_container_of(listener, input, new_input);
-
- char *seat_name = ROOTS_CONFIG_DEFAULT_SEAT_NAME;
- struct roots_device_config *dc =
- roots_config_get_device(input->config, device);
- if (dc) {
- seat_name = dc->seat;
- }
-
- struct roots_seat *seat = input_get_seat(input, seat_name);
- if (!seat) {
- g_warning("could not create roots seat");
- return;
- }
-
- g_debug("New input device: %s (%d:%d) %s seat:%s", device->name,
- device->vendor, device->product,
- phoc_input_get_device_type(device->type), seat_name);
-
- roots_seat_add_device(seat, device);
-
- if (dc && wlr_input_device_is_libinput(device)) {
- struct libinput_device *libinput_dev =
- wlr_libinput_get_device_handle(device);
-
- g_debug("input has config, tap_enabled: %d\n", dc->tap_enabled);
- if (dc->tap_enabled) {
- libinput_device_config_tap_set_enabled(libinput_dev,
- LIBINPUT_CONFIG_TAP_ENABLED);
- }
- }
+static void
+phoc_input_constructed (GObject *object)
+{
+ PhocInput *self = PHOC_INPUT (object);
+ PhocServer *server = phoc_server_get_default ();
+
+ g_debug ("Initializing roots input");
+ assert (server->desktop);
+
+ wl_list_init (&self->seats);
+
+ self->new_input.notify = handle_new_input;
+ wl_signal_add (&server->backend->events.new_input, &self->new_input);
+ G_OBJECT_CLASS (phoc_input_parent_class)->constructed (object);
+
}
-struct roots_input *input_create(struct roots_config *config) {
- PhocServer *server = phoc_server_get_default ();
- g_debug("Initializing roots input");
- assert(server->desktop);
+static void
+phoc_input_finalize (GObject *object)
+{
+ PhocInput *self = PHOC_INPUT (object);
- struct roots_input *input = calloc(1, sizeof(struct roots_input));
- if (input == NULL) {
- return NULL;
- }
+ wl_list_remove (&self->seats);
- input->config = config;
+ G_OBJECT_CLASS (phoc_input_parent_class)->finalize (object);
+}
- wl_list_init(&input->seats);
+static void
+phoc_input_dispose (GObject *object)
+{
+ PhocInput *self = PHOC_INPUT (object);
- input->new_input.notify = handle_new_input;
- wl_signal_add(&server->backend->events.new_input, &input->new_input);
+ g_clear_object (&self->config);
- return input;
+ G_OBJECT_CLASS (phoc_input_parent_class)->dispose (object);
}
-void input_destroy(struct roots_input *input) {
- // TODO
+static void
+phoc_input_class_init (PhocInputClass *klass)
+{
+ GObjectClass *object_class = (GObjectClass *)klass;
+
+ object_class->set_property = phoc_input_set_property;
+ object_class->get_property = phoc_input_get_property;
+
+ object_class->constructed = phoc_input_constructed;
+ object_class->dispose = phoc_input_dispose;
+ object_class->finalize = phoc_input_finalize;
+
+ props[PROP_CONFIG] =
+ g_param_spec_pointer (
+ "config",
+ "Config",
+ "The config object",
+ G_PARAM_CONSTRUCT_ONLY | G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS);
+
+ g_object_class_install_properties (object_class, PROP_LAST_PROP, props);
+
}
-struct roots_seat *input_seat_from_wlr_seat(struct roots_input *input,
- struct wlr_seat *wlr_seat) {
- struct roots_seat *seat = NULL;
- wl_list_for_each(seat, &input->seats, link) {
- if (seat->seat == wlr_seat) {
- return seat;
- }
- }
- return seat;
+struct roots_seat *
+phoc_input_seat_from_wlr_seat (PhocInput *self,
+ struct wlr_seat *wlr_seat)
+{
+ struct roots_seat *seat = NULL;
+
+ wl_list_for_each (seat, &self->seats, link) {
+ if (seat->seat == wlr_seat) {
+ return seat;
+ }
+ }
+ return seat;
}
-bool input_view_has_focus(struct roots_input *input, struct roots_view *view) {
- if (!view) {
- return false;
- }
- struct roots_seat *seat;
- wl_list_for_each(seat, &input->seats, link) {
- if (view == roots_seat_get_focus(seat)) {
- return true;
- }
- }
-
- return false;
+bool
+phoc_input_view_has_focus (PhocInput *self, struct roots_view *view)
+{
+ if (!view) {
+ return false;
+ }
+ struct roots_seat *seat;
+
+ wl_list_for_each (seat, &self->seats, link) {
+ if (view == roots_seat_get_focus (seat)) {
+ return true;
+ }
+ }
+
+ return false;
}
-static inline int64_t timespec_to_msec(const struct timespec *a) {
- return (int64_t)a->tv_sec * 1000 + a->tv_nsec / 1000000;
+static inline int64_t
+timespec_to_msec (const struct timespec *a)
+{
+ return (int64_t)a->tv_sec * 1000 + a->tv_nsec / 1000000;
}
-void input_update_cursor_focus(struct roots_input *input) {
- struct timespec now;
- clock_gettime(CLOCK_MONOTONIC, &now);
- g_assert_nonnull (input);
+void
+phoc_input_update_cursor_focus (PhocInput *self)
+{
+ struct timespec now;
+
+ clock_gettime (CLOCK_MONOTONIC, &now);
+ g_assert_nonnull (self);
- struct roots_seat *seat;
- wl_list_for_each(seat, &input->seats, link) {
- roots_cursor_update_position(roots_seat_get_cursor (seat),
- timespec_to_msec(&now));
- }
+ struct roots_seat *seat;
+
+ wl_list_for_each (seat, &self->seats, link) {
+ roots_cursor_update_position (roots_seat_get_cursor (seat),
+ timespec_to_msec (&now));
+ }
}
=====================================
src/input.h
=====================================
@@ -1,36 +1,44 @@
-#ifndef ROOTSTON_INPUT_H
-#define ROOTSTON_INPUT_H
+#pragma once
#include <wayland-server-core.h>
#include <wlr/types/wlr_cursor.h>
#include <wlr/types/wlr_input_device.h>
#include <wlr/types/wlr_seat.h>
#include "settings.h"
+
+#define PHOC_TYPE_INPUT (phoc_input_get_type ())
+
+G_DECLARE_FINAL_TYPE (PhocInput, phoc_input, PHOC, INPUT, GObject);
+
+/* These need to know about PhocInput so we have them after the type definition.
+ * This will fix itself once output / view / phosh are gobjects and most of
+ * their members are non-public. */
+#include "output.h"
#include "cursor.h"
#include "server.h"
#include "view.h"
-struct roots_input {
- struct roots_config *config;
+/* TODO: we keep the struct public due to the list links and
+ notifiers but we should avoid other member access */
+struct _PhocInput {
+ GObject parent;
- struct wl_listener new_input;
+ struct wl_listener new_input;
+ struct wl_list seats; // roots_seat::link */
- struct wl_list seats; // roots_seat::link
+ /* private */
+ struct roots_config *config;
+ struct xkb_keymap *keymap;
+ uint32_t meta_key;
+ GnomeXkbInfo *xkbinfo;
};
-struct roots_input *input_create(struct roots_config *config);
-void input_destroy(struct roots_input *input);
-
-struct roots_seat *input_seat_from_wlr_seat(struct roots_input *input,
- struct wlr_seat *seat);
-
-bool input_view_has_focus(struct roots_input *input, struct roots_view *view);
-
-struct roots_seat *input_get_seat(struct roots_input *input, char *name);
-
-struct roots_seat *input_last_active_seat(struct roots_input *input);
-
-void input_update_cursor_focus(struct roots_input *input);
-const char *phoc_input_get_device_type (enum wlr_input_device_type type);
-
-#endif
+PhocInput *phoc_input_new (struct roots_config *config);
+bool phoc_input_view_has_focus (PhocInput *self,
+ struct roots_view *view);
+const char *phoc_input_get_device_type (enum wlr_input_device_type type);
+struct roots_seat *phoc_input_get_seat (PhocInput *self, char *name);
+struct roots_seat *phoc_input_last_active_seat (PhocInput *self);
+void phoc_input_update_cursor_focus (PhocInput *self);
+struct roots_seat *phoc_input_seat_from_wlr_seat (PhocInput *self,
+ struct wlr_seat *seat);
=====================================
src/layer_shell.c
=====================================
@@ -322,7 +322,7 @@ void arrange_layers(struct roots_output *output) {
}
}
- struct roots_input *input = server->input;
+ PhocInput *input = server->input;
struct roots_seat *seat;
wl_list_for_each(seat, &input->seats, link) {
roots_seat_set_focus_layer(seat,
@@ -518,7 +518,7 @@ static void popup_handle_map(struct wl_listener *listener, void *data) {
wlr_surface_send_enter(popup->wlr_popup->base->surface, wlr_output);
popup_damage(popup, true);
- input_update_cursor_focus(server->input);
+ phoc_input_update_cursor_focus(server->input);
}
static void popup_handle_unmap(struct wl_listener *listener, void *data) {
@@ -530,7 +530,7 @@ static void popup_handle_unmap(struct wl_listener *listener, void *data) {
}
wl_list_remove(&popup->new_subsurface.link);
popup_damage(popup, true);
- input_update_cursor_focus(server->input);
+ phoc_input_update_cursor_focus(server->input);
}
static void popup_handle_commit(struct wl_listener *listener, void *data) {
@@ -638,7 +638,7 @@ static void subsurface_handle_map(struct wl_listener *listener, void *data) {
wlr_surface_send_enter(subsurface->wlr_subsurface->surface, subsurface_get_root_layer(subsurface)->layer_surface->output);
subsurface_damage(subsurface, true);
- input_update_cursor_focus(server->input);
+ phoc_input_update_cursor_focus(server->input);
}
static void subsurface_handle_unmap(struct wl_listener *listener, void *data) {
@@ -650,7 +650,7 @@ static void subsurface_handle_unmap(struct wl_listener *listener, void *data) {
}
wl_list_remove(&subsurface->new_subsurface.link);
subsurface_damage(subsurface, true);
- input_update_cursor_focus(server->input);
+ phoc_input_update_cursor_focus(server->input);
}
static void subsurface_handle_commit(struct wl_listener *listener, void *data) {
@@ -736,7 +736,7 @@ static void handle_unmap(struct wl_listener *listener, void *data) {
wl_list_remove(&layer->new_subsurface.link);
unmap(layer->layer_surface);
- input_update_cursor_focus(server->input);
+ phoc_input_update_cursor_focus(server->input);
}
void handle_layer_shell_surface(struct wl_listener *listener, void *data) {
@@ -756,7 +756,7 @@ void handle_layer_shell_surface(struct wl_listener *listener, void *data) {
layer_surface->client_pending.margin.left);
if (!layer_surface->output) {
- struct roots_input *input = server->input;
+ PhocInput *input = server->input;
struct roots_seat *seat = input_last_active_seat(input);
assert(seat); // Technically speaking we should handle this case
struct roots_cursor *cursor = roots_seat_get_cursor(seat);
=====================================
src/output.c
=====================================
@@ -236,7 +236,7 @@ void output_layer_for_each_surface(struct roots_output *output,
}
void output_drag_icons_for_each_surface(struct roots_output *output,
- struct roots_input *input, roots_surface_iterator_func_t iterator,
+ PhocInput *input, roots_surface_iterator_func_t iterator,
void *user_data) {
struct wlr_box *output_box =
wlr_output_layout_get_box(output->desktop->layout, output->wlr_output);
@@ -660,7 +660,7 @@ void handle_new_output(struct wl_listener *listener, void *data) {
new_output);
struct wlr_output *wlr_output = data;
PhocServer *server = phoc_server_get_default ();
- struct roots_input *input = server->input;
+ PhocInput *input = server->input;
struct roots_config *config = desktop->config;
wlr_log(WLR_DEBUG, "Output '%s' added", wlr_output->name);
=====================================
src/output.h
=====================================
@@ -39,8 +39,6 @@ typedef void (*roots_surface_iterator_func_t)(struct roots_output *output,
void rotate_child_position(double *sx, double *sy, double sw, double sh,
double pw, double ph, float rotation);
-struct roots_input;
-
void output_surface_for_each_surface(struct roots_output *output,
struct wlr_surface *surface, double ox, double oy,
roots_surface_iterator_func_t iterator, void *user_data);
@@ -51,7 +49,7 @@ void output_view_for_each_surface(struct roots_output *output,
struct roots_view *view, roots_surface_iterator_func_t iterator,
void *user_data);
void output_drag_icons_for_each_surface(struct roots_output *output,
- struct roots_input *input, roots_surface_iterator_func_t iterator,
+ PhocInput *input, roots_surface_iterator_func_t iterator,
void *user_data);
void output_layer_for_each_surface(struct roots_output *output,
struct wl_list *layer_surfaces, roots_surface_iterator_func_t iterator,
=====================================
src/phosh.c
=====================================
@@ -43,41 +43,8 @@ phosh_rotate_display (struct wl_client *client,
struct wl_resource *surface_resource,
uint32_t degrees)
{
- struct phosh_private *phosh = wl_resource_get_user_data (resource);
- enum wl_output_transform transform = WL_OUTPUT_TRANSFORM_NORMAL;
-
- g_debug ("rotation: %d", degrees);
- degrees %= 360;
-
- switch (degrees) {
- case 0:
- transform = WL_OUTPUT_TRANSFORM_NORMAL;
- break;
- case 90:
- transform = WL_OUTPUT_TRANSFORM_90;
- break;
- case 180:
- transform = WL_OUTPUT_TRANSFORM_180;
- break;
- case 270:
- transform = WL_OUTPUT_TRANSFORM_270;
- break;
- default:
- wl_resource_post_error (resource,
- PHOSH_PRIVATE_ERROR_INVALID_ARGUMENT,
- "Can only rotate in 90 degree steps");
- }
-
- /* Make sure we rotate clockwise */
- phoc_utils_fix_transform(&transform);
-
- if (!phosh->panel) {
- g_warning ("Tried to rotate inexistent panel");
- return;
- }
-
- wlr_output_set_transform (phosh->panel->output, transform);
- output_damage_whole(phosh->panel->output->data);
+ wl_resource_post_error (resource, WL_DISPLAY_ERROR_INVALID_OBJECT,
+ "Use wlr-output-management protocol instead");
}
@@ -266,6 +233,39 @@ phosh_private_keyboard_event_grab_accelerator_request (struct wl_client *wl_cl
}
+
+static void
+phosh_private_keyboard_event_ungrab_accelerator_request (struct wl_client *client,
+ struct wl_resource *resource,
+ uint32_t action_id)
+{
+ GHashTableIter iter;
+ gpointer key, value, found = NULL;
+ struct phosh_private_keyboard_event_data *kbevent =
+ phosh_private_keyboard_event_from_resource (resource);
+
+ g_debug ("Ungrabbing accelerator %d", action_id);
+ g_hash_table_iter_init (&iter, kbevent->subscribed_accelerators);
+ while (g_hash_table_iter_next (&iter, &key, &value)) {
+ if (GPOINTER_TO_INT (value) == action_id) {
+ found = key;
+ break;
+ }
+ }
+
+ if (found) {
+ g_hash_table_remove (kbevent->subscribed_accelerators, key);
+ phosh_private_keyboard_event_send_ungrab_success_event (resource,
+ action_id);
+
+ } else {
+ phosh_private_keyboard_event_send_ungrab_failed_event (resource,
+ action_id,
+ PHOSH_PRIVATE_KEYBOARD_EVENT_ERROR_INVALID_ARGUMENT);
+ }
+}
+
+
static void
phosh_private_keyboard_event_handle_destroy (struct wl_client *client,
struct wl_resource *resource)
@@ -275,6 +275,7 @@ phosh_private_keyboard_event_handle_destroy (struct wl_client *client,
static const struct phosh_private_keyboard_event_interface phosh_private_keyboard_event_impl = {
.grab_accelerator_request = phosh_private_keyboard_event_grab_accelerator_request,
+ .ungrab_accelerator_request = phosh_private_keyboard_event_ungrab_accelerator_request,
.destroy = phosh_private_keyboard_event_handle_destroy
};
@@ -307,7 +308,7 @@ handle_get_keyboard_event (struct wl_client *client,
g_free (kbevent);
wl_client_post_no_memory (client);
return;
- }
+ }
struct phosh_private *phosh_private = phosh_private_from_resource (phosh_private_resource);
=====================================
src/render.c
=====================================
@@ -298,7 +298,7 @@ static bool scan_out_fullscreen_view(struct roots_output *output) {
}
static void render_drag_icons(struct roots_output *output,
- pixman_region32_t *damage, struct roots_input *input) {
+ pixman_region32_t *damage, PhocInput *input) {
struct render_data data = {
.damage = damage,
.alpha = 1.0f,
=====================================
src/seat.c
=====================================
@@ -743,7 +743,7 @@ void roots_seat_destroy(struct roots_seat *seat) {
wlr_seat_destroy(seat->seat);
}
-struct roots_seat *roots_seat_create(struct roots_input *input, char *name) {
+struct roots_seat *roots_seat_create(PhocInput *input, char *name) {
PhocServer *server = phoc_server_get_default ();
struct roots_seat *seat = calloc(1, sizeof(struct roots_seat));
if (!seat) {
@@ -1419,7 +1419,7 @@ void roots_seat_set_focus(struct roots_seat *seat, struct roots_view *view) {
seat->has_focus = false;
// Deactivate the old view if it is not focused by some other seat
- if (prev_focus != NULL && !input_view_has_focus(seat->input, prev_focus)) {
+ if (prev_focus != NULL && !phoc_input_view_has_focus(seat->input, prev_focus)) {
view_activate(prev_focus, false);
}
@@ -1673,7 +1673,7 @@ void roots_seat_end_compositor_grab(struct roots_seat *seat) {
cursor->mode = ROOTS_CURSOR_PASSTHROUGH;
}
-struct roots_seat *input_last_active_seat(struct roots_input *input) {
+struct roots_seat *input_last_active_seat(PhocInput *input) {
struct roots_seat *seat = NULL, *_seat;
wl_list_for_each(_seat, &input->seats, link) {
if (!seat || (seat->seat->last_event.tv_sec > _seat->seat->last_event.tv_sec &&
=====================================
src/seat.h
=====================================
@@ -9,10 +9,10 @@
#include "text_input.h"
struct roots_seat {
- struct roots_input *input;
+ PhocInput *input;
struct wlr_seat *seat;
struct roots_cursor *cursor;
- struct wl_list link; // roots_input::seats
+ struct wl_list link; // PhocInput::seats
// coordinates of the first touch point if it exists
int32_t touch_id;
@@ -136,7 +136,7 @@ struct roots_pointer_constraint {
struct wl_listener destroy;
};
-struct roots_seat *roots_seat_create(struct roots_input *input, char *name);
+struct roots_seat *roots_seat_create(PhocInput *input, char *name);
void roots_seat_destroy(struct roots_seat *seat);
@@ -183,4 +183,6 @@ bool roots_seat_allow_input(struct roots_seat *seat,
void roots_seat_maybe_set_cursor (struct roots_seat *seat, const char *name);
+struct roots_seat *input_last_active_seat(PhocInput *input);
+
#endif
=====================================
src/server.c
=====================================
@@ -253,7 +253,7 @@ phoc_server_setup (PhocServer *self, const char *config_path,
self->mainloop = mainloop;
self->exit_status = 1;
self->desktop = phoc_desktop_new (self->config);
- self->input = input_create(self->config);
+ self->input = phoc_input_new (self->config);
self->session = g_strdup (session);
self->mainloop = mainloop;
self->debug_flags = debug_flags;
@@ -279,7 +279,7 @@ phoc_server_setup (PhocServer *self, const char *config_path,
#ifdef PHOC_XWAYLAND
if (self->desktop->xwayland != NULL) {
struct roots_seat *xwayland_seat =
- input_get_seat(self->input, ROOTS_CONFIG_DEFAULT_SEAT_NAME);
+ phoc_input_get_seat(self->input, ROOTS_CONFIG_DEFAULT_SEAT_NAME);
wlr_xwayland_set_seat(self->desktop->xwayland, xwayland_seat->seat);
}
#endif
=====================================
src/server.h
=====================================
@@ -35,7 +35,7 @@ struct _PhocServer {
/* Phoc resources */
struct roots_config *config;
PhocDesktop *desktop;
- struct roots_input *input;
+ PhocInput *input;
PhocServerDebugFlags debug_flags;
gboolean inited;
=====================================
src/view.c
=====================================
@@ -542,7 +542,7 @@ bool view_center(struct roots_view *view) {
view_get_geometry (view, &geom);
PhocDesktop *desktop = view->desktop;
- struct roots_input *input = server->input;
+ PhocInput *input = server->input;
struct roots_seat *seat = input_last_active_seat(input);
struct roots_cursor *cursor;
@@ -645,7 +645,7 @@ static void subsurface_handle_map(struct wl_listener *listener,
wl_container_of(listener, subsurface, map);
struct roots_view *view = subsurface->view_child.view;
view_damage_whole(view);
- input_update_cursor_focus(server->input);
+ phoc_input_update_cursor_focus(server->input);
struct wlr_box box;
view_get_box(view, &box);
@@ -666,7 +666,7 @@ static void subsurface_handle_unmap(struct wl_listener *listener,
wl_container_of(listener, subsurface, unmap);
struct roots_view *view = subsurface->view_child.view;
view_damage_whole(view);
- input_update_cursor_focus(server->input);
+ phoc_input_update_cursor_focus(server->input);
}
struct roots_subsurface *subsurface_create(struct roots_view *view,
@@ -781,7 +781,7 @@ void view_map(struct roots_view *view, struct wlr_surface *surface) {
wl_list_insert(&view->desktop->views, &view->link);
view_damage_whole(view);
- input_update_cursor_focus(server->input);
+ phoc_input_update_cursor_focus(server->input);
}
void view_unmap(struct roots_view *view) {
@@ -817,7 +817,7 @@ void view_unmap(struct roots_view *view) {
void view_initial_focus(struct roots_view *view) {
PhocServer *server = phoc_server_get_default ();
- struct roots_input *input = server->input;
+ PhocInput *input = server->input;
// TODO what seat gets focus? the one with the last input event?
struct roots_seat *seat;
wl_list_for_each(seat, &input->seats, link) {
=====================================
src/virtual.c
=====================================
@@ -15,7 +15,7 @@ phoc_handle_virtual_keyboard (struct wl_listener *listener, void *data)
wl_container_of (listener, desktop, virtual_keyboard_new);
struct wlr_virtual_keyboard_v1 *keyboard = data;
- struct roots_seat *seat = input_seat_from_wlr_seat (server->input,
+ struct roots_seat *seat = phoc_input_seat_from_wlr_seat (server->input,
keyboard->seat);
g_return_if_fail (seat);
@@ -36,7 +36,7 @@ phoc_handle_virtual_pointer(struct wl_listener *listener, void *data)
g_return_if_fail (PHOC_IS_DESKTOP (desktop));
g_return_if_fail (PHOC_IS_SERVER (server));
- seat = input_get_seat (server->input, seat_name);
+ seat = phoc_input_get_seat (server->input, seat_name);
g_return_if_fail (seat);
g_debug ("New virtual input device: %s (%d:%d) %s seat:%s", device->name,
=====================================
src/xdg_shell.c
=====================================
@@ -42,14 +42,14 @@ static void popup_handle_map(struct wl_listener *listener, void *data) {
PhocServer *server = phoc_server_get_default ();
struct roots_xdg_popup *popup = wl_container_of(listener, popup, map);
view_damage_whole(popup->view_child.view);
- input_update_cursor_focus(server->input);
+ phoc_input_update_cursor_focus(server->input);
}
static void popup_handle_unmap(struct wl_listener *listener, void *data) {
PhocServer *server = phoc_server_get_default ();
struct roots_xdg_popup *popup = wl_container_of(listener, popup, unmap);
view_damage_whole(popup->view_child.view);
- input_update_cursor_focus(server->input);
+ phoc_input_update_cursor_focus(server->input);
}
static struct roots_xdg_popup *popup_create(struct roots_view *view,
@@ -322,9 +322,9 @@ static void handle_request_move(struct wl_listener *listener, void *data) {
struct roots_xdg_surface *roots_xdg_surface =
wl_container_of(listener, roots_xdg_surface, request_move);
struct roots_view *view = &roots_xdg_surface->view;
- struct roots_input *input = server->input;
+ PhocInput *input = server->input;
struct wlr_xdg_toplevel_move_event *e = data;
- struct roots_seat *seat = input_seat_from_wlr_seat(input, e->seat->seat);
+ struct roots_seat *seat = phoc_input_seat_from_wlr_seat(input, e->seat->seat);
// TODO verify event serial
if (!seat || roots_seat_get_cursor(seat)->mode != ROOTS_CURSOR_PASSTHROUGH) {
@@ -338,9 +338,9 @@ static void handle_request_resize(struct wl_listener *listener, void *data) {
struct roots_xdg_surface *roots_xdg_surface =
wl_container_of(listener, roots_xdg_surface, request_resize);
struct roots_view *view = &roots_xdg_surface->view;
- struct roots_input *input = server->input;
+ PhocInput *input = server->input;
struct wlr_xdg_toplevel_resize_event *e = data;
- struct roots_seat *seat = input_seat_from_wlr_seat(input, e->seat->seat);
+ struct roots_seat *seat = phoc_input_seat_from_wlr_seat(input, e->seat->seat);
// TODO verify event serial
assert(seat);
=====================================
src/xwayland.c
=====================================
@@ -211,7 +211,7 @@ static struct roots_seat *guess_seat_for_view(struct roots_view *view) {
// the best we can do is to pick the first seat that has the surface focused
// for the pointer
PhocServer *server = phoc_server_get_default ();
- struct roots_input *input = server->input;
+ PhocInput *input = server->input;
struct roots_seat *seat;
wl_list_for_each(seat, &input->seats, link) {
if (seat->seat->pointer_state.focused_surface == view->wlr_surface) {
View it on GitLab: https://salsa.debian.org/DebianOnMobile-team/phoc/-/compare/816bdf318ba97badd2b3834c714026f05a3fb5d5...b3b55d1106e2549b5c1afe0132c5b3c92255f21a
--
View it on GitLab: https://salsa.debian.org/DebianOnMobile-team/phoc/-/compare/816bdf318ba97badd2b3834c714026f05a3fb5d5...b3b55d1106e2549b5c1afe0132c5b3c92255f21a
You're receiving this email because of your account on salsa.debian.org.
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://alioth-lists.debian.net/pipermail/debian-on-mobile-maintainers/attachments/20201028/ed0fb340/attachment-0001.html>
More information about the Debian-on-mobile-maintainers
mailing list