Compare commits
24 Commits
Author | SHA1 | Date | |
---|---|---|---|
![]() |
cff5ef0ec2 | ||
![]() |
d478d8f143 | ||
![]() |
7eca43cec9 | ||
![]() |
9060190555 | ||
![]() |
0de3869656 | ||
![]() |
9f13033f15 | ||
![]() |
48bf807430 | ||
![]() |
c68e43a97f | ||
![]() |
cc53d48fa8 | ||
![]() |
ca6e799b97 | ||
![]() |
0f8e387dc0 | ||
![]() |
d62c595e51 | ||
![]() |
dd3cf94744 | ||
![]() |
eb56e0a3d7 | ||
![]() |
8937c32cd5 | ||
![]() |
a8a5da768a | ||
![]() |
33bfcf56ce | ||
![]() |
40cccb58a5 | ||
![]() |
eb6c70137b | ||
![]() |
df3b412a25 | ||
![]() |
cfba0a5dfc | ||
![]() |
3561b46fc6 | ||
![]() |
8dfb88b669 | ||
![]() |
2e3086e2aa |
13
NEWS
13
NEWS
@@ -1,3 +1,16 @@
|
|||||||
|
3.17.1
|
||||||
|
======
|
||||||
|
* Add public method to get neighboring monitor [Florian; #633994]
|
||||||
|
* Apply the right settings to the right input devices [Carlos; #747886]
|
||||||
|
* Fix scroll button setting [Ondrej; #747967]
|
||||||
|
* Add support for modal hint on wayland [Jonas; #745720]
|
||||||
|
* Don't reset idle time for non-hardware events [Rui; #748541]
|
||||||
|
* Misc. bug fixes [Ray, Rui; #748380, #748478]
|
||||||
|
|
||||||
|
Contributors:
|
||||||
|
Jonas Ådahl, Carlos Garnacho, Ondrej Holy, Rui Matos, Florian Müllner,
|
||||||
|
Jasper St. Pierre, Ray Strode, Tomeu Vizoso
|
||||||
|
|
||||||
3.16.1
|
3.16.1
|
||||||
======
|
======
|
||||||
* Add function to refresh all background instances [Rui; #739178]
|
* Add function to refresh all background instances [Rui; #739178]
|
||||||
|
@@ -1,7 +1,7 @@
|
|||||||
AC_PREREQ(2.62)
|
AC_PREREQ(2.62)
|
||||||
|
|
||||||
m4_define([mutter_major_version], [3])
|
m4_define([mutter_major_version], [3])
|
||||||
m4_define([mutter_minor_version], [16])
|
m4_define([mutter_minor_version], [17])
|
||||||
m4_define([mutter_micro_version], [1])
|
m4_define([mutter_micro_version], [1])
|
||||||
|
|
||||||
m4_define([mutter_version],
|
m4_define([mutter_version],
|
||||||
|
@@ -210,10 +210,9 @@ libmutter_la_SOURCES = \
|
|||||||
meta/theme.h \
|
meta/theme.h \
|
||||||
ui/theme-private.h \
|
ui/theme-private.h \
|
||||||
ui/ui.c \
|
ui/ui.c \
|
||||||
x11/iconcache.c \
|
|
||||||
x11/iconcache.h \
|
|
||||||
x11/async-getprop.c \
|
x11/async-getprop.c \
|
||||||
x11/async-getprop.h \
|
x11/async-getprop.h \
|
||||||
|
x11/atomnames.h \
|
||||||
x11/events.c \
|
x11/events.c \
|
||||||
x11/events.h \
|
x11/events.h \
|
||||||
x11/group-private.h \
|
x11/group-private.h \
|
||||||
@@ -221,6 +220,8 @@ libmutter_la_SOURCES = \
|
|||||||
x11/group-props.h \
|
x11/group-props.h \
|
||||||
x11/group.c \
|
x11/group.c \
|
||||||
meta/group.h \
|
meta/group.h \
|
||||||
|
x11/iconcache.c \
|
||||||
|
x11/iconcache.h \
|
||||||
x11/session.c \
|
x11/session.c \
|
||||||
x11/session.h \
|
x11/session.h \
|
||||||
x11/window-props.c \
|
x11/window-props.c \
|
||||||
@@ -265,8 +266,8 @@ libmutter_la_SOURCES += \
|
|||||||
wayland/meta-wayland-versions.h \
|
wayland/meta-wayland-versions.h \
|
||||||
wayland/meta-wayland-outputs.c \
|
wayland/meta-wayland-outputs.c \
|
||||||
wayland/meta-wayland-outputs.h \
|
wayland/meta-wayland-outputs.h \
|
||||||
wayland/window-wayland.c \
|
wayland/meta-window-wayland.c \
|
||||||
wayland/window-wayland.h \
|
wayland/meta-window-wayland.h \
|
||||||
$(NULL)
|
$(NULL)
|
||||||
endif
|
endif
|
||||||
|
|
||||||
@@ -338,16 +339,10 @@ libmutterinclude_base_headers = \
|
|||||||
$(libmutterinclude_headers) \
|
$(libmutterinclude_headers) \
|
||||||
$(libmutterinclude_built_headers)
|
$(libmutterinclude_built_headers)
|
||||||
|
|
||||||
# Excluded from scanning for introspection but installed
|
|
||||||
# atomnames.h: macros cause problems for scanning process
|
|
||||||
libmutterinclude_extra_headers = \
|
|
||||||
meta/atomnames.h
|
|
||||||
|
|
||||||
libmutterincludedir = $(includedir)/mutter/meta
|
libmutterincludedir = $(includedir)/mutter/meta
|
||||||
|
|
||||||
libmutterinclude_HEADERS = \
|
libmutterinclude_HEADERS = \
|
||||||
$(libmutterinclude_headers) \
|
$(libmutterinclude_headers)
|
||||||
$(libmutterinclude_extra_headers)
|
|
||||||
|
|
||||||
nodist_libmutterinclude_HEADERS = \
|
nodist_libmutterinclude_HEADERS = \
|
||||||
$(libmutterinclude_built_headers)
|
$(libmutterinclude_built_headers)
|
||||||
|
@@ -209,6 +209,10 @@ update_touchpad_left_handed (MetaInputSettings *input_settings,
|
|||||||
MetaInputSettingsPrivate *priv;
|
MetaInputSettingsPrivate *priv;
|
||||||
gboolean enabled = FALSE;
|
gboolean enabled = FALSE;
|
||||||
|
|
||||||
|
if (device &&
|
||||||
|
clutter_input_device_get_device_type (device) != CLUTTER_TOUCHPAD_DEVICE)
|
||||||
|
return;
|
||||||
|
|
||||||
priv = meta_input_settings_get_instance_private (input_settings);
|
priv = meta_input_settings_get_instance_private (input_settings);
|
||||||
input_settings_class = META_INPUT_SETTINGS_GET_CLASS (input_settings);
|
input_settings_class = META_INPUT_SETTINGS_GET_CLASS (input_settings);
|
||||||
handedness = g_settings_get_enum (priv->touchpad_settings, "left-handed");
|
handedness = g_settings_get_enum (priv->touchpad_settings, "left-handed");
|
||||||
@@ -230,7 +234,6 @@ update_touchpad_left_handed (MetaInputSettings *input_settings,
|
|||||||
|
|
||||||
if (device)
|
if (device)
|
||||||
{
|
{
|
||||||
g_assert (clutter_input_device_get_device_type (device) == CLUTTER_TOUCHPAD_DEVICE);
|
|
||||||
settings_device_set_bool_setting (input_settings, device,
|
settings_device_set_bool_setting (input_settings, device,
|
||||||
input_settings_class->set_left_handed,
|
input_settings_class->set_left_handed,
|
||||||
enabled);
|
enabled);
|
||||||
@@ -251,13 +254,16 @@ update_mouse_left_handed (MetaInputSettings *input_settings,
|
|||||||
MetaInputSettingsPrivate *priv;
|
MetaInputSettingsPrivate *priv;
|
||||||
gboolean enabled;
|
gboolean enabled;
|
||||||
|
|
||||||
|
if (device &&
|
||||||
|
clutter_input_device_get_device_type (device) != CLUTTER_POINTER_DEVICE)
|
||||||
|
return;
|
||||||
|
|
||||||
priv = meta_input_settings_get_instance_private (input_settings);
|
priv = meta_input_settings_get_instance_private (input_settings);
|
||||||
input_settings_class = META_INPUT_SETTINGS_GET_CLASS (input_settings);
|
input_settings_class = META_INPUT_SETTINGS_GET_CLASS (input_settings);
|
||||||
enabled = g_settings_get_boolean (priv->mouse_settings, "left-handed");
|
enabled = g_settings_get_boolean (priv->mouse_settings, "left-handed");
|
||||||
|
|
||||||
if (device)
|
if (device)
|
||||||
{
|
{
|
||||||
g_assert (clutter_input_device_get_device_type (device) == CLUTTER_POINTER_DEVICE);
|
|
||||||
settings_device_set_bool_setting (input_settings, device,
|
settings_device_set_bool_setting (input_settings, device,
|
||||||
input_settings_class->set_left_handed,
|
input_settings_class->set_left_handed,
|
||||||
enabled);
|
enabled);
|
||||||
@@ -366,6 +372,10 @@ update_touchpad_tap_enabled (MetaInputSettings *input_settings,
|
|||||||
MetaInputSettingsPrivate *priv;
|
MetaInputSettingsPrivate *priv;
|
||||||
gboolean enabled;
|
gboolean enabled;
|
||||||
|
|
||||||
|
if (device &&
|
||||||
|
clutter_input_device_get_device_type (device) != CLUTTER_TOUCHPAD_DEVICE)
|
||||||
|
return;
|
||||||
|
|
||||||
priv = meta_input_settings_get_instance_private (input_settings);
|
priv = meta_input_settings_get_instance_private (input_settings);
|
||||||
input_settings_class = META_INPUT_SETTINGS_GET_CLASS (input_settings);
|
input_settings_class = META_INPUT_SETTINGS_GET_CLASS (input_settings);
|
||||||
enabled = g_settings_get_boolean (priv->touchpad_settings, "tap-to-click");
|
enabled = g_settings_get_boolean (priv->touchpad_settings, "tap-to-click");
|
||||||
@@ -392,6 +402,10 @@ update_touchpad_scroll_method (MetaInputSettings *input_settings,
|
|||||||
GDesktopTouchpadScrollMethod method;
|
GDesktopTouchpadScrollMethod method;
|
||||||
MetaInputSettingsPrivate *priv;
|
MetaInputSettingsPrivate *priv;
|
||||||
|
|
||||||
|
if (device &&
|
||||||
|
clutter_input_device_get_device_type (device) != CLUTTER_TOUCHPAD_DEVICE)
|
||||||
|
return;
|
||||||
|
|
||||||
priv = meta_input_settings_get_instance_private (input_settings);
|
priv = meta_input_settings_get_instance_private (input_settings);
|
||||||
input_settings_class = META_INPUT_SETTINGS_GET_CLASS (input_settings);
|
input_settings_class = META_INPUT_SETTINGS_GET_CLASS (input_settings);
|
||||||
method = g_settings_get_enum (priv->touchpad_settings, "scroll-method");
|
method = g_settings_get_enum (priv->touchpad_settings, "scroll-method");
|
||||||
@@ -418,6 +432,10 @@ update_touchpad_click_method (MetaInputSettings *input_settings,
|
|||||||
GDesktopTouchpadScrollMethod method;
|
GDesktopTouchpadScrollMethod method;
|
||||||
MetaInputSettingsPrivate *priv;
|
MetaInputSettingsPrivate *priv;
|
||||||
|
|
||||||
|
if (device &&
|
||||||
|
clutter_input_device_get_device_type (device) != CLUTTER_TOUCHPAD_DEVICE)
|
||||||
|
return;
|
||||||
|
|
||||||
priv = meta_input_settings_get_instance_private (input_settings);
|
priv = meta_input_settings_get_instance_private (input_settings);
|
||||||
input_settings_class = META_INPUT_SETTINGS_GET_CLASS (input_settings);
|
input_settings_class = META_INPUT_SETTINGS_GET_CLASS (input_settings);
|
||||||
method = g_settings_get_enum (priv->touchpad_settings, "click-method");
|
method = g_settings_get_enum (priv->touchpad_settings, "click-method");
|
||||||
@@ -444,6 +462,10 @@ update_touchpad_send_events (MetaInputSettings *input_settings,
|
|||||||
MetaInputSettingsPrivate *priv;
|
MetaInputSettingsPrivate *priv;
|
||||||
GDesktopDeviceSendEvents mode;
|
GDesktopDeviceSendEvents mode;
|
||||||
|
|
||||||
|
if (device &&
|
||||||
|
clutter_input_device_get_device_type (device) != CLUTTER_TOUCHPAD_DEVICE)
|
||||||
|
return;
|
||||||
|
|
||||||
priv = meta_input_settings_get_instance_private (input_settings);
|
priv = meta_input_settings_get_instance_private (input_settings);
|
||||||
input_settings_class = META_INPUT_SETTINGS_GET_CLASS (input_settings);
|
input_settings_class = META_INPUT_SETTINGS_GET_CLASS (input_settings);
|
||||||
mode = g_settings_get_enum (priv->touchpad_settings, "send-events");
|
mode = g_settings_get_enum (priv->touchpad_settings, "send-events");
|
||||||
@@ -486,13 +508,16 @@ update_trackball_scroll_button (MetaInputSettings *input_settings,
|
|||||||
MetaInputSettingsPrivate *priv;
|
MetaInputSettingsPrivate *priv;
|
||||||
guint button;
|
guint button;
|
||||||
|
|
||||||
|
if (device && !device_is_trackball (device))
|
||||||
|
return;
|
||||||
|
|
||||||
priv = meta_input_settings_get_instance_private (input_settings);
|
priv = meta_input_settings_get_instance_private (input_settings);
|
||||||
input_settings_class = META_INPUT_SETTINGS_GET_CLASS (input_settings);
|
input_settings_class = META_INPUT_SETTINGS_GET_CLASS (input_settings);
|
||||||
/* This key is 'i' in the schema but it also specifies a minimum
|
/* This key is 'i' in the schema but it also specifies a minimum
|
||||||
* range of 0 so the cast here is safe. */
|
* range of 0 so the cast here is safe. */
|
||||||
button = (guint) g_settings_get_int (priv->trackball_settings, "scroll-wheel-emulation-button");
|
button = (guint) g_settings_get_int (priv->trackball_settings, "scroll-wheel-emulation-button");
|
||||||
|
|
||||||
if (device && device_is_trackball (device))
|
if (device)
|
||||||
{
|
{
|
||||||
input_settings_class->set_scroll_button (input_settings, device, button);
|
input_settings_class->set_scroll_button (input_settings, device, button);
|
||||||
}
|
}
|
||||||
|
@@ -65,6 +65,7 @@ typedef struct {
|
|||||||
|
|
||||||
gboolean is_primary;
|
gboolean is_primary;
|
||||||
gboolean is_presentation;
|
gboolean is_presentation;
|
||||||
|
gboolean is_underscanning;
|
||||||
} MetaOutputConfig;
|
} MetaOutputConfig;
|
||||||
|
|
||||||
typedef struct {
|
typedef struct {
|
||||||
@@ -82,7 +83,8 @@ struct _MetaMonitorConfig {
|
|||||||
gboolean current_is_for_laptop_lid;
|
gboolean current_is_for_laptop_lid;
|
||||||
MetaConfiguration *previous;
|
MetaConfiguration *previous;
|
||||||
|
|
||||||
GFile *file;
|
GFile *user_file;
|
||||||
|
GFile *system_file;
|
||||||
GCancellable *save_cancellable;
|
GCancellable *save_cancellable;
|
||||||
|
|
||||||
UpClient *up_client;
|
UpClient *up_client;
|
||||||
@@ -238,6 +240,7 @@ meta_monitor_config_init (MetaMonitorConfig *self)
|
|||||||
{
|
{
|
||||||
const char *filename;
|
const char *filename;
|
||||||
char *path;
|
char *path;
|
||||||
|
const char * const *system_dirs;
|
||||||
|
|
||||||
self->configs = g_hash_table_new_full (config_hash, config_equal, NULL, (GDestroyNotify) config_unref);
|
self->configs = g_hash_table_new_full (config_hash, config_equal, NULL, (GDestroyNotify) config_unref);
|
||||||
|
|
||||||
@@ -246,9 +249,17 @@ meta_monitor_config_init (MetaMonitorConfig *self)
|
|||||||
filename = "monitors.xml";
|
filename = "monitors.xml";
|
||||||
|
|
||||||
path = g_build_filename (g_get_user_config_dir (), filename, NULL);
|
path = g_build_filename (g_get_user_config_dir (), filename, NULL);
|
||||||
self->file = g_file_new_for_path (path);
|
self->user_file = g_file_new_for_path (path);
|
||||||
g_free (path);
|
g_free (path);
|
||||||
|
|
||||||
|
for (system_dirs = g_get_system_config_dirs (); !self->system_file && *system_dirs; system_dirs++)
|
||||||
|
{
|
||||||
|
path = g_build_filename (*system_dirs, filename, NULL);
|
||||||
|
if (g_file_test (path, G_FILE_TEST_EXISTS))
|
||||||
|
self->system_file = g_file_new_for_path (path);
|
||||||
|
g_free (path);
|
||||||
|
}
|
||||||
|
|
||||||
self->up_client = up_client_new ();
|
self->up_client = up_client_new ();
|
||||||
self->lid_is_closed = up_client_get_lid_is_closed (self->up_client);
|
self->lid_is_closed = up_client_get_lid_is_closed (self->up_client);
|
||||||
|
|
||||||
@@ -393,7 +404,8 @@ handle_start_element (GMarkupParseContext *context,
|
|||||||
strcmp (element_name, "reflect_x") == 0 ||
|
strcmp (element_name, "reflect_x") == 0 ||
|
||||||
strcmp (element_name, "reflect_y") == 0 ||
|
strcmp (element_name, "reflect_y") == 0 ||
|
||||||
strcmp (element_name, "primary") == 0 ||
|
strcmp (element_name, "primary") == 0 ||
|
||||||
strcmp (element_name, "presentation") == 0) && parser->unknown_count == 0)
|
strcmp (element_name, "presentation") == 0 ||
|
||||||
|
strcmp (element_name, "underscanning") == 0) && parser->unknown_count == 0)
|
||||||
{
|
{
|
||||||
parser->state = STATE_OUTPUT_FIELD;
|
parser->state = STATE_OUTPUT_FIELD;
|
||||||
|
|
||||||
@@ -700,6 +712,8 @@ handle_text (GMarkupParseContext *context,
|
|||||||
parser->output.is_primary = read_bool (text, text_len, error);
|
parser->output.is_primary = read_bool (text, text_len, error);
|
||||||
else if (strcmp (parser->output_field, "presentation") == 0)
|
else if (strcmp (parser->output_field, "presentation") == 0)
|
||||||
parser->output.is_presentation = read_bool (text, text_len, error);
|
parser->output.is_presentation = read_bool (text, text_len, error);
|
||||||
|
else if (strcmp (parser->output_field, "underscanning") == 0)
|
||||||
|
parser->output.is_underscanning = read_bool (text, text_len, error);
|
||||||
else
|
else
|
||||||
g_assert_not_reached ();
|
g_assert_not_reached ();
|
||||||
return;
|
return;
|
||||||
@@ -717,8 +731,8 @@ static const GMarkupParser config_parser = {
|
|||||||
.text = handle_text,
|
.text = handle_text,
|
||||||
};
|
};
|
||||||
|
|
||||||
static void
|
static gboolean
|
||||||
meta_monitor_config_load (MetaMonitorConfig *self)
|
load_config_file (MetaMonitorConfig *self, GFile *file)
|
||||||
{
|
{
|
||||||
char *contents;
|
char *contents;
|
||||||
gsize size;
|
gsize size;
|
||||||
@@ -736,14 +750,12 @@ meta_monitor_config_load (MetaMonitorConfig *self)
|
|||||||
*/
|
*/
|
||||||
|
|
||||||
error = NULL;
|
error = NULL;
|
||||||
ok = g_file_load_contents (self->file, NULL, &contents, &size, NULL, &error);
|
ok = g_file_load_contents (file, NULL, &contents, &size, NULL, &error);
|
||||||
if (!ok)
|
if (!ok)
|
||||||
{
|
{
|
||||||
if (!g_error_matches (error, G_IO_ERROR, G_IO_ERROR_NOT_FOUND))
|
|
||||||
meta_warning ("Failed to load stored monitor configuration: %s\n", error->message);
|
|
||||||
|
|
||||||
g_error_free (error);
|
g_error_free (error);
|
||||||
return;
|
return FALSE;
|
||||||
}
|
}
|
||||||
|
|
||||||
memset (&parser, 0, sizeof (ConfigParser));
|
memset (&parser, 0, sizeof (ConfigParser));
|
||||||
@@ -772,6 +784,17 @@ meta_monitor_config_load (MetaMonitorConfig *self)
|
|||||||
|
|
||||||
g_markup_parse_context_free (context);
|
g_markup_parse_context_free (context);
|
||||||
g_free (contents);
|
g_free (contents);
|
||||||
|
|
||||||
|
return ok;
|
||||||
|
}
|
||||||
|
|
||||||
|
static void
|
||||||
|
meta_monitor_config_load (MetaMonitorConfig *self)
|
||||||
|
{
|
||||||
|
if (self->user_file && load_config_file (self, self->user_file))
|
||||||
|
return;
|
||||||
|
if (self->system_file && load_config_file (self, self->system_file))
|
||||||
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
MetaMonitorConfig *
|
MetaMonitorConfig *
|
||||||
@@ -1408,6 +1431,7 @@ init_config_from_output (MetaOutputConfig *config,
|
|||||||
config->transform = output->crtc->transform;
|
config->transform = output->crtc->transform;
|
||||||
config->is_primary = output->is_primary;
|
config->is_primary = output->is_primary;
|
||||||
config->is_presentation = output->is_presentation;
|
config->is_presentation = output->is_presentation;
|
||||||
|
config->is_underscanning = output->is_underscanning;
|
||||||
}
|
}
|
||||||
|
|
||||||
void
|
void
|
||||||
@@ -1598,7 +1622,8 @@ meta_monitor_config_save (MetaMonitorConfig *self)
|
|||||||
" <reflect_x>%s</reflect_x>\n"
|
" <reflect_x>%s</reflect_x>\n"
|
||||||
" <reflect_y>no</reflect_y>\n"
|
" <reflect_y>no</reflect_y>\n"
|
||||||
" <primary>%s</primary>\n"
|
" <primary>%s</primary>\n"
|
||||||
" <presentation>%s</presentation>\n",
|
" <presentation>%s</presentation>\n"
|
||||||
|
" <underscanning>%s</underscanning>\n",
|
||||||
output->rect.width,
|
output->rect.width,
|
||||||
output->rect.height,
|
output->rect.height,
|
||||||
refresh_rate,
|
refresh_rate,
|
||||||
@@ -1607,7 +1632,8 @@ meta_monitor_config_save (MetaMonitorConfig *self)
|
|||||||
rotation_map[output->transform & 0x3],
|
rotation_map[output->transform & 0x3],
|
||||||
output->transform >= META_MONITOR_TRANSFORM_FLIPPED ? "yes" : "no",
|
output->transform >= META_MONITOR_TRANSFORM_FLIPPED ? "yes" : "no",
|
||||||
output->is_primary ? "yes" : "no",
|
output->is_primary ? "yes" : "no",
|
||||||
output->is_presentation ? "yes" : "no");
|
output->is_presentation ? "yes" : "no",
|
||||||
|
output->is_underscanning ? "yes" : "no");
|
||||||
}
|
}
|
||||||
|
|
||||||
g_string_append (buffer, " </output>\n");
|
g_string_append (buffer, " </output>\n");
|
||||||
@@ -1622,7 +1648,7 @@ meta_monitor_config_save (MetaMonitorConfig *self)
|
|||||||
closure->config = g_object_ref (self);
|
closure->config = g_object_ref (self);
|
||||||
closure->buffer = buffer;
|
closure->buffer = buffer;
|
||||||
|
|
||||||
g_file_replace_contents_async (self->file,
|
g_file_replace_contents_async (self->user_file,
|
||||||
buffer->str, buffer->len,
|
buffer->str, buffer->len,
|
||||||
NULL, /* etag */
|
NULL, /* etag */
|
||||||
TRUE,
|
TRUE,
|
||||||
@@ -1941,6 +1967,7 @@ meta_monitor_config_assign_crtcs (MetaConfiguration *config,
|
|||||||
&config->keys[i]);
|
&config->keys[i]);
|
||||||
output_info->is_primary = output_config->is_primary;
|
output_info->is_primary = output_config->is_primary;
|
||||||
output_info->is_presentation = output_config->is_presentation;
|
output_info->is_presentation = output_config->is_presentation;
|
||||||
|
output_info->is_underscanning = output_config->is_underscanning;
|
||||||
|
|
||||||
g_ptr_array_add (outputs, output_info);
|
g_ptr_array_add (outputs, output_info);
|
||||||
}
|
}
|
||||||
|
@@ -132,6 +132,7 @@ struct _MetaOutput
|
|||||||
*/
|
*/
|
||||||
gboolean is_primary;
|
gboolean is_primary;
|
||||||
gboolean is_presentation;
|
gboolean is_presentation;
|
||||||
|
gboolean is_underscanning;
|
||||||
|
|
||||||
gpointer driver_private;
|
gpointer driver_private;
|
||||||
GDestroyNotify driver_notify;
|
GDestroyNotify driver_notify;
|
||||||
@@ -159,6 +160,9 @@ struct _MetaCRTC
|
|||||||
gboolean is_dirty;
|
gboolean is_dirty;
|
||||||
|
|
||||||
MetaCursorReference *cursor;
|
MetaCursorReference *cursor;
|
||||||
|
|
||||||
|
gpointer driver_private;
|
||||||
|
GDestroyNotify driver_notify;
|
||||||
};
|
};
|
||||||
|
|
||||||
struct _MetaMonitorMode
|
struct _MetaMonitorMode
|
||||||
@@ -230,6 +234,7 @@ struct _MetaOutputInfo {
|
|||||||
MetaOutput *output;
|
MetaOutput *output;
|
||||||
gboolean is_primary;
|
gboolean is_primary;
|
||||||
gboolean is_presentation;
|
gboolean is_presentation;
|
||||||
|
gboolean is_underscanning;
|
||||||
};
|
};
|
||||||
|
|
||||||
#define META_TYPE_MONITOR_MANAGER (meta_monitor_manager_get_type ())
|
#define META_TYPE_MONITOR_MANAGER (meta_monitor_manager_get_type ())
|
||||||
|
@@ -264,6 +264,21 @@ meta_monitor_manager_free_mode_array (MetaMonitorMode *old_modes,
|
|||||||
g_free (old_modes);
|
g_free (old_modes);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static void
|
||||||
|
meta_monitor_manager_free_crtc_array (MetaCRTC *old_crtcs,
|
||||||
|
int n_old_crtcs)
|
||||||
|
{
|
||||||
|
int i;
|
||||||
|
|
||||||
|
for (i = 0; i < n_old_crtcs; i++)
|
||||||
|
{
|
||||||
|
if (old_crtcs[i].driver_notify)
|
||||||
|
old_crtcs[i].driver_notify (&old_crtcs[i]);
|
||||||
|
}
|
||||||
|
|
||||||
|
g_free (old_crtcs);
|
||||||
|
}
|
||||||
|
|
||||||
static void
|
static void
|
||||||
meta_monitor_manager_finalize (GObject *object)
|
meta_monitor_manager_finalize (GObject *object)
|
||||||
{
|
{
|
||||||
@@ -271,8 +286,8 @@ meta_monitor_manager_finalize (GObject *object)
|
|||||||
|
|
||||||
meta_monitor_manager_free_output_array (manager->outputs, manager->n_outputs);
|
meta_monitor_manager_free_output_array (manager->outputs, manager->n_outputs);
|
||||||
meta_monitor_manager_free_mode_array (manager->modes, manager->n_modes);
|
meta_monitor_manager_free_mode_array (manager->modes, manager->n_modes);
|
||||||
|
meta_monitor_manager_free_crtc_array (manager->crtcs, manager->n_crtcs);
|
||||||
g_free (manager->monitor_infos);
|
g_free (manager->monitor_infos);
|
||||||
g_free (manager->crtcs);
|
|
||||||
|
|
||||||
G_OBJECT_CLASS (meta_monitor_manager_parent_class)->finalize (object);
|
G_OBJECT_CLASS (meta_monitor_manager_parent_class)->finalize (object);
|
||||||
}
|
}
|
||||||
@@ -520,6 +535,8 @@ meta_monitor_manager_handle_get_resources (MetaDBusDisplayConfig *skeleton,
|
|||||||
g_variant_new_boolean (output->is_presentation));
|
g_variant_new_boolean (output->is_presentation));
|
||||||
g_variant_builder_add (&properties, "{sv}", "connector-type",
|
g_variant_builder_add (&properties, "{sv}", "connector-type",
|
||||||
g_variant_new_string (get_connector_type_name (output->connector_type)));
|
g_variant_new_string (get_connector_type_name (output->connector_type)));
|
||||||
|
g_variant_builder_add (&properties, "{sv}", "underscanning",
|
||||||
|
g_variant_new_boolean (output->is_underscanning));
|
||||||
|
|
||||||
edid_file = manager_class->get_edid_file (manager, output);
|
edid_file = manager_class->get_edid_file (manager, output);
|
||||||
if (edid_file)
|
if (edid_file)
|
||||||
@@ -808,7 +825,7 @@ meta_monitor_manager_handle_apply_configuration (MetaDBusDisplayConfig *skeleto
|
|||||||
while (g_variant_iter_loop (&output_iter, "(u@a{sv})", &output_index, &properties))
|
while (g_variant_iter_loop (&output_iter, "(u@a{sv})", &output_index, &properties))
|
||||||
{
|
{
|
||||||
MetaOutputInfo *output_info;
|
MetaOutputInfo *output_info;
|
||||||
gboolean primary, presentation;
|
gboolean primary, presentation, underscanning;
|
||||||
|
|
||||||
if (output_index >= manager->n_outputs)
|
if (output_index >= manager->n_outputs)
|
||||||
{
|
{
|
||||||
@@ -827,6 +844,9 @@ meta_monitor_manager_handle_apply_configuration (MetaDBusDisplayConfig *skeleto
|
|||||||
if (g_variant_lookup (properties, "presentation", "b", &presentation))
|
if (g_variant_lookup (properties, "presentation", "b", &presentation))
|
||||||
output_info->is_presentation = presentation;
|
output_info->is_presentation = presentation;
|
||||||
|
|
||||||
|
if (g_variant_lookup (properties, "underscanning", "b", &underscanning))
|
||||||
|
output_info->is_underscanning = underscanning;
|
||||||
|
|
||||||
g_ptr_array_add (output_infos, output_info);
|
g_ptr_array_add (output_infos, output_info);
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -1194,23 +1214,24 @@ meta_monitor_manager_read_current_config (MetaMonitorManager *manager)
|
|||||||
MetaOutput *old_outputs;
|
MetaOutput *old_outputs;
|
||||||
MetaCRTC *old_crtcs;
|
MetaCRTC *old_crtcs;
|
||||||
MetaMonitorMode *old_modes;
|
MetaMonitorMode *old_modes;
|
||||||
unsigned int n_old_outputs, n_old_modes;
|
unsigned int n_old_outputs, n_old_crtcs, n_old_modes;
|
||||||
|
|
||||||
/* Some implementations of read_current use the existing information
|
/* Some implementations of read_current use the existing information
|
||||||
* we have available, so don't free the old configuration until after
|
* we have available, so don't free the old configuration until after
|
||||||
* read_current finishes. */
|
* read_current finishes. */
|
||||||
old_outputs = manager->outputs;
|
old_outputs = manager->outputs;
|
||||||
n_old_outputs = manager->n_outputs;
|
n_old_outputs = manager->n_outputs;
|
||||||
|
old_crtcs = manager->crtcs;
|
||||||
|
n_old_crtcs = manager->n_crtcs;
|
||||||
old_modes = manager->modes;
|
old_modes = manager->modes;
|
||||||
n_old_modes = manager->n_modes;
|
n_old_modes = manager->n_modes;
|
||||||
old_crtcs = manager->crtcs;
|
|
||||||
|
|
||||||
manager->serial++;
|
manager->serial++;
|
||||||
META_MONITOR_MANAGER_GET_CLASS (manager)->read_current (manager);
|
META_MONITOR_MANAGER_GET_CLASS (manager)->read_current (manager);
|
||||||
|
|
||||||
meta_monitor_manager_free_output_array (old_outputs, n_old_outputs);
|
meta_monitor_manager_free_output_array (old_outputs, n_old_outputs);
|
||||||
meta_monitor_manager_free_mode_array (old_modes, n_old_modes);
|
meta_monitor_manager_free_mode_array (old_modes, n_old_modes);
|
||||||
g_free (old_crtcs);
|
meta_monitor_manager_free_crtc_array (old_crtcs, n_old_crtcs);
|
||||||
}
|
}
|
||||||
|
|
||||||
void
|
void
|
||||||
|
@@ -57,6 +57,12 @@ typedef struct {
|
|||||||
uint32_t edid_blob_id;
|
uint32_t edid_blob_id;
|
||||||
} MetaOutputKms;
|
} MetaOutputKms;
|
||||||
|
|
||||||
|
typedef struct {
|
||||||
|
uint32_t underscan_prop_id;
|
||||||
|
uint32_t underscan_hborder_prop_id;
|
||||||
|
uint32_t underscan_vborder_prop_id;
|
||||||
|
} MetaCRTCKms;
|
||||||
|
|
||||||
struct _MetaMonitorManagerKms
|
struct _MetaMonitorManagerKms
|
||||||
{
|
{
|
||||||
MetaMonitorManager parent_instance;
|
MetaMonitorManager parent_instance;
|
||||||
@@ -137,6 +143,12 @@ meta_monitor_mode_destroy_notify (MetaMonitorMode *output)
|
|||||||
g_slice_free (drmModeModeInfo, output->driver_private);
|
g_slice_free (drmModeModeInfo, output->driver_private);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static void
|
||||||
|
meta_crtc_destroy_notify (MetaCRTC *crtc)
|
||||||
|
{
|
||||||
|
g_free (crtc->driver_private);
|
||||||
|
}
|
||||||
|
|
||||||
static gboolean
|
static gboolean
|
||||||
drm_mode_equal (gconstpointer one,
|
drm_mode_equal (gconstpointer one,
|
||||||
gconstpointer two)
|
gconstpointer two)
|
||||||
@@ -181,29 +193,57 @@ drm_mode_hash (gconstpointer ptr)
|
|||||||
}
|
}
|
||||||
|
|
||||||
static void
|
static void
|
||||||
find_properties (MetaMonitorManagerKms *manager_kms,
|
find_connector_properties (MetaMonitorManagerKms *manager_kms,
|
||||||
MetaOutputKms *output_kms)
|
MetaOutputKms *output_kms)
|
||||||
{
|
{
|
||||||
drmModePropertyPtr prop;
|
|
||||||
int i;
|
int i;
|
||||||
|
|
||||||
for (i = 0; i < output_kms->connector->count_props; i++)
|
for (i = 0; i < output_kms->connector->count_props; i++)
|
||||||
{
|
{
|
||||||
prop = drmModeGetProperty (manager_kms->fd, output_kms->connector->props[i]);
|
drmModePropertyPtr prop = drmModeGetProperty (manager_kms->fd, output_kms->connector->props[i]);
|
||||||
if (!prop)
|
if (!prop)
|
||||||
continue;
|
continue;
|
||||||
|
|
||||||
if ((prop->flags & DRM_MODE_PROP_ENUM) &&
|
if ((prop->flags & DRM_MODE_PROP_ENUM) && strcmp (prop->name, "DPMS") == 0)
|
||||||
strcmp(prop->name, "DPMS") == 0)
|
|
||||||
output_kms->dpms_prop_id = prop->prop_id;
|
output_kms->dpms_prop_id = prop->prop_id;
|
||||||
else if ((prop->flags & DRM_MODE_PROP_BLOB) &&
|
else if ((prop->flags & DRM_MODE_PROP_BLOB) && strcmp (prop->name, "EDID") == 0)
|
||||||
strcmp (prop->name, "EDID") == 0)
|
|
||||||
output_kms->edid_blob_id = output_kms->connector->prop_values[i];
|
output_kms->edid_blob_id = output_kms->connector->prop_values[i];
|
||||||
|
|
||||||
drmModeFreeProperty (prop);
|
drmModeFreeProperty (prop);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static void
|
||||||
|
find_crtc_properties (MetaMonitorManagerKms *manager_kms,
|
||||||
|
MetaCRTC *meta_crtc)
|
||||||
|
{
|
||||||
|
MetaCRTCKms *crtc_kms;
|
||||||
|
drmModeObjectPropertiesPtr props;
|
||||||
|
size_t i;
|
||||||
|
|
||||||
|
crtc_kms = meta_crtc->driver_private;
|
||||||
|
|
||||||
|
props = drmModeObjectGetProperties (manager_kms->fd, meta_crtc->crtc_id, DRM_MODE_OBJECT_CRTC);
|
||||||
|
if (!props)
|
||||||
|
return;
|
||||||
|
|
||||||
|
for (i = 0; i < props->count_props; i++)
|
||||||
|
{
|
||||||
|
drmModePropertyPtr prop = drmModeGetProperty (manager_kms->fd, props->props[i]);
|
||||||
|
if (!prop)
|
||||||
|
continue;
|
||||||
|
|
||||||
|
if ((prop->flags & DRM_MODE_PROP_ENUM) && strcmp (prop->name, "underscan") == 0)
|
||||||
|
crtc_kms->underscan_prop_id = prop->prop_id;
|
||||||
|
else if ((prop->flags & DRM_MODE_PROP_RANGE) && strcmp (prop->name, "underscan hborder") == 0)
|
||||||
|
crtc_kms->underscan_hborder_prop_id = prop->prop_id;
|
||||||
|
else if ((prop->flags & DRM_MODE_PROP_RANGE) && strcmp (prop->name, "underscan vborder") == 0)
|
||||||
|
crtc_kms->underscan_vborder_prop_id = prop->prop_id;
|
||||||
|
|
||||||
|
drmModeFreeProperty (prop);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
static GBytes *
|
static GBytes *
|
||||||
read_output_edid (MetaMonitorManagerKms *manager_kms,
|
read_output_edid (MetaMonitorManagerKms *manager_kms,
|
||||||
MetaOutput *output)
|
MetaOutput *output)
|
||||||
@@ -442,6 +482,10 @@ meta_monitor_manager_kms_read_current (MetaMonitorManager *manager)
|
|||||||
height = MAX (height, meta_crtc->rect.y + meta_crtc->rect.height);
|
height = MAX (height, meta_crtc->rect.y + meta_crtc->rect.height);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
meta_crtc->driver_private = g_new0 (MetaCRTCKms, 1);
|
||||||
|
meta_crtc->driver_notify = (GDestroyNotify) meta_crtc_destroy_notify;
|
||||||
|
find_crtc_properties (manager_kms, meta_crtc);
|
||||||
|
|
||||||
drmModeFreeCrtc (crtc);
|
drmModeFreeCrtc (crtc);
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -567,7 +611,7 @@ meta_monitor_manager_kms_read_current (MetaMonitorManager *manager)
|
|||||||
meta_output->is_presentation = FALSE;
|
meta_output->is_presentation = FALSE;
|
||||||
}
|
}
|
||||||
|
|
||||||
find_properties (manager_kms, output_kms);
|
find_connector_properties (manager_kms, output_kms);
|
||||||
|
|
||||||
edid = read_output_edid (manager_kms, meta_output);
|
edid = read_output_edid (manager_kms, meta_output);
|
||||||
meta_output_parse_edid (meta_output, edid);
|
meta_output_parse_edid (meta_output, edid);
|
||||||
@@ -723,8 +767,9 @@ meta_monitor_manager_kms_set_power_save_mode (MetaMonitorManager *manager,
|
|||||||
|
|
||||||
if (output_kms->dpms_prop_id != 0)
|
if (output_kms->dpms_prop_id != 0)
|
||||||
{
|
{
|
||||||
int ok = drmModeConnectorSetProperty(manager_kms->fd, meta_output->winsys_id,
|
int ok = drmModeObjectSetProperty (manager_kms->fd, meta_output->winsys_id,
|
||||||
output_kms->dpms_prop_id, state);
|
DRM_MODE_OBJECT_CONNECTOR,
|
||||||
|
output_kms->dpms_prop_id, state);
|
||||||
|
|
||||||
if (ok < 0)
|
if (ok < 0)
|
||||||
meta_warning ("Failed to set power save mode for output %s: %s\n",
|
meta_warning ("Failed to set power save mode for output %s: %s\n",
|
||||||
@@ -748,6 +793,48 @@ crtc_free (CoglKmsCrtc *crtc)
|
|||||||
g_slice_free (CoglKmsCrtc, crtc);
|
g_slice_free (CoglKmsCrtc, crtc);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static void
|
||||||
|
set_underscan (MetaMonitorManagerKms *manager_kms,
|
||||||
|
MetaOutput *output)
|
||||||
|
{
|
||||||
|
if (!output->crtc)
|
||||||
|
return;
|
||||||
|
|
||||||
|
MetaCRTC *crtc = output->crtc;
|
||||||
|
MetaCRTCKms *crtc_kms = crtc->driver_private;
|
||||||
|
if (!crtc_kms->underscan_prop_id)
|
||||||
|
return;
|
||||||
|
|
||||||
|
if (output->is_underscanning)
|
||||||
|
{
|
||||||
|
drmModeObjectSetProperty (manager_kms->fd, crtc->crtc_id,
|
||||||
|
DRM_MODE_OBJECT_CRTC,
|
||||||
|
crtc_kms->underscan_prop_id, (uint64_t) 1);
|
||||||
|
|
||||||
|
if (crtc_kms->underscan_hborder_prop_id)
|
||||||
|
{
|
||||||
|
uint64_t value = crtc->current_mode->width * 0.05;
|
||||||
|
drmModeObjectSetProperty (manager_kms->fd, crtc->crtc_id,
|
||||||
|
DRM_MODE_OBJECT_CRTC,
|
||||||
|
crtc_kms->underscan_hborder_prop_id, value);
|
||||||
|
}
|
||||||
|
if (crtc_kms->underscan_vborder_prop_id)
|
||||||
|
{
|
||||||
|
uint64_t value = crtc->current_mode->height * 0.05;
|
||||||
|
drmModeObjectSetProperty (manager_kms->fd, crtc->crtc_id,
|
||||||
|
DRM_MODE_OBJECT_CRTC,
|
||||||
|
crtc_kms->underscan_vborder_prop_id, value);
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
drmModeObjectSetProperty (manager_kms->fd, crtc->crtc_id,
|
||||||
|
DRM_MODE_OBJECT_CRTC,
|
||||||
|
crtc_kms->underscan_prop_id, (uint64_t) 0);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
static void
|
static void
|
||||||
meta_monitor_manager_kms_apply_configuration (MetaMonitorManager *manager,
|
meta_monitor_manager_kms_apply_configuration (MetaMonitorManager *manager,
|
||||||
MetaCRTCInfo **crtcs,
|
MetaCRTCInfo **crtcs,
|
||||||
@@ -755,6 +842,7 @@ meta_monitor_manager_kms_apply_configuration (MetaMonitorManager *manager,
|
|||||||
MetaOutputInfo **outputs,
|
MetaOutputInfo **outputs,
|
||||||
unsigned int n_outputs)
|
unsigned int n_outputs)
|
||||||
{
|
{
|
||||||
|
MetaMonitorManagerKms *manager_kms = META_MONITOR_MANAGER_KMS (manager);
|
||||||
ClutterBackend *backend;
|
ClutterBackend *backend;
|
||||||
CoglContext *cogl_context;
|
CoglContext *cogl_context;
|
||||||
CoglDisplay *cogl_display;
|
CoglDisplay *cogl_display;
|
||||||
@@ -900,6 +988,9 @@ meta_monitor_manager_kms_apply_configuration (MetaMonitorManager *manager,
|
|||||||
|
|
||||||
output->is_primary = output_info->is_primary;
|
output->is_primary = output_info->is_primary;
|
||||||
output->is_presentation = output_info->is_presentation;
|
output->is_presentation = output_info->is_presentation;
|
||||||
|
output->is_underscanning = output_info->is_underscanning;
|
||||||
|
|
||||||
|
set_underscan (manager_kms, output);
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Disable outputs not mentioned in the list */
|
/* Disable outputs not mentioned in the list */
|
||||||
|
@@ -180,7 +180,7 @@ meta_input_settings_x11_set_scroll_button (MetaInputSettings *settings,
|
|||||||
ClutterInputDevice *device,
|
ClutterInputDevice *device,
|
||||||
guint button)
|
guint button)
|
||||||
{
|
{
|
||||||
change_property (device, "libinput Scroll Method Enabled",
|
change_property (device, "libinput Button Scrolling Button",
|
||||||
XA_INTEGER, 32, &button, 1);
|
XA_INTEGER, 32, &button, 1);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@@ -225,6 +225,38 @@ output_get_presentation_xrandr (MetaMonitorManagerXrandr *manager_xrandr,
|
|||||||
return output_get_boolean_property (manager_xrandr, output, "_MUTTER_PRESENTATION_OUTPUT");
|
return output_get_boolean_property (manager_xrandr, output, "_MUTTER_PRESENTATION_OUTPUT");
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static gboolean
|
||||||
|
output_get_underscanning_xrandr (MetaMonitorManagerXrandr *manager_xrandr,
|
||||||
|
MetaOutput *output)
|
||||||
|
{
|
||||||
|
gboolean value = FALSE;
|
||||||
|
Atom atom, actual_type;
|
||||||
|
int actual_format;
|
||||||
|
unsigned long nitems, bytes_after;
|
||||||
|
unsigned char *buffer;
|
||||||
|
char *str;
|
||||||
|
|
||||||
|
atom = XInternAtom (manager_xrandr->xdisplay, "underscan", False);
|
||||||
|
XRRGetOutputProperty (manager_xrandr->xdisplay,
|
||||||
|
(XID)output->winsys_id,
|
||||||
|
atom,
|
||||||
|
0, G_MAXLONG, False, False, XA_ATOM,
|
||||||
|
&actual_type, &actual_format,
|
||||||
|
&nitems, &bytes_after, &buffer);
|
||||||
|
|
||||||
|
if (actual_type != XA_ATOM || actual_format != 32 ||
|
||||||
|
nitems < 1)
|
||||||
|
goto out;
|
||||||
|
|
||||||
|
str = XGetAtomName (manager_xrandr->xdisplay, *(Atom *)buffer);
|
||||||
|
value = !strcmp(str, "on");
|
||||||
|
XFree (str);
|
||||||
|
|
||||||
|
out:
|
||||||
|
XFree (buffer);
|
||||||
|
return value;
|
||||||
|
}
|
||||||
|
|
||||||
static int
|
static int
|
||||||
normalize_backlight (MetaOutput *output,
|
normalize_backlight (MetaOutput *output,
|
||||||
int hw_value)
|
int hw_value)
|
||||||
@@ -756,6 +788,7 @@ meta_monitor_manager_xrandr_read_current (MetaMonitorManager *manager)
|
|||||||
|
|
||||||
meta_output->is_primary = ((XID)meta_output->winsys_id == primary_output);
|
meta_output->is_primary = ((XID)meta_output->winsys_id == primary_output);
|
||||||
meta_output->is_presentation = output_get_presentation_xrandr (manager_xrandr, meta_output);
|
meta_output->is_presentation = output_get_presentation_xrandr (manager_xrandr, meta_output);
|
||||||
|
meta_output->is_underscanning = output_get_underscanning_xrandr (manager_xrandr, meta_output);
|
||||||
output_get_backlight_limits_xrandr (manager_xrandr, meta_output);
|
output_get_backlight_limits_xrandr (manager_xrandr, meta_output);
|
||||||
|
|
||||||
if (!(meta_output->backlight_min == 0 && meta_output->backlight_max == 0))
|
if (!(meta_output->backlight_min == 0 && meta_output->backlight_max == 0))
|
||||||
@@ -876,6 +909,49 @@ output_set_presentation_xrandr (MetaMonitorManagerXrandr *manager_xrandr,
|
|||||||
(unsigned char*) &value, 1);
|
(unsigned char*) &value, 1);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static void
|
||||||
|
output_set_underscanning_xrandr (MetaMonitorManagerXrandr *manager_xrandr,
|
||||||
|
MetaOutput *output,
|
||||||
|
gboolean underscanning)
|
||||||
|
{
|
||||||
|
Atom prop, valueatom;
|
||||||
|
const char *value;
|
||||||
|
|
||||||
|
prop = XInternAtom (manager_xrandr->xdisplay, "underscan", False);
|
||||||
|
|
||||||
|
value = underscanning ? "on" : "off";
|
||||||
|
valueatom = XInternAtom (manager_xrandr->xdisplay, value, False);
|
||||||
|
XRRChangeOutputProperty (manager_xrandr->xdisplay,
|
||||||
|
(XID)output->winsys_id,
|
||||||
|
prop,
|
||||||
|
XA_ATOM, 32, PropModeReplace,
|
||||||
|
(unsigned char*) &valueatom, 1);
|
||||||
|
|
||||||
|
/* Configure the border at the same time. Currently, we use a
|
||||||
|
* 5% of the width/height of the mode. In the future, we should
|
||||||
|
* make the border configurable. */
|
||||||
|
if (underscanning)
|
||||||
|
{
|
||||||
|
uint32_t border_value;
|
||||||
|
|
||||||
|
prop = XInternAtom (manager_xrandr->xdisplay, "underscan hborder", False);
|
||||||
|
border_value = output->crtc->current_mode->width * 0.05;
|
||||||
|
XRRChangeOutputProperty (manager_xrandr->xdisplay,
|
||||||
|
(XID)output->winsys_id,
|
||||||
|
prop,
|
||||||
|
XA_INTEGER, 32, PropModeReplace,
|
||||||
|
(unsigned char *) &border_value, 1);
|
||||||
|
|
||||||
|
prop = XInternAtom (manager_xrandr->xdisplay, "underscan vborder", False);
|
||||||
|
border_value = output->crtc->current_mode->height * 0.05;
|
||||||
|
XRRChangeOutputProperty (manager_xrandr->xdisplay,
|
||||||
|
(XID)output->winsys_id,
|
||||||
|
prop,
|
||||||
|
XA_INTEGER, 32, PropModeReplace,
|
||||||
|
(unsigned char *) &border_value, 1);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
static void
|
static void
|
||||||
meta_monitor_manager_xrandr_apply_configuration (MetaMonitorManager *manager,
|
meta_monitor_manager_xrandr_apply_configuration (MetaMonitorManager *manager,
|
||||||
MetaCRTCInfo **crtcs,
|
MetaCRTCInfo **crtcs,
|
||||||
@@ -1071,8 +1147,13 @@ meta_monitor_manager_xrandr_apply_configuration (MetaMonitorManager *manager,
|
|||||||
output_info->output,
|
output_info->output,
|
||||||
output_info->is_presentation);
|
output_info->is_presentation);
|
||||||
|
|
||||||
|
output_set_underscanning_xrandr (manager_xrandr,
|
||||||
|
output_info->output,
|
||||||
|
output_info->is_underscanning);
|
||||||
|
|
||||||
output->is_primary = output_info->is_primary;
|
output->is_primary = output_info->is_primary;
|
||||||
output->is_presentation = output_info->is_presentation;
|
output->is_presentation = output_info->is_presentation;
|
||||||
|
output->is_underscanning = output_info->is_underscanning;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Disable outputs not mentioned in the list */
|
/* Disable outputs not mentioned in the list */
|
||||||
|
@@ -217,19 +217,6 @@ meta_core_show_window_menu_for_rect (Display *xdisplay,
|
|||||||
meta_window_show_menu_for_rect (window, menu, rect);
|
meta_window_show_menu_for_rect (window, menu, rect);
|
||||||
}
|
}
|
||||||
|
|
||||||
const char*
|
|
||||||
meta_core_get_workspace_name_with_index (Display *xdisplay,
|
|
||||||
Window xroot,
|
|
||||||
int index)
|
|
||||||
{
|
|
||||||
MetaDisplay *display;
|
|
||||||
MetaWorkspace *workspace;
|
|
||||||
|
|
||||||
display = meta_display_for_x_display (xdisplay);
|
|
||||||
workspace = meta_screen_get_workspace_by_index (display->screen, index);
|
|
||||||
return workspace ? meta_workspace_get_name (workspace) : NULL;
|
|
||||||
}
|
|
||||||
|
|
||||||
gboolean
|
gboolean
|
||||||
meta_core_begin_grab_op (Display *xdisplay,
|
meta_core_begin_grab_op (Display *xdisplay,
|
||||||
Window frame_xwindow,
|
Window frame_xwindow,
|
||||||
|
@@ -47,9 +47,6 @@ void meta_core_change_workspace (Display *xdisplay,
|
|||||||
|
|
||||||
int meta_core_get_frame_workspace (Display *xdisplay,
|
int meta_core_get_frame_workspace (Display *xdisplay,
|
||||||
Window frame_xwindow);
|
Window frame_xwindow);
|
||||||
const char* meta_core_get_workspace_name_with_index (Display *xdisplay,
|
|
||||||
Window xroot,
|
|
||||||
int index);
|
|
||||||
|
|
||||||
void meta_core_show_window_menu (Display *xdisplay,
|
void meta_core_show_window_menu (Display *xdisplay,
|
||||||
Window frame_xwindow,
|
Window frame_xwindow,
|
||||||
|
@@ -121,7 +121,7 @@ struct _MetaDisplay
|
|||||||
* class is constructed.
|
* class is constructed.
|
||||||
*/
|
*/
|
||||||
#define item(x) Atom atom_##x;
|
#define item(x) Atom atom_##x;
|
||||||
#include <meta/atomnames.h>
|
#include <x11/atomnames.h>
|
||||||
#undef item
|
#undef item
|
||||||
|
|
||||||
/* The window and serial of the most recent FocusIn event. */
|
/* The window and serial of the most recent FocusIn event. */
|
||||||
|
@@ -549,7 +549,7 @@ meta_display_open (void)
|
|||||||
/* A list of all atom names, so that we can intern them in one go. */
|
/* A list of all atom names, so that we can intern them in one go. */
|
||||||
char *atom_names[] = {
|
char *atom_names[] = {
|
||||||
#define item(x) #x,
|
#define item(x) #x,
|
||||||
#include <meta/atomnames.h>
|
#include <x11/atomnames.h>
|
||||||
#undef item
|
#undef item
|
||||||
};
|
};
|
||||||
Atom atoms[G_N_ELEMENTS(atom_names)];
|
Atom atoms[G_N_ELEMENTS(atom_names)];
|
||||||
@@ -610,7 +610,7 @@ meta_display_open (void)
|
|||||||
{
|
{
|
||||||
int i = 0;
|
int i = 0;
|
||||||
#define item(x) display->atom_##x = atoms[i++];
|
#define item(x) display->atom_##x = atoms[i++];
|
||||||
#include <meta/atomnames.h>
|
#include <x11/atomnames.h>
|
||||||
#undef item
|
#undef item
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@@ -93,6 +93,15 @@ handle_idletime_for_event (const ClutterEvent *event)
|
|||||||
if (device == NULL)
|
if (device == NULL)
|
||||||
return;
|
return;
|
||||||
|
|
||||||
|
if (event->any.flags & CLUTTER_EVENT_FLAG_SYNTHETIC ||
|
||||||
|
event->type == CLUTTER_ENTER ||
|
||||||
|
event->type == CLUTTER_LEAVE ||
|
||||||
|
event->type == CLUTTER_STAGE_STATE ||
|
||||||
|
event->type == CLUTTER_DESTROY_NOTIFY ||
|
||||||
|
event->type == CLUTTER_CLIENT_MESSAGE ||
|
||||||
|
event->type == CLUTTER_DELETE)
|
||||||
|
return;
|
||||||
|
|
||||||
device_id = clutter_input_device_get_device_id (device);
|
device_id = clutter_input_device_get_device_id (device);
|
||||||
|
|
||||||
core_monitor = meta_idle_monitor_get_core ();
|
core_monitor = meta_idle_monitor_get_core ();
|
||||||
@@ -192,6 +201,7 @@ meta_display_handle_event (MetaDisplay *display,
|
|||||||
{
|
{
|
||||||
MetaCursorTracker *tracker = meta_cursor_tracker_get_for_screen (NULL);
|
MetaCursorTracker *tracker = meta_cursor_tracker_get_for_screen (NULL);
|
||||||
meta_cursor_tracker_update_position (tracker, event->motion.x, event->motion.y);
|
meta_cursor_tracker_update_position (tracker, event->motion.x, event->motion.y);
|
||||||
|
display->monitor_cache_invalidated = TRUE;
|
||||||
}
|
}
|
||||||
|
|
||||||
handle_idletime_for_event (event);
|
handle_idletime_for_event (event);
|
||||||
|
@@ -41,14 +41,6 @@
|
|||||||
typedef void (* MetaScreenWindowFunc) (MetaWindow *window,
|
typedef void (* MetaScreenWindowFunc) (MetaWindow *window,
|
||||||
gpointer user_data);
|
gpointer user_data);
|
||||||
|
|
||||||
typedef enum
|
|
||||||
{
|
|
||||||
META_SCREEN_UP,
|
|
||||||
META_SCREEN_DOWN,
|
|
||||||
META_SCREEN_LEFT,
|
|
||||||
META_SCREEN_RIGHT
|
|
||||||
} MetaScreenDirection;
|
|
||||||
|
|
||||||
#define META_WIREFRAME_XOR_LINE_WIDTH 2
|
#define META_WIREFRAME_XOR_LINE_WIDTH 2
|
||||||
|
|
||||||
struct _MetaScreen
|
struct _MetaScreen
|
||||||
|
@@ -294,7 +294,7 @@ set_supported_hint (MetaScreen *screen)
|
|||||||
Atom atoms[] = {
|
Atom atoms[] = {
|
||||||
#define EWMH_ATOMS_ONLY
|
#define EWMH_ATOMS_ONLY
|
||||||
#define item(x) screen->display->atom_##x,
|
#define item(x) screen->display->atom_##x,
|
||||||
#include <meta/atomnames.h>
|
#include <x11/atomnames.h>
|
||||||
#undef item
|
#undef item
|
||||||
#undef EWMH_ATOMS_ONLY
|
#undef EWMH_ATOMS_ONLY
|
||||||
|
|
||||||
@@ -1490,6 +1490,16 @@ meta_screen_get_monitor_neighbor (MetaScreen *screen,
|
|||||||
return NULL;
|
return NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
int
|
||||||
|
meta_screen_get_monitor_neighbor_index (MetaScreen *screen,
|
||||||
|
int which_monitor,
|
||||||
|
MetaScreenDirection direction)
|
||||||
|
{
|
||||||
|
const MetaMonitorInfo *monitor;
|
||||||
|
monitor = meta_screen_get_monitor_neighbor (screen, which_monitor, direction);
|
||||||
|
return monitor ? monitor->number : -1;
|
||||||
|
}
|
||||||
|
|
||||||
void
|
void
|
||||||
meta_screen_get_natural_monitor_list (MetaScreen *screen,
|
meta_screen_get_natural_monitor_list (MetaScreen *screen,
|
||||||
int** monitors_list,
|
int** monitors_list,
|
||||||
|
@@ -57,7 +57,7 @@
|
|||||||
#include "x11/xprops.h"
|
#include "x11/xprops.h"
|
||||||
|
|
||||||
#ifdef HAVE_WAYLAND
|
#ifdef HAVE_WAYLAND
|
||||||
#include "wayland/window-wayland.h"
|
#include "wayland/meta-window-wayland.h"
|
||||||
#include "wayland/meta-wayland-private.h"
|
#include "wayland/meta-wayland-private.h"
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
@@ -66,6 +66,21 @@ int meta_screen_get_active_workspace_index (MetaScreen *screen);
|
|||||||
|
|
||||||
MetaWorkspace * meta_screen_get_active_workspace (MetaScreen *screen);
|
MetaWorkspace * meta_screen_get_active_workspace (MetaScreen *screen);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* MetaScreenDirection:
|
||||||
|
* @META_SCREEN_UP: up
|
||||||
|
* @META_SCREEN_DOWN: down
|
||||||
|
* @META_SCREEN_LEFT: left
|
||||||
|
* @META_SCREEN_RIGHT: right
|
||||||
|
*/
|
||||||
|
typedef enum
|
||||||
|
{
|
||||||
|
META_SCREEN_UP,
|
||||||
|
META_SCREEN_DOWN,
|
||||||
|
META_SCREEN_LEFT,
|
||||||
|
META_SCREEN_RIGHT
|
||||||
|
} MetaScreenDirection;
|
||||||
|
|
||||||
int meta_screen_get_n_monitors (MetaScreen *screen);
|
int meta_screen_get_n_monitors (MetaScreen *screen);
|
||||||
int meta_screen_get_primary_monitor (MetaScreen *screen);
|
int meta_screen_get_primary_monitor (MetaScreen *screen);
|
||||||
int meta_screen_get_current_monitor (MetaScreen *screen);
|
int meta_screen_get_current_monitor (MetaScreen *screen);
|
||||||
@@ -82,6 +97,10 @@ gboolean meta_screen_get_monitor_in_fullscreen (MetaScreen *screen,
|
|||||||
int meta_screen_get_monitor_index_for_rect (MetaScreen *screen,
|
int meta_screen_get_monitor_index_for_rect (MetaScreen *screen,
|
||||||
MetaRectangle *rect);
|
MetaRectangle *rect);
|
||||||
|
|
||||||
|
int meta_screen_get_monitor_neighbor_index (MetaScreen *screen,
|
||||||
|
int which_monitor,
|
||||||
|
MetaScreenDirection dir);
|
||||||
|
|
||||||
void meta_screen_focus_default_window (MetaScreen *screen,
|
void meta_screen_focus_default_window (MetaScreen *screen,
|
||||||
guint32 timestamp);
|
guint32 timestamp);
|
||||||
|
|
||||||
|
@@ -43,7 +43,7 @@ typedef struct
|
|||||||
typedef struct
|
typedef struct
|
||||||
{
|
{
|
||||||
int display_index;
|
int display_index;
|
||||||
char *lockfile;
|
char *lock_file;
|
||||||
int abstract_fd;
|
int abstract_fd;
|
||||||
int unix_fd;
|
int unix_fd;
|
||||||
pid_t pid;
|
pid_t pid;
|
||||||
|
@@ -46,7 +46,7 @@
|
|||||||
#include "meta-cursor-tracker-private.h"
|
#include "meta-cursor-tracker-private.h"
|
||||||
#include "display-private.h"
|
#include "display-private.h"
|
||||||
#include "window-private.h"
|
#include "window-private.h"
|
||||||
#include "window-wayland.h"
|
#include "meta-window-wayland.h"
|
||||||
|
|
||||||
#include "compositor/region-utils.h"
|
#include "compositor/region-utils.h"
|
||||||
|
|
||||||
@@ -215,19 +215,52 @@ calculate_surface_window_geometry (MetaWaylandSurface *surface,
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static void
|
||||||
|
destroy_window (MetaWaylandSurface *surface)
|
||||||
|
{
|
||||||
|
if (surface->window)
|
||||||
|
{
|
||||||
|
MetaDisplay *display = meta_get_display ();
|
||||||
|
guint32 timestamp = meta_display_get_current_time_roundtrip (display);
|
||||||
|
|
||||||
|
meta_window_unmanage (surface->window, timestamp);
|
||||||
|
}
|
||||||
|
|
||||||
|
g_assert (surface->window == NULL);
|
||||||
|
}
|
||||||
|
|
||||||
static void
|
static void
|
||||||
toplevel_surface_commit (MetaWaylandSurface *surface,
|
toplevel_surface_commit (MetaWaylandSurface *surface,
|
||||||
MetaWaylandPendingState *pending)
|
MetaWaylandPendingState *pending)
|
||||||
{
|
{
|
||||||
MetaWindow *window = surface->window;
|
MetaWindow *window = surface->window;
|
||||||
|
|
||||||
/* Sanity check. */
|
if (surface->role == META_WAYLAND_SURFACE_ROLE_WL_SHELL_SURFACE)
|
||||||
if (surface->buffer == NULL)
|
|
||||||
{
|
{
|
||||||
wl_resource_post_error (surface->resource,
|
/* For wl_shell, it's equivalent to an unmap. Semantics
|
||||||
WL_DISPLAY_ERROR_INVALID_OBJECT,
|
* are poorly defined, so we can choose some that are
|
||||||
"Cannot commit a NULL buffer to an xdg_surface");
|
* convenient for us. */
|
||||||
return;
|
if (surface->buffer && !window)
|
||||||
|
{
|
||||||
|
window = meta_window_wayland_new (meta_get_display (), surface);
|
||||||
|
meta_wayland_surface_set_window (surface, window);
|
||||||
|
}
|
||||||
|
else if (surface->buffer == NULL && window)
|
||||||
|
{
|
||||||
|
destroy_window (surface);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
if (surface->buffer == NULL)
|
||||||
|
{
|
||||||
|
/* XDG surfaces can't commit NULL buffers */
|
||||||
|
wl_resource_post_error (surface->resource,
|
||||||
|
WL_DISPLAY_ERROR_INVALID_OBJECT,
|
||||||
|
"Cannot commit a NULL buffer to an xdg_surface");
|
||||||
|
return;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/* We resize X based surfaces according to X events */
|
/* We resize X based surfaces according to X events */
|
||||||
@@ -723,20 +756,6 @@ meta_wayland_surface_set_window (MetaWaylandSurface *surface,
|
|||||||
sync_reactive (surface);
|
sync_reactive (surface);
|
||||||
}
|
}
|
||||||
|
|
||||||
static void
|
|
||||||
destroy_window (MetaWaylandSurface *surface)
|
|
||||||
{
|
|
||||||
if (surface->window)
|
|
||||||
{
|
|
||||||
MetaDisplay *display = meta_get_display ();
|
|
||||||
guint32 timestamp = meta_display_get_current_time_roundtrip (display);
|
|
||||||
|
|
||||||
meta_window_unmanage (surface->window, timestamp);
|
|
||||||
}
|
|
||||||
|
|
||||||
g_assert (surface->window == NULL);
|
|
||||||
}
|
|
||||||
|
|
||||||
static void
|
static void
|
||||||
wl_surface_destructor (struct wl_resource *resource)
|
wl_surface_destructor (struct wl_resource *resource)
|
||||||
{
|
{
|
||||||
@@ -1506,7 +1525,6 @@ wl_shell_get_shell_surface (struct wl_client *client,
|
|||||||
struct wl_resource *surface_resource)
|
struct wl_resource *surface_resource)
|
||||||
{
|
{
|
||||||
MetaWaylandSurface *surface = wl_resource_get_user_data (surface_resource);
|
MetaWaylandSurface *surface = wl_resource_get_user_data (surface_resource);
|
||||||
MetaWindow *window;
|
|
||||||
|
|
||||||
if (surface->wl_shell_surface != NULL)
|
if (surface->wl_shell_surface != NULL)
|
||||||
{
|
{
|
||||||
@@ -1524,9 +1542,6 @@ wl_shell_get_shell_surface (struct wl_client *client,
|
|||||||
|
|
||||||
surface->wl_shell_surface = wl_resource_create (client, &wl_shell_surface_interface, wl_resource_get_version (resource), id);
|
surface->wl_shell_surface = wl_resource_create (client, &wl_shell_surface_interface, wl_resource_get_version (resource), id);
|
||||||
wl_resource_set_implementation (surface->wl_shell_surface, &meta_wayland_wl_shell_surface_interface, surface, wl_shell_surface_destructor);
|
wl_resource_set_implementation (surface->wl_shell_surface, &meta_wayland_wl_shell_surface_interface, surface, wl_shell_surface_destructor);
|
||||||
|
|
||||||
window = meta_window_wayland_new (meta_get_display (), surface);
|
|
||||||
meta_wayland_surface_set_window (surface, window);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
static const struct wl_shell_interface meta_wayland_wl_shell_interface = {
|
static const struct wl_shell_interface meta_wayland_wl_shell_interface = {
|
||||||
@@ -1554,14 +1569,14 @@ gtk_surface_destructor (struct wl_resource *resource)
|
|||||||
}
|
}
|
||||||
|
|
||||||
static void
|
static void
|
||||||
set_dbus_properties (struct wl_client *client,
|
gtk_surface_set_dbus_properties (struct wl_client *client,
|
||||||
struct wl_resource *resource,
|
struct wl_resource *resource,
|
||||||
const char *application_id,
|
const char *application_id,
|
||||||
const char *app_menu_path,
|
const char *app_menu_path,
|
||||||
const char *menubar_path,
|
const char *menubar_path,
|
||||||
const char *window_object_path,
|
const char *window_object_path,
|
||||||
const char *application_object_path,
|
const char *application_object_path,
|
||||||
const char *unique_bus_name)
|
const char *unique_bus_name)
|
||||||
{
|
{
|
||||||
MetaWaylandSurface *surface = wl_resource_get_user_data (resource);
|
MetaWaylandSurface *surface = wl_resource_get_user_data (resource);
|
||||||
|
|
||||||
@@ -1581,8 +1596,36 @@ set_dbus_properties (struct wl_client *client,
|
|||||||
window_object_path);
|
window_object_path);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static void
|
||||||
|
gtk_surface_set_modal (struct wl_client *client,
|
||||||
|
struct wl_resource *resource)
|
||||||
|
{
|
||||||
|
MetaWaylandSurface *surface = wl_resource_get_user_data (resource);
|
||||||
|
|
||||||
|
if (surface->is_modal)
|
||||||
|
return;
|
||||||
|
|
||||||
|
surface->is_modal = TRUE;
|
||||||
|
meta_window_set_type (surface->window, META_WINDOW_MODAL_DIALOG);
|
||||||
|
}
|
||||||
|
|
||||||
|
static void
|
||||||
|
gtk_surface_unset_modal (struct wl_client *client,
|
||||||
|
struct wl_resource *resource)
|
||||||
|
{
|
||||||
|
MetaWaylandSurface *surface = wl_resource_get_user_data (resource);
|
||||||
|
|
||||||
|
if (!surface->is_modal)
|
||||||
|
return;
|
||||||
|
|
||||||
|
surface->is_modal = FALSE;
|
||||||
|
meta_window_set_type (surface->window, META_WINDOW_NORMAL);
|
||||||
|
}
|
||||||
|
|
||||||
static const struct gtk_surface_interface meta_wayland_gtk_surface_interface = {
|
static const struct gtk_surface_interface meta_wayland_gtk_surface_interface = {
|
||||||
set_dbus_properties
|
gtk_surface_set_dbus_properties,
|
||||||
|
gtk_surface_set_modal,
|
||||||
|
gtk_surface_unset_modal,
|
||||||
};
|
};
|
||||||
|
|
||||||
static void
|
static void
|
||||||
@@ -1619,6 +1662,17 @@ bind_gtk_shell (struct wl_client *client,
|
|||||||
uint32_t capabilities = 0;
|
uint32_t capabilities = 0;
|
||||||
|
|
||||||
resource = wl_resource_create (client, >k_shell_interface, version, id);
|
resource = wl_resource_create (client, >k_shell_interface, version, id);
|
||||||
|
|
||||||
|
if (version != META_GTK_SHELL_VERSION)
|
||||||
|
{
|
||||||
|
wl_resource_post_error (resource,
|
||||||
|
WL_DISPLAY_ERROR_INVALID_OBJECT,
|
||||||
|
"Incompatible gtk-shell version "
|
||||||
|
"(supported version: %d)",
|
||||||
|
META_GTK_SHELL_VERSION);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
wl_resource_set_implementation (resource, &meta_wayland_gtk_shell_interface, data, NULL);
|
wl_resource_set_implementation (resource, &meta_wayland_gtk_shell_interface, data, NULL);
|
||||||
|
|
||||||
if (!meta_prefs_get_show_fallback_app_menu ())
|
if (!meta_prefs_get_show_fallback_app_menu ())
|
||||||
|
@@ -101,6 +101,7 @@ struct _MetaWaylandSurface
|
|||||||
struct wl_resource *xdg_shell_resource;
|
struct wl_resource *xdg_shell_resource;
|
||||||
MetaWaylandSerial acked_configure_serial;
|
MetaWaylandSerial acked_configure_serial;
|
||||||
gboolean has_set_geometry;
|
gboolean has_set_geometry;
|
||||||
|
gboolean is_modal;
|
||||||
|
|
||||||
/* xdg_popup */
|
/* xdg_popup */
|
||||||
struct {
|
struct {
|
||||||
|
@@ -42,7 +42,7 @@
|
|||||||
#define META_WL_SEAT_VERSION 4
|
#define META_WL_SEAT_VERSION 4
|
||||||
#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 1
|
#define META_GTK_SHELL_VERSION 2
|
||||||
#define META_WL_SUBCOMPOSITOR_VERSION 1
|
#define META_WL_SUBCOMPOSITOR_VERSION 1
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
@@ -24,7 +24,7 @@
|
|||||||
|
|
||||||
#include "config.h"
|
#include "config.h"
|
||||||
|
|
||||||
#include "window-wayland.h"
|
#include "meta-window-wayland.h"
|
||||||
|
|
||||||
#include <meta/errors.h>
|
#include <meta/errors.h>
|
||||||
#include "window-private.h"
|
#include "window-private.h"
|
@@ -182,7 +182,7 @@ try_display (int display,
|
|||||||
|
|
||||||
if (kill (other, 0) < 0 && errno == ESRCH)
|
if (kill (other, 0) < 0 && errno == ESRCH)
|
||||||
{
|
{
|
||||||
/* Process is dead. Try unlinking the lockfile and trying again. */
|
/* Process is dead. Try unlinking the lock file and trying again. */
|
||||||
if (unlink (filename) < 0)
|
if (unlink (filename) < 0)
|
||||||
{
|
{
|
||||||
g_warning ("failed to unlink stale lock file %s: %m", filename);
|
g_warning ("failed to unlink stale lock file %s: %m", filename);
|
||||||
@@ -221,7 +221,7 @@ try_display (int display,
|
|||||||
}
|
}
|
||||||
|
|
||||||
static char *
|
static char *
|
||||||
create_lockfile (int display, int *display_out)
|
create_lock_file (int display, int *display_out)
|
||||||
{
|
{
|
||||||
char *filename;
|
char *filename;
|
||||||
int fd;
|
int fd;
|
||||||
@@ -354,7 +354,7 @@ static gboolean
|
|||||||
choose_xdisplay (MetaXWaylandManager *manager)
|
choose_xdisplay (MetaXWaylandManager *manager)
|
||||||
{
|
{
|
||||||
int display = 0;
|
int display = 0;
|
||||||
char *lockfile = NULL;
|
char *lock_file = NULL;
|
||||||
|
|
||||||
/* Hack to keep the unused Xwayland instance on
|
/* Hack to keep the unused Xwayland instance on
|
||||||
* the login screen from taking the prime :0 display
|
* the login screen from taking the prime :0 display
|
||||||
@@ -365,8 +365,8 @@ choose_xdisplay (MetaXWaylandManager *manager)
|
|||||||
|
|
||||||
do
|
do
|
||||||
{
|
{
|
||||||
lockfile = create_lockfile (display, &display);
|
lock_file = create_lock_file (display, &display);
|
||||||
if (!lockfile)
|
if (!lock_file)
|
||||||
{
|
{
|
||||||
g_warning ("Failed to create an X lock file");
|
g_warning ("Failed to create an X lock file");
|
||||||
return FALSE;
|
return FALSE;
|
||||||
@@ -375,7 +375,7 @@ choose_xdisplay (MetaXWaylandManager *manager)
|
|||||||
manager->abstract_fd = bind_to_abstract_socket (display);
|
manager->abstract_fd = bind_to_abstract_socket (display);
|
||||||
if (manager->abstract_fd < 0)
|
if (manager->abstract_fd < 0)
|
||||||
{
|
{
|
||||||
unlink (lockfile);
|
unlink (lock_file);
|
||||||
|
|
||||||
if (errno == EADDRINUSE)
|
if (errno == EADDRINUSE)
|
||||||
{
|
{
|
||||||
@@ -389,7 +389,7 @@ choose_xdisplay (MetaXWaylandManager *manager)
|
|||||||
manager->unix_fd = bind_to_unix_socket (display);
|
manager->unix_fd = bind_to_unix_socket (display);
|
||||||
if (manager->abstract_fd < 0)
|
if (manager->abstract_fd < 0)
|
||||||
{
|
{
|
||||||
unlink (lockfile);
|
unlink (lock_file);
|
||||||
close (manager->abstract_fd);
|
close (manager->abstract_fd);
|
||||||
return FALSE;
|
return FALSE;
|
||||||
}
|
}
|
||||||
@@ -400,7 +400,7 @@ choose_xdisplay (MetaXWaylandManager *manager)
|
|||||||
|
|
||||||
manager->display_index = display;
|
manager->display_index = display;
|
||||||
manager->display_name = g_strdup_printf (":%d", manager->display_index);
|
manager->display_name = g_strdup_printf (":%d", manager->display_index);
|
||||||
manager->lockfile = lockfile;
|
manager->lock_file = lock_file;
|
||||||
|
|
||||||
return TRUE;
|
return TRUE;
|
||||||
}
|
}
|
||||||
@@ -438,28 +438,27 @@ meta_xwayland_start (MetaXWaylandManager *manager,
|
|||||||
{
|
{
|
||||||
int xwayland_client_fd[2];
|
int xwayland_client_fd[2];
|
||||||
int displayfd[2];
|
int displayfd[2];
|
||||||
|
gboolean started = FALSE;
|
||||||
g_autoptr(GSubprocessLauncher) launcher = NULL;
|
g_autoptr(GSubprocessLauncher) launcher = NULL;
|
||||||
GSubprocessFlags flags;
|
GSubprocessFlags flags;
|
||||||
GSubprocess *proc;
|
GSubprocess *proc;
|
||||||
GError *error = NULL;
|
GError *error = NULL;
|
||||||
|
|
||||||
if (!choose_xdisplay (manager))
|
if (!choose_xdisplay (manager))
|
||||||
return FALSE;
|
goto out;
|
||||||
|
|
||||||
/* We want xwayland to be a wayland client so we make a socketpair to setup a
|
/* We want xwayland to be a wayland client so we make a socketpair to setup a
|
||||||
* wayland protocol connection. */
|
* wayland protocol connection. */
|
||||||
if (socketpair (AF_UNIX, SOCK_STREAM | SOCK_CLOEXEC, 0, xwayland_client_fd) < 0)
|
if (socketpair (AF_UNIX, SOCK_STREAM | SOCK_CLOEXEC, 0, xwayland_client_fd) < 0)
|
||||||
{
|
{
|
||||||
g_warning ("xwayland_client_fd socketpair failed\n");
|
g_warning ("xwayland_client_fd socketpair failed\n");
|
||||||
unlink (manager->lockfile);
|
goto out;
|
||||||
return FALSE;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
if (socketpair (AF_UNIX, SOCK_STREAM | SOCK_CLOEXEC, 0, displayfd) < 0)
|
if (socketpair (AF_UNIX, SOCK_STREAM | SOCK_CLOEXEC, 0, displayfd) < 0)
|
||||||
{
|
{
|
||||||
g_warning ("displayfd socketpair failed\n");
|
g_warning ("displayfd socketpair failed\n");
|
||||||
unlink (manager->lockfile);
|
goto out;
|
||||||
return FALSE;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/* xwayland, please. */
|
/* xwayland, please. */
|
||||||
@@ -489,7 +488,7 @@ meta_xwayland_start (MetaXWaylandManager *manager,
|
|||||||
if (!proc)
|
if (!proc)
|
||||||
{
|
{
|
||||||
g_error ("Failed to spawn Xwayland: %s", error->message);
|
g_error ("Failed to spawn Xwayland: %s", error->message);
|
||||||
return FALSE;
|
goto out;
|
||||||
}
|
}
|
||||||
|
|
||||||
g_subprocess_wait_async (proc, NULL, xserver_died, NULL);
|
g_subprocess_wait_async (proc, NULL, xserver_died, NULL);
|
||||||
@@ -502,7 +501,15 @@ meta_xwayland_start (MetaXWaylandManager *manager,
|
|||||||
manager->init_loop = g_main_loop_new (NULL, FALSE);
|
manager->init_loop = g_main_loop_new (NULL, FALSE);
|
||||||
g_main_loop_run (manager->init_loop);
|
g_main_loop_run (manager->init_loop);
|
||||||
|
|
||||||
return TRUE;
|
started = TRUE;
|
||||||
|
|
||||||
|
out:
|
||||||
|
if (!started)
|
||||||
|
{
|
||||||
|
unlink (manager->lock_file);
|
||||||
|
g_clear_pointer (&manager->lock_file, g_free);
|
||||||
|
}
|
||||||
|
return started;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* To be called right after connecting */
|
/* To be called right after connecting */
|
||||||
@@ -522,10 +529,13 @@ meta_xwayland_stop (MetaXWaylandManager *manager)
|
|||||||
{
|
{
|
||||||
char path[256];
|
char path[256];
|
||||||
|
|
||||||
snprintf (path, sizeof path, "/tmp/.X%d-lock", manager->display_index);
|
|
||||||
unlink (path);
|
|
||||||
snprintf (path, sizeof path, "/tmp/.X11-unix/X%d", manager->display_index);
|
snprintf (path, sizeof path, "/tmp/.X11-unix/X%d", manager->display_index);
|
||||||
unlink (path);
|
unlink (path);
|
||||||
|
|
||||||
unlink (manager->lockfile);
|
g_clear_pointer (&manager->display_name, g_free);
|
||||||
|
if (manager->lock_file)
|
||||||
|
{
|
||||||
|
unlink (manager->lock_file);
|
||||||
|
g_clear_pointer (&manager->lock_file, g_free);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
@@ -1,9 +1,18 @@
|
|||||||
<protocol name="gtk">
|
<protocol name="gtk">
|
||||||
|
|
||||||
<interface name="gtk_shell" version="1">
|
<interface name="gtk_shell" version="2">
|
||||||
|
<description summary="gtk specific extensions">
|
||||||
|
gtk_shell is a protocol extension providing additional features for
|
||||||
|
clients implementing it. It is not backward compatible, and a client must
|
||||||
|
always only bind to the specific version it implements. If a client binds
|
||||||
|
to a version different from the version the server provides, an error will
|
||||||
|
be raised.
|
||||||
|
</description>
|
||||||
|
|
||||||
<enum name="capability">
|
<enum name="capability">
|
||||||
<entry name="global_app_menu" value="1"/>
|
<entry name="global_app_menu" value="1"/>
|
||||||
<entry name="global_menu_bar" value="2"/>
|
<entry name="global_menu_bar" value="2"/>
|
||||||
|
<entry name="desktop_icons" value="3"/>
|
||||||
</enum>
|
</enum>
|
||||||
|
|
||||||
<event name="capabilities">
|
<event name="capabilities">
|
||||||
@@ -16,7 +25,7 @@
|
|||||||
</request>
|
</request>
|
||||||
</interface>
|
</interface>
|
||||||
|
|
||||||
<interface name="gtk_surface" version="1">
|
<interface name="gtk_surface" version="2">
|
||||||
<request name="set_dbus_properties">
|
<request name="set_dbus_properties">
|
||||||
<arg name="application_id" type="string" allow-null="true"/>
|
<arg name="application_id" type="string" allow-null="true"/>
|
||||||
<arg name="app_menu_path" type="string" allow-null="true"/>
|
<arg name="app_menu_path" type="string" allow-null="true"/>
|
||||||
@@ -25,6 +34,9 @@
|
|||||||
<arg name="application_object_path" type="string" allow-null="true"/>
|
<arg name="application_object_path" type="string" allow-null="true"/>
|
||||||
<arg name="unique_bus_name" type="string" allow-null="true"/>
|
<arg name="unique_bus_name" type="string" allow-null="true"/>
|
||||||
</request>
|
</request>
|
||||||
|
|
||||||
|
<request name="set_modal"/>
|
||||||
|
<request name="unset_modal"/>
|
||||||
</interface>
|
</interface>
|
||||||
|
|
||||||
</protocol>
|
</protocol>
|
||||||
|
Reference in New Issue
Block a user