Compare commits
54 Commits
Author | SHA1 | Date | |
---|---|---|---|
aa45fa1e26 | |||
19f4342b46 | |||
5fc6200375 | |||
8a7b564219 | |||
48d1bf9ea9 | |||
02798ceeb6 | |||
ee07580365 | |||
e22c75377b | |||
0f7c3f3678 | |||
bbed0d8045 | |||
8699aca7d7 | |||
2ec91abf38 | |||
28b2added7 | |||
a8ceceed1a | |||
7801df7ef6 | |||
1b4cd1b47d | |||
7f0f880fba | |||
ca31e4dc14 | |||
dfdc15c72c | |||
3254103d3e | |||
57d07bd38b | |||
a3b4ee5689 | |||
d8adfa9a31 | |||
a6678a262c | |||
317517fcb5 | |||
0f5ac1dc28 | |||
01b6e32e87 | |||
bff311da88 | |||
6883a1f350 | |||
de3a01b5f5 | |||
1ab02344a7 | |||
90633660c7 | |||
0e65bfcd3a | |||
79cf22324d | |||
ebfba766d1 | |||
bb481fafdb | |||
eb394f19d3 | |||
c6d3113416 | |||
196e524703 | |||
53a93deafc | |||
3a374a6db5 | |||
aec4b4af97 | |||
2392432780 | |||
0d5274b3b7 | |||
42c0809216 | |||
420311b463 | |||
efae039ad9 | |||
e60dfd5b23 | |||
df45c50d0b | |||
8f691c28f3 | |||
a77da353f3 | |||
70a4f59960 | |||
ac813d5285 | |||
5d3e7d6ffd |
51
NEWS
51
NEWS
@ -1,3 +1,54 @@
|
||||
3.24.3
|
||||
======
|
||||
* Fix handling of tiled monitors [Jonas; #781723]
|
||||
* Fix swapped red and blue channels in CoglTexture data [Carlos; #779234]
|
||||
* Fix glitches when opening a window maximized [Olivier; #781353, #782183]
|
||||
* Implement support for disable-while-typing option [Evan; #764852]
|
||||
* Consider subsurfaces when grabbing [mindtree; #781811]
|
||||
* Fix handling of left-handed mode on pen/eraser devices [Carlos; #782027]
|
||||
* Fix output cycling in non-display-attached tablets [Carlos; #782032]
|
||||
* Fix wacom cursor offset on wayland [Jason; #784009]
|
||||
* Handle EXIF orientation of backgrounds [Silvère; #783125]
|
||||
* Misc. bug fixes [Jonas, Bastien, Ikey, Carlos; #782156, #780407, #757661,
|
||||
#783113, #781703]
|
||||
|
||||
Contributors:
|
||||
mitchmindtree, Jonas Ådahl, Ikey Doherty, Olivier Fourdan, Carlos Garnacho,
|
||||
Jason Gerecke, Silvère Latchurié, Bastien Nocera, Evan Welsh
|
||||
|
||||
3.24.2
|
||||
======
|
||||
* Don't crash when wayland clients commit to destroyed surfaces [Jonas; #781391]
|
||||
* Fix frame updates on hide-titlebar-when-maximized changes [Florian; #781862]
|
||||
* Fix accessible screen coordinates on X11 [Florian; #781902]
|
||||
* Fix copy+paste of UTF8 strings between X11 and wayland [Carlos; #782472]
|
||||
* Fix non-wayland builds [Chris; #780533]
|
||||
* Misc. bug fixes [Philip, Matthias, Nigel; #781242, #780215, #759085]
|
||||
|
||||
Contributors:
|
||||
Jonas Ådahl, Philip Chimento, Carlos Garnacho, Matthias Liertzer,
|
||||
Florian Müllner, Nigel Taylor, Chris Vine
|
||||
|
||||
Translations:
|
||||
Jordi Mas [ca]
|
||||
|
||||
3.24.1
|
||||
======
|
||||
* Always sync window geometry on state changes [Jonas; #780292]
|
||||
* Use EGL instead of GLX when drawing using GLES [Jonas; #771636]
|
||||
* Fix HiDPI detection on vertical monitor layouts [Carlos; #777687]
|
||||
* Get double-click timing from desktop mouse settings [Armin; #771576]
|
||||
* Scale relative motion deltas with monitor scale [Jonas, Carlos; #778119]
|
||||
* Use texture fallback when setting hardware cursor fails [Jente; #770020]
|
||||
* Fix lock-up when using additional theme variants [Shantanu; #780254]
|
||||
|
||||
Contributors:
|
||||
Jonas Ådahl, Carlos Garnacho, Shantanu Goel, Jente Hidskes, Armin Krezović,
|
||||
Florian Müllner
|
||||
|
||||
Translations:
|
||||
Yuras Shumovich [be], Yosef Or Boczko [he], Tom Tryfonidis [el]
|
||||
|
||||
3.24.0
|
||||
======
|
||||
|
||||
|
@ -6,7 +6,9 @@ test -z "$srcdir" && srcdir=.
|
||||
|
||||
REQUIRED_AUTOMAKE_VERSION=1.11
|
||||
|
||||
pushd $srcdir
|
||||
olddir="$(pwd)"
|
||||
|
||||
cd "${srcdir}"
|
||||
|
||||
(test -f configure.ac \
|
||||
&& test -d src) || {
|
||||
@ -19,8 +21,8 @@ aclocal --install || exit 1
|
||||
intltoolize --force --copy --automake || exit 1
|
||||
autoreconf --verbose --force --install || exit 1
|
||||
|
||||
popd
|
||||
cd "${olddir}"
|
||||
|
||||
if [ "$NOCONFIGURE" = "" ]; then
|
||||
$srcdir/configure "$@" || exit 1
|
||||
"${srcdir}/configure" "$@" || exit 1
|
||||
fi
|
||||
|
@ -781,7 +781,7 @@ _cally_actor_get_top_level_origin (ClutterActor *actor,
|
||||
"position of the stage");
|
||||
}
|
||||
else
|
||||
#else
|
||||
#endif
|
||||
{
|
||||
static gboolean yet_warned = FALSE;
|
||||
|
||||
@ -793,7 +793,6 @@ _cally_actor_get_top_level_origin (ClutterActor *actor,
|
||||
"atk_component_get_extents() with ATK_XY_SCREEN.");
|
||||
}
|
||||
}
|
||||
#endif
|
||||
|
||||
if (xp)
|
||||
*xp = x;
|
||||
|
@ -48,7 +48,7 @@
|
||||
#include "clutter-debug.h"
|
||||
|
||||
/* XXX - keep in sync with the ClutterStaticColor enumeration order */
|
||||
static const ClutterColor const static_colors[] = {
|
||||
static const ClutterColor static_colors[] = {
|
||||
/* CGA/EGA color palette */
|
||||
{ 0xff, 0xff, 0xff, 0xff }, /* white */
|
||||
{ 0x00, 0x00, 0x00, 0xff }, /* black */
|
||||
|
@ -102,6 +102,9 @@ struct _ClutterDeviceManagerEvdevPrivate
|
||||
gpointer constrain_data;
|
||||
GDestroyNotify constrain_data_notify;
|
||||
|
||||
ClutterRelativeMotionFilter relative_motion_filter;
|
||||
gpointer relative_motion_filter_user_data;
|
||||
|
||||
ClutterStageManager *stage_manager;
|
||||
guint stage_added_handler;
|
||||
guint stage_removed_handler;
|
||||
@ -264,6 +267,22 @@ _clutter_device_manager_evdev_constrain_pointer (ClutterDeviceManagerEvdev *mana
|
||||
}
|
||||
}
|
||||
|
||||
void
|
||||
_clutter_device_manager_evdev_filter_relative_motion (ClutterDeviceManagerEvdev *manager_evdev,
|
||||
ClutterInputDevice *device,
|
||||
float x,
|
||||
float y,
|
||||
float *dx,
|
||||
float *dy)
|
||||
{
|
||||
ClutterDeviceManagerEvdevPrivate *priv = manager_evdev->priv;
|
||||
|
||||
if (!priv->relative_motion_filter)
|
||||
return;
|
||||
|
||||
priv->relative_motion_filter (device, x, y, dx, dy,
|
||||
priv->relative_motion_filter_user_data);
|
||||
}
|
||||
|
||||
static ClutterEvent *
|
||||
new_absolute_motion_event (ClutterInputDevice *input_device,
|
||||
@ -358,11 +377,23 @@ notify_relative_tool_motion (ClutterInputDevice *input_device,
|
||||
gfloat dy,
|
||||
gdouble *axes)
|
||||
{
|
||||
ClutterInputDeviceEvdev *device_evdev;
|
||||
ClutterEvent *event;
|
||||
ClutterSeatEvdev *seat;
|
||||
gfloat x, y;
|
||||
|
||||
device_evdev = CLUTTER_INPUT_DEVICE_EVDEV (input_device);
|
||||
seat = _clutter_input_device_evdev_get_seat (device_evdev);
|
||||
x = input_device->current_x + dx;
|
||||
y = input_device->current_y + dy;
|
||||
|
||||
_clutter_device_manager_evdev_filter_relative_motion (seat->manager_evdev,
|
||||
input_device,
|
||||
seat->pointer_x,
|
||||
seat->pointer_y,
|
||||
&dx,
|
||||
&dy);
|
||||
|
||||
event = new_absolute_motion_event (input_device, time_us, x, y, axes);
|
||||
_clutter_evdev_event_set_relative_motion (event, dx, dy, 0, 0);
|
||||
|
||||
@ -2661,6 +2692,23 @@ clutter_evdev_set_pointer_constrain_callback (ClutterDeviceManager *e
|
||||
priv->constrain_data_notify = user_data_notify;
|
||||
}
|
||||
|
||||
void
|
||||
clutter_evdev_set_relative_motion_filter (ClutterDeviceManager *evdev,
|
||||
ClutterRelativeMotionFilter filter,
|
||||
gpointer user_data)
|
||||
{
|
||||
ClutterDeviceManagerEvdev *manager_evdev;
|
||||
ClutterDeviceManagerEvdevPrivate *priv;
|
||||
|
||||
g_return_if_fail (CLUTTER_IS_DEVICE_MANAGER_EVDEV (evdev));
|
||||
|
||||
manager_evdev = CLUTTER_DEVICE_MANAGER_EVDEV (evdev);
|
||||
priv = manager_evdev->priv;
|
||||
|
||||
priv->relative_motion_filter = filter;
|
||||
priv->relative_motion_filter_user_data = user_data;
|
||||
}
|
||||
|
||||
/**
|
||||
* clutter_evdev_set_keyboard_repeat:
|
||||
* @evdev: the #ClutterDeviceManager created by the evdev backend
|
||||
|
@ -76,6 +76,13 @@ void _clutter_device_manager_evdev_constrain_pointer (ClutterDeviceManagerEvdev
|
||||
float *new_x,
|
||||
float *new_y);
|
||||
|
||||
void _clutter_device_manager_evdev_filter_relative_motion (ClutterDeviceManagerEvdev *manager_evdev,
|
||||
ClutterInputDevice *device,
|
||||
float x,
|
||||
float y,
|
||||
float *dx,
|
||||
float *dy);
|
||||
|
||||
void _clutter_device_manager_evdev_dispatch (ClutterDeviceManagerEvdev *manager_evdev);
|
||||
|
||||
static inline guint64
|
||||
|
@ -97,6 +97,18 @@ void clutter_evdev_set_pointer_constrain_callback (ClutterDeviceManager
|
||||
gpointer user_data,
|
||||
GDestroyNotify user_data_notify);
|
||||
|
||||
typedef void (*ClutterRelativeMotionFilter) (ClutterInputDevice *device,
|
||||
float x,
|
||||
float y,
|
||||
float *dx,
|
||||
float *dy,
|
||||
gpointer user_data);
|
||||
|
||||
CLUTTER_AVAILABLE_IN_MUTTER
|
||||
void clutter_evdev_set_relative_motion_filter (ClutterDeviceManager *evdev,
|
||||
ClutterRelativeMotionFilter filter,
|
||||
gpointer user_data);
|
||||
|
||||
CLUTTER_AVAILABLE_IN_1_16
|
||||
void clutter_evdev_set_keyboard_map (ClutterDeviceManager *evdev,
|
||||
struct xkb_keymap *keymap);
|
||||
|
@ -405,6 +405,13 @@ clutter_seat_evdev_notify_relative_motion (ClutterSeatEvdev *seat,
|
||||
if (!_clutter_input_device_get_stage (input_device))
|
||||
return;
|
||||
|
||||
_clutter_device_manager_evdev_filter_relative_motion (seat->manager_evdev,
|
||||
input_device,
|
||||
seat->pointer_x,
|
||||
seat->pointer_y,
|
||||
&dx,
|
||||
&dy);
|
||||
|
||||
new_x = seat->pointer_x + dx;
|
||||
new_y = seat->pointer_y + dy;
|
||||
event = new_absolute_motion_event (seat, input_device,
|
||||
|
@ -6,7 +6,6 @@ static const struct {
|
||||
const char *xsetting_name;
|
||||
const char *settings_property;
|
||||
} _clutter_settings_map[] = {
|
||||
{ "Net/DoubleClickTime", "double-click-time" },
|
||||
{ "Net/DoubleClickDistance", "double-click-distance" },
|
||||
{ "Net/DndDragThreshold", "dnd-drag-threshold" },
|
||||
{ "Gtk/FontName", "font-name" },
|
||||
|
@ -350,7 +350,8 @@ actor_replace_child (void)
|
||||
g_assert_cmpstr (clutter_actor_get_name (iter), ==, "qux");
|
||||
|
||||
clutter_actor_add_child (actor, g_object_new (CLUTTER_TYPE_ACTOR,
|
||||
"name", "foo"));
|
||||
"name", "foo",
|
||||
NULL));
|
||||
|
||||
clutter_actor_replace_child (actor, iter,
|
||||
g_object_new (CLUTTER_TYPE_ACTOR,
|
||||
|
@ -42,7 +42,7 @@
|
||||
#include <cogl/winsys/cogl-winsys-egl-private.h>
|
||||
#include <cogl/winsys/cogl-winsys-private.h>
|
||||
|
||||
void cogl_renderer_set_custom_winsys (CoglRenderer *renderer,
|
||||
CoglWinsysVtableGetter winsys_vtable_getter);
|
||||
void cogl_renderer_set_custom_winsys (CoglRenderer *renderer,
|
||||
CoglCustomWinsysVtableGetter winsys_vtable_getter);
|
||||
|
||||
#endif /* __COGL_MUTTER_H___ */
|
||||
|
@ -39,12 +39,13 @@
|
||||
#include "cogl-texture-driver.h"
|
||||
#include "cogl-context.h"
|
||||
#include "cogl-closure-list-private.h"
|
||||
#include "cogl-mutter.h"
|
||||
|
||||
#ifdef COGL_HAS_XLIB_SUPPORT
|
||||
#include <X11/Xlib.h>
|
||||
#endif
|
||||
|
||||
typedef const CoglWinsysVtable *(*CoglCustomWinsysVtableGetter) (CoglRenderer *renderer);
|
||||
|
||||
struct _CoglRenderer
|
||||
{
|
||||
CoglObject _parent;
|
||||
@ -53,7 +54,7 @@ struct _CoglRenderer
|
||||
const CoglDriverVtable *driver_vtable;
|
||||
const CoglTextureDriver *texture_driver;
|
||||
const CoglWinsysVtable *winsys_vtable;
|
||||
CoglWinsysVtableGetter custom_winsys_vtable_getter;
|
||||
CoglCustomWinsysVtableGetter custom_winsys_vtable_getter;
|
||||
CoglWinsysID winsys_id_override;
|
||||
GList *constraints;
|
||||
|
||||
|
@ -565,8 +565,8 @@ _cogl_renderer_choose_driver (CoglRenderer *renderer,
|
||||
/* Final connection API */
|
||||
|
||||
void
|
||||
cogl_renderer_set_custom_winsys (CoglRenderer *renderer,
|
||||
CoglWinsysVtableGetter winsys_vtable_getter)
|
||||
cogl_renderer_set_custom_winsys (CoglRenderer *renderer,
|
||||
CoglCustomWinsysVtableGetter winsys_vtable_getter)
|
||||
{
|
||||
renderer->custom_winsys_vtable_getter = winsys_vtable_getter;
|
||||
}
|
||||
@ -575,10 +575,11 @@ static CoglBool
|
||||
connect_custom_winsys (CoglRenderer *renderer,
|
||||
CoglError **error)
|
||||
{
|
||||
const CoglWinsysVtable *winsys = renderer->custom_winsys_vtable_getter();
|
||||
const CoglWinsysVtable *winsys;
|
||||
CoglError *tmp_error = NULL;
|
||||
GString *error_message;
|
||||
|
||||
winsys = renderer->custom_winsys_vtable_getter (renderer);
|
||||
renderer->winsys_vtable = winsys;
|
||||
|
||||
error_message = g_string_new ("");
|
||||
|
@ -198,6 +198,7 @@ struct _CoglTextureDriver
|
||||
CoglPixelFormat
|
||||
(* find_best_gl_get_data_format) (CoglContext *context,
|
||||
CoglPixelFormat format,
|
||||
CoglPixelFormat target_format,
|
||||
GLenum *closest_gl_format,
|
||||
GLenum *closest_gl_type);
|
||||
};
|
||||
|
@ -1059,6 +1059,7 @@ cogl_texture_get_data (CoglTexture *texture,
|
||||
|
||||
closest_format =
|
||||
ctx->texture_driver->find_best_gl_get_data_format (ctx,
|
||||
texture_format,
|
||||
format,
|
||||
&closest_gl_format,
|
||||
&closest_gl_type);
|
||||
|
@ -533,14 +533,16 @@ static CoglPixelFormat
|
||||
_cogl_texture_driver_find_best_gl_get_data_format
|
||||
(CoglContext *context,
|
||||
CoglPixelFormat format,
|
||||
CoglPixelFormat target_format,
|
||||
GLenum *closest_gl_format,
|
||||
GLenum *closest_gl_type)
|
||||
{
|
||||
return context->driver_vtable->pixel_format_to_gl (context,
|
||||
format,
|
||||
NULL, /* don't need */
|
||||
closest_gl_format,
|
||||
closest_gl_type);
|
||||
return context->driver_vtable->pixel_format_to_gl_with_target (context,
|
||||
format,
|
||||
target_format,
|
||||
NULL, /* don't need */
|
||||
closest_gl_format,
|
||||
closest_gl_type);
|
||||
}
|
||||
|
||||
const CoglTextureDriver
|
||||
|
@ -615,6 +615,7 @@ static CoglPixelFormat
|
||||
_cogl_texture_driver_find_best_gl_get_data_format
|
||||
(CoglContext *context,
|
||||
CoglPixelFormat format,
|
||||
CoglPixelFormat target_format,
|
||||
GLenum *closest_gl_format,
|
||||
GLenum *closest_gl_type)
|
||||
{
|
||||
|
@ -2,7 +2,7 @@ AC_PREREQ(2.62)
|
||||
|
||||
m4_define([mutter_major_version], [3])
|
||||
m4_define([mutter_minor_version], [24])
|
||||
m4_define([mutter_micro_version], [0])
|
||||
m4_define([mutter_micro_version], [3])
|
||||
|
||||
m4_define([mutter_version],
|
||||
[mutter_major_version.mutter_minor_version.mutter_micro_version])
|
||||
|
142
po/el.po
142
po/el.po
@ -18,18 +18,18 @@
|
||||
msgid ""
|
||||
msgstr ""
|
||||
"Project-Id-Version: metacity.gnome-2-26\n"
|
||||
"Report-Msgid-Bugs-To: http://bugzilla.gnome.org/enter_bug.cgi?"
|
||||
"Report-Msgid-Bugs-To: https://bugzilla.gnome.org/enter_bug.cgi?"
|
||||
"product=mutter&keywords=I18N+L10N&component=general\n"
|
||||
"POT-Creation-Date: 2016-09-07 09:27+0000\n"
|
||||
"PO-Revision-Date: 2016-09-15 11:47+0300\n"
|
||||
"Last-Translator: Tom Tryfonidis <tomtryf@gmail.com>\n"
|
||||
"POT-Creation-Date: 2017-02-28 06:20+0000\n"
|
||||
"PO-Revision-Date: 2017-04-07 13:41+0300\n"
|
||||
"Last-Translator: Tom Tryfonidis <tomtryf@gnome.org>\n"
|
||||
"Language-Team: Greek, Modern (1453-) <opensuse-translation-el@opensuse.org>\n"
|
||||
"Language: el\n"
|
||||
"MIME-Version: 1.0\n"
|
||||
"Content-Type: text/plain; charset=UTF-8\n"
|
||||
"Content-Transfer-Encoding: 8bit\n"
|
||||
"Plural-Forms: nplurals=2; plural=(n != 1);\n"
|
||||
"X-Generator: Poedit 1.8.9\n"
|
||||
"X-Generator: Poedit 1.8.11\n"
|
||||
"X-Project-Style: gnome\n"
|
||||
|
||||
#: data/50-mutter-navigation.xml:6
|
||||
@ -282,16 +282,15 @@ 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."
|
||||
"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 ""
|
||||
"Αυτό το πλήκτρο θα ξεκινήσει την \"επικάλυψη\", που είναι συνδυασμένο "
|
||||
"σύστημα επισκόπησης παραθύρων και εκκίνησης εφαρμογών. Η προεπιλογή "
|
||||
"προτίθεται να είναι το \"πλήκτρο Windows\" σε μηχανήματα PC. Αναμένεται ότι "
|
||||
"αυτή η αντιστοίχιση θα είναι είτε η προεπιλογή ή θα ορίζεται στην κενή "
|
||||
"συμβολοσειρά."
|
||||
"Αυτό το πλήκτρο θα ξεκινήσει την «επικάλυψη», που είναι συνδυασμένο σύστημα "
|
||||
"επισκόπησης παραθύρων και εκκίνησης εφαρμογών. Η προεπιλογή προτίθεται να "
|
||||
"είναι το «πλήκτρο Windows» σε μηχανήματα PC. Αναμένεται ότι αυτή η "
|
||||
"αντιστοίχιση θα είναι είτε η προεπιλογή ή θα ορίζεται στην κενή συμβολοσειρά."
|
||||
|
||||
#: data/org.gnome.mutter.gschema.xml.in:20
|
||||
msgid "Attach modal dialogs"
|
||||
@ -330,7 +329,7 @@ msgstr "Οι χώροι εργασίας διαχειρίζονται δυναμ
|
||||
|
||||
#: data/org.gnome.mutter.gschema.xml.in:41
|
||||
msgid ""
|
||||
"Determines whether workspaces are managed dynamically or whether there's a "
|
||||
"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 ""
|
||||
@ -369,13 +368,13 @@ 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."
|
||||
"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 ""
|
||||
"Αν οριστεί σε αληθής, και η λειτουργία της εστίασης είναι \"sloppy\" ή "
|
||||
"\"mouse\" τότε η εστίαση δεν θα αλλάξει αμέσως όταν ανοίγετε ένα παράθυρο, "
|
||||
"αλλά μόνο όταν ο δείκτης σταματήσει να κινείται."
|
||||
"Αν οριστεί σε αληθής, και η λειτουργία της εστίασης είναι «sloppy» ή «mouse» "
|
||||
"τότε η εστίαση δεν θα αλλάξει αμέσως όταν ανοίγετε ένα παράθυρο, αλλά μόνο "
|
||||
"όταν ο δείκτης σταματήσει να κινείται."
|
||||
|
||||
#: data/org.gnome.mutter.gschema.xml.in:79
|
||||
msgid "Draggable border width"
|
||||
@ -383,7 +382,7 @@ msgstr "Συρόμενο πλάτος περιγράμματος"
|
||||
|
||||
#: data/org.gnome.mutter.gschema.xml.in:80
|
||||
msgid ""
|
||||
"The amount of total draggable borders. If the theme's visible borders are "
|
||||
"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 ""
|
||||
"Το ποσό των συνολικών συρόμενων περιγραμμάτων. Αν τα περιγράμματα του "
|
||||
@ -472,48 +471,59 @@ msgstr "Εναλλαγή στο VT 11"
|
||||
msgid "Switch to VT 12"
|
||||
msgstr "Εναλλαγή στο VT 12"
|
||||
|
||||
#: src/backends/meta-input-settings.c:1707
|
||||
#. TRANSLATORS: This string refers to a button that switches between
|
||||
#. * different modes.
|
||||
#.
|
||||
#: src/backends/meta-input-settings.c:1800
|
||||
#, c-format
|
||||
msgid "Mode Switch (Group %d)"
|
||||
msgstr "Λειτουργία διακόπτη (ομάδα %d)"
|
||||
|
||||
#. TRANSLATORS: This string refers to an action, cycles drawing tablets'
|
||||
#. * mapping through the available outputs.
|
||||
#.
|
||||
#: src/backends/meta-input-settings.c:1822
|
||||
msgid "Switch monitor"
|
||||
msgstr "Εναλλαγή οθόνης"
|
||||
|
||||
#: src/backends/meta-input-settings.c:1709
|
||||
#: src/backends/meta-input-settings.c:1824
|
||||
msgid "Show on-screen help"
|
||||
msgstr "Εμφάνιση βοήθειας στην οθόνη"
|
||||
|
||||
#: src/backends/meta-monitor-manager.c:514
|
||||
#: src/backends/meta-monitor-manager.c:675
|
||||
msgid "Built-in display"
|
||||
msgstr "Ενσωματωμένη οθόνη"
|
||||
|
||||
#: src/backends/meta-monitor-manager.c:537
|
||||
#: src/backends/meta-monitor-manager.c:698
|
||||
msgid "Unknown"
|
||||
msgstr "Άγνωστη"
|
||||
|
||||
#: src/backends/meta-monitor-manager.c:539
|
||||
#: src/backends/meta-monitor-manager.c:700
|
||||
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:547
|
||||
#: src/backends/meta-monitor-manager.c:708
|
||||
#, c-format
|
||||
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:463
|
||||
#: src/compositor/compositor.c:471
|
||||
#, c-format
|
||||
msgid ""
|
||||
"Another compositing manager is already running on screen %i on display \"%s"
|
||||
"\"."
|
||||
"Another compositing manager is already running on screen %i on display “%s”."
|
||||
msgstr ""
|
||||
"Εκτελείται ένας άλλος διαχειριστής παραθύρων στην οθόνη %i προβολή \"%s\"."
|
||||
"Εκτελείται ένας άλλος διαχειριστής παραθύρων στην οθόνη %i προβολή «%s»."
|
||||
|
||||
#: src/core/bell.c:194
|
||||
msgid "Bell event"
|
||||
msgstr "Ηχητικό συμβάν κουδουνιού"
|
||||
|
||||
#. Translators: %s is a window title
|
||||
#: src/core/delete.c:127
|
||||
#, c-format
|
||||
msgid "“%s” is not responding."
|
||||
@ -531,53 +541,53 @@ msgstr ""
|
||||
"Μπορείτε να επιλέξετε να περιμένετε λίγο για να συνεχίσει, ή να εξαναγκάσετε "
|
||||
"την εφαρμογή σε έξοδο."
|
||||
|
||||
#: src/core/delete.c:141
|
||||
msgid "_Wait"
|
||||
msgstr "_Αναμονή"
|
||||
|
||||
#: src/core/delete.c:141
|
||||
msgid "_Force Quit"
|
||||
msgstr "_Εξαναγκασμός σε τερματισμό"
|
||||
|
||||
# gconf/gconf-internals.c:2416
|
||||
#: src/core/display.c:590
|
||||
#, c-format
|
||||
msgid "Failed to open X Window System display '%s'\n"
|
||||
msgstr "Αποτυχία ανοίγματος οθόνης του συστήματος παραθύρων Χ '%s'\n"
|
||||
#: src/core/delete.c:141
|
||||
msgid "_Wait"
|
||||
msgstr "_Αναμονή"
|
||||
|
||||
#: src/core/main.c:182
|
||||
# gconf/gconf-internals.c:2416
|
||||
#: 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
|
||||
msgid "Disable connection to session manager"
|
||||
msgstr "Απενεργοποίηση σύνδεσης στο διαχειριστή συνεδρίας"
|
||||
|
||||
#: src/core/main.c:188
|
||||
#: src/core/main.c:195
|
||||
msgid "Replace the running window manager"
|
||||
msgstr "Αντικατάσταση του τρέχοντος διαχειριστή παραθύρων"
|
||||
|
||||
#: src/core/main.c:194
|
||||
#: src/core/main.c:201
|
||||
msgid "Specify session management ID"
|
||||
msgstr "Καθορισμός αναγνωριστικού διαχείρισης συνεδρίας"
|
||||
|
||||
#: src/core/main.c:199
|
||||
#: src/core/main.c:206
|
||||
msgid "X Display to use"
|
||||
msgstr "Εμφάνιση Χ για χρήση"
|
||||
|
||||
#: src/core/main.c:205
|
||||
#: src/core/main.c:212
|
||||
msgid "Initialize session from savefile"
|
||||
msgstr "Εκκίνηση συνεδρίας από savefile"
|
||||
|
||||
#: src/core/main.c:211
|
||||
#: src/core/main.c:218
|
||||
msgid "Make X calls synchronous"
|
||||
msgstr "Να καταστούν σύγχρονες οι κλήσεις του X"
|
||||
|
||||
#: src/core/main.c:218
|
||||
#: src/core/main.c:225
|
||||
msgid "Run as a wayland compositor"
|
||||
msgstr "Εκτέλεση ως wayland compositor"
|
||||
|
||||
#: src/core/main.c:224
|
||||
#: src/core/main.c:231
|
||||
msgid "Run as a nested compositor"
|
||||
msgstr "Εκτέλεση ως ενσωματωμένος compositor"
|
||||
|
||||
#: src/core/main.c:232
|
||||
#: src/core/main.c:239
|
||||
msgid "Run as a full display server, rather than nested"
|
||||
msgstr "Εκτέλεση ως διακομιστής πλήρους οθόνης, αντί ενσωματωμένης"
|
||||
|
||||
@ -585,14 +595,13 @@ msgstr "Εκτέλεση ως διακομιστής πλήρους οθόνης
|
||||
#, c-format
|
||||
msgid ""
|
||||
"mutter %s\n"
|
||||
"Copyright (C) 2001-%d Havoc Pennington, Red Hat, Inc., and others\n"
|
||||
"Copyright © 2001-%d Havoc Pennington, Red Hat, Inc., and others\n"
|
||||
"This is free software; see the source for copying conditions.\n"
|
||||
"There is NO warranty; not even for MERCHANTABILITY or FITNESS FOR A "
|
||||
"PARTICULAR PURPOSE.\n"
|
||||
msgstr ""
|
||||
"mutter %s\n"
|
||||
"Πνευματικά Δικαιώματα (C) 2001-%d Havoc Pennington, Red Hat, Inc., και "
|
||||
"άλλοι\n"
|
||||
"Πνευματικά Δικαιώματα © 2001-%d Havoc Pennington, Red Hat, Inc., και άλλοι\n"
|
||||
"Αυτό είναι ελεύθερο λογισμικό, βλ. τον πηγαίο κώδικα για όρους αντιγραφής.\n"
|
||||
"ΔΕΝ παρέχεται καμία εγγύηση, ούτε ΕΜΠΟΡΕΥΣΙΜΟΤΗΤΑΣ ούτε ΚΑΤΑΛΛΗΛΟΤΗΤΑΣ ΓΙΑ "
|
||||
"ΣΥΓΚΕΚΡΙΜΕΝΟ ΣΚΟΠΟ.\n"
|
||||
@ -610,20 +619,20 @@ msgstr "Πρόσθετα του Mutter για χρήση"
|
||||
msgid "Workspace %d"
|
||||
msgstr "Χώρος εργασίας %d"
|
||||
|
||||
#: src/core/screen.c:521
|
||||
#: src/core/screen.c:580
|
||||
#, c-format
|
||||
msgid ""
|
||||
"Display \"%s\" already has a window manager; try using the --replace option "
|
||||
"to replace the current window manager."
|
||||
"Display “%s” already has a window manager; try using the --replace option to "
|
||||
"replace the current window manager."
|
||||
msgstr ""
|
||||
"Η προβολή \"%s\" έχει ήδη ένα διαχειριστή παραθύρων· προσπαθήστε να "
|
||||
"Η προβολή «%s» έχει ήδη ένα διαχειριστή παραθύρων· προσπαθήστε να "
|
||||
"χρησιμοποιήσετε την επιλογή --replace για να αντικαταστήσετε τον τρέχων "
|
||||
"διαχειριστή παραθύρων."
|
||||
|
||||
#: src/core/screen.c:606
|
||||
#: src/core/screen.c:665
|
||||
#, c-format
|
||||
msgid "Screen %d on display '%s' is invalid\n"
|
||||
msgstr "Η οθόνη %d στην προβολή '%s' δεν είναι έγκυρη\n"
|
||||
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"
|
||||
@ -631,21 +640,20 @@ msgstr ""
|
||||
"Το Mutter έχει μεταγλωττιστεί χωρίς υποστήριξη για λειτουργία εμφάνισης "
|
||||
"λεπτομερειών\n"
|
||||
|
||||
#: src/wayland/meta-wayland-tablet-pad.c:595
|
||||
#: src/wayland/meta-wayland-tablet-pad.c:563
|
||||
#, c-format
|
||||
msgid "Mode Switch: Mode %d"
|
||||
msgstr "Λειτουργία διακόπτη: Λειτουργία %d"
|
||||
|
||||
#: src/x11/session.c:1815
|
||||
msgid ""
|
||||
"These windows do not support "save current setup" and will have to "
|
||||
"be restarted manually next time you log in."
|
||||
"These windows do not support “save current setup” and will have to be "
|
||||
"restarted manually next time you log in."
|
||||
msgstr ""
|
||||
"Αυτά τα παράθυρα δεν υποστηρίζουν "αποθήκευση της τρέχουσας "
|
||||
"εγκατάστασης" και θα πρέπει να επανεκκινηθούν χειροκίνητα στην επόμενη "
|
||||
"είσοδο σας."
|
||||
"Αυτά τα παράθυρα δεν υποστηρίζουν «αποθήκευση της τρέχουσας εγκατάστασης» "
|
||||
"και θα πρέπει να επανεκκινηθούν χειροκίνητα στην επόμενη είσοδο σας."
|
||||
|
||||
#: src/x11/window-props.c:548
|
||||
#: src/x11/window-props.c:559
|
||||
#, c-format
|
||||
msgid "%s (on %s)"
|
||||
msgstr "%s (σε %s)"
|
||||
|
349
po/he.po
349
po/he.po
@ -9,9 +9,10 @@
|
||||
msgid ""
|
||||
msgstr ""
|
||||
"Project-Id-Version: metacity.HEAD.he\n"
|
||||
"Report-Msgid-Bugs-To: \n"
|
||||
"POT-Creation-Date: 2016-08-07 15:11+0300\n"
|
||||
"PO-Revision-Date: 2016-08-07 15:12+0300\n"
|
||||
"Report-Msgid-Bugs-To: http://bugzilla.gnome.org/enter_bug.cgi?"
|
||||
"product=mutter&keywords=I18N+L10N&component=general\n"
|
||||
"POT-Creation-Date: 2017-03-30 18:41+0300\n"
|
||||
"PO-Revision-Date: 2017-03-30 18:46+0300\n"
|
||||
"Last-Translator: Yosef Or Boczko <yoseforb@gmail.com>\n"
|
||||
"Language-Team: עברית <>\n"
|
||||
"Language: he\n"
|
||||
@ -21,271 +22,272 @@ msgstr ""
|
||||
"X-Generator: Gtranslator 2.91.6\n"
|
||||
"Plural-Forms: nplurals=2; plural=(n != 1);\n"
|
||||
|
||||
#: ../data/50-mutter-navigation.xml.in.h:1
|
||||
#: data/50-mutter-navigation.xml:6
|
||||
msgid "Navigation"
|
||||
msgstr "ניווט"
|
||||
|
||||
#: ../data/50-mutter-navigation.xml.in.h:2
|
||||
#: data/50-mutter-navigation.xml:9
|
||||
msgid "Move window to workspace 1"
|
||||
msgstr "העברת החלון למרחב עבודה 1"
|
||||
|
||||
#: ../data/50-mutter-navigation.xml.in.h:3
|
||||
#: data/50-mutter-navigation.xml:12
|
||||
msgid "Move window to workspace 2"
|
||||
msgstr "העברת החלון למרחב עבודה 2"
|
||||
|
||||
#: ../data/50-mutter-navigation.xml.in.h:4
|
||||
#: data/50-mutter-navigation.xml:15
|
||||
msgid "Move window to workspace 3"
|
||||
msgstr "העברה החלון למרחב עבודה 3"
|
||||
|
||||
#: ../data/50-mutter-navigation.xml.in.h:5
|
||||
#: data/50-mutter-navigation.xml:18
|
||||
msgid "Move window to workspace 4"
|
||||
msgstr "העברה החלון למרחב עבודה 4"
|
||||
|
||||
#: ../data/50-mutter-navigation.xml.in.h:6
|
||||
#: data/50-mutter-navigation.xml:21
|
||||
msgid "Move window to last workspace"
|
||||
msgstr "העברת החלון למרחב העבודה האחרון"
|
||||
|
||||
#: ../data/50-mutter-navigation.xml.in.h:7
|
||||
#: data/50-mutter-navigation.xml:24
|
||||
msgid "Move window one workspace to the left"
|
||||
msgstr "העברת החלון למרחב העבודה שמשמאל"
|
||||
|
||||
#: ../data/50-mutter-navigation.xml.in.h:8
|
||||
#: data/50-mutter-navigation.xml:27
|
||||
msgid "Move window one workspace to the right"
|
||||
msgstr "העברת החלון למרחב העבודה שמימין"
|
||||
|
||||
#: ../data/50-mutter-navigation.xml.in.h:9
|
||||
#: data/50-mutter-navigation.xml:30
|
||||
msgid "Move window one workspace up"
|
||||
msgstr "העברת החלון למרחב העבודה שמלמעלה"
|
||||
|
||||
#: ../data/50-mutter-navigation.xml.in.h:10
|
||||
#: data/50-mutter-navigation.xml:33
|
||||
msgid "Move window one workspace down"
|
||||
msgstr "העברת החלון למרחב העבודה שמלמטה"
|
||||
|
||||
#: ../data/50-mutter-navigation.xml.in.h:11
|
||||
#: data/50-mutter-navigation.xml:36
|
||||
msgid "Move window one monitor to the left"
|
||||
msgstr "העברת החלון לצג שמשמאל"
|
||||
|
||||
#: ../data/50-mutter-navigation.xml.in.h:12
|
||||
#: data/50-mutter-navigation.xml:39
|
||||
msgid "Move window one monitor to the right"
|
||||
msgstr "העברת החלון לצג שמימין"
|
||||
|
||||
#: ../data/50-mutter-navigation.xml.in.h:13
|
||||
#: data/50-mutter-navigation.xml:42
|
||||
msgid "Move window one monitor up"
|
||||
msgstr "העברת החלון לצג שמלמעלה"
|
||||
|
||||
#: ../data/50-mutter-navigation.xml.in.h:14
|
||||
#: data/50-mutter-navigation.xml:45
|
||||
msgid "Move window one monitor down"
|
||||
msgstr "העברת החלון לצג שמלמטה"
|
||||
|
||||
#: ../data/50-mutter-navigation.xml.in.h:15
|
||||
#: data/50-mutter-navigation.xml:49
|
||||
msgid "Switch applications"
|
||||
msgstr "החלפה בין יישומים"
|
||||
|
||||
#: ../data/50-mutter-navigation.xml.in.h:16
|
||||
#: data/50-mutter-navigation.xml:54
|
||||
msgid "Switch to previous application"
|
||||
msgstr "החלפה ליישום הקודם"
|
||||
|
||||
#: ../data/50-mutter-navigation.xml.in.h:17
|
||||
#: data/50-mutter-navigation.xml:58
|
||||
msgid "Switch windows"
|
||||
msgstr "החלפת חלונות"
|
||||
|
||||
#: ../data/50-mutter-navigation.xml.in.h:18
|
||||
#: data/50-mutter-navigation.xml:63
|
||||
msgid "Switch to previous window"
|
||||
msgstr "החלפה לחלון הקודם"
|
||||
|
||||
#: ../data/50-mutter-navigation.xml.in.h:19
|
||||
#: data/50-mutter-navigation.xml:67
|
||||
msgid "Switch windows of an application"
|
||||
msgstr "החלפה בין חלונות של יישום"
|
||||
|
||||
#: ../data/50-mutter-navigation.xml.in.h:20
|
||||
#: data/50-mutter-navigation.xml:72
|
||||
msgid "Switch to previous window of an application"
|
||||
msgstr "החלפה לחלון הקודם של היישום"
|
||||
|
||||
#: ../data/50-mutter-navigation.xml.in.h:21
|
||||
#: data/50-mutter-navigation.xml:76
|
||||
msgid "Switch system controls"
|
||||
msgstr "החלפה בין פקדי המערכת"
|
||||
|
||||
#: ../data/50-mutter-navigation.xml.in.h:22
|
||||
#: data/50-mutter-navigation.xml:81
|
||||
msgid "Switch to previous system control"
|
||||
msgstr "החלפה לפקד המערכת הקודם"
|
||||
|
||||
#: ../data/50-mutter-navigation.xml.in.h:23
|
||||
#: data/50-mutter-navigation.xml:85
|
||||
msgid "Switch windows directly"
|
||||
msgstr "החלפת החלונות באופן ישיר"
|
||||
|
||||
#: ../data/50-mutter-navigation.xml.in.h:24
|
||||
#: data/50-mutter-navigation.xml:90
|
||||
msgid "Switch directly to previous window"
|
||||
msgstr "החלפה לחלון הקודם באופן ישיר"
|
||||
|
||||
#: ../data/50-mutter-navigation.xml.in.h:25
|
||||
#: data/50-mutter-navigation.xml:94
|
||||
msgid "Switch windows of an app directly"
|
||||
msgstr "החלפת חלונות של יישום באופן ישיר"
|
||||
|
||||
#: ../data/50-mutter-navigation.xml.in.h:26
|
||||
#: data/50-mutter-navigation.xml:99
|
||||
msgid "Switch directly to previous window of an app"
|
||||
msgstr "החלפה לחלון הקודם של היישום באופן ישיר"
|
||||
|
||||
#: ../data/50-mutter-navigation.xml.in.h:27
|
||||
#: data/50-mutter-navigation.xml:103
|
||||
msgid "Switch system controls directly"
|
||||
msgstr "החלפת פקדי המערכת באופן ישיר"
|
||||
|
||||
#: ../data/50-mutter-navigation.xml.in.h:28
|
||||
#: data/50-mutter-navigation.xml:108
|
||||
msgid "Switch directly to previous system control"
|
||||
msgstr "החלפה לפקד המערכת הקודם באופן ישיר"
|
||||
|
||||
#: ../data/50-mutter-navigation.xml.in.h:29
|
||||
#: data/50-mutter-navigation.xml:111
|
||||
msgid "Hide all normal windows"
|
||||
msgstr "הסתרת כל החלונות הרגילים"
|
||||
|
||||
#: ../data/50-mutter-navigation.xml.in.h:30
|
||||
#: data/50-mutter-navigation.xml:114
|
||||
msgid "Switch to workspace 1"
|
||||
msgstr "מעבר למרחב עבודה 1"
|
||||
|
||||
#: ../data/50-mutter-navigation.xml.in.h:31
|
||||
#: data/50-mutter-navigation.xml:117
|
||||
msgid "Switch to workspace 2"
|
||||
msgstr "מעבר למרחב עבודה 2"
|
||||
|
||||
#: ../data/50-mutter-navigation.xml.in.h:32
|
||||
#: data/50-mutter-navigation.xml:120
|
||||
msgid "Switch to workspace 3"
|
||||
msgstr "מעבר למרחב עבודה 3"
|
||||
|
||||
#: ../data/50-mutter-navigation.xml.in.h:33
|
||||
#: data/50-mutter-navigation.xml:123
|
||||
msgid "Switch to workspace 4"
|
||||
msgstr "מעבר למרחב עבודה 4"
|
||||
|
||||
#: ../data/50-mutter-navigation.xml.in.h:34
|
||||
#: data/50-mutter-navigation.xml:126
|
||||
msgid "Switch to last workspace"
|
||||
msgstr "מעבר למרחב העבודה האחרון"
|
||||
|
||||
#: ../data/50-mutter-navigation.xml.in.h:35
|
||||
#: data/50-mutter-navigation.xml:129
|
||||
msgid "Move to workspace left"
|
||||
msgstr "העברה למרחב העבודה לשמאל"
|
||||
|
||||
#: ../data/50-mutter-navigation.xml.in.h:36
|
||||
#: data/50-mutter-navigation.xml:132
|
||||
msgid "Move to workspace right"
|
||||
msgstr "העברה למרחב העבודה לימין"
|
||||
|
||||
#: ../data/50-mutter-navigation.xml.in.h:37
|
||||
#: data/50-mutter-navigation.xml:135
|
||||
msgid "Move to workspace above"
|
||||
msgstr "העברה למרחב העבודה שמלמעלה"
|
||||
|
||||
#: ../data/50-mutter-navigation.xml.in.h:38
|
||||
#: data/50-mutter-navigation.xml:138
|
||||
msgid "Move to workspace below"
|
||||
msgstr "העברה למרחב העבודה שמלמטה"
|
||||
|
||||
#: ../data/50-mutter-system.xml.in.h:1
|
||||
#: data/50-mutter-system.xml:6
|
||||
msgid "System"
|
||||
msgstr "מערכת"
|
||||
|
||||
#: ../data/50-mutter-system.xml.in.h:2
|
||||
#: data/50-mutter-system.xml:8
|
||||
msgid "Show the run command prompt"
|
||||
msgstr "הצגת החלונית להרצת פקודה"
|
||||
|
||||
#: ../data/50-mutter-system.xml.in.h:3
|
||||
#: data/50-mutter-system.xml:10
|
||||
msgid "Show the activities overview"
|
||||
msgstr "הצגת סקירת הפעילויות"
|
||||
|
||||
#: ../data/50-mutter-windows.xml.in.h:1
|
||||
#: data/50-mutter-windows.xml:6
|
||||
msgid "Windows"
|
||||
msgstr "חלונות"
|
||||
|
||||
#: ../data/50-mutter-windows.xml.in.h:2
|
||||
#: data/50-mutter-windows.xml:8
|
||||
msgid "Activate the window menu"
|
||||
msgstr "הפעלת תפריט החלון"
|
||||
|
||||
#: ../data/50-mutter-windows.xml.in.h:3
|
||||
#: data/50-mutter-windows.xml:10
|
||||
msgid "Toggle fullscreen mode"
|
||||
msgstr "הפעלה/כיבוי מצב מסך מלא"
|
||||
|
||||
#: ../data/50-mutter-windows.xml.in.h:4
|
||||
#: data/50-mutter-windows.xml:12
|
||||
msgid "Toggle maximization state"
|
||||
msgstr "הפעלה/כיבוי מצב הגדלה"
|
||||
|
||||
#: ../data/50-mutter-windows.xml.in.h:5
|
||||
#: data/50-mutter-windows.xml:14
|
||||
msgid "Maximize window"
|
||||
msgstr "הגדלת חלון"
|
||||
|
||||
#: ../data/50-mutter-windows.xml.in.h:6
|
||||
#: data/50-mutter-windows.xml:16
|
||||
msgid "Restore window"
|
||||
msgstr "שחזור חלון"
|
||||
|
||||
#: ../data/50-mutter-windows.xml.in.h:7
|
||||
#: data/50-mutter-windows.xml:18
|
||||
msgid "Toggle shaded state"
|
||||
msgstr "החלפת מצב ההצללה"
|
||||
|
||||
#: ../data/50-mutter-windows.xml.in.h:8
|
||||
#: data/50-mutter-windows.xml:20
|
||||
msgid "Close window"
|
||||
msgstr "סגירת חלון"
|
||||
|
||||
#: ../data/50-mutter-windows.xml.in.h:9
|
||||
#: data/50-mutter-windows.xml:22
|
||||
msgid "Hide window"
|
||||
msgstr "הסתרת החלון"
|
||||
|
||||
#: ../data/50-mutter-windows.xml.in.h:10
|
||||
#: data/50-mutter-windows.xml:24
|
||||
msgid "Move window"
|
||||
msgstr "הזזת חלון"
|
||||
|
||||
#: ../data/50-mutter-windows.xml.in.h:11
|
||||
#: data/50-mutter-windows.xml:26
|
||||
msgid "Resize window"
|
||||
msgstr "שינוי גודל חלון"
|
||||
|
||||
#: ../data/50-mutter-windows.xml.in.h:12
|
||||
#: data/50-mutter-windows.xml:29
|
||||
msgid "Toggle window on all workspaces or one"
|
||||
msgstr "החלפת המצב בין האם החלון מופיע במרחב עבודה אחד או בכולם"
|
||||
|
||||
#: ../data/50-mutter-windows.xml.in.h:13
|
||||
#: data/50-mutter-windows.xml:31
|
||||
msgid "Raise window if covered, otherwise lower it"
|
||||
msgstr "הגבהת החלון אם הוא מכוסה, אחרת יש להנמיכו"
|
||||
|
||||
#: ../data/50-mutter-windows.xml.in.h:14
|
||||
#: data/50-mutter-windows.xml:33
|
||||
msgid "Raise window above other windows"
|
||||
msgstr "הגבהת החלון מעל לחלונות אחרים"
|
||||
|
||||
#: ../data/50-mutter-windows.xml.in.h:15
|
||||
#: data/50-mutter-windows.xml:35
|
||||
msgid "Lower window below other windows"
|
||||
msgstr "הנמכת החלון מתחת לחלונות אחרים"
|
||||
|
||||
#: ../data/50-mutter-windows.xml.in.h:16
|
||||
#: data/50-mutter-windows.xml:37
|
||||
msgid "Maximize window vertically"
|
||||
msgstr "הגדלת החלון אנכית"
|
||||
|
||||
#: ../data/50-mutter-windows.xml.in.h:17
|
||||
#: data/50-mutter-windows.xml:39
|
||||
msgid "Maximize window horizontally"
|
||||
msgstr "הגדלת החלון אופקית"
|
||||
|
||||
#: ../data/50-mutter-windows.xml.in.h:18
|
||||
#: data/50-mutter-windows.xml:43
|
||||
msgid "View split on left"
|
||||
msgstr "פיצול הצפייה משמאל"
|
||||
|
||||
#: ../data/50-mutter-windows.xml.in.h:19
|
||||
#: data/50-mutter-windows.xml:47
|
||||
msgid "View split on right"
|
||||
msgstr "פיצול הצפייה מימין"
|
||||
|
||||
#: ../data/mutter.desktop.in.h:1
|
||||
#: data/mutter.desktop.in:4
|
||||
msgid "Mutter"
|
||||
msgstr "Mutter"
|
||||
|
||||
#: ../data/org.gnome.mutter.gschema.xml.in.h:1
|
||||
#: data/org.gnome.mutter.gschema.xml.in:7
|
||||
msgid "Modifier to use for extended window management operations"
|
||||
msgstr "Modifier to use for extended window management operations"
|
||||
|
||||
#: ../data/org.gnome.mutter.gschema.xml.in.h:2
|
||||
#: 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."
|
||||
"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 ""
|
||||
"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."
|
||||
"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."
|
||||
|
||||
#: ../data/org.gnome.mutter.gschema.xml.in.h:3
|
||||
#: data/org.gnome.mutter.gschema.xml.in:20
|
||||
msgid "Attach modal dialogs"
|
||||
msgstr "Attach modal dialogs"
|
||||
|
||||
#: ../data/org.gnome.mutter.gschema.xml.in.h:4
|
||||
#: 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 "
|
||||
@ -295,11 +297,11 @@ msgstr ""
|
||||
"attached to the titlebar of the parent window and are moved together with "
|
||||
"the parent window."
|
||||
|
||||
#: ../data/org.gnome.mutter.gschema.xml.in.h:5
|
||||
#: data/org.gnome.mutter.gschema.xml.in:30
|
||||
msgid "Enable edge tiling when dropping windows on screen edges"
|
||||
msgstr "Enable edge tiling when dropping windows on screen edges"
|
||||
|
||||
#: ../data/org.gnome.mutter.gschema.xml.in.h:6
|
||||
#: 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 "
|
||||
@ -309,25 +311,26 @@ msgstr ""
|
||||
"vertically and resizes them horizontally to cover half of the available "
|
||||
"area. Dropping windows on the top screen edge maximizes them completely."
|
||||
|
||||
#: ../data/org.gnome.mutter.gschema.xml.in.h:7
|
||||
#: data/org.gnome.mutter.gschema.xml.in:40
|
||||
msgid "Workspaces are managed dynamically"
|
||||
msgstr "Workspaces are managed dynamically"
|
||||
|
||||
#: ../data/org.gnome.mutter.gschema.xml.in.h:8
|
||||
#: data/org.gnome.mutter.gschema.xml.in:41
|
||||
#,
|
||||
msgid ""
|
||||
"Determines whether workspaces are managed dynamically or whether there's a "
|
||||
"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 ""
|
||||
"Determines whether workspaces are managed dynamically or whether there's a "
|
||||
"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)."
|
||||
|
||||
#: ../data/org.gnome.mutter.gschema.xml.in.h:9
|
||||
#: data/org.gnome.mutter.gschema.xml.in:50
|
||||
msgid "Workspaces only on primary"
|
||||
msgstr "Workspaces only on primary"
|
||||
|
||||
#: ../data/org.gnome.mutter.gschema.xml.in.h:10
|
||||
#: 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."
|
||||
@ -335,11 +338,11 @@ msgstr ""
|
||||
"Determines whether workspace switching should happen for windows on all "
|
||||
"monitors or only for windows on the primary monitor."
|
||||
|
||||
#: ../data/org.gnome.mutter.gschema.xml.in.h:11
|
||||
#: data/org.gnome.mutter.gschema.xml.in:59
|
||||
msgid "No tab popup"
|
||||
msgstr "No tab popup"
|
||||
|
||||
#: ../data/org.gnome.mutter.gschema.xml.in.h:12
|
||||
#: data/org.gnome.mutter.gschema.xml.in:60
|
||||
msgid ""
|
||||
"Determines whether the use of popup and highlight frame should be disabled "
|
||||
"for window cycling."
|
||||
@ -347,37 +350,38 @@ msgstr ""
|
||||
"Determines whether the use of popup and highlight frame should be disabled "
|
||||
"for window cycling."
|
||||
|
||||
#: ../data/org.gnome.mutter.gschema.xml.in.h:13
|
||||
#: data/org.gnome.mutter.gschema.xml.in:68
|
||||
msgid "Delay focus changes until the pointer stops moving"
|
||||
msgstr "Delay focus changes until the pointer stops moving"
|
||||
|
||||
#: ../data/org.gnome.mutter.gschema.xml.in.h:14
|
||||
#: 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."
|
||||
"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 ""
|
||||
"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."
|
||||
"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."
|
||||
|
||||
#: ../data/org.gnome.mutter.gschema.xml.in.h:15
|
||||
#: data/org.gnome.mutter.gschema.xml.in:79
|
||||
msgid "Draggable border width"
|
||||
msgstr "Draggable border width"
|
||||
|
||||
#: ../data/org.gnome.mutter.gschema.xml.in.h:16
|
||||
#: data/org.gnome.mutter.gschema.xml.in:80
|
||||
msgid ""
|
||||
"The amount of total draggable borders. If the theme's visible borders are "
|
||||
"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 ""
|
||||
"The amount of total draggable borders. If the theme's visible borders are "
|
||||
"The amount of total draggable borders. If the theme’s visible borders are "
|
||||
"not enough, invisible borders will be added to meet this value."
|
||||
|
||||
#: ../data/org.gnome.mutter.gschema.xml.in.h:17
|
||||
#: data/org.gnome.mutter.gschema.xml.in:89
|
||||
msgid "Auto maximize nearly monitor sized windows"
|
||||
msgstr "Auto maximize nearly monitor sized windows"
|
||||
|
||||
#: ../data/org.gnome.mutter.gschema.xml.in.h:18
|
||||
#: data/org.gnome.mutter.gschema.xml.in:90
|
||||
msgid ""
|
||||
"If enabled, new windows that are initially the size of the monitor "
|
||||
"automatically get maximized."
|
||||
@ -385,11 +389,11 @@ msgstr ""
|
||||
"If enabled, new windows that are initially the size of the monitor "
|
||||
"automatically get maximized."
|
||||
|
||||
#: ../data/org.gnome.mutter.gschema.xml.in.h:19
|
||||
#: data/org.gnome.mutter.gschema.xml.in:98
|
||||
msgid "Place new windows in the center"
|
||||
msgstr "Place new windows in the center"
|
||||
|
||||
#: ../data/org.gnome.mutter.gschema.xml.in.h:20
|
||||
#: 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."
|
||||
@ -397,173 +401,184 @@ msgstr ""
|
||||
"When true, the new windows will always be put in the center of the active "
|
||||
"screen of the monitor."
|
||||
|
||||
#: ../data/org.gnome.mutter.gschema.xml.in.h:21
|
||||
#: data/org.gnome.mutter.gschema.xml.in:120
|
||||
msgid "Select window from tab popup"
|
||||
msgstr "Select window from tab popup"
|
||||
|
||||
#: ../data/org.gnome.mutter.gschema.xml.in.h:22
|
||||
#: data/org.gnome.mutter.gschema.xml.in:125
|
||||
msgid "Cancel tab popup"
|
||||
msgstr "Cancel tab popup"
|
||||
|
||||
#: ../data/org.gnome.mutter.wayland.gschema.xml.in.h:1
|
||||
#: data/org.gnome.mutter.wayland.gschema.xml.in:6
|
||||
msgid "Switch to VT 1"
|
||||
msgstr "מעבר ל־VT 1"
|
||||
|
||||
#: ../data/org.gnome.mutter.wayland.gschema.xml.in.h:2
|
||||
#: data/org.gnome.mutter.wayland.gschema.xml.in:10
|
||||
msgid "Switch to VT 2"
|
||||
msgstr "מעבר ל־VT 2"
|
||||
|
||||
#: ../data/org.gnome.mutter.wayland.gschema.xml.in.h:3
|
||||
#: data/org.gnome.mutter.wayland.gschema.xml.in:14
|
||||
msgid "Switch to VT 3"
|
||||
msgstr "מעבר ל־VT 3"
|
||||
|
||||
#: ../data/org.gnome.mutter.wayland.gschema.xml.in.h:4
|
||||
#: data/org.gnome.mutter.wayland.gschema.xml.in:18
|
||||
msgid "Switch to VT 4"
|
||||
msgstr "מעבר ל־VT 4"
|
||||
|
||||
#: ../data/org.gnome.mutter.wayland.gschema.xml.in.h:5
|
||||
#: data/org.gnome.mutter.wayland.gschema.xml.in:22
|
||||
msgid "Switch to VT 5"
|
||||
msgstr "מעבר ל־VT 5"
|
||||
|
||||
#: ../data/org.gnome.mutter.wayland.gschema.xml.in.h:6
|
||||
#: data/org.gnome.mutter.wayland.gschema.xml.in:26
|
||||
msgid "Switch to VT 6"
|
||||
msgstr "מעבר ל־VT 6"
|
||||
|
||||
#: ../data/org.gnome.mutter.wayland.gschema.xml.in.h:7
|
||||
#: data/org.gnome.mutter.wayland.gschema.xml.in:30
|
||||
msgid "Switch to VT 7"
|
||||
msgstr "מעבר ל־VT 7"
|
||||
|
||||
#: ../data/org.gnome.mutter.wayland.gschema.xml.in.h:8
|
||||
#: data/org.gnome.mutter.wayland.gschema.xml.in:34
|
||||
msgid "Switch to VT 8"
|
||||
msgstr "מעבר ל־VT 8"
|
||||
|
||||
#: ../data/org.gnome.mutter.wayland.gschema.xml.in.h:9
|
||||
#: data/org.gnome.mutter.wayland.gschema.xml.in:38
|
||||
msgid "Switch to VT 9"
|
||||
msgstr "מעבר ל־VT 9"
|
||||
|
||||
#: ../data/org.gnome.mutter.wayland.gschema.xml.in.h:10
|
||||
#: data/org.gnome.mutter.wayland.gschema.xml.in:42
|
||||
msgid "Switch to VT 10"
|
||||
msgstr "מעבר ל־VT 10"
|
||||
|
||||
#: ../data/org.gnome.mutter.wayland.gschema.xml.in.h:11
|
||||
#: data/org.gnome.mutter.wayland.gschema.xml.in:46
|
||||
msgid "Switch to VT 11"
|
||||
msgstr "מעבר ל־VT 11"
|
||||
|
||||
#: ../data/org.gnome.mutter.wayland.gschema.xml.in.h:12
|
||||
#: data/org.gnome.mutter.wayland.gschema.xml.in:50
|
||||
msgid "Switch to VT 12"
|
||||
msgstr "מעבר ל־VT 12"
|
||||
|
||||
#: ../src/backends/meta-input-settings.c:1707
|
||||
#. TRANSLATORS: This string refers to a button that switches between
|
||||
#. * different modes.
|
||||
#.
|
||||
#: src/backends/meta-input-settings.c:1848
|
||||
#, c-format
|
||||
msgid "Mode Switch (Group %d)"
|
||||
msgstr "מצב העברה (קבוצה %d)"
|
||||
|
||||
#. TRANSLATORS: This string refers to an action, cycles drawing tablets'
|
||||
#. * mapping through the available outputs.
|
||||
#.
|
||||
#: src/backends/meta-input-settings.c:1870
|
||||
msgid "Switch monitor"
|
||||
msgstr "החלפה בין צגים"
|
||||
|
||||
#: ../src/backends/meta-input-settings.c:1709
|
||||
#: src/backends/meta-input-settings.c:1872
|
||||
msgid "Show on-screen help"
|
||||
msgstr "הצגת עזרה על המסך"
|
||||
|
||||
#: ../src/backends/meta-monitor-manager.c:515
|
||||
#: src/backends/meta-monitor-manager.c:630
|
||||
msgid "Built-in display"
|
||||
msgstr "תצוגה מובנית"
|
||||
|
||||
#: ../src/backends/meta-monitor-manager.c:538
|
||||
#: src/backends/meta-monitor-manager.c:653
|
||||
msgid "Unknown"
|
||||
msgstr "לא ידוע"
|
||||
|
||||
#: ../src/backends/meta-monitor-manager.c:540
|
||||
#: src/backends/meta-monitor-manager.c:655
|
||||
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:548
|
||||
#: src/backends/meta-monitor-manager.c:663
|
||||
#, c-format
|
||||
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:463
|
||||
#: src/compositor/compositor.c:474
|
||||
#, c-format
|
||||
msgid ""
|
||||
"Another compositing manager is already running on screen %i on display \"%s"
|
||||
"\"."
|
||||
"Another compositing manager is already running on screen %i on display “%s”."
|
||||
msgstr "מנהל תצוגת חלונות אחר כבר פועל במסך %i בתצוגה „%s“."
|
||||
|
||||
#: ../src/core/bell.c:194
|
||||
#: src/core/bell.c:194
|
||||
msgid "Bell event"
|
||||
msgstr "אירוע פעמון"
|
||||
|
||||
#: ../src/core/delete.c:127
|
||||
#. Translators: %s is a window title
|
||||
#: src/core/delete.c:127
|
||||
#, c-format
|
||||
msgid "“%s” is not responding."
|
||||
msgstr "„%s“ אינו מגיב."
|
||||
|
||||
#: ../src/core/delete.c:129
|
||||
#: src/core/delete.c:129
|
||||
msgid "Application is not responding."
|
||||
msgstr "היישום אינו מגיב."
|
||||
|
||||
#: ../src/core/delete.c:134
|
||||
#: src/core/delete.c:134
|
||||
msgid ""
|
||||
"You may choose to wait a short while for it to continue or force the "
|
||||
"application to quit entirely."
|
||||
msgstr ""
|
||||
"באפשרותך להמתין זמן קצר ולתת ליישום להמשיך או להכריח את היישום להסתיים."
|
||||
|
||||
#: ../src/core/delete.c:141
|
||||
msgid "_Wait"
|
||||
msgstr "ה_מתנה"
|
||||
|
||||
#: ../src/core/delete.c:141
|
||||
#: src/core/delete.c:141
|
||||
msgid "_Force Quit"
|
||||
msgstr "_אילוץ סגירה"
|
||||
|
||||
#: ../src/core/display.c:590
|
||||
#, c-format
|
||||
msgid "Failed to open X Window System display '%s'\n"
|
||||
msgstr "Failed to open X Window System display '%s'\n"
|
||||
#: src/core/delete.c:141
|
||||
msgid "_Wait"
|
||||
msgstr "ה_מתנה"
|
||||
|
||||
#: ../src/core/main.c:182
|
||||
#: src/core/display.c:608
|
||||
#, c-format
|
||||
msgid "Failed to open X Window System display “%s”\n"
|
||||
msgstr "Failed to open X Window System display “%s”\n"
|
||||
|
||||
#: src/core/main.c:189
|
||||
msgid "Disable connection to session manager"
|
||||
msgstr "Disable connection to session manager"
|
||||
|
||||
#: ../src/core/main.c:188
|
||||
#: src/core/main.c:195
|
||||
msgid "Replace the running window manager"
|
||||
msgstr "Replace the running window manager"
|
||||
|
||||
#: ../src/core/main.c:194
|
||||
#: src/core/main.c:201
|
||||
msgid "Specify session management ID"
|
||||
msgstr "Specify session management ID"
|
||||
|
||||
#: ../src/core/main.c:199
|
||||
#: src/core/main.c:206
|
||||
msgid "X Display to use"
|
||||
msgstr "X Display to use"
|
||||
|
||||
#: ../src/core/main.c:205
|
||||
#: src/core/main.c:212
|
||||
msgid "Initialize session from savefile"
|
||||
msgstr "Initialize session from savefile"
|
||||
|
||||
#: ../src/core/main.c:211
|
||||
#: src/core/main.c:218
|
||||
msgid "Make X calls synchronous"
|
||||
msgstr "Make X calls synchronous"
|
||||
|
||||
#: ../src/core/main.c:218
|
||||
#: src/core/main.c:225
|
||||
msgid "Run as a wayland compositor"
|
||||
msgstr "Run as a wayland compositor"
|
||||
|
||||
#: ../src/core/main.c:224
|
||||
#: src/core/main.c:231
|
||||
msgid "Run as a nested compositor"
|
||||
msgstr "Run as a nested compositor"
|
||||
|
||||
#: ../src/core/main.c:232
|
||||
#: src/core/main.c:239
|
||||
msgid "Run as a full display server, rather than nested"
|
||||
msgstr "Run as a full display server, rather than nested"
|
||||
|
||||
#: ../src/core/mutter.c:39
|
||||
#: src/core/mutter.c:39
|
||||
#, c-format
|
||||
msgid ""
|
||||
"mutter %s\n"
|
||||
"Copyright (C) 2001-%d Havoc Pennington, Red Hat, Inc., and others\n"
|
||||
"Copyright © 2001-%d Havoc Pennington, Red Hat, Inc., and others\n"
|
||||
"This is free software; see the source for copying conditions.\n"
|
||||
"There is NO warranty; not even for MERCHANTABILITY or FITNESS FOR A "
|
||||
"PARTICULAR PURPOSE.\n"
|
||||
@ -573,51 +588,51 @@ msgstr ""
|
||||
"זוהי תכנה חופשית; יש לעיין במקור כדי לקבל מידע אודות תנאי ההעתקה.\n"
|
||||
"לא קיימת שום אחריות; אפילו לא עבור סחר או התאמה לצרכים מסוימים.\n"
|
||||
|
||||
#: ../src/core/mutter.c:53
|
||||
#: src/core/mutter.c:53
|
||||
msgid "Print version"
|
||||
msgstr "Print version"
|
||||
|
||||
#: ../src/core/mutter.c:59
|
||||
#: src/core/mutter.c:59
|
||||
msgid "Mutter plugin to use"
|
||||
msgstr "תוסף ה־mutter לשימוש"
|
||||
|
||||
#: ../src/core/prefs.c:1997
|
||||
#: src/core/prefs.c:1997
|
||||
#, c-format
|
||||
msgid "Workspace %d"
|
||||
msgstr "מרחב עבודה %d"
|
||||
|
||||
#: ../src/core/screen.c:521
|
||||
#: src/core/screen.c:580
|
||||
#, c-format
|
||||
msgid ""
|
||||
"Display \"%s\" already has a window manager; try using the --replace option "
|
||||
"to replace the current window manager."
|
||||
"Display “%s” already has a window manager; try using the --replace option to "
|
||||
"replace the current window manager."
|
||||
msgstr ""
|
||||
"Display \"%s\" already has a window manager; try using the --replace option "
|
||||
"to replace the current window manager."
|
||||
"Display “%s” already has a window manager; try using the --replace option to "
|
||||
"replace the current window manager."
|
||||
|
||||
#: ../src/core/screen.c:606
|
||||
#: src/core/screen.c:665
|
||||
#, c-format
|
||||
msgid "Screen %d on display '%s' is invalid\n"
|
||||
msgstr "Screen %d on display '%s' is invalid\n"
|
||||
msgid "Screen %d on display “%s” is invalid\n"
|
||||
msgstr "Screen %d on display “%s” is invalid\n"
|
||||
|
||||
#: ../src/core/util.c:120
|
||||
#: src/core/util.c:120
|
||||
msgid "Mutter was compiled without support for verbose mode\n"
|
||||
msgstr "Mutter הודר ללא תמיכה במצב פירוט\n"
|
||||
|
||||
#: ../src/wayland/meta-wayland-tablet-pad.c:595
|
||||
#: src/wayland/meta-wayland-tablet-pad.c:563
|
||||
#, c-format
|
||||
msgid "Mode Switch: Mode %d"
|
||||
msgstr "מצב העברה: מצב %d"
|
||||
|
||||
#: ../src/x11/session.c:1815
|
||||
#: src/x11/session.c:1815
|
||||
msgid ""
|
||||
"These windows do not support "save current setup" and will have to "
|
||||
"be restarted manually next time you log in."
|
||||
"These windows do not support “save current setup” and will have to be "
|
||||
"restarted manually next time you log in."
|
||||
msgstr ""
|
||||
"חלונות אלו אינם תומכים ב"שמירת ההגדרות הנוכחיות", ויהיה צורך "
|
||||
"חלונות אלו אינם תומכים ב„שמירת ההגדרות הנוכחיות”, ויהיה צורך "
|
||||
"באתחול ידני בכניסה הבאה שלך."
|
||||
|
||||
#: ../src/x11/window-props.c:548
|
||||
#: src/x11/window-props.c:559
|
||||
#, c-format
|
||||
msgid "%s (on %s)"
|
||||
msgstr "%s (מעל %s)"
|
||||
|
@ -65,6 +65,9 @@ struct _MetaInputSettingsClass
|
||||
void (* set_tap_enabled) (MetaInputSettings *settings,
|
||||
ClutterInputDevice *device,
|
||||
gboolean enabled);
|
||||
void (* set_disable_while_typing) (MetaInputSettings *settings,
|
||||
ClutterInputDevice *device,
|
||||
gboolean enabled);
|
||||
void (* set_invert_scroll) (MetaInputSettings *settings,
|
||||
ClutterInputDevice *device,
|
||||
gboolean inverted);
|
||||
@ -117,7 +120,6 @@ struct _MetaInputSettingsClass
|
||||
ClutterInputDeviceTool *tool,
|
||||
GDesktopStylusButtonAction primary,
|
||||
GDesktopStylusButtonAction secondary);
|
||||
|
||||
gboolean (* has_two_finger_scroll) (MetaInputSettings *settings,
|
||||
ClutterInputDevice *device);
|
||||
};
|
||||
|
@ -68,6 +68,7 @@ struct _MetaInputSettingsPrivate
|
||||
GSettings *touchpad_settings;
|
||||
GSettings *trackball_settings;
|
||||
GSettings *keyboard_settings;
|
||||
GSettings *gsd_settings;
|
||||
|
||||
GHashTable *mappable_devices;
|
||||
|
||||
@ -129,6 +130,7 @@ meta_input_settings_dispose (GObject *object)
|
||||
g_clear_object (&priv->touchpad_settings);
|
||||
g_clear_object (&priv->trackball_settings);
|
||||
g_clear_object (&priv->keyboard_settings);
|
||||
g_clear_object (&priv->gsd_settings);
|
||||
g_clear_pointer (&priv->mappable_devices, g_hash_table_unref);
|
||||
|
||||
if (priv->monitors_changed_id && priv->monitor_manager)
|
||||
@ -446,6 +448,44 @@ update_device_natural_scroll (MetaInputSettings *input_settings,
|
||||
}
|
||||
}
|
||||
|
||||
static void
|
||||
update_touchpad_disable_while_typing (MetaInputSettings *input_settings,
|
||||
ClutterInputDevice *device)
|
||||
{
|
||||
GSettings *settings;
|
||||
MetaInputSettingsClass *input_settings_class;
|
||||
MetaInputSettingsPrivate *priv;
|
||||
gboolean enabled;
|
||||
const gchar *key = "disable-while-typing";
|
||||
|
||||
if (device &&
|
||||
clutter_input_device_get_device_type (device) != CLUTTER_TOUCHPAD_DEVICE)
|
||||
return;
|
||||
|
||||
priv = meta_input_settings_get_instance_private (input_settings);
|
||||
input_settings_class = META_INPUT_SETTINGS_GET_CLASS (input_settings);
|
||||
enabled = g_settings_get_boolean (priv->touchpad_settings, key);
|
||||
|
||||
if (device)
|
||||
{
|
||||
settings = get_settings_for_device_type (input_settings,
|
||||
clutter_input_device_get_device_type (device));
|
||||
|
||||
if (!settings)
|
||||
return;
|
||||
|
||||
settings_device_set_bool_setting (input_settings, device,
|
||||
input_settings_class->set_disable_while_typing,
|
||||
enabled);
|
||||
}
|
||||
else
|
||||
{
|
||||
settings_set_bool_setting (input_settings, CLUTTER_TOUCHPAD_DEVICE,
|
||||
input_settings_class->set_disable_while_typing,
|
||||
enabled);
|
||||
}
|
||||
}
|
||||
|
||||
static void
|
||||
update_touchpad_tap_enabled (MetaInputSettings *input_settings,
|
||||
ClutterInputDevice *device)
|
||||
@ -698,7 +738,7 @@ logical_monitor_has_monitor (MetaMonitorManager *monitor_manager,
|
||||
GList *monitors;
|
||||
GList *l;
|
||||
|
||||
monitors = meta_monitor_manager_get_monitors (monitor_manager);
|
||||
monitors = meta_logical_monitor_get_monitors (logical_monitor);
|
||||
for (l = monitors; l; l = l->next)
|
||||
{
|
||||
MetaMonitor *monitor = l->data;
|
||||
@ -987,6 +1027,8 @@ meta_input_settings_changed_cb (GSettings *settings,
|
||||
update_device_natural_scroll (input_settings, NULL);
|
||||
else if (strcmp (key, "tap-to-click") == 0)
|
||||
update_touchpad_tap_enabled (input_settings, NULL);
|
||||
else if (strcmp(key, "disable-while-typing") == 0)
|
||||
update_touchpad_disable_while_typing (input_settings, NULL);
|
||||
else if (strcmp (key, "send-events") == 0)
|
||||
update_touchpad_send_events (input_settings, NULL);
|
||||
else if (strcmp (key, "edge-scrolling-enabled") == 0)
|
||||
@ -1232,6 +1274,7 @@ apply_device_settings (MetaInputSettings *input_settings,
|
||||
|
||||
update_touchpad_left_handed (input_settings, device);
|
||||
update_touchpad_tap_enabled (input_settings, device);
|
||||
update_touchpad_disable_while_typing (input_settings, device);
|
||||
update_touchpad_send_events (input_settings, device);
|
||||
update_touchpad_two_finger_scroll (input_settings, device);
|
||||
update_touchpad_edge_scroll (input_settings, device);
|
||||
@ -1451,6 +1494,12 @@ meta_input_settings_init (MetaInputSettings *settings)
|
||||
g_signal_connect (priv->keyboard_settings, "changed",
|
||||
G_CALLBACK (meta_input_settings_changed_cb), settings);
|
||||
|
||||
priv->gsd_settings = g_settings_new ("org.gnome.settings-daemon.peripherals.mouse");
|
||||
|
||||
g_settings_bind (priv->gsd_settings, "double-click",
|
||||
clutter_settings_get_default(), "double-click-time",
|
||||
G_SETTINGS_BIND_GET);
|
||||
|
||||
priv->mappable_devices =
|
||||
g_hash_table_new_full (NULL, NULL, NULL, (GDestroyNotify) device_mapping_info_free);
|
||||
|
||||
@ -1611,7 +1660,7 @@ cycle_logical_monitors (MetaInputSettings *settings,
|
||||
if (l->next)
|
||||
*next_logical_monitor = l->next->data;
|
||||
else
|
||||
*next_logical_monitor = logical_monitors->data;
|
||||
*next_logical_monitor = NULL;
|
||||
}
|
||||
|
||||
return TRUE;
|
||||
|
@ -180,3 +180,43 @@ static void
|
||||
meta_logical_monitor_class_init (MetaLogicalMonitorClass *klass)
|
||||
{
|
||||
}
|
||||
|
||||
gboolean
|
||||
meta_logical_monitor_has_neighbor (MetaLogicalMonitor *logical_monitor,
|
||||
MetaLogicalMonitor *neighbor,
|
||||
MetaScreenDirection neighbor_direction)
|
||||
{
|
||||
switch (neighbor_direction)
|
||||
{
|
||||
case META_SCREEN_RIGHT:
|
||||
if (neighbor->rect.x == (logical_monitor->rect.x +
|
||||
logical_monitor->rect.width) &&
|
||||
meta_rectangle_vert_overlap (&neighbor->rect,
|
||||
&logical_monitor->rect))
|
||||
return TRUE;
|
||||
break;
|
||||
case META_SCREEN_LEFT:
|
||||
if (logical_monitor->rect.x == (neighbor->rect.x +
|
||||
neighbor->rect.width) &&
|
||||
meta_rectangle_vert_overlap (&neighbor->rect,
|
||||
&logical_monitor->rect))
|
||||
return TRUE;
|
||||
break;
|
||||
case META_SCREEN_UP:
|
||||
if (logical_monitor->rect.y == (neighbor->rect.y +
|
||||
neighbor->rect.height) &&
|
||||
meta_rectangle_horiz_overlap (&neighbor->rect,
|
||||
&logical_monitor->rect))
|
||||
return TRUE;
|
||||
break;
|
||||
case META_SCREEN_DOWN:
|
||||
if (neighbor->rect.y == (logical_monitor->rect.y +
|
||||
logical_monitor->rect.height) &&
|
||||
meta_rectangle_horiz_overlap (&neighbor->rect,
|
||||
&logical_monitor->rect))
|
||||
return TRUE;
|
||||
break;
|
||||
}
|
||||
|
||||
return FALSE;
|
||||
}
|
||||
|
@ -80,4 +80,8 @@ int meta_logical_monitor_get_scale (MetaLogicalMonitor *logical_monitor);
|
||||
|
||||
GList * meta_logical_monitor_get_monitors (MetaLogicalMonitor *logical_monitor);
|
||||
|
||||
gboolean meta_logical_monitor_has_neighbor (MetaLogicalMonitor *logical_monitor,
|
||||
MetaLogicalMonitor *neighbor,
|
||||
MetaScreenDirection neighbor_dir);
|
||||
|
||||
#endif /* META_LOGICAL_MONITOR_H */
|
||||
|
@ -260,6 +260,9 @@ lid_is_closed_changed (UpClient *client,
|
||||
static gboolean
|
||||
meta_monitor_manager_real_is_lid_closed (MetaMonitorManager *manager)
|
||||
{
|
||||
if (!manager->up_client)
|
||||
return FALSE;
|
||||
|
||||
return up_client_get_lid_is_closed (manager->up_client);
|
||||
}
|
||||
|
||||
@ -1572,37 +1575,8 @@ meta_monitor_manager_get_logical_monitor_neighbor (MetaMonitorManager *manager,
|
||||
{
|
||||
MetaLogicalMonitor *other = l->data;
|
||||
|
||||
switch (direction)
|
||||
{
|
||||
case META_SCREEN_RIGHT:
|
||||
if (other->rect.x == (logical_monitor->rect.x +
|
||||
logical_monitor->rect.width) &&
|
||||
meta_rectangle_vert_overlap (&other->rect,
|
||||
&logical_monitor->rect))
|
||||
return other;
|
||||
break;
|
||||
case META_SCREEN_LEFT:
|
||||
if (logical_monitor->rect.x == (other->rect.x +
|
||||
other->rect.width) &&
|
||||
meta_rectangle_vert_overlap (&other->rect,
|
||||
&logical_monitor->rect))
|
||||
return other;
|
||||
break;
|
||||
case META_SCREEN_UP:
|
||||
if (logical_monitor->rect.y == (other->rect.y +
|
||||
other->rect.height) &&
|
||||
meta_rectangle_horiz_overlap (&other->rect,
|
||||
&logical_monitor->rect))
|
||||
return other;
|
||||
break;
|
||||
case META_SCREEN_DOWN:
|
||||
if (other->rect.y == (logical_monitor->rect.y +
|
||||
logical_monitor->rect.height) &&
|
||||
meta_rectangle_horiz_overlap (&other->rect,
|
||||
&logical_monitor->rect))
|
||||
return other;
|
||||
break;
|
||||
}
|
||||
if (meta_logical_monitor_has_neighbor (logical_monitor, other, direction))
|
||||
return other;
|
||||
}
|
||||
|
||||
return NULL;
|
||||
@ -1696,7 +1670,7 @@ rebuild_monitors (MetaMonitorManager *manager)
|
||||
{
|
||||
MetaMonitorNormal *monitor_normal;
|
||||
|
||||
monitor_normal = meta_monitor_normal_new (output);
|
||||
monitor_normal = meta_monitor_normal_new (manager, output);
|
||||
manager->monitors = g_list_append (manager->monitors,
|
||||
monitor_normal);
|
||||
}
|
||||
|
@ -34,6 +34,8 @@ typedef struct _MetaMonitorMode
|
||||
|
||||
typedef struct _MetaMonitorPrivate
|
||||
{
|
||||
MetaMonitorManager *monitor_manager;
|
||||
|
||||
GList *outputs;
|
||||
GList *modes;
|
||||
|
||||
@ -69,6 +71,10 @@ struct _MetaMonitorTiled
|
||||
|
||||
uint32_t tile_group_id;
|
||||
|
||||
/* The tile (0, 0) output. */
|
||||
MetaOutput *origin_output;
|
||||
|
||||
/* The output enabled even when a non-tiled mode is used. */
|
||||
MetaOutput *main_output;
|
||||
};
|
||||
|
||||
@ -135,7 +141,7 @@ meta_monitor_spec_free (MetaMonitorSpec *monitor_spec)
|
||||
}
|
||||
|
||||
static void
|
||||
meta_monitor_generate_id (MetaMonitor *monitor)
|
||||
meta_monitor_generate_spec (MetaMonitor *monitor)
|
||||
{
|
||||
MetaMonitorPrivate *priv = meta_monitor_get_instance_private (monitor);
|
||||
MetaOutput *output = meta_monitor_get_main_output (monitor);
|
||||
@ -344,7 +350,8 @@ meta_monitor_normal_generate_modes (MetaMonitorNormal *monitor_normal)
|
||||
}
|
||||
|
||||
MetaMonitorNormal *
|
||||
meta_monitor_normal_new (MetaOutput *output)
|
||||
meta_monitor_normal_new (MetaMonitorManager *monitor_manager,
|
||||
MetaOutput *output)
|
||||
{
|
||||
MetaMonitorNormal *monitor_normal;
|
||||
MetaMonitor *monitor;
|
||||
@ -354,11 +361,13 @@ meta_monitor_normal_new (MetaOutput *output)
|
||||
monitor = META_MONITOR (monitor_normal);
|
||||
monitor_priv = meta_monitor_get_instance_private (monitor);
|
||||
|
||||
monitor_priv->monitor_manager = monitor_manager;
|
||||
|
||||
monitor_priv->outputs = g_list_append (NULL, output);
|
||||
monitor_priv->winsys_id = output->winsys_id;
|
||||
meta_monitor_generate_spec (monitor);
|
||||
|
||||
meta_monitor_normal_generate_modes (monitor_normal);
|
||||
meta_monitor_generate_id (monitor);
|
||||
|
||||
return monitor_normal;
|
||||
}
|
||||
@ -384,6 +393,23 @@ meta_monitor_normal_derive_dimensions (MetaMonitor *monitor,
|
||||
*height = output->crtc->rect.height;
|
||||
}
|
||||
|
||||
static gboolean
|
||||
meta_monitor_normal_get_suggested_position (MetaMonitor *monitor,
|
||||
int *x,
|
||||
int *y)
|
||||
{
|
||||
MetaOutput *output;
|
||||
|
||||
output = meta_monitor_get_main_output (monitor);
|
||||
if (output->suggested_x < 0 && output->suggested_y < 0)
|
||||
return FALSE;
|
||||
|
||||
*x = output->suggested_x;
|
||||
*y = output->suggested_y;
|
||||
|
||||
return TRUE;
|
||||
}
|
||||
|
||||
static void
|
||||
meta_monitor_normal_init (MetaMonitorNormal *monitor)
|
||||
{
|
||||
@ -396,6 +422,7 @@ meta_monitor_normal_class_init (MetaMonitorNormalClass *klass)
|
||||
|
||||
monitor_class->get_main_output = meta_monitor_normal_get_main_output;
|
||||
monitor_class->derive_dimensions = meta_monitor_normal_derive_dimensions;
|
||||
monitor_class->get_suggested_position = meta_monitor_normal_get_suggested_position;
|
||||
}
|
||||
|
||||
uint32_t
|
||||
@ -409,16 +436,8 @@ meta_monitor_get_suggested_position (MetaMonitor *monitor,
|
||||
int *x,
|
||||
int *y)
|
||||
{
|
||||
MetaOutput *main_output;
|
||||
|
||||
main_output = meta_monitor_get_main_output (monitor);
|
||||
if (main_output->suggested_x < 0 && main_output->suggested_y < 0)
|
||||
return FALSE;
|
||||
|
||||
*x = main_output->suggested_x;
|
||||
*y = main_output->suggested_y;
|
||||
|
||||
return TRUE;
|
||||
return META_MONITOR_GET_CLASS (monitor)->get_suggested_position (monitor,
|
||||
x, y);
|
||||
}
|
||||
|
||||
static void
|
||||
@ -437,7 +456,7 @@ add_tiled_monitor_outputs (MetaMonitorManager *monitor_manager,
|
||||
continue;
|
||||
|
||||
g_warn_if_fail (output->subpixel_order ==
|
||||
monitor_tiled->main_output->subpixel_order);
|
||||
monitor_tiled->origin_output->subpixel_order);
|
||||
|
||||
monitor_priv->outputs = g_list_append (monitor_priv->outputs, output);
|
||||
}
|
||||
@ -523,15 +542,53 @@ is_monitor_mode_assigned (MetaMonitor *monitor,
|
||||
return TRUE;
|
||||
}
|
||||
|
||||
static gboolean
|
||||
is_crtc_mode_tiled (MetaOutput *output,
|
||||
MetaCrtcMode *crtc_mode)
|
||||
{
|
||||
return (crtc_mode->width == (int) output->tile_info.tile_w &&
|
||||
crtc_mode->height == (int) output->tile_info.tile_h);
|
||||
}
|
||||
|
||||
static MetaCrtcMode *
|
||||
find_tiled_crtc_mode (MetaOutput *output,
|
||||
float refresh_rate)
|
||||
{
|
||||
MetaCrtcMode *crtc_mode;
|
||||
unsigned int i;
|
||||
|
||||
crtc_mode = output->preferred_mode;
|
||||
if (is_crtc_mode_tiled (output, crtc_mode))
|
||||
return crtc_mode;
|
||||
|
||||
for (i = 0; i < output->n_modes; i++)
|
||||
{
|
||||
crtc_mode = output->modes[i];
|
||||
|
||||
if (!is_crtc_mode_tiled (output, crtc_mode))
|
||||
continue;
|
||||
|
||||
if (crtc_mode->refresh_rate != refresh_rate)
|
||||
continue;
|
||||
|
||||
return crtc_mode;
|
||||
}
|
||||
|
||||
return NULL;
|
||||
}
|
||||
|
||||
static MetaMonitorMode *
|
||||
create_tiled_monitor_mode (MetaMonitorTiled *monitor_tiled)
|
||||
create_tiled_monitor_mode (MetaMonitorTiled *monitor_tiled,
|
||||
float refresh_rate,
|
||||
gboolean *out_is_preferred)
|
||||
{
|
||||
MetaMonitor *monitor = META_MONITOR (monitor_tiled);
|
||||
MetaMonitorPrivate *monitor_priv =
|
||||
meta_monitor_get_instance_private (monitor);
|
||||
MetaMonitorMode *mode;
|
||||
GList *l;
|
||||
int i;
|
||||
unsigned int i;
|
||||
gboolean is_preferred = TRUE;
|
||||
|
||||
mode = g_new0 (MetaMonitorMode, 1);
|
||||
meta_monitor_tiled_calculate_tiled_size (monitor,
|
||||
@ -542,29 +599,93 @@ create_tiled_monitor_mode (MetaMonitorTiled *monitor_tiled)
|
||||
for (l = monitor_priv->outputs, i = 0; l; l = l->next, i++)
|
||||
{
|
||||
MetaOutput *output = l->data;
|
||||
MetaCrtcMode *preferred_crtc_mode = output->preferred_mode;
|
||||
MetaCrtcMode *tiled_crtc_mode;
|
||||
int x;
|
||||
int y;
|
||||
|
||||
tiled_crtc_mode = find_tiled_crtc_mode (output, refresh_rate);
|
||||
if (!tiled_crtc_mode)
|
||||
{
|
||||
g_warning ("No tiled mode with refresh rate %f on %s",
|
||||
refresh_rate, output->name);
|
||||
meta_monitor_mode_free (mode);
|
||||
return NULL;
|
||||
}
|
||||
|
||||
calculate_tile_coordinate (monitor, output, &x, &y);
|
||||
|
||||
mode->crtc_modes[i] = (MetaMonitorCrtcMode) {
|
||||
.x = x,
|
||||
.y = y,
|
||||
.output = output,
|
||||
.crtc_mode = preferred_crtc_mode
|
||||
.crtc_mode = tiled_crtc_mode
|
||||
};
|
||||
|
||||
g_warn_if_fail (mode->spec.refresh_rate == 0.0f ||
|
||||
(mode->spec.refresh_rate ==
|
||||
preferred_crtc_mode->refresh_rate));
|
||||
mode->spec.refresh_rate = refresh_rate;
|
||||
|
||||
mode->spec.refresh_rate = preferred_crtc_mode->refresh_rate;
|
||||
is_preferred = is_preferred && tiled_crtc_mode == output->preferred_mode;
|
||||
}
|
||||
|
||||
*out_is_preferred = is_preferred;
|
||||
|
||||
return mode;
|
||||
}
|
||||
|
||||
static void
|
||||
generate_tiled_monitor_modes (MetaMonitorTiled *monitor_tiled)
|
||||
{
|
||||
MetaMonitor *monitor = META_MONITOR (monitor_tiled);
|
||||
MetaMonitorPrivate *monitor_priv =
|
||||
meta_monitor_get_instance_private (monitor);
|
||||
MetaOutput *main_output;
|
||||
GList *tiled_modes = NULL;
|
||||
unsigned int i;
|
||||
|
||||
main_output = meta_monitor_get_main_output (META_MONITOR (monitor_tiled));
|
||||
|
||||
for (i = 0; i < main_output->n_modes; i++)
|
||||
{
|
||||
MetaCrtcMode *crtc_mode = main_output->modes[i];
|
||||
MetaMonitorMode *mode;
|
||||
gboolean is_preferred;
|
||||
|
||||
if (!is_crtc_mode_tiled (main_output, crtc_mode))
|
||||
continue;
|
||||
|
||||
mode = create_tiled_monitor_mode (monitor_tiled, crtc_mode->refresh_rate,
|
||||
&is_preferred);
|
||||
if (!mode)
|
||||
continue;
|
||||
|
||||
tiled_modes = g_list_append (tiled_modes, mode);
|
||||
|
||||
if (is_monitor_mode_assigned (monitor, mode))
|
||||
monitor_priv->current_mode = mode;
|
||||
|
||||
if (is_preferred)
|
||||
monitor_priv->preferred_mode = mode;
|
||||
}
|
||||
|
||||
if (!monitor_priv->preferred_mode)
|
||||
{
|
||||
MetaMonitorMode *best_mode = NULL;
|
||||
GList *l;
|
||||
|
||||
for (l = tiled_modes; l; l = l->next)
|
||||
{
|
||||
MetaMonitorMode *mode = l->data;
|
||||
|
||||
if (!best_mode ||
|
||||
mode->spec.refresh_rate > best_mode->spec.refresh_rate)
|
||||
best_mode = mode;
|
||||
}
|
||||
|
||||
monitor_priv->preferred_mode = best_mode;
|
||||
}
|
||||
|
||||
monitor_priv->modes = g_list_concat (monitor_priv->modes, tiled_modes);
|
||||
}
|
||||
|
||||
static MetaMonitorMode *
|
||||
create_untiled_monitor_mode (MetaMonitorTiled *monitor_tiled,
|
||||
MetaOutput *main_output,
|
||||
@ -577,12 +698,7 @@ create_untiled_monitor_mode (MetaMonitorTiled *monitor_tiled,
|
||||
GList *l;
|
||||
int i;
|
||||
|
||||
/*
|
||||
* Assume modes with a resolution identical to the tile sizes are tiled
|
||||
* modes.
|
||||
*/
|
||||
if (crtc_mode->width == (int) main_output->tile_info.tile_w &&
|
||||
crtc_mode->height == (int) main_output->tile_info.tile_h)
|
||||
if (is_crtc_mode_tiled (main_output, crtc_mode))
|
||||
return NULL;
|
||||
|
||||
mode = g_new0 (MetaMonitorMode, 1);
|
||||
@ -620,42 +736,184 @@ create_untiled_monitor_mode (MetaMonitorTiled *monitor_tiled,
|
||||
return mode;
|
||||
}
|
||||
|
||||
static int
|
||||
count_untiled_crtc_modes (MetaOutput *output)
|
||||
{
|
||||
int count;
|
||||
unsigned int i;
|
||||
|
||||
count = 0;
|
||||
for (i = 0; i < output->n_modes; i++)
|
||||
{
|
||||
MetaCrtcMode *crtc_mode = output->modes[i];
|
||||
|
||||
if (!is_crtc_mode_tiled (output, crtc_mode))
|
||||
count++;
|
||||
}
|
||||
|
||||
return count;
|
||||
}
|
||||
|
||||
static MetaOutput *
|
||||
find_untiled_output (MetaMonitorTiled *monitor_tiled)
|
||||
{
|
||||
MetaMonitor *monitor = META_MONITOR (monitor_tiled);
|
||||
MetaMonitorPrivate *monitor_priv =
|
||||
meta_monitor_get_instance_private (monitor);
|
||||
MetaOutput *best_output;
|
||||
int best_untiled_crtc_mode_count;
|
||||
GList *l;
|
||||
|
||||
best_output = monitor_tiled->origin_output;
|
||||
best_untiled_crtc_mode_count =
|
||||
count_untiled_crtc_modes (monitor_tiled->origin_output);
|
||||
|
||||
for (l = monitor_priv->outputs; l; l = l->next)
|
||||
{
|
||||
MetaOutput *output = l->data;
|
||||
int untiled_crtc_mode_count;
|
||||
|
||||
if (output == monitor_tiled->origin_output)
|
||||
continue;
|
||||
|
||||
untiled_crtc_mode_count = count_untiled_crtc_modes (output);
|
||||
if (untiled_crtc_mode_count > best_untiled_crtc_mode_count)
|
||||
{
|
||||
best_untiled_crtc_mode_count = untiled_crtc_mode_count;
|
||||
best_output = output;
|
||||
}
|
||||
}
|
||||
|
||||
return best_output;
|
||||
}
|
||||
|
||||
static void
|
||||
generate_untiled_monitor_modes (MetaMonitorTiled *monitor_tiled)
|
||||
{
|
||||
MetaMonitor *monitor = META_MONITOR (monitor_tiled);
|
||||
MetaMonitorPrivate *monitor_priv =
|
||||
meta_monitor_get_instance_private (monitor);
|
||||
MetaOutput *main_output;
|
||||
unsigned int i;
|
||||
|
||||
main_output = meta_monitor_get_main_output (monitor);
|
||||
|
||||
for (i = 0; i < main_output->n_modes; i++)
|
||||
{
|
||||
MetaCrtcMode *crtc_mode = main_output->modes[i];
|
||||
MetaMonitorMode *mode;
|
||||
|
||||
mode = create_untiled_monitor_mode (monitor_tiled,
|
||||
main_output,
|
||||
crtc_mode);
|
||||
if (!mode)
|
||||
continue;
|
||||
|
||||
monitor_priv->modes = g_list_append (monitor_priv->modes, mode);
|
||||
|
||||
if (is_monitor_mode_assigned (monitor, mode))
|
||||
{
|
||||
g_assert (!monitor_priv->current_mode);
|
||||
monitor_priv->current_mode = mode;
|
||||
}
|
||||
|
||||
if (!monitor_priv->preferred_mode &&
|
||||
crtc_mode == main_output->preferred_mode)
|
||||
monitor_priv->preferred_mode = mode;
|
||||
}
|
||||
}
|
||||
|
||||
static MetaMonitorMode *
|
||||
find_best_mode (MetaMonitor *monitor)
|
||||
{
|
||||
MetaMonitorPrivate *monitor_priv =
|
||||
meta_monitor_get_instance_private (monitor);
|
||||
MetaMonitorMode *best_mode = NULL;
|
||||
GList *l;
|
||||
|
||||
for (l = monitor_priv->modes; l; l = l->next)
|
||||
{
|
||||
MetaMonitorMode *mode = l->data;
|
||||
int area, best_area;
|
||||
|
||||
if (!best_mode)
|
||||
{
|
||||
best_mode = mode;
|
||||
continue;
|
||||
}
|
||||
|
||||
area = mode->spec.width * mode->spec.height;
|
||||
best_area = best_mode->spec.width * best_mode->spec.height;
|
||||
if (area > best_area)
|
||||
{
|
||||
best_mode = mode;
|
||||
continue;
|
||||
}
|
||||
|
||||
if (mode->spec.refresh_rate > best_mode->spec.refresh_rate)
|
||||
{
|
||||
best_mode = mode;
|
||||
continue;
|
||||
}
|
||||
}
|
||||
|
||||
return best_mode;
|
||||
}
|
||||
|
||||
static void
|
||||
meta_monitor_tiled_generate_modes (MetaMonitorTiled *monitor_tiled)
|
||||
{
|
||||
MetaMonitor *monitor = META_MONITOR (monitor_tiled);
|
||||
MetaMonitorPrivate *monitor_priv =
|
||||
meta_monitor_get_instance_private (monitor);
|
||||
MetaMonitorMode *mode;
|
||||
MetaOutput *main_output;
|
||||
unsigned int i;
|
||||
|
||||
mode = create_tiled_monitor_mode (monitor_tiled);
|
||||
monitor_priv->modes = g_list_append (monitor_priv->modes, mode);
|
||||
/*
|
||||
* Tiled monitors may look a bit different from each other, depending on the
|
||||
* monitor itself, the driver, etc.
|
||||
*
|
||||
* On some, the tiled modes will be the preferred CRTC modes, and running
|
||||
* untiled is done by only enabling (0, 0) tile. In this case, things are
|
||||
* pretty straight forward.
|
||||
*
|
||||
* Other times a monitor may have some bogus mode preferred on the main tile,
|
||||
* and an untiled mode preferred on the non-main tile, and there seems to be
|
||||
* no guarantee that the (0, 0) tile is the one that should drive the
|
||||
* non-tiled mode.
|
||||
*
|
||||
* To handle both these cases, the following hueristics are implemented:
|
||||
*
|
||||
* 1) Find all the tiled CRTC modes of the (0, 0) tile, and create tiled
|
||||
* monitor modes for all tiles based on these.
|
||||
* 2) If there is any tiled monitor mode combination where all CRTC modes
|
||||
* are the preferred ones, that one is marked as preferred.
|
||||
* 3) If there is no preferred mode determined so far, assume the tiled
|
||||
* monitor mode with the highest refresh rate is preferred.
|
||||
* 4) Find the tile with highest number of untiled CRTC modes available,
|
||||
* assume this is the one driving the monitor in untiled mode, and
|
||||
* create monitor modes for all untiled CRTC modes of that tile. If
|
||||
* there is still no preferred mode, set any untiled mode as preferred
|
||||
* if the CRTC mode is marked as such.
|
||||
* 5) If at this point there is still no preferred mode, just pick the one
|
||||
* with the highest number of pixels and highest refresh rate.
|
||||
*
|
||||
* Note that this ignores the preference if the preference is a non-tiled
|
||||
* mode. This seems to be the case on some systems, where the user tends to
|
||||
* manually set up the tiled mode anyway.
|
||||
*/
|
||||
|
||||
monitor_priv->preferred_mode = mode;
|
||||
generate_tiled_monitor_modes (monitor_tiled);
|
||||
|
||||
if (is_monitor_mode_assigned (monitor, mode))
|
||||
monitor_priv->current_mode = mode;
|
||||
if (!monitor_priv->preferred_mode)
|
||||
g_warning ("Tiled monitor on %s didn't have any tiled modes",
|
||||
monitor_priv->spec->connector);
|
||||
|
||||
main_output = meta_monitor_get_main_output (monitor);
|
||||
for (i = 0; i < main_output->n_modes; i++)
|
||||
generate_untiled_monitor_modes (monitor_tiled);
|
||||
|
||||
if (!monitor_priv->preferred_mode)
|
||||
{
|
||||
MetaCrtcMode *crtc_mode = main_output->modes[i];
|
||||
|
||||
mode = create_untiled_monitor_mode (monitor_tiled,
|
||||
main_output,
|
||||
crtc_mode);
|
||||
if (mode)
|
||||
{
|
||||
monitor_priv->modes = g_list_append (monitor_priv->modes, mode);
|
||||
|
||||
if (is_monitor_mode_assigned (monitor, mode))
|
||||
{
|
||||
g_assert (!monitor_priv->current_mode);
|
||||
monitor_priv->current_mode = mode;
|
||||
}
|
||||
}
|
||||
g_warning ("Tiled monitor on %s didn't have a valid preferred mode",
|
||||
monitor_priv->spec->connector);
|
||||
monitor_priv->preferred_mode = find_best_mode (monitor);
|
||||
}
|
||||
}
|
||||
|
||||
@ -671,17 +929,22 @@ meta_monitor_tiled_new (MetaMonitorManager *monitor_manager,
|
||||
monitor = META_MONITOR (monitor_tiled);
|
||||
monitor_priv = meta_monitor_get_instance_private (monitor);
|
||||
|
||||
monitor_priv->monitor_manager = monitor_manager;
|
||||
|
||||
monitor_tiled->tile_group_id = output->tile_info.group_id;
|
||||
monitor_priv->winsys_id = output->winsys_id;
|
||||
|
||||
monitor_tiled->main_output = output;
|
||||
monitor_tiled->origin_output = output;
|
||||
add_tiled_monitor_outputs (monitor_manager, monitor_tiled);
|
||||
|
||||
monitor_tiled->main_output = find_untiled_output (monitor_tiled);
|
||||
|
||||
meta_monitor_generate_spec (monitor);
|
||||
|
||||
meta_monitor_manager_tiled_monitor_added (monitor_manager,
|
||||
META_MONITOR (monitor_tiled));
|
||||
|
||||
meta_monitor_tiled_generate_modes (monitor_tiled);
|
||||
meta_monitor_generate_id (monitor);
|
||||
|
||||
return monitor_tiled;
|
||||
}
|
||||
@ -725,16 +988,23 @@ meta_monitor_tiled_derive_dimensions (MetaMonitor *monitor,
|
||||
*out_height = max_y - min_y;
|
||||
}
|
||||
|
||||
static gboolean
|
||||
meta_monitor_tiled_get_suggested_position (MetaMonitor *monitor,
|
||||
int *x,
|
||||
int *y)
|
||||
{
|
||||
return FALSE;
|
||||
}
|
||||
|
||||
static void
|
||||
meta_monitor_tiled_finalize (GObject *object)
|
||||
{
|
||||
MetaMonitorTiled *monitor_tiled = META_MONITOR_TILED (object);
|
||||
MetaBackend *backend = meta_get_backend ();
|
||||
MetaMonitorManager *monitor_manager =
|
||||
meta_backend_get_monitor_manager (backend);
|
||||
MetaMonitor *monitor = META_MONITOR (object);
|
||||
MetaMonitorPrivate *monitor_priv =
|
||||
meta_monitor_get_instance_private (monitor);
|
||||
|
||||
meta_monitor_manager_tiled_monitor_removed (monitor_manager,
|
||||
META_MONITOR (monitor_tiled));
|
||||
meta_monitor_manager_tiled_monitor_removed (monitor_priv->monitor_manager,
|
||||
monitor);
|
||||
}
|
||||
|
||||
static void
|
||||
@ -752,6 +1022,7 @@ meta_monitor_tiled_class_init (MetaMonitorTiledClass *klass)
|
||||
|
||||
monitor_class->get_main_output = meta_monitor_tiled_get_main_output;
|
||||
monitor_class->derive_dimensions = meta_monitor_tiled_derive_dimensions;
|
||||
monitor_class->get_suggested_position = meta_monitor_tiled_get_suggested_position;
|
||||
}
|
||||
|
||||
static void
|
||||
|
@ -68,6 +68,9 @@ struct _MetaMonitorClass
|
||||
void (* derive_dimensions) (MetaMonitor *monitor,
|
||||
int *width,
|
||||
int *height);
|
||||
gboolean (* get_suggested_position) (MetaMonitor *monitor,
|
||||
int *width,
|
||||
int *height);
|
||||
};
|
||||
|
||||
#define META_TYPE_MONITOR_NORMAL (meta_monitor_normal_get_type ())
|
||||
@ -83,7 +86,8 @@ G_DECLARE_FINAL_TYPE (MetaMonitorTiled, meta_monitor_tiled,
|
||||
MetaMonitorTiled * meta_monitor_tiled_new (MetaMonitorManager *monitor_manager,
|
||||
MetaOutput *main_output);
|
||||
|
||||
MetaMonitorNormal * meta_monitor_normal_new (MetaOutput *output);
|
||||
MetaMonitorNormal * meta_monitor_normal_new (MetaMonitorManager *monitor_manager,
|
||||
MetaOutput *output);
|
||||
|
||||
MetaMonitorSpec * meta_monitor_get_spec (MetaMonitor *monitor);
|
||||
|
||||
|
@ -34,6 +34,7 @@
|
||||
#include "clutter/egl/clutter-egl.h"
|
||||
#include "clutter/evdev/clutter-evdev.h"
|
||||
#include "meta-barrier-native.h"
|
||||
#include "meta-border.h"
|
||||
#include "meta-idle-monitor-native.h"
|
||||
#include "meta-monitor-manager-kms.h"
|
||||
#include "meta-cursor-renderer-native.h"
|
||||
@ -255,6 +256,117 @@ pointer_constrain_callback (ClutterInputDevice *device,
|
||||
constrain_all_screen_monitors (device, monitor_manager, new_x, new_y);
|
||||
}
|
||||
|
||||
static void
|
||||
relative_motion_across_outputs (MetaMonitorManager *monitor_manager,
|
||||
MetaLogicalMonitor *current,
|
||||
float cur_x,
|
||||
float cur_y,
|
||||
float *dx_inout,
|
||||
float *dy_inout)
|
||||
{
|
||||
MetaLogicalMonitor *cur = current;
|
||||
float x = cur_x, y = cur_y;
|
||||
float dx = *dx_inout, dy = *dy_inout;
|
||||
MetaScreenDirection direction = -1;
|
||||
|
||||
while (cur)
|
||||
{
|
||||
MetaLine2 left, right, top, bottom, motion;
|
||||
MetaVector2 intersection;
|
||||
|
||||
motion = (MetaLine2) {
|
||||
.a = { x, y },
|
||||
.b = { x + (dx * cur->scale), y + (dy * cur->scale) }
|
||||
};
|
||||
left = (MetaLine2) {
|
||||
{ cur->rect.x, cur->rect.y },
|
||||
{ cur->rect.x, cur->rect.y + cur->rect.height }
|
||||
};
|
||||
right = (MetaLine2) {
|
||||
{ cur->rect.x + cur->rect.width, cur->rect.y },
|
||||
{ cur->rect.x + cur->rect.width, cur->rect.y + cur->rect.height }
|
||||
};
|
||||
top = (MetaLine2) {
|
||||
{ cur->rect.x, cur->rect.y },
|
||||
{ cur->rect.x + cur->rect.width, cur->rect.y }
|
||||
};
|
||||
bottom = (MetaLine2) {
|
||||
{ cur->rect.x, cur->rect.y + cur->rect.height },
|
||||
{ cur->rect.x + cur->rect.width, cur->rect.y + cur->rect.height }
|
||||
};
|
||||
|
||||
if (direction != META_SCREEN_RIGHT &&
|
||||
meta_line2_intersects_with (&motion, &left, &intersection))
|
||||
direction = META_SCREEN_LEFT;
|
||||
else if (direction != META_SCREEN_LEFT &&
|
||||
meta_line2_intersects_with (&motion, &right, &intersection))
|
||||
direction = META_SCREEN_RIGHT;
|
||||
else if (direction != META_SCREEN_DOWN &&
|
||||
meta_line2_intersects_with (&motion, &top, &intersection))
|
||||
direction = META_SCREEN_UP;
|
||||
else if (direction != META_SCREEN_UP &&
|
||||
meta_line2_intersects_with (&motion, &bottom, &intersection))
|
||||
direction = META_SCREEN_DOWN;
|
||||
else
|
||||
{
|
||||
/* We reached the dest logical monitor */
|
||||
x = motion.b.x;
|
||||
y = motion.b.y;
|
||||
break;
|
||||
}
|
||||
|
||||
x = intersection.x;
|
||||
y = intersection.y;
|
||||
dx -= intersection.x - motion.a.x;
|
||||
dy -= intersection.y - motion.a.y;
|
||||
|
||||
cur = meta_monitor_manager_get_logical_monitor_neighbor (monitor_manager,
|
||||
cur, direction);
|
||||
}
|
||||
|
||||
*dx_inout = x - cur_x;
|
||||
*dy_inout = y - cur_y;
|
||||
}
|
||||
|
||||
static void
|
||||
relative_motion_filter (ClutterInputDevice *device,
|
||||
float x,
|
||||
float y,
|
||||
float *dx,
|
||||
float *dy,
|
||||
gpointer user_data)
|
||||
{
|
||||
MetaMonitorManager *monitor_manager = user_data;
|
||||
MetaLogicalMonitor *logical_monitor, *dest_logical_monitor;
|
||||
float new_dx, new_dy;
|
||||
|
||||
logical_monitor = meta_monitor_manager_get_logical_monitor_at (monitor_manager,
|
||||
x, y);
|
||||
if (!logical_monitor)
|
||||
return;
|
||||
|
||||
new_dx = (*dx) * logical_monitor->scale;
|
||||
new_dy = (*dy) * logical_monitor->scale;
|
||||
|
||||
dest_logical_monitor = meta_monitor_manager_get_logical_monitor_at (monitor_manager,
|
||||
x + new_dx,
|
||||
y + new_dy);
|
||||
if (dest_logical_monitor &&
|
||||
dest_logical_monitor != logical_monitor)
|
||||
{
|
||||
/* If we are crossing monitors, attempt to bisect the distance on each
|
||||
* axis and apply the relative scale for each of them.
|
||||
*/
|
||||
new_dx = *dx;
|
||||
new_dy = *dy;
|
||||
relative_motion_across_outputs (monitor_manager, logical_monitor,
|
||||
x, y, &new_dx, &new_dy);
|
||||
}
|
||||
|
||||
*dx = new_dx;
|
||||
*dy = new_dy;
|
||||
}
|
||||
|
||||
static ClutterBackend *
|
||||
meta_backend_native_create_clutter_backend (MetaBackend *backend)
|
||||
{
|
||||
@ -270,6 +382,8 @@ meta_backend_native_post_init (MetaBackend *backend)
|
||||
|
||||
clutter_evdev_set_pointer_constrain_callback (manager, pointer_constrain_callback,
|
||||
NULL, NULL);
|
||||
clutter_evdev_set_relative_motion_filter (manager, relative_motion_filter,
|
||||
meta_backend_get_monitor_manager (backend));
|
||||
}
|
||||
|
||||
static MetaIdleMonitor *
|
||||
|
@ -65,6 +65,7 @@ struct _MetaCursorRendererNativePrivate
|
||||
{
|
||||
gboolean hw_state_invalidated;
|
||||
gboolean has_hw_cursor;
|
||||
gboolean hw_cursor_broken;
|
||||
|
||||
MetaCursorSprite *last_cursor;
|
||||
guint animation_timeout_id;
|
||||
@ -185,8 +186,16 @@ set_crtc_cursor (MetaCursorRendererNative *native,
|
||||
handle = gbm_bo_get_handle (bo);
|
||||
meta_cursor_sprite_get_hotspot (cursor_sprite, &hot_x, &hot_y);
|
||||
|
||||
drmModeSetCursor2 (priv->drm_fd, crtc->crtc_id, handle.u32,
|
||||
priv->cursor_width, priv->cursor_height, hot_x, hot_y);
|
||||
if (drmModeSetCursor2 (priv->drm_fd, crtc->crtc_id, handle.u32,
|
||||
priv->cursor_width, priv->cursor_height,
|
||||
hot_x, hot_y) < 0)
|
||||
{
|
||||
g_warning ("drmModeSetCursor2 failed with (%s), "
|
||||
"drawing cursor with OpenGL from now on",
|
||||
strerror (errno));
|
||||
priv->has_hw_cursor = FALSE;
|
||||
priv->hw_cursor_broken = TRUE;
|
||||
}
|
||||
|
||||
if (cursor_priv->pending_bo_state == META_CURSOR_GBM_BO_STATE_SET)
|
||||
{
|
||||
@ -311,8 +320,13 @@ static gboolean
|
||||
should_have_hw_cursor (MetaCursorRenderer *renderer,
|
||||
MetaCursorSprite *cursor_sprite)
|
||||
{
|
||||
MetaCursorRendererNative *native = META_CURSOR_RENDERER_NATIVE (renderer);
|
||||
MetaCursorRendererNativePrivate *priv = meta_cursor_renderer_native_get_instance_private (native);
|
||||
CoglTexture *texture;
|
||||
|
||||
if (priv->hw_cursor_broken)
|
||||
return FALSE;
|
||||
|
||||
if (!cursor_sprite)
|
||||
return FALSE;
|
||||
|
||||
@ -528,7 +542,7 @@ meta_cursor_renderer_native_realize_cursor_from_wl_buffer (MetaCursorRenderer *r
|
||||
CoglTexture *texture;
|
||||
uint width, height;
|
||||
|
||||
if (!priv->gbm)
|
||||
if (!priv->gbm || priv->hw_cursor_broken)
|
||||
return;
|
||||
|
||||
/* Destroy any previous pending cursor buffer; we'll always either fail (which
|
||||
@ -621,7 +635,7 @@ meta_cursor_renderer_native_realize_cursor_from_xcursor (MetaCursorRenderer *ren
|
||||
MetaCursorRendererNativePrivate *priv =
|
||||
meta_cursor_renderer_native_get_instance_private (native);
|
||||
|
||||
if (!priv->gbm)
|
||||
if (!priv->gbm || priv->hw_cursor_broken)
|
||||
return;
|
||||
|
||||
invalidate_pending_cursor_sprite_gbm_bo (cursor_sprite);
|
||||
|
@ -121,6 +121,25 @@ meta_input_settings_native_set_tap_enabled (MetaInputSettings *settings,
|
||||
LIBINPUT_CONFIG_TAP_DISABLED);
|
||||
}
|
||||
|
||||
static void
|
||||
meta_input_settings_native_set_disable_while_typing (MetaInputSettings *settings,
|
||||
ClutterInputDevice *device,
|
||||
gboolean enabled)
|
||||
{
|
||||
struct libinput_device *libinput_device;
|
||||
|
||||
libinput_device = clutter_evdev_input_device_get_libinput_device (device);
|
||||
|
||||
if (!libinput_device)
|
||||
return;
|
||||
|
||||
if (libinput_device_config_dwt_is_available (libinput_device))
|
||||
libinput_device_config_dwt_set_enabled (libinput_device,
|
||||
enabled ?
|
||||
LIBINPUT_CONFIG_DWT_ENABLED :
|
||||
LIBINPUT_CONFIG_DWT_DISABLED);
|
||||
}
|
||||
|
||||
static void
|
||||
meta_input_settings_native_set_invert_scroll (MetaInputSettings *settings,
|
||||
ClutterInputDevice *device,
|
||||
@ -432,8 +451,18 @@ meta_input_settings_native_set_tablet_area (MetaInputSettings *settings,
|
||||
gdouble padding_bottom)
|
||||
{
|
||||
struct libinput_device *libinput_device;
|
||||
gfloat matrix[6] = { 1. - (padding_left + padding_right), 0., padding_left,
|
||||
0., 1. - (padding_top + padding_bottom), padding_top };
|
||||
gfloat scale_x;
|
||||
gfloat scale_y;
|
||||
gfloat offset_x;
|
||||
gfloat offset_y;
|
||||
|
||||
scale_x = 1. / (1. - (padding_left + padding_right));
|
||||
scale_y = 1. / (1. - (padding_top + padding_bottom));
|
||||
offset_x = -padding_left * scale_x;
|
||||
offset_y = -padding_top * scale_y;
|
||||
|
||||
gfloat matrix[6] = { scale_x, 0., offset_x,
|
||||
0., scale_y, offset_y };
|
||||
|
||||
libinput_device = clutter_evdev_input_device_get_libinput_device (device);
|
||||
if (!libinput_device ||
|
||||
@ -507,6 +536,7 @@ meta_input_settings_native_class_init (MetaInputSettingsNativeClass *klass)
|
||||
input_settings_class->set_scroll_button = meta_input_settings_native_set_scroll_button;
|
||||
input_settings_class->set_click_method = meta_input_settings_native_set_click_method;
|
||||
input_settings_class->set_keyboard_repeat = meta_input_settings_native_set_keyboard_repeat;
|
||||
input_settings_class->set_disable_while_typing = meta_input_settings_native_set_disable_while_typing;
|
||||
|
||||
input_settings_class->set_tablet_mapping = meta_input_settings_native_set_tablet_mapping;
|
||||
input_settings_class->set_tablet_keep_aspect = meta_input_settings_native_set_tablet_keep_aspect;
|
||||
|
@ -498,18 +498,31 @@ find_output_by_id (MetaOutput *outputs,
|
||||
static int
|
||||
compute_scale (MetaOutput *output)
|
||||
{
|
||||
int scale = 1;
|
||||
int scale = 1, width, height;
|
||||
|
||||
if (!output->crtc)
|
||||
goto out;
|
||||
|
||||
width = output->crtc->rect.width;
|
||||
height = output->crtc->rect.height;
|
||||
|
||||
/* Swap values on rotated transforms, so pixel and mm sizes
|
||||
* from the same axes is compared.
|
||||
*/
|
||||
if (meta_monitor_transform_is_rotated (output->crtc->transform))
|
||||
{
|
||||
int tmp = width;
|
||||
width = height;
|
||||
height = tmp;
|
||||
}
|
||||
|
||||
/* Scaling makes no sense */
|
||||
if (output->crtc->rect.width < HIDPI_MIN_HEIGHT)
|
||||
if (height < HIDPI_MIN_HEIGHT)
|
||||
goto out;
|
||||
|
||||
/* 4K TV */
|
||||
if (output->name != NULL && strstr(output->name, "HDMI") != NULL &&
|
||||
output->crtc->rect.width >= SMALLEST_4K_WIDTH)
|
||||
width >= SMALLEST_4K_WIDTH)
|
||||
goto out;
|
||||
|
||||
/* Somebody encoded the aspect ratio (16/9 or 16/10)
|
||||
@ -523,8 +536,9 @@ compute_scale (MetaOutput *output)
|
||||
if (output->width_mm > 0 && output->height_mm > 0)
|
||||
{
|
||||
double dpi_x, dpi_y;
|
||||
dpi_x = (double)output->crtc->rect.width / (output->width_mm / 25.4);
|
||||
dpi_y = (double)output->crtc->rect.height / (output->height_mm / 25.4);
|
||||
|
||||
dpi_x = (double)width / (output->width_mm / 25.4);
|
||||
dpi_y = (double)height / (output->height_mm / 25.4);
|
||||
/* We don't completely trust these values so both
|
||||
must be high, and never pick higher ratio than
|
||||
2 automatically */
|
||||
|
@ -1563,7 +1563,7 @@ meta_renderer_native_set_legacy_view_size (MetaRendererNative *renderer_native,
|
||||
}
|
||||
|
||||
static const CoglWinsysVtable *
|
||||
get_native_cogl_winsys_vtable (void)
|
||||
get_native_cogl_winsys_vtable (CoglRenderer *cogl_renderer)
|
||||
{
|
||||
static gboolean vtable_inited = FALSE;
|
||||
static CoglWinsysVtable vtable;
|
||||
|
@ -189,9 +189,14 @@ meta_input_settings_x11_set_left_handed (MetaInputSettings *settings,
|
||||
ClutterInputDevice *device,
|
||||
gboolean enabled)
|
||||
{
|
||||
ClutterInputDeviceType device_type;
|
||||
guchar value;
|
||||
|
||||
if (clutter_input_device_get_device_type (device) == CLUTTER_TABLET_DEVICE)
|
||||
device_type = clutter_input_device_get_device_type (device);
|
||||
|
||||
if (device_type == CLUTTER_TABLET_DEVICE ||
|
||||
device_type == CLUTTER_PEN_DEVICE ||
|
||||
device_type == CLUTTER_ERASER_DEVICE)
|
||||
{
|
||||
value = enabled ? 3 : 0;
|
||||
change_property (device, "Wacom Rotation",
|
||||
@ -205,6 +210,17 @@ meta_input_settings_x11_set_left_handed (MetaInputSettings *settings,
|
||||
}
|
||||
}
|
||||
|
||||
static void
|
||||
meta_input_settings_x11_set_disable_while_typing (MetaInputSettings *settings,
|
||||
ClutterInputDevice *device,
|
||||
gboolean enabled)
|
||||
{
|
||||
guchar value = (enabled) ? 1 : 0;
|
||||
|
||||
change_property (device, "libinput Disable While Typing Enabled",
|
||||
XA_INTEGER, 8, &value, 1);
|
||||
}
|
||||
|
||||
static void
|
||||
meta_input_settings_x11_set_tap_enabled (MetaInputSettings *settings,
|
||||
ClutterInputDevice *device,
|
||||
@ -598,7 +614,7 @@ meta_input_settings_x11_set_tablet_area (MetaInputSettings *settings,
|
||||
area[0] = width * padding_left;
|
||||
area[1] = height * padding_top;
|
||||
area[2] = width - (width * padding_right);
|
||||
area[2] = height - (height * padding_bottom);
|
||||
area[3] = height - (height * padding_bottom);
|
||||
update_tablet_area (settings, device, area);
|
||||
}
|
||||
|
||||
@ -744,6 +760,7 @@ meta_input_settings_x11_class_init (MetaInputSettingsX11Class *klass)
|
||||
input_settings_class->set_speed = meta_input_settings_x11_set_speed;
|
||||
input_settings_class->set_left_handed = meta_input_settings_x11_set_left_handed;
|
||||
input_settings_class->set_tap_enabled = meta_input_settings_x11_set_tap_enabled;
|
||||
input_settings_class->set_disable_while_typing = meta_input_settings_x11_set_disable_while_typing;
|
||||
input_settings_class->set_invert_scroll = meta_input_settings_x11_set_invert_scroll;
|
||||
input_settings_class->set_edge_scroll = meta_input_settings_x11_set_edge_scroll;
|
||||
input_settings_class->set_two_finger_scroll = meta_input_settings_x11_set_two_finger_scroll;
|
||||
|
@ -348,7 +348,7 @@ output_get_backlight_limits_xrandr (MetaMonitorManagerXrandr *manager_xrandr,
|
||||
{
|
||||
Atom atom;
|
||||
xcb_connection_t *xcb_conn;
|
||||
g_autofree xcb_randr_query_output_property_reply_t *reply;
|
||||
g_autofree xcb_randr_query_output_property_reply_t *reply = NULL;
|
||||
|
||||
atom = XInternAtom (manager_xrandr->xdisplay, "Backlight", False);
|
||||
|
||||
|
@ -48,12 +48,25 @@ struct _MetaRendererX11
|
||||
G_DEFINE_TYPE (MetaRendererX11, meta_renderer_x11, META_TYPE_RENDERER)
|
||||
|
||||
static const CoglWinsysVtable *
|
||||
get_x11_cogl_winsys_vtable (void)
|
||||
get_x11_cogl_winsys_vtable (CoglRenderer *renderer)
|
||||
{
|
||||
if (meta_is_wayland_compositor ())
|
||||
return _cogl_winsys_egl_xlib_get_vtable ();
|
||||
else
|
||||
return _cogl_winsys_glx_get_vtable ();
|
||||
|
||||
switch (renderer->driver)
|
||||
{
|
||||
case COGL_DRIVER_GLES1:
|
||||
case COGL_DRIVER_GLES2:
|
||||
return _cogl_winsys_egl_xlib_get_vtable ();
|
||||
case COGL_DRIVER_GL:
|
||||
case COGL_DRIVER_GL3:
|
||||
return _cogl_winsys_glx_get_vtable ();
|
||||
case COGL_DRIVER_ANY:
|
||||
case COGL_DRIVER_NOP:
|
||||
case COGL_DRIVER_WEBGL:
|
||||
break;
|
||||
}
|
||||
g_assert_not_reached ();
|
||||
}
|
||||
|
||||
static CoglRenderer *
|
||||
|
@ -388,7 +388,9 @@ meta_begin_modal_for_plugin (MetaCompositor *compositor,
|
||||
meta_display_sync_wayland_input_focus (display);
|
||||
meta_display_cancel_touch (display);
|
||||
|
||||
#ifdef HAVE_WAYLAND
|
||||
meta_dnd_wayland_handle_begin_modal (compositor);
|
||||
#endif
|
||||
}
|
||||
|
||||
return TRUE;
|
||||
|
@ -155,7 +155,7 @@ file_loaded (GObject *source_object,
|
||||
CoglError *catch_error = NULL;
|
||||
GTask *task;
|
||||
CoglTexture *texture;
|
||||
GdkPixbuf *pixbuf;
|
||||
GdkPixbuf *pixbuf, *rotated;
|
||||
int width, height, row_stride;
|
||||
guchar *pixels;
|
||||
gboolean has_alpha;
|
||||
@ -173,6 +173,13 @@ file_loaded (GObject *source_object,
|
||||
goto out;
|
||||
}
|
||||
|
||||
rotated = gdk_pixbuf_apply_embedded_orientation (pixbuf);
|
||||
if (rotated != NULL)
|
||||
{
|
||||
g_object_unref (pixbuf);
|
||||
pixbuf = rotated;
|
||||
}
|
||||
|
||||
width = gdk_pixbuf_get_width (pixbuf);
|
||||
height = gdk_pixbuf_get_height (pixbuf);
|
||||
row_stride = gdk_pixbuf_get_rowstride (pixbuf);
|
||||
|
@ -443,11 +443,13 @@ calculate_compositor_configuration (MetaCompositorType *compositor_type,
|
||||
#endif /* HAVE_WAYLAND */
|
||||
*compositor_type = META_COMPOSITOR_TYPE_X11;
|
||||
|
||||
#ifdef HAVE_WAYLAND
|
||||
if (opt_nested)
|
||||
{
|
||||
*backend_gtype = META_TYPE_BACKEND_X11_NESTED;
|
||||
return;
|
||||
}
|
||||
#endif /* HAVE_WAYLAND */
|
||||
|
||||
#ifdef HAVE_NATIVE_BACKEND
|
||||
if (opt_display_server)
|
||||
|
@ -2957,7 +2957,11 @@ unmaximize_window_before_freeing (MetaWindow *window)
|
||||
window->rect = window->saved_rect;
|
||||
set_net_wm_state (window);
|
||||
}
|
||||
else if (window->screen->closing) /* See bug #358042 */
|
||||
else if (window->screen->closing /* See bug #358042 */
|
||||
#ifdef HAVE_WAYLAND
|
||||
&& !meta_is_wayland_compositor ()
|
||||
#endif
|
||||
)
|
||||
{
|
||||
/* Do NOT update net_wm_state: this screen is closing,
|
||||
* it likely will be managed by another window manager
|
||||
@ -3645,6 +3649,7 @@ meta_window_move_resize_internal (MetaWindow *window,
|
||||
MetaRectangle unconstrained_rect;
|
||||
MetaRectangle constrained_rect;
|
||||
MetaMoveResizeResultFlags result = 0;
|
||||
gboolean moved_or_resized = FALSE;
|
||||
|
||||
g_return_if_fail (!window->override_redirect);
|
||||
|
||||
@ -3720,19 +3725,28 @@ meta_window_move_resize_internal (MetaWindow *window,
|
||||
META_WINDOW_GET_CLASS (window)->move_resize_internal (window, gravity, unconstrained_rect, constrained_rect, flags, &result);
|
||||
|
||||
if (result & META_MOVE_RESIZE_RESULT_MOVED)
|
||||
g_signal_emit (window, window_signals[POSITION_CHANGED], 0);
|
||||
{
|
||||
moved_or_resized = TRUE;
|
||||
g_signal_emit (window, window_signals[POSITION_CHANGED], 0);
|
||||
}
|
||||
|
||||
if (result & META_MOVE_RESIZE_RESULT_RESIZED)
|
||||
g_signal_emit (window, window_signals[SIZE_CHANGED], 0);
|
||||
|
||||
if ((result & (META_MOVE_RESIZE_RESULT_MOVED | META_MOVE_RESIZE_RESULT_RESIZED)) != 0 || did_placement)
|
||||
{
|
||||
window->unconstrained_rect = unconstrained_rect;
|
||||
moved_or_resized = TRUE;
|
||||
g_signal_emit (window, window_signals[SIZE_CHANGED], 0);
|
||||
}
|
||||
|
||||
if (window->known_to_compositor)
|
||||
meta_compositor_sync_window_geometry (window->display->compositor,
|
||||
window,
|
||||
did_placement);
|
||||
if (moved_or_resized || did_placement)
|
||||
window->unconstrained_rect = unconstrained_rect;
|
||||
|
||||
if ((moved_or_resized ||
|
||||
did_placement ||
|
||||
(flags & META_MOVE_RESIZE_STATE_CHANGED) != 0) &&
|
||||
window->known_to_compositor)
|
||||
{
|
||||
meta_compositor_sync_window_geometry (window->display->compositor,
|
||||
window,
|
||||
did_placement);
|
||||
}
|
||||
|
||||
old_output_winsys_id = window->monitor->winsys_id;
|
||||
|
22
src/tests/monitor-configs/tiled-custom-resolution.xml
Normal file
22
src/tests/monitor-configs/tiled-custom-resolution.xml
Normal file
@ -0,0 +1,22 @@
|
||||
<monitors version="2">
|
||||
<configuration>
|
||||
<logicalmonitor>
|
||||
<x>0</x>
|
||||
<y>0</y>
|
||||
<primary>yes</primary>
|
||||
<monitor>
|
||||
<monitorspec>
|
||||
<connector>DP-2</connector>
|
||||
<vendor>MetaProduct's Inc.</vendor>
|
||||
<product>MetaMonitor</product>
|
||||
<serial>0x123456</serial>
|
||||
</monitorspec>
|
||||
<mode>
|
||||
<width>800</width>
|
||||
<height>600</height>
|
||||
<rate>60</rate>
|
||||
</mode>
|
||||
</monitor>
|
||||
</logicalmonitor>
|
||||
</configuration>
|
||||
</monitors>
|
@ -337,17 +337,29 @@ check_monitor_mode (MetaMonitor *monitor,
|
||||
CheckMonitorModeData *data = user_data;
|
||||
MetaMonitorManager *monitor_manager = data->monitor_manager;
|
||||
MetaOutput *output;
|
||||
int crtc_mode_index;
|
||||
MetaCrtcMode *crtc_mode;
|
||||
|
||||
output = output_from_winsys_id (monitor_manager,
|
||||
data->expect_crtc_mode_iter->output);
|
||||
crtc_mode = &monitor_manager->modes[data->expect_crtc_mode_iter->crtc_mode];
|
||||
crtc_mode_index = data->expect_crtc_mode_iter->crtc_mode;
|
||||
if (crtc_mode_index == -1)
|
||||
crtc_mode = NULL;
|
||||
else
|
||||
crtc_mode = &monitor_manager->modes[crtc_mode_index];
|
||||
|
||||
g_assert (monitor_crtc_mode->output == output);
|
||||
g_assert (monitor_crtc_mode->crtc_mode == crtc_mode);
|
||||
|
||||
g_assert_cmpint (monitor_crtc_mode->x, ==, data->expect_crtc_mode_iter->x);
|
||||
g_assert_cmpint (monitor_crtc_mode->y, ==, data->expect_crtc_mode_iter->y);
|
||||
if (crtc_mode)
|
||||
{
|
||||
g_assert_cmpint (monitor_crtc_mode->x,
|
||||
==,
|
||||
data->expect_crtc_mode_iter->x);
|
||||
g_assert_cmpint (monitor_crtc_mode->y,
|
||||
==,
|
||||
data->expect_crtc_mode_iter->y);
|
||||
}
|
||||
|
||||
data->expect_crtc_mode_iter++;
|
||||
|
||||
@ -368,8 +380,11 @@ check_current_monitor_mode (MetaMonitor *monitor,
|
||||
output = output_from_winsys_id (monitor_manager,
|
||||
data->expect_crtc_mode_iter->output);
|
||||
|
||||
g_assert_nonnull (output->crtc);
|
||||
g_assert (monitor_crtc_mode->crtc_mode == output->crtc->current_mode);
|
||||
if (data->expect_crtc_mode_iter->crtc_mode != -1)
|
||||
{
|
||||
g_assert_nonnull (output->crtc);
|
||||
g_assert (monitor_crtc_mode->crtc_mode == output->crtc->current_mode);
|
||||
}
|
||||
|
||||
data->expect_crtc_mode_iter++;
|
||||
|
||||
@ -459,7 +474,8 @@ check_logical_monitor (MonitorTestCase *test_case,
|
||||
primary_output = output;
|
||||
}
|
||||
|
||||
g_assert (output->crtc->logical_monitor == logical_monitor);
|
||||
g_assert (!output->crtc ||
|
||||
output->crtc->logical_monitor == logical_monitor);
|
||||
g_assert_cmpint (logical_monitor->is_presentation,
|
||||
==,
|
||||
output->is_presentation);
|
||||
@ -583,6 +599,10 @@ check_monitor_configuration (MonitorTestCase *test_case)
|
||||
expected_current_mode_index)->data;
|
||||
|
||||
g_assert (current_mode == expected_current_mode);
|
||||
if (current_mode)
|
||||
g_assert (meta_monitor_is_active (monitor));
|
||||
else
|
||||
g_assert (!meta_monitor_is_active (monitor));
|
||||
|
||||
if (current_mode)
|
||||
{
|
||||
@ -1237,6 +1257,182 @@ meta_test_monitor_tiled_linear_config (void)
|
||||
check_monitor_configuration (&test_case);
|
||||
}
|
||||
|
||||
static void
|
||||
meta_test_monitor_tiled_non_preferred_linear_config (void)
|
||||
{
|
||||
MonitorTestCase test_case = {
|
||||
.setup = {
|
||||
.modes = {
|
||||
{
|
||||
.width = 640,
|
||||
.height = 480,
|
||||
.refresh_rate = 60.0
|
||||
},
|
||||
{
|
||||
.width = 800,
|
||||
.height = 600,
|
||||
.refresh_rate = 60.0
|
||||
},
|
||||
{
|
||||
.width = 512,
|
||||
.height = 768,
|
||||
.refresh_rate = 120.0
|
||||
},
|
||||
{
|
||||
.width = 1024,
|
||||
.height = 768,
|
||||
.refresh_rate = 60.0
|
||||
},
|
||||
},
|
||||
.n_modes = 4,
|
||||
.outputs = {
|
||||
{
|
||||
.crtc = -1,
|
||||
.modes = { 0, 2 },
|
||||
.n_modes = 2,
|
||||
.preferred_mode = 1,
|
||||
.possible_crtcs = { 0 },
|
||||
.n_possible_crtcs = 1,
|
||||
.width_mm = 222,
|
||||
.height_mm = 125,
|
||||
.tile_info = {
|
||||
.group_id = 1,
|
||||
.max_h_tiles = 2,
|
||||
.max_v_tiles = 1,
|
||||
.loc_h_tile = 0,
|
||||
.loc_v_tile = 0,
|
||||
.tile_w = 512,
|
||||
.tile_h = 768
|
||||
}
|
||||
},
|
||||
{
|
||||
.crtc = -1,
|
||||
.modes = { 1, 2, 3 },
|
||||
.n_modes = 3,
|
||||
.preferred_mode = 0,
|
||||
.possible_crtcs = { 1 },
|
||||
.n_possible_crtcs = 1,
|
||||
.width_mm = 222,
|
||||
.height_mm = 125,
|
||||
.tile_info = {
|
||||
.group_id = 1,
|
||||
.max_h_tiles = 2,
|
||||
.max_v_tiles = 1,
|
||||
.loc_h_tile = 1,
|
||||
.loc_v_tile = 0,
|
||||
.tile_w = 512,
|
||||
.tile_h = 768
|
||||
}
|
||||
}
|
||||
},
|
||||
.n_outputs = 2,
|
||||
.crtcs = {
|
||||
{
|
||||
.current_mode = -1
|
||||
},
|
||||
{
|
||||
.current_mode = -1
|
||||
}
|
||||
},
|
||||
.n_crtcs = 2
|
||||
},
|
||||
|
||||
.expect = {
|
||||
.monitors = {
|
||||
{
|
||||
.outputs = { 0, 1 },
|
||||
.n_outputs = 2,
|
||||
.modes = {
|
||||
{
|
||||
.width = 1024,
|
||||
.height = 768,
|
||||
.crtc_modes = {
|
||||
{
|
||||
.output = 0,
|
||||
.crtc_mode = 2
|
||||
},
|
||||
{
|
||||
.output = 1,
|
||||
.crtc_mode = 2,
|
||||
.x = 512
|
||||
}
|
||||
}
|
||||
},
|
||||
{
|
||||
.width = 800,
|
||||
.height = 600,
|
||||
.crtc_modes = {
|
||||
{
|
||||
.output = 0,
|
||||
.crtc_mode = -1
|
||||
},
|
||||
{
|
||||
.output = 1,
|
||||
.crtc_mode = 1,
|
||||
}
|
||||
}
|
||||
},
|
||||
{
|
||||
.width = 1024,
|
||||
.height = 768,
|
||||
.crtc_modes = {
|
||||
{
|
||||
.output = 0,
|
||||
.crtc_mode = -1
|
||||
},
|
||||
{
|
||||
.output = 1,
|
||||
.crtc_mode = 3,
|
||||
}
|
||||
}
|
||||
},
|
||||
},
|
||||
.n_modes = 3,
|
||||
.current_mode = 0,
|
||||
.width_mm = 222,
|
||||
.height_mm = 125,
|
||||
}
|
||||
},
|
||||
.n_monitors = 1,
|
||||
.logical_monitors = {
|
||||
{
|
||||
.monitors = { 0 },
|
||||
.n_monitors = 1,
|
||||
.layout = { .x = 0, .y = 0, .width = 1024, .height = 768 },
|
||||
.scale = 1
|
||||
},
|
||||
},
|
||||
.n_logical_monitors = 1,
|
||||
.primary_logical_monitor = 0,
|
||||
.n_outputs = 2,
|
||||
.crtcs = {
|
||||
{
|
||||
.current_mode = 2,
|
||||
},
|
||||
{
|
||||
.current_mode = 2,
|
||||
}
|
||||
},
|
||||
.n_crtcs = 2,
|
||||
.n_tiled_monitors = 1,
|
||||
.screen_width = 1024,
|
||||
.screen_height = 768,
|
||||
}
|
||||
};
|
||||
MetaMonitorTestSetup *test_setup;
|
||||
|
||||
if (!is_using_monitor_config_manager ())
|
||||
{
|
||||
g_test_skip ("Only the new monitor config manager handles this case.");
|
||||
return;
|
||||
}
|
||||
|
||||
test_setup = create_monitor_test_setup (&test_case,
|
||||
MONITOR_TEST_FLAG_NO_STORED);
|
||||
emulate_hotplug (test_setup);
|
||||
check_monitor_configuration (&test_case);
|
||||
}
|
||||
|
||||
static void
|
||||
meta_test_monitor_hidpi_linear_config (void)
|
||||
{
|
||||
@ -2612,6 +2808,184 @@ meta_test_monitor_custom_underscanning_config (void)
|
||||
check_monitor_configuration (&test_case);
|
||||
}
|
||||
|
||||
static void
|
||||
meta_test_monitor_custom_tiled_non_preferred_config (void)
|
||||
{
|
||||
MonitorTestCase test_case = {
|
||||
.setup = {
|
||||
.modes = {
|
||||
{
|
||||
.width = 640,
|
||||
.height = 480,
|
||||
.refresh_rate = 60.0
|
||||
},
|
||||
{
|
||||
.width = 800,
|
||||
.height = 600,
|
||||
.refresh_rate = 60.0
|
||||
},
|
||||
{
|
||||
.width = 512,
|
||||
.height = 768,
|
||||
.refresh_rate = 120.0
|
||||
},
|
||||
{
|
||||
.width = 1024,
|
||||
.height = 768,
|
||||
.refresh_rate = 60.0
|
||||
},
|
||||
},
|
||||
.n_modes = 4,
|
||||
.outputs = {
|
||||
{
|
||||
.crtc = -1,
|
||||
.modes = { 0, 2 },
|
||||
.n_modes = 2,
|
||||
.preferred_mode = 1,
|
||||
.possible_crtcs = { 0 },
|
||||
.n_possible_crtcs = 1,
|
||||
.width_mm = 222,
|
||||
.height_mm = 125,
|
||||
.tile_info = {
|
||||
.group_id = 1,
|
||||
.max_h_tiles = 2,
|
||||
.max_v_tiles = 1,
|
||||
.loc_h_tile = 0,
|
||||
.loc_v_tile = 0,
|
||||
.tile_w = 512,
|
||||
.tile_h = 768
|
||||
}
|
||||
},
|
||||
{
|
||||
.crtc = -1,
|
||||
.modes = { 1, 2, 3 },
|
||||
.n_modes = 3,
|
||||
.preferred_mode = 0,
|
||||
.possible_crtcs = { 1 },
|
||||
.n_possible_crtcs = 1,
|
||||
.width_mm = 222,
|
||||
.height_mm = 125,
|
||||
.tile_info = {
|
||||
.group_id = 1,
|
||||
.max_h_tiles = 2,
|
||||
.max_v_tiles = 1,
|
||||
.loc_h_tile = 1,
|
||||
.loc_v_tile = 0,
|
||||
.tile_w = 512,
|
||||
.tile_h = 768
|
||||
}
|
||||
}
|
||||
},
|
||||
.n_outputs = 2,
|
||||
.crtcs = {
|
||||
{
|
||||
.current_mode = -1
|
||||
},
|
||||
{
|
||||
.current_mode = -1
|
||||
}
|
||||
},
|
||||
.n_crtcs = 2
|
||||
},
|
||||
|
||||
.expect = {
|
||||
.monitors = {
|
||||
{
|
||||
.outputs = { 0, 1 },
|
||||
.n_outputs = 2,
|
||||
.modes = {
|
||||
{
|
||||
.width = 1024,
|
||||
.height = 768,
|
||||
.crtc_modes = {
|
||||
{
|
||||
.output = 0,
|
||||
.crtc_mode = 2
|
||||
},
|
||||
{
|
||||
.output = 1,
|
||||
.crtc_mode = 2,
|
||||
.x = 512
|
||||
}
|
||||
}
|
||||
},
|
||||
{
|
||||
.width = 800,
|
||||
.height = 600,
|
||||
.crtc_modes = {
|
||||
{
|
||||
.output = 0,
|
||||
.crtc_mode = -1
|
||||
},
|
||||
{
|
||||
.output = 1,
|
||||
.crtc_mode = 1,
|
||||
}
|
||||
}
|
||||
},
|
||||
{
|
||||
.width = 1024,
|
||||
.height = 768,
|
||||
.crtc_modes = {
|
||||
{
|
||||
.output = 0,
|
||||
.crtc_mode = -1
|
||||
},
|
||||
{
|
||||
.output = 1,
|
||||
.crtc_mode = 3,
|
||||
}
|
||||
}
|
||||
},
|
||||
},
|
||||
.n_modes = 3,
|
||||
.current_mode = 1,
|
||||
.width_mm = 222,
|
||||
.height_mm = 125,
|
||||
}
|
||||
},
|
||||
.n_monitors = 1,
|
||||
.logical_monitors = {
|
||||
{
|
||||
.monitors = { 0 },
|
||||
.n_monitors = 1,
|
||||
.layout = { .x = 0, .y = 0, .width = 800, .height = 600 },
|
||||
.scale = 1
|
||||
},
|
||||
},
|
||||
.n_logical_monitors = 1,
|
||||
.primary_logical_monitor = 0,
|
||||
.n_outputs = 2,
|
||||
.crtcs = {
|
||||
{
|
||||
.current_mode = -1,
|
||||
},
|
||||
{
|
||||
.current_mode = 1,
|
||||
}
|
||||
},
|
||||
.n_crtcs = 2,
|
||||
.n_tiled_monitors = 1,
|
||||
.screen_width = 800,
|
||||
.screen_height = 600,
|
||||
}
|
||||
};
|
||||
MetaMonitorTestSetup *test_setup;
|
||||
|
||||
if (!is_using_monitor_config_manager ())
|
||||
{
|
||||
g_test_skip ("Only the new monitor config manager handles this case.");
|
||||
return;
|
||||
}
|
||||
|
||||
test_setup = create_monitor_test_setup (&test_case,
|
||||
MONITOR_TEST_FLAG_NONE);
|
||||
set_custom_monitor_config ("tiled-custom-resolution.xml");
|
||||
emulate_hotplug (test_setup);
|
||||
|
||||
check_monitor_configuration (&test_case);
|
||||
}
|
||||
|
||||
void
|
||||
init_monitor_tests (void)
|
||||
{
|
||||
@ -2631,6 +3005,8 @@ init_monitor_tests (void)
|
||||
meta_test_monitor_preferred_linear_config);
|
||||
g_test_add_func ("/backends/monitor/tiled-linear-config",
|
||||
meta_test_monitor_tiled_linear_config);
|
||||
g_test_add_func ("/backends/monitor/tiled-non-preferred-linear-config",
|
||||
meta_test_monitor_tiled_non_preferred_linear_config);
|
||||
g_test_add_func ("/backends/monitor/hidpi-linear-config",
|
||||
meta_test_monitor_hidpi_linear_config);
|
||||
g_test_add_func ("/backends/monitor/suggested-config",
|
||||
@ -2654,4 +3030,6 @@ init_monitor_tests (void)
|
||||
meta_test_monitor_custom_primary_config);
|
||||
g_test_add_func ("/backends/monitor/custom/underscanning-config",
|
||||
meta_test_monitor_custom_underscanning_config);
|
||||
g_test_add_func ("/backends/monitor/custom/tiled-non-preferred-config",
|
||||
meta_test_monitor_custom_tiled_non_preferred_config);
|
||||
}
|
||||
|
@ -181,7 +181,7 @@ update_style_contexts (MetaFrames *frames)
|
||||
frames->normal_style = meta_theme_create_style_info (screen, NULL);
|
||||
|
||||
variants = g_hash_table_get_keys (frames->style_variants);
|
||||
for (variant = variants; variant; variant = variants->next)
|
||||
for (variant = variants; variant; variant = variant->next)
|
||||
{
|
||||
style_info = meta_theme_create_style_info (screen, (char *)variant->data);
|
||||
g_hash_table_insert (frames->style_variants,
|
||||
|
@ -86,6 +86,10 @@ static guint signals[LAST_SIGNAL];
|
||||
G_DEFINE_TYPE (MetaWaylandPointer, meta_wayland_pointer,
|
||||
META_TYPE_WAYLAND_INPUT_DEVICE)
|
||||
|
||||
static void
|
||||
meta_wayland_pointer_set_current (MetaWaylandPointer *pointer,
|
||||
MetaWaylandSurface *surface);
|
||||
|
||||
static void
|
||||
meta_wayland_pointer_reset_grab (MetaWaylandPointer *pointer);
|
||||
|
||||
@ -246,14 +250,6 @@ sync_focus_surface (MetaWaylandPointer *pointer)
|
||||
|
||||
}
|
||||
|
||||
static void
|
||||
pointer_handle_focus_surface_destroy (struct wl_listener *listener, void *data)
|
||||
{
|
||||
MetaWaylandPointer *pointer = wl_container_of (listener, pointer, focus_surface_listener);
|
||||
|
||||
meta_wayland_pointer_set_focus (pointer, NULL);
|
||||
}
|
||||
|
||||
static void
|
||||
meta_wayland_pointer_send_frame (MetaWaylandPointer *pointer,
|
||||
struct wl_resource *resource)
|
||||
@ -488,8 +484,6 @@ meta_wayland_pointer_enable (MetaWaylandPointer *pointer)
|
||||
g_hash_table_new_full (NULL, NULL, NULL,
|
||||
(GDestroyNotify) meta_wayland_pointer_client_free);
|
||||
|
||||
pointer->focus_surface_listener.notify = pointer_handle_focus_surface_destroy;
|
||||
|
||||
pointer->cursor_surface = NULL;
|
||||
|
||||
manager = clutter_device_manager_get_default ();
|
||||
@ -520,6 +514,7 @@ meta_wayland_pointer_disable (MetaWaylandPointer *pointer)
|
||||
meta_wayland_pointer_cancel_grab (pointer);
|
||||
meta_wayland_pointer_reset_grab (pointer);
|
||||
meta_wayland_pointer_set_focus (pointer, NULL);
|
||||
meta_wayland_pointer_set_current (pointer, NULL);
|
||||
|
||||
g_clear_pointer (&pointer->pointer_clients, g_hash_table_unref);
|
||||
pointer->cursor_surface = NULL;
|
||||
@ -547,11 +542,40 @@ count_buttons (const ClutterEvent *event)
|
||||
return count;
|
||||
}
|
||||
|
||||
static void
|
||||
current_surface_destroyed (MetaWaylandSurface *surface,
|
||||
MetaWaylandPointer *pointer)
|
||||
{
|
||||
meta_wayland_pointer_set_current (pointer, NULL);
|
||||
}
|
||||
|
||||
static void
|
||||
meta_wayland_pointer_set_current (MetaWaylandPointer *pointer,
|
||||
MetaWaylandSurface *surface)
|
||||
{
|
||||
if (pointer->current)
|
||||
{
|
||||
g_signal_handler_disconnect (pointer->current,
|
||||
pointer->current_surface_destroyed_handler_id);
|
||||
pointer->current = NULL;
|
||||
}
|
||||
|
||||
if (surface)
|
||||
{
|
||||
pointer->current = surface;
|
||||
pointer->current_surface_destroyed_handler_id =
|
||||
g_signal_connect (surface, "destroy",
|
||||
G_CALLBACK (current_surface_destroyed),
|
||||
pointer);
|
||||
}
|
||||
}
|
||||
|
||||
static void
|
||||
repick_for_event (MetaWaylandPointer *pointer,
|
||||
const ClutterEvent *for_event)
|
||||
{
|
||||
ClutterActor *actor;
|
||||
MetaWaylandSurface *surface;
|
||||
|
||||
if (for_event)
|
||||
actor = clutter_event_get_source (for_event);
|
||||
@ -559,10 +583,18 @@ repick_for_event (MetaWaylandPointer *pointer,
|
||||
actor = clutter_input_device_get_pointer_actor (pointer->device);
|
||||
|
||||
if (META_IS_SURFACE_ACTOR_WAYLAND (actor))
|
||||
pointer->current =
|
||||
meta_surface_actor_wayland_get_surface (META_SURFACE_ACTOR_WAYLAND (actor));
|
||||
{
|
||||
MetaSurfaceActorWayland *actor_wayland =
|
||||
META_SURFACE_ACTOR_WAYLAND (actor);
|
||||
|
||||
surface = meta_surface_actor_wayland_get_surface (actor_wayland);
|
||||
}
|
||||
else
|
||||
pointer->current = NULL;
|
||||
{
|
||||
surface = NULL;
|
||||
}
|
||||
|
||||
meta_wayland_pointer_set_current (pointer, surface);
|
||||
|
||||
sync_focus_surface (pointer);
|
||||
meta_wayland_pointer_update_cursor_surface (pointer);
|
||||
@ -815,6 +847,13 @@ meta_wayland_pointer_broadcast_leave (MetaWaylandPointer *pointer,
|
||||
meta_wayland_pointer_broadcast_frame (pointer);
|
||||
}
|
||||
|
||||
static void
|
||||
focus_surface_destroyed (MetaWaylandSurface *surface,
|
||||
MetaWaylandPointer *pointer)
|
||||
{
|
||||
meta_wayland_pointer_set_focus (pointer, NULL);
|
||||
}
|
||||
|
||||
void
|
||||
meta_wayland_pointer_set_focus (MetaWaylandPointer *pointer,
|
||||
MetaWaylandSurface *surface)
|
||||
@ -838,7 +877,9 @@ meta_wayland_pointer_set_focus (MetaWaylandPointer *pointer,
|
||||
pointer->focus_client = NULL;
|
||||
}
|
||||
|
||||
wl_list_remove (&pointer->focus_surface_listener.link);
|
||||
g_signal_handler_disconnect (pointer->focus_surface,
|
||||
pointer->focus_surface_destroyed_handler_id);
|
||||
pointer->focus_surface_destroyed_handler_id = 0;
|
||||
pointer->focus_surface = NULL;
|
||||
}
|
||||
|
||||
@ -848,8 +889,11 @@ meta_wayland_pointer_set_focus (MetaWaylandPointer *pointer,
|
||||
ClutterPoint pos;
|
||||
|
||||
pointer->focus_surface = surface;
|
||||
wl_resource_add_destroy_listener (pointer->focus_surface->resource,
|
||||
&pointer->focus_surface_listener);
|
||||
|
||||
pointer->focus_surface_destroyed_handler_id =
|
||||
g_signal_connect_after (pointer->focus_surface, "destroy",
|
||||
G_CALLBACK (focus_surface_destroyed),
|
||||
pointer);
|
||||
|
||||
clutter_input_device_get_coords (pointer->device, NULL, &pos);
|
||||
|
||||
@ -1118,13 +1162,33 @@ meta_wayland_pointer_create_new_resource (MetaWaylandPointer *pointer,
|
||||
}
|
||||
}
|
||||
|
||||
static gboolean
|
||||
pointer_can_grab_surface (MetaWaylandPointer *pointer,
|
||||
MetaWaylandSurface *surface)
|
||||
{
|
||||
GList *l;
|
||||
|
||||
if (pointer->focus_surface == surface)
|
||||
return TRUE;
|
||||
|
||||
for (l = surface->subsurfaces; l; l = l->next)
|
||||
{
|
||||
MetaWaylandSurface *subsurface = l->data;
|
||||
|
||||
if (pointer_can_grab_surface (pointer, subsurface))
|
||||
return TRUE;
|
||||
}
|
||||
|
||||
return FALSE;
|
||||
}
|
||||
|
||||
gboolean
|
||||
meta_wayland_pointer_can_grab_surface (MetaWaylandPointer *pointer,
|
||||
MetaWaylandSurface *surface,
|
||||
uint32_t serial)
|
||||
{
|
||||
return (pointer->grab_serial == serial &&
|
||||
pointer->focus_surface == surface);
|
||||
pointer_can_grab_surface (pointer, surface));
|
||||
}
|
||||
|
||||
gboolean
|
||||
|
@ -71,7 +71,7 @@ struct _MetaWaylandPointer
|
||||
GHashTable *pointer_clients;
|
||||
|
||||
MetaWaylandSurface *focus_surface;
|
||||
struct wl_listener focus_surface_listener;
|
||||
gulong focus_surface_destroyed_handler_id;
|
||||
guint32 focus_serial;
|
||||
guint32 click_serial;
|
||||
|
||||
@ -87,6 +87,7 @@ struct _MetaWaylandPointer
|
||||
|
||||
ClutterInputDevice *device;
|
||||
MetaWaylandSurface *current;
|
||||
gulong current_surface_destroyed_handler_id;
|
||||
|
||||
guint32 button_count;
|
||||
};
|
||||
|
@ -615,7 +615,7 @@ subsurface_role_get_toplevel (MetaWaylandSurfaceRole *surface_role)
|
||||
meta_wayland_surface_role_get_surface (surface_role);
|
||||
MetaWaylandSurface *parent = surface->sub.parent;
|
||||
|
||||
if (parent->role)
|
||||
if (parent && parent->role)
|
||||
return meta_wayland_surface_role_get_toplevel (parent->role);
|
||||
else
|
||||
return NULL;
|
||||
|
@ -348,6 +348,7 @@ xdg_toplevel_set_maximized (struct wl_client *client,
|
||||
{
|
||||
MetaWaylandSurface *surface = surface_from_xdg_toplevel_resource (resource);
|
||||
|
||||
meta_window_force_placement (surface->window);
|
||||
meta_window_maximize (surface->window, META_MAXIMIZE_BOTH);
|
||||
}
|
||||
|
||||
@ -624,20 +625,18 @@ xdg_toplevel_role_commit (MetaWaylandSurfaceRole *surface_role,
|
||||
if (!window)
|
||||
return;
|
||||
|
||||
if (!pending->has_new_geometry)
|
||||
if (pending->has_new_geometry)
|
||||
{
|
||||
if (pending->dx != 0 || pending->dx != 0)
|
||||
{
|
||||
g_warning ("XXX: Attach-initiated move without a new geometry. This is unimplemented right now.");
|
||||
}
|
||||
return;
|
||||
window_geometry = meta_wayland_xdg_surface_get_window_geometry (xdg_surface);
|
||||
meta_window_wayland_move_resize (window,
|
||||
&xdg_surface_priv->acked_configure_serial,
|
||||
window_geometry,
|
||||
pending->dx, pending->dy);
|
||||
}
|
||||
else if (pending->dx != 0 || pending->dx != 0)
|
||||
{
|
||||
g_warning ("XXX: Attach-initiated move without a new geometry. This is unimplemented right now.");
|
||||
}
|
||||
|
||||
window_geometry = meta_wayland_xdg_surface_get_window_geometry (xdg_surface);
|
||||
meta_window_wayland_move_resize (window,
|
||||
&xdg_surface_priv->acked_configure_serial,
|
||||
window_geometry,
|
||||
pending->dx, pending->dy);
|
||||
|
||||
/* When we get to this point, we ought to have valid size hints */
|
||||
if (pending->has_new_min_size || pending->has_new_max_size)
|
||||
@ -1272,11 +1271,19 @@ xdg_surface_role_commit (MetaWaylandSurfaceRole *surface_role,
|
||||
}
|
||||
else if (!priv->has_set_geometry)
|
||||
{
|
||||
MetaRectangle new_geometry = { 0 };
|
||||
|
||||
/* If the surface has never set any geometry, calculate
|
||||
* a default one unioning the surface and all subsurfaces together. */
|
||||
|
||||
meta_wayland_surface_calculate_window_geometry (surface,
|
||||
&priv->geometry,
|
||||
&new_geometry,
|
||||
0, 0);
|
||||
if (!meta_rectangle_equal (&new_geometry, &priv->geometry))
|
||||
{
|
||||
pending->has_new_geometry = TRUE;
|
||||
priv->geometry = new_geometry;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -829,7 +829,7 @@ meta_x11_source_send (MetaWaylandDataSource *source,
|
||||
/* Takes ownership of fd */
|
||||
selection->x11_selection =
|
||||
x11_selection_data_new (compositor->xwayland_manager.selection_data,
|
||||
fd, mime_type);
|
||||
fd, gdk_x11_get_xatom_name (type_atom));
|
||||
|
||||
XConvertSelection (xdisplay,
|
||||
selection->selection_atom, type_atom,
|
||||
|
@ -1721,6 +1721,7 @@ reload_gtk_hide_titlebar_when_maximized (MetaWindow *window,
|
||||
if (META_WINDOW_MAXIMIZED (window))
|
||||
{
|
||||
meta_window_queue (window, META_QUEUE_MOVE_RESIZE);
|
||||
meta_window_frame_size_changed (window);
|
||||
|
||||
if (window->frame)
|
||||
meta_frame_update_style (window->frame);
|
||||
|
Reference in New Issue
Block a user