Compare commits

..

8 Commits

Author SHA1 Message Date
Carlos Garnacho
74be2e9f94 wayland: Implement wl_pointer.axis_source/axis_stop/axis_frame emission
As per the spec. wl_pointer.axis_source determines the current source of
scroll events, wl_pointer.axis_stop determines when there's no further
scroll events on any axis (Which Clutter sends as dx/dy=0 events).
wl_pointer.axis_frame marks the end of a series of axis_* events.

v2: Updated to v4 of the protocol spec by
    Peter Hutterer <peter.hutterer@who-t.net>
v3: Update to use Clutter API
2015-10-23 16:21:25 +02:00
Carlos Garnacho
a5d2555196 wayland: Make it possible to trigger popups through pointer/keyboard/touch
Right now we just check the pointer serial, so the popup will be
immediately dismissed if the client passes a serial corresponding to
another input device.

Abstract this a bit further and add a meta_wayland_seat_can_popup() call
that will check the serial all input devices. This makes it possible to
trigger menus through touch or keyboard devices.

https://bugzilla.gnome.org/show_bug.cgi?id=756296
2015-10-17 18:52:52 +02:00
Carlos Garnacho
dd5a4ecdf9 wayland: Store key press/release serials on MetaWaylandKeyboard
https://bugzilla.gnome.org/show_bug.cgi?id=756296
2015-10-17 18:52:15 +02:00
Rui Matos
43a1d43f2b monitor-manager-xrandr: Be more robust when reading XRROutputInfos
We might get modes in XRROutputInfos that aren't in the
XRRScreenResources we get earlier. This always seems to be transient,
i.e. when it happens, the X server will usually send us a follow up
RRScreenChangeNotify where we then get a "stable" view of the world
again.

In any case, when these glitches happen, we end up with NULL pointers
in the MetaOutput->modes array which makes us crash later on. This
patch ensures that doesn't happen.

https://bugzilla.gnome.org/show_bug.cgi?id=756660
2015-10-16 13:57:26 +02:00
Jonas Ådahl
d6d377a447 wayland: Set the xdg_popup pointer even when not mapping
If we immediately dismiss the popup, we still need to set the
surface->xdg_popup pointer field in order for the destructor to
properly clean up the state. Not doing this may cause a crash if the
xdg_popup resource that was immediately dismissed is destoryed after
wl_surface during client destruction.

https://bugzilla.gnome.org/show_bug.cgi?id=756675
2015-10-16 11:31:51 +08:00
Florian Müllner
ffd95c2ad5 theme: Complete removal of "fringe" titlebar button support
We have been ignoring those buttons since 3.16 after they had been
broken in the default theme for a couple of versions. As nobody
appears to miss them, it's time to remove them for good.
2015-10-16 04:13:14 +02:00
Florian Müllner
72be89dfb9 theme: Reset button style state when done drawing
We use a single style context to draw titlebar buttons, updating
its state according to each button's prelight state as necessary.
This assumes that the original state is neither ACTIVE nor PRELIGHT,
which means we need to reset the state after drawing to avoid
propagating the state of the last-drawn button.
2015-10-16 04:04:34 +02:00
Florian Müllner
2feeb57dee iconcache: Mark surfaces as dirty after changing data
This is required to tell cairo to update its cached areas.
2015-10-16 04:04:31 +02:00
28 changed files with 2034 additions and 2007 deletions

12
NEWS
View File

@@ -1,15 +1,3 @@
3.18.2
======
* Misc. crash fixes [Jonas, Rui; #756675, #756660, #757148, #756796]
* Fix modifiers-only input source switching on Ubuntu [Alberts; #756543]
* Exit cleanly on initialization errors [Owen; #757311]
Contributors:
Jonas Ådahl, Rui Matos, Alberts Muktupāvels, Florian Müllner, Owen W. Taylor
Translations:
Daniel Șerbănescu [ro]
3.18.1 3.18.1
====== ======
* Misc. crash fixes [Jonas, Rui, Carlos, Owen, Florian; #755096, #754979, * Misc. crash fixes [Jonas, Rui, Carlos, Owen, Florian; #755096, #754979,

View File

@@ -2,7 +2,7 @@ AC_PREREQ(2.62)
m4_define([mutter_major_version], [3]) m4_define([mutter_major_version], [3])
m4_define([mutter_minor_version], [18]) m4_define([mutter_minor_version], [18])
m4_define([mutter_micro_version], [2]) m4_define([mutter_micro_version], [1])
m4_define([mutter_version], m4_define([mutter_version],
[mutter_major_version.mutter_minor_version.mutter_micro_version]) [mutter_major_version.mutter_minor_version.mutter_micro_version])

3353
po/ro.po

File diff suppressed because it is too large Load Diff

View File

@@ -24,8 +24,6 @@
#include "config.h" #include "config.h"
#include <stdlib.h>
#include <meta/meta-backend.h> #include <meta/meta-backend.h>
#include "meta-backend-private.h" #include "meta-backend-private.h"
#include "meta-input-settings-private.h" #include "meta-input-settings-private.h"
@@ -628,10 +626,7 @@ meta_clutter_init (void)
meta_create_backend (); meta_create_backend ();
if (clutter_init (NULL, NULL) != CLUTTER_INIT_SUCCESS) if (clutter_init (NULL, NULL) != CLUTTER_INIT_SUCCESS)
{ g_error ("Unable to initialize Clutter.\n");
g_warning ("Unable to initialize Clutter.\n");
exit (1);
}
/* /*
* XXX: We cannot handle high dpi scaling yet, so fix the scale to 1 * XXX: We cannot handle high dpi scaling yet, so fix the scale to 1

View File

@@ -414,10 +414,6 @@ gint meta_monitor_manager_get_monitor_at_point (MetaMonitorManager
gfloat x, gfloat x,
gfloat y); gfloat y);
void meta_monitor_manager_clear_output (MetaOutput *output);
void meta_monitor_manager_clear_mode (MetaMonitorMode *mode);
void meta_monitor_manager_clear_crtc (MetaCRTC *crtc);
/* Returns true if transform causes width and height to be inverted /* Returns true if transform causes width and height to be inverted
This is true for the odd transforms in the enum */ This is true for the odd transforms in the enum */
static inline gboolean static inline gboolean

View File

@@ -346,23 +346,6 @@ meta_monitor_manager_constructed (GObject *object)
manager->in_init = FALSE; manager->in_init = FALSE;
} }
void
meta_monitor_manager_clear_output (MetaOutput *output)
{
g_free (output->name);
g_free (output->vendor);
g_free (output->product);
g_free (output->serial);
g_free (output->modes);
g_free (output->possible_crtcs);
g_free (output->possible_clones);
if (output->driver_notify)
output->driver_notify (output);
memset (output, 0, sizeof (*output));
}
static void static void
meta_monitor_manager_free_output_array (MetaOutput *old_outputs, meta_monitor_manager_free_output_array (MetaOutput *old_outputs,
int n_old_outputs) int n_old_outputs)
@@ -370,22 +353,22 @@ meta_monitor_manager_free_output_array (MetaOutput *old_outputs,
int i; int i;
for (i = 0; i < n_old_outputs; i++) for (i = 0; i < n_old_outputs; i++)
meta_monitor_manager_clear_output (&old_outputs[i]); {
g_free (old_outputs[i].name);
g_free (old_outputs[i].vendor);
g_free (old_outputs[i].product);
g_free (old_outputs[i].serial);
g_free (old_outputs[i].modes);
g_free (old_outputs[i].possible_crtcs);
g_free (old_outputs[i].possible_clones);
if (old_outputs[i].driver_notify)
old_outputs[i].driver_notify (&old_outputs[i]);
}
g_free (old_outputs); g_free (old_outputs);
} }
void
meta_monitor_manager_clear_mode (MetaMonitorMode *mode)
{
g_free (mode->name);
if (mode->driver_notify)
mode->driver_notify (mode);
memset (mode, 0, sizeof (*mode));
}
static void static void
meta_monitor_manager_free_mode_array (MetaMonitorMode *old_modes, meta_monitor_manager_free_mode_array (MetaMonitorMode *old_modes,
int n_old_modes) int n_old_modes)
@@ -393,20 +376,16 @@ meta_monitor_manager_free_mode_array (MetaMonitorMode *old_modes,
int i; int i;
for (i = 0; i < n_old_modes; i++) for (i = 0; i < n_old_modes; i++)
meta_monitor_manager_clear_mode (&old_modes[i]); {
g_free (old_modes[i].name);
if (old_modes[i].driver_notify)
old_modes[i].driver_notify (&old_modes[i]);
}
g_free (old_modes); g_free (old_modes);
} }
void
meta_monitor_manager_clear_crtc (MetaCRTC *crtc)
{
if (crtc->driver_notify)
crtc->driver_notify (crtc);
memset (crtc, 0, sizeof (*crtc));
}
static void static void
meta_monitor_manager_free_crtc_array (MetaCRTC *old_crtcs, meta_monitor_manager_free_crtc_array (MetaCRTC *old_crtcs,
int n_old_crtcs) int n_old_crtcs)
@@ -414,7 +393,10 @@ meta_monitor_manager_free_crtc_array (MetaCRTC *old_crtcs,
int i; int i;
for (i = 0; i < n_old_crtcs; i++) for (i = 0; i < n_old_crtcs; i++)
meta_monitor_manager_clear_crtc (&old_crtcs[i]); {
if (old_crtcs[i].driver_notify)
old_crtcs[i].driver_notify (&old_crtcs[i]);
}
g_free (old_crtcs); g_free (old_crtcs);
} }

View File

@@ -37,8 +37,6 @@
#include "meta-cursor-renderer-native.h" #include "meta-cursor-renderer-native.h"
#include "meta-launcher.h" #include "meta-launcher.h"
#include <stdlib.h>
struct _MetaBackendNativePrivate struct _MetaBackendNativePrivate
{ {
MetaLauncher *launcher; MetaLauncher *launcher;
@@ -329,15 +327,8 @@ static void
meta_backend_native_init (MetaBackendNative *native) meta_backend_native_init (MetaBackendNative *native)
{ {
MetaBackendNativePrivate *priv = meta_backend_native_get_instance_private (native); MetaBackendNativePrivate *priv = meta_backend_native_get_instance_private (native);
GError *error = NULL;
priv->launcher = meta_launcher_new (&error);
if (priv->launcher == NULL)
{
g_warning ("Can't initialize KMS backend: %s\n", error->message);
exit (1);
}
priv->launcher = meta_launcher_new ();
priv->barrier_manager = meta_barrier_manager_native_new (); priv->barrier_manager = meta_barrier_manager_native_new ();
priv->up_client = up_client_new (); priv->up_client = up_client_new ();

View File

@@ -54,22 +54,30 @@ struct _MetaLauncher
gboolean session_active; gboolean session_active;
}; };
static void
report_error_and_die (const char *prefix,
GError *error)
{
/* if a function returns due to g_return_val_if_fail,
* then the error may not be set */
if (error)
g_error ("%s: %s", prefix, error->message);
else
g_error ("%s", prefix);
/* the error is not freed, but it is ok as g_error aborts the process */
}
static Login1Session * static Login1Session *
get_session_proxy (GCancellable *cancellable, get_session_proxy (GCancellable *cancellable)
GError **error)
{ {
char *proxy_path; char *proxy_path;
char *session_id; char *session_id;
Login1Session *session_proxy; Login1Session *session_proxy;
GError *error = NULL;
if (sd_pid_get_session (getpid (), &session_id) < 0) if (sd_pid_get_session (getpid (), &session_id) < 0)
{ return NULL;
g_set_error (error,
G_IO_ERROR,
G_IO_ERROR_NOT_FOUND,
"Could not get session ID: %m");
return NULL;
}
proxy_path = get_escaped_dbus_path ("/org/freedesktop/login1/session", session_id); proxy_path = get_escaped_dbus_path ("/org/freedesktop/login1/session", session_id);
@@ -77,9 +85,9 @@ get_session_proxy (GCancellable *cancellable,
G_DBUS_PROXY_FLAGS_DO_NOT_AUTO_START, G_DBUS_PROXY_FLAGS_DO_NOT_AUTO_START,
"org.freedesktop.login1", "org.freedesktop.login1",
proxy_path, proxy_path,
cancellable, error); cancellable, &error);
if (!session_proxy) if (!session_proxy)
g_prefix_error(error, "Could not get session proxy: "); report_error_and_die ("Failed getting session proxy", error);
free (proxy_path); free (proxy_path);
@@ -87,16 +95,16 @@ get_session_proxy (GCancellable *cancellable,
} }
static Login1Seat * static Login1Seat *
get_seat_proxy (GCancellable *cancellable, get_seat_proxy (GCancellable *cancellable)
GError **error)
{ {
GError *error = NULL;
Login1Seat *seat = login1_seat_proxy_new_for_bus_sync (G_BUS_TYPE_SYSTEM, Login1Seat *seat = login1_seat_proxy_new_for_bus_sync (G_BUS_TYPE_SYSTEM,
G_DBUS_PROXY_FLAGS_DO_NOT_AUTO_START, G_DBUS_PROXY_FLAGS_DO_NOT_AUTO_START,
"org.freedesktop.login1", "org.freedesktop.login1",
"/org/freedesktop/login1/seat/self", "/org/freedesktop/login1/seat/self",
cancellable, error); cancellable, &error);
if (!seat) if (!seat)
g_prefix_error(error, "Could not get seat proxy: "); report_error_and_die ("Could not get seat proxy", error);
return seat; return seat;
} }
@@ -349,114 +357,69 @@ out:
return path; return path;
} }
static gboolean static void
get_kms_fd (Login1Session *session_proxy, get_kms_fd (Login1Session *session_proxy,
const gchar *seat_id, const gchar *seat_id,
int *fd_out, int *fd_out)
GError **error)
{ {
int major, minor; int major, minor;
int fd; int fd;
gchar *path;
GError *error = NULL;
g_autofree gchar *path = get_primary_gpu_path (seat_id); path = get_primary_gpu_path (seat_id);
if (!path) if (!path)
{ g_error ("could not find drm kms device");
g_set_error (error,
G_IO_ERROR,
G_IO_ERROR_NOT_FOUND,
"could not find drm kms device");
return FALSE;
}
if (!get_device_info_from_path (path, &major, &minor)) if (!get_device_info_from_path (path, &major, &minor))
{ g_error ("Could not stat %s: %m", path);
g_set_error (error,
G_IO_ERROR,
G_IO_ERROR_NOT_FOUND,
"Could not get device info for path %s: %m", path);
return FALSE;
}
if (!take_device (session_proxy, major, minor, &fd, NULL, error)) g_free (path);
{
g_prefix_error (error, "Could not open DRM device: "); if (!take_device (session_proxy, major, minor, &fd, NULL, &error))
return FALSE; report_error_and_die ("Could not open DRM device", error);
}
*fd_out = fd; *fd_out = fd;
return TRUE;
} }
static gchar * static gchar *
get_seat_id (GError **error) get_seat_id (void)
{ {
char *session_id, *seat_id; char *session_id, *seat_id = NULL;
int r;
r = sd_pid_get_session (0, &session_id); if (sd_pid_get_session (0, &session_id) < 0)
if (r < 0) return NULL;
{
g_set_error (error,
G_IO_ERROR,
G_IO_ERROR_NOT_FOUND,
"Could not get session for PID: %s", g_strerror (-r));
return NULL;
}
r = sd_session_get_seat (session_id, &seat_id); /* on error the seat_id will remain NULL */
sd_session_get_seat (session_id, &seat_id);
free (session_id); free (session_id);
if (r < 0)
{
g_set_error (error,
G_IO_ERROR,
G_IO_ERROR_NOT_FOUND,
"Could not get seat for session: %s", g_strerror (-r));
return NULL;
}
return seat_id; return seat_id;
} }
MetaLauncher * MetaLauncher *
meta_launcher_new (GError **error) meta_launcher_new (void)
{ {
MetaLauncher *self = NULL; MetaLauncher *self = NULL;
Login1Session *session_proxy = NULL; Login1Session *session_proxy;
Login1Seat *seat_proxy = NULL; char *seat_id;
char *seat_id = NULL; GError *error = NULL;
gboolean have_control = FALSE;
int kms_fd; int kms_fd;
session_proxy = get_session_proxy (NULL, error); session_proxy = get_session_proxy (NULL);
if (!session_proxy) if (!login1_session_call_take_control_sync (session_proxy, FALSE, NULL, &error))
goto fail; report_error_and_die ("Could not take control", error);
if (!login1_session_call_take_control_sync (session_proxy, FALSE, NULL, error)) seat_id = get_seat_id ();
{
g_prefix_error (error, "Could not take control: ");
goto fail;
}
have_control = TRUE;
seat_id = get_seat_id (error);
if (!seat_id) if (!seat_id)
goto fail; g_error ("Failed getting seat id");
seat_proxy = get_seat_proxy (NULL, error);
if (!seat_proxy)
goto fail;
if (!get_kms_fd (session_proxy, seat_id, &kms_fd, error))
goto fail;
get_kms_fd (session_proxy, seat_id, &kms_fd);
free (seat_id); free (seat_id);
self = g_slice_new0 (MetaLauncher); self = g_slice_new0 (MetaLauncher);
self->session_proxy = session_proxy; self->session_proxy = session_proxy;
self->seat_proxy = seat_proxy; self->seat_proxy = get_seat_proxy (NULL);
self->session_active = TRUE; self->session_active = TRUE;
@@ -466,16 +429,8 @@ meta_launcher_new (GError **error)
self); self);
g_signal_connect (self->session_proxy, "notify::active", G_CALLBACK (on_active_changed), self); g_signal_connect (self->session_proxy, "notify::active", G_CALLBACK (on_active_changed), self);
return self; return self;
fail:
if (have_control)
login1_session_call_release_control_sync (session_proxy, NULL, NULL);
g_clear_object (&session_proxy);
g_clear_object (&seat_proxy);
free (seat_id);
return NULL;
} }
void void

View File

@@ -24,7 +24,7 @@
typedef struct _MetaLauncher MetaLauncher; typedef struct _MetaLauncher MetaLauncher;
MetaLauncher *meta_launcher_new (GError **error); MetaLauncher *meta_launcher_new (void);
void meta_launcher_free (MetaLauncher *self); void meta_launcher_free (MetaLauncher *self);
gboolean meta_launcher_activate_session (MetaLauncher *self, gboolean meta_launcher_activate_session (MetaLauncher *self,

View File

@@ -82,7 +82,6 @@ struct _MetaBackendX11Private
gchar *keymap_layouts; gchar *keymap_layouts;
gchar *keymap_variants; gchar *keymap_variants;
gchar *keymap_options; gchar *keymap_options;
int locked_group;
}; };
typedef struct _MetaBackendX11Private MetaBackendX11Private; typedef struct _MetaBackendX11Private MetaBackendX11Private;
@@ -298,23 +297,15 @@ handle_host_xevent (MetaBackend *backend,
if (event->type == priv->xkb_event_base) if (event->type == priv->xkb_event_base)
{ {
XkbEvent *xkb_ev = (XkbEvent *) event; XkbAnyEvent *xkb_ev = (XkbAnyEvent *) event;
if (xkb_ev->any.device == META_VIRTUAL_CORE_KEYBOARD_ID) if (xkb_ev->device == META_VIRTUAL_CORE_KEYBOARD_ID)
{ {
switch (xkb_ev->any.xkb_type) switch (xkb_ev->xkb_type)
{ {
case XkbNewKeyboardNotify: case XkbNewKeyboardNotify:
case XkbMapNotify: case XkbMapNotify:
keymap_changed (backend); keymap_changed (backend);
break;
case XkbStateNotify:
if (xkb_ev->state.changed & XkbGroupLockMask)
{
if (priv->locked_group != xkb_ev->state.locked_group)
XkbLockGroup (priv->xdisplay, XkbUseCoreKbd, priv->locked_group);
}
break;
default: default:
break; break;
} }
@@ -785,7 +776,6 @@ meta_backend_x11_lock_layout_group (MetaBackend *backend,
MetaBackendX11 *x11 = META_BACKEND_X11 (backend); MetaBackendX11 *x11 = META_BACKEND_X11 (backend);
MetaBackendX11Private *priv = meta_backend_x11_get_instance_private (x11); MetaBackendX11Private *priv = meta_backend_x11_get_instance_private (x11);
priv->locked_group = idx;
XkbLockGroup (priv->xdisplay, XkbUseCoreKbd, idx); XkbLockGroup (priv->xdisplay, XkbUseCoreKbd, idx);
} }

View File

@@ -661,44 +661,6 @@ output_get_modes (MetaMonitorManager *manager,
} }
} }
meta_output->n_modes = n_actual_modes; meta_output->n_modes = n_actual_modes;
if (n_actual_modes > 0)
meta_output->preferred_mode = meta_output->modes[0];
}
static void
output_get_crtcs (MetaMonitorManager *manager,
MetaOutput *meta_output,
XRROutputInfo *output)
{
guint j, k;
guint n_actual_crtcs;
meta_output->possible_crtcs = g_new0 (MetaCRTC *, output->ncrtc);
n_actual_crtcs = 0;
for (j = 0; j < (unsigned)output->ncrtc; j++)
{
for (k = 0; k < manager->n_crtcs; k++)
{
if ((XID)manager->crtcs[k].crtc_id == output->crtcs[j])
{
meta_output->possible_crtcs[n_actual_crtcs] = &manager->crtcs[k];
n_actual_crtcs += 1;
break;
}
}
}
meta_output->n_possible_crtcs = n_actual_crtcs;
meta_output->crtc = NULL;
for (j = 0; j < manager->n_crtcs; j++)
{
if ((XID)manager->crtcs[j].crtc_id == output->crtc)
{
meta_output->crtc = &manager->crtcs[j];
break;
}
}
} }
static char * static char *
@@ -863,7 +825,31 @@ meta_monitor_manager_xrandr_read_current (MetaMonitorManager *manager)
output_get_tile_info (manager_xrandr, meta_output); output_get_tile_info (manager_xrandr, meta_output);
output_get_modes (manager, meta_output, output); output_get_modes (manager, meta_output, output);
output_get_crtcs (manager, meta_output, output); meta_output->preferred_mode = meta_output->modes[0];
meta_output->n_possible_crtcs = output->ncrtc;
meta_output->possible_crtcs = g_new0 (MetaCRTC *, meta_output->n_possible_crtcs);
for (j = 0; j < (unsigned)output->ncrtc; j++)
{
for (k = 0; k < manager->n_crtcs; k++)
{
if ((XID)manager->crtcs[k].crtc_id == output->crtcs[j])
{
meta_output->possible_crtcs[j] = &manager->crtcs[k];
break;
}
}
}
meta_output->crtc = NULL;
for (j = 0; j < manager->n_crtcs; j++)
{
if ((XID)manager->crtcs[j].crtc_id == output->crtc)
{
meta_output->crtc = &manager->crtcs[j];
break;
}
}
meta_output->n_possible_clones = output->nclone; meta_output->n_possible_clones = output->nclone;
meta_output->possible_clones = g_new0 (MetaOutput *, meta_output->n_possible_clones); meta_output->possible_clones = g_new0 (MetaOutput *, meta_output->n_possible_clones);
@@ -887,10 +873,7 @@ meta_monitor_manager_xrandr_read_current (MetaMonitorManager *manager)
else else
meta_output->backlight = -1; meta_output->backlight = -1;
if (meta_output->n_modes == 0 || meta_output->n_possible_crtcs == 0) n_actual_outputs++;
meta_monitor_manager_clear_output (meta_output);
else
n_actual_outputs++;
} }
XRRFreeOutputInfo (output); XRRFreeOutputInfo (output);

View File

@@ -1477,42 +1477,11 @@ button_function_from_string (const char *str)
return META_BUTTON_FUNCTION_MAXIMIZE; return META_BUTTON_FUNCTION_MAXIMIZE;
else if (strcmp (str, "close") == 0) else if (strcmp (str, "close") == 0)
return META_BUTTON_FUNCTION_CLOSE; return META_BUTTON_FUNCTION_CLOSE;
else if (strcmp (str, "shade") == 0)
return META_BUTTON_FUNCTION_SHADE;
else if (strcmp (str, "above") == 0)
return META_BUTTON_FUNCTION_ABOVE;
else if (strcmp (str, "stick") == 0)
return META_BUTTON_FUNCTION_STICK;
else else
/* don't know; give up */ /* don't know; give up */
return META_BUTTON_FUNCTION_LAST; return META_BUTTON_FUNCTION_LAST;
} }
static MetaButtonFunction
button_opposite_function (MetaButtonFunction ofwhat)
{
switch (ofwhat)
{
case META_BUTTON_FUNCTION_SHADE:
return META_BUTTON_FUNCTION_UNSHADE;
case META_BUTTON_FUNCTION_UNSHADE:
return META_BUTTON_FUNCTION_SHADE;
case META_BUTTON_FUNCTION_ABOVE:
return META_BUTTON_FUNCTION_UNABOVE;
case META_BUTTON_FUNCTION_UNABOVE:
return META_BUTTON_FUNCTION_ABOVE;
case META_BUTTON_FUNCTION_STICK:
return META_BUTTON_FUNCTION_UNSTICK;
case META_BUTTON_FUNCTION_UNSTICK:
return META_BUTTON_FUNCTION_STICK;
default:
return META_BUTTON_FUNCTION_LAST;
}
}
static gboolean static gboolean
button_layout_handler (GVariant *value, button_layout_handler (GVariant *value,
gpointer *result, gpointer *result,
@@ -1556,12 +1525,6 @@ button_layout_handler (GVariant *value,
if (i > 0 && strcmp("spacer", buttons[b]) == 0) if (i > 0 && strcmp("spacer", buttons[b]) == 0)
{ {
new_layout.left_buttons_has_spacer[i-1] = TRUE; new_layout.left_buttons_has_spacer[i-1] = TRUE;
f = button_opposite_function (f);
if (f != META_BUTTON_FUNCTION_LAST)
{
new_layout.left_buttons_has_spacer[i-2] = TRUE;
}
} }
else else
{ {
@@ -1570,11 +1533,6 @@ button_layout_handler (GVariant *value,
new_layout.left_buttons[i] = f; new_layout.left_buttons[i] = f;
used[f] = TRUE; used[f] = TRUE;
++i; ++i;
f = button_opposite_function (f);
if (f != META_BUTTON_FUNCTION_LAST)
new_layout.left_buttons[i++] = f;
} }
else else
{ {
@@ -1618,11 +1576,6 @@ button_layout_handler (GVariant *value,
if (i > 0 && strcmp("spacer", buttons[b]) == 0) if (i > 0 && strcmp("spacer", buttons[b]) == 0)
{ {
new_layout.right_buttons_has_spacer[i-1] = TRUE; new_layout.right_buttons_has_spacer[i-1] = TRUE;
f = button_opposite_function (f);
if (f != META_BUTTON_FUNCTION_LAST)
{
new_layout.right_buttons_has_spacer[i-2] = TRUE;
}
} }
else else
{ {
@@ -1631,12 +1584,6 @@ button_layout_handler (GVariant *value,
new_layout.right_buttons[i] = f; new_layout.right_buttons[i] = f;
used[f] = TRUE; used[f] = TRUE;
++i; ++i;
f = button_opposite_function (f);
if (f != META_BUTTON_FUNCTION_LAST)
new_layout.right_buttons[i++] = f;
} }
else else
{ {

View File

@@ -3534,7 +3534,10 @@ meta_window_update_for_monitors_changed (MetaWindow *window)
{ {
const MetaMonitorInfo *old, *new; const MetaMonitorInfo *old, *new;
if (window->override_redirect || window->type == META_WINDOW_DESKTOP) if (window->type == META_WINDOW_DESKTOP)
return;
if (window->override_redirect)
{ {
meta_window_update_monitor (window, FALSE); meta_window_update_monitor (window, FALSE);
return; return;

View File

@@ -372,12 +372,6 @@ typedef enum
* @META_BUTTON_FUNCTION_MINIMIZE: Minimize * @META_BUTTON_FUNCTION_MINIMIZE: Minimize
* @META_BUTTON_FUNCTION_MAXIMIZE: Maximize * @META_BUTTON_FUNCTION_MAXIMIZE: Maximize
* @META_BUTTON_FUNCTION_CLOSE: Close * @META_BUTTON_FUNCTION_CLOSE: Close
* @META_BUTTON_FUNCTION_SHADE: Shade
* @META_BUTTON_FUNCTION_ABOVE: Above
* @META_BUTTON_FUNCTION_STICK: Stick
* @META_BUTTON_FUNCTION_UNSHADE: Unshade
* @META_BUTTON_FUNCTION_UNABOVE: Unabove
* @META_BUTTON_FUNCTION_UNSTICK: Unstick
* @META_BUTTON_FUNCTION_LAST: Marks the end of the #MetaButtonFunction enumeration * @META_BUTTON_FUNCTION_LAST: Marks the end of the #MetaButtonFunction enumeration
* *
* Function a window button can have. Note, you can't add stuff here * Function a window button can have. Note, you can't add stuff here
@@ -390,12 +384,6 @@ typedef enum
META_BUTTON_FUNCTION_MINIMIZE, META_BUTTON_FUNCTION_MINIMIZE,
META_BUTTON_FUNCTION_MAXIMIZE, META_BUTTON_FUNCTION_MAXIMIZE,
META_BUTTON_FUNCTION_CLOSE, META_BUTTON_FUNCTION_CLOSE,
META_BUTTON_FUNCTION_SHADE,
META_BUTTON_FUNCTION_ABOVE,
META_BUTTON_FUNCTION_STICK,
META_BUTTON_FUNCTION_UNSHADE,
META_BUTTON_FUNCTION_UNABOVE,
META_BUTTON_FUNCTION_UNSTICK,
META_BUTTON_FUNCTION_APPMENU, META_BUTTON_FUNCTION_APPMENU,
META_BUTTON_FUNCTION_LAST META_BUTTON_FUNCTION_LAST
} MetaButtonFunction; } MetaButtonFunction;
@@ -405,10 +393,10 @@ typedef enum
/* Keep array size in sync with MAX_BUTTONS_PER_CORNER */ /* Keep array size in sync with MAX_BUTTONS_PER_CORNER */
/** /**
* MetaButtonLayout: * MetaButtonLayout:
* @left_buttons: (array fixed-size=11): * @left_buttons: (array fixed-size=5):
* @right_buttons: (array fixed-size=11): * @right_buttons: (array fixed-size=5):
* @left_buttons_has_spacer: (array fixed-size=11): * @left_buttons_has_spacer: (array fixed-size=5):
* @right_buttons_has_spacer: (array fixed-size=11): * @right_buttons_has_spacer: (array fixed-size=5):
*/ */
typedef struct _MetaButtonLayout MetaButtonLayout; typedef struct _MetaButtonLayout MetaButtonLayout;
struct _MetaButtonLayout struct _MetaButtonLayout

View File

@@ -9,8 +9,6 @@
<method name="TakeControl"> <method name="TakeControl">
<arg name="force" type="b"/> <arg name="force" type="b"/>
</method> </method>
<method name="ReleaseControl">
</method>
<method name="TakeDevice"> <method name="TakeDevice">
<annotation name="org.gtk.GDBus.C.UnixFD" value="true"/> <annotation name="org.gtk.GDBus.C.UnixFD" value="true"/>
<arg name="major" type="u" direction="in"/> <arg name="major" type="u" direction="in"/>

View File

@@ -970,12 +970,6 @@ meta_frame_left_click_event (MetaUIFrame *frame,
case META_FRAME_CONTROL_UNMAXIMIZE: case META_FRAME_CONTROL_UNMAXIMIZE:
case META_FRAME_CONTROL_MINIMIZE: case META_FRAME_CONTROL_MINIMIZE:
case META_FRAME_CONTROL_DELETE: case META_FRAME_CONTROL_DELETE:
case META_FRAME_CONTROL_SHADE:
case META_FRAME_CONTROL_UNSHADE:
case META_FRAME_CONTROL_ABOVE:
case META_FRAME_CONTROL_UNABOVE:
case META_FRAME_CONTROL_STICK:
case META_FRAME_CONTROL_UNSTICK:
case META_FRAME_CONTROL_MENU: case META_FRAME_CONTROL_MENU:
case META_FRAME_CONTROL_APPMENU: case META_FRAME_CONTROL_APPMENU:
frame->grab_button = event->button; frame->grab_button = event->button;
@@ -1154,24 +1148,6 @@ handle_button_release_event (MetaUIFrame *frame,
case META_FRAME_CONTROL_DELETE: case META_FRAME_CONTROL_DELETE:
meta_window_delete (frame->meta_window, event->time); meta_window_delete (frame->meta_window, event->time);
break; break;
case META_FRAME_CONTROL_SHADE:
meta_window_shade (frame->meta_window, event->time);
break;
case META_FRAME_CONTROL_UNSHADE:
meta_window_unshade (frame->meta_window, event->time);
break;
case META_FRAME_CONTROL_ABOVE:
meta_window_make_above (frame->meta_window);
break;
case META_FRAME_CONTROL_UNABOVE:
meta_window_unmake_above (frame->meta_window);
break;
case META_FRAME_CONTROL_STICK:
meta_window_stick (frame->meta_window);
break;
case META_FRAME_CONTROL_UNSTICK:
meta_window_unstick (frame->meta_window);
break;
default: default:
break; break;
} }
@@ -1220,18 +1196,6 @@ meta_ui_frame_update_prelit_control (MetaUIFrame *frame,
break; break;
case META_FRAME_CONTROL_UNMAXIMIZE: case META_FRAME_CONTROL_UNMAXIMIZE:
break; break;
case META_FRAME_CONTROL_SHADE:
break;
case META_FRAME_CONTROL_UNSHADE:
break;
case META_FRAME_CONTROL_ABOVE:
break;
case META_FRAME_CONTROL_UNABOVE:
break;
case META_FRAME_CONTROL_STICK:
break;
case META_FRAME_CONTROL_UNSTICK:
break;
case META_FRAME_CONTROL_RESIZE_SE: case META_FRAME_CONTROL_RESIZE_SE:
cursor = META_CURSOR_SE_RESIZE; cursor = META_CURSOR_SE_RESIZE;
break; break;
@@ -1270,12 +1234,6 @@ meta_ui_frame_update_prelit_control (MetaUIFrame *frame,
case META_FRAME_CONTROL_MINIMIZE: case META_FRAME_CONTROL_MINIMIZE:
case META_FRAME_CONTROL_MAXIMIZE: case META_FRAME_CONTROL_MAXIMIZE:
case META_FRAME_CONTROL_DELETE: case META_FRAME_CONTROL_DELETE:
case META_FRAME_CONTROL_SHADE:
case META_FRAME_CONTROL_UNSHADE:
case META_FRAME_CONTROL_ABOVE:
case META_FRAME_CONTROL_UNABOVE:
case META_FRAME_CONTROL_STICK:
case META_FRAME_CONTROL_UNSTICK:
case META_FRAME_CONTROL_UNMAXIMIZE: case META_FRAME_CONTROL_UNMAXIMIZE:
/* leave control set */ /* leave control set */
break; break;
@@ -1487,24 +1445,6 @@ meta_ui_frame_paint (MetaUIFrame *frame,
case META_FRAME_CONTROL_UNMAXIMIZE: case META_FRAME_CONTROL_UNMAXIMIZE:
button_type = META_BUTTON_TYPE_MAXIMIZE; button_type = META_BUTTON_TYPE_MAXIMIZE;
break; break;
case META_FRAME_CONTROL_SHADE:
button_type = META_BUTTON_TYPE_SHADE;
break;
case META_FRAME_CONTROL_UNSHADE:
button_type = META_BUTTON_TYPE_UNSHADE;
break;
case META_FRAME_CONTROL_ABOVE:
button_type = META_BUTTON_TYPE_ABOVE;
break;
case META_FRAME_CONTROL_UNABOVE:
button_type = META_BUTTON_TYPE_UNABOVE;
break;
case META_FRAME_CONTROL_STICK:
button_type = META_BUTTON_TYPE_STICK;
break;
case META_FRAME_CONTROL_UNSTICK:
button_type = META_BUTTON_TYPE_UNSTICK;
break;
case META_FRAME_CONTROL_DELETE: case META_FRAME_CONTROL_DELETE:
button_type = META_BUTTON_TYPE_CLOSE; button_type = META_BUTTON_TYPE_CLOSE;
break; break;
@@ -1624,24 +1564,6 @@ control_rect (MetaFrameControl control,
case META_FRAME_CONTROL_UNMAXIMIZE: case META_FRAME_CONTROL_UNMAXIMIZE:
rect = &fgeom->max_rect.visible; rect = &fgeom->max_rect.visible;
break; break;
case META_FRAME_CONTROL_SHADE:
rect = &fgeom->shade_rect.visible;
break;
case META_FRAME_CONTROL_UNSHADE:
rect = &fgeom->unshade_rect.visible;
break;
case META_FRAME_CONTROL_ABOVE:
rect = &fgeom->above_rect.visible;
break;
case META_FRAME_CONTROL_UNABOVE:
rect = &fgeom->unabove_rect.visible;
break;
case META_FRAME_CONTROL_STICK:
rect = &fgeom->stick_rect.visible;
break;
case META_FRAME_CONTROL_UNSTICK:
rect = &fgeom->unstick_rect.visible;
break;
case META_FRAME_CONTROL_RESIZE_SE: case META_FRAME_CONTROL_RESIZE_SE:
break; break;
case META_FRAME_CONTROL_RESIZE_S: case META_FRAME_CONTROL_RESIZE_S:
@@ -1726,36 +1648,6 @@ get_control (MetaUIFrame *frame, int root_x, int root_y)
return META_FRAME_CONTROL_MAXIMIZE; return META_FRAME_CONTROL_MAXIMIZE;
} }
if (POINT_IN_RECT (x, y, fgeom.shade_rect.clickable))
{
return META_FRAME_CONTROL_SHADE;
}
if (POINT_IN_RECT (x, y, fgeom.unshade_rect.clickable))
{
return META_FRAME_CONTROL_UNSHADE;
}
if (POINT_IN_RECT (x, y, fgeom.above_rect.clickable))
{
return META_FRAME_CONTROL_ABOVE;
}
if (POINT_IN_RECT (x, y, fgeom.unabove_rect.clickable))
{
return META_FRAME_CONTROL_UNABOVE;
}
if (POINT_IN_RECT (x, y, fgeom.stick_rect.clickable))
{
return META_FRAME_CONTROL_STICK;
}
if (POINT_IN_RECT (x, y, fgeom.unstick_rect.clickable))
{
return META_FRAME_CONTROL_UNSTICK;
}
/* South resize always has priority over north resize, /* South resize always has priority over north resize,
* in case of overlap. * in case of overlap.
*/ */

View File

@@ -39,12 +39,6 @@ typedef enum
META_FRAME_CONTROL_MINIMIZE, META_FRAME_CONTROL_MINIMIZE,
META_FRAME_CONTROL_MAXIMIZE, META_FRAME_CONTROL_MAXIMIZE,
META_FRAME_CONTROL_UNMAXIMIZE, META_FRAME_CONTROL_UNMAXIMIZE,
META_FRAME_CONTROL_SHADE,
META_FRAME_CONTROL_UNSHADE,
META_FRAME_CONTROL_ABOVE,
META_FRAME_CONTROL_UNABOVE,
META_FRAME_CONTROL_STICK,
META_FRAME_CONTROL_UNSTICK,
META_FRAME_CONTROL_RESIZE_SE, META_FRAME_CONTROL_RESIZE_SE,
META_FRAME_CONTROL_RESIZE_S, META_FRAME_CONTROL_RESIZE_S,
META_FRAME_CONTROL_RESIZE_SW, META_FRAME_CONTROL_RESIZE_SW,

View File

@@ -115,7 +115,7 @@ struct _MetaFrameGeometry
/* used for a memset hack */ /* used for a memset hack */
#define ADDRESS_OF_BUTTON_RECTS(fgeom) (((char*)(fgeom)) + G_STRUCT_OFFSET (MetaFrameGeometry, close_rect)) #define ADDRESS_OF_BUTTON_RECTS(fgeom) (((char*)(fgeom)) + G_STRUCT_OFFSET (MetaFrameGeometry, close_rect))
#define LENGTH_OF_BUTTON_RECTS (G_STRUCT_OFFSET (MetaFrameGeometry, unstick_rect) + sizeof (MetaButtonSpace) - G_STRUCT_OFFSET (MetaFrameGeometry, close_rect)) #define LENGTH_OF_BUTTON_RECTS (G_STRUCT_OFFSET (MetaFrameGeometry, appmenu_rect) + sizeof (MetaButtonSpace) - G_STRUCT_OFFSET (MetaFrameGeometry, close_rect))
/* The button rects (if changed adjust memset hack) */ /* The button rects (if changed adjust memset hack) */
MetaButtonSpace close_rect; MetaButtonSpace close_rect;
@@ -123,12 +123,6 @@ struct _MetaFrameGeometry
MetaButtonSpace min_rect; MetaButtonSpace min_rect;
MetaButtonSpace menu_rect; MetaButtonSpace menu_rect;
MetaButtonSpace appmenu_rect; MetaButtonSpace appmenu_rect;
MetaButtonSpace shade_rect;
MetaButtonSpace above_rect;
MetaButtonSpace stick_rect;
MetaButtonSpace unshade_rect;
MetaButtonSpace unabove_rect;
MetaButtonSpace unstick_rect;
/* End of button rects (if changed adjust memset hack) */ /* End of button rects (if changed adjust memset hack) */
/* Saved button layout */ /* Saved button layout */
@@ -158,12 +152,6 @@ typedef enum
META_BUTTON_TYPE_MINIMIZE, META_BUTTON_TYPE_MINIMIZE,
META_BUTTON_TYPE_MENU, META_BUTTON_TYPE_MENU,
META_BUTTON_TYPE_APPMENU, META_BUTTON_TYPE_APPMENU,
META_BUTTON_TYPE_SHADE,
META_BUTTON_TYPE_ABOVE,
META_BUTTON_TYPE_STICK,
META_BUTTON_TYPE_UNSHADE,
META_BUTTON_TYPE_UNABOVE,
META_BUTTON_TYPE_UNSTICK,
META_BUTTON_TYPE_LAST META_BUTTON_TYPE_LAST
} MetaButtonType; } MetaButtonType;

View File

@@ -177,17 +177,6 @@ rect_for_function (MetaFrameGeometry *fgeom,
return &fgeom->close_rect; return &fgeom->close_rect;
else else
return NULL; return NULL;
case META_BUTTON_FUNCTION_STICK:
case META_BUTTON_FUNCTION_SHADE:
case META_BUTTON_FUNCTION_ABOVE:
case META_BUTTON_FUNCTION_UNSTICK:
case META_BUTTON_FUNCTION_UNSHADE:
case META_BUTTON_FUNCTION_UNABOVE:
/* Fringe buttons that used to be supported by theme versions >v1;
* if we want to support them again, we need to return the
* correspondings rects here
*/
return NULL;
case META_BUTTON_FUNCTION_LAST: case META_BUTTON_FUNCTION_LAST:
return NULL; return NULL;
@@ -457,22 +446,10 @@ meta_frame_layout_calc_geometry (MetaFrameLayout *layout,
} }
/* Otherwise we need to shave out a button. Shave /* Otherwise we need to shave out a button. Shave
* above, stick, shade, min, max, close, then menu (menu is most useful); * min, max, close, then menu (menu is most useful);
* prefer the default button locations. * prefer the default button locations.
*/ */
if (strip_button (left_func_rects, &n_left, &fgeom->above_rect)) if (strip_button (left_func_rects, &n_left, &fgeom->min_rect))
continue;
else if (strip_button (right_func_rects, &n_right, &fgeom->above_rect))
continue;
else if (strip_button (left_func_rects, &n_left, &fgeom->stick_rect))
continue;
else if (strip_button (right_func_rects, &n_right, &fgeom->stick_rect))
continue;
else if (strip_button (left_func_rects, &n_left, &fgeom->shade_rect))
continue;
else if (strip_button (right_func_rects, &n_right, &fgeom->shade_rect))
continue;
else if (strip_button (left_func_rects, &n_left, &fgeom->min_rect))
continue; continue;
else if (strip_button (right_func_rects, &n_right, &fgeom->min_rect)) else if (strip_button (right_func_rects, &n_right, &fgeom->min_rect))
continue; continue;
@@ -643,30 +620,6 @@ get_button_rect (MetaButtonType type,
*rect = fgeom->close_rect.visible; *rect = fgeom->close_rect.visible;
break; break;
case META_BUTTON_TYPE_SHADE:
*rect = fgeom->shade_rect.visible;
break;
case META_BUTTON_TYPE_UNSHADE:
*rect = fgeom->unshade_rect.visible;
break;
case META_BUTTON_TYPE_ABOVE:
*rect = fgeom->above_rect.visible;
break;
case META_BUTTON_TYPE_UNABOVE:
*rect = fgeom->unabove_rect.visible;
break;
case META_BUTTON_TYPE_STICK:
*rect = fgeom->stick_rect.visible;
break;
case META_BUTTON_TYPE_UNSTICK:
*rect = fgeom->unstick_rect.visible;
break;
case META_BUTTON_TYPE_MAXIMIZE: case META_BUTTON_TYPE_MAXIMIZE:
*rect = fgeom->max_rect.visible; *rect = fgeom->max_rect.visible;
break; break;
@@ -890,6 +843,7 @@ meta_frame_layout_draw_with_style (MetaFrameLayout *layout,
cairo_restore (cr); cairo_restore (cr);
if (button_class) if (button_class)
gtk_style_context_remove_class (style, button_class); gtk_style_context_remove_class (style, button_class);
gtk_style_context_set_state (style, state);
} }
} }

View File

@@ -251,11 +251,12 @@ notify_key (MetaWaylandKeyboard *keyboard,
{ {
struct wl_client *client = wl_resource_get_client (keyboard->focus_surface->resource); struct wl_client *client = wl_resource_get_client (keyboard->focus_surface->resource);
struct wl_display *display = wl_client_get_display (client); struct wl_display *display = wl_client_get_display (client);
uint32_t serial = wl_display_next_serial (display);
keyboard->key_serial = wl_display_next_serial (display);
wl_resource_for_each (resource, l) wl_resource_for_each (resource, l)
{ {
wl_keyboard_send_key (resource, serial, time, key, state); wl_keyboard_send_key (resource, keyboard->key_serial, time, key, state);
} }
} }
@@ -672,3 +673,10 @@ meta_wayland_keyboard_create_new_resource (MetaWaylandKeyboard *keyboard,
wl_list_insert (&keyboard->resource_list, wl_resource_get_link (cr)); wl_list_insert (&keyboard->resource_list, wl_resource_get_link (cr));
} }
} }
gboolean
meta_wayland_keyboard_can_popup (MetaWaylandKeyboard *keyboard,
uint32_t serial)
{
return keyboard->key_serial == serial;
}

View File

@@ -68,6 +68,7 @@ struct _MetaWaylandKeyboard
MetaWaylandSurface *focus_surface; MetaWaylandSurface *focus_surface;
struct wl_listener focus_surface_listener; struct wl_listener focus_surface_listener;
uint32_t focus_serial; uint32_t focus_serial;
uint32_t key_serial;
MetaWaylandXkbInfo xkb_info; MetaWaylandXkbInfo xkb_info;
enum xkb_state_component mods_changed; enum xkb_state_component mods_changed;
@@ -100,4 +101,7 @@ void meta_wayland_keyboard_create_new_resource (MetaWaylandKeyboard *keyboard,
struct wl_resource *seat_resource, struct wl_resource *seat_resource,
uint32_t id); uint32_t id);
gboolean meta_wayland_keyboard_can_popup (MetaWaylandKeyboard *keyboard,
uint32_t serial);
#endif /* META_WAYLAND_KEYBOARD_H */ #endif /* META_WAYLAND_KEYBOARD_H */

View File

@@ -494,10 +494,27 @@ handle_scroll_event (MetaWaylandPointer *pointer,
{ {
struct wl_resource *resource; struct wl_resource *resource;
wl_fixed_t x_value = 0, y_value = 0; wl_fixed_t x_value = 0, y_value = 0;
enum wl_pointer_axis_source source = -1;
if (clutter_event_is_pointer_emulated (event)) if (clutter_event_is_pointer_emulated (event))
return; return;
switch (event->scroll.scroll_source)
{
case CLUTTER_SCROLL_SOURCE_WHEEL:
source = WL_POINTER_AXIS_SOURCE_WHEEL;
break;
case CLUTTER_SCROLL_SOURCE_FINGER:
source = WL_POINTER_AXIS_SOURCE_FINGER;
break;
case CLUTTER_SCROLL_SOURCE_CONTINUOUS:
source = WL_POINTER_AXIS_SOURCE_CONTINUOUS;
break;
default:
source = WL_POINTER_AXIS_SOURCE_WHEEL;
break;
}
switch (clutter_event_get_scroll_direction (event)) switch (clutter_event_get_scroll_direction (event))
{ {
case CLUTTER_SCROLL_UP: case CLUTTER_SCROLL_UP:
@@ -537,12 +554,31 @@ handle_scroll_event (MetaWaylandPointer *pointer,
{ {
wl_resource_for_each (resource, &pointer->focus_client->pointer_resources) wl_resource_for_each (resource, &pointer->focus_client->pointer_resources)
{ {
if (wl_resource_get_version (resource) >= WL_POINTER_AXIS_SOURCE_SINCE_VERSION)
wl_pointer_send_axis_source (resource, source);
if (x_value) if (x_value)
wl_pointer_send_axis (resource, clutter_event_get_time (event), wl_pointer_send_axis (resource, clutter_event_get_time (event),
WL_POINTER_AXIS_HORIZONTAL_SCROLL, x_value); WL_POINTER_AXIS_HORIZONTAL_SCROLL, x_value);
if ((event->scroll.finish_flags & CLUTTER_SCROLL_FINISHED_HORIZONTAL) &&
wl_resource_get_version (resource) >= WL_POINTER_AXIS_STOP_SINCE_VERSION)
wl_pointer_send_axis_stop (resource,
clutter_event_get_time (event),
WL_POINTER_AXIS_HORIZONTAL_SCROLL);
if (y_value) if (y_value)
wl_pointer_send_axis (resource, clutter_event_get_time (event), wl_pointer_send_axis (resource, clutter_event_get_time (event),
WL_POINTER_AXIS_VERTICAL_SCROLL, y_value); WL_POINTER_AXIS_VERTICAL_SCROLL, y_value);
if ((event->scroll.finish_flags & CLUTTER_SCROLL_FINISHED_VERTICAL) &&
wl_resource_get_version (resource) >= WL_POINTER_AXIS_STOP_SINCE_VERSION)
wl_pointer_send_axis_stop (resource,
clutter_event_get_time (event),
WL_POINTER_AXIS_VERTICAL_SCROLL);
if (wl_resource_get_version (resource) >= WL_POINTER_AXIS_SOURCE_SINCE_VERSION)
wl_pointer_send_axis_frame (resource);
} }
} }
} }

View File

@@ -405,3 +405,12 @@ meta_wayland_seat_get_grab_info (MetaWaylandSeat *seat,
return sequence || can_grab_surface; return sequence || can_grab_surface;
} }
gboolean
meta_wayland_seat_can_popup (MetaWaylandSeat *seat,
uint32_t serial)
{
return (meta_wayland_pointer_can_popup (&seat->pointer, serial) ||
meta_wayland_keyboard_can_popup (&seat->keyboard, serial) ||
meta_wayland_touch_can_popup (&seat->touch, serial));
}

View File

@@ -64,5 +64,7 @@ gboolean meta_wayland_seat_get_grab_info (MetaWaylandSeat *seat,
uint32_t serial, uint32_t serial,
gfloat *x, gfloat *x,
gfloat *y); gfloat *y);
gboolean meta_wayland_seat_can_popup (MetaWaylandSeat *seat,
uint32_t serial);
#endif /* META_WAYLAND_SEAT_H */ #endif /* META_WAYLAND_SEAT_H */

View File

@@ -1518,7 +1518,7 @@ xdg_shell_get_xdg_popup (struct wl_client *client,
surface->xdg_popup = popup_resource; surface->xdg_popup = popup_resource;
surface->xdg_shell_resource = resource; surface->xdg_shell_resource = resource;
if (!meta_wayland_pointer_can_popup (&seat->pointer, serial)) if (!meta_wayland_seat_can_popup (seat, serial))
{ {
xdg_popup_send_popup_done (popup_resource); xdg_popup_send_popup_done (popup_resource);
return; return;
@@ -1739,7 +1739,7 @@ wl_shell_surface_set_popup (struct wl_client *client,
wl_shell_surface_set_state (surface, SURFACE_STATE_TOPLEVEL); wl_shell_surface_set_state (surface, SURFACE_STATE_TOPLEVEL);
if (!meta_wayland_pointer_can_popup (&seat->pointer, serial)) if (!meta_wayland_seat_can_popup (seat, serial))
{ {
wl_shell_surface_send_popup_done (resource); wl_shell_surface_send_popup_done (resource);
return; return;

View File

@@ -575,6 +575,26 @@ meta_wayland_touch_create_new_resource (MetaWaylandTouch *touch,
wl_list_insert (&touch->resource_list, wl_resource_get_link (cr)); wl_list_insert (&touch->resource_list, wl_resource_get_link (cr));
} }
gboolean
meta_wayland_touch_can_popup (MetaWaylandTouch *touch,
uint32_t serial)
{
MetaWaylandTouchInfo *touch_info;
GHashTableIter iter;
if (!touch->touches)
return FALSE;
g_hash_table_iter_init (&iter, touch->touches);
while (g_hash_table_iter_next (&iter, NULL, (gpointer*) &touch_info))
{
if (touch_info->slot_serial == serial)
return TRUE;
}
return FALSE;
}
ClutterEventSequence * ClutterEventSequence *
meta_wayland_touch_find_grab_sequence (MetaWaylandTouch *touch, meta_wayland_touch_find_grab_sequence (MetaWaylandTouch *touch,
MetaWaylandSurface *surface, MetaWaylandSurface *surface,

View File

@@ -70,4 +70,7 @@ gboolean meta_wayland_touch_get_press_coords (MetaWaylandTouch *touch,
gfloat *x, gfloat *x,
gfloat *y); gfloat *y);
gboolean meta_wayland_touch_can_popup (MetaWaylandTouch *touch,
uint32_t serial);
#endif /* META_WAYLAND_TOUCH_H */ #endif /* META_WAYLAND_TOUCH_H */

View File

@@ -39,7 +39,7 @@
#define META_WL_DATA_DEVICE_MANAGER_VERSION 2 #define META_WL_DATA_DEVICE_MANAGER_VERSION 2
#define META_XDG_SHELL_VERSION 1 #define META_XDG_SHELL_VERSION 1
#define META_WL_SHELL_VERSION 1 #define META_WL_SHELL_VERSION 1
#define META_WL_SEAT_VERSION 4 #define META_WL_SEAT_VERSION 5
#define META_WL_OUTPUT_VERSION 2 #define META_WL_OUTPUT_VERSION 2
#define META_XSERVER_VERSION 1 #define META_XSERVER_VERSION 1
#define META_GTK_SHELL_VERSION 2 #define META_GTK_SHELL_VERSION 2