mirror of
https://github.com/brl/mutter.git
synced 2025-02-16 21:34:09 +00:00
seat/impl: Move out the GSource implementation to a helper object
This will help adding similar sources that work practically the same. Part-of: <https://gitlab.gnome.org/GNOME/mutter/-/merge_requests/2628>
This commit is contained in:
parent
3bd401f33a
commit
a170f2a82b
110
src/backends/meta-fd-source.c
Normal file
110
src/backends/meta-fd-source.c
Normal file
@ -0,0 +1,110 @@
|
|||||||
|
/*
|
||||||
|
* Copyright (C) 2010 Intel Corp.
|
||||||
|
* Copyright (C) 2014 Jonas Ådahl
|
||||||
|
* Copyright (C) 2016-2022 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 2 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, write to the Free Software
|
||||||
|
* Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA
|
||||||
|
* 02111-1307, USA.
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
|
||||||
|
#include "config.h"
|
||||||
|
|
||||||
|
#include "backends/meta-fd-source.h"
|
||||||
|
|
||||||
|
typedef struct _MetaFdtSource
|
||||||
|
{
|
||||||
|
GSource source;
|
||||||
|
|
||||||
|
GSourceFunc prepare;
|
||||||
|
GSourceFunc dispatch;
|
||||||
|
gpointer user_data;
|
||||||
|
|
||||||
|
GPollFD poll_fd;
|
||||||
|
} MetaFdSource;
|
||||||
|
|
||||||
|
static gboolean
|
||||||
|
meta_fd_source_prepare (GSource *source,
|
||||||
|
int *timeout_ms)
|
||||||
|
{
|
||||||
|
MetaFdSource *fd_source = (MetaFdSource *) source;
|
||||||
|
|
||||||
|
*timeout_ms = -1;
|
||||||
|
|
||||||
|
return fd_source->prepare (fd_source->user_data);
|
||||||
|
}
|
||||||
|
|
||||||
|
static gboolean
|
||||||
|
meta_fd_source_check (GSource *source)
|
||||||
|
{
|
||||||
|
MetaFdSource *fd_source = (MetaFdSource *) source;
|
||||||
|
|
||||||
|
return !!(fd_source->poll_fd.revents & G_IO_IN);
|
||||||
|
}
|
||||||
|
|
||||||
|
static gboolean
|
||||||
|
meta_fd_source_dispatch (GSource *source,
|
||||||
|
GSourceFunc callback,
|
||||||
|
gpointer user_data)
|
||||||
|
{
|
||||||
|
MetaFdSource *fd_source = (MetaFdSource *) source;
|
||||||
|
|
||||||
|
return fd_source->dispatch (fd_source->user_data);
|
||||||
|
}
|
||||||
|
|
||||||
|
static void
|
||||||
|
meta_fd_source_finalize (GSource *source)
|
||||||
|
{
|
||||||
|
MetaFdSource *fd_source = (MetaFdSource *) source;
|
||||||
|
|
||||||
|
close (fd_source->poll_fd.fd);
|
||||||
|
}
|
||||||
|
|
||||||
|
static GSourceFuncs fd_source_funcs = {
|
||||||
|
.prepare = meta_fd_source_prepare,
|
||||||
|
.check = meta_fd_source_check,
|
||||||
|
.dispatch = meta_fd_source_dispatch,
|
||||||
|
.finalize = meta_fd_source_finalize,
|
||||||
|
};
|
||||||
|
|
||||||
|
GSource *
|
||||||
|
meta_create_fd_source (int fd,
|
||||||
|
const char *name,
|
||||||
|
GSourceFunc prepare,
|
||||||
|
GSourceFunc dispatch,
|
||||||
|
gpointer user_data,
|
||||||
|
GDestroyNotify notify)
|
||||||
|
{
|
||||||
|
GSource *source;
|
||||||
|
MetaFdSource *fd_source;
|
||||||
|
|
||||||
|
source = g_source_new (&fd_source_funcs, sizeof (MetaFdSource));
|
||||||
|
g_source_set_name (source, name);
|
||||||
|
fd_source = (MetaFdSource *) source;
|
||||||
|
|
||||||
|
fd_source->poll_fd.fd = fd;
|
||||||
|
fd_source->poll_fd.events = G_IO_IN;
|
||||||
|
|
||||||
|
fd_source->prepare = prepare;
|
||||||
|
fd_source->dispatch = dispatch;
|
||||||
|
fd_source->user_data = user_data;
|
||||||
|
|
||||||
|
g_source_set_callback (source, dispatch, user_data, notify);
|
||||||
|
g_source_set_priority (source, G_PRIORITY_DEFAULT);
|
||||||
|
g_source_add_poll (source, &fd_source->poll_fd);
|
||||||
|
g_source_set_can_recurse (source, TRUE);
|
||||||
|
|
||||||
|
return source;
|
||||||
|
}
|
33
src/backends/meta-fd-source.h
Normal file
33
src/backends/meta-fd-source.h
Normal file
@ -0,0 +1,33 @@
|
|||||||
|
/*
|
||||||
|
* Copyright (C) 2016-2022 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 2 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, write to the Free Software
|
||||||
|
* Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA
|
||||||
|
* 02111-1307, USA.
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
|
||||||
|
#ifndef META_FD_SOURCE_H
|
||||||
|
#define META_FD_SOURCE_H
|
||||||
|
|
||||||
|
#include <glib.h>
|
||||||
|
|
||||||
|
GSource * meta_create_fd_source (int fd,
|
||||||
|
const char *name,
|
||||||
|
GSourceFunc prepare,
|
||||||
|
GSourceFunc dispatch,
|
||||||
|
gpointer user_data,
|
||||||
|
GDestroyNotify notify);
|
||||||
|
|
||||||
|
#endif /* META_FD_SOURCE_H */
|
@ -34,6 +34,7 @@
|
|||||||
#include <math.h>
|
#include <math.h>
|
||||||
|
|
||||||
#include "backends/meta-cursor-tracker-private.h"
|
#include "backends/meta-cursor-tracker-private.h"
|
||||||
|
#include "backends/meta-fd-source.h"
|
||||||
#include "backends/native/meta-backend-native-private.h"
|
#include "backends/native/meta-backend-native-private.h"
|
||||||
#include "backends/native/meta-barrier-native.h"
|
#include "backends/native/meta-barrier-native.h"
|
||||||
#include "backends/native/meta-device-pool.h"
|
#include "backends/native/meta-device-pool.h"
|
||||||
@ -1337,39 +1338,6 @@ meta_seat_impl_notify_touch_event_in_impl (MetaSeatImpl *seat_impl,
|
|||||||
queue_event (seat_impl, event);
|
queue_event (seat_impl, event);
|
||||||
}
|
}
|
||||||
|
|
||||||
/*
|
|
||||||
* MetaEventSource for reading input devices
|
|
||||||
*/
|
|
||||||
|
|
||||||
static gboolean
|
|
||||||
meta_event_prepare (GSource *g_source,
|
|
||||||
int *timeout_ms)
|
|
||||||
{
|
|
||||||
MetaEventSource *source = (MetaEventSource *) g_source;
|
|
||||||
MetaSeatImpl *seat_impl = source->seat_impl;
|
|
||||||
|
|
||||||
*timeout_ms = -1;
|
|
||||||
|
|
||||||
switch (libinput_next_event_type (seat_impl->libinput))
|
|
||||||
{
|
|
||||||
case LIBINPUT_EVENT_NONE:
|
|
||||||
return FALSE;
|
|
||||||
default:
|
|
||||||
return TRUE;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
static gboolean
|
|
||||||
meta_event_check (GSource *source)
|
|
||||||
{
|
|
||||||
MetaEventSource *event_source = (MetaEventSource *) source;
|
|
||||||
gboolean retval;
|
|
||||||
|
|
||||||
retval = !!(event_source->event_poll_fd.revents & G_IO_IN);
|
|
||||||
|
|
||||||
return retval;
|
|
||||||
}
|
|
||||||
|
|
||||||
static void
|
static void
|
||||||
constrain_to_barriers (MetaSeatImpl *seat_impl,
|
constrain_to_barriers (MetaSeatImpl *seat_impl,
|
||||||
ClutterInputDevice *device,
|
ClutterInputDevice *device,
|
||||||
@ -1878,68 +1846,6 @@ notify_pad_ring (ClutterInputDevice *input_device,
|
|||||||
queue_event (seat_impl, event);
|
queue_event (seat_impl, event);
|
||||||
}
|
}
|
||||||
|
|
||||||
static gboolean
|
|
||||||
meta_event_dispatch (GSource *g_source,
|
|
||||||
GSourceFunc callback,
|
|
||||||
gpointer user_data)
|
|
||||||
{
|
|
||||||
MetaEventSource *source = (MetaEventSource *) g_source;
|
|
||||||
MetaSeatImpl *seat_impl;
|
|
||||||
|
|
||||||
seat_impl = source->seat_impl;
|
|
||||||
|
|
||||||
dispatch_libinput (seat_impl);
|
|
||||||
|
|
||||||
return TRUE;
|
|
||||||
}
|
|
||||||
|
|
||||||
static GSourceFuncs event_funcs = {
|
|
||||||
meta_event_prepare,
|
|
||||||
meta_event_check,
|
|
||||||
meta_event_dispatch,
|
|
||||||
NULL
|
|
||||||
};
|
|
||||||
|
|
||||||
static MetaEventSource *
|
|
||||||
meta_event_source_new (MetaSeatImpl *seat_impl)
|
|
||||||
{
|
|
||||||
GSource *source;
|
|
||||||
MetaEventSource *event_source;
|
|
||||||
int fd;
|
|
||||||
|
|
||||||
source = g_source_new (&event_funcs, sizeof (MetaEventSource));
|
|
||||||
g_source_set_name (source, "[mutter] Events");
|
|
||||||
event_source = (MetaEventSource *) source;
|
|
||||||
|
|
||||||
/* setup the source */
|
|
||||||
event_source->seat_impl = seat_impl;
|
|
||||||
|
|
||||||
fd = libinput_get_fd (seat_impl->libinput);
|
|
||||||
event_source->event_poll_fd.fd = fd;
|
|
||||||
event_source->event_poll_fd.events = G_IO_IN;
|
|
||||||
|
|
||||||
/* and finally configure and attach the GSource */
|
|
||||||
g_source_set_priority (source, CLUTTER_PRIORITY_EVENTS);
|
|
||||||
g_source_add_poll (source, &event_source->event_poll_fd);
|
|
||||||
g_source_set_can_recurse (source, TRUE);
|
|
||||||
g_source_attach (source, seat_impl->input_context);
|
|
||||||
|
|
||||||
return event_source;
|
|
||||||
}
|
|
||||||
|
|
||||||
static void
|
|
||||||
meta_event_source_free (MetaEventSource *source)
|
|
||||||
{
|
|
||||||
GSource *g_source = (GSource *) source;
|
|
||||||
|
|
||||||
/* ignore the return value of close, it's not like we can do something
|
|
||||||
* about it */
|
|
||||||
close (source->event_poll_fd.fd);
|
|
||||||
|
|
||||||
g_source_destroy (g_source);
|
|
||||||
g_source_unref (g_source);
|
|
||||||
}
|
|
||||||
|
|
||||||
static gboolean
|
static gboolean
|
||||||
has_touchscreen (MetaSeatImpl *seat_impl)
|
has_touchscreen (MetaSeatImpl *seat_impl)
|
||||||
{
|
{
|
||||||
@ -3132,6 +3038,30 @@ meta_seat_impl_set_keyboard_numlock_in_impl (MetaSeatImpl *seat_impl,
|
|||||||
seat_impl->xkb);
|
seat_impl->xkb);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static gboolean
|
||||||
|
meta_libinput_source_prepare (gpointer user_data)
|
||||||
|
{
|
||||||
|
MetaSeatImpl *seat_impl = META_SEAT_IMPL (user_data);
|
||||||
|
|
||||||
|
switch (libinput_next_event_type (seat_impl->libinput))
|
||||||
|
{
|
||||||
|
case LIBINPUT_EVENT_NONE:
|
||||||
|
return FALSE;
|
||||||
|
default:
|
||||||
|
return TRUE;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
static gboolean
|
||||||
|
meta_libinput_source_dispatch (gpointer user_data)
|
||||||
|
{
|
||||||
|
MetaSeatImpl *seat_impl = META_SEAT_IMPL (user_data);
|
||||||
|
|
||||||
|
dispatch_libinput (seat_impl);
|
||||||
|
|
||||||
|
return G_SOURCE_CONTINUE;
|
||||||
|
}
|
||||||
|
|
||||||
static gboolean
|
static gboolean
|
||||||
init_libinput (MetaSeatImpl *seat_impl,
|
init_libinput (MetaSeatImpl *seat_impl,
|
||||||
GError **error)
|
GError **error)
|
||||||
@ -3176,10 +3106,19 @@ init_libinput (MetaSeatImpl *seat_impl,
|
|||||||
static void
|
static void
|
||||||
init_libinput_source (MetaSeatImpl *seat_impl)
|
init_libinput_source (MetaSeatImpl *seat_impl)
|
||||||
{
|
{
|
||||||
MetaEventSource *source;
|
int fd;
|
||||||
|
GSource *source;
|
||||||
|
|
||||||
source = meta_event_source_new (seat_impl);
|
fd = libinput_get_fd (seat_impl->libinput);
|
||||||
seat_impl->event_source = source;
|
source = meta_create_fd_source (fd,
|
||||||
|
"[mutter] libinput",
|
||||||
|
meta_libinput_source_prepare,
|
||||||
|
meta_libinput_source_dispatch,
|
||||||
|
seat_impl,
|
||||||
|
NULL);
|
||||||
|
seat_impl->libinput_source = source;
|
||||||
|
g_source_attach (source, seat_impl->input_context);
|
||||||
|
g_source_unref (source);
|
||||||
}
|
}
|
||||||
|
|
||||||
static gpointer
|
static gpointer
|
||||||
@ -3377,7 +3316,7 @@ destroy_in_impl (GTask *task)
|
|||||||
g_clear_pointer (&seat_impl->libinput, libinput_unref);
|
g_clear_pointer (&seat_impl->libinput, libinput_unref);
|
||||||
g_clear_pointer (&seat_impl->tools, g_hash_table_unref);
|
g_clear_pointer (&seat_impl->tools, g_hash_table_unref);
|
||||||
g_clear_pointer (&seat_impl->touch_states, g_hash_table_destroy);
|
g_clear_pointer (&seat_impl->touch_states, g_hash_table_destroy);
|
||||||
g_clear_pointer (&seat_impl->event_source, meta_event_source_free);
|
g_clear_pointer (&seat_impl->libinput_source, g_source_destroy);
|
||||||
|
|
||||||
numlock_active =
|
numlock_active =
|
||||||
xkb_state_mod_name_is_active (seat_impl->xkb, XKB_MOD_NAME_NUM,
|
xkb_state_mod_name_is_active (seat_impl->xkb, XKB_MOD_NAME_NUM,
|
||||||
@ -3424,7 +3363,7 @@ meta_seat_impl_finalize (GObject *object)
|
|||||||
|
|
||||||
g_assert (!seat_impl->libinput);
|
g_assert (!seat_impl->libinput);
|
||||||
g_assert (!seat_impl->tools);
|
g_assert (!seat_impl->tools);
|
||||||
g_assert (!seat_impl->event_source);
|
g_assert (!seat_impl->libinput_source);
|
||||||
|
|
||||||
g_free (seat_impl->seat_id);
|
g_free (seat_impl->seat_id);
|
||||||
|
|
||||||
|
@ -68,7 +68,7 @@ struct _MetaSeatImpl
|
|||||||
MetaSeatNative *seat_native;
|
MetaSeatNative *seat_native;
|
||||||
char *seat_id;
|
char *seat_id;
|
||||||
MetaSeatNativeFlag flags;
|
MetaSeatNativeFlag flags;
|
||||||
MetaEventSource *event_source;
|
GSource *libinput_source;
|
||||||
struct libinput *libinput;
|
struct libinput *libinput;
|
||||||
GRWLock state_lock;
|
GRWLock state_lock;
|
||||||
|
|
||||||
|
@ -220,6 +220,8 @@ mutter_sources = [
|
|||||||
'backends/meta-dbus-session-watcher.h',
|
'backends/meta-dbus-session-watcher.h',
|
||||||
'backends/meta-display-config-shared.h',
|
'backends/meta-display-config-shared.h',
|
||||||
'backends/meta-dnd-private.h',
|
'backends/meta-dnd-private.h',
|
||||||
|
'backends/meta-fd-source.c',
|
||||||
|
'backends/meta-fd-source.h',
|
||||||
'backends/meta-gpu.c',
|
'backends/meta-gpu.c',
|
||||||
'backends/meta-gpu.h',
|
'backends/meta-gpu.h',
|
||||||
'backends/meta-idle-monitor.c',
|
'backends/meta-idle-monitor.c',
|
||||||
|
Loading…
x
Reference in New Issue
Block a user