Compare commits
40 Commits
wip/fmuell
...
wip/nielsd
Author | SHA1 | Date | |
---|---|---|---|
![]() |
83fd21f759 | ||
![]() |
46453c7a7d | ||
![]() |
b2d0184c6e | ||
![]() |
808a75b231 | ||
![]() |
88e4ff7409 | ||
![]() |
3cc3b7526c | ||
![]() |
53b59d8bff | ||
![]() |
40e7e5d356 | ||
![]() |
4cae9b5b11 | ||
![]() |
72aeeb8c37 | ||
![]() |
7b3dee2d97 | ||
![]() |
5199c7834d | ||
![]() |
afe8610b4a | ||
![]() |
9d49e8abd0 | ||
![]() |
4043d0b455 | ||
![]() |
34ee46022e | ||
![]() |
ee507d9ab2 | ||
![]() |
28e0a7bfb5 | ||
![]() |
58f7059ea4 | ||
![]() |
d15e11bfe7 | ||
![]() |
1eabaf12da | ||
![]() |
fe86694ddd | ||
![]() |
a1969c98cd | ||
![]() |
47663c7e0f | ||
![]() |
9843e21fff | ||
![]() |
5c27bf6a2b | ||
![]() |
f0b9654deb | ||
![]() |
a1e325f749 | ||
![]() |
00b4556051 | ||
![]() |
86b5247770 | ||
![]() |
23f31e518e | ||
![]() |
f580b28a27 | ||
![]() |
b4f1569640 | ||
![]() |
f2d7165a52 | ||
![]() |
1bd3c13fe1 | ||
![]() |
5d1eccfb6f | ||
![]() |
c96cf0608d | ||
![]() |
056c45fe0c | ||
![]() |
2ac7f7f1e5 | ||
![]() |
318164779c |
@@ -23,9 +23,35 @@ function commit_message_has_url() {
|
||||
return $?
|
||||
}
|
||||
|
||||
function commit_message_subject_is_compliant() {
|
||||
commit=$1
|
||||
commit_message_subject=$(git show -s --format='format:%s' $commit)
|
||||
|
||||
if echo "$commit_message_subject" | grep -qe "\(^meta-\|^Meta\)"; then
|
||||
echo " - message subject should not be prefixed with 'meta-' or 'Meta'"
|
||||
return 1
|
||||
fi
|
||||
|
||||
if echo "$commit_message_subject" | grep -qe "\.[ch]:"; then
|
||||
echo " - message subject prefix should not include .c, .h, etc."
|
||||
return 1
|
||||
fi
|
||||
|
||||
return 0
|
||||
}
|
||||
|
||||
for commit in $commits; do
|
||||
commit_short=$(echo $commit | cut -c -8)
|
||||
|
||||
if ! commit_message_has_url $commit; then
|
||||
echo "Missing merge request or issue URL on commit $(echo $commit | cut -c -8)"
|
||||
echo "Missing merge request or issue URL on commit $commit_short"
|
||||
exit 1
|
||||
fi
|
||||
|
||||
errors=$(commit_message_subject_is_compliant $commit)
|
||||
if [ $? != 0 ]; then
|
||||
echo "Commit message for $commit_short is not compliant:"
|
||||
echo "$errors"
|
||||
exit 1
|
||||
fi
|
||||
done
|
||||
|
@@ -4007,12 +4007,12 @@ clutter_actor_paint (ClutterActor *self)
|
||||
pick_mode == CLUTTER_PICK_NONE))
|
||||
_clutter_actor_draw_paint_volume (self);
|
||||
|
||||
done:
|
||||
/* If we make it here then the actor has run through a complete
|
||||
paint run including all the effects so it's no longer dirty */
|
||||
if (pick_mode == CLUTTER_PICK_NONE)
|
||||
priv->is_dirty = FALSE;
|
||||
|
||||
done:
|
||||
if (clip_set)
|
||||
{
|
||||
CoglFramebuffer *fb = _clutter_stage_get_active_framebuffer (stage);
|
||||
|
@@ -167,10 +167,6 @@ struct _ClutterInputDeviceClass
|
||||
gboolean (* is_grouped) (ClutterInputDevice *device,
|
||||
ClutterInputDevice *other_device);
|
||||
|
||||
gboolean (* get_physical_size) (ClutterInputDevice *device,
|
||||
gdouble *width,
|
||||
gdouble *height);
|
||||
|
||||
/* Keyboard accessbility */
|
||||
void (* process_kbd_a11y_event) (ClutterEvent *event,
|
||||
ClutterInputDevice *device,
|
||||
|
@@ -2284,15 +2284,3 @@ clutter_input_device_is_grouped (ClutterInputDevice *device,
|
||||
|
||||
return CLUTTER_INPUT_DEVICE_GET_CLASS (device)->is_grouped (device, other_device);
|
||||
}
|
||||
|
||||
gboolean
|
||||
clutter_input_device_get_physical_size (ClutterInputDevice *device,
|
||||
gdouble *width,
|
||||
gdouble *height)
|
||||
{
|
||||
g_return_val_if_fail (CLUTTER_IS_INPUT_DEVICE (device), FALSE);
|
||||
|
||||
return CLUTTER_INPUT_DEVICE_GET_CLASS (device)->get_physical_size (device,
|
||||
width,
|
||||
height);
|
||||
}
|
||||
|
@@ -171,10 +171,6 @@ void clutter_input_device_set_mapping_mode (ClutterInputDev
|
||||
CLUTTER_EXPORT
|
||||
gboolean clutter_input_device_is_grouped (ClutterInputDevice *device,
|
||||
ClutterInputDevice *other_device);
|
||||
CLUTTER_EXPORT
|
||||
gboolean clutter_input_device_get_physical_size (ClutterInputDevice *device,
|
||||
gdouble *width,
|
||||
gdouble *height);
|
||||
|
||||
G_END_DECLS
|
||||
|
||||
|
@@ -676,7 +676,7 @@ stop_toggle_slowkeys (ClutterInputDeviceEvdev *device)
|
||||
}
|
||||
|
||||
static void
|
||||
handle_togglekeys_press (ClutterEvent *event,
|
||||
handle_enablekeys_press (ClutterEvent *event,
|
||||
ClutterInputDeviceEvdev *device)
|
||||
{
|
||||
if (event->key.keyval == XKB_KEY_Shift_L || event->key.keyval == XKB_KEY_Shift_R)
|
||||
@@ -698,7 +698,7 @@ handle_togglekeys_press (ClutterEvent *event,
|
||||
}
|
||||
|
||||
static void
|
||||
handle_togglekeys_release (ClutterEvent *event,
|
||||
handle_enablekeys_release (ClutterEvent *event,
|
||||
ClutterInputDeviceEvdev *device)
|
||||
{
|
||||
if (event->key.keyval == XKB_KEY_Shift_L || event->key.keyval == XKB_KEY_Shift_R)
|
||||
@@ -1132,9 +1132,14 @@ clutter_input_device_evdev_process_kbd_a11y_event (ClutterEvent *e
|
||||
if (event->key.flags & CLUTTER_EVENT_FLAG_INPUT_METHOD)
|
||||
goto emit_event;
|
||||
|
||||
if (!device_evdev->a11y_flags & CLUTTER_A11Y_KEYBOARD_ENABLED)
|
||||
if (!(device_evdev->a11y_flags & CLUTTER_A11Y_KEYBOARD_ENABLED))
|
||||
goto emit_event;
|
||||
|
||||
if (event->type == CLUTTER_KEY_PRESS)
|
||||
handle_enablekeys_press (event, device_evdev);
|
||||
else
|
||||
handle_enablekeys_release (event, device_evdev);
|
||||
|
||||
if (device_evdev->a11y_flags & CLUTTER_A11Y_MOUSE_KEYS_ENABLED)
|
||||
{
|
||||
if (event->type == CLUTTER_KEY_PRESS &&
|
||||
@@ -1145,14 +1150,6 @@ clutter_input_device_evdev_process_kbd_a11y_event (ClutterEvent *e
|
||||
return; /* swallow event */
|
||||
}
|
||||
|
||||
if (device_evdev->a11y_flags & CLUTTER_A11Y_TOGGLE_KEYS_ENABLED)
|
||||
{
|
||||
if (event->type == CLUTTER_KEY_PRESS)
|
||||
handle_togglekeys_press (event, device_evdev);
|
||||
else
|
||||
handle_togglekeys_release (event, device_evdev);
|
||||
}
|
||||
|
||||
if ((device_evdev->a11y_flags & CLUTTER_A11Y_BOUNCE_KEYS_ENABLED) &&
|
||||
(get_debounce_delay (device) != 0))
|
||||
{
|
||||
@@ -1266,18 +1263,6 @@ clutter_input_device_evdev_release_touch_state (ClutterInputDeviceEvdev *device,
|
||||
GINT_TO_POINTER (touch_state->device_slot));
|
||||
}
|
||||
|
||||
static gboolean
|
||||
clutter_input_device_evdev_get_physical_size (ClutterInputDevice *device,
|
||||
gdouble *width,
|
||||
gdouble *height)
|
||||
{
|
||||
struct libinput_device *libinput_device;
|
||||
|
||||
libinput_device = clutter_evdev_input_device_get_libinput_device (device);
|
||||
|
||||
return libinput_device_get_size (libinput_device, width, height) == 0;
|
||||
}
|
||||
|
||||
static void
|
||||
clutter_input_device_evdev_class_init (ClutterInputDeviceEvdevClass *klass)
|
||||
{
|
||||
@@ -1293,7 +1278,6 @@ clutter_input_device_evdev_class_init (ClutterInputDeviceEvdevClass *klass)
|
||||
klass->get_group_n_modes = clutter_input_device_evdev_get_group_n_modes;
|
||||
klass->is_grouped = clutter_input_device_evdev_is_grouped;
|
||||
klass->process_kbd_a11y_event = clutter_input_device_evdev_process_kbd_a11y_event;
|
||||
klass->get_physical_size = clutter_input_device_evdev_get_physical_size;
|
||||
|
||||
obj_props[PROP_DEVICE_MATRIX] =
|
||||
g_param_spec_boxed ("device-matrix",
|
||||
|
@@ -1,3 +1,4 @@
|
||||
clutter_clutter_includesubdir = join_paths(clutter_includesubdir, 'clutter')
|
||||
clutter_clutter_includedir = join_paths(clutter_includedir, 'clutter')
|
||||
|
||||
clutter_headers = [
|
||||
@@ -577,16 +578,16 @@ if have_introspection
|
||||
endif
|
||||
|
||||
install_headers(clutter_headers,
|
||||
subdir: clutter_clutter_includedir)
|
||||
subdir: clutter_clutter_includesubdir)
|
||||
|
||||
install_headers(cally_headers,
|
||||
subdir: join_paths(clutter_includedir, 'cally'))
|
||||
subdir: join_paths(clutter_includesubdir, 'cally'))
|
||||
|
||||
install_headers(clutter_deprecated_headers,
|
||||
subdir: join_paths(clutter_clutter_includedir, 'deprecated'))
|
||||
subdir: join_paths(clutter_clutter_includesubdir, 'deprecated'))
|
||||
|
||||
install_headers(clutter_x11_headers,
|
||||
subdir: join_paths(clutter_clutter_includedir, 'x11'))
|
||||
subdir: join_paths(clutter_clutter_includesubdir, 'x11'))
|
||||
|
||||
pkg.generate(libmutter_clutter,
|
||||
name: 'Mutters Clutter',
|
||||
|
@@ -180,56 +180,6 @@ clutter_input_device_xi2_is_mode_switch_button (ClutterInputDevice *device,
|
||||
return button_group == (int) group;
|
||||
}
|
||||
|
||||
static gboolean
|
||||
clutter_input_device_xi2_get_physical_size (ClutterInputDevice *device,
|
||||
gdouble *width,
|
||||
gdouble *height)
|
||||
{
|
||||
Display *xdisplay;
|
||||
XIDeviceInfo *dev_info;
|
||||
gdouble w = 0, h = 0;
|
||||
int i, n_info, device_id;
|
||||
|
||||
xdisplay = clutter_x11_get_default_display ();
|
||||
device_id = clutter_input_device_get_device_id (device);
|
||||
|
||||
clutter_x11_trap_x_errors ();
|
||||
dev_info = XIQueryDevice (xdisplay, device_id, &n_info);
|
||||
if (clutter_x11_untrap_x_errors ())
|
||||
return FALSE;
|
||||
|
||||
if (!dev_info)
|
||||
return FALSE;
|
||||
|
||||
for (i = 0; i < dev_info->num_classes; i++)
|
||||
{
|
||||
XIValuatorClassInfo *valuator;
|
||||
gdouble *value;
|
||||
|
||||
if (dev_info->classes[i]->type != XIValuatorClass)
|
||||
continue;
|
||||
|
||||
valuator = (XIValuatorClassInfo *) dev_info->classes[i];
|
||||
|
||||
if (valuator->label == XInternAtom (xdisplay, "Abs X", True) ||
|
||||
valuator->label == XInternAtom (xdisplay, "Abs MT Position X", True))
|
||||
value = &w;
|
||||
else if (valuator->label == XInternAtom (xdisplay, "Abs Y", True) ||
|
||||
valuator->label == XInternAtom (xdisplay, "Abs MT Position Y", True))
|
||||
value = &h;
|
||||
else
|
||||
continue;
|
||||
|
||||
*value = (valuator->max - valuator->min) * 1000 / valuator->resolution;
|
||||
}
|
||||
|
||||
XIFreeDeviceInfo (dev_info);
|
||||
*width = w;
|
||||
*height = h;
|
||||
|
||||
return (w > 0 && h > 0);
|
||||
}
|
||||
|
||||
static void
|
||||
clutter_input_device_xi2_class_init (ClutterInputDeviceXI2Class *klass)
|
||||
{
|
||||
@@ -243,7 +193,6 @@ clutter_input_device_xi2_class_init (ClutterInputDeviceXI2Class *klass)
|
||||
device_class->is_grouped = clutter_input_device_xi2_is_grouped;
|
||||
device_class->get_group_n_modes = clutter_input_device_xi2_get_group_n_modes;
|
||||
device_class->is_mode_switch_button = clutter_input_device_xi2_is_mode_switch_button;
|
||||
device_class->get_physical_size = clutter_input_device_xi2_get_physical_size;
|
||||
}
|
||||
|
||||
static void
|
||||
|
@@ -1,4 +1,5 @@
|
||||
clutter_includedir = join_paths(pkgincludedir, 'clutter')
|
||||
clutter_includesubdir = join_paths(pkgname, 'clutter')
|
||||
clutter_includedir = join_paths(includedir, clutter_includesubdir)
|
||||
clutter_srcdir = join_paths(top_srcdir, 'clutter')
|
||||
clutter_builddir = join_paths(builddir, 'clutter')
|
||||
|
||||
|
@@ -27,9 +27,9 @@ libmutter_cogl_gles2 = shared_library('mutter-cogl-gles2-' + libmutter_api_versi
|
||||
install: true,
|
||||
)
|
||||
|
||||
cogl_gles2_includedir = join_paths(cogl_includedir, 'cogl-gles2/GLES2')
|
||||
cogl_gles2_includesubdir = join_paths(cogl_includesubdir, 'cogl-gles2/GLES2')
|
||||
install_headers(cogl_gles2_public_headers,
|
||||
subdir: cogl_gles2_includedir)
|
||||
subdir: cogl_gles2_includesubdir)
|
||||
|
||||
pkg.generate(libmutter_cogl_gles2,
|
||||
name: 'CoglGles2',
|
||||
|
@@ -70,8 +70,8 @@ if have_introspection
|
||||
)
|
||||
endif
|
||||
|
||||
cogl_pango_includedir = join_paths(cogl_includedir, 'cogl-pango')
|
||||
install_headers(cogl_pango_public_headers, subdir: cogl_pango_includedir)
|
||||
cogl_pango_includesubdir = join_paths(cogl_includesubdir, 'cogl-pango')
|
||||
install_headers(cogl_pango_public_headers, subdir: cogl_pango_includesubdir)
|
||||
|
||||
pkg.generate(libmutter_cogl_pango,
|
||||
name: 'CoglPango',
|
||||
|
@@ -1,3 +1,4 @@
|
||||
cogl_path_includesubdir = join_paths(cogl_includesubdir, 'cogl-path')
|
||||
cogl_path_includedir = join_paths(cogl_includedir, 'cogl-path')
|
||||
|
||||
cogl_path_public_headers = [
|
||||
@@ -76,7 +77,7 @@ libmutter_cogl_path_dep = declare_dependency(
|
||||
)
|
||||
|
||||
install_headers(cogl_path_public_headers,
|
||||
subdir: cogl_path_includedir)
|
||||
subdir: cogl_path_includesubdir)
|
||||
|
||||
pkg.generate(libmutter_cogl_path,
|
||||
name: 'CoglPath',
|
||||
|
@@ -429,6 +429,12 @@ _cogl_driver_update_features (CoglContext *context,
|
||||
return TRUE;
|
||||
}
|
||||
|
||||
static gboolean
|
||||
_cogl_driver_texture_2d_is_get_data_supported (CoglTexture2D *tex_2d)
|
||||
{
|
||||
return FALSE;
|
||||
}
|
||||
|
||||
const CoglDriverVtable
|
||||
_cogl_driver_gles =
|
||||
{
|
||||
@@ -453,7 +459,7 @@ _cogl_driver_gles =
|
||||
_cogl_texture_2d_gl_get_gl_handle,
|
||||
_cogl_texture_2d_gl_generate_mipmap,
|
||||
_cogl_texture_2d_gl_copy_from_bitmap,
|
||||
NULL, /* texture_2d_is_get_data_supported */
|
||||
_cogl_driver_texture_2d_is_get_data_supported,
|
||||
NULL, /* texture_2d_get_data */
|
||||
_cogl_gl_flush_attributes_state,
|
||||
_cogl_clip_stack_gl_flush,
|
||||
|
@@ -1,3 +1,4 @@
|
||||
cogl_cogl_includesubdir = join_paths(cogl_includesubdir, 'cogl')
|
||||
cogl_cogl_includedir = join_paths(cogl_includedir, 'cogl')
|
||||
|
||||
cdata = configuration_data()
|
||||
@@ -514,16 +515,16 @@ install_headers([
|
||||
cogl_headers,
|
||||
cogl_nonintrospected_headers,
|
||||
],
|
||||
subdir: cogl_cogl_includedir)
|
||||
subdir: cogl_cogl_includesubdir)
|
||||
|
||||
install_headers([
|
||||
cogl_deprecated_headers,
|
||||
cogl_deprecated_nonintrospected_headers,
|
||||
],
|
||||
subdir: join_paths(cogl_cogl_includedir, 'deprecated'))
|
||||
subdir: join_paths(cogl_cogl_includesubdir, 'deprecated'))
|
||||
|
||||
install_headers(cogl_gl_prototype_headers,
|
||||
subdir: join_paths(cogl_cogl_includedir, 'gl-prototypes'))
|
||||
subdir: join_paths(cogl_cogl_includesubdir, 'gl-prototypes'))
|
||||
|
||||
pkg.generate(libmutter_cogl,
|
||||
name: 'Cogl',
|
||||
|
@@ -1,4 +1,5 @@
|
||||
cogl_includedir = join_paths(pkgincludedir, 'cogl')
|
||||
cogl_includesubdir = join_paths(pkgname, 'cogl')
|
||||
cogl_includedir = join_paths(includedir, cogl_includesubdir)
|
||||
cogl_srcdir = join_paths(top_srcdir, 'cogl')
|
||||
cogl_builddir = join_paths(builddir, 'cogl')
|
||||
|
||||
|
100
doc/meson.build
Normal file
100
doc/meson.build
Normal file
@@ -0,0 +1,100 @@
|
||||
# manpage
|
||||
subdir('man')
|
||||
|
||||
# Reference manual
|
||||
subdir('xml')
|
||||
|
||||
version_conf = configuration_data()
|
||||
version_conf.set('VERSION', meson.project_version())
|
||||
version_xml = configure_file(
|
||||
input: 'version.xml.in',
|
||||
output: 'version.xml',
|
||||
configuration: version_conf
|
||||
)
|
||||
|
||||
reference_ignored_headers = [
|
||||
'config.h',
|
||||
|
||||
'bell.h',
|
||||
'boxes-private.h',
|
||||
'compositor-private.h',
|
||||
'core.h',
|
||||
'constraints.h',
|
||||
'display-private.h',
|
||||
'frame.h',
|
||||
'frames.h',
|
||||
'group-private.h',
|
||||
'keybindings-private.h',
|
||||
'main.h',
|
||||
'meta-backend-private.h',
|
||||
'meta-background-private.h',
|
||||
'meta-barrier-private.h',
|
||||
'meta-dnd-actor-private.h',
|
||||
'meta-dnd-private.h',
|
||||
'meta-feedback-actor-private.h',
|
||||
'meta-gesture-tracker-private.h',
|
||||
'meta-idle-monitor-private.h',
|
||||
'meta-input-mapper-private.h',
|
||||
'meta-input-settings-private.h',
|
||||
'meta-monitor-manager-private.h',
|
||||
'meta-remote-access-controller-private.h',
|
||||
'meta-settings-private.h',
|
||||
'meta-shaped-texture-private.h',
|
||||
'meta-stage-private.h',
|
||||
'meta-wayland-private.h',
|
||||
'meta-window-actor-private.h',
|
||||
'meta-window-group-private.h',
|
||||
'meta-xwayland-private.h',
|
||||
'meta-xwayland-selection-private.h',
|
||||
'theme-private.h',
|
||||
'util-private.h',
|
||||
'window-private.h',
|
||||
'window-x11-private.h',
|
||||
'workspace-private.h',
|
||||
# Test headers
|
||||
'meta-backend-test.h',
|
||||
'meta-monitor-manager-test.h',
|
||||
'meta-wayland-egl-stream.h',
|
||||
'meta-wayland-inhibit-shortcuts.h',
|
||||
'meta-wayland-text-input.h',
|
||||
'meta-xwayland-grab-keyboard.h',
|
||||
]
|
||||
|
||||
# Make sure we ignore the wayland headers
|
||||
if have_wayland
|
||||
foreach proto : wayland_protocols
|
||||
protocol_name = proto[0]
|
||||
protocol_type = proto[1]
|
||||
if protocol_type == 'stable'
|
||||
output_base = protocol_name
|
||||
elif protocol_type == 'private'
|
||||
output_base = protocol_name
|
||||
elif protocol_type == 'third-party'
|
||||
output_base = protocol_name
|
||||
else
|
||||
protocol_version = proto[2]
|
||||
output_base = '@0@-@1@-@2@'.format(protocol_name,
|
||||
protocol_type,
|
||||
protocol_version)
|
||||
endif
|
||||
|
||||
proto_header = '@0@-server-protocol.h'.format(output_base)
|
||||
reference_ignored_headers += proto_header
|
||||
endforeach
|
||||
endif
|
||||
|
||||
|
||||
gnome.gtkdoc(meson.project_name(),
|
||||
main_sgml: 'mutter-docs.sgml',
|
||||
src_dir: [
|
||||
include_directories('../src'),
|
||||
],
|
||||
dependencies: _libmutter_public_symbols_dep,
|
||||
gobject_typesfile: 'mutter.types',
|
||||
scan_args: [
|
||||
'--rebuild-types',
|
||||
'--ignore-headers=' + ' '.join(reference_ignored_headers),
|
||||
'--ignore-decorators=META_EXPORT|META_EXPORT_TEST',
|
||||
],
|
||||
install: true,
|
||||
)
|
110
doc/mutter-docs.sgml
Normal file
110
doc/mutter-docs.sgml
Normal file
@@ -0,0 +1,110 @@
|
||||
<?xml version="1.0"?>
|
||||
<!DOCTYPE book PUBLIC "-//OASIS//DTD DocBook XML V4.3//EN"
|
||||
"http://www.oasis-open.org/docbook/xml/4.3/docbookx.dtd"
|
||||
[
|
||||
<!ENTITY % local.common.attrib "xmlns:xi CDATA #FIXED 'http://www.w3.org/2003/XInclude'">
|
||||
<!ENTITY % gtkdocentities SYSTEM "xml/gtkdocentities.ent">
|
||||
%gtkdocentities;
|
||||
]>
|
||||
<book id="index">
|
||||
<bookinfo>
|
||||
<title>Mutter Reference Manual</title>
|
||||
<releaseinfo>
|
||||
For &package_string;.
|
||||
The latest version of this documentation can be found on-line at
|
||||
<ulink role="online-location" url="http://[SERVER]/&package_name;/index.html">http://[SERVER]/&package_name;/</ulink>.
|
||||
</releaseinfo>
|
||||
</bookinfo>
|
||||
|
||||
<chapter>
|
||||
<title>General</title>
|
||||
<xi:include href="xml/meta-backend.xml"/>
|
||||
<xi:include href="xml/meta-clutter-backend-native.xml"/>
|
||||
<xi:include href="xml/meta-renderer.xml"/>
|
||||
<xi:include href="xml/meta-stage.xml"/>
|
||||
</chapter>
|
||||
|
||||
<chapter>
|
||||
<title>Clutter actors</title>
|
||||
<xi:include href="xml/meta-window-actor.xml"/>
|
||||
<xi:include href="xml/meta-window-group.xml"/>
|
||||
<xi:include href="xml/meta-background-actor.xml"/>
|
||||
<xi:include href="xml/meta-background-group.xml"/>
|
||||
<xi:include href="xml/meta-surface-actor.xml"/>
|
||||
<xi:include href="xml/meta-shaped-texture.xml"/>
|
||||
</chapter>
|
||||
|
||||
<chapter>
|
||||
<title>Plugins</title>
|
||||
<xi:include href="xml/meta-plugin.xml"/>
|
||||
<xi:include href="xml/meta-plugin-manager.xml"/>
|
||||
</chapter>
|
||||
|
||||
<chapter>
|
||||
<title>Cursor management</title>
|
||||
<xi:include href="xml/meta-cursor-tracker.xml"/>
|
||||
<xi:include href="xml/meta-cursor.xml"/>
|
||||
<xi:include href="xml/meta-cursor-renderer.xml"/>
|
||||
<xi:include href="xml/meta-pointer-constraint.xml"/>
|
||||
</chapter>
|
||||
|
||||
<chapter>
|
||||
<title>Monitor management</title>
|
||||
<xi:include href="xml/meta-monitor-manager.xml"/>
|
||||
<xi:include href="xml/meta-monitor-manager-dummy.xml"/>
|
||||
<xi:include href="xml/meta-monitor-config-manager.xml"/>
|
||||
<xi:include href="xml/meta-logical-monitor.xml"/>
|
||||
<xi:include href="xml/meta-monitor.xml"/>
|
||||
<xi:include href="xml/meta-monitor-transform.xml"/>
|
||||
</chapter>
|
||||
|
||||
<chapter>
|
||||
<title>X11</title>
|
||||
<xi:include href="xml/meta-backend-x11.xml"/>
|
||||
<xi:include href="xml/meta-monitor-manager-xrandr.xml"/>
|
||||
<xi:include href="xml/meta-window-actor-x11.xml"/>
|
||||
<xi:include href="xml/meta-surface-actor-x11.xml"/>
|
||||
</chapter>
|
||||
|
||||
<chapter>
|
||||
<title>Native / Wayland</title>
|
||||
<xi:include href="xml/meta-backend-native.xml"/>
|
||||
<xi:include href="xml/meta-monitor-manager-kms.xml"/>
|
||||
<xi:include href="xml/meta-renderer-native.xml"/>
|
||||
<xi:include href="xml/meta-window-actor-wayland.xml"/>
|
||||
<xi:include href="xml/meta-surface-actor-wayland.xml"/>
|
||||
</chapter>
|
||||
|
||||
<chapter>
|
||||
<title>Screencast</title>
|
||||
<xi:include href="xml/meta-screen-cast.xml"/>
|
||||
<xi:include href="xml/meta-screen-cast-session.xml"/>
|
||||
<xi:include href="xml/meta-screen-cast-window.xml"/>
|
||||
<xi:include href="xml/meta-screen-cast-stream.xml"/>
|
||||
<xi:include href="xml/meta-screen-cast-window-stream.xml"/>
|
||||
<xi:include href="xml/meta-screen-cast-monitor-stream.xml"/>
|
||||
<xi:include href="xml/meta-screen-cast-stream-src.xml"/>
|
||||
<xi:include href="xml/meta-screen-cast-window-stream-src.xml"/>
|
||||
<xi:include href="xml/meta-screen-cast-monitor-stream-src.xml"/>
|
||||
</chapter>
|
||||
|
||||
<chapter>
|
||||
<title>Remote desktop</title>
|
||||
<xi:include href="xml/meta-remote-desktop.xml"/>
|
||||
<xi:include href="xml/meta-dbus-remote-desktop.xml"/>
|
||||
</chapter>
|
||||
|
||||
<chapter id="object-tree">
|
||||
<title>Object Hierarchy</title>
|
||||
<xi:include href="xml/tree_index.sgml"/>
|
||||
</chapter>
|
||||
<index id="api-index-full">
|
||||
<title>API Index</title>
|
||||
<xi:include href="xml/api-index-full.xml"><xi:fallback /></xi:include>
|
||||
</index>
|
||||
<index id="deprecated-api-index" role="deprecated">
|
||||
<title>Index of deprecated API</title>
|
||||
<xi:include href="xml/api-index-deprecated.xml"><xi:fallback /></xi:include>
|
||||
</index>
|
||||
<xi:include href="xml/annotation-glossary.xml"><xi:fallback /></xi:include>
|
||||
</book>
|
1
doc/version.xml.in
Normal file
1
doc/version.xml.in
Normal file
@@ -0,0 +1 @@
|
||||
@VERSION@
|
7
doc/xml/gtkdocentities.ent.in
Normal file
7
doc/xml/gtkdocentities.ent.in
Normal file
@@ -0,0 +1,7 @@
|
||||
<!ENTITY package @PACKAGE@>
|
||||
<!ENTITY package_bugreport @PACKAGE_BUGREPORT@>
|
||||
<!ENTITY package_name @PACKAGE_NAME@>
|
||||
<!ENTITY package_string @PACKAGE_STRING@>
|
||||
<!ENTITY package_tarname @PACKAGE_TARNAME@>
|
||||
<!ENTITY package_url @PACKAGE_URL@>
|
||||
<!ENTITY package_version @PACKAGE_VERSION@>
|
13
doc/xml/meson.build
Normal file
13
doc/xml/meson.build
Normal file
@@ -0,0 +1,13 @@
|
||||
gtkdoc_entities_cdata = configuration_data()
|
||||
gtkdoc_entities_cdata.set_quoted('PACKAGE', meson.project_name())
|
||||
gtkdoc_entities_cdata.set_quoted('PACKAGE_BUGREPORT', 'https://gitlab.gnome.org/GNOME/mutter/issues/new')
|
||||
gtkdoc_entities_cdata.set_quoted('PACKAGE_NAME', meson.project_name())
|
||||
gtkdoc_entities_cdata.set_quoted('PACKAGE_STRING', '@0@ - @1@'.format(meson.project_name(), meson.project_version()))
|
||||
gtkdoc_entities_cdata.set_quoted('PACKAGE_TARNAME', 'mutter.tar.xz')
|
||||
gtkdoc_entities_cdata.set_quoted('PACKAGE_URL', 'https://gitlab.gnome.org/GNOME/mutter/')
|
||||
gtkdoc_entities_cdata.set_quoted('PACKAGE_VERSION', meson.project_version())
|
||||
configure_file(
|
||||
input: 'gtkdocentities.ent.in',
|
||||
output: 'gtkdocentities.ent',
|
||||
configuration: gtkdoc_entities_cdata,
|
||||
)
|
@@ -178,7 +178,7 @@ if have_native_backend
|
||||
libgbm_dep = dependency('gbm', version: gbm_req)
|
||||
libinput_dep = dependency('libinput', version: libinput_req)
|
||||
|
||||
libsystemd_dep = dependency('libsystemd')
|
||||
libsystemd_dep = dependency('libsystemd', required: false)
|
||||
if libsystemd_dep.found()
|
||||
logind_provider_dep = libsystemd_dep
|
||||
else
|
||||
@@ -370,7 +370,7 @@ subdir('clutter')
|
||||
subdir('data')
|
||||
subdir('src')
|
||||
subdir('po')
|
||||
subdir('doc/man')
|
||||
subdir('doc')
|
||||
|
||||
output = [
|
||||
'',
|
||||
|
817
po/ar.po
817
po/ar.po
@@ -4,15 +4,14 @@
|
||||
# Arafat Medini <lumina@silverpen.de>, 2003.
|
||||
# Abdulaziz Al-Arfaj <alarfaj0@yahoo.com>, 2004.
|
||||
# Djihed Afifi <djihed@gmail.com>, 2006.
|
||||
# Khaled Hosny <khaledhosny@eglug.org>, 2006, 2007, 2008, 2009, 2010, 2011, 2012, 2013, 2014, 2015, 2017.
|
||||
# Khaled Hosny <khaledhosny@eglug.org>, 2006, 2007, 2008, 2009, 2010, 2011, 2012, 2013, 2014, 2015, 2017, 2019.
|
||||
# Anas Afif Emad <anas.e87@gmail.com>, 2008.
|
||||
msgid ""
|
||||
msgstr ""
|
||||
"Project-Id-Version: metacity.HEAD\n"
|
||||
"Report-Msgid-Bugs-To: http://bugzilla.gnome.org/enter_bug.cgi?product=mutter&"
|
||||
"keywords=I18N+L10N&component=general\n"
|
||||
"POT-Creation-Date: 2017-11-03 10:20+0200\n"
|
||||
"PO-Revision-Date: 2017-11-03 10:22+0200\n"
|
||||
"Report-Msgid-Bugs-To: \n"
|
||||
"POT-Creation-Date: 2019-03-15 23:40+0200\n"
|
||||
"PO-Revision-Date: 2019-03-15 23:42+0200\n"
|
||||
"Last-Translator: Khaled Hosny <khaledhosny@eglug.org>\n"
|
||||
"Language-Team: Arabic <doc@arabeyes.org>\n"
|
||||
"Language: ar\n"
|
||||
@@ -21,126 +20,599 @@ msgstr ""
|
||||
"Content-Transfer-Encoding: 8bit\n"
|
||||
"Plural-Forms: nplurals=6; plural=n==0 ? 0 : n==1 ? 1 : n==2 ? 2 : n%100>=3 "
|
||||
"&& n%100<=10 ? 3 : n%100>=11 ? 4 : 5;\n"
|
||||
"X-Generator: Virtaal 1.0.0-beta1\n"
|
||||
"X-Generator: Virtaal 0.7.1\n"
|
||||
"X-Project-Style: gnome\n"
|
||||
|
||||
#: data/50-mutter-navigation.xml:6
|
||||
msgid "Navigation"
|
||||
msgstr "الإبحار"
|
||||
|
||||
#: data/50-mutter-navigation.xml:9
|
||||
msgid "Move window to workspace 1"
|
||||
msgstr "انقل النافذة إلى مساحة العمل 1"
|
||||
|
||||
#: data/50-mutter-navigation.xml:12
|
||||
msgid "Move window to workspace 2"
|
||||
msgstr "انقل النافذة إلى مساحة العمل 2"
|
||||
|
||||
#: data/50-mutter-navigation.xml:15
|
||||
msgid "Move window to workspace 3"
|
||||
msgstr "انقل النافذة إلى مساحة العمل 3"
|
||||
|
||||
#: data/50-mutter-navigation.xml:18
|
||||
msgid "Move window to workspace 4"
|
||||
msgstr "انقل النافذة إلى مساحة العمل 4"
|
||||
|
||||
#: data/50-mutter-navigation.xml:21
|
||||
msgid "Move window to last workspace"
|
||||
msgstr "انقل النافذة إلى مساحة العمل الأخيرة"
|
||||
|
||||
#: data/50-mutter-navigation.xml:24
|
||||
msgid "Move window one workspace up"
|
||||
msgstr "انقل النافذة مساحة عمل واحدة إلى الأعلى"
|
||||
|
||||
#: data/50-mutter-navigation.xml:27
|
||||
msgid "Move window one workspace down"
|
||||
msgstr "انقل النافذة مساحة عمل واحدة إلى الأسفل"
|
||||
|
||||
#: data/50-mutter-navigation.xml:30
|
||||
msgid "Move window one monitor to the left"
|
||||
msgstr "انقل النافذة شاشة واحدة إلى اليسار"
|
||||
|
||||
#: data/50-mutter-navigation.xml:33
|
||||
msgid "Move window one monitor to the right"
|
||||
msgstr "انقل النافذة شاشة واحدة إلى اليمين"
|
||||
|
||||
#: data/50-mutter-navigation.xml:36
|
||||
msgid "Move window one monitor up"
|
||||
msgstr "انقل النافذة شاشة واحدة إلى الأعلى"
|
||||
|
||||
#: data/50-mutter-navigation.xml:39
|
||||
msgid "Move window one monitor down"
|
||||
msgstr "انقل النافذة شاشة واحدة إلى الأسفل"
|
||||
|
||||
#: data/50-mutter-navigation.xml:43
|
||||
msgid "Switch applications"
|
||||
msgstr "تنقل بين التطبيقات"
|
||||
|
||||
#: data/50-mutter-navigation.xml:48
|
||||
msgid "Switch to previous application"
|
||||
msgstr "انتقل إلى التطبيق السابق"
|
||||
|
||||
#: data/50-mutter-navigation.xml:52
|
||||
msgid "Switch windows"
|
||||
msgstr "تنقل بين النوافذ"
|
||||
|
||||
#: data/50-mutter-navigation.xml:57
|
||||
msgid "Switch to previous window"
|
||||
msgstr "انتقل إلى النافذة السابقة"
|
||||
|
||||
#: data/50-mutter-navigation.xml:61
|
||||
msgid "Switch windows of an application"
|
||||
msgstr "تنقل بين نوافذ التطبيق"
|
||||
|
||||
#: data/50-mutter-navigation.xml:66
|
||||
msgid "Switch to previous window of an application"
|
||||
msgstr "انتقل إلى نافذة التطبيق السابقة"
|
||||
|
||||
#: data/50-mutter-navigation.xml:70
|
||||
msgid "Switch system controls"
|
||||
msgstr "تنقل بين تحكمات النظام"
|
||||
|
||||
#: data/50-mutter-navigation.xml:75
|
||||
msgid "Switch to previous system control"
|
||||
msgstr "انتقل إلى تحكم النظام السابق"
|
||||
|
||||
#: data/50-mutter-navigation.xml:79
|
||||
msgid "Switch windows directly"
|
||||
msgstr "تنقل مباشرة بين النوافذ"
|
||||
|
||||
#: data/50-mutter-navigation.xml:84
|
||||
msgid "Switch directly to previous window"
|
||||
msgstr "انتقل مباشرة إلى النافذة السابقة"
|
||||
|
||||
#: data/50-mutter-navigation.xml:88
|
||||
msgid "Switch windows of an app directly"
|
||||
msgstr "تنقل مباشرة بين نوافذ التطبيق"
|
||||
|
||||
#: data/50-mutter-navigation.xml:93
|
||||
msgid "Switch directly to previous window of an app"
|
||||
msgstr "انتقل مباشرة إلى نافذة التطبيق السابقة"
|
||||
|
||||
#: data/50-mutter-navigation.xml:97
|
||||
msgid "Switch system controls directly"
|
||||
msgstr "تنقل مباشرة بين تحكمات النظام"
|
||||
|
||||
#: data/50-mutter-navigation.xml:102
|
||||
msgid "Switch directly to previous system control"
|
||||
msgstr "انتقل مباشرة إلى تحكم النظام السابق"
|
||||
|
||||
#: data/50-mutter-navigation.xml:105
|
||||
msgid "Hide all normal windows"
|
||||
msgstr "أخفِ كل النوافذ العادية"
|
||||
|
||||
#: data/50-mutter-navigation.xml:108
|
||||
msgid "Switch to workspace 1"
|
||||
msgstr "انتقل إلى مساحة العمل 1"
|
||||
|
||||
#: data/50-mutter-navigation.xml:111
|
||||
msgid "Switch to workspace 2"
|
||||
msgstr "انتقل إلى مساحة العمل 2"
|
||||
|
||||
#: data/50-mutter-navigation.xml:114
|
||||
msgid "Switch to workspace 3"
|
||||
msgstr "انتقل إلى مساحة العمل 3"
|
||||
|
||||
#: data/50-mutter-navigation.xml:117
|
||||
msgid "Switch to workspace 4"
|
||||
msgstr "انتقل إلى مساحة العمل 4"
|
||||
|
||||
#: data/50-mutter-navigation.xml:120
|
||||
msgid "Switch to last workspace"
|
||||
msgstr "انتقل إلى مساحة العمل الأخيرة"
|
||||
|
||||
#: data/50-mutter-navigation.xml:123
|
||||
msgid "Move to workspace above"
|
||||
msgstr "انقل لمساحة العمل أعلى"
|
||||
|
||||
#: data/50-mutter-navigation.xml:126
|
||||
msgid "Move to workspace below"
|
||||
msgstr "انقل لمساحة العمل أسفل"
|
||||
|
||||
#: data/50-mutter-system.xml:6 data/50-mutter-wayland.xml:6
|
||||
msgid "System"
|
||||
msgstr "النظام"
|
||||
|
||||
#: data/50-mutter-system.xml:8
|
||||
msgid "Show the run command prompt"
|
||||
msgstr "أظهر محث تشغيل أمر"
|
||||
|
||||
#: data/50-mutter-system.xml:10
|
||||
msgid "Show the activities overview"
|
||||
msgstr "أظهر نظرة عامة على الأنشطة"
|
||||
|
||||
#: data/50-mutter-wayland.xml:8
|
||||
msgid "Restore the keyboard shortcuts"
|
||||
msgstr "استعد اختصارات لوحة المفاتيح"
|
||||
|
||||
#: data/50-mutter-windows.xml:6
|
||||
msgid "Windows"
|
||||
msgstr "النوافذ"
|
||||
|
||||
#: data/50-mutter-windows.xml:8
|
||||
msgid "Activate the window menu"
|
||||
msgstr "فعّل قائمة النافذة"
|
||||
|
||||
#: data/50-mutter-windows.xml:10
|
||||
msgid "Toggle fullscreen mode"
|
||||
msgstr "بدّل نمط ملء الشاشة"
|
||||
|
||||
#: data/50-mutter-windows.xml:12
|
||||
msgid "Toggle maximization state"
|
||||
msgstr "بدّل حالة التكبير"
|
||||
|
||||
#: data/50-mutter-windows.xml:14
|
||||
msgid "Maximize window"
|
||||
msgstr "كبّر النّافذة"
|
||||
|
||||
#: data/50-mutter-windows.xml:16
|
||||
msgid "Restore window"
|
||||
msgstr "استعد النّافذة"
|
||||
|
||||
#: data/50-mutter-windows.xml:18
|
||||
msgid "Close window"
|
||||
msgstr "أغلق النّافذة"
|
||||
|
||||
#: data/50-mutter-windows.xml:20
|
||||
msgid "Hide window"
|
||||
msgstr "أخفِ النّافذة"
|
||||
|
||||
#: data/50-mutter-windows.xml:22
|
||||
msgid "Move window"
|
||||
msgstr "انقل النّافذة"
|
||||
|
||||
#: data/50-mutter-windows.xml:24
|
||||
msgid "Resize window"
|
||||
msgstr "حجّم النّافذة"
|
||||
|
||||
#: data/50-mutter-windows.xml:27
|
||||
msgid "Toggle window on all workspaces or one"
|
||||
msgstr "بدّل حالة ظهور النافذة على جميع مساحات العمل أو واحدة منها"
|
||||
|
||||
#: data/50-mutter-windows.xml:29
|
||||
msgid "Raise window if covered, otherwise lower it"
|
||||
msgstr "ارفع النافذة إذا كانت أخرى تغطيها، أو أخفضها في ما عدا ذلك"
|
||||
|
||||
#: data/50-mutter-windows.xml:31
|
||||
msgid "Raise window above other windows"
|
||||
msgstr "ارفع النافذة فوق النوافذ الأخرى"
|
||||
|
||||
#: data/50-mutter-windows.xml:33
|
||||
msgid "Lower window below other windows"
|
||||
msgstr "اخفض النافذة تحت النوافذ الأخرى"
|
||||
|
||||
#: data/50-mutter-windows.xml:35
|
||||
msgid "Maximize window vertically"
|
||||
msgstr "كبّر النافذة رأسيا"
|
||||
|
||||
#: data/50-mutter-windows.xml:37
|
||||
msgid "Maximize window horizontally"
|
||||
msgstr "كبّر النافذة أفقيا"
|
||||
|
||||
#: data/50-mutter-windows.xml:41
|
||||
msgid "View split on left"
|
||||
msgstr "المنظور مقسوم على اليمين"
|
||||
|
||||
#: data/50-mutter-windows.xml:45
|
||||
msgid "View split on right"
|
||||
msgstr "المنظور مقسوم على اليسار"
|
||||
|
||||
#: data/mutter.desktop.in:4
|
||||
msgid "Mutter"
|
||||
msgstr "مَتَر"
|
||||
|
||||
#: data/org.gnome.mutter.gschema.xml.in:7
|
||||
msgid "Modifier to use for extended window management operations"
|
||||
msgstr "المغير الذي سيُستعمل لتمديد عمليات إدارة النوافذ "
|
||||
|
||||
#: data/org.gnome.mutter.gschema.xml.in:8
|
||||
msgid ""
|
||||
"This key will initiate the “overlay”, which is a combination window overview "
|
||||
"and application launching system. The default is intended to be the “Windows "
|
||||
"key” on PC hardware. It’s expected that this binding either the default or "
|
||||
"set to the empty string."
|
||||
msgstr ""
|
||||
|
||||
#: data/org.gnome.mutter.gschema.xml.in:20
|
||||
#, fuzzy
|
||||
msgid "Attach modal dialogs"
|
||||
msgstr "صندوق حوار سائد"
|
||||
|
||||
#: data/org.gnome.mutter.gschema.xml.in:21
|
||||
msgid ""
|
||||
"When true, instead of having independent titlebars, modal dialogs appear "
|
||||
"attached to the titlebar of the parent window and are moved together with "
|
||||
"the parent window."
|
||||
msgstr ""
|
||||
|
||||
#: data/org.gnome.mutter.gschema.xml.in:30
|
||||
msgid "Enable edge tiling when dropping windows on screen edges"
|
||||
msgstr ""
|
||||
|
||||
#: data/org.gnome.mutter.gschema.xml.in:31
|
||||
msgid ""
|
||||
"If enabled, dropping windows on vertical screen edges maximizes them "
|
||||
"vertically and resizes them horizontally to cover half of the available "
|
||||
"area. Dropping windows on the top screen edge maximizes them completely."
|
||||
msgstr ""
|
||||
|
||||
#: data/org.gnome.mutter.gschema.xml.in:40
|
||||
msgid "Workspaces are managed dynamically"
|
||||
msgstr ""
|
||||
|
||||
#: data/org.gnome.mutter.gschema.xml.in:41
|
||||
msgid ""
|
||||
"Determines whether workspaces are managed dynamically or whether there’s a "
|
||||
"static number of workspaces (determined by the num-workspaces key in org."
|
||||
"gnome.desktop.wm.preferences)."
|
||||
msgstr ""
|
||||
|
||||
#: data/org.gnome.mutter.gschema.xml.in:50
|
||||
msgid "Workspaces only on primary"
|
||||
msgstr ""
|
||||
|
||||
#: data/org.gnome.mutter.gschema.xml.in:51
|
||||
msgid ""
|
||||
"Determines whether workspace switching should happen for windows on all "
|
||||
"monitors or only for windows on the primary monitor."
|
||||
msgstr ""
|
||||
|
||||
#: data/org.gnome.mutter.gschema.xml.in:59
|
||||
msgid "No tab popup"
|
||||
msgstr ""
|
||||
|
||||
#: data/org.gnome.mutter.gschema.xml.in:60
|
||||
msgid ""
|
||||
"Determines whether the use of popup and highlight frame should be disabled "
|
||||
"for window cycling."
|
||||
msgstr ""
|
||||
|
||||
#: data/org.gnome.mutter.gschema.xml.in:68
|
||||
msgid "Delay focus changes until the pointer stops moving"
|
||||
msgstr ""
|
||||
|
||||
#: data/org.gnome.mutter.gschema.xml.in:69
|
||||
msgid ""
|
||||
"If set to true, and the focus mode is either “sloppy” or “mouse” then the "
|
||||
"focus will not be changed immediately when entering a window, but only after "
|
||||
"the pointer stops moving."
|
||||
msgstr ""
|
||||
|
||||
#: data/org.gnome.mutter.gschema.xml.in:79
|
||||
msgid "Draggable border width"
|
||||
msgstr ""
|
||||
|
||||
#: data/org.gnome.mutter.gschema.xml.in:80
|
||||
msgid ""
|
||||
"The amount of total draggable borders. If the theme’s visible borders are "
|
||||
"not enough, invisible borders will be added to meet this value."
|
||||
msgstr ""
|
||||
|
||||
#: data/org.gnome.mutter.gschema.xml.in:89
|
||||
msgid "Auto maximize nearly monitor sized windows"
|
||||
msgstr ""
|
||||
|
||||
#: data/org.gnome.mutter.gschema.xml.in:90
|
||||
msgid ""
|
||||
"If enabled, new windows that are initially the size of the monitor "
|
||||
"automatically get maximized."
|
||||
msgstr ""
|
||||
|
||||
#: data/org.gnome.mutter.gschema.xml.in:98
|
||||
msgid "Place new windows in the center"
|
||||
msgstr ""
|
||||
|
||||
#: data/org.gnome.mutter.gschema.xml.in:99
|
||||
msgid ""
|
||||
"When true, the new windows will always be put in the center of the active "
|
||||
"screen of the monitor."
|
||||
msgstr ""
|
||||
|
||||
#: data/org.gnome.mutter.gschema.xml.in:107
|
||||
msgid "Enable experimental features"
|
||||
msgstr ""
|
||||
|
||||
#: data/org.gnome.mutter.gschema.xml.in:108
|
||||
msgid ""
|
||||
"To enable experimental features, add the feature keyword to the list. "
|
||||
"Whether the feature requires restarting the compositor depends on the given "
|
||||
"feature. Any experimental feature is not required to still be available, or "
|
||||
"configurable. Don’t expect adding anything in this setting to be future "
|
||||
"proof. Currently possible keywords: • “scale-monitor-framebuffer” — makes "
|
||||
"mutter default to layout logical monitors in a logical pixel coordinate "
|
||||
"space, while scaling monitor framebuffers instead of window content, to "
|
||||
"manage HiDPI monitors. Does not require a restart."
|
||||
msgstr ""
|
||||
|
||||
#: data/org.gnome.mutter.gschema.xml.in:141
|
||||
msgid "Select window from tab popup"
|
||||
msgstr ""
|
||||
|
||||
#: data/org.gnome.mutter.gschema.xml.in:146
|
||||
msgid "Cancel tab popup"
|
||||
msgstr ""
|
||||
|
||||
#: data/org.gnome.mutter.gschema.xml.in:151
|
||||
#, fuzzy
|
||||
msgid "Switch monitor configurations"
|
||||
msgstr "غيّر الشاشة"
|
||||
|
||||
#: data/org.gnome.mutter.gschema.xml.in:156
|
||||
msgid "Rotates the built-in monitor configuration"
|
||||
msgstr ""
|
||||
|
||||
#: data/org.gnome.mutter.wayland.gschema.xml.in:6
|
||||
#, fuzzy
|
||||
msgid "Switch to VT 1"
|
||||
msgstr "انتقل إلى مساحة العمل 1"
|
||||
|
||||
#: data/org.gnome.mutter.wayland.gschema.xml.in:10
|
||||
#, fuzzy
|
||||
msgid "Switch to VT 2"
|
||||
msgstr "انتقل إلى مساحة العمل 2"
|
||||
|
||||
#: data/org.gnome.mutter.wayland.gschema.xml.in:14
|
||||
#, fuzzy
|
||||
msgid "Switch to VT 3"
|
||||
msgstr "انتقل إلى مساحة العمل 3"
|
||||
|
||||
#: data/org.gnome.mutter.wayland.gschema.xml.in:18
|
||||
#, fuzzy
|
||||
msgid "Switch to VT 4"
|
||||
msgstr "انتقل إلى مساحة العمل 4"
|
||||
|
||||
#: data/org.gnome.mutter.wayland.gschema.xml.in:22
|
||||
#, fuzzy
|
||||
msgid "Switch to VT 5"
|
||||
msgstr "انتقل إلى مساحة العمل 5"
|
||||
|
||||
#: data/org.gnome.mutter.wayland.gschema.xml.in:26
|
||||
#, fuzzy
|
||||
msgid "Switch to VT 6"
|
||||
msgstr "انتقل إلى مساحة العمل 6"
|
||||
|
||||
#: data/org.gnome.mutter.wayland.gschema.xml.in:30
|
||||
#, fuzzy
|
||||
msgid "Switch to VT 7"
|
||||
msgstr "انتقل إلى مساحة العمل 7"
|
||||
|
||||
#: data/org.gnome.mutter.wayland.gschema.xml.in:34
|
||||
#, fuzzy
|
||||
msgid "Switch to VT 8"
|
||||
msgstr "انتقل إلى مساحة العمل 8"
|
||||
|
||||
#: data/org.gnome.mutter.wayland.gschema.xml.in:38
|
||||
#, fuzzy
|
||||
msgid "Switch to VT 9"
|
||||
msgstr "انتقل إلى مساحة العمل 9"
|
||||
|
||||
#: data/org.gnome.mutter.wayland.gschema.xml.in:42
|
||||
#, fuzzy
|
||||
msgid "Switch to VT 10"
|
||||
msgstr "انتقل إلى مساحة العمل 10"
|
||||
|
||||
#: data/org.gnome.mutter.wayland.gschema.xml.in:46
|
||||
#, fuzzy
|
||||
msgid "Switch to VT 11"
|
||||
msgstr "انتقل إلى مساحة العمل 11"
|
||||
|
||||
#: data/org.gnome.mutter.wayland.gschema.xml.in:50
|
||||
#, fuzzy
|
||||
msgid "Switch to VT 12"
|
||||
msgstr "انتقل إلى مساحة العمل 12"
|
||||
|
||||
#: data/org.gnome.mutter.wayland.gschema.xml.in:54
|
||||
msgid "Re-enable shortcuts"
|
||||
msgstr ""
|
||||
|
||||
#: data/org.gnome.mutter.wayland.gschema.xml.in:64
|
||||
msgid "Allow grabs with Xwayland"
|
||||
msgstr ""
|
||||
|
||||
#: data/org.gnome.mutter.wayland.gschema.xml.in:65
|
||||
msgid ""
|
||||
"Allow keyboard grabs issued by X11 applications running in Xwayland to be "
|
||||
"taken into account. For a X11 grab to be taken into account under Wayland, "
|
||||
"the client must also either send a specific X11 ClientMessage to the root "
|
||||
"window or be among the applications white-listed in key “xwayland-grab-"
|
||||
"access-rules”."
|
||||
msgstr ""
|
||||
|
||||
#: data/org.gnome.mutter.wayland.gschema.xml.in:77
|
||||
msgid "Xwayland applications allowed to issue keyboard grabs"
|
||||
msgstr ""
|
||||
|
||||
#: data/org.gnome.mutter.wayland.gschema.xml.in:78
|
||||
msgid ""
|
||||
"List the resource names or resource class of X11 windows either allowed or "
|
||||
"not allowed to issue X11 keyboard grabs under Xwayland. The resource name or "
|
||||
"resource class of a given X11 window can be obtained using the command "
|
||||
"“xprop WM_CLASS”. Wildcards “*” and jokers “?” in the values are supported. "
|
||||
"Values starting with “!” are blacklisted, which has precedence over the "
|
||||
"whitelist, to revoke applications from the default system list. The default "
|
||||
"system list includes the following applications: "
|
||||
"“@XWAYLAND_GRAB_DEFAULT_ACCESS_RULES@” Users can break an existing grab by "
|
||||
"using the specific keyboard shortcut defined by the keybinding key “restore-"
|
||||
"shortcuts”."
|
||||
msgstr ""
|
||||
|
||||
#. TRANSLATORS: This string refers to a button that switches between
|
||||
#. * different modes.
|
||||
#.
|
||||
#: ../src/backends/meta-input-settings.c:2167
|
||||
#: src/backends/meta-input-settings.c:2424
|
||||
#, c-format
|
||||
msgid "Mode Switch (Group %d)"
|
||||
msgstr ""
|
||||
msgstr "تغيير الأوضاع (مجموعة %d)"
|
||||
|
||||
#. TRANSLATORS: This string refers to an action, cycles drawing tablets'
|
||||
#. * mapping through the available outputs.
|
||||
#.
|
||||
#: ../src/backends/meta-input-settings.c:2190
|
||||
#: src/backends/meta-input-settings.c:2447
|
||||
msgid "Switch monitor"
|
||||
msgstr "غيّر الشاشة"
|
||||
|
||||
#: ../src/backends/meta-input-settings.c:2192
|
||||
#: src/backends/meta-input-settings.c:2449
|
||||
msgid "Show on-screen help"
|
||||
msgstr "اعرض المساعدة على الشاشة"
|
||||
|
||||
#: ../src/backends/meta-monitor-manager.c:900
|
||||
#: src/backends/meta-monitor-manager.c:955
|
||||
msgid "Built-in display"
|
||||
msgstr "شاشة مدمجة"
|
||||
|
||||
#: ../src/backends/meta-monitor-manager.c:923
|
||||
#: src/backends/meta-monitor-manager.c:987
|
||||
msgid "Unknown"
|
||||
msgstr "غير معروفة"
|
||||
|
||||
#: ../src/backends/meta-monitor-manager.c:925
|
||||
#: src/backends/meta-monitor-manager.c:989
|
||||
msgid "Unknown Display"
|
||||
msgstr "شاشة غير معروفة"
|
||||
|
||||
#. TRANSLATORS: this is a monitor vendor name, followed by a
|
||||
#. * size in inches, like 'Dell 15"'
|
||||
#.
|
||||
#: ../src/backends/meta-monitor-manager.c:933
|
||||
#: src/backends/meta-monitor-manager.c:997
|
||||
#, c-format
|
||||
msgctxt ""
|
||||
"This is a monitor vendor name, followed by a size in inches, like 'Dell 15\"'"
|
||||
msgid "%s %s"
|
||||
msgstr "%s %s"
|
||||
|
||||
#: src/backends/meta-monitor-manager.c:1005
|
||||
#, c-format
|
||||
msgctxt ""
|
||||
"This is a monitor vendor name followed by product/model name where size in "
|
||||
"inches could not be calculated, e.g. Dell U2414H"
|
||||
msgid "%s %s"
|
||||
msgstr "%s %s"
|
||||
|
||||
#. This probably means that a non-WM compositor like xcompmgr is running;
|
||||
#. * we have no way to get it to exit
|
||||
#: ../src/compositor/compositor.c:476
|
||||
#: src/compositor/compositor.c:482
|
||||
#, c-format
|
||||
msgid ""
|
||||
"Another compositing manager is already running on screen %i on display “%s”."
|
||||
msgstr "يعمل مدير مزج آخر على الشاشة %i و العرض ”%s“."
|
||||
|
||||
#: ../src/core/bell.c:194
|
||||
#: src/core/bell.c:192
|
||||
msgid "Bell event"
|
||||
msgstr "حدث جرس"
|
||||
|
||||
#: ../src/core/display.c:608
|
||||
#, c-format
|
||||
msgid "Failed to open X Window System display “%s”\n"
|
||||
msgstr "فشل فتح عرض نظام نوافذ إكس ”%s“\n"
|
||||
|
||||
#: ../src/core/main.c:189
|
||||
#: src/core/main.c:185
|
||||
msgid "Disable connection to session manager"
|
||||
msgstr "عطّل الاتصال بمدير الجلسة"
|
||||
|
||||
#: ../src/core/main.c:195
|
||||
#: src/core/main.c:191
|
||||
msgid "Replace the running window manager"
|
||||
msgstr "استبدل بمدير النوافذ الذي يعمل"
|
||||
|
||||
#: ../src/core/main.c:201
|
||||
#: src/core/main.c:197
|
||||
msgid "Specify session management ID"
|
||||
msgstr "حدّد رقم هويّة إدارة الجلسة"
|
||||
|
||||
#: ../src/core/main.c:206
|
||||
#: src/core/main.c:202
|
||||
msgid "X Display to use"
|
||||
msgstr "معراض س الذي سيستعمل"
|
||||
|
||||
#: ../src/core/main.c:212
|
||||
#: src/core/main.c:208
|
||||
msgid "Initialize session from savefile"
|
||||
msgstr "ابدأ الجلسة من ملف محفوظ"
|
||||
|
||||
#: ../src/core/main.c:218
|
||||
#: src/core/main.c:214
|
||||
msgid "Make X calls synchronous"
|
||||
msgstr "اجعل نداءات س متزامنة"
|
||||
|
||||
#: ../src/core/main.c:225
|
||||
#: src/core/main.c:221
|
||||
msgid "Run as a wayland compositor"
|
||||
msgstr ""
|
||||
|
||||
#: ../src/core/main.c:231
|
||||
#: src/core/main.c:227
|
||||
msgid "Run as a nested compositor"
|
||||
msgstr ""
|
||||
|
||||
#: ../src/core/main.c:239
|
||||
#: src/core/main.c:233
|
||||
msgid "Run wayland compositor without starting Xwayland"
|
||||
msgstr ""
|
||||
|
||||
#: src/core/main.c:241
|
||||
msgid "Run as a full display server, rather than nested"
|
||||
msgstr ""
|
||||
|
||||
#: src/core/main.c:247
|
||||
msgid "Run with X11 backend"
|
||||
msgstr ""
|
||||
|
||||
#. Translators: %s is a window title
|
||||
#: ../src/core/meta-close-dialog-default.c:147
|
||||
#: src/core/meta-close-dialog-default.c:151
|
||||
#, c-format
|
||||
msgid "“%s” is not responding."
|
||||
msgstr "”%s“ لا يستجيب."
|
||||
|
||||
#: ../src/core/meta-close-dialog-default.c:149
|
||||
#: src/core/meta-close-dialog-default.c:153
|
||||
msgid "Application is not responding."
|
||||
msgstr "لا يستجيب التطبيق"
|
||||
|
||||
#: ../src/core/meta-close-dialog-default.c:154
|
||||
#: src/core/meta-close-dialog-default.c:158
|
||||
msgid ""
|
||||
"You may choose to wait a short while for it to continue or force the "
|
||||
"application to quit entirely."
|
||||
msgstr "ربما ترغب في الانتظار قليلا ليُكمِل أو إجبار التطبيق على الإنهاء كُلّية."
|
||||
|
||||
#: ../src/core/meta-close-dialog-default.c:161
|
||||
#: src/core/meta-close-dialog-default.c:165
|
||||
msgid "_Force Quit"
|
||||
msgstr "أ_جبر الإنهاء"
|
||||
|
||||
#: ../src/core/meta-close-dialog-default.c:161
|
||||
#: src/core/meta-close-dialog-default.c:165
|
||||
msgid "_Wait"
|
||||
msgstr "ا_نتظر"
|
||||
|
||||
#: ../src/core/mutter.c:39
|
||||
#: src/core/mutter.c:38
|
||||
#, c-format
|
||||
msgid ""
|
||||
"mutter %s\n"
|
||||
@@ -154,43 +626,52 @@ msgstr ""
|
||||
"هذا برنامج حر، راجع المصدر لشروط النسخ.\n"
|
||||
"لا يوجد أي ضمان: و لا حتى ضمان قابلية التسويق أو المناسبة لأي هدف.\n"
|
||||
|
||||
#: ../src/core/mutter.c:53
|
||||
#: src/core/mutter.c:52
|
||||
msgid "Print version"
|
||||
msgstr "اطبع الإصدارة"
|
||||
|
||||
#: ../src/core/mutter.c:59
|
||||
#: src/core/mutter.c:58
|
||||
msgid "Mutter plugin to use"
|
||||
msgstr "ملحق مَتَر الذي سيُستخدم"
|
||||
|
||||
#: ../src/core/prefs.c:1997
|
||||
#: src/core/prefs.c:1786
|
||||
#, c-format
|
||||
msgid "Workspace %d"
|
||||
msgstr "مساحة العمل %d"
|
||||
|
||||
#: ../src/core/screen.c:583
|
||||
#: src/core/util.c:121
|
||||
msgid "Mutter was compiled without support for verbose mode\n"
|
||||
msgstr "جُمِّع مَتَر دون دعم للنمط المطنب\n"
|
||||
|
||||
#: src/wayland/meta-wayland-tablet-pad.c:567
|
||||
#, c-format
|
||||
msgid "Mode Switch: Mode %d"
|
||||
msgstr ""
|
||||
|
||||
#: src/x11/meta-x11-display.c:666
|
||||
#, c-format
|
||||
msgid ""
|
||||
"Display “%s” already has a window manager; try using the --replace option to "
|
||||
"replace the current window manager."
|
||||
msgstr ""
|
||||
"الشاشة ”%s“ لها مدير نوافذ بالفعل، حاول استعمال خيار التبديل --replace لتحُلّ"
|
||||
" محلّ مدير النوافذ الحالي."
|
||||
"الشاشة ”%s“ لها مدير نوافذ بالفعل، حاول استعمال خيار التبديل --replace لتحُلّ "
|
||||
"محلّ مدير النوافذ الحالي."
|
||||
|
||||
#: ../src/core/screen.c:668
|
||||
#: src/x11/meta-x11-display.c:1008
|
||||
msgid "Failed to initialize GDK\n"
|
||||
msgstr ""
|
||||
|
||||
#: src/x11/meta-x11-display.c:1032
|
||||
#, c-format
|
||||
msgid "Failed to open X Window System display “%s”\n"
|
||||
msgstr "فشل فتح عرض نظام نوافذ إكس ”%s“\n"
|
||||
|
||||
#: src/x11/meta-x11-display.c:1113
|
||||
#, c-format
|
||||
msgid "Screen %d on display “%s” is invalid\n"
|
||||
msgstr "الشاشة %d على العرض ”%s“ غير صحيحة\n"
|
||||
|
||||
#: ../src/core/util.c:120
|
||||
msgid "Mutter was compiled without support for verbose mode\n"
|
||||
msgstr "جُمِّع مَتَر دون دعم للنمط المطنب\n"
|
||||
|
||||
#: ../src/wayland/meta-wayland-tablet-pad.c:563
|
||||
#, c-format
|
||||
msgid "Mode Switch: Mode %d"
|
||||
msgstr ""
|
||||
|
||||
#: ../src/x11/session.c:1815
|
||||
#: src/x11/session.c:1821
|
||||
msgid ""
|
||||
"These windows do not support “save current setup” and will have to be "
|
||||
"restarted manually next time you log in."
|
||||
@@ -198,245 +679,26 @@ msgstr ""
|
||||
"هذه النوافذ لا تدعم ” الضبط الحالي" إعادة تشغيلها يدويا عند الولوج "
|
||||
"المرة القادمة."
|
||||
|
||||
#: ../src/x11/window-props.c:559
|
||||
#: src/x11/window-props.c:569
|
||||
#, c-format
|
||||
msgid "%s (on %s)"
|
||||
msgstr "%s (على %s)"
|
||||
|
||||
#~ msgid "Navigation"
|
||||
#~ msgstr "الإبحار"
|
||||
|
||||
#~ msgid "Move window to workspace 1"
|
||||
#~ msgstr "انقل النافذة إلى مساحة العمل 1"
|
||||
|
||||
#~ msgid "Move window to workspace 2"
|
||||
#~ msgstr "انقل النافذة إلى مساحة العمل 2"
|
||||
|
||||
#~ msgid "Move window to workspace 3"
|
||||
#~ msgstr "انقل النافذة إلى مساحة العمل 3"
|
||||
|
||||
#~ msgid "Move window to workspace 4"
|
||||
#~ msgstr "انقل النافذة إلى مساحة العمل 4"
|
||||
|
||||
#~ msgid "Move window to last workspace"
|
||||
#~ msgstr "انقل النافذة إلى مساحة العمل الأخيرة"
|
||||
|
||||
#~ msgid "Move window one workspace to the left"
|
||||
#~ msgstr "انقل النافذة مساحة عمل واحدة إلى اليسار"
|
||||
|
||||
#~ msgid "Move window one workspace to the right"
|
||||
#~ msgstr "انقل النافذة مساحة عمل واحدة إلى اليمين"
|
||||
|
||||
#~ msgid "Move window one workspace up"
|
||||
#~ msgstr "انقل النافذة مساحة عمل واحدة إلى الأعلى"
|
||||
|
||||
#~ msgid "Move window one workspace down"
|
||||
#~ msgstr "انقل النافذة مساحة عمل واحدة إلى الأسفل"
|
||||
|
||||
#~ msgid "Move window one monitor to the left"
|
||||
#~ msgstr "انقل النافذة شاشة واحدة إلى اليسار"
|
||||
|
||||
#~ msgid "Move window one monitor to the right"
|
||||
#~ msgstr "انقل النافذة شاشة واحدة إلى اليمين"
|
||||
|
||||
#~ msgid "Move window one monitor up"
|
||||
#~ msgstr "انقل النافذة شاشة واحدة إلى الأعلى"
|
||||
|
||||
#~ msgid "Move window one monitor down"
|
||||
#~ msgstr "انقل النافذة شاشة واحدة إلى الأسفل"
|
||||
|
||||
#~ msgid "Switch applications"
|
||||
#~ msgstr "تنقل بين التطبيقات"
|
||||
|
||||
#~ msgid "Switch to previous application"
|
||||
#~ msgstr "انتقل إلى التطبيق السابق"
|
||||
|
||||
#~ msgid "Switch windows"
|
||||
#~ msgstr "تنقل بين النوافذ"
|
||||
|
||||
#~ msgid "Switch to previous window"
|
||||
#~ msgstr "انتقل إلى النافذة السابقة"
|
||||
|
||||
#~ msgid "Switch windows of an application"
|
||||
#~ msgstr "تنقل بين نوافذ التطبيق"
|
||||
|
||||
#~ msgid "Switch to previous window of an application"
|
||||
#~ msgstr "انتقل إلى نافذة التطبيق السابقة"
|
||||
|
||||
#~ msgid "Switch system controls"
|
||||
#~ msgstr "تنقل بين تحكمات النظام"
|
||||
|
||||
#~ msgid "Switch to previous system control"
|
||||
#~ msgstr "انتقل إلى تحكم النظام السابق"
|
||||
|
||||
#~ msgid "Switch windows directly"
|
||||
#~ msgstr "تنقل مباشرة بين النوافذ"
|
||||
|
||||
#~ msgid "Switch directly to previous window"
|
||||
#~ msgstr "انتقل مباشرة إلى النافذة السابقة"
|
||||
|
||||
#~ msgid "Switch windows of an app directly"
|
||||
#~ msgstr "تنقل مباشرة بين نوافذ التطبيق"
|
||||
|
||||
#~ msgid "Switch directly to previous window of an app"
|
||||
#~ msgstr "انتقل مباشرة إلى نافذة التطبيق السابقة"
|
||||
|
||||
#~ msgid "Switch system controls directly"
|
||||
#~ msgstr "تنقل مباشرة بين تحكمات النظام"
|
||||
|
||||
#~ msgid "Switch directly to previous system control"
|
||||
#~ msgstr "انتقل مباشرة إلى تحكم النظام السابق"
|
||||
|
||||
#~ msgid "Hide all normal windows"
|
||||
#~ msgstr "أخفِ كل النوافذ العادية"
|
||||
|
||||
#~ msgid "Switch to workspace 1"
|
||||
#~ msgstr "انتقل إلى مساحة العمل 1"
|
||||
|
||||
#~ msgid "Switch to workspace 2"
|
||||
#~ msgstr "انتقل إلى مساحة العمل 2"
|
||||
|
||||
#~ msgid "Switch to workspace 3"
|
||||
#~ msgstr "انتقل إلى مساحة العمل 3"
|
||||
|
||||
#~ msgid "Switch to workspace 4"
|
||||
#~ msgstr "انتقل إلى مساحة العمل 4"
|
||||
|
||||
#~ msgid "Switch to last workspace"
|
||||
#~ msgstr "انتقل إلى مساحة العمل الأخيرة"
|
||||
|
||||
#~ msgid "Move to workspace left"
|
||||
#~ msgstr "انقل لمساحة العمل على اليسار"
|
||||
|
||||
#~ msgid "Move to workspace right"
|
||||
#~ msgstr "انقل لمساحة العمل على اليمين"
|
||||
|
||||
#~ msgid "Move to workspace above"
|
||||
#~ msgstr "انقل لمساحة العمل أعلى"
|
||||
|
||||
#~ msgid "Move to workspace below"
|
||||
#~ msgstr "انقل لمساحة العمل أسفل"
|
||||
|
||||
#~ msgid "System"
|
||||
#~ msgstr "النظام"
|
||||
|
||||
#~ msgid "Show the run command prompt"
|
||||
#~ msgstr "أظهر محث تشغيل أمر"
|
||||
|
||||
#~ msgid "Show the activities overview"
|
||||
#~ msgstr "أظهر نظرة عامة على الأنشطة"
|
||||
|
||||
#~ msgid "Windows"
|
||||
#~ msgstr "النوافذ"
|
||||
|
||||
#~ msgid "Activate the window menu"
|
||||
#~ msgstr "فعّل قائمة النافذة"
|
||||
|
||||
#~ msgid "Toggle fullscreen mode"
|
||||
#~ msgstr "بدّل نمط ملء الشاشة"
|
||||
|
||||
#~ msgid "Toggle maximization state"
|
||||
#~ msgstr "بدّل حالة التكبير"
|
||||
|
||||
#~ msgid "Maximize window"
|
||||
#~ msgstr "كبّر النّافذة"
|
||||
|
||||
#~ msgid "Restore window"
|
||||
#~ msgstr "استعد النّافذة"
|
||||
|
||||
#~ msgid "Toggle shaded state"
|
||||
#~ msgstr "بدّل حالة الإخفاء"
|
||||
|
||||
#~ msgid "Close window"
|
||||
#~ msgstr "أغلق النّافذة"
|
||||
|
||||
#~ msgid "Hide window"
|
||||
#~ msgstr "أخفِ النّافذة"
|
||||
|
||||
#~ msgid "Move window"
|
||||
#~ msgstr "انقل النّافذة"
|
||||
|
||||
#~ msgid "Resize window"
|
||||
#~ msgstr "حجّم النّافذة"
|
||||
|
||||
#~ msgid "Toggle window on all workspaces or one"
|
||||
#~ msgstr "بدّل حالة ظهور النافذة على جميع مساحات العمل أو واحدة منها"
|
||||
|
||||
#~ msgid "Raise window if covered, otherwise lower it"
|
||||
#~ msgstr "ارفع النافذة إذا كانت أخرى تغطيها، أو أخفضها في ما عدا ذلك"
|
||||
|
||||
#~ msgid "Raise window above other windows"
|
||||
#~ msgstr "ارفع النافذة فوق النوافذ الأخرى"
|
||||
|
||||
#~ msgid "Lower window below other windows"
|
||||
#~ msgstr "اخفض النافذة تحت النوافذ الأخرى"
|
||||
|
||||
#~ msgid "Maximize window vertically"
|
||||
#~ msgstr "كبّر النافذة رأسيا"
|
||||
|
||||
#~ msgid "Maximize window horizontally"
|
||||
#~ msgstr "كبّر النافذة أفقيا"
|
||||
|
||||
#~ msgid "View split on left"
|
||||
#~ msgstr "المنظور مقسوم على اليمين"
|
||||
|
||||
#~ msgid "View split on right"
|
||||
#~ msgstr "المنظور مقسوم على اليسار"
|
||||
|
||||
#~ msgid "Mutter"
|
||||
#~ msgstr "مَتَر"
|
||||
|
||||
#~ msgid "Modifier to use for extended window management operations"
|
||||
#~ msgstr "المغير الذي سيُستعمل لتمديد عمليات إدارة النوافذ "
|
||||
|
||||
#, fuzzy
|
||||
#~ msgid "Switch to VT 1"
|
||||
#~ msgstr "انتقل إلى مساحة العمل 1"
|
||||
|
||||
#, fuzzy
|
||||
#~ msgid "Switch to VT 2"
|
||||
#~ msgstr "انتقل إلى مساحة العمل 2"
|
||||
|
||||
#, fuzzy
|
||||
#~ msgid "Switch to VT 3"
|
||||
#~ msgstr "انتقل إلى مساحة العمل 3"
|
||||
|
||||
#, fuzzy
|
||||
#~ msgid "Switch to VT 4"
|
||||
#~ msgstr "انتقل إلى مساحة العمل 4"
|
||||
|
||||
#, fuzzy
|
||||
#~ msgid "Switch to VT 5"
|
||||
#~ msgstr "انتقل إلى مساحة العمل 5"
|
||||
|
||||
#, fuzzy
|
||||
#~ msgid "Switch to VT 6"
|
||||
#~ msgstr "انتقل إلى مساحة العمل 6"
|
||||
|
||||
#, fuzzy
|
||||
#~ msgid "Switch to VT 7"
|
||||
#~ msgstr "انتقل إلى مساحة العمل 7"
|
||||
|
||||
#, fuzzy
|
||||
#~ msgid "Switch to VT 8"
|
||||
#~ msgstr "انتقل إلى مساحة العمل 8"
|
||||
|
||||
#, fuzzy
|
||||
#~ msgid "Switch to VT 9"
|
||||
#~ msgstr "انتقل إلى مساحة العمل 9"
|
||||
|
||||
#, fuzzy
|
||||
#~ msgid "Switch to VT 10"
|
||||
#~ msgstr "انتقل إلى مساحة العمل 10"
|
||||
|
||||
#, fuzzy
|
||||
#~ msgid "Switch to VT 11"
|
||||
#~ msgstr "انتقل إلى مساحة العمل 11"
|
||||
|
||||
#, fuzzy
|
||||
#~ msgid "Switch to VT 12"
|
||||
#~ msgstr "انتقل إلى مساحة العمل 12"
|
||||
|
||||
#~ msgid "Unknown window information request: %d"
|
||||
#~ msgstr "طلب معلومات نافذة مجهول: %d"
|
||||
|
||||
@@ -1162,9 +1424,6 @@ msgstr "%s (على %s)"
|
||||
#~ msgid "Border"
|
||||
#~ msgstr "حد"
|
||||
|
||||
#~ msgid "Attached Modal Dialog"
|
||||
#~ msgstr "صندوق حوار سائد"
|
||||
|
||||
#~ msgid "Button layout test %d"
|
||||
#~ msgstr "تجربة تصميم الأزرار %d"
|
||||
|
||||
|
36
po/es.po
36
po/es.po
@@ -13,7 +13,7 @@ msgid ""
|
||||
msgstr ""
|
||||
"Project-Id-Version: mutter.master\n"
|
||||
"Report-Msgid-Bugs-To: https://gitlab.gnome.org/GNOME/mutter/issues\n"
|
||||
"POT-Creation-Date: 2019-02-20 14:35+0000\n"
|
||||
"POT-Creation-Date: 2019-03-28 12:21+0000\n"
|
||||
"PO-Revision-Date: 2019-03-01 12:17+0100\n"
|
||||
"Last-Translator: Daniel Mustieles <daniel.mustieles@gmail.com>\n"
|
||||
"Language-Team: es <gnome-es-list@gnome.org>\n"
|
||||
@@ -154,7 +154,7 @@ msgstr "Cambiar a la útima área de trabajo"
|
||||
|
||||
#: data/50-mutter-navigation.xml:123
|
||||
msgid "Move to workspace above"
|
||||
msgstr "Mover al área de trabajo de la arriba"
|
||||
msgstr "Mover al área de trabajo de arriba"
|
||||
|
||||
#: data/50-mutter-navigation.xml:126
|
||||
msgid "Move to workspace below"
|
||||
@@ -534,7 +534,7 @@ msgstr ""
|
||||
#. TRANSLATORS: This string refers to a button that switches between
|
||||
#. * different modes.
|
||||
#.
|
||||
#: src/backends/meta-input-settings.c:2423
|
||||
#: src/backends/meta-input-settings.c:2424
|
||||
#, c-format
|
||||
msgid "Mode Switch (Group %d)"
|
||||
msgstr "Cambiar modo (grupo %d)"
|
||||
@@ -542,34 +542,34 @@ msgstr "Cambiar modo (grupo %d)"
|
||||
#. TRANSLATORS: This string refers to an action, cycles drawing tablets'
|
||||
#. * mapping through the available outputs.
|
||||
#.
|
||||
#: src/backends/meta-input-settings.c:2446
|
||||
#: src/backends/meta-input-settings.c:2447
|
||||
msgid "Switch monitor"
|
||||
msgstr "Cambiar monitor"
|
||||
|
||||
#: src/backends/meta-input-settings.c:2448
|
||||
#: src/backends/meta-input-settings.c:2449
|
||||
msgid "Show on-screen help"
|
||||
msgstr "Mostrar la ayuda en pantalla"
|
||||
|
||||
#: src/backends/meta-monitor-manager.c:954
|
||||
#: src/backends/meta-monitor-manager.c:955
|
||||
msgid "Built-in display"
|
||||
msgstr "Pantalla integrada"
|
||||
|
||||
#: src/backends/meta-monitor-manager.c:986
|
||||
#: src/backends/meta-monitor-manager.c:987
|
||||
msgid "Unknown"
|
||||
msgstr "Desconocida"
|
||||
|
||||
#: src/backends/meta-monitor-manager.c:988
|
||||
#: src/backends/meta-monitor-manager.c:989
|
||||
msgid "Unknown Display"
|
||||
msgstr "Pantalla desconocida"
|
||||
|
||||
#: src/backends/meta-monitor-manager.c:996
|
||||
#: src/backends/meta-monitor-manager.c:997
|
||||
#, c-format
|
||||
msgctxt ""
|
||||
"This is a monitor vendor name, followed by a size in inches, like 'Dell 15\"'"
|
||||
msgid "%s %s"
|
||||
msgstr "%s %s"
|
||||
|
||||
#: src/backends/meta-monitor-manager.c:1004
|
||||
#: src/backends/meta-monitor-manager.c:1005
|
||||
#, c-format
|
||||
msgctxt ""
|
||||
"This is a monitor vendor name followed by product/model name where size in "
|
||||
@@ -587,7 +587,7 @@ msgstr ""
|
||||
"Ya existe un gestor de composición ejecutándose en la monitor %i, pantalla "
|
||||
"«%s»."
|
||||
|
||||
#: src/core/bell.c:252
|
||||
#: src/core/bell.c:192
|
||||
msgid "Bell event"
|
||||
msgstr "Evento de campana"
|
||||
|
||||
@@ -636,16 +636,16 @@ msgid "Run with X11 backend"
|
||||
msgstr "Ejecutar con «backend» de X11"
|
||||
|
||||
#. Translators: %s is a window title
|
||||
#: src/core/meta-close-dialog-default.c:150
|
||||
#: src/core/meta-close-dialog-default.c:151
|
||||
#, c-format
|
||||
msgid "“%s” is not responding."
|
||||
msgstr "«%s» no está respondiendo."
|
||||
|
||||
#: src/core/meta-close-dialog-default.c:152
|
||||
#: src/core/meta-close-dialog-default.c:153
|
||||
msgid "Application is not responding."
|
||||
msgstr "La aplicación no está respondiendo."
|
||||
|
||||
#: src/core/meta-close-dialog-default.c:157
|
||||
#: src/core/meta-close-dialog-default.c:158
|
||||
msgid ""
|
||||
"You may choose to wait a short while for it to continue or force the "
|
||||
"application to quit entirely."
|
||||
@@ -653,11 +653,11 @@ msgstr ""
|
||||
"Puede elegir esperar un rato para ver si continua o forzar la aplicación "
|
||||
"para cerrarla completamente."
|
||||
|
||||
#: src/core/meta-close-dialog-default.c:164
|
||||
#: src/core/meta-close-dialog-default.c:165
|
||||
msgid "_Force Quit"
|
||||
msgstr "_Forzar la salida"
|
||||
|
||||
#: src/core/meta-close-dialog-default.c:164
|
||||
#: src/core/meta-close-dialog-default.c:165
|
||||
msgid "_Wait"
|
||||
msgstr "_Esperar"
|
||||
|
||||
@@ -717,7 +717,7 @@ msgstr "Falló al inicializar GDK\n"
|
||||
msgid "Failed to open X Window System display “%s”\n"
|
||||
msgstr "Ocurrió un error al abrir la pantalla de X Window System «%s»\n"
|
||||
|
||||
#: src/x11/meta-x11-display.c:1115
|
||||
#: src/x11/meta-x11-display.c:1113
|
||||
#, c-format
|
||||
msgid "Screen %d on display “%s” is invalid\n"
|
||||
msgstr "La ventana %d en la pantalla «%s» no es válida\n"
|
||||
@@ -730,7 +730,7 @@ msgstr ""
|
||||
"Estas ventanas no soportan «guardar la configuración actual» y tendrán que "
|
||||
"reiniciarse manualmente la próxima vez que inicie una sesión."
|
||||
|
||||
#: src/x11/window-props.c:568
|
||||
#: src/x11/window-props.c:569
|
||||
#, c-format
|
||||
msgid "%s (on %s)"
|
||||
msgstr "%s (on %s)"
|
||||
|
89
po/hr.po
89
po/hr.po
@@ -5,8 +5,8 @@ msgid ""
|
||||
msgstr ""
|
||||
"Project-Id-Version: metacity 0\n"
|
||||
"Report-Msgid-Bugs-To: https://gitlab.gnome.org/GNOME/mutter/issues\n"
|
||||
"POT-Creation-Date: 2018-07-07 09:58+0000\n"
|
||||
"PO-Revision-Date: 2018-09-02 18:40+0200\n"
|
||||
"POT-Creation-Date: 2019-02-04 17:52+0000\n"
|
||||
"PO-Revision-Date: 2019-03-26 12:40+0100\n"
|
||||
"Last-Translator: gogo <trebelnik2@gmail.com>\n"
|
||||
"Language-Team: Croatian <lokalizacija@linux.hr>\n"
|
||||
"Language: hr\n"
|
||||
@@ -16,7 +16,7 @@ msgstr ""
|
||||
"Plural-Forms: nplurals=3; plural=n%10==1 && n%100!=11 ? 0 : n%10>=2 && n"
|
||||
"%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2;\n"
|
||||
"X-Launchpad-Export-Date: 2008-05-28 13:28+0000\n"
|
||||
"X-Generator: Poedit 2.1.1\n"
|
||||
"X-Generator: Poedit 2.0.6\n"
|
||||
|
||||
#: data/50-mutter-navigation.xml:6
|
||||
msgid "Navigation"
|
||||
@@ -518,7 +518,7 @@ msgstr ""
|
||||
#. TRANSLATORS: This string refers to a button that switches between
|
||||
#. * different modes.
|
||||
#.
|
||||
#: src/backends/meta-input-settings.c:2325
|
||||
#: src/backends/meta-input-settings.c:2423
|
||||
#, c-format
|
||||
msgid "Mode Switch (Group %d)"
|
||||
msgstr "Način prebacivanja (Grupa %d)"
|
||||
@@ -526,102 +526,109 @@ msgstr "Način prebacivanja (Grupa %d)"
|
||||
#. TRANSLATORS: This string refers to an action, cycles drawing tablets'
|
||||
#. * mapping through the available outputs.
|
||||
#.
|
||||
#: src/backends/meta-input-settings.c:2348
|
||||
#: src/backends/meta-input-settings.c:2446
|
||||
msgid "Switch monitor"
|
||||
msgstr "Prebaci zaslon"
|
||||
|
||||
#: src/backends/meta-input-settings.c:2350
|
||||
#: src/backends/meta-input-settings.c:2448
|
||||
msgid "Show on-screen help"
|
||||
msgstr "Prikaži zaslonsku pomoć"
|
||||
|
||||
#: src/backends/meta-monitor-manager.c:907
|
||||
#: src/backends/meta-monitor-manager.c:954
|
||||
msgid "Built-in display"
|
||||
msgstr "Ugrađeni zaslon"
|
||||
|
||||
#: src/backends/meta-monitor-manager.c:930
|
||||
#: src/backends/meta-monitor-manager.c:986
|
||||
msgid "Unknown"
|
||||
msgstr "Nepoznat"
|
||||
|
||||
#: src/backends/meta-monitor-manager.c:932
|
||||
#: src/backends/meta-monitor-manager.c:988
|
||||
msgid "Unknown Display"
|
||||
msgstr "Nepoznat zaslon"
|
||||
|
||||
#. TRANSLATORS: this is a monitor vendor name, followed by a
|
||||
#. * size in inches, like 'Dell 15"'
|
||||
#.
|
||||
#: src/backends/meta-monitor-manager.c:940
|
||||
#: src/backends/meta-monitor-manager.c:996
|
||||
#, c-format
|
||||
msgctxt ""
|
||||
"This is a monitor vendor name, followed by a size in inches, like 'Dell 15\"'"
|
||||
msgid "%s %s"
|
||||
msgstr "%s %s"
|
||||
|
||||
#: src/backends/meta-monitor-manager.c:1004
|
||||
#, c-format
|
||||
msgctxt ""
|
||||
"This is a monitor vendor name followed by product/model name where size in "
|
||||
"inches could not be calculated, e.g. Dell U2414H"
|
||||
msgid "%s %s"
|
||||
msgstr "%s %s"
|
||||
|
||||
#. This probably means that a non-WM compositor like xcompmgr is running;
|
||||
#. * we have no way to get it to exit
|
||||
#: src/compositor/compositor.c:481
|
||||
#: src/compositor/compositor.c:482
|
||||
#, c-format
|
||||
msgid ""
|
||||
"Another compositing manager is already running on screen %i on display “%s”."
|
||||
msgstr ""
|
||||
"Drugi upravitelja kompoziranja već je pokrenut na zaslonu %i prikaza \"%s\"."
|
||||
|
||||
#: src/core/bell.c:254
|
||||
#: src/core/bell.c:252
|
||||
msgid "Bell event"
|
||||
msgstr "Događaj zvona"
|
||||
|
||||
#: src/core/main.c:191
|
||||
#: src/core/main.c:185
|
||||
msgid "Disable connection to session manager"
|
||||
msgstr "Onemogući povezivanje sa upraviteljem sesija"
|
||||
|
||||
#: src/core/main.c:197
|
||||
#: src/core/main.c:191
|
||||
msgid "Replace the running window manager"
|
||||
msgstr "Zamijeni pokrenutoga upravitelja porozora"
|
||||
|
||||
#: src/core/main.c:203
|
||||
#: src/core/main.c:197
|
||||
msgid "Specify session management ID"
|
||||
msgstr "Odredite ID upravljanja sesijama"
|
||||
|
||||
#: src/core/main.c:208
|
||||
#: src/core/main.c:202
|
||||
msgid "X Display to use"
|
||||
msgstr "X Prikaz za korištenje"
|
||||
|
||||
#: src/core/main.c:214
|
||||
#: src/core/main.c:208
|
||||
msgid "Initialize session from savefile"
|
||||
msgstr "Pokreni sesiju iz spremljene datoteke"
|
||||
|
||||
#: src/core/main.c:220
|
||||
#: src/core/main.c:214
|
||||
msgid "Make X calls synchronous"
|
||||
msgstr "Napravi X pozive usklađenim"
|
||||
|
||||
#: src/core/main.c:227
|
||||
#: src/core/main.c:221
|
||||
msgid "Run as a wayland compositor"
|
||||
msgstr "Pokreni wayland kompozitor"
|
||||
|
||||
#: src/core/main.c:233
|
||||
#: src/core/main.c:227
|
||||
msgid "Run as a nested compositor"
|
||||
msgstr "Pokreni kao ugrađeni kompozitor"
|
||||
|
||||
#: src/core/main.c:239
|
||||
#: src/core/main.c:233
|
||||
msgid "Run wayland compositor without starting Xwayland"
|
||||
msgstr "Pokreni wayland kompozitor bez pokretanja Xwaylanda"
|
||||
|
||||
#: src/core/main.c:247
|
||||
#: src/core/main.c:241
|
||||
msgid "Run as a full display server, rather than nested"
|
||||
msgstr "Pokreni kao potpuni poslužitelj zaslona, radije nego ugrađeni"
|
||||
|
||||
#: src/core/main.c:253
|
||||
#: src/core/main.c:247
|
||||
msgid "Run with X11 backend"
|
||||
msgstr "Pokreni s X11 pozadinskim programom"
|
||||
|
||||
#. Translators: %s is a window title
|
||||
#: src/core/meta-close-dialog-default.c:148
|
||||
#: src/core/meta-close-dialog-default.c:150
|
||||
#, c-format
|
||||
msgid "“%s” is not responding."
|
||||
msgstr "“%s” ne odgovara."
|
||||
|
||||
#: src/core/meta-close-dialog-default.c:150
|
||||
#: src/core/meta-close-dialog-default.c:152
|
||||
msgid "Application is not responding."
|
||||
msgstr "Aplikacija ne odgovara."
|
||||
|
||||
#: src/core/meta-close-dialog-default.c:155
|
||||
#: src/core/meta-close-dialog-default.c:157
|
||||
msgid ""
|
||||
"You may choose to wait a short while for it to continue or force the "
|
||||
"application to quit entirely."
|
||||
@@ -629,15 +636,15 @@ msgstr ""
|
||||
"Možete pričekati neko vrijeme da aplikacija nastavi s radom ili možete "
|
||||
"prisiliti prekid rada aplikacije."
|
||||
|
||||
#: src/core/meta-close-dialog-default.c:162
|
||||
#: src/core/meta-close-dialog-default.c:164
|
||||
msgid "_Force Quit"
|
||||
msgstr "_Prisili izlaženje"
|
||||
|
||||
#: src/core/meta-close-dialog-default.c:162
|
||||
#: src/core/meta-close-dialog-default.c:164
|
||||
msgid "_Wait"
|
||||
msgstr "_Čekaj"
|
||||
|
||||
#: src/core/mutter.c:39
|
||||
#: src/core/mutter.c:38
|
||||
#, c-format
|
||||
msgid ""
|
||||
"mutter %s\n"
|
||||
@@ -652,20 +659,20 @@ msgstr ""
|
||||
"NE postoji jamstvo; čak i bez podrazumijevanih jamstava UPORABLJIVOSTI ZA "
|
||||
"ODREĐENU SVRHU.\n"
|
||||
|
||||
#: src/core/mutter.c:53
|
||||
#: src/core/mutter.c:52
|
||||
msgid "Print version"
|
||||
msgstr "Inačica za ispis"
|
||||
|
||||
#: src/core/mutter.c:59
|
||||
#: src/core/mutter.c:58
|
||||
msgid "Mutter plugin to use"
|
||||
msgstr "Mutter priključak koji se koristi"
|
||||
|
||||
#: src/core/prefs.c:1915
|
||||
#: src/core/prefs.c:1786
|
||||
#, c-format
|
||||
msgid "Workspace %d"
|
||||
msgstr "Radni prostor %d"
|
||||
|
||||
#: src/core/util.c:120
|
||||
#: src/core/util.c:121
|
||||
msgid "Mutter was compiled without support for verbose mode\n"
|
||||
msgstr "Mutter je kompiliran bez podrške za opširan način rada\n"
|
||||
|
||||
@@ -683,21 +690,21 @@ msgstr ""
|
||||
"Prikaz \"%s\" već ima upravitelja prozora; pokušajte koristiti --replace "
|
||||
"mogućnost za zamjenu trenutnog upravitelja prozora."
|
||||
|
||||
#: src/x11/meta-x11-display.c:1010
|
||||
#: src/x11/meta-x11-display.c:1008
|
||||
msgid "Failed to initialize GDK\n"
|
||||
msgstr "Neuspjelo GDK pokretanje\n"
|
||||
|
||||
#: src/x11/meta-x11-display.c:1034
|
||||
#: src/x11/meta-x11-display.c:1032
|
||||
#, c-format
|
||||
msgid "Failed to open X Window System display “%s”\n"
|
||||
msgstr "Neuspjelo otvaranje sustava prikaza X prozora \"%s\"\n"
|
||||
|
||||
#: src/x11/meta-x11-display.c:1117
|
||||
#: src/x11/meta-x11-display.c:1115
|
||||
#, c-format
|
||||
msgid "Screen %d on display “%s” is invalid\n"
|
||||
msgstr "Zaslon %d na prikazu '%s' je neispravan\n"
|
||||
|
||||
#: src/x11/session.c:1819
|
||||
#: src/x11/session.c:1821
|
||||
msgid ""
|
||||
"These windows do not support “save current setup” and will have to be "
|
||||
"restarted manually next time you log in."
|
||||
@@ -705,7 +712,7 @@ msgstr ""
|
||||
"Ovi prozori ne podržavaju mogućnost \"spremi trenutne postavke\" i moraju se "
|
||||
"ručno ponovno pokrenuti sljedeći puta kada se prijavite."
|
||||
|
||||
#: src/x11/window-props.c:565
|
||||
#: src/x11/window-props.c:568
|
||||
#, c-format
|
||||
msgid "%s (on %s)"
|
||||
msgstr "%s (na %s)"
|
||||
|
@@ -147,6 +147,10 @@ xkb_layout_index_t meta_backend_get_keymap_layout_group (MetaBackend *backend);
|
||||
|
||||
gboolean meta_backend_is_lid_closed (MetaBackend *backend);
|
||||
|
||||
void meta_backend_freeze_updates (MetaBackend *backend);
|
||||
|
||||
void meta_backend_thaw_updates (MetaBackend *backend);
|
||||
|
||||
void meta_backend_update_last_device (MetaBackend *backend,
|
||||
int device_id);
|
||||
|
||||
|
@@ -475,7 +475,7 @@ meta_backend_real_post_init (MetaBackend *backend)
|
||||
MetaBackendPrivate *priv = meta_backend_get_instance_private (backend);
|
||||
ClutterDeviceManager *device_manager = clutter_device_manager_get_default ();
|
||||
|
||||
priv->stage = meta_stage_new ();
|
||||
priv->stage = meta_stage_new (backend);
|
||||
clutter_actor_realize (priv->stage);
|
||||
META_BACKEND_GET_CLASS (backend)->select_stage_events (backend);
|
||||
|
||||
@@ -1079,6 +1079,24 @@ meta_backend_get_stage (MetaBackend *backend)
|
||||
return priv->stage;
|
||||
}
|
||||
|
||||
void
|
||||
meta_backend_freeze_updates (MetaBackend *backend)
|
||||
{
|
||||
ClutterStage *stage;
|
||||
|
||||
stage = CLUTTER_STAGE (meta_backend_get_stage (backend));
|
||||
clutter_stage_freeze_updates (stage);
|
||||
}
|
||||
|
||||
void
|
||||
meta_backend_thaw_updates (MetaBackend *backend)
|
||||
{
|
||||
ClutterStage *stage;
|
||||
|
||||
stage = CLUTTER_STAGE (meta_backend_get_stage (backend));
|
||||
clutter_stage_thaw_updates (stage);
|
||||
}
|
||||
|
||||
static gboolean
|
||||
update_last_device (MetaBackend *backend)
|
||||
{
|
||||
|
@@ -20,7 +20,7 @@
|
||||
*/
|
||||
|
||||
/**
|
||||
* SECTION:cursor-tracker
|
||||
* SECTION:meta-cursor-tracker
|
||||
* @title: MetaCursorTracker
|
||||
* @short_description: Mutter cursor tracking helper. Originally only
|
||||
* tracking the cursor image, now more of a "core
|
||||
|
@@ -20,6 +20,10 @@
|
||||
|
||||
#include "config.h"
|
||||
|
||||
#ifdef HAVE_LIBGUDEV
|
||||
#include <gudev/gudev.h>
|
||||
#endif
|
||||
|
||||
#include "meta-input-mapper-private.h"
|
||||
#include "meta-monitor-manager-private.h"
|
||||
#include "meta-logical-monitor.h"
|
||||
@@ -39,6 +43,9 @@ struct _MetaInputMapper
|
||||
ClutterDeviceManager *input_device_manager;
|
||||
GHashTable *input_devices; /* ClutterInputDevice -> MetaMapperInputInfo */
|
||||
GHashTable *output_devices; /* MetaLogicalMonitor -> MetaMapperOutputInfo */
|
||||
#ifdef HAVE_LIBGUDEV
|
||||
GUdevClient *udev_client;
|
||||
#endif
|
||||
};
|
||||
|
||||
typedef enum
|
||||
@@ -270,6 +277,33 @@ match_edid (MetaMapperInputInfo *input,
|
||||
return TRUE;
|
||||
}
|
||||
|
||||
static gboolean
|
||||
input_device_get_physical_size (MetaInputMapper *mapper,
|
||||
ClutterInputDevice *device,
|
||||
double *width,
|
||||
double *height)
|
||||
{
|
||||
#ifdef HAVE_LIBGUDEV
|
||||
g_autoptr (GUdevDevice) udev_device = NULL;
|
||||
const char *node;
|
||||
|
||||
node = clutter_input_device_get_device_node (device);
|
||||
udev_device = g_udev_client_query_by_device_file (mapper->udev_client, node);
|
||||
|
||||
if (udev_device &&
|
||||
g_udev_device_has_property (udev_device, "ID_INPUT_WIDTH_MM"))
|
||||
{
|
||||
*width = g_udev_device_get_property_as_double (udev_device,
|
||||
"ID_INPUT_WIDTH_MM");
|
||||
*height = g_udev_device_get_property_as_double (udev_device,
|
||||
"ID_INPUT_HEIGHT_MM");
|
||||
return TRUE;
|
||||
}
|
||||
#endif
|
||||
|
||||
return FALSE;
|
||||
}
|
||||
|
||||
static gboolean
|
||||
find_size_match (MetaMapperInputInfo *input,
|
||||
GList *monitors,
|
||||
@@ -282,7 +316,8 @@ find_size_match (MetaMapperInputInfo *input,
|
||||
|
||||
min_w_diff = min_h_diff = MAX_SIZE_MATCH_DIFF;
|
||||
|
||||
if (!clutter_input_device_get_physical_size (input->device, &i_width, &i_height))
|
||||
if (!input_device_get_physical_size (input->mapper, input->device,
|
||||
&i_width, &i_height))
|
||||
return FALSE;
|
||||
|
||||
for (l = monitors; l; l = l->next)
|
||||
@@ -520,6 +555,9 @@ meta_input_mapper_finalize (GObject *object)
|
||||
|
||||
g_hash_table_unref (mapper->input_devices);
|
||||
g_hash_table_unref (mapper->output_devices);
|
||||
#ifdef HAVE_LIBGUDEV
|
||||
g_clear_object (&mapper->udev_client);
|
||||
#endif
|
||||
|
||||
G_OBJECT_CLASS (meta_input_mapper_parent_class)->finalize (object);
|
||||
}
|
||||
@@ -527,11 +565,18 @@ meta_input_mapper_finalize (GObject *object)
|
||||
static void
|
||||
meta_input_mapper_constructed (GObject *object)
|
||||
{
|
||||
#ifdef HAVE_LIBGUDEV
|
||||
const char *udev_subsystems[] = { "input", NULL };
|
||||
#endif
|
||||
MetaInputMapper *mapper = META_INPUT_MAPPER (object);
|
||||
MetaBackend *backend;
|
||||
|
||||
G_OBJECT_CLASS (meta_input_mapper_parent_class)->constructed (object);
|
||||
|
||||
#ifdef HAVE_LIBGUDEV
|
||||
mapper->udev_client = g_udev_client_new (udev_subsystems);
|
||||
#endif
|
||||
|
||||
mapper->input_device_manager = clutter_device_manager_get_default ();
|
||||
g_signal_connect (mapper->input_device_manager, "device-removed",
|
||||
G_CALLBACK (input_mapper_device_removed_cb), mapper);
|
||||
|
@@ -1766,9 +1766,11 @@ power_save_mode_changed_cb (MetaMonitorManager *manager,
|
||||
ClutterInputDevice *device;
|
||||
MetaLogicalMonitor *logical_monitor;
|
||||
MetaMonitor *builtin;
|
||||
MetaPowerSave power_save_mode;
|
||||
gboolean on;
|
||||
|
||||
on = (manager->power_save_mode == META_POWER_SAVE_ON);
|
||||
power_save_mode = meta_monitor_manager_get_power_save_mode (manager);
|
||||
on = power_save_mode == META_POWER_SAVE_ON;
|
||||
priv = meta_input_settings_get_instance_private (user_data);
|
||||
|
||||
builtin = meta_monitor_manager_get_laptop_panel (manager);
|
||||
|
@@ -1540,7 +1540,7 @@ meta_verify_logical_monitor_config (MetaLogicalMonitorConfig *logical_monitor
|
||||
}
|
||||
|
||||
static gboolean
|
||||
has_adjecent_neighbour (MetaMonitorsConfig *config,
|
||||
has_adjacent_neighbour (MetaMonitorsConfig *config,
|
||||
MetaLogicalMonitorConfig *logical_monitor_config)
|
||||
{
|
||||
GList *l;
|
||||
@@ -1559,7 +1559,7 @@ has_adjecent_neighbour (MetaMonitorsConfig *config,
|
||||
if (logical_monitor_config == other_logical_monitor_config)
|
||||
continue;
|
||||
|
||||
if (meta_rectangle_is_adjecent_to (&logical_monitor_config->layout,
|
||||
if (meta_rectangle_is_adjacent_to (&logical_monitor_config->layout,
|
||||
&other_logical_monitor_config->layout))
|
||||
return TRUE;
|
||||
}
|
||||
@@ -1665,10 +1665,10 @@ meta_verify_monitors_config (MetaMonitorsConfig *config,
|
||||
has_primary = TRUE;
|
||||
}
|
||||
|
||||
if (!has_adjecent_neighbour (config, logical_monitor_config))
|
||||
if (!has_adjacent_neighbour (config, logical_monitor_config))
|
||||
{
|
||||
g_set_error (error, G_IO_ERROR, G_IO_ERROR_FAILED,
|
||||
"Logical monitors not adjecent");
|
||||
"Logical monitors not adjacent");
|
||||
return FALSE;
|
||||
}
|
||||
|
||||
|
@@ -116,8 +116,6 @@ struct _MetaMonitorManager
|
||||
gboolean in_init;
|
||||
unsigned int serial;
|
||||
|
||||
MetaPowerSave power_save_mode;
|
||||
|
||||
MetaLogicalMonitorLayoutMode layout_mode;
|
||||
|
||||
int screen_width;
|
||||
@@ -192,6 +190,8 @@ struct _MetaMonitorManagerClass
|
||||
GBytes* (*read_edid) (MetaMonitorManager *,
|
||||
MetaOutput *);
|
||||
|
||||
void (*read_current_state) (MetaMonitorManager *);
|
||||
|
||||
void (*ensure_initial_config) (MetaMonitorManager *);
|
||||
|
||||
gboolean (*apply_monitors_config) (MetaMonitorManager *,
|
||||
@@ -305,6 +305,11 @@ void meta_monitor_manager_get_screen_size (MetaMonitorManager *
|
||||
int *width,
|
||||
int *height);
|
||||
|
||||
MetaPowerSave meta_monitor_manager_get_power_save_mode (MetaMonitorManager *manager);
|
||||
|
||||
void meta_monitor_manager_power_save_mode_changed (MetaMonitorManager *manager,
|
||||
MetaPowerSave mode);
|
||||
|
||||
void meta_monitor_manager_confirm_configuration (MetaMonitorManager *manager,
|
||||
gboolean ok);
|
||||
|
||||
|
@@ -95,7 +95,13 @@ static gfloat transform_matrices[][6] = {
|
||||
|
||||
static int signals[SIGNALS_LAST];
|
||||
|
||||
G_DEFINE_TYPE (MetaMonitorManager, meta_monitor_manager, G_TYPE_OBJECT)
|
||||
typedef struct _MetaMonitorManagerPrivate
|
||||
{
|
||||
MetaPowerSave power_save_mode;
|
||||
} MetaMonitorManagerPrivate;
|
||||
|
||||
G_DEFINE_TYPE_WITH_PRIVATE (MetaMonitorManager, meta_monitor_manager,
|
||||
G_TYPE_OBJECT)
|
||||
|
||||
static void initialize_dbus_interface (MetaMonitorManager *manager);
|
||||
static void monitor_manager_setup_dbus_config_handlers (MetaMonitorManager *manager);
|
||||
@@ -107,6 +113,9 @@ meta_monitor_manager_is_config_complete (MetaMonitorManager *manager,
|
||||
static MetaMonitor *
|
||||
meta_monitor_manager_get_active_monitor (MetaMonitorManager *manager);
|
||||
|
||||
static void
|
||||
meta_monitor_manager_real_read_current_state (MetaMonitorManager *manager);
|
||||
|
||||
MetaBackend *
|
||||
meta_monitor_manager_get_backend (MetaMonitorManager *manager)
|
||||
{
|
||||
@@ -329,11 +338,24 @@ meta_monitor_manager_rebuild_logical_monitors_derived (MetaMonitorManager *manag
|
||||
primary_logical_monitor);
|
||||
}
|
||||
|
||||
void
|
||||
meta_monitor_manager_power_save_mode_changed (MetaMonitorManager *manager,
|
||||
MetaPowerSave mode)
|
||||
{
|
||||
MetaMonitorManagerPrivate *priv =
|
||||
meta_monitor_manager_get_instance_private (manager);
|
||||
|
||||
priv->power_save_mode = mode;
|
||||
g_signal_emit (manager, signals[POWER_SAVE_MODE_CHANGED], 0);
|
||||
}
|
||||
|
||||
static void
|
||||
power_save_mode_changed (MetaMonitorManager *manager,
|
||||
GParamSpec *pspec,
|
||||
gpointer user_data)
|
||||
{
|
||||
MetaMonitorManagerPrivate *priv =
|
||||
meta_monitor_manager_get_instance_private (manager);
|
||||
MetaMonitorManagerClass *klass;
|
||||
int mode = meta_dbus_display_config_get_power_save_mode (manager->display_config);
|
||||
|
||||
@@ -341,7 +363,7 @@ power_save_mode_changed (MetaMonitorManager *manager,
|
||||
return;
|
||||
|
||||
/* If DPMS is unsupported, force the property back. */
|
||||
if (manager->power_save_mode == META_POWER_SAVE_UNSUPPORTED)
|
||||
if (priv->power_save_mode == META_POWER_SAVE_UNSUPPORTED)
|
||||
{
|
||||
meta_dbus_display_config_set_power_save_mode (manager->display_config, META_POWER_SAVE_UNSUPPORTED);
|
||||
return;
|
||||
@@ -351,9 +373,7 @@ power_save_mode_changed (MetaMonitorManager *manager,
|
||||
if (klass->set_power_save_mode)
|
||||
klass->set_power_save_mode (manager, mode);
|
||||
|
||||
manager->power_save_mode = mode;
|
||||
|
||||
g_signal_emit (manager, signals[POWER_SAVE_MODE_CHANGED], 0);
|
||||
meta_monitor_manager_power_save_mode_changed (manager, mode);
|
||||
}
|
||||
|
||||
void
|
||||
@@ -855,6 +875,7 @@ meta_monitor_manager_class_init (MetaMonitorManagerClass *klass)
|
||||
object_class->set_property = meta_monitor_manager_set_property;
|
||||
|
||||
klass->read_edid = meta_monitor_manager_real_read_edid;
|
||||
klass->read_current_state = meta_monitor_manager_real_read_current_state;
|
||||
|
||||
signals[MONITORS_CHANGED] =
|
||||
g_signal_new ("monitors-changed",
|
||||
@@ -2684,6 +2705,15 @@ meta_monitor_manager_get_screen_size (MetaMonitorManager *manager,
|
||||
*height = manager->screen_height;
|
||||
}
|
||||
|
||||
MetaPowerSave
|
||||
meta_monitor_manager_get_power_save_mode (MetaMonitorManager *manager)
|
||||
{
|
||||
MetaMonitorManagerPrivate *priv =
|
||||
meta_monitor_manager_get_instance_private (manager);
|
||||
|
||||
return priv->power_save_mode;
|
||||
}
|
||||
|
||||
static void
|
||||
rebuild_monitors (MetaMonitorManager *manager)
|
||||
{
|
||||
@@ -2760,8 +2790,8 @@ meta_monitor_manager_is_transform_handled (MetaMonitorManager *manager,
|
||||
return manager_class->is_transform_handled (manager, crtc, transform);
|
||||
}
|
||||
|
||||
void
|
||||
meta_monitor_manager_read_current_state (MetaMonitorManager *manager)
|
||||
static void
|
||||
meta_monitor_manager_real_read_current_state (MetaMonitorManager *manager)
|
||||
{
|
||||
GList *l;
|
||||
|
||||
@@ -2782,6 +2812,15 @@ meta_monitor_manager_read_current_state (MetaMonitorManager *manager)
|
||||
rebuild_monitors (manager);
|
||||
}
|
||||
|
||||
void
|
||||
meta_monitor_manager_read_current_state (MetaMonitorManager *manager)
|
||||
{
|
||||
MetaMonitorManagerClass *manager_class =
|
||||
META_MONITOR_MANAGER_GET_CLASS (manager);
|
||||
|
||||
manager_class->read_current_state (manager);
|
||||
}
|
||||
|
||||
static void
|
||||
meta_monitor_manager_notify_monitors_changed (MetaMonitorManager *manager)
|
||||
{
|
||||
|
@@ -23,12 +23,13 @@
|
||||
#include "backends/meta-cursor.h"
|
||||
#include "meta/boxes.h"
|
||||
#include "meta/meta-stage.h"
|
||||
#include "meta/types.h"
|
||||
|
||||
G_BEGIN_DECLS
|
||||
|
||||
typedef struct _MetaOverlay MetaOverlay;
|
||||
|
||||
ClutterActor *meta_stage_new (void);
|
||||
ClutterActor *meta_stage_new (MetaBackend *backend);
|
||||
|
||||
MetaOverlay *meta_stage_create_cursor_overlay (MetaStage *stage);
|
||||
void meta_stage_remove_cursor_overlay (MetaStage *stage,
|
||||
|
@@ -180,6 +180,15 @@ meta_stage_deactivate (ClutterStage *actor)
|
||||
stage->is_active = FALSE;
|
||||
}
|
||||
|
||||
static void
|
||||
on_power_save_changed (MetaMonitorManager *monitor_manager,
|
||||
MetaStage *stage)
|
||||
{
|
||||
if (meta_monitor_manager_get_power_save_mode (monitor_manager) ==
|
||||
META_POWER_SAVE_ON)
|
||||
clutter_actor_queue_redraw (CLUTTER_ACTOR (stage));
|
||||
}
|
||||
|
||||
static void
|
||||
meta_stage_class_init (MetaStageClass *klass)
|
||||
{
|
||||
@@ -209,11 +218,21 @@ meta_stage_init (MetaStage *stage)
|
||||
}
|
||||
|
||||
ClutterActor *
|
||||
meta_stage_new (void)
|
||||
meta_stage_new (MetaBackend *backend)
|
||||
{
|
||||
return g_object_new (META_TYPE_STAGE,
|
||||
"cursor-visible", FALSE,
|
||||
NULL);
|
||||
MetaStage *stage;
|
||||
MetaMonitorManager *monitor_manager;
|
||||
|
||||
stage = g_object_new (META_TYPE_STAGE,
|
||||
"cursor-visible", FALSE,
|
||||
NULL);
|
||||
|
||||
monitor_manager = meta_backend_get_monitor_manager (backend);
|
||||
g_signal_connect (monitor_manager, "power-save-mode-changed",
|
||||
G_CALLBACK (on_power_save_changed),
|
||||
stage);
|
||||
|
||||
return CLUTTER_ACTOR (stage);
|
||||
}
|
||||
|
||||
static void
|
||||
|
@@ -41,9 +41,6 @@
|
||||
typedef struct _MetaCrtcKms
|
||||
{
|
||||
unsigned int index;
|
||||
uint32_t underscan_prop_id;
|
||||
uint32_t underscan_hborder_prop_id;
|
||||
uint32_t underscan_vborder_prop_id;
|
||||
uint32_t primary_plane_id;
|
||||
uint32_t rotation_prop_id;
|
||||
uint32_t rotation_map[ALL_TRANSFORMS];
|
||||
@@ -137,54 +134,6 @@ meta_crtc_kms_apply_transform (MetaCrtc *crtc)
|
||||
}
|
||||
}
|
||||
|
||||
void
|
||||
meta_crtc_kms_set_underscan (MetaCrtc *crtc,
|
||||
gboolean is_underscanning)
|
||||
{
|
||||
MetaCrtcKms *crtc_kms = crtc->driver_private;
|
||||
MetaGpu *gpu = meta_crtc_get_gpu (crtc);
|
||||
MetaGpuKms *gpu_kms = META_GPU_KMS (gpu);
|
||||
int kms_fd;
|
||||
|
||||
if (!crtc_kms->underscan_prop_id)
|
||||
return;
|
||||
|
||||
kms_fd = meta_gpu_kms_get_fd (gpu_kms);
|
||||
|
||||
if (is_underscanning)
|
||||
{
|
||||
drmModeObjectSetProperty (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;
|
||||
|
||||
value = crtc->current_mode->width * 0.05;
|
||||
drmModeObjectSetProperty (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;
|
||||
|
||||
value = crtc->current_mode->height * 0.05;
|
||||
drmModeObjectSetProperty (kms_fd, crtc->crtc_id,
|
||||
DRM_MODE_OBJECT_CRTC,
|
||||
crtc_kms->underscan_vborder_prop_id, value);
|
||||
}
|
||||
|
||||
}
|
||||
else
|
||||
{
|
||||
drmModeObjectSetProperty (kms_fd, crtc->crtc_id,
|
||||
DRM_MODE_OBJECT_CRTC,
|
||||
crtc_kms->underscan_prop_id, (uint64_t) 0);
|
||||
}
|
||||
}
|
||||
|
||||
static int
|
||||
find_property_index (MetaGpu *gpu,
|
||||
drmModeObjectPropertiesPtr props,
|
||||
@@ -533,43 +482,6 @@ init_crtc_rotations (MetaCrtc *crtc,
|
||||
}
|
||||
}
|
||||
|
||||
static void
|
||||
find_crtc_properties (MetaCrtc *crtc,
|
||||
MetaGpuKms *gpu_kms)
|
||||
{
|
||||
MetaCrtcKms *crtc_kms = crtc->driver_private;
|
||||
int kms_fd;
|
||||
drmModeObjectPropertiesPtr props;
|
||||
unsigned int i;
|
||||
|
||||
kms_fd = meta_gpu_kms_get_fd (gpu_kms);
|
||||
props = drmModeObjectGetProperties (kms_fd, crtc->crtc_id,
|
||||
DRM_MODE_OBJECT_CRTC);
|
||||
if (!props)
|
||||
return;
|
||||
|
||||
for (i = 0; i < props->count_props; i++)
|
||||
{
|
||||
drmModePropertyPtr prop = drmModeGetProperty (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);
|
||||
}
|
||||
|
||||
drmModeFreeObjectProperties (props);
|
||||
}
|
||||
|
||||
static void
|
||||
meta_crtc_destroy_notify (MetaCrtc *crtc)
|
||||
{
|
||||
@@ -628,7 +540,6 @@ meta_create_kms_crtc (MetaGpuKms *gpu_kms,
|
||||
crtc->driver_private = crtc_kms;
|
||||
crtc->driver_notify = (GDestroyNotify) meta_crtc_destroy_notify;
|
||||
|
||||
find_crtc_properties (crtc, gpu_kms);
|
||||
init_crtc_rotations (crtc, gpu);
|
||||
|
||||
return crtc;
|
||||
|
@@ -44,9 +44,6 @@ gboolean meta_crtc_kms_is_transform_handled (MetaCrtc *crtc,
|
||||
|
||||
void meta_crtc_kms_apply_transform (MetaCrtc *crtc);
|
||||
|
||||
void meta_crtc_kms_set_underscan (MetaCrtc *crtc,
|
||||
gboolean is_underscanning);
|
||||
|
||||
GArray * meta_crtc_kms_get_modifiers (MetaCrtc *crtc,
|
||||
uint32_t format);
|
||||
|
||||
|
@@ -210,7 +210,7 @@ meta_gpu_kms_is_crtc_active (MetaGpuKms *gpu_kms,
|
||||
|
||||
g_assert (meta_crtc_get_gpu (crtc) == META_GPU (gpu_kms));
|
||||
|
||||
if (monitor_manager->power_save_mode != META_POWER_SAVE_ON)
|
||||
if (meta_monitor_manager_get_power_save_mode (monitor_manager))
|
||||
return FALSE;
|
||||
|
||||
connected_crtc_found = FALSE;
|
||||
@@ -273,7 +273,8 @@ meta_gpu_kms_flip_crtc (MetaGpuKms *gpu_kms,
|
||||
int ret = -1;
|
||||
|
||||
g_assert (meta_crtc_get_gpu (crtc) == gpu);
|
||||
g_assert (monitor_manager->power_save_mode == META_POWER_SAVE_ON);
|
||||
g_assert (meta_monitor_manager_get_power_save_mode (monitor_manager) ==
|
||||
META_POWER_SAVE_ON);
|
||||
|
||||
get_crtc_drm_connectors (gpu, crtc, &connectors, &n_connectors);
|
||||
g_assert (n_connectors > 0);
|
||||
@@ -836,8 +837,6 @@ meta_gpu_kms_read_current (MetaGpu *gpu,
|
||||
GError **error)
|
||||
{
|
||||
MetaGpuKms *gpu_kms = META_GPU_KMS (gpu);
|
||||
MetaMonitorManager *monitor_manager =
|
||||
meta_gpu_get_monitor_manager (gpu);
|
||||
MetaKmsResources resources;
|
||||
g_autoptr (GError) local_error = NULL;
|
||||
|
||||
@@ -855,8 +854,6 @@ meta_gpu_kms_read_current (MetaGpu *gpu,
|
||||
gpu_kms->max_buffer_width = resources.resources->max_width;
|
||||
gpu_kms->max_buffer_height = resources.resources->max_height;
|
||||
|
||||
monitor_manager->power_save_mode = META_POWER_SAVE_ON;
|
||||
|
||||
/* Note: we must not free the public structures (output, crtc, monitor
|
||||
mode and monitor info) here, they must be kept alive until the API
|
||||
users are done with them after we emit monitors-changed, and thus
|
||||
|
@@ -108,6 +108,21 @@ meta_monitor_manager_kms_read_edid (MetaMonitorManager *manager,
|
||||
return meta_output_kms_read_edid (output);
|
||||
}
|
||||
|
||||
static void
|
||||
meta_monitor_manager_kms_read_current_state (MetaMonitorManager *manager)
|
||||
{
|
||||
MetaMonitorManagerClass *parent_class =
|
||||
META_MONITOR_MANAGER_CLASS (meta_monitor_manager_kms_parent_class);
|
||||
MetaPowerSave power_save_mode;
|
||||
|
||||
power_save_mode = meta_monitor_manager_get_power_save_mode (manager);
|
||||
if (power_save_mode != META_POWER_SAVE_ON)
|
||||
meta_monitor_manager_power_save_mode_changed (manager,
|
||||
META_POWER_SAVE_ON);
|
||||
|
||||
parent_class->read_current_state (manager);
|
||||
}
|
||||
|
||||
static void
|
||||
meta_monitor_manager_kms_set_power_save_mode (MetaMonitorManager *manager,
|
||||
MetaPowerSave mode)
|
||||
@@ -755,6 +770,7 @@ meta_monitor_manager_kms_class_init (MetaMonitorManagerKmsClass *klass)
|
||||
object_class->dispose = meta_monitor_manager_kms_dispose;
|
||||
|
||||
manager_class->read_edid = meta_monitor_manager_kms_read_edid;
|
||||
manager_class->read_current_state = meta_monitor_manager_kms_read_current_state;
|
||||
manager_class->ensure_initial_config = meta_monitor_manager_kms_ensure_initial_config;
|
||||
manager_class->apply_monitors_config = meta_monitor_manager_kms_apply_monitors_config;
|
||||
manager_class->set_power_save_mode = meta_monitor_manager_kms_set_power_save_mode;
|
||||
|
@@ -56,6 +56,10 @@ typedef struct _MetaOutputKms
|
||||
uint32_t edid_blob_id;
|
||||
uint32_t tile_blob_id;
|
||||
|
||||
uint32_t underscan_prop_id;
|
||||
uint32_t underscan_hborder_prop_id;
|
||||
uint32_t underscan_vborder_prop_id;
|
||||
|
||||
int suggested_x;
|
||||
int suggested_y;
|
||||
uint32_t hotplug_mode_update;
|
||||
@@ -66,13 +70,55 @@ typedef struct _MetaOutputKms
|
||||
void
|
||||
meta_output_kms_set_underscan (MetaOutput *output)
|
||||
{
|
||||
MetaOutputKms *output_kms = output->driver_private;
|
||||
MetaGpu *gpu = meta_output_get_gpu (output);
|
||||
MetaGpuKms *gpu_kms = META_GPU_KMS (gpu);
|
||||
MetaCrtc *crtc;
|
||||
int kms_fd;
|
||||
uint32_t connector_id;
|
||||
|
||||
crtc = meta_output_get_assigned_crtc (output);
|
||||
if (!crtc)
|
||||
if (!output_kms->underscan_prop_id)
|
||||
return;
|
||||
|
||||
meta_crtc_kms_set_underscan (crtc, output->is_underscanning);
|
||||
crtc = meta_output_get_assigned_crtc (output);
|
||||
kms_fd = meta_gpu_kms_get_fd (gpu_kms);
|
||||
connector_id = output_kms->connector->connector_id;
|
||||
|
||||
if (output->is_underscanning && crtc && crtc->current_mode)
|
||||
{
|
||||
drmModeObjectSetProperty (kms_fd, connector_id,
|
||||
DRM_MODE_OBJECT_CONNECTOR,
|
||||
output_kms->underscan_prop_id,
|
||||
(uint64_t) 1);
|
||||
|
||||
if (output_kms->underscan_hborder_prop_id)
|
||||
{
|
||||
uint64_t value;
|
||||
|
||||
value = MIN (128, crtc->current_mode->width * 0.05);
|
||||
drmModeObjectSetProperty (kms_fd, connector_id,
|
||||
DRM_MODE_OBJECT_CONNECTOR,
|
||||
output_kms->underscan_hborder_prop_id,
|
||||
value);
|
||||
}
|
||||
if (output_kms->underscan_vborder_prop_id)
|
||||
{
|
||||
uint64_t value;
|
||||
|
||||
value = MIN (128, crtc->current_mode->height * 0.05);
|
||||
drmModeObjectSetProperty (kms_fd, connector_id,
|
||||
DRM_MODE_OBJECT_CONNECTOR,
|
||||
output_kms->underscan_vborder_prop_id,
|
||||
value);
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
drmModeObjectSetProperty (kms_fd, connector_id,
|
||||
DRM_MODE_OBJECT_CONNECTOR,
|
||||
output_kms->underscan_prop_id,
|
||||
(uint64_t) 0);
|
||||
}
|
||||
}
|
||||
|
||||
uint32_t
|
||||
@@ -312,6 +358,15 @@ find_connector_properties (MetaGpuKms *gpu_kms,
|
||||
strcmp (prop->name, "panel orientation") == 0)
|
||||
handle_panel_orientation (output, prop,
|
||||
output_kms->connector->prop_values[i]);
|
||||
else if ((prop->flags & DRM_MODE_PROP_ENUM) &&
|
||||
strcmp (prop->name, "underscan") == 0)
|
||||
output_kms->underscan_prop_id = prop->prop_id;
|
||||
else if ((prop->flags & DRM_MODE_PROP_RANGE) &&
|
||||
strcmp (prop->name, "underscan hborder") == 0)
|
||||
output_kms->underscan_hborder_prop_id = prop->prop_id;
|
||||
else if ((prop->flags & DRM_MODE_PROP_RANGE) &&
|
||||
strcmp (prop->name, "underscan vborder") == 0)
|
||||
output_kms->underscan_vborder_prop_id = prop->prop_id;
|
||||
|
||||
drmModeFreeProperty (prop);
|
||||
}
|
||||
@@ -639,6 +694,7 @@ meta_create_kms_output (MetaGpuKms *gpu_kms,
|
||||
output->suggested_x = output_kms->suggested_x;
|
||||
output->suggested_y = output_kms->suggested_y;
|
||||
output->hotplug_mode_update = output_kms->hotplug_mode_update;
|
||||
output->supports_underscanning = output_kms->underscan_prop_id != 0;
|
||||
|
||||
if (output_kms->edid_blob_id != 0)
|
||||
{
|
||||
|
@@ -103,8 +103,6 @@ typedef struct _MetaRendererNativeGpuData
|
||||
#ifdef HAVE_EGL_DEVICE
|
||||
struct {
|
||||
EGLDeviceEXT device;
|
||||
|
||||
gboolean no_egl_output_drm_flip_event;
|
||||
} egl;
|
||||
#endif
|
||||
|
||||
@@ -215,6 +213,9 @@ struct _MetaRendererNative
|
||||
|
||||
int64_t frame_counter;
|
||||
gboolean pending_unset_disabled_crtcs;
|
||||
|
||||
GList *power_save_page_flip_closures;
|
||||
guint power_save_page_flip_source_id;
|
||||
};
|
||||
|
||||
static void
|
||||
@@ -257,6 +258,15 @@ cogl_pixel_format_from_drm_format (uint32_t drm_format,
|
||||
CoglPixelFormat *out_format,
|
||||
CoglTextureComponents *out_components);
|
||||
|
||||
static MetaBackend *
|
||||
backend_from_renderer_native (MetaRendererNative *renderer_native)
|
||||
{
|
||||
MetaMonitorManager *monitor_manager =
|
||||
META_MONITOR_MANAGER (renderer_native->monitor_manager_kms);
|
||||
|
||||
return meta_monitor_manager_get_backend (monitor_manager);
|
||||
}
|
||||
|
||||
static void
|
||||
meta_renderer_native_gpu_data_free (MetaRendererNativeGpuData *renderer_gpu_data)
|
||||
{
|
||||
@@ -1485,8 +1495,6 @@ flip_egl_stream (MetaOnscreenNative *onscreen_native,
|
||||
renderer_gpu_data =
|
||||
meta_renderer_native_get_gpu_data (onscreen_native->renderer_native,
|
||||
onscreen_native->render_gpu);
|
||||
if (renderer_gpu_data->egl.no_egl_output_drm_flip_event)
|
||||
return FALSE;
|
||||
|
||||
closure_container =
|
||||
meta_gpu_kms_wrap_flip_closure (onscreen_native->render_gpu,
|
||||
@@ -1509,9 +1517,7 @@ flip_egl_stream (MetaOnscreenNative *onscreen_native,
|
||||
if (error->domain != META_EGL_ERROR ||
|
||||
error->code != EGL_RESOURCE_BUSY_EXT)
|
||||
{
|
||||
g_warning ("Failed to flip EGL stream (%s), relying on clock from "
|
||||
"now on", error->message);
|
||||
renderer_gpu_data->egl.no_egl_output_drm_flip_event = TRUE;
|
||||
g_warning ("Failed to flip EGL stream: %s", error->message);
|
||||
}
|
||||
g_error_free (error);
|
||||
meta_gpu_kms_flip_closure_container_free (closure_container);
|
||||
@@ -1532,6 +1538,38 @@ is_timestamp_earlier_than (uint64_t ts1,
|
||||
return ts2 - ts1 < UINT64_MAX / 2;
|
||||
}
|
||||
|
||||
static gboolean
|
||||
dummy_power_save_page_flip_cb (gpointer user_data)
|
||||
{
|
||||
MetaRendererNative *renderer_native = user_data;
|
||||
|
||||
g_list_free_full (renderer_native->power_save_page_flip_closures,
|
||||
(GDestroyNotify) g_closure_unref);
|
||||
renderer_native->power_save_page_flip_closures = NULL;
|
||||
renderer_native->power_save_page_flip_source_id = 0;
|
||||
|
||||
return G_SOURCE_REMOVE;
|
||||
}
|
||||
|
||||
static void
|
||||
queue_dummy_power_save_page_flip (MetaRendererNative *renderer_native,
|
||||
GClosure *flip_closure)
|
||||
{
|
||||
const unsigned int timeout_ms = 100;
|
||||
|
||||
if (!renderer_native->power_save_page_flip_source_id)
|
||||
{
|
||||
renderer_native->power_save_page_flip_source_id =
|
||||
g_timeout_add (timeout_ms,
|
||||
dummy_power_save_page_flip_cb,
|
||||
renderer_native);
|
||||
}
|
||||
|
||||
renderer_native->power_save_page_flip_closures =
|
||||
g_list_prepend (renderer_native->power_save_page_flip_closures,
|
||||
g_closure_ref (flip_closure));
|
||||
}
|
||||
|
||||
typedef struct _RetryPageFlipData
|
||||
{
|
||||
MetaCrtc *crtc;
|
||||
@@ -1547,14 +1585,39 @@ retry_page_flip_data_free (RetryPageFlipData *retry_page_flip_data)
|
||||
g_free (retry_page_flip_data);
|
||||
}
|
||||
|
||||
static void
|
||||
retry_page_flip_data_fake_flipped (RetryPageFlipData *retry_page_flip_data,
|
||||
MetaOnscreenNative *onscreen_native)
|
||||
{
|
||||
MetaCrtc *crtc = retry_page_flip_data->crtc;
|
||||
MetaGpuKms *gpu_kms = META_GPU_KMS (meta_crtc_get_gpu (crtc));
|
||||
|
||||
if (gpu_kms != onscreen_native->render_gpu)
|
||||
{
|
||||
MetaOnscreenNativeSecondaryGpuState *secondary_gpu_state;
|
||||
|
||||
secondary_gpu_state =
|
||||
meta_onscreen_native_get_secondary_gpu_state (onscreen_native,
|
||||
gpu_kms);
|
||||
secondary_gpu_state->pending_flips--;
|
||||
}
|
||||
|
||||
onscreen_native->total_pending_flips--;
|
||||
}
|
||||
|
||||
static gboolean
|
||||
retry_page_flips (gpointer user_data)
|
||||
{
|
||||
MetaOnscreenNative *onscreen_native = user_data;
|
||||
MetaRendererNative *renderer_native = onscreen_native->renderer_native;
|
||||
MetaMonitorManager *monitor_manager =
|
||||
META_MONITOR_MANAGER (renderer_native->monitor_manager_kms);
|
||||
uint64_t now_us;
|
||||
MetaPowerSave power_save_mode;
|
||||
GList *l;
|
||||
|
||||
now_us = g_source_get_time (onscreen_native->retry_page_flips_source);
|
||||
power_save_mode = meta_monitor_manager_get_power_save_mode (monitor_manager);
|
||||
|
||||
l = onscreen_native->pending_page_flip_retries;
|
||||
while (l)
|
||||
@@ -1566,6 +1629,19 @@ retry_page_flips (gpointer user_data)
|
||||
g_autoptr (GError) error = NULL;
|
||||
gboolean did_flip;
|
||||
|
||||
if (power_save_mode != META_POWER_SAVE_ON)
|
||||
{
|
||||
onscreen_native->pending_page_flip_retries =
|
||||
g_list_remove_link (onscreen_native->pending_page_flip_retries, l);
|
||||
|
||||
retry_page_flip_data_fake_flipped (retry_page_flip_data,
|
||||
onscreen_native);
|
||||
retry_page_flip_data_free (retry_page_flip_data);
|
||||
|
||||
l = l_next;
|
||||
continue;
|
||||
}
|
||||
|
||||
if (is_timestamp_earlier_than (now_us,
|
||||
retry_page_flip_data->retry_time_us))
|
||||
{
|
||||
@@ -1582,7 +1658,7 @@ retry_page_flips (gpointer user_data)
|
||||
g_error_matches (error, G_IO_ERROR, G_IO_ERROR_BUSY))
|
||||
{
|
||||
retry_page_flip_data->retry_time_us +=
|
||||
G_USEC_PER_SEC / crtc->current_mode->refresh_rate;
|
||||
(uint64_t) (G_USEC_PER_SEC / crtc->current_mode->refresh_rate);
|
||||
l = l_next;
|
||||
continue;
|
||||
}
|
||||
@@ -1597,17 +1673,8 @@ retry_page_flips (gpointer user_data)
|
||||
G_IO_ERROR_PERMISSION_DENIED))
|
||||
g_critical ("Failed to page flip: %s", error->message);
|
||||
|
||||
if (gpu_kms != onscreen_native->render_gpu)
|
||||
{
|
||||
MetaOnscreenNativeSecondaryGpuState *secondary_gpu_state;
|
||||
|
||||
secondary_gpu_state =
|
||||
meta_onscreen_native_get_secondary_gpu_state (onscreen_native,
|
||||
gpu_kms);
|
||||
secondary_gpu_state->pending_flips--;
|
||||
}
|
||||
|
||||
onscreen_native->total_pending_flips--;
|
||||
retry_page_flip_data_fake_flipped (retry_page_flip_data,
|
||||
onscreen_native);
|
||||
}
|
||||
|
||||
retry_page_flip_data_free (retry_page_flip_data);
|
||||
@@ -1636,6 +1703,9 @@ retry_page_flips (gpointer user_data)
|
||||
}
|
||||
else
|
||||
{
|
||||
MetaBackend *backend = backend_from_renderer_native (renderer_native);
|
||||
|
||||
meta_backend_thaw_updates (backend);
|
||||
g_clear_pointer (&onscreen_native->retry_page_flips_source,
|
||||
g_source_unref);
|
||||
return G_SOURCE_REMOVE;
|
||||
@@ -1666,7 +1736,7 @@ schedule_retry_page_flip (MetaOnscreenNative *onscreen_native,
|
||||
|
||||
now_us = g_get_monotonic_time ();
|
||||
retry_time_us =
|
||||
now_us + (G_USEC_PER_SEC / crtc->current_mode->refresh_rate);
|
||||
now_us + (uint64_t) (G_USEC_PER_SEC / crtc->current_mode->refresh_rate);
|
||||
|
||||
retry_page_flip_data = g_new0 (RetryPageFlipData, 1);
|
||||
retry_page_flip_data->crtc = crtc;
|
||||
@@ -1676,6 +1746,8 @@ schedule_retry_page_flip (MetaOnscreenNative *onscreen_native,
|
||||
|
||||
if (!onscreen_native->retry_page_flips_source)
|
||||
{
|
||||
MetaBackend *backend =
|
||||
backend_from_renderer_native (onscreen_native->renderer_native);
|
||||
GSource *source;
|
||||
|
||||
source = g_source_new (&retry_page_flips_source_funcs, sizeof (GSource));
|
||||
@@ -1684,6 +1756,7 @@ schedule_retry_page_flip (MetaOnscreenNative *onscreen_native,
|
||||
g_source_attach (source, NULL);
|
||||
|
||||
onscreen_native->retry_page_flips_source = source;
|
||||
meta_backend_freeze_updates (backend);
|
||||
}
|
||||
else
|
||||
{
|
||||
@@ -1725,12 +1798,8 @@ meta_onscreen_native_flip_crtc (CoglOnscreen *onscreen,
|
||||
uint32_t fb_id;
|
||||
|
||||
gpu_kms = META_GPU_KMS (meta_crtc_get_gpu (crtc));
|
||||
if (!meta_gpu_kms_is_crtc_active (gpu_kms, crtc))
|
||||
{
|
||||
g_set_error (error, G_IO_ERROR, G_IO_ERROR_FAILED,
|
||||
"Tried to flip inactive CRTC");
|
||||
return FALSE;
|
||||
}
|
||||
|
||||
g_assert (meta_gpu_kms_is_crtc_active (gpu_kms, crtc));
|
||||
|
||||
renderer_gpu_data = meta_renderer_native_get_gpu_data (renderer_native,
|
||||
render_gpu);
|
||||
@@ -1971,7 +2040,11 @@ meta_onscreen_native_flip_crtcs (CoglOnscreen *onscreen)
|
||||
CoglOnscreenEGL *onscreen_egl = onscreen->winsys;
|
||||
MetaOnscreenNative *onscreen_native = onscreen_egl->platform;
|
||||
MetaRendererView *view = onscreen_native->view;
|
||||
MetaRendererNative *renderer_native = onscreen_native->renderer_native;
|
||||
MetaMonitorManager *monitor_manager =
|
||||
META_MONITOR_MANAGER (renderer_native->monitor_manager_kms);
|
||||
GClosure *flip_closure;
|
||||
MetaPowerSave power_save_mode;
|
||||
MetaLogicalMonitor *logical_monitor;
|
||||
|
||||
/*
|
||||
@@ -1989,23 +2062,28 @@ meta_onscreen_native_flip_crtcs (CoglOnscreen *onscreen)
|
||||
(GClosureNotify) flip_closure_destroyed);
|
||||
g_closure_set_marshal (flip_closure, meta_marshal_VOID__OBJECT_OBJECT_INT64);
|
||||
|
||||
/* Either flip the CRTC's of the monitor info, if we are drawing just part
|
||||
* of the stage, or all of the CRTC's if we are drawing the whole stage.
|
||||
*/
|
||||
FlipCrtcData data = {
|
||||
.onscreen = onscreen,
|
||||
.flip_closure = flip_closure,
|
||||
};
|
||||
logical_monitor = meta_renderer_view_get_logical_monitor (view);
|
||||
meta_logical_monitor_foreach_crtc (logical_monitor, flip_crtc, &data);
|
||||
power_save_mode = meta_monitor_manager_get_power_save_mode (monitor_manager);
|
||||
if (power_save_mode == META_POWER_SAVE_ON)
|
||||
{
|
||||
FlipCrtcData data = {
|
||||
.onscreen = onscreen,
|
||||
.flip_closure = flip_closure,
|
||||
};
|
||||
logical_monitor = meta_renderer_view_get_logical_monitor (view);
|
||||
meta_logical_monitor_foreach_crtc (logical_monitor, flip_crtc, &data);
|
||||
|
||||
/*
|
||||
* If we didn't queue a page flip, but instead directly changed the mode due
|
||||
* to the driver not supporting mode setting, wes must swap the buffers
|
||||
* directly as we won't get a page flip callback.
|
||||
*/
|
||||
if (!data.did_flip && data.did_mode_set)
|
||||
meta_onscreen_native_swap_drm_fb (onscreen);
|
||||
/*
|
||||
* If we didn't queue a page flip, but instead directly changed the mode
|
||||
* due to the driver not supporting mode setting, we must swap the
|
||||
* buffers directly as we won't get a page flip callback.
|
||||
*/
|
||||
if (!data.did_flip && data.did_mode_set)
|
||||
meta_onscreen_native_swap_drm_fb (onscreen);
|
||||
}
|
||||
else
|
||||
{
|
||||
queue_dummy_power_save_page_flip (renderer_native, flip_closure);
|
||||
}
|
||||
|
||||
onscreen_native->pending_queue_swap_notify = TRUE;
|
||||
|
||||
@@ -2378,11 +2456,14 @@ meta_onscreen_native_swap_buffers_with_damage (CoglOnscreen *onscreen,
|
||||
CoglRendererEGL *cogl_renderer_egl = cogl_renderer->winsys;
|
||||
MetaRendererNativeGpuData *renderer_gpu_data = cogl_renderer_egl->platform;
|
||||
MetaRendererNative *renderer_native = renderer_gpu_data->renderer_native;
|
||||
MetaMonitorManager *monitor_manager =
|
||||
META_MONITOR_MANAGER (renderer_native->monitor_manager_kms);
|
||||
CoglOnscreenEGL *onscreen_egl = onscreen->winsys;
|
||||
MetaOnscreenNative *onscreen_native = onscreen_egl->platform;
|
||||
MetaGpuKms *render_gpu = onscreen_native->render_gpu;
|
||||
CoglFrameInfo *frame_info;
|
||||
gboolean egl_context_changed = FALSE;
|
||||
MetaPowerSave power_save_mode;
|
||||
|
||||
/*
|
||||
* Wait for the flip callback before continuing, as we might have started the
|
||||
@@ -2424,7 +2505,10 @@ meta_onscreen_native_swap_buffers_with_damage (CoglOnscreen *onscreen,
|
||||
|
||||
/* If this is the first framebuffer to be presented then we now setup the
|
||||
* crtc modes, else we flip from the previous buffer */
|
||||
if (onscreen_native->pending_set_crtc)
|
||||
|
||||
power_save_mode = meta_monitor_manager_get_power_save_mode (monitor_manager);
|
||||
if (onscreen_native->pending_set_crtc &&
|
||||
power_save_mode == META_POWER_SAVE_ON)
|
||||
{
|
||||
meta_onscreen_native_set_crtc_modes (onscreen);
|
||||
onscreen_native->pending_set_crtc = FALSE;
|
||||
@@ -2629,7 +2713,7 @@ meta_renderer_native_create_surface_egl_device (CoglOnscreen *onscreen,
|
||||
EGLOutputLayerEXT output_layer;
|
||||
EGLAttrib output_attribs[3];
|
||||
EGLint stream_attribs[] = {
|
||||
EGL_STREAM_FIFO_LENGTH_KHR, 1,
|
||||
EGL_STREAM_FIFO_LENGTH_KHR, 0,
|
||||
EGL_CONSUMER_AUTO_ACQUIRE_EXT, EGL_FALSE,
|
||||
EGL_NONE
|
||||
};
|
||||
@@ -2970,8 +3054,15 @@ meta_renderer_native_release_onscreen (CoglOnscreen *onscreen)
|
||||
|
||||
g_list_free_full (onscreen_native->pending_page_flip_retries,
|
||||
(GDestroyNotify) retry_page_flip_data_free);
|
||||
g_clear_pointer (&onscreen_native->retry_page_flips_source,
|
||||
g_source_destroy);
|
||||
if (onscreen_native->retry_page_flips_source)
|
||||
{
|
||||
MetaBackend *backend =
|
||||
backend_from_renderer_native (onscreen_native->renderer_native);
|
||||
|
||||
meta_backend_thaw_updates (backend);
|
||||
g_clear_pointer (&onscreen_native->retry_page_flips_source,
|
||||
g_source_destroy);
|
||||
}
|
||||
|
||||
if (onscreen_egl->egl_surface != EGL_NO_SURFACE)
|
||||
{
|
||||
@@ -3294,9 +3385,7 @@ calculate_view_transform (MetaMonitorManager *monitor_manager,
|
||||
static CoglContext *
|
||||
cogl_context_from_renderer_native (MetaRendererNative *renderer_native)
|
||||
{
|
||||
MetaMonitorManager *monitor_manager =
|
||||
META_MONITOR_MANAGER (renderer_native->monitor_manager_kms);
|
||||
MetaBackend *backend = meta_monitor_manager_get_backend (monitor_manager);
|
||||
MetaBackend *backend = backend_from_renderer_native (renderer_native);
|
||||
ClutterBackend *clutter_backend = meta_backend_get_clutter_backend (backend);
|
||||
|
||||
return clutter_backend_get_cogl_context (clutter_backend);
|
||||
@@ -4134,6 +4223,13 @@ meta_renderer_native_finalize (GObject *object)
|
||||
{
|
||||
MetaRendererNative *renderer_native = META_RENDERER_NATIVE (object);
|
||||
|
||||
if (renderer_native->power_save_page_flip_closures)
|
||||
{
|
||||
g_list_free_full (renderer_native->power_save_page_flip_closures,
|
||||
(GDestroyNotify) g_closure_unref);
|
||||
g_source_remove (renderer_native->power_save_page_flip_source_id);
|
||||
}
|
||||
|
||||
g_hash_table_destroy (renderer_native->gpu_datas);
|
||||
g_clear_object (&renderer_native->gles3);
|
||||
|
||||
|
@@ -97,8 +97,6 @@ meta_gpu_xrandr_read_current (MetaGpu *gpu,
|
||||
GList *l;
|
||||
int min_width, min_height;
|
||||
Screen *screen;
|
||||
BOOL dpms_capable, dpms_enabled;
|
||||
CARD16 dpms_state;
|
||||
GList *outputs = NULL;
|
||||
GList *modes = NULL;
|
||||
GList *crtcs = NULL;
|
||||
@@ -107,36 +105,6 @@ meta_gpu_xrandr_read_current (MetaGpu *gpu,
|
||||
XRRFreeScreenResources (gpu_xrandr->resources);
|
||||
gpu_xrandr->resources = NULL;
|
||||
|
||||
dpms_capable = DPMSCapable (xdisplay);
|
||||
|
||||
if (dpms_capable &&
|
||||
DPMSInfo (xdisplay, &dpms_state, &dpms_enabled) &&
|
||||
dpms_enabled)
|
||||
{
|
||||
switch (dpms_state)
|
||||
{
|
||||
case DPMSModeOn:
|
||||
monitor_manager->power_save_mode = META_POWER_SAVE_ON;
|
||||
break;
|
||||
case DPMSModeStandby:
|
||||
monitor_manager->power_save_mode = META_POWER_SAVE_STANDBY;
|
||||
break;
|
||||
case DPMSModeSuspend:
|
||||
monitor_manager->power_save_mode = META_POWER_SAVE_SUSPEND;
|
||||
break;
|
||||
case DPMSModeOff:
|
||||
monitor_manager->power_save_mode = META_POWER_SAVE_OFF;
|
||||
break;
|
||||
default:
|
||||
monitor_manager->power_save_mode = META_POWER_SAVE_UNSUPPORTED;
|
||||
break;
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
monitor_manager->power_save_mode = META_POWER_SAVE_UNSUPPORTED;
|
||||
}
|
||||
|
||||
XRRGetScreenSizeRange (xdisplay, DefaultRootWindow (xdisplay),
|
||||
&min_width,
|
||||
&min_height,
|
||||
|
@@ -121,6 +121,50 @@ meta_monitor_manager_xrandr_read_edid (MetaMonitorManager *manager,
|
||||
return meta_output_xrandr_read_edid (output);
|
||||
}
|
||||
|
||||
static MetaPowerSave
|
||||
x11_dpms_state_to_power_save (CARD16 dpms_state)
|
||||
{
|
||||
switch (dpms_state)
|
||||
{
|
||||
case DPMSModeOn:
|
||||
return META_POWER_SAVE_ON;
|
||||
case DPMSModeStandby:
|
||||
return META_POWER_SAVE_STANDBY;
|
||||
case DPMSModeSuspend:
|
||||
return META_POWER_SAVE_SUSPEND;
|
||||
case DPMSModeOff:
|
||||
return META_POWER_SAVE_OFF;
|
||||
default:
|
||||
return META_POWER_SAVE_UNSUPPORTED;
|
||||
}
|
||||
}
|
||||
|
||||
static void
|
||||
meta_monitor_manager_xrandr_read_current_state (MetaMonitorManager *manager)
|
||||
{
|
||||
MetaMonitorManagerXrandr *manager_xrandr =
|
||||
META_MONITOR_MANAGER_XRANDR (manager);
|
||||
MetaMonitorManagerClass *parent_class =
|
||||
META_MONITOR_MANAGER_CLASS (meta_monitor_manager_xrandr_parent_class);
|
||||
Display *xdisplay = meta_monitor_manager_xrandr_get_xdisplay (manager_xrandr);
|
||||
BOOL dpms_capable, dpms_enabled;
|
||||
CARD16 dpms_state;
|
||||
MetaPowerSave power_save_mode;
|
||||
|
||||
dpms_capable = DPMSCapable (xdisplay);
|
||||
|
||||
if (dpms_capable &&
|
||||
DPMSInfo (xdisplay, &dpms_state, &dpms_enabled) &&
|
||||
dpms_enabled)
|
||||
power_save_mode = x11_dpms_state_to_power_save (dpms_state);
|
||||
else
|
||||
power_save_mode = META_POWER_SAVE_UNSUPPORTED;
|
||||
|
||||
meta_monitor_manager_power_save_mode_changed (manager, power_save_mode);
|
||||
|
||||
parent_class->read_current_state (manager);
|
||||
}
|
||||
|
||||
static void
|
||||
meta_monitor_manager_xrandr_set_power_save_mode (MetaMonitorManager *manager,
|
||||
MetaPowerSave mode)
|
||||
@@ -1046,6 +1090,7 @@ meta_monitor_manager_xrandr_class_init (MetaMonitorManagerXrandrClass *klass)
|
||||
object_class->constructed = meta_monitor_manager_xrandr_constructed;
|
||||
|
||||
manager_class->read_edid = meta_monitor_manager_xrandr_read_edid;
|
||||
manager_class->read_current_state = meta_monitor_manager_xrandr_read_current_state;
|
||||
manager_class->ensure_initial_config = meta_monitor_manager_xrandr_ensure_initial_config;
|
||||
manager_class->apply_monitors_config = meta_monitor_manager_xrandr_apply_monitors_config;
|
||||
manager_class->set_power_save_mode = meta_monitor_manager_xrandr_set_power_save_mode;
|
||||
|
@@ -615,7 +615,7 @@ create_pipeline (PipelineType type)
|
||||
|
||||
cogl_pipeline_set_layer_filters (templates[type],
|
||||
0,
|
||||
COGL_PIPELINE_FILTER_LINEAR_MIPMAP_NEAREST,
|
||||
COGL_PIPELINE_FILTER_LINEAR_MIPMAP_LINEAR,
|
||||
COGL_PIPELINE_FILTER_LINEAR);
|
||||
|
||||
return cogl_pipeline_copy (templates[type]);
|
||||
|
@@ -243,7 +243,7 @@ GList* meta_rectangle_find_nonintersected_monitor_edges (
|
||||
const GSList *all_struts);
|
||||
|
||||
META_EXPORT_TEST
|
||||
gboolean meta_rectangle_is_adjecent_to (MetaRectangle *rect,
|
||||
gboolean meta_rectangle_is_adjacent_to (MetaRectangle *rect,
|
||||
MetaRectangle *other);
|
||||
|
||||
META_EXPORT_TEST
|
||||
|
@@ -468,7 +468,7 @@ merge_spanning_rects_in_region (GList *region)
|
||||
delete_me = other;
|
||||
}
|
||||
/* If b contains a, just remove a */
|
||||
else if (meta_rectangle_contains_rect (a, b))
|
||||
else if (meta_rectangle_contains_rect (b, a))
|
||||
{
|
||||
delete_me = compare;
|
||||
}
|
||||
@@ -2026,7 +2026,7 @@ meta_rectangle_find_nonintersected_monitor_edges (
|
||||
}
|
||||
|
||||
gboolean
|
||||
meta_rectangle_is_adjecent_to (MetaRectangle *rect,
|
||||
meta_rectangle_is_adjacent_to (MetaRectangle *rect,
|
||||
MetaRectangle *other)
|
||||
{
|
||||
int rect_x1 = rect->x;
|
||||
|
@@ -145,6 +145,8 @@ typedef struct
|
||||
*/
|
||||
GList *usable_screen_region;
|
||||
GList *usable_monitor_region;
|
||||
|
||||
gboolean should_unmanage;
|
||||
} ConstraintInfo;
|
||||
|
||||
static gboolean do_screen_and_monitor_relative_constraints (MetaWindow *window,
|
||||
@@ -253,6 +255,14 @@ do_all_constraints (MetaWindow *window,
|
||||
satisfied = satisfied &&
|
||||
(*constraint->func) (window, info, priority, check_only);
|
||||
|
||||
if (info->should_unmanage)
|
||||
{
|
||||
meta_topic (META_DEBUG_GEOMETRY,
|
||||
"constraint %s wants to unmanage window.\n",
|
||||
constraint->name);
|
||||
return TRUE;
|
||||
}
|
||||
|
||||
if (!check_only)
|
||||
{
|
||||
/* Log how the constraint modified the position */
|
||||
@@ -312,6 +322,12 @@ meta_window_constrain (MetaWindow *window,
|
||||
*/
|
||||
satisfied = do_all_constraints (window, &info, priority, check_only);
|
||||
|
||||
if (info.should_unmanage)
|
||||
{
|
||||
meta_window_unmanage_on_idle (window);
|
||||
return;
|
||||
}
|
||||
|
||||
/* Drop the least important constraints if we can't satisfy them all */
|
||||
priority++;
|
||||
}
|
||||
@@ -421,6 +437,8 @@ setup_constraint_info (ConstraintInfo *info,
|
||||
info->usable_monitor_region =
|
||||
meta_workspace_get_onmonitor_region (cur_workspace, logical_monitor);
|
||||
|
||||
info->should_unmanage = FALSE;
|
||||
|
||||
/* Log all this information for debugging */
|
||||
meta_topic (META_DEBUG_GEOMETRY,
|
||||
"Setting up constraint info:\n"
|
||||
@@ -761,7 +779,7 @@ try_flip_window_position (MetaWindow *window,
|
||||
}
|
||||
|
||||
static gboolean
|
||||
is_custom_rule_satisfied (ConstraintInfo *info,
|
||||
is_custom_rule_satisfied (MetaRectangle *rect,
|
||||
MetaPlacementRule *placement_rule,
|
||||
MetaRectangle *intersection)
|
||||
{
|
||||
@@ -772,9 +790,9 @@ is_custom_rule_satisfied (ConstraintInfo *info,
|
||||
y_constrain_actions = (META_PLACEMENT_CONSTRAINT_ADJUSTMENT_SLIDE_Y |
|
||||
META_PLACEMENT_CONSTRAINT_ADJUSTMENT_FLIP_Y);
|
||||
if ((placement_rule->constraint_adjustment & x_constrain_actions &&
|
||||
info->current.width != intersection->width) ||
|
||||
rect->width != intersection->width) ||
|
||||
(placement_rule->constraint_adjustment & y_constrain_actions &&
|
||||
info->current.height != intersection->height))
|
||||
rect->height != intersection->height))
|
||||
return FALSE;
|
||||
else
|
||||
return TRUE;
|
||||
@@ -789,6 +807,7 @@ constrain_custom_rule (MetaWindow *window,
|
||||
MetaPlacementRule *placement_rule;
|
||||
MetaRectangle intersection;
|
||||
gboolean constraint_satisfied;
|
||||
MetaRectangle adjusted_unconstrained;
|
||||
MetaPlacementRule current_rule;
|
||||
MetaWindow *parent;
|
||||
MetaRectangle parent_rect;
|
||||
@@ -800,30 +819,65 @@ constrain_custom_rule (MetaWindow *window,
|
||||
if (!placement_rule)
|
||||
return TRUE;
|
||||
|
||||
if (window->placement_rule_constrained)
|
||||
{
|
||||
parent = meta_window_get_transient_for (window);
|
||||
meta_window_get_frame_rect (parent, &parent_rect);
|
||||
info->current.x =
|
||||
parent_rect.x + window->constrained_placement_rule_offset_x;
|
||||
info->current.y =
|
||||
parent_rect.y + window->constrained_placement_rule_offset_y;
|
||||
adjusted_unconstrained = info->current;
|
||||
|
||||
return TRUE;
|
||||
parent = meta_window_get_transient_for (window);
|
||||
meta_window_get_frame_rect (parent, &parent_rect);
|
||||
|
||||
switch (window->placement_state)
|
||||
{
|
||||
case META_PLACEMENT_STATE_UNCONSTRAINED:
|
||||
break;
|
||||
case META_PLACEMENT_STATE_CONSTRAINED:
|
||||
adjusted_unconstrained.x =
|
||||
parent_rect.x + window->constrained_placement_rule_offset_x;
|
||||
adjusted_unconstrained.y =
|
||||
parent_rect.y + window->constrained_placement_rule_offset_y;
|
||||
break;
|
||||
}
|
||||
|
||||
meta_rectangle_intersect (&info->current, &info->work_area_monitor,
|
||||
meta_rectangle_intersect (&adjusted_unconstrained, &info->work_area_monitor,
|
||||
&intersection);
|
||||
|
||||
constraint_satisfied = is_custom_rule_satisfied (info,
|
||||
placement_rule,
|
||||
&intersection);
|
||||
constraint_satisfied = (meta_rectangle_equal (&info->current,
|
||||
&adjusted_unconstrained) &&
|
||||
is_custom_rule_satisfied (&adjusted_unconstrained,
|
||||
placement_rule,
|
||||
&intersection));
|
||||
|
||||
if (check_only)
|
||||
return constraint_satisfied;
|
||||
|
||||
current_rule = *placement_rule;
|
||||
|
||||
switch (window->placement_state)
|
||||
{
|
||||
case META_PLACEMENT_STATE_CONSTRAINED:
|
||||
{
|
||||
MetaRectangle parent_buffer_rect;
|
||||
|
||||
meta_window_get_buffer_rect (parent, &parent_buffer_rect);
|
||||
if (!meta_rectangle_overlap (&adjusted_unconstrained,
|
||||
&parent_buffer_rect) &&
|
||||
!meta_rectangle_is_adjacent_to (&adjusted_unconstrained,
|
||||
&parent_buffer_rect))
|
||||
{
|
||||
g_warning ("Buggy client caused popup to be placed outside of "
|
||||
"parent window");
|
||||
info->should_unmanage = TRUE;
|
||||
return TRUE;
|
||||
}
|
||||
else
|
||||
{
|
||||
info->current = adjusted_unconstrained;
|
||||
goto done;
|
||||
}
|
||||
break;
|
||||
}
|
||||
case META_PLACEMENT_STATE_UNCONSTRAINED:
|
||||
break;
|
||||
}
|
||||
|
||||
if (constraint_satisfied)
|
||||
goto done;
|
||||
|
||||
@@ -846,7 +900,7 @@ constrain_custom_rule (MetaWindow *window,
|
||||
|
||||
meta_rectangle_intersect (&info->current, &info->work_area_monitor,
|
||||
&intersection);
|
||||
constraint_satisfied = is_custom_rule_satisfied (info,
|
||||
constraint_satisfied = is_custom_rule_satisfied (&info->current,
|
||||
placement_rule,
|
||||
&intersection);
|
||||
|
||||
@@ -856,23 +910,47 @@ constrain_custom_rule (MetaWindow *window,
|
||||
if (current_rule.constraint_adjustment &
|
||||
META_PLACEMENT_CONSTRAINT_ADJUSTMENT_SLIDE_X)
|
||||
{
|
||||
if (info->current.x != intersection.x)
|
||||
info->current.x = intersection.x;
|
||||
else if (info->current.width != intersection.width)
|
||||
info->current.x -= info->current.width - intersection.width;
|
||||
int current_x2;
|
||||
int work_area_monitor_x2;
|
||||
|
||||
current_x2 = info->current.x + info->current.width;
|
||||
work_area_monitor_x2 = (info->work_area_monitor.x +
|
||||
info->work_area_monitor.width);
|
||||
|
||||
if (current_x2 > work_area_monitor_x2)
|
||||
{
|
||||
info->current.x = MAX (info->work_area_monitor.x,
|
||||
work_area_monitor_x2 - info->current.width);
|
||||
}
|
||||
else if (info->current.x < info->work_area_monitor.x)
|
||||
{
|
||||
info->current.x = info->work_area_monitor.x;
|
||||
}
|
||||
}
|
||||
if (current_rule.constraint_adjustment &
|
||||
META_PLACEMENT_CONSTRAINT_ADJUSTMENT_SLIDE_Y)
|
||||
{
|
||||
if (info->current.y != intersection.y)
|
||||
info->current.y = intersection.y;
|
||||
else if (info->current.height != intersection.height)
|
||||
info->current.y -= info->current.height - intersection.height;
|
||||
int current_y2;
|
||||
int work_area_monitor_y2;
|
||||
|
||||
current_y2 = info->current.y + info->current.height;
|
||||
work_area_monitor_y2 = (info->work_area_monitor.y +
|
||||
info->work_area_monitor.height);
|
||||
|
||||
if (current_y2 > work_area_monitor_y2)
|
||||
{
|
||||
info->current.y = MAX (info->work_area_monitor.y,
|
||||
work_area_monitor_y2 - info->current.height);
|
||||
}
|
||||
else if (info->current.y < info->work_area_monitor.y)
|
||||
{
|
||||
info->current.y = info->work_area_monitor.y;
|
||||
}
|
||||
}
|
||||
|
||||
meta_rectangle_intersect (&info->current, &info->work_area_monitor,
|
||||
&intersection);
|
||||
constraint_satisfied = is_custom_rule_satisfied (info,
|
||||
constraint_satisfied = is_custom_rule_satisfied (&info->current,
|
||||
placement_rule,
|
||||
&intersection);
|
||||
|
||||
@@ -893,10 +971,8 @@ constrain_custom_rule (MetaWindow *window,
|
||||
}
|
||||
|
||||
done:
|
||||
window->placement_rule_constrained = TRUE;
|
||||
window->placement_state = META_PLACEMENT_STATE_CONSTRAINED;
|
||||
|
||||
parent = meta_window_get_transient_for (window);
|
||||
meta_window_get_frame_rect (parent, &parent_rect);
|
||||
window->constrained_placement_rule_offset_x = info->current.x - parent_rect.x;
|
||||
window->constrained_placement_rule_offset_y = info->current.y - parent_rect.y;
|
||||
|
||||
|
@@ -142,8 +142,8 @@ meta_launch_context_get_startup_notify_id (GAppLaunchContext *launch_context,
|
||||
startup_id =
|
||||
meta_x11_startup_notification_launch (display->x11_display,
|
||||
info,
|
||||
workspace_idx,
|
||||
context->timestamp);
|
||||
context->timestamp,
|
||||
workspace_idx);
|
||||
}
|
||||
|
||||
if (!startup_id)
|
||||
|
@@ -454,6 +454,7 @@ startup_sequence_timeout (void *data)
|
||||
meta_startup_sequence_get_id (sequence));
|
||||
|
||||
meta_startup_sequence_complete (sequence);
|
||||
meta_startup_notification_remove_sequence (sn, sequence);
|
||||
}
|
||||
|
||||
g_slist_free (ctod.list);
|
||||
|
@@ -142,6 +142,12 @@ typedef struct _MetaPlacementRule
|
||||
int height;
|
||||
} MetaPlacementRule;
|
||||
|
||||
typedef enum _MetaPlacementState
|
||||
{
|
||||
META_PLACEMENT_STATE_UNCONSTRAINED,
|
||||
META_PLACEMENT_STATE_CONSTRAINED,
|
||||
} MetaPlacementState;
|
||||
|
||||
typedef enum
|
||||
{
|
||||
META_EDGE_CONSTRAINT_NONE = 0,
|
||||
@@ -524,9 +530,11 @@ struct _MetaWindow
|
||||
guint bypass_compositor;
|
||||
|
||||
MetaPlacementRule *placement_rule;
|
||||
gboolean placement_rule_constrained;
|
||||
MetaPlacementState placement_state;
|
||||
int constrained_placement_rule_offset_x;
|
||||
int constrained_placement_rule_offset_y;
|
||||
|
||||
guint unmanage_idle_id;
|
||||
};
|
||||
|
||||
struct _MetaWindowClass
|
||||
@@ -610,6 +618,7 @@ MetaWindow * _meta_window_shared_new (MetaDisplay *display,
|
||||
|
||||
void meta_window_unmanage (MetaWindow *window,
|
||||
guint32 timestamp);
|
||||
void meta_window_unmanage_on_idle (MetaWindow *window);
|
||||
void meta_window_queue (MetaWindow *window,
|
||||
guint queuebits);
|
||||
void meta_window_tile (MetaWindow *window,
|
||||
|
@@ -1424,6 +1424,9 @@ meta_window_unmanage (MetaWindow *window,
|
||||
meta_verbose ("Unmanaging %s\n", window->desc);
|
||||
window->unmanaging = TRUE;
|
||||
|
||||
if (window->unmanage_idle_id)
|
||||
g_source_remove (window->unmanage_idle_id);
|
||||
|
||||
#ifdef HAVE_WAYLAND
|
||||
/* This needs to happen for both Wayland and XWayland clients,
|
||||
* so it can't be in MetaWindowWayland. */
|
||||
@@ -1595,6 +1598,32 @@ meta_window_unmanage (MetaWindow *window,
|
||||
g_object_unref (window);
|
||||
}
|
||||
|
||||
static gboolean
|
||||
unmanage_window_idle_callback (gpointer user_data)
|
||||
{
|
||||
MetaWindow *window = META_WINDOW (user_data);
|
||||
uint32_t timestamp;
|
||||
|
||||
window->unmanage_idle_id = 0;
|
||||
|
||||
timestamp = meta_display_get_current_time_roundtrip (window->display);
|
||||
meta_window_unmanage (window, timestamp);
|
||||
|
||||
return G_SOURCE_REMOVE;
|
||||
}
|
||||
|
||||
void
|
||||
meta_window_unmanage_on_idle (MetaWindow *window)
|
||||
{
|
||||
if (window->unmanage_idle_id)
|
||||
return;
|
||||
|
||||
window->unmanage_idle_id = g_idle_add_full (G_PRIORITY_HIGH_IDLE,
|
||||
unmanage_window_idle_callback,
|
||||
window,
|
||||
NULL);
|
||||
}
|
||||
|
||||
static void
|
||||
set_wm_state (MetaWindow *window)
|
||||
{
|
||||
@@ -3781,6 +3810,9 @@ static gboolean
|
||||
maybe_move_attached_window (MetaWindow *window,
|
||||
void *data)
|
||||
{
|
||||
if (window->hidden)
|
||||
return FALSE;
|
||||
|
||||
if (meta_window_is_attached_dialog (window) ||
|
||||
meta_window_get_placement_rule (window))
|
||||
meta_window_reposition (window);
|
||||
|
@@ -1,4 +1,5 @@
|
||||
mutter_includedir = join_paths(pkgincludedir, 'meta')
|
||||
mutter_includesubdir = join_paths(pkgname, 'meta')
|
||||
mutter_includedir = join_paths(includedir, mutter_includesubdir)
|
||||
|
||||
mutter_includes = [
|
||||
include_directories('.'),
|
||||
@@ -777,6 +778,32 @@ libmutter_dep = declare_dependency(
|
||||
],
|
||||
)
|
||||
|
||||
# Interal library for gtk-doc (we need symbol visibility)
|
||||
_libmutter_public_symbols = library(libmutter_name + '-public-symbols',
|
||||
sources: [
|
||||
mutter_sources,
|
||||
mutter_built_sources,
|
||||
],
|
||||
include_directories: mutter_includes,
|
||||
c_args: mutter_c_args,
|
||||
dependencies: [
|
||||
libmutter_cogl_dep,
|
||||
libmutter_clutter_dep,
|
||||
mutter_deps,
|
||||
],
|
||||
)
|
||||
|
||||
_libmutter_public_symbols_dep = declare_dependency(
|
||||
link_with: _libmutter_public_symbols,
|
||||
include_directories: mutter_includes,
|
||||
sources: mutter_built_sources,
|
||||
dependencies: [
|
||||
libmutter_cogl_dep,
|
||||
libmutter_clutter_dep,
|
||||
mutter_deps,
|
||||
],
|
||||
)
|
||||
|
||||
executable('mutter',
|
||||
sources: [
|
||||
files('core/mutter.c'),
|
||||
|
@@ -48,7 +48,7 @@ if have_x11
|
||||
endif
|
||||
|
||||
install_headers(mutter_public_headers,
|
||||
subdir: mutter_includedir
|
||||
subdir: mutter_includesubdir
|
||||
)
|
||||
|
||||
mutter_public_header_files = files(mutter_public_headers)
|
||||
|
@@ -185,10 +185,10 @@ meta_test_util_later_schedule_from_later (void)
|
||||
}
|
||||
|
||||
static void
|
||||
meta_test_adjecent_to (void)
|
||||
meta_test_adjacent_to (void)
|
||||
{
|
||||
MetaRectangle base = { .x = 10, .y = 10, .width = 10, .height = 10 };
|
||||
MetaRectangle adjecent[] = {
|
||||
MetaRectangle adjacent[] = {
|
||||
{ .x = 20, .y = 10, .width = 10, .height = 10 },
|
||||
{ .x = 0, .y = 10, .width = 10, .height = 10 },
|
||||
{ .x = 0, .y = 1, .width = 10, .height = 10 },
|
||||
@@ -196,7 +196,7 @@ meta_test_adjecent_to (void)
|
||||
{ .x = 10, .y = 20, .width = 10, .height = 10 },
|
||||
{ .x = 10, .y = 0, .width = 10, .height = 10 },
|
||||
};
|
||||
MetaRectangle not_adjecent[] = {
|
||||
MetaRectangle not_adjacent[] = {
|
||||
{ .x = 0, .y = 0, .width = 10, .height = 10 },
|
||||
{ .x = 20, .y = 20, .width = 10, .height = 10 },
|
||||
{ .x = 21, .y = 10, .width = 10, .height = 10 },
|
||||
@@ -207,11 +207,11 @@ meta_test_adjecent_to (void)
|
||||
};
|
||||
unsigned int i;
|
||||
|
||||
for (i = 0; i < G_N_ELEMENTS (adjecent); i++)
|
||||
g_assert (meta_rectangle_is_adjecent_to (&base, &adjecent[i]));
|
||||
for (i = 0; i < G_N_ELEMENTS (adjacent); i++)
|
||||
g_assert (meta_rectangle_is_adjacent_to (&base, &adjacent[i]));
|
||||
|
||||
for (i = 0; i < G_N_ELEMENTS (not_adjecent); i++)
|
||||
g_assert (!meta_rectangle_is_adjecent_to (&base, ¬_adjecent[i]));
|
||||
for (i = 0; i < G_N_ELEMENTS (not_adjacent); i++)
|
||||
g_assert (!meta_rectangle_is_adjacent_to (&base, ¬_adjacent[i]));
|
||||
}
|
||||
|
||||
static gboolean
|
||||
@@ -245,7 +245,7 @@ init_tests (int argc, char **argv)
|
||||
g_test_add_func ("/util/meta-later/schedule-from-later",
|
||||
meta_test_util_later_schedule_from_later);
|
||||
|
||||
g_test_add_func ("/core/boxes/adjecent-to", meta_test_adjecent_to);
|
||||
g_test_add_func ("/core/boxes/adjacent-to", meta_test_adjacent_to);
|
||||
|
||||
init_monitor_store_tests ();
|
||||
init_monitor_config_migration_tests ();
|
||||
|
@@ -119,14 +119,6 @@ meta_wayland_buffer_realize (MetaWaylandBuffer *buffer)
|
||||
return TRUE;
|
||||
}
|
||||
|
||||
if (meta_egl_query_wayland_buffer (egl, egl_display, buffer->resource,
|
||||
EGL_TEXTURE_FORMAT, &format,
|
||||
NULL))
|
||||
{
|
||||
buffer->type = META_WAYLAND_BUFFER_TYPE_EGL_IMAGE;
|
||||
return TRUE;
|
||||
}
|
||||
|
||||
#ifdef HAVE_WAYLAND_EGLSTREAM
|
||||
stream = meta_wayland_egl_stream_new (buffer, NULL);
|
||||
if (stream)
|
||||
@@ -146,6 +138,14 @@ meta_wayland_buffer_realize (MetaWaylandBuffer *buffer)
|
||||
}
|
||||
#endif /* HAVE_WAYLAND_EGLSTREAM */
|
||||
|
||||
if (meta_egl_query_wayland_buffer (egl, egl_display, buffer->resource,
|
||||
EGL_TEXTURE_FORMAT, &format,
|
||||
NULL))
|
||||
{
|
||||
buffer->type = META_WAYLAND_BUFFER_TYPE_EGL_IMAGE;
|
||||
return TRUE;
|
||||
}
|
||||
|
||||
dma_buf = meta_wayland_dma_buf_from_buffer (buffer);
|
||||
if (dma_buf)
|
||||
{
|
||||
|
@@ -258,7 +258,7 @@ zxdg_toplevel_v6_show_window_menu (struct wl_client *client,
|
||||
if (!meta_wayland_seat_get_grab_info (seat, surface, serial, FALSE, NULL, NULL))
|
||||
return;
|
||||
|
||||
monitor_scale = window->monitor->scale;
|
||||
monitor_scale = meta_window_wayland_get_geometry_scale (window);
|
||||
meta_window_show_menu (window, META_WINDOW_MENU_WM,
|
||||
window->buffer_rect.x + (x * monitor_scale),
|
||||
window->buffer_rect.y + (y * monitor_scale));
|
||||
|
@@ -35,6 +35,9 @@
|
||||
|
||||
typedef struct _MetaXWaylandSelection MetaXWaylandSelection;
|
||||
|
||||
/**
|
||||
* MetaWaylandFrameCallback: (skip)
|
||||
*/
|
||||
typedef struct
|
||||
{
|
||||
struct wl_list link;
|
||||
|
@@ -72,6 +72,8 @@ struct _MetaWaylandTextInput
|
||||
uint32_t content_type_purpose;
|
||||
uint32_t text_change_cause;
|
||||
gboolean enabled;
|
||||
|
||||
guint done_idle_id;
|
||||
};
|
||||
|
||||
struct _MetaWaylandTextInputFocus
|
||||
@@ -116,6 +118,52 @@ increment_serial (MetaWaylandTextInput *text_input,
|
||||
GUINT_TO_POINTER (serial + 1));
|
||||
}
|
||||
|
||||
static gboolean
|
||||
done_idle_cb (gpointer user_data)
|
||||
{
|
||||
ClutterInputFocus *focus = user_data;
|
||||
MetaWaylandTextInput *text_input;
|
||||
struct wl_resource *resource;
|
||||
|
||||
text_input = META_WAYLAND_TEXT_INPUT_FOCUS (focus)->text_input;
|
||||
|
||||
wl_resource_for_each (resource, &text_input->focus_resource_list)
|
||||
{
|
||||
zwp_text_input_v3_send_done (resource,
|
||||
lookup_serial (text_input, resource));
|
||||
}
|
||||
|
||||
text_input->done_idle_id = 0;
|
||||
return G_SOURCE_REMOVE;
|
||||
}
|
||||
|
||||
static void
|
||||
meta_wayland_text_input_focus_defer_done (ClutterInputFocus *focus)
|
||||
{
|
||||
MetaWaylandTextInput *text_input;
|
||||
|
||||
text_input = META_WAYLAND_TEXT_INPUT_FOCUS (focus)->text_input;
|
||||
|
||||
if (text_input->done_idle_id != 0)
|
||||
return;
|
||||
|
||||
/* This operates on 3 principles:
|
||||
* - GDBus uses G_PRIORITY_DEFAULT to put messages in the thread default main
|
||||
* context.
|
||||
* - All relevant ClutterInputFocus methods are ultimately backed by
|
||||
* DBus methods inside IBus.
|
||||
* - We want to run .done after them all. The slightly lower
|
||||
* G_PRIORITY_DEFAULT + 1 priority should ensure we at least group
|
||||
* all messages seen so far.
|
||||
*
|
||||
* FIXME: .done may be delayed indefinitely if there's a high enough
|
||||
* priority idle source in the main loop. It's unlikely that
|
||||
* recurring idles run at this high priority though.
|
||||
*/
|
||||
text_input->done_idle_id = g_idle_add_full (G_PRIORITY_DEFAULT + 1,
|
||||
done_idle_cb, focus, NULL);
|
||||
}
|
||||
|
||||
static void
|
||||
meta_wayland_text_input_focus_delete_surrounding (ClutterInputFocus *focus,
|
||||
guint cursor,
|
||||
@@ -129,9 +177,9 @@ meta_wayland_text_input_focus_delete_surrounding (ClutterInputFocus *focus,
|
||||
wl_resource_for_each (resource, &text_input->focus_resource_list)
|
||||
{
|
||||
zwp_text_input_v3_send_delete_surrounding_text (resource, cursor, len);
|
||||
zwp_text_input_v3_send_done (resource,
|
||||
lookup_serial (text_input, resource));
|
||||
}
|
||||
|
||||
meta_wayland_text_input_focus_defer_done (focus);
|
||||
}
|
||||
|
||||
static void
|
||||
@@ -147,9 +195,9 @@ meta_wayland_text_input_focus_commit_text (ClutterInputFocus *focus,
|
||||
{
|
||||
zwp_text_input_v3_send_preedit_string (resource, NULL, 0, 0);
|
||||
zwp_text_input_v3_send_commit_string (resource, text);
|
||||
zwp_text_input_v3_send_done (resource,
|
||||
lookup_serial (text_input, resource));
|
||||
}
|
||||
|
||||
meta_wayland_text_input_focus_defer_done (focus);
|
||||
}
|
||||
|
||||
static void
|
||||
@@ -165,9 +213,9 @@ meta_wayland_text_input_focus_set_preedit_text (ClutterInputFocus *focus,
|
||||
wl_resource_for_each (resource, &text_input->focus_resource_list)
|
||||
{
|
||||
zwp_text_input_v3_send_preedit_string (resource, text, cursor, cursor);
|
||||
zwp_text_input_v3_send_done (resource,
|
||||
lookup_serial (text_input, resource));
|
||||
}
|
||||
|
||||
meta_wayland_text_input_focus_defer_done (focus);
|
||||
}
|
||||
|
||||
static void
|
||||
|
@@ -264,7 +264,7 @@ xdg_toplevel_show_window_menu (struct wl_client *client,
|
||||
if (!meta_wayland_seat_get_grab_info (seat, surface, serial, FALSE, NULL, NULL))
|
||||
return;
|
||||
|
||||
monitor_scale = window->monitor->scale;
|
||||
monitor_scale = meta_window_wayland_get_geometry_scale (window);
|
||||
meta_window_show_menu (window, META_WINDOW_MENU_WM,
|
||||
window->buffer_rect.x + (x * monitor_scale),
|
||||
window->buffer_rect.y + (y * monitor_scale));
|
||||
@@ -921,6 +921,22 @@ scale_placement_rule (MetaPlacementRule *placement_rule,
|
||||
placement_rule->height *= geometry_scale;
|
||||
}
|
||||
|
||||
static void
|
||||
meta_wayland_xdg_popup_place (MetaWaylandXdgPopup *xdg_popup,
|
||||
MetaPlacementRule *placement_rule)
|
||||
{
|
||||
MetaWaylandSurfaceRole *surface_role = META_WAYLAND_SURFACE_ROLE (xdg_popup);
|
||||
MetaWaylandSurface *surface =
|
||||
meta_wayland_surface_role_get_surface (surface_role);
|
||||
MetaPlacementRule scaled_placement_rule;
|
||||
|
||||
scaled_placement_rule = *placement_rule;
|
||||
scale_placement_rule (&scaled_placement_rule, surface);
|
||||
|
||||
meta_window_place_with_placement_rule (surface->window,
|
||||
&scaled_placement_rule);
|
||||
}
|
||||
|
||||
static void
|
||||
finish_popup_setup (MetaWaylandXdgPopup *xdg_popup)
|
||||
{
|
||||
@@ -933,7 +949,6 @@ finish_popup_setup (MetaWaylandXdgPopup *xdg_popup)
|
||||
MetaWaylandSurface *surface =
|
||||
meta_wayland_surface_role_get_surface (surface_role);
|
||||
MetaWaylandSurface *parent_surface;
|
||||
MetaPlacementRule scaled_placement_rule;
|
||||
MetaWaylandSeat *seat;
|
||||
uint32_t serial;
|
||||
MetaDisplay *display = meta_get_display ();
|
||||
@@ -981,9 +996,7 @@ finish_popup_setup (MetaWaylandXdgPopup *xdg_popup)
|
||||
window = meta_window_wayland_new (display, surface);
|
||||
meta_wayland_shell_surface_set_window (shell_surface, window);
|
||||
|
||||
scaled_placement_rule = xdg_popup->setup.placement_rule;
|
||||
scale_placement_rule (&scaled_placement_rule, surface);
|
||||
meta_window_place_with_placement_rule (window, &scaled_placement_rule);
|
||||
meta_wayland_xdg_popup_place (xdg_popup, &xdg_popup->setup.placement_rule);
|
||||
|
||||
if (seat)
|
||||
{
|
||||
|
Reference in New Issue
Block a user