aboutsummaryrefslogtreecommitdiff
path: root/xorg-server
diff options
context:
space:
mode:
Diffstat (limited to 'xorg-server')
-rw-r--r--xorg-server/Makefile.am12
-rw-r--r--xorg-server/Xi/xichangehierarchy.c4
-rw-r--r--xorg-server/Xi/xipassivegrab.c2
-rw-r--r--xorg-server/config/Makefile.am24
-rw-r--r--xorg-server/config/config-backends.h35
-rw-r--r--xorg-server/config/config.c25
-rw-r--r--xorg-server/config/dbus-core.c32
-rw-r--r--xorg-server/config/dbus.c407
-rw-r--r--xorg-server/config/hal.c7
-rw-r--r--xorg-server/config/xorg-server.conf13
-rw-r--r--xorg-server/configure.ac66
-rw-r--r--xorg-server/dix/dixfonts.c9
-rw-r--r--xorg-server/dix/protocol.txt11
-rw-r--r--xorg-server/glamor/Makefile.am36
-rw-r--r--xorg-server/glamor/compat-api.h107
-rw-r--r--xorg-server/glamor/glamor.c809
-rw-r--r--xorg-server/glamor/glamor.h259
-rw-r--r--xorg-server/glamor/glamor_addtraps.c34
-rw-r--r--xorg-server/glamor/glamor_compositerects.c458
-rw-r--r--xorg-server/glamor/glamor_copyarea.c1161
-rw-r--r--xorg-server/glamor/glamor_copyplane.c50
-rw-r--r--xorg-server/glamor/glamor_copywindow.c34
-rw-r--r--xorg-server/glamor/glamor_core.c827
-rw-r--r--xorg-server/glamor/glamor_debug.h9
-rw-r--r--xorg-server/glamor/glamor_egl.c1181
-rw-r--r--xorg-server/glamor/glamor_egl_stubs.c64
-rw-r--r--xorg-server/glamor/glamor_eglmodule.c24
-rw-r--r--xorg-server/glamor/glamor_fbo.c849
-rw-r--r--xorg-server/glamor/glamor_fill.c589
-rw-r--r--xorg-server/glamor/glamor_fillspans.c121
-rw-r--r--xorg-server/glamor/glamor_getimage.c97
-rw-r--r--xorg-server/glamor/glamor_getspans.c91
-rw-r--r--xorg-server/glamor/glamor_gl_dispatch.c138
-rw-r--r--xorg-server/glamor/glamor_gl_dispatch.h244
-rw-r--r--xorg-server/glamor/glamor_glext.h1
-rw-r--r--xorg-server/glamor/glamor_glyphblt.c83
-rw-r--r--xorg-server/glamor/glamor_glyphs.c2945
-rw-r--r--xorg-server/glamor/glamor_gradient.c2608
-rw-r--r--xorg-server/glamor/glamor_largepixmap.c2429
-rw-r--r--xorg-server/glamor/glamor_picture.c111
-rw-r--r--xorg-server/glamor/glamor_pixmap.c2245
-rw-r--r--xorg-server/glamor/glamor_polyfillrect.c135
-rw-r--r--xorg-server/glamor/glamor_polylines.c155
-rw-r--r--xorg-server/glamor/glamor_polyops.c43
-rw-r--r--xorg-server/glamor/glamor_priv.h927
-rw-r--r--xorg-server/glamor/glamor_putimage.c559
-rw-r--r--xorg-server/glamor/glamor_render.c3724
-rw-r--r--xorg-server/glamor/glamor_setspans.c119
-rw-r--r--xorg-server/glamor/glamor_tile.c514
-rw-r--r--xorg-server/glamor/glamor_trapezoid.c3230
-rw-r--r--xorg-server/glamor/glamor_triangles.c61
-rw-r--r--xorg-server/glamor/glamor_utils.h1756
-rw-r--r--xorg-server/glamor/glamor_window.c102
-rw-r--r--xorg-server/glamor/glamor_xv.c1022
-rw-r--r--xorg-server/glamor/glapi.h121
-rw-r--r--xorg-server/glx/glxdri2.c2
-rw-r--r--xorg-server/glx/glxdricommon.c2
-rw-r--r--xorg-server/hw/xfree86/common/xf86.h6
-rw-r--r--xorg-server/hw/xfree86/common/xf86Events.c299
-rw-r--r--xorg-server/hw/xfree86/common/xf86Helper.c7
-rw-r--r--xorg-server/hw/xfree86/common/xf86Init.c8
-rw-r--r--xorg-server/hw/xfree86/modes/xf86EdidModes.c5
-rw-r--r--xorg-server/hw/xfree86/vgahw/Makefile.am1
-rw-r--r--xorg-server/include/Makefile.am2
-rw-r--r--xorg-server/include/dbus-core.h (renamed from xorg-server/glamor/compiler.h)63
-rw-r--r--xorg-server/include/dix-config.h.in16
-rw-r--r--xorg-server/pseudoramiX/pseudoramiX.c8
-rw-r--r--xorg-server/test/xi2/protocol-xipassivegrabdevice.c9
-rw-r--r--xorg-server/xkeyboard-config/NEWS3
-rw-r--r--xorg-server/xkeyboard-config/configure.ac2
-rw-r--r--xorg-server/xkeyboard-config/keycodes/xfree864
-rw-r--r--xorg-server/xkeyboard-config/po/bg.po1348
-rw-r--r--xorg-server/xkeyboard-config/po/ca.po1355
-rw-r--r--xorg-server/xkeyboard-config/po/da.po1680
-rw-r--r--xorg-server/xkeyboard-config/po/de.po1384
-rw-r--r--xorg-server/xkeyboard-config/po/eo.po1373
-rw-r--r--xorg-server/xkeyboard-config/po/es.po4825
-rw-r--r--xorg-server/xkeyboard-config/po/fr.po1357
-rw-r--r--xorg-server/xkeyboard-config/po/hu.po1356
-rw-r--r--xorg-server/xkeyboard-config/po/id.po4809
-rw-r--r--xorg-server/xkeyboard-config/po/nl.po1360
-rw-r--r--xorg-server/xkeyboard-config/po/pl.po1352
-rw-r--r--xorg-server/xkeyboard-config/po/pt_BR.po1357
-rw-r--r--xorg-server/xkeyboard-config/po/ru.po1453
-rw-r--r--xorg-server/xkeyboard-config/po/uk.po1356
-rw-r--r--xorg-server/xkeyboard-config/po/xkeyboard-config.pot1336
-rw-r--r--xorg-server/xkeyboard-config/rules/base.extras.xml.in55
-rw-r--r--xorg-server/xkeyboard-config/rules/base.xml.in61
-rw-r--r--xorg-server/xkeyboard-config/symbols/Makefile.am2
-rw-r--r--xorg-server/xkeyboard-config/symbols/af12
-rw-r--r--xorg-server/xkeyboard-config/symbols/ba16
-rw-r--r--xorg-server/xkeyboard-config/symbols/ca11
-rw-r--r--xorg-server/xkeyboard-config/symbols/cm16
-rw-r--r--xorg-server/xkeyboard-config/symbols/de30
-rw-r--r--xorg-server/xkeyboard-config/symbols/dk8
-rw-r--r--xorg-server/xkeyboard-config/symbols/es8
-rw-r--r--xorg-server/xkeyboard-config/symbols/eu63
-rw-r--r--xorg-server/xkeyboard-config/symbols/fi8
-rw-r--r--xorg-server/xkeyboard-config/symbols/fr2
-rw-r--r--xorg-server/xkeyboard-config/symbols/hr17
-rw-r--r--xorg-server/xkeyboard-config/symbols/in42
-rw-r--r--xorg-server/xkeyboard-config/symbols/inet34
-rw-r--r--xorg-server/xkeyboard-config/symbols/ir2
-rw-r--r--xorg-server/xkeyboard-config/symbols/is3
-rw-r--r--xorg-server/xkeyboard-config/symbols/it10
-rw-r--r--xorg-server/xkeyboard-config/symbols/jp4
-rw-r--r--xorg-server/xkeyboard-config/symbols/ma2
-rw-r--r--xorg-server/xkeyboard-config/symbols/nl2
-rw-r--r--xorg-server/xkeyboard-config/symbols/no8
-rw-r--r--xorg-server/xkeyboard-config/symbols/rs33
-rw-r--r--xorg-server/xkeyboard-config/symbols/ru4
-rw-r--r--xorg-server/xkeyboard-config/symbols/se8
-rw-r--r--xorg-server/xkeyboard-config/symbols/si13
-rw-r--r--xorg-server/xkeyboard-config/symbols/tm6
-rw-r--r--xorg-server/xkeyboard-config/symbols/tw12
-rw-r--r--xorg-server/xkeyboard-config/symbols/ua2
-rw-r--r--xorg-server/xkeyboard-config/symbols/us41
117 files changed, 30040 insertions, 29352 deletions
diff --git a/xorg-server/Makefile.am b/xorg-server/Makefile.am
index add69d193..7c93d8d20 100644
--- a/xorg-server/Makefile.am
+++ b/xorg-server/Makefile.am
@@ -27,6 +27,14 @@ if PRESENT
PRESENT_DIR=present
endif
+if PSEUDORAMIX
+PSEUDORAMIX_DIR=pseudoramiX
+endif
+
+if GLAMOR
+GLAMOR_DIR=glamor
+endif
+
SUBDIRS = \
doc \
man \
@@ -37,11 +45,11 @@ SUBDIRS = \
Xext \
miext \
os \
- pseudoramiX \
randr \
render \
Xi \
xkb \
+ $(PSEUDORAMIX_DIR) \
$(DBE_DIR) \
$(RECORD_DIR) \
xfixes \
@@ -51,6 +59,7 @@ SUBDIRS = \
$(PRESENT_DIR) \
$(DRI3_DIR) \
exa \
+ $(GLAMOR_DIR) \
config \
hw \
test
@@ -102,6 +111,7 @@ DIST_SUBDIRS = \
composite \
glx \
exa \
+ $(GLAMOR_DIR) \
config \
dri3 \
present \
diff --git a/xorg-server/Xi/xichangehierarchy.c b/xorg-server/Xi/xichangehierarchy.c
index e2f4b8a0a..9e36354d1 100644
--- a/xorg-server/Xi/xichangehierarchy.c
+++ b/xorg-server/Xi/xichangehierarchy.c
@@ -143,6 +143,10 @@ add_master(ClientPtr client, xXIAddMasterInfo * c, int flags[MAXDEVICES])
int rc;
name = calloc(c->name_len + 1, sizeof(char));
+ if (name == NULL) {
+ rc = BadAlloc;
+ goto unwind;
+ }
strncpy(name, (char *) &c[1], c->name_len);
rc = AllocDevicePair(client, name, &ptr, &keybd,
diff --git a/xorg-server/Xi/xipassivegrab.c b/xorg-server/Xi/xipassivegrab.c
index eccec0ab8..8aba97781 100644
--- a/xorg-server/Xi/xipassivegrab.c
+++ b/xorg-server/Xi/xipassivegrab.c
@@ -63,7 +63,7 @@ SProcXIPassiveGrabDevice(ClientPtr client)
swaps(&stuff->mask_len);
swaps(&stuff->num_modifiers);
- mods = (uint32_t *) &stuff[1];
+ mods = (uint32_t *) &stuff[1] + stuff->mask_len;
for (i = 0; i < stuff->num_modifiers; i++, mods++) {
swapl(mods);
diff --git a/xorg-server/config/Makefile.am b/xorg-server/config/Makefile.am
index 327d07e7c..e0f0a8ddf 100644
--- a/xorg-server/config/Makefile.am
+++ b/xorg-server/config/Makefile.am
@@ -2,12 +2,19 @@ AM_CFLAGS = $(DIX_CFLAGS)
noinst_LTLIBRARIES = libconfig.la
libconfig_la_SOURCES = config.c config-backends.h
+libconfig_la_LIBADD =
+
+if NEED_DBUS
+AM_CFLAGS += $(DBUS_CFLAGS)
+libconfig_la_SOURCES += dbus-core.c
+libconfig_la_LIBADD += $(DBUS_LIBS)
+endif
if CONFIG_UDEV
AM_CFLAGS += $(UDEV_CFLAGS)
libconfig_la_SOURCES += udev.c
-libconfig_la_LIBADD = $(UDEV_LIBS)
+libconfig_la_LIBADD += $(UDEV_LIBS)
if XORG
xorgconfddir = $(datadir)/X11/$(XF86CONFIGDIR)
@@ -16,23 +23,10 @@ endif
else
-if CONFIG_NEED_DBUS
-AM_CFLAGS += $(DBUS_CFLAGS)
-libconfig_la_SOURCES += dbus-core.c
-libconfig_la_LIBADD = $(DBUS_LIBS)
-
-if CONFIG_DBUS_API
-dbusconfigdir = $(sysconfdir)/dbus-1/system.d
-dbusconfig_DATA = xorg-server.conf
-
-libconfig_la_SOURCES += dbus.c
-endif
-
if CONFIG_HAL
AM_CFLAGS += $(HAL_CFLAGS)
libconfig_la_SOURCES += hal.c
libconfig_la_LIBADD += $(HAL_LIBS)
-endif
else
@@ -40,7 +34,7 @@ if CONFIG_WSCONS
libconfig_la_SOURCES += wscons.c
endif # CONFIG_WSCONS
-endif # CONFIG_NEED_DBUS
+endif # !CONFIG_HAL
endif # !CONFIG_UDEV
diff --git a/xorg-server/config/config-backends.h b/xorg-server/config/config-backends.h
index 6423701fc..5f07557b7 100644
--- a/xorg-server/config/config-backends.h
+++ b/xorg-server/config/config-backends.h
@@ -37,41 +37,10 @@ int config_udev_pre_init(void);
int config_udev_init(void);
void config_udev_fini(void);
void config_udev_odev_probe(config_odev_probe_proc_ptr probe_callback);
-#else
-
-#ifdef CONFIG_NEED_DBUS
-#include <dbus/dbus.h>
-
-typedef void (*config_dbus_core_connect_hook) (DBusConnection * connection,
- void *data);
-typedef void (*config_dbus_core_disconnect_hook) (void *data);
-
-struct config_dbus_core_hook {
- config_dbus_core_connect_hook connect;
- config_dbus_core_disconnect_hook disconnect;
- void *data;
-
- struct config_dbus_core_hook *next;
-};
-
-int config_dbus_core_init(void);
-void config_dbus_core_fini(void);
-int config_dbus_core_add_hook(struct config_dbus_core_hook *hook);
-void config_dbus_core_remove_hook(struct config_dbus_core_hook *hook);
-#endif
-
-#ifdef CONFIG_DBUS_API
-int config_dbus_init(void);
-void config_dbus_fini(void);
-#endif
-
-#ifdef CONFIG_HAL
+#elif defined(CONFIG_HAL)
int config_hal_init(void);
void config_hal_fini(void);
-#endif
-#endif
-
-#ifdef CONFIG_WSCONS
+#elif defined(CONFIG_WSCONS)
int config_wscons_init(void);
void config_wscons_fini(void);
#endif
diff --git a/xorg-server/config/config.c b/xorg-server/config/config.c
index d0889a394..760cf193a 100644
--- a/xorg-server/config/config.c
+++ b/xorg-server/config/config.c
@@ -47,20 +47,9 @@ config_init(void)
#ifdef CONFIG_UDEV
if (!config_udev_init())
ErrorF("[config] failed to initialise udev\n");
-#elif defined(CONFIG_NEED_DBUS)
- if (config_dbus_core_init()) {
-#ifdef CONFIG_DBUS_API
- if (!config_dbus_init())
- ErrorF("[config] failed to initialise D-Bus API\n");
-#endif
-#ifdef CONFIG_HAL
- if (!config_hal_init())
- ErrorF("[config] failed to initialise HAL\n");
-#endif
- }
- else {
- ErrorF("[config] failed to initialise D-Bus core\n");
- }
+#elif defined(CONFIG_HAL)
+ if (!config_hal_init())
+ ErrorF("[config] failed to initialise HAL\n");
#elif defined(CONFIG_WSCONS)
if (!config_wscons_init())
ErrorF("[config] failed to initialise wscons\n");
@@ -72,14 +61,8 @@ config_fini(void)
{
#if defined(CONFIG_UDEV)
config_udev_fini();
-#elif defined(CONFIG_NEED_DBUS)
-#ifdef CONFIG_HAL
+#elif defined(CONFIG_HAL)
config_hal_fini();
-#endif
-#ifdef CONFIG_DBUS_API
- config_dbus_fini();
-#endif
- config_dbus_core_fini();
#elif defined(CONFIG_WSCONS)
config_wscons_fini();
#endif
diff --git a/xorg-server/config/dbus-core.c b/xorg-server/config/dbus-core.c
index 768a98454..b0fd92de4 100644
--- a/xorg-server/config/dbus-core.c
+++ b/xorg-server/config/dbus-core.c
@@ -30,9 +30,9 @@
#include <dbus/dbus.h>
#include <sys/select.h>
-#include "config-backends.h"
#include "dix.h"
#include "os.h"
+#include "dbus-core.h"
/* How often to attempt reconnecting when we get booted off the bus. */
#define RECONNECT_DELAY (10 * 1000) /* in ms */
@@ -41,7 +41,7 @@ struct dbus_core_info {
int fd;
DBusConnection *connection;
OsTimerPtr timer;
- struct config_dbus_core_hook *hooks;
+ struct dbus_core_hook *hooks;
};
static struct dbus_core_info bus_info;
@@ -74,7 +74,7 @@ block_handler(void *data, struct timeval **tv, void *read_mask)
static void
teardown(void)
{
- struct config_dbus_core_hook *hook;
+ struct dbus_core_hook *hook;
if (bus_info.timer) {
TimerFree(bus_info.timer);
@@ -112,7 +112,7 @@ message_filter(DBusConnection * connection, DBusMessage * message, void *data)
* reconnect immediately (assuming it's just a restart). The
* connection isn't valid at this point, so throw it out immediately. */
if (dbus_message_is_signal(message, DBUS_INTERFACE_LOCAL, "Disconnected")) {
- DebugF("[config/dbus-core] disconnected from bus\n");
+ DebugF("[dbus-core] disconnected from bus\n");
bus_info.connection = NULL;
teardown();
@@ -136,12 +136,12 @@ static int
connect_to_bus(void)
{
DBusError error;
- struct config_dbus_core_hook *hook;
+ struct dbus_core_hook *hook;
dbus_error_init(&error);
bus_info.connection = dbus_bus_get(DBUS_BUS_SYSTEM, &error);
if (!bus_info.connection || dbus_error_is_set(&error)) {
- DebugF("[config/dbus-core] error connecting to system bus: %s (%s)\n",
+ LogMessage(X_ERROR, "dbus-core: error connecting to system bus: %s (%s)\n",
error.name, error.message);
goto err_begin;
}
@@ -150,13 +150,13 @@ connect_to_bus(void)
dbus_connection_set_exit_on_disconnect(bus_info.connection, FALSE);
if (!dbus_connection_get_unix_fd(bus_info.connection, &bus_info.fd)) {
- ErrorF("[config/dbus-core] couldn't get fd for system bus\n");
+ ErrorF("[dbus-core] couldn't get fd for system bus\n");
goto err_unref;
}
if (!dbus_connection_add_filter(bus_info.connection, message_filter,
&bus_info, NULL)) {
- ErrorF("[config/dbus-core] couldn't add filter: %s (%s)\n", error.name,
+ ErrorF("[dbus-core] couldn't add filter: %s (%s)\n", error.name,
error.message);
goto err_fd;
}
@@ -198,9 +198,9 @@ reconnect_timer(OsTimerPtr timer, CARD32 time, void *arg)
}
int
-config_dbus_core_add_hook(struct config_dbus_core_hook *hook)
+dbus_core_add_hook(struct dbus_core_hook *hook)
{
- struct config_dbus_core_hook **prev;
+ struct dbus_core_hook **prev;
for (prev = &bus_info.hooks; *prev; prev = &(*prev)->next);
@@ -215,9 +215,9 @@ config_dbus_core_add_hook(struct config_dbus_core_hook *hook)
}
void
-config_dbus_core_remove_hook(struct config_dbus_core_hook *hook)
+dbus_core_remove_hook(struct dbus_core_hook *hook)
{
- struct config_dbus_core_hook **prev;
+ struct dbus_core_hook **prev;
for (prev = &bus_info.hooks; *prev; prev = &(*prev)->next) {
if (*prev == hook) {
@@ -228,19 +228,19 @@ config_dbus_core_remove_hook(struct config_dbus_core_hook *hook)
}
int
-config_dbus_core_init(void)
+dbus_core_init(void)
{
memset(&bus_info, 0, sizeof(bus_info));
bus_info.fd = -1;
bus_info.hooks = NULL;
- bus_info.connection = NULL;
- bus_info.timer = TimerSet(NULL, 0, 1, reconnect_timer, NULL);
+ if (!connect_to_bus())
+ bus_info.timer = TimerSet(NULL, 0, 1, reconnect_timer, NULL);
return 1;
}
void
-config_dbus_core_fini(void)
+dbus_core_fini(void)
{
teardown();
}
diff --git a/xorg-server/config/dbus.c b/xorg-server/config/dbus.c
deleted file mode 100644
index 99a1537e1..000000000
--- a/xorg-server/config/dbus.c
+++ /dev/null
@@ -1,407 +0,0 @@
-/*
- * Copyright © 2006-2007 Daniel Stone
- *
- * Permission is hereby granted, free of charge, to any person obtaining a
- * copy of this software and associated documentation files (the "Software"),
- * to deal in the Software without restriction, including without limitation
- * the rights to use, copy, modify, merge, publish, distribute, sublicense,
- * and/or sell copies of the Software, and to permit persons to whom the
- * Software is furnished to do so, subject to the following conditions:
- *
- * The above copyright notice and this permission notice (including the next
- * paragraph) shall be included in all copies or substantial portions of the
- * Software.
- *
- * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
- * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
- * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
- * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
- * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
- * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
- * DEALINGS IN THE SOFTWARE.
- *
- * Author: Daniel Stone <daniel@fooishbar.org>
- */
-
-#ifdef HAVE_DIX_CONFIG_H
-#include <dix-config.h>
-#endif
-
-#include <dbus/dbus.h>
-#include <string.h>
-
-#include <X11/X.h>
-
-#include "config-backends.h"
-#include "opaque.h" /* for 'display': there should be a better way. */
-#include "input.h"
-#include "inputstr.h"
-
-#define API_VERSION 2
-
-#define MATCH_RULE "type='method_call',interface='org.x.config.input'"
-
-#define MALFORMED_MSG "[config/dbus] malformed message, dropping"
-#define MALFORMED_MESSAGE() { DebugF(MALFORMED_MSG "\n"); \
- ret = BadValue; \
- goto unwind; }
-#define MALFORMED_MESSAGE_ERROR() { DebugF(MALFORMED_MSG ": %s, %s", \
- error->name, error->message); \
- ret = BadValue; \
- goto unwind; }
-
-struct connection_info {
- char busobject[32];
- char busname[64];
- DBusConnection *connection;
-};
-
-static void
-reset_info(struct connection_info *info)
-{
- info->connection = NULL;
- info->busname[0] = '\0';
- info->busobject[0] = '\0';
-}
-
-static int
-add_device(DBusMessage * message, DBusMessage * reply, DBusError * error)
-{
- DBusMessageIter iter, reply_iter, subiter;
- InputOption *input_options = NULL;
- int ret, err;
- DeviceIntPtr dev = NULL;
-
- dbus_message_iter_init_append(reply, &reply_iter);
-
- if (!dbus_message_iter_init(message, &iter)) {
- ErrorF("[config/dbus] couldn't initialise iterator\n");
- MALFORMED_MESSAGE();
- }
-
- input_options = input_option_new(input_options, "_source", "client/dbus");
- if (!input_options) {
- ErrorF("[config/dbus] couldn't allocate first key/value pair\n");
- ret = BadAlloc;
- goto unwind;
- }
-
- /* signature should be [ss][ss]... */
- while (dbus_message_iter_get_arg_type(&iter) == DBUS_TYPE_ARRAY) {
- char *key, *value;
-
- dbus_message_iter_recurse(&iter, &subiter);
-
- if (dbus_message_iter_get_arg_type(&subiter) != DBUS_TYPE_STRING)
- MALFORMED_MESSAGE();
-
- dbus_message_iter_get_basic(&subiter, &key);
- if (!key)
- MALFORMED_MESSAGE();
- /* The _ prefix refers to internal settings, and may not be given by
- * the client. */
- if (key[0] == '_') {
- ErrorF("[config/dbus] attempted subterfuge: option name %s given\n",
- key);
- MALFORMED_MESSAGE();
- }
-
- if (!dbus_message_iter_has_next(&subiter))
- MALFORMED_MESSAGE();
- dbus_message_iter_next(&subiter);
- if (dbus_message_iter_get_arg_type(&subiter) != DBUS_TYPE_STRING)
- MALFORMED_MESSAGE();
-
- dbus_message_iter_get_basic(&subiter, &value);
- if (!value)
- MALFORMED_MESSAGE();
-
- input_options = input_option_new(input_options, key, value);
-
- dbus_message_iter_next(&iter);
- }
-
- ret = NewInputDeviceRequest(input_options, NULL, &dev);
- if (ret != Success) {
- DebugF("[config/dbus] NewInputDeviceRequest failed\n");
- goto unwind;
- }
-
- if (!dev) {
- DebugF("[config/dbus] NewInputDeviceRequest provided no device\n");
- ret = BadImplementation;
- goto unwind;
- }
-
- /* XXX: If we fail halfway through, we don't seem to have any way to
- * empty the iterator, so you'll end up with some device IDs,
- * plus an error. This seems to be a shortcoming in the D-Bus
- * API. */
- for (; dev; dev = dev->next) {
- if (!dbus_message_iter_append_basic(&reply_iter, DBUS_TYPE_INT32,
- &dev->id)) {
- ErrorF("[config/dbus] couldn't append to iterator\n");
- ret = BadAlloc;
- goto unwind;
- }
- }
-
- unwind:
- if (ret != Success) {
- if (dev)
- RemoveDevice(dev, TRUE);
-
- err = -ret;
- dbus_message_iter_append_basic(&reply_iter, DBUS_TYPE_INT32, &err);
- }
-
- input_option_free_list(&input_options);
-
- return ret;
-}
-
-static int
-remove_device(DBusMessage * message, DBusMessage * reply, DBusError * error)
-{
- int deviceid, ret, err;
- DeviceIntPtr dev;
- DBusMessageIter iter, reply_iter;
-
- dbus_message_iter_init_append(reply, &reply_iter);
-
- if (!dbus_message_iter_init(message, &iter)) {
- ErrorF("[config/dbus] failed to init iterator\n");
- MALFORMED_MESSAGE();
- }
-
- if (!dbus_message_get_args(message, error, DBUS_TYPE_UINT32,
- &deviceid, DBUS_TYPE_INVALID)) {
- MALFORMED_MESSAGE_ERROR();
- }
-
- dixLookupDevice(&dev, deviceid, serverClient, DixDestroyAccess);
- if (!dev) {
- DebugF("[config/dbus] bogus device id %d given\n", deviceid);
- ret = BadMatch;
- goto unwind;
- }
-
- DebugF("[config/dbus] removing device %s (id %d)\n", dev->name, deviceid);
-
- /* Call PIE here so we don't try to dereference a device that's
- * already been removed. */
- OsBlockSignals();
- ProcessInputEvents();
- DeleteInputDeviceRequest(dev);
- OsReleaseSignals();
-
- ret = Success;
-
- unwind:
- err = (ret == Success) ? ret : -ret;
- dbus_message_iter_append_basic(&reply_iter, DBUS_TYPE_INT32, &err);
-
- return ret;
-}
-
-static int
-list_devices(DBusMessage * message, DBusMessage * reply, DBusError * error)
-{
- DeviceIntPtr dev;
- DBusMessageIter iter, subiter;
-
- dbus_message_iter_init_append(reply, &iter);
-
- for (dev = inputInfo.devices; dev; dev = dev->next) {
- if (!dbus_message_iter_open_container(&iter, DBUS_TYPE_STRUCT, NULL,
- &subiter)) {
- ErrorF("[config/dbus] couldn't init container\n");
- return BadAlloc;
- }
- if (!dbus_message_iter_append_basic(&subiter, DBUS_TYPE_UINT32,
- &dev->id)) {
- ErrorF("[config/dbus] couldn't append to iterator\n");
- return BadAlloc;
- }
- if (!dbus_message_iter_append_basic(&subiter, DBUS_TYPE_STRING,
- &dev->name)) {
- ErrorF("[config/dbus] couldn't append to iterator\n");
- return BadAlloc;
- }
- if (!dbus_message_iter_close_container(&iter, &subiter)) {
- ErrorF("[config/dbus] couldn't close container\n");
- return BadAlloc;
- }
- }
-
- return Success;
-}
-
-static int
-get_version(DBusMessage * message, DBusMessage * reply, DBusError * error)
-{
- DBusMessageIter iter;
- unsigned int version = API_VERSION;
-
- dbus_message_iter_init_append(reply, &iter);
- if (!dbus_message_iter_append_basic(&iter, DBUS_TYPE_UINT32, &version)) {
- ErrorF("[config/dbus] couldn't append version\n");
- return BadAlloc;
- }
-
- return Success;
-}
-
-static DBusHandlerResult
-message_handler(DBusConnection * connection, DBusMessage * message, void *data)
-{
- DBusError error;
- DBusMessage *reply;
- struct connection_info *info = data;
-
- /* ret is the overall D-Bus handler result, whereas err is the internal
- * X error from our individual functions. */
- int ret = DBUS_HANDLER_RESULT_NOT_YET_HANDLED;
- int err;
-
- DebugF("[config/dbus] received a message for %s\n",
- dbus_message_get_interface(message));
-
- dbus_error_init(&error);
-
- reply = dbus_message_new_method_return(message);
- if (!reply) {
- ErrorF("[config/dbus] failed to create reply\n");
- ret = DBUS_HANDLER_RESULT_NEED_MEMORY;
- goto err_start;
- }
-
- if (strcmp(dbus_message_get_member(message), "add") == 0)
- err = add_device(message, reply, &error);
- else if (strcmp(dbus_message_get_member(message), "remove") == 0)
- err = remove_device(message, reply, &error);
- else if (strcmp(dbus_message_get_member(message), "listDevices") == 0)
- err = list_devices(message, reply, &error);
- else if (strcmp(dbus_message_get_member(message), "version") == 0)
- err = get_version(message, reply, &error);
- else
- goto err_reply;
-
- /* Failure to allocate is a special case. */
- if (err == BadAlloc) {
- ret = DBUS_HANDLER_RESULT_NEED_MEMORY;
- goto err_reply;
- }
-
- /* While failure here is always an OOM, we don't return that,
- * since that would result in devices being double-added/removed. */
- if (dbus_connection_send(info->connection, reply, NULL))
- dbus_connection_flush(info->connection);
- else
- ErrorF("[config/dbus] failed to send reply\n");
-
- ret = DBUS_HANDLER_RESULT_HANDLED;
-
- err_reply:
- dbus_message_unref(reply);
- err_start:
- dbus_error_free(&error);
-
- return ret;
-}
-
-static void
-connect_hook(DBusConnection * connection, void *data)
-{
- DBusError error;
- DBusObjectPathVTable vtable = {.message_function = message_handler, };
- struct connection_info *info = data;
-
- info->connection = connection;
-
- dbus_error_init(&error);
-
- dbus_bus_request_name(info->connection, info->busname, 0, &error);
- if (dbus_error_is_set(&error)) {
- ErrorF("[config/dbus] couldn't take over org.x.config: %s (%s)\n",
- error.name, error.message);
- goto err_start;
- }
-
- /* blocks until we get a reply. */
- dbus_bus_add_match(info->connection, MATCH_RULE, &error);
- if (dbus_error_is_set(&error)) {
- ErrorF("[config/dbus] couldn't add match: %s (%s)\n", error.name,
- error.message);
- goto err_name;
- }
-
- if (!dbus_connection_register_object_path(info->connection,
- info->busobject, &vtable, info)) {
- ErrorF("[config/dbus] couldn't register object path\n");
- goto err_match;
- }
-
- DebugF("[dbus] registered %s, %s\n", info->busname, info->busobject);
-
- dbus_error_free(&error);
-
- return;
-
- err_match:
- dbus_bus_remove_match(info->connection, MATCH_RULE, &error);
- err_name:
- dbus_bus_release_name(info->connection, info->busname, &error);
- err_start:
- dbus_error_free(&error);
-
- reset_info(info);
-}
-
-static void
-disconnect_hook(void *data)
-{
-}
-
-#if 0
-void
-pre_disconnect_hook(void)
-{
- DBusError error;
-
- dbus_error_init(&error);
- dbus_connection_unregister_object_path(connection_data->connection,
- connection_data->busobject);
- dbus_bus_remove_match(connection_data->connection, MATCH_RULE, &error);
- dbus_bus_release_name(connection_data->connection,
- connection_data->busname, &error);
- dbus_error_free(&error);
-}
-#endif
-
-static struct connection_info connection_data;
-
-static struct config_dbus_core_hook core_hook = {
- .connect = connect_hook,
- .disconnect = disconnect_hook,
- .data = &connection_data,
-};
-
-int
-config_dbus_init(void)
-{
- snprintf(connection_data.busname, sizeof(connection_data.busname),
- "org.x.config.display%d", atoi(display));
- snprintf(connection_data.busobject, sizeof(connection_data.busobject),
- "/org/x/config/%d", atoi(display));
-
- return config_dbus_core_add_hook(&core_hook);
-}
-
-void
-config_dbus_fini(void)
-{
- config_dbus_core_remove_hook(&core_hook);
- connection_data.busname[0] = '\0';
- connection_data.busobject[0] = '\0';
-}
diff --git a/xorg-server/config/hal.c b/xorg-server/config/hal.c
index 2ead556b0..94cb6e7cd 100644
--- a/xorg-server/config/hal.c
+++ b/xorg-server/config/hal.c
@@ -33,6 +33,7 @@
#include <string.h>
#include <sys/select.h>
+#include "dbus-core.h"
#include "input.h"
#include "inputstr.h"
#include "hotplug.h"
@@ -631,7 +632,7 @@ connect_hook(DBusConnection * connection, void *data)
static struct config_hal_info hal_info;
-static struct config_dbus_core_hook hook = {
+static struct dbus_core_hook hook = {
.connect = connect_hook,
.disconnect = disconnect_hook,
.data = &hal_info,
@@ -644,7 +645,7 @@ config_hal_init(void)
hal_info.system_bus = NULL;
hal_info.hal_ctx = NULL;
- if (!config_dbus_core_add_hook(&hook)) {
+ if (!dbus_core_add_hook(&hook)) {
LogMessage(X_ERROR, "config/hal: failed to add D-Bus hook\n");
return 0;
}
@@ -658,5 +659,5 @@ config_hal_init(void)
void
config_hal_fini(void)
{
- config_dbus_core_remove_hook(&hook);
+ dbus_core_remove_hook(&hook);
}
diff --git a/xorg-server/config/xorg-server.conf b/xorg-server/config/xorg-server.conf
deleted file mode 100644
index 47a9a7824..000000000
--- a/xorg-server/config/xorg-server.conf
+++ /dev/null
@@ -1,13 +0,0 @@
-<!DOCTYPE busconfig PUBLIC
- "-//freedesktop//DTD D-BUS Bus Configuration 1.0//EN"
- "http://www.freedesktop.org/standards/dbus/1.0/busconfig.dtd">
-<busconfig>
- <policy context="default">
- <allow own="org.x.config.display0"/>
- <allow send_destination="org.x.config.display0"/>
- <allow send_interface="org.x.config.display0"/>
- <allow own="org.x.config.display1"/>
- <allow send_destination="org.x.config.display1"/>
- <allow send_interface="org.x.config.display1"/>
- </policy>
-</busconfig>
diff --git a/xorg-server/configure.ac b/xorg-server/configure.ac
index 560c46030..c6764f5a8 100644
--- a/xorg-server/configure.ac
+++ b/xorg-server/configure.ac
@@ -614,7 +614,6 @@ AC_ARG_ENABLE(xf86bigfont, AS_HELP_STRING([--enable-xf86bigfont], [Build XF86
AC_ARG_ENABLE(dpms, AS_HELP_STRING([--disable-dpms], [Build DPMS extension (default: enabled)]), [DPMSExtension=$enableval], [DPMSExtension=yes])
AC_ARG_ENABLE(config-udev, AS_HELP_STRING([--enable-config-udev], [Build udev support (default: auto)]), [CONFIG_UDEV=$enableval], [CONFIG_UDEV=auto])
AC_ARG_ENABLE(config-udev-kms, AS_HELP_STRING([--enable-config-udev-kms], [Build udev kms support (default: auto)]), [CONFIG_UDEV_KMS=$enableval], [CONFIG_UDEV_KMS=auto])
-AC_ARG_ENABLE(config-dbus, AS_HELP_STRING([--enable-config-dbus], [Build D-BUS API support (default: no)]), [CONFIG_DBUS_API=$enableval], [CONFIG_DBUS_API=no])
AC_ARG_ENABLE(config-hal, AS_HELP_STRING([--disable-config-hal], [Build HAL support (default: auto)]), [CONFIG_HAL=$enableval], [CONFIG_HAL=auto])
AC_ARG_ENABLE(config-wscons, AS_HELP_STRING([--enable-config-wscons], [Build wscons config support (default: auto)]), [CONFIG_WSCONS=$enableval], [CONFIG_WSCONS=auto])
AC_ARG_ENABLE(xfree86-utils, AS_HELP_STRING([--enable-xfree86-utils], [Build xfree86 DDX utilities (default: enabled)]), [XF86UTILS=$enableval], [XF86UTILS=yes])
@@ -636,6 +635,7 @@ AC_ARG_ENABLE(xnest, AS_HELP_STRING([--enable-xnest], [Build Xnest serv
AC_ARG_ENABLE(xquartz, AS_HELP_STRING([--enable-xquartz], [Build Xquartz server for OS-X (default: auto)]), [XQUARTZ=$enableval], [XQUARTZ=auto])
AC_ARG_ENABLE(standalone-xpbproxy, AS_HELP_STRING([--enable-standalone-xpbproxy], [Build a standalone xpbproxy (in addition to the one integrated into Xquartz as a separate thread) (default: no)]), [STANDALONE_XPBPROXY=$enableval], [STANDALONE_XPBPROXY=no])
AC_ARG_ENABLE(xwin, AS_HELP_STRING([--enable-xwin], [Build XWin server (default: auto)]), [XWIN=$enableval], [XWIN=auto])
+AC_ARG_ENABLE(glamor, AS_HELP_STRING([--enable-glamor], [Build glamor dix module (default: no)]), [GLAMOR=$enableval], [GLAMOR=no])
dnl kdrive and its subsystems
AC_ARG_ENABLE(kdrive, AS_HELP_STRING([--enable-kdrive], [Build kdrive servers (default: no)]), [KDRIVE=$enableval], [KDRIVE=no])
AC_ARG_ENABLE(xephyr, AS_HELP_STRING([--enable-xephyr], [Build the kdrive Xephyr server (default: auto)]), [XEPHYR=$enableval], [XEPHYR=auto])
@@ -702,7 +702,6 @@ dnl DDX Detection... Yes, it's ugly to have it here... but we need to
dnl handle this early on so that we don't require unsupported extensions
case $host_os in
cygwin* | mingw*)
- CONFIG_DBUS_API=no
CONFIG_HAL=no
CONFIG_UDEV=no
CONFIG_UDEV_KMS=no
@@ -799,7 +798,7 @@ FIXESPROTO="fixesproto >= 5.0"
DAMAGEPROTO="damageproto >= 1.1"
XCMISCPROTO="xcmiscproto >= 1.2.0"
BIGREQSPROTO="bigreqsproto >= 1.1.0"
-XTRANS="xtrans >= 1.3.2"
+XTRANS="xtrans >= 1.3.3"
PRESENTPROTO="presentproto >= 1.0"
dnl List of libraries that require a specific version
@@ -830,9 +829,28 @@ AC_SUBST(SDK_REQUIRED_MODULES)
REQUIRED_MODULES="$FIXESPROTO $DAMAGEPROTO $XCMISCPROTO $XTRANS $BIGREQSPROTO $SDK_REQUIRED_MODULES"
-if test "x$CONFIG_UDEV" = xyes &&
- { test "x$CONFIG_DBUS_API" = xyes || test "x$CONFIG_HAL" = xyes; }; then
- AC_MSG_ERROR([Hotplugging through both libudev and dbus/hal not allowed])
+dnl systemd socket activation
+dnl activate the code in libxtrans that grabs systemd's socket fds
+AC_ARG_WITH([systemd-daemon],
+ AS_HELP_STRING([--with-systemd-daemon],
+ [support systemd socket activation (default: auto)]),
+ [WITH_SYSTEMD_DAEMON=$withval], [WITH_SYSTEMD_DAEMON=auto])
+PKG_CHECK_MODULES([SYSTEMD_DAEMON], [libsystemd-daemon],
+ [HAVE_SYSTEMD_DAEMON=yes], [HAVE_SYSTEMD_DAEMON=no])
+if test "x$WITH_SYSTEMD_DAEMON" = xauto; then
+ WITH_SYSTEMD_DAEMON="$HAVE_SYSTEMD_DAEMON"
+fi
+if test "x$WITH_SYSTEMD_DAEMON" = xyes; then
+ if "x$HAVE_SYSTEMD_DAEMON" = xno; then
+ AC_MSG_ERROR([systemd support requested but no library has been found])
+ fi
+ AC_DEFINE(HAVE_SYSTEMD_DAEMON, 1, [Define to 1 if libsystemd-daemon is available])
+ REQUIRED_LIBS="$REQUIRED_LIBS libsystemd-daemon"
+fi
+AM_CONDITIONAL([HAVE_SYSTEMD_DAEMON], [test "x$HAVE_SYSTEMD_DAEMON" = "xyes"])
+
+if test "x$CONFIG_UDEV" = xyes && test "x$CONFIG_HAL" = xyes; then
+ AC_MSG_ERROR([Hotplugging through both libudev and hal not allowed])
fi
PKG_CHECK_MODULES(UDEV, $LIBUDEV, [HAVE_LIBUDEV=yes], [HAVE_LIBUDEV=no])
@@ -841,7 +859,6 @@ if test "x$CONFIG_UDEV" = xauto; then
fi
AM_CONDITIONAL(CONFIG_UDEV, [test "x$CONFIG_UDEV" = xyes])
if test "x$CONFIG_UDEV" = xyes; then
- CONFIG_DBUS_API=no
CONFIG_HAL=no
if test "x$CONFIG_UDEV_KMS" = xauto; then
CONFIG_UDEV_KMS="$HAVE_LIBUDEV"
@@ -864,28 +881,12 @@ if test "x$CONFIG_UDEV" = xyes; then
fi
AM_CONDITIONAL(CONFIG_UDEV_KMS, [test "x$CONFIG_UDEV_KMS" = xyes])
-dnl HAVE_DBUS is true if we actually have the D-Bus library, whereas
-dnl CONFIG_DBUS_API is true if we want to enable the D-Bus config
-dnl API.
PKG_CHECK_MODULES(DBUS, $LIBDBUS, [HAVE_DBUS=yes], [HAVE_DBUS=no])
if test "x$HAVE_DBUS" = xyes; then
AC_DEFINE(HAVE_DBUS, 1, [Have D-Bus support])
fi
AM_CONDITIONAL(HAVE_DBUS, [test "x$HAVE_DBUS" = xyes])
-if test "x$CONFIG_DBUS_API" = xauto; then
- CONFIG_DBUS_API="$HAVE_DBUS"
-fi
-if test "x$CONFIG_DBUS_API" = xyes; then
- if ! test "x$HAVE_DBUS" = xyes; then
- AC_MSG_ERROR([D-Bus configuration API requested, but D-Bus is not installed.])
- fi
-
- AC_DEFINE(CONFIG_DBUS_API, 1, [Use the D-Bus input configuration API])
- CONFIG_NEED_DBUS="yes"
-fi
-AM_CONDITIONAL(CONFIG_DBUS_API, [test "x$CONFIG_DBUS_API" = xyes])
-
PKG_CHECK_MODULES(HAL, hal, [HAVE_HAL=yes], [HAVE_HAL=no])
if test "x$CONFIG_HAL" = xauto; then
CONFIG_HAL="$HAVE_HAL"
@@ -896,14 +897,14 @@ if test "x$CONFIG_HAL" = xyes; then
fi
AC_DEFINE(CONFIG_HAL, 1, [Use the HAL hotplug API])
- CONFIG_NEED_DBUS="yes"
+ NEED_DBUS="yes"
fi
AM_CONDITIONAL(CONFIG_HAL, [test "x$CONFIG_HAL" = xyes])
-if test "x$CONFIG_NEED_DBUS" = xyes; then
- AC_DEFINE(CONFIG_NEED_DBUS, 1, [Use D-Bus for input hotplug])
+if test "x$NEED_DBUS" = xyes; then
+ AC_DEFINE(NEED_DBUS, 1, [Enable D-Bus core])
fi
-AM_CONDITIONAL(CONFIG_NEED_DBUS, [test "x$CONFIG_NEED_DBUS" = xyes])
+AM_CONDITIONAL(NEED_DBUS, [test "x$NEED_DBUS" = xyes])
if test "x$CONFIG_WSCONS" = xauto; then
case $host_os in
@@ -2063,6 +2064,14 @@ AM_CONDITIONAL([SOLARIS_VT], [test "x$solaris_vt" = xyes])
AM_CONDITIONAL([DGA], [test "x$DGA" = xyes])
AM_CONDITIONAL([XF86VIDMODE], [test "x$XF86VIDMODE" = xyes])
AM_CONDITIONAL([XORG_BUS_PLATFORM], [test "x$CONFIG_UDEV_KMS" = xyes])
+
+dnl glamor
+AM_CONDITIONAL([GLAMOR], [test "x$GLAMOR" = xyes])
+if test "x$GLAMOR" = xyes; then
+ AC_DEFINE(GLAMOR, 1, [Build glamor])
+ PKG_CHECK_MODULES([GLAMOR], [egl gl])
+fi
+
dnl XWin DDX
AC_MSG_CHECKING([whether to build XWin DDX])
@@ -2174,6 +2183,8 @@ if test "x$XQUARTZ" = xyes; then
fi
fi
+AM_CONDITIONAL(PSEUDORAMIX, [test "x$XQUARTZ" = xyes -o "x$XWIN" = xyes ])
+
# Support for objc in autotools is minimal and not documented.
OBJC='$(CC)'
OBJCLD='$(CCLD)'
@@ -2432,6 +2443,7 @@ doc/Makefile
doc/dtrace/Makefile
man/Makefile
fb/Makefile
+glamor/Makefile
record/Makefile
config/Makefile
mi/Makefile
diff --git a/xorg-server/dix/dixfonts.c b/xorg-server/dix/dixfonts.c
index 341ca3f95..83d2539c7 100644
--- a/xorg-server/dix/dixfonts.c
+++ b/xorg-server/dix/dixfonts.c
@@ -1792,11 +1792,14 @@ GetFontPath(ClientPtr client, int *count, int *length, unsigned char **result)
fpe = font_path_elements[i];
len += fpe->name_length + 1;
}
- font_path_string = (unsigned char *) realloc(font_path_string, len);
- if (!font_path_string)
+ c = realloc(font_path_string, len);
+ if (c == NULL) {
+ free(font_path_string);
+ font_path_string = NULL;
return BadAlloc;
+ }
- c = font_path_string;
+ font_path_string = c;
*length = 0;
for (i = 0; i < num_fpes; i++) {
fpe = font_path_elements[i];
diff --git a/xorg-server/dix/protocol.txt b/xorg-server/dix/protocol.txt
index 8e152edaa..f83f38c58 100644
--- a/xorg-server/dix/protocol.txt
+++ b/xorg-server/dix/protocol.txt
@@ -311,11 +311,22 @@ R028 RANDR:GetPanning
R029 RANDR:SetPanning
R030 RANDR:SetOutputPrimary
R031 RANDR:GetOutputPrimary
+R032 RANDR:RRGetProviders
+R033 RANDR:RRGetProviderInfo
+R034 RANDR:RRSetProviderOffloadSink
+R035 RANDR:RRSetProviderOutputSource
+R036 RANDR:RRListProviderProperties
+R037 RANDR:RRQueryProviderProperty
+R038 RANDR:RRConfigureProviderProperty
+R039 RANDR:RRChangeProviderProperty
+R040 RANDR:RRDeleteProviderProperty
+R041 RANDR:RRGetProviderProperty
V000 RANDR:ScreenChangeNotify
V001 RANDR:Notify
E000 RANDR:BadRROutput
E001 RANDR:BadRRCrtc
E002 RANDR:BadRRMode
+E003 RANDR:BadRRProvider
R000 RECORD:QueryVersion
R001 RECORD:CreateContext
R002 RECORD:RegisterClients
diff --git a/xorg-server/glamor/Makefile.am b/xorg-server/glamor/Makefile.am
index 2fd521f11..3fe25304d 100644
--- a/xorg-server/glamor/Makefile.am
+++ b/xorg-server/glamor/Makefile.am
@@ -1,18 +1,10 @@
-lib_LTLIBRARIES = libglamor.la
+noinst_LTLIBRARIES = libglamor.la libglamor_egl_stubs.la
-if GLAMOR_GLES2
-libglamor_la_LIBADD = $(GLESV2_LIBS)
-else
-libglamor_la_LIBADD = $(GL_LIBS)
-endif
+libglamor_la_LIBADD = $(GLAMOR_LIBS)
-AM_CFLAGS = $(CWARNFLAGS) $(XORG_CFLAGS) $(LIBDRM_CFLAGS)
-
-libglamor_la_LDFLAGS = -version-info 0:0:0
+AM_CFLAGS = $(CWARNFLAGS) $(DIX_CFLAGS) $(GLAMOR_CFLAGS)
libglamor_la_SOURCES = \
- compat-api.h \
- compiler.h \
glamor.c \
glamor_copyarea.c \
glamor_copywindow.c \
@@ -48,24 +40,8 @@ libglamor_la_SOURCES = \
glamor_compositerects.c\
glamor_xv.c\
glamor_utils.h\
- glamor.h\
- glapi.h
-
-sdk_HEADERS = glamor.h
-
-if EGL
-LIBGLAMOREGL = libglamoregl.la
-module_LTLIBRARIES = $(LIBGLAMOREGL)
-libglamoregl_la_DEPENDENCIES = libglamor.la
-libglamoregl_la_LDFLAGS = -avoid-version -module
-libglamoregl_la_LIBADD = $(EGL_LIBS) $(GLX_SYS_LIBS) $(GBM_LIBS) libglamor.la
-libglamoregl_la_SOURCES = glamor_eglmodule.c glamor_egl.c
-libglamoregl_la_CFLAGS = \
- $(AM_CFLAGS) \
- $(GLX_DEFINES) \
- $(LIBDRM_CFLAGS) \
- $(EGL_CFLAGS) \
- $(GBM_CFLAGS)
-endif
+ glamor.h
+libglamor_egl_stubs_la_SOURCES = glamor_egl_stubs.c
+sdk_HEADERS = glamor.h
diff --git a/xorg-server/glamor/compat-api.h b/xorg-server/glamor/compat-api.h
deleted file mode 100644
index 1608478f8..000000000
--- a/xorg-server/glamor/compat-api.h
+++ /dev/null
@@ -1,107 +0,0 @@
-/*
- * Copyright 2012 Red Hat, Inc.
- *
- * Permission is hereby granted, free of charge, to any person obtaining a
- * copy of this software and associated documentation files (the "Software"),
- * to deal in the Software without restriction, including without limitation
- * the rights to use, copy, modify, merge, publish, distribute, sublicense,
- * and/or sell copies of the Software, and to permit persons to whom the
- * Software is furnished to do so, subject to the following conditions:
- *
- * The above copyright notice and this permission notice (including the next
- * paragraph) shall be included in all copies or substantial portions of the
- * Software.
- *
- * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
- * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
- * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
- * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
- * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
- * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
- * DEALINGS IN THE SOFTWARE.
- *
- * Author: Dave Airlie <airlied@redhat.com>
- */
-
-/* this file provides API compat between server post 1.13 and pre it,
- it should be reused inside as many drivers as possible */
-#ifndef COMPAT_API_H
-#define COMPAT_API_H
-
-#ifndef GLYPH_HAS_GLYPH_PICTURE_ACCESSOR
-#define GetGlyphPicture(g, s) GlyphPicture((g))[(s)->myNum]
-#define SetGlyphPicture(g, s, p) GlyphPicture((g))[(s)->myNum] = p
-#endif
-
-#ifndef XF86_HAS_SCRN_CONV
-#define xf86ScreenToScrn(s) xf86Screens[(s)->myNum]
-#define xf86ScrnToScreen(s) screenInfo.screens[(s)->scrnIndex]
-#endif
-
-#ifndef XF86_SCRN_INTERFACE
-
-#define SCRN_ARG_TYPE int
-#define SCRN_INFO_PTR(arg1) ScrnInfoPtr scrn = xf86Screens[(arg1)]
-
-#define SCREEN_ARG_TYPE int
-#define SCREEN_PTR(arg1) ScreenPtr screen = screenInfo.screens[(arg1)]
-
-#define SCREEN_INIT_ARGS_DECL int scrnIndex, ScreenPtr screen, int argc, char **argv
-
-#define BLOCKHANDLER_ARGS_DECL int arg, pointer blockData, pointer timeout, pointer read_mask
-#define BLOCKHANDLER_ARGS arg, blockData, timeout, read_mask
-
-#define WAKEUPHANDLER_ARGS_DECL int arg, pointer wakeupData, unsigned long result, pointer read_mask
-#define WAKEUPHANDLER_ARGS arg, wakeupData, result, read_mask
-
-#define CLOSE_SCREEN_ARGS_DECL int scrnIndex, ScreenPtr screen
-#define CLOSE_SCREEN_ARGS scrnIndex, screen
-
-#define ADJUST_FRAME_ARGS_DECL int arg, int x, int y, int flags
-#define ADJUST_FRAME_ARGS(arg, x, y) (arg)->scrnIndex, x, y, 0
-
-#define SWITCH_MODE_ARGS_DECL int arg, DisplayModePtr mode, int flags
-#define SWITCH_MODE_ARGS(arg, m) (arg)->scrnIndex, m, 0
-
-#define FREE_SCREEN_ARGS_DECL int arg, int flags
-#define FREE_SCREEN_ARGS arg, flags
-
-#define VT_FUNC_ARGS_DECL int arg, int flags
-#define VT_FUNC_ARGS(flags) scrn->scrnIndex, (flags)
-
-#define XF86_ENABLEDISABLEFB_ARG(x) ((x)->scrnIndex)
-
-#else
-#define SCRN_ARG_TYPE ScrnInfoPtr
-#define SCRN_INFO_PTR(arg1) ScrnInfoPtr scrn = (arg1)
-
-#define SCREEN_ARG_TYPE ScreenPtr
-#define SCREEN_PTR(arg1) ScreenPtr screen = (arg1)
-
-#define SCREEN_INIT_ARGS_DECL ScreenPtr screen, int argc, char **argv
-
-#define BLOCKHANDLER_ARGS_DECL ScreenPtr arg, pointer timeout, pointer read_mask
-#define BLOCKHANDLER_ARGS arg, timeout, read_mask
-
-#define WAKEUPHANDLER_ARGS_DECL ScreenPtr arg, unsigned long result, pointer read_mask
-#define WAKEUPHANDLER_ARGS arg, result, read_mask
-
-#define CLOSE_SCREEN_ARGS_DECL ScreenPtr screen
-#define CLOSE_SCREEN_ARGS screen
-
-#define ADJUST_FRAME_ARGS_DECL ScrnInfoPtr arg, int x, int y
-#define ADJUST_FRAME_ARGS(arg, x, y) arg, x, y
-
-#define SWITCH_MODE_ARGS_DECL ScrnInfoPtr arg, DisplayModePtr mode
-#define SWITCH_MODE_ARGS(arg, m) arg, m
-
-#define FREE_SCREEN_ARGS_DECL ScrnInfoPtr arg
-#define FREE_SCREEN_ARGS arg
-
-#define VT_FUNC_ARGS_DECL ScrnInfoPtr arg
-#define VT_FUNC_ARGS(flags) scrn
-
-#define XF86_ENABLEDISABLEFB_ARG(x) (x)
-
-#endif
-#endif
diff --git a/xorg-server/glamor/glamor.c b/xorg-server/glamor/glamor.c
index 93d3c5e72..feb110a66 100644
--- a/xorg-server/glamor/glamor.c
+++ b/xorg-server/glamor/glamor.c
@@ -54,197 +54,192 @@ DevPrivateKey glamor_pixmap_private_key = &glamor_pixmap_private_key_index;
PixmapPtr
glamor_get_drawable_pixmap(DrawablePtr drawable)
{
- if (drawable->type == DRAWABLE_WINDOW)
- return drawable->
- pScreen->GetWindowPixmap((WindowPtr) drawable);
- else
- return (PixmapPtr) drawable;
+ if (drawable->type == DRAWABLE_WINDOW)
+ return drawable->pScreen->GetWindowPixmap((WindowPtr) drawable);
+ else
+ return (PixmapPtr) drawable;
}
_X_EXPORT void
glamor_set_pixmap_type(PixmapPtr pixmap, glamor_pixmap_type_t type)
{
- glamor_pixmap_private *pixmap_priv;
- glamor_screen_private *glamor_priv =
- glamor_get_screen_private(pixmap->drawable.pScreen);
-
- pixmap_priv = dixLookupPrivate(&pixmap->devPrivates,
- glamor_pixmap_private_key);
- if (pixmap_priv == NULL) {
- pixmap_priv = calloc(sizeof(*pixmap_priv), 1);
- glamor_set_pixmap_private(pixmap, pixmap_priv);
- pixmap_priv->base.pixmap = pixmap;
- pixmap_priv->base.glamor_priv = glamor_priv;
- }
- pixmap_priv->type = type;
+ glamor_pixmap_private *pixmap_priv;
+ glamor_screen_private *glamor_priv =
+ glamor_get_screen_private(pixmap->drawable.pScreen);
+
+ pixmap_priv = dixLookupPrivate(&pixmap->devPrivates,
+ glamor_pixmap_private_key);
+ if (pixmap_priv == NULL) {
+ pixmap_priv = calloc(sizeof(*pixmap_priv), 1);
+ glamor_set_pixmap_private(pixmap, pixmap_priv);
+ pixmap_priv->base.pixmap = pixmap;
+ pixmap_priv->base.glamor_priv = glamor_priv;
+ }
+ pixmap_priv->type = type;
}
_X_EXPORT void
glamor_set_pixmap_texture(PixmapPtr pixmap, unsigned int tex)
{
- ScreenPtr screen = pixmap->drawable.pScreen;
- glamor_pixmap_private *pixmap_priv;
- glamor_screen_private *glamor_priv;
- glamor_pixmap_fbo *fbo;
- GLenum format;
-
- glamor_priv = glamor_get_screen_private(screen);
- pixmap_priv = glamor_get_pixmap_private(pixmap);
-
- if (pixmap_priv->base.fbo) {
- fbo = glamor_pixmap_detach_fbo(pixmap_priv);
- glamor_destroy_fbo(fbo);
- }
-
- gl_iformat_for_depth(pixmap->drawable.depth, &format);
- fbo = glamor_create_fbo_from_tex(glamor_priv, pixmap->drawable.width,
- pixmap->drawable.height,
- format, tex, 0);
-
- if (fbo == NULL) {
- ErrorF("XXX fail to create fbo.\n");
- return;
- }
-
- glamor_pixmap_attach_fbo(pixmap, fbo);
+ ScreenPtr screen = pixmap->drawable.pScreen;
+ glamor_pixmap_private *pixmap_priv;
+ glamor_screen_private *glamor_priv;
+ glamor_pixmap_fbo *fbo;
+ GLenum format;
+
+ glamor_priv = glamor_get_screen_private(screen);
+ pixmap_priv = glamor_get_pixmap_private(pixmap);
+
+ if (pixmap_priv->base.fbo) {
+ fbo = glamor_pixmap_detach_fbo(pixmap_priv);
+ glamor_destroy_fbo(fbo);
+ }
+
+ gl_iformat_for_depth(pixmap->drawable.depth, &format);
+ fbo = glamor_create_fbo_from_tex(glamor_priv, pixmap->drawable.width,
+ pixmap->drawable.height, format, tex, 0);
+
+ if (fbo == NULL) {
+ ErrorF("XXX fail to create fbo.\n");
+ return;
+ }
+
+ glamor_pixmap_attach_fbo(pixmap, fbo);
}
void
glamor_set_screen_pixmap(PixmapPtr screen_pixmap, PixmapPtr *back_pixmap)
{
- glamor_pixmap_private *pixmap_priv;
- glamor_screen_private *glamor_priv;
+ glamor_pixmap_private *pixmap_priv;
+ glamor_screen_private *glamor_priv;
- glamor_priv = glamor_get_screen_private(screen_pixmap->drawable.pScreen);
- pixmap_priv = glamor_get_pixmap_private(screen_pixmap);
- glamor_priv->screen_fbo = pixmap_priv->base.fbo->fb;
+ glamor_priv = glamor_get_screen_private(screen_pixmap->drawable.pScreen);
+ pixmap_priv = glamor_get_pixmap_private(screen_pixmap);
+ glamor_priv->screen_fbo = pixmap_priv->base.fbo->fb;
- pixmap_priv->base.fbo->width = screen_pixmap->drawable.width;
- pixmap_priv->base.fbo->height = screen_pixmap->drawable.height;
+ pixmap_priv->base.fbo->width = screen_pixmap->drawable.width;
+ pixmap_priv->base.fbo->height = screen_pixmap->drawable.height;
- glamor_priv->back_pixmap = back_pixmap;
+ glamor_priv->back_pixmap = back_pixmap;
}
PixmapPtr
glamor_create_pixmap(ScreenPtr screen, int w, int h, int depth,
- unsigned int usage)
+ unsigned int usage)
{
- PixmapPtr pixmap;
- glamor_pixmap_type_t type = GLAMOR_TEXTURE_ONLY;
- glamor_pixmap_private *pixmap_priv;
- glamor_screen_private *glamor_priv =
- glamor_get_screen_private(screen);
- glamor_pixmap_fbo *fbo;
- int pitch;
- GLenum format;
-
- if (w > 32767 || h > 32767)
- return NullPixmap;
-
- if ((usage == GLAMOR_CREATE_PIXMAP_CPU
- || (usage == CREATE_PIXMAP_USAGE_GLYPH_PICTURE && w <= 64 && h <= 64)
- || (w == 0 && h == 0)
- || !glamor_check_pixmap_fbo_depth(depth))
- || (!GLAMOR_TEXTURED_LARGE_PIXMAP &&
- !glamor_check_fbo_size(glamor_priv, w, h)))
- return fbCreatePixmap(screen, w, h, depth, usage);
- else
- pixmap = fbCreatePixmap(screen, 0, 0, depth, usage);
-
- pixmap_priv = calloc(1, sizeof(*pixmap_priv));
-
- if (!pixmap_priv) {
- fbDestroyPixmap(pixmap);
- return fbCreatePixmap(screen, w, h, depth, usage);
- }
- glamor_set_pixmap_private(pixmap, pixmap_priv);
-
- if (usage == GLAMOR_CREATE_PIXMAP_MAP)
- type = GLAMOR_MEMORY_MAP;
-
- pixmap_priv->base.pixmap = pixmap;
- pixmap_priv->base.glamor_priv = glamor_priv;
-
- gl_iformat_for_depth(depth, &format);
-
- pitch = (((w * pixmap->drawable.bitsPerPixel + 7) / 8) + 3) & ~3;
- screen->ModifyPixmapHeader(pixmap, w, h, 0, 0, pitch, NULL);
-
- if (type == GLAMOR_MEMORY_MAP || glamor_check_fbo_size(glamor_priv, w, h)) {
- pixmap_priv->type = type;
- fbo = glamor_create_fbo(glamor_priv, w, h, format, usage);
- }
- else {
- DEBUGF("Create LARGE pixmap %p width %d height %d\n", pixmap, w, h);
- pixmap_priv->type = GLAMOR_TEXTURE_LARGE;
- fbo = glamor_create_fbo_array(glamor_priv, w, h, format, usage,
- glamor_priv->max_fbo_size,
- glamor_priv->max_fbo_size,
- pixmap_priv);
- }
-
- if (fbo == NULL) {
- fbDestroyPixmap(pixmap);
- free(pixmap_priv);
- return fbCreatePixmap(screen, w, h, depth, usage);
- }
-
- glamor_pixmap_attach_fbo(pixmap, fbo);
-
- return pixmap;
+ PixmapPtr pixmap;
+ glamor_pixmap_type_t type = GLAMOR_TEXTURE_ONLY;
+ glamor_pixmap_private *pixmap_priv;
+ glamor_screen_private *glamor_priv = glamor_get_screen_private(screen);
+ glamor_pixmap_fbo *fbo;
+ int pitch;
+ GLenum format;
+
+ if (w > 32767 || h > 32767)
+ return NullPixmap;
+
+ if ((usage == GLAMOR_CREATE_PIXMAP_CPU
+ || (usage == CREATE_PIXMAP_USAGE_GLYPH_PICTURE && w <= 64 && h <= 64)
+ || (w == 0 && h == 0)
+ || !glamor_check_pixmap_fbo_depth(depth))
+ || (!GLAMOR_TEXTURED_LARGE_PIXMAP &&
+ !glamor_check_fbo_size(glamor_priv, w, h)))
+ return fbCreatePixmap(screen, w, h, depth, usage);
+ else
+ pixmap = fbCreatePixmap(screen, 0, 0, depth, usage);
+
+ pixmap_priv = calloc(1, sizeof(*pixmap_priv));
+
+ if (!pixmap_priv) {
+ fbDestroyPixmap(pixmap);
+ return fbCreatePixmap(screen, w, h, depth, usage);
+ }
+ glamor_set_pixmap_private(pixmap, pixmap_priv);
+
+ if (usage == GLAMOR_CREATE_PIXMAP_MAP)
+ type = GLAMOR_MEMORY_MAP;
+
+ pixmap_priv->base.pixmap = pixmap;
+ pixmap_priv->base.glamor_priv = glamor_priv;
+
+ gl_iformat_for_depth(depth, &format);
+
+ pitch = (((w * pixmap->drawable.bitsPerPixel + 7) / 8) + 3) & ~3;
+ screen->ModifyPixmapHeader(pixmap, w, h, 0, 0, pitch, NULL);
+
+ if (type == GLAMOR_MEMORY_MAP || glamor_check_fbo_size(glamor_priv, w, h)) {
+ pixmap_priv->type = type;
+ fbo = glamor_create_fbo(glamor_priv, w, h, format, usage);
+ }
+ else {
+ DEBUGF("Create LARGE pixmap %p width %d height %d\n", pixmap, w, h);
+ pixmap_priv->type = GLAMOR_TEXTURE_LARGE;
+ fbo = glamor_create_fbo_array(glamor_priv, w, h, format, usage,
+ glamor_priv->max_fbo_size,
+ glamor_priv->max_fbo_size, pixmap_priv);
+ }
+
+ if (fbo == NULL) {
+ fbDestroyPixmap(pixmap);
+ free(pixmap_priv);
+ return fbCreatePixmap(screen, w, h, depth, usage);
+ }
+
+ glamor_pixmap_attach_fbo(pixmap, fbo);
+
+ return pixmap;
}
void
glamor_destroy_textured_pixmap(PixmapPtr pixmap)
{
- if (pixmap->refcnt == 1) {
- glamor_pixmap_private *pixmap_priv;
+ if (pixmap->refcnt == 1) {
+ glamor_pixmap_private *pixmap_priv;
- pixmap_priv = glamor_get_pixmap_private(pixmap);
- if (pixmap_priv != NULL)
- glamor_pixmap_destroy_fbo(pixmap_priv);
- }
+ pixmap_priv = glamor_get_pixmap_private(pixmap);
+ if (pixmap_priv != NULL)
+ glamor_pixmap_destroy_fbo(pixmap_priv);
+ }
}
Bool
glamor_destroy_pixmap(PixmapPtr pixmap)
{
- glamor_screen_private
- *glamor_priv = glamor_get_screen_private(pixmap->drawable.pScreen);
- if (glamor_priv->dri3_enabled)
- glamor_egl_destroy_textured_pixmap(pixmap);
- else
- glamor_destroy_textured_pixmap(pixmap);
- return fbDestroyPixmap(pixmap);
+ glamor_screen_private
+ *glamor_priv = glamor_get_screen_private(pixmap->drawable.pScreen);
+ if (glamor_priv->dri3_enabled)
+ glamor_egl_destroy_textured_pixmap(pixmap);
+ else
+ glamor_destroy_textured_pixmap(pixmap);
+ return fbDestroyPixmap(pixmap);
}
void
glamor_block_handler(ScreenPtr screen)
{
- glamor_screen_private *glamor_priv =
- glamor_get_screen_private(screen);
- glamor_gl_dispatch *dispatch;
-
- dispatch = glamor_get_dispatch(glamor_priv);
- glamor_priv->tick++;
- dispatch->glFlush();
- glamor_fbo_expire(glamor_priv);
- glamor_put_dispatch(glamor_priv);
- if (glamor_priv->state == RENDER_STATE
- && glamor_priv->render_idle_cnt++ > RENDER_IDEL_MAX) {
- glamor_priv->state = IDLE_STATE;
- glamor_priv->render_idle_cnt = 0;
- }
+ glamor_screen_private *glamor_priv = glamor_get_screen_private(screen);
+ glamor_gl_dispatch *dispatch;
+
+ dispatch = glamor_get_dispatch(glamor_priv);
+ glamor_priv->tick++;
+ dispatch->glFlush();
+ glamor_fbo_expire(glamor_priv);
+ glamor_put_dispatch(glamor_priv);
+ if (glamor_priv->state == RENDER_STATE
+ && glamor_priv->render_idle_cnt++ > RENDER_IDEL_MAX) {
+ glamor_priv->state = IDLE_STATE;
+ glamor_priv->render_idle_cnt = 0;
+ }
}
static void
-_glamor_block_handler(void *data, OSTimePtr timeout,
- void *last_select_mask)
+_glamor_block_handler(void *data, OSTimePtr timeout, void *last_select_mask)
{
- glamor_screen_private *glamor_priv = data;
- glamor_gl_dispatch *dispatch = glamor_get_dispatch(glamor_priv);
- dispatch->glFlush();
- glamor_put_dispatch(glamor_priv);
+ glamor_screen_private *glamor_priv = data;
+ glamor_gl_dispatch *dispatch = glamor_get_dispatch(glamor_priv);
+
+ dispatch->glFlush();
+ glamor_put_dispatch(glamor_priv);
}
static void
@@ -255,374 +250,366 @@ _glamor_wakeup_handler(void *data, int result, void *last_select_mask)
static void
glamor_set_debug_level(int *debug_level)
{
- char *debug_level_string;
- debug_level_string = getenv("GLAMOR_DEBUG");
- if (debug_level_string
- && sscanf(debug_level_string, "%d", debug_level) == 1)
- return;
- *debug_level = 0;
+ char *debug_level_string;
+
+ debug_level_string = getenv("GLAMOR_DEBUG");
+ if (debug_level_string
+ && sscanf(debug_level_string, "%d", debug_level) == 1)
+ return;
+ *debug_level = 0;
}
int glamor_debug_level;
+
/** Set up glamor for an already-configured GL context. */
Bool
glamor_init(ScreenPtr screen, unsigned int flags)
{
- glamor_screen_private *glamor_priv;
- int gl_version;
+ glamor_screen_private *glamor_priv;
+ int gl_version;
#ifdef RENDER
- PictureScreenPtr ps = GetPictureScreenIfSet(screen);
+ PictureScreenPtr ps = GetPictureScreenIfSet(screen);
#endif
- if (flags & ~GLAMOR_VALID_FLAGS) {
- ErrorF("glamor_init: Invalid flags %x\n", flags);
- return FALSE;
- }
- glamor_priv = calloc(1, sizeof(*glamor_priv));
- if (glamor_priv == NULL)
- return FALSE;
-
- if (flags & GLAMOR_INVERTED_Y_AXIS) {
- glamor_priv->yInverted = 1;
- } else
- glamor_priv->yInverted = 0;
-
- if (!dixRegisterPrivateKey
- (glamor_screen_private_key, PRIVATE_SCREEN, 0)) {
- LogMessage(X_WARNING,
- "glamor%d: Failed to allocate screen private\n",
- screen->myNum);
- goto fail;
- }
-
- glamor_set_screen_private(screen, glamor_priv);
-
- if (!dixRegisterPrivateKey
- (glamor_pixmap_private_key, PRIVATE_PIXMAP, 0)) {
- LogMessage(X_WARNING,
- "glamor%d: Failed to allocate pixmap private\n",
- screen->myNum);
- goto fail;;
- }
-
- gl_version = glamor_gl_get_version();
+ if (flags & ~GLAMOR_VALID_FLAGS) {
+ ErrorF("glamor_init: Invalid flags %x\n", flags);
+ return FALSE;
+ }
+ glamor_priv = calloc(1, sizeof(*glamor_priv));
+ if (glamor_priv == NULL)
+ return FALSE;
+
+ if (flags & GLAMOR_INVERTED_Y_AXIS) {
+ glamor_priv->yInverted = 1;
+ }
+ else
+ glamor_priv->yInverted = 0;
+
+ if (!dixRegisterPrivateKey(glamor_screen_private_key, PRIVATE_SCREEN, 0)) {
+ LogMessage(X_WARNING,
+ "glamor%d: Failed to allocate screen private\n",
+ screen->myNum);
+ goto fail;
+ }
+
+ glamor_set_screen_private(screen, glamor_priv);
+
+ if (!dixRegisterPrivateKey(glamor_pixmap_private_key, PRIVATE_PIXMAP, 0)) {
+ LogMessage(X_WARNING,
+ "glamor%d: Failed to allocate pixmap private\n",
+ screen->myNum);
+ goto fail;;
+ }
+
+ gl_version = glamor_gl_get_version();
#ifndef GLAMOR_GLES2
- if (gl_version < GLAMOR_GL_VERSION_ENCODE(1, 3)) {
- ErrorF("Require OpenGL version 1.3 or latter.\n");
- goto fail;
- }
+ if (gl_version < GLAMOR_GL_VERSION_ENCODE(1, 3)) {
+ ErrorF("Require OpenGL version 1.3 or latter.\n");
+ goto fail;
+ }
#else
- if (gl_version < GLAMOR_GL_VERSION_ENCODE(2, 0)) {
- ErrorF("Require Open GLES2.0 or latter.\n");
- goto fail;
- }
+ if (gl_version < GLAMOR_GL_VERSION_ENCODE(2, 0)) {
+ ErrorF("Require Open GLES2.0 or latter.\n");
+ goto fail;
+ }
#endif
- glamor_gl_dispatch_init(screen, &glamor_priv->_dispatch, gl_version);
+ glamor_gl_dispatch_init(screen, &glamor_priv->_dispatch, gl_version);
#ifdef GLAMOR_GLES2
- if (!glamor_gl_has_extension("GL_EXT_texture_format_BGRA8888")) {
- ErrorF("GL_EXT_texture_format_BGRA8888 required\n");
- goto fail;
- }
+ if (!glamor_gl_has_extension("GL_EXT_texture_format_BGRA8888")) {
+ ErrorF("GL_EXT_texture_format_BGRA8888 required\n");
+ goto fail;
+ }
#endif
- glamor_priv->has_pack_invert =
- glamor_gl_has_extension("GL_MESA_pack_invert");
- glamor_priv->has_fbo_blit =
- glamor_gl_has_extension("GL_EXT_framebuffer_blit");
- glamor_priv->_dispatch.glGetIntegerv(GL_MAX_RENDERBUFFER_SIZE,
- &glamor_priv->max_fbo_size);
+ glamor_priv->has_pack_invert =
+ glamor_gl_has_extension("GL_MESA_pack_invert");
+ glamor_priv->has_fbo_blit =
+ glamor_gl_has_extension("GL_EXT_framebuffer_blit");
+ glamor_priv->_dispatch.glGetIntegerv(GL_MAX_RENDERBUFFER_SIZE,
+ &glamor_priv->max_fbo_size);
#ifdef MAX_FBO_SIZE
- glamor_priv->max_fbo_size = MAX_FBO_SIZE;
+ glamor_priv->max_fbo_size = MAX_FBO_SIZE;
#endif
- glamor_set_debug_level(&glamor_debug_level);
+ glamor_set_debug_level(&glamor_debug_level);
#ifdef GLAMOR_GLES2
- glamor_priv->gl_flavor = GLAMOR_GL_ES2;
+ glamor_priv->gl_flavor = GLAMOR_GL_ES2;
#else
- glamor_priv->gl_flavor = GLAMOR_GL_DESKTOP;
+ glamor_priv->gl_flavor = GLAMOR_GL_DESKTOP;
#endif
- /* If we are using egl screen, call egl screen init to
- * register correct close screen function. */
- if (flags & GLAMOR_USE_EGL_SCREEN)
- glamor_egl_screen_init(screen);
+ /* If we are using egl screen, call egl screen init to
+ * register correct close screen function. */
+ if (flags & GLAMOR_USE_EGL_SCREEN)
+ glamor_egl_screen_init(screen);
- glamor_priv->saved_procs.close_screen = screen->CloseScreen;
- screen->CloseScreen = glamor_close_screen;
+ glamor_priv->saved_procs.close_screen = screen->CloseScreen;
+ screen->CloseScreen = glamor_close_screen;
- if (flags & GLAMOR_USE_SCREEN) {
- if (!RegisterBlockAndWakeupHandlers(_glamor_block_handler,
- _glamor_wakeup_handler,
- glamor_priv)) {
- goto fail;
- }
+ if (flags & GLAMOR_USE_SCREEN) {
+ if (!RegisterBlockAndWakeupHandlers(_glamor_block_handler,
+ _glamor_wakeup_handler,
+ glamor_priv)) {
+ goto fail;
+ }
- glamor_priv->saved_procs.create_gc = screen->CreateGC;
- screen->CreateGC = glamor_create_gc;
+ glamor_priv->saved_procs.create_gc = screen->CreateGC;
+ screen->CreateGC = glamor_create_gc;
- glamor_priv->saved_procs.create_pixmap = screen->CreatePixmap;
- screen->CreatePixmap = glamor_create_pixmap;
+ glamor_priv->saved_procs.create_pixmap = screen->CreatePixmap;
+ screen->CreatePixmap = glamor_create_pixmap;
- glamor_priv->saved_procs.destroy_pixmap = screen->DestroyPixmap;
- screen->DestroyPixmap = glamor_destroy_pixmap;
+ glamor_priv->saved_procs.destroy_pixmap = screen->DestroyPixmap;
+ screen->DestroyPixmap = glamor_destroy_pixmap;
- glamor_priv->saved_procs.get_spans = screen->GetSpans;
- screen->GetSpans = glamor_get_spans;
+ glamor_priv->saved_procs.get_spans = screen->GetSpans;
+ screen->GetSpans = glamor_get_spans;
- glamor_priv->saved_procs.get_image = screen->GetImage;
- screen->GetImage = glamor_get_image;
+ glamor_priv->saved_procs.get_image = screen->GetImage;
+ screen->GetImage = glamor_get_image;
- glamor_priv->saved_procs.change_window_attributes =
- screen->ChangeWindowAttributes;
- screen->ChangeWindowAttributes =
- glamor_change_window_attributes;
+ glamor_priv->saved_procs.change_window_attributes =
+ screen->ChangeWindowAttributes;
+ screen->ChangeWindowAttributes = glamor_change_window_attributes;
- glamor_priv->saved_procs.copy_window = screen->CopyWindow;
- screen->CopyWindow = glamor_copy_window;
+ glamor_priv->saved_procs.copy_window = screen->CopyWindow;
+ screen->CopyWindow = glamor_copy_window;
- glamor_priv->saved_procs.bitmap_to_region =
- screen->BitmapToRegion;
- screen->BitmapToRegion = glamor_bitmap_to_region;
- }
+ glamor_priv->saved_procs.bitmap_to_region = screen->BitmapToRegion;
+ screen->BitmapToRegion = glamor_bitmap_to_region;
+ }
#ifdef RENDER
- if (flags & GLAMOR_USE_PICTURE_SCREEN) {
- glamor_priv->saved_procs.composite = ps->Composite;
- ps->Composite = glamor_composite;
+ if (flags & GLAMOR_USE_PICTURE_SCREEN) {
+ glamor_priv->saved_procs.composite = ps->Composite;
+ ps->Composite = glamor_composite;
+ glamor_priv->saved_procs.trapezoids = ps->Trapezoids;
+ ps->Trapezoids = glamor_trapezoids;
- glamor_priv->saved_procs.trapezoids = ps->Trapezoids;
- ps->Trapezoids = glamor_trapezoids;
+ glamor_priv->saved_procs.triangles = ps->Triangles;
+ ps->Triangles = glamor_triangles;
+ glamor_priv->saved_procs.addtraps = ps->AddTraps;
+ ps->AddTraps = glamor_add_traps;
- glamor_priv->saved_procs.triangles = ps->Triangles;
- ps->Triangles = glamor_triangles;
+ }
- glamor_priv->saved_procs.addtraps = ps->AddTraps;
- ps->AddTraps = glamor_add_traps;
+ glamor_priv->saved_procs.composite_rects = ps->CompositeRects;
+ ps->CompositeRects = glamor_composite_rectangles;
- }
+ glamor_priv->saved_procs.glyphs = ps->Glyphs;
+ ps->Glyphs = glamor_glyphs;
- glamor_priv->saved_procs.composite_rects = ps->CompositeRects;
- ps->CompositeRects = glamor_composite_rectangles;
+ glamor_priv->saved_procs.unrealize_glyph = ps->UnrealizeGlyph;
+ ps->UnrealizeGlyph = glamor_glyph_unrealize;
- glamor_priv->saved_procs.glyphs = ps->Glyphs;
- ps->Glyphs = glamor_glyphs;
+ glamor_priv->saved_procs.create_picture = ps->CreatePicture;
+ ps->CreatePicture = glamor_create_picture;
- glamor_priv->saved_procs.unrealize_glyph = ps->UnrealizeGlyph;
- ps->UnrealizeGlyph = glamor_glyph_unrealize;
+ glamor_priv->saved_procs.set_window_pixmap = screen->SetWindowPixmap;
+ screen->SetWindowPixmap = glamor_set_window_pixmap;
- glamor_priv->saved_procs.create_picture = ps->CreatePicture;
- ps->CreatePicture = glamor_create_picture;
-
- glamor_priv->saved_procs.set_window_pixmap = screen->SetWindowPixmap;
- screen->SetWindowPixmap = glamor_set_window_pixmap;
-
- glamor_priv->saved_procs.destroy_picture = ps->DestroyPicture;
- ps->DestroyPicture = glamor_destroy_picture;
- glamor_init_composite_shaders(screen);
+ glamor_priv->saved_procs.destroy_picture = ps->DestroyPicture;
+ ps->DestroyPicture = glamor_destroy_picture;
+ glamor_init_composite_shaders(screen);
#endif
- glamor_init_pixmap_fbo(screen);
- glamor_init_solid_shader(screen);
- glamor_init_tile_shader(screen);
+ glamor_init_pixmap_fbo(screen);
+ glamor_init_solid_shader(screen);
+ glamor_init_tile_shader(screen);
#ifdef GLAMOR_TRAPEZOID_SHADER
- glamor_init_trapezoid_shader(screen);
+ glamor_init_trapezoid_shader(screen);
#endif
- glamor_init_putimage_shaders(screen);
- glamor_init_finish_access_shaders(screen);
+ glamor_init_putimage_shaders(screen);
+ glamor_init_finish_access_shaders(screen);
#ifdef GLAMOR_GRADIENT_SHADER
- glamor_init_gradient_shader(screen);
+ glamor_init_gradient_shader(screen);
#endif
#ifdef GLAMOR_XV
- glamor_init_xv_shader(screen);
+ glamor_init_xv_shader(screen);
#endif
- glamor_pixmap_init(screen);
+ glamor_pixmap_init(screen);
- glamor_priv->flags = flags;
- glamor_priv->screen = screen;
+ glamor_priv->flags = flags;
+ glamor_priv->screen = screen;
- return TRUE;
+ return TRUE;
- fail:
- free(glamor_priv);
- glamor_set_screen_private(screen, NULL);
- return FALSE;
+ fail:
+ free(glamor_priv);
+ glamor_set_screen_private(screen, NULL);
+ return FALSE;
}
static void
glamor_release_screen_priv(ScreenPtr screen)
{
- glamor_screen_private *glamor_priv;
+ glamor_screen_private *glamor_priv;
- glamor_priv = glamor_get_screen_private(screen);
+ glamor_priv = glamor_get_screen_private(screen);
#ifdef GLAMOR_XV
- glamor_fini_xv_shader(screen);
+ glamor_fini_xv_shader(screen);
#endif
#ifdef RENDER
- glamor_fini_composite_shaders(screen);
+ glamor_fini_composite_shaders(screen);
#endif
- glamor_fini_pixmap_fbo(screen);
- glamor_fini_solid_shader(screen);
- glamor_fini_tile_shader(screen);
+ glamor_fini_pixmap_fbo(screen);
+ glamor_fini_solid_shader(screen);
+ glamor_fini_tile_shader(screen);
#ifdef GLAMOR_TRAPEZOID_SHADER
- glamor_fini_trapezoid_shader(screen);
+ glamor_fini_trapezoid_shader(screen);
#endif
- glamor_fini_putimage_shaders(screen);
- glamor_fini_finish_access_shaders(screen);
+ glamor_fini_putimage_shaders(screen);
+ glamor_fini_finish_access_shaders(screen);
#ifdef GLAMOR_GRADIENT_SHADER
- glamor_fini_gradient_shader(screen);
+ glamor_fini_gradient_shader(screen);
#endif
- glamor_pixmap_fini(screen);
- free(glamor_priv);
+ glamor_pixmap_fini(screen);
+ free(glamor_priv);
- glamor_set_screen_private(screen, NULL);
+ glamor_set_screen_private(screen, NULL);
}
_X_EXPORT void
glamor_set_pixmap_private(PixmapPtr pixmap, glamor_pixmap_private *priv)
{
- glamor_pixmap_private *old_priv;
- glamor_pixmap_fbo *fbo;
-
- old_priv = dixGetPrivate(&pixmap->devPrivates, glamor_pixmap_private_key);
-
- if (priv) {
- assert(old_priv == NULL);
- } else {
- if (old_priv == NULL)
- return;
- fbo = glamor_pixmap_detach_fbo(old_priv);
- glamor_purge_fbo(fbo);
- free(old_priv);
- }
-
- dixSetPrivate(&pixmap->devPrivates,
- glamor_pixmap_private_key,
- priv);
+ glamor_pixmap_private *old_priv;
+ glamor_pixmap_fbo *fbo;
+
+ old_priv = dixGetPrivate(&pixmap->devPrivates, glamor_pixmap_private_key);
+
+ if (priv) {
+ assert(old_priv == NULL);
+ }
+ else {
+ if (old_priv == NULL)
+ return;
+ fbo = glamor_pixmap_detach_fbo(old_priv);
+ glamor_purge_fbo(fbo);
+ free(old_priv);
+ }
+
+ dixSetPrivate(&pixmap->devPrivates, glamor_pixmap_private_key, priv);
}
Bool
-glamor_close_screen(CLOSE_SCREEN_ARGS_DECL)
+glamor_close_screen(ScreenPtr screen)
{
- glamor_screen_private *glamor_priv;
- PixmapPtr screen_pixmap;
- int flags;
+ glamor_screen_private *glamor_priv;
+ PixmapPtr screen_pixmap;
+ int flags;
+
#ifdef RENDER
- PictureScreenPtr ps = GetPictureScreenIfSet(screen);
+ PictureScreenPtr ps = GetPictureScreenIfSet(screen);
#endif
- glamor_priv = glamor_get_screen_private(screen);
- flags = glamor_priv->flags;
- glamor_glyphs_fini(screen);
- screen->CloseScreen = glamor_priv->saved_procs.close_screen;
- if (flags & GLAMOR_USE_SCREEN) {
-
- screen->CreateGC = glamor_priv->saved_procs.create_gc;
- screen->CreatePixmap = glamor_priv->saved_procs.create_pixmap;
- screen->DestroyPixmap = glamor_priv->saved_procs.destroy_pixmap;
- screen->GetSpans = glamor_priv->saved_procs.get_spans;
- screen->ChangeWindowAttributes =
- glamor_priv->saved_procs.change_window_attributes;
- screen->CopyWindow = glamor_priv->saved_procs.copy_window;
- screen->BitmapToRegion = glamor_priv->saved_procs.bitmap_to_region;
- }
+ glamor_priv = glamor_get_screen_private(screen);
+ flags = glamor_priv->flags;
+ glamor_glyphs_fini(screen);
+ screen->CloseScreen = glamor_priv->saved_procs.close_screen;
+ if (flags & GLAMOR_USE_SCREEN) {
+
+ screen->CreateGC = glamor_priv->saved_procs.create_gc;
+ screen->CreatePixmap = glamor_priv->saved_procs.create_pixmap;
+ screen->DestroyPixmap = glamor_priv->saved_procs.destroy_pixmap;
+ screen->GetSpans = glamor_priv->saved_procs.get_spans;
+ screen->ChangeWindowAttributes =
+ glamor_priv->saved_procs.change_window_attributes;
+ screen->CopyWindow = glamor_priv->saved_procs.copy_window;
+ screen->BitmapToRegion = glamor_priv->saved_procs.bitmap_to_region;
+ }
#ifdef RENDER
- if (ps && (flags & GLAMOR_USE_PICTURE_SCREEN)) {
-
- ps->Composite = glamor_priv->saved_procs.composite;
- ps->Trapezoids = glamor_priv->saved_procs.trapezoids;
- ps->Triangles = glamor_priv->saved_procs.triangles;
- ps->CreatePicture = glamor_priv->saved_procs.create_picture;
- }
- ps->CompositeRects = glamor_priv->saved_procs.composite_rects;
- ps->Glyphs = glamor_priv->saved_procs.glyphs;
- ps->UnrealizeGlyph = glamor_priv->saved_procs.unrealize_glyph;
- screen->SetWindowPixmap = glamor_priv->saved_procs.set_window_pixmap;
+ if (ps && (flags & GLAMOR_USE_PICTURE_SCREEN)) {
+
+ ps->Composite = glamor_priv->saved_procs.composite;
+ ps->Trapezoids = glamor_priv->saved_procs.trapezoids;
+ ps->Triangles = glamor_priv->saved_procs.triangles;
+ ps->CreatePicture = glamor_priv->saved_procs.create_picture;
+ }
+ ps->CompositeRects = glamor_priv->saved_procs.composite_rects;
+ ps->Glyphs = glamor_priv->saved_procs.glyphs;
+ ps->UnrealizeGlyph = glamor_priv->saved_procs.unrealize_glyph;
+ screen->SetWindowPixmap = glamor_priv->saved_procs.set_window_pixmap;
#endif
- screen_pixmap = screen->GetScreenPixmap(screen);
- glamor_set_pixmap_private(screen_pixmap, NULL);
- if (glamor_priv->back_pixmap && *glamor_priv->back_pixmap)
- glamor_set_pixmap_private(*glamor_priv->back_pixmap, NULL);
+ screen_pixmap = screen->GetScreenPixmap(screen);
+ glamor_set_pixmap_private(screen_pixmap, NULL);
+ if (glamor_priv->back_pixmap && *glamor_priv->back_pixmap)
+ glamor_set_pixmap_private(*glamor_priv->back_pixmap, NULL);
- glamor_release_screen_priv(screen);
+ glamor_release_screen_priv(screen);
- return screen->CloseScreen(CLOSE_SCREEN_ARGS);
+ return screen->CloseScreen(screen);
}
-
void
glamor_fini(ScreenPtr screen)
{
- /* Do nothing currently. */
+ /* Do nothing currently. */
}
-void glamor_enable_dri3(ScreenPtr screen)
+void
+glamor_enable_dri3(ScreenPtr screen)
{
- glamor_screen_private *glamor_priv =
- glamor_get_screen_private(screen);
- glamor_priv->dri3_enabled = TRUE;
+ glamor_screen_private *glamor_priv = glamor_get_screen_private(screen);
+
+ glamor_priv->dri3_enabled = TRUE;
}
-Bool glamor_is_dri3_support_enabled(ScreenPtr screen)
+Bool
+glamor_is_dri3_support_enabled(ScreenPtr screen)
{
- glamor_screen_private *glamor_priv =
- glamor_get_screen_private(screen);
- return glamor_priv->dri3_enabled;
+ glamor_screen_private *glamor_priv = glamor_get_screen_private(screen);
+
+ return glamor_priv->dri3_enabled;
}
int
-glamor_dri3_fd_from_pixmap (ScreenPtr screen,
- PixmapPtr pixmap,
- CARD16 *stride,
- CARD32 *size)
+glamor_dri3_fd_from_pixmap(ScreenPtr screen,
+ PixmapPtr pixmap, CARD16 *stride, CARD32 *size)
{
- glamor_pixmap_private *pixmap_priv;
- glamor_screen_private *glamor_priv =
- glamor_get_screen_private(pixmap->drawable.pScreen);
-
- pixmap_priv = glamor_get_pixmap_private(pixmap);
- if (pixmap_priv == NULL || !glamor_priv->dri3_enabled)
- return -1;
- switch (pixmap_priv->type)
- {
- case GLAMOR_TEXTURE_DRM:
- case GLAMOR_TEXTURE_ONLY:
- glamor_pixmap_ensure_fbo(pixmap, GL_RGBA, 0);
- return glamor_egl_dri3_fd_name_from_tex(screen,
- pixmap,
- pixmap_priv->base.fbo->tex,
- FALSE,
- stride,
- size);
- default: break;
- }
- return -1;
+ glamor_pixmap_private *pixmap_priv;
+ glamor_screen_private *glamor_priv =
+ glamor_get_screen_private(pixmap->drawable.pScreen);
+
+ pixmap_priv = glamor_get_pixmap_private(pixmap);
+ if (pixmap_priv == NULL || !glamor_priv->dri3_enabled)
+ return -1;
+ switch (pixmap_priv->type) {
+ case GLAMOR_TEXTURE_DRM:
+ case GLAMOR_TEXTURE_ONLY:
+ glamor_pixmap_ensure_fbo(pixmap, GL_RGBA, 0);
+ return glamor_egl_dri3_fd_name_from_tex(screen,
+ pixmap,
+ pixmap_priv->base.fbo->tex,
+ FALSE, stride, size);
+ default:
+ break;
+ }
+ return -1;
}
int
-glamor_dri3_name_from_pixmap (PixmapPtr pixmap)
+glamor_dri3_name_from_pixmap(PixmapPtr pixmap)
{
- glamor_pixmap_private *pixmap_priv;
- glamor_screen_private *glamor_priv =
- glamor_get_screen_private(pixmap->drawable.pScreen);
-
- pixmap_priv = glamor_get_pixmap_private(pixmap);
- if (pixmap_priv == NULL || !glamor_priv->dri3_enabled)
- return -1;
- switch (pixmap_priv->type)
- {
- case GLAMOR_TEXTURE_DRM:
- case GLAMOR_TEXTURE_ONLY:
- glamor_pixmap_ensure_fbo(pixmap, GL_RGBA, 0);
- return glamor_egl_dri3_fd_name_from_tex(pixmap->drawable.pScreen,
- pixmap,
- pixmap_priv->base.fbo->tex,
- TRUE,
- NULL,
- NULL);
- default: break;
- }
- return -1;
+ glamor_pixmap_private *pixmap_priv;
+ glamor_screen_private *glamor_priv =
+ glamor_get_screen_private(pixmap->drawable.pScreen);
+
+ pixmap_priv = glamor_get_pixmap_private(pixmap);
+ if (pixmap_priv == NULL || !glamor_priv->dri3_enabled)
+ return -1;
+ switch (pixmap_priv->type) {
+ case GLAMOR_TEXTURE_DRM:
+ case GLAMOR_TEXTURE_ONLY:
+ glamor_pixmap_ensure_fbo(pixmap, GL_RGBA, 0);
+ return glamor_egl_dri3_fd_name_from_tex(pixmap->drawable.pScreen,
+ pixmap,
+ pixmap_priv->base.fbo->tex,
+ TRUE, NULL, NULL);
+ default:
+ break;
+ }
+ return -1;
}
diff --git a/xorg-server/glamor/glamor.h b/xorg-server/glamor/glamor.h
index 1bb48ed74..05f565b12 100644
--- a/xorg-server/glamor/glamor.h
+++ b/xorg-server/glamor/glamor.h
@@ -30,14 +30,12 @@
#define GLAMOR_H
#include <scrnintstr.h>
-#include <xf86.h>
-#include <xf86str.h>
#include <pixmapstr.h>
#include <gcstruct.h>
#include <picturestr.h>
#include <fb.h>
#include <fbpict.h>
-#include <xf86xv.h>
+
/*
* glamor_pixmap_type : glamor pixmap's type.
* @MEMORY: pixmap is in memory.
@@ -48,15 +46,15 @@
* @DRM_ONLY: pixmap is in a external DRM buffer.
* @TEXTURE_ONLY: pixmap is in an internal texture.
*/
-typedef enum glamor_pixmap_type {
- GLAMOR_MEMORY,
- GLAMOR_MEMORY_MAP,
- GLAMOR_TEXTURE_DRM,
- GLAMOR_SEPARATE_TEXTURE,
- GLAMOR_DRM_ONLY,
- GLAMOR_TEXTURE_ONLY,
- GLAMOR_TEXTURE_LARGE,
- GLAMOR_TEXTURE_PACK
+typedef enum glamor_pixmap_type {
+ GLAMOR_MEMORY,
+ GLAMOR_MEMORY_MAP,
+ GLAMOR_TEXTURE_DRM,
+ GLAMOR_SEPARATE_TEXTURE,
+ GLAMOR_DRM_ONLY,
+ GLAMOR_TEXTURE_ONLY,
+ GLAMOR_TEXTURE_LARGE,
+ GLAMOR_TEXTURE_PACK
} glamor_pixmap_type_t;
#define GLAMOR_EGL_EXTERNAL_BUFFER 3
@@ -116,17 +114,13 @@ extern _X_EXPORT void glamor_fini(ScreenPtr screen);
* screen pixmap which must be a glamor pixmap and requires
* the internal data structure still exist at that time.
* Otherwise, the glamor internal structure will not be freed.*/
-#ifndef XF86_SCRN_INTERFACE
-extern _X_EXPORT Bool glamor_close_screen(int scrnIndex, ScreenPtr screen);
-#else
extern _X_EXPORT Bool glamor_close_screen(ScreenPtr screen);
-#endif
-
/* Let glamor to know the screen's fbo. The low level
* driver should already assign a tex
* to this pixmap through the set_pixmap_texture. */
-extern _X_EXPORT void glamor_set_screen_pixmap(PixmapPtr screen_pixmap, PixmapPtr *back_pixmap);
+extern _X_EXPORT void glamor_set_screen_pixmap(PixmapPtr screen_pixmap,
+ PixmapPtr *back_pixmap);
/* @glamor_glyphs_init: Initialize glyphs internal data structures.
*
@@ -139,13 +133,14 @@ extern _X_EXPORT void glamor_set_screen_pixmap(PixmapPtr screen_pixmap, PixmapPt
extern _X_EXPORT Bool glamor_glyphs_init(ScreenPtr pScreen);
extern _X_EXPORT void glamor_set_pixmap_texture(PixmapPtr pixmap,
- unsigned int tex);
+ unsigned int tex);
-extern _X_EXPORT void glamor_set_pixmap_type(PixmapPtr pixmap, glamor_pixmap_type_t type);
+extern _X_EXPORT void glamor_set_pixmap_type(PixmapPtr pixmap,
+ glamor_pixmap_type_t type);
extern _X_EXPORT void glamor_destroy_textured_pixmap(PixmapPtr pixmap);
extern _X_EXPORT void glamor_block_handler(ScreenPtr screen);
-extern _X_EXPORT PixmapPtr glamor_create_pixmap(ScreenPtr screen, int w, int h, int depth,
- unsigned int usage);
+extern _X_EXPORT PixmapPtr glamor_create_pixmap(ScreenPtr screen, int w, int h,
+ int depth, unsigned int usage);
extern _X_EXPORT void glamor_egl_screen_init(ScreenPtr screen);
@@ -160,14 +155,21 @@ extern _X_EXPORT void glamor_egl_restore_context(ScreenPtr screen);
* Used by the DRI2 page flip. This function will exchange the KHR images and
* fbos of the two pixmaps.
* */
-extern _X_EXPORT void glamor_egl_exchange_buffers(PixmapPtr front, PixmapPtr back);
+extern _X_EXPORT void glamor_egl_exchange_buffers(PixmapPtr front,
+ PixmapPtr back);
-extern _X_EXPORT void glamor_pixmap_exchange_fbos(PixmapPtr front, PixmapPtr back);
+extern _X_EXPORT void glamor_pixmap_exchange_fbos(PixmapPtr front,
+ PixmapPtr back);
/* The DDX is not supposed to call these three functions */
extern _X_EXPORT void glamor_enable_dri3(ScreenPtr screen);
-extern _X_EXPORT unsigned int glamor_egl_create_argb8888_based_texture(ScreenPtr screen, int w, int h);
-extern _X_EXPORT int glamor_egl_dri3_fd_name_from_tex(ScreenPtr, PixmapPtr, unsigned int, Bool, CARD16*, CARD32*);
+extern _X_EXPORT unsigned int glamor_egl_create_argb8888_based_texture(ScreenPtr
+ screen,
+ int w,
+ int h);
+extern _X_EXPORT int glamor_egl_dri3_fd_name_from_tex(ScreenPtr, PixmapPtr,
+ unsigned int, Bool,
+ CARD16 *, CARD32 *);
/* @glamor_is_dri3_support_enabled: Returns if DRI3 support is enabled.
*
@@ -194,10 +196,9 @@ extern _X_EXPORT Bool glamor_is_dri3_support_enabled(ScreenPtr screen);
* content.
* Returns the fd on success, -1 on error.
* */
-extern _X_EXPORT int glamor_dri3_fd_from_pixmap (ScreenPtr screen,
- PixmapPtr pixmap,
- CARD16 *stride,
- CARD32 *size);
+extern _X_EXPORT int glamor_dri3_fd_from_pixmap(ScreenPtr screen,
+ PixmapPtr pixmap,
+ CARD16 *stride, CARD32 *size);
/* @glamor_dri3_name_from_pixmap: helper to get an gem name from a pixmap.
*
@@ -208,7 +209,7 @@ extern _X_EXPORT int glamor_dri3_fd_from_pixmap (ScreenPtr screen,
* glamor DRI3 support to be activated.
* Returns the name on success, -1 on error.
* */
-extern _X_EXPORT int glamor_dri3_name_from_pixmap (PixmapPtr pixmap);
+extern _X_EXPORT int glamor_dri3_name_from_pixmap(PixmapPtr pixmap);
/* @glamor_egl_dri3_pixmap_from_fd: DRI3 helper to get a pixmap from a dma-buf fd.
*
@@ -222,13 +223,13 @@ extern _X_EXPORT int glamor_dri3_name_from_pixmap (PixmapPtr pixmap);
*
* Returns a valid pixmap if the import succeeded, else NULL.
* */
-extern _X_EXPORT PixmapPtr glamor_egl_dri3_pixmap_from_fd (ScreenPtr screen,
- int fd,
- CARD16 width,
- CARD16 height,
- CARD16 stride,
- CARD8 depth,
- CARD8 bpp);
+extern _X_EXPORT PixmapPtr glamor_egl_dri3_pixmap_from_fd(ScreenPtr screen,
+ int fd,
+ CARD16 width,
+ CARD16 height,
+ CARD16 stride,
+ CARD8 depth,
+ CARD8 bpp);
#ifdef GLAMOR_FOR_XORG
@@ -265,8 +266,7 @@ extern _X_EXPORT Bool glamor_egl_init_textured_pixmap(ScreenPtr screen);
* screen pixmap is a special, we handle it separately in this function.
*/
extern _X_EXPORT Bool glamor_egl_create_textured_screen(ScreenPtr screen,
- int handle,
- int stride);
+ int handle, int stride);
/* @glamor_egl_create_textured_screen_ext:
*
@@ -275,9 +275,10 @@ extern _X_EXPORT Bool glamor_egl_create_textured_screen(ScreenPtr screen,
* the DDX's close screen, we have to free all the glamor related resources.
*/
extern _X_EXPORT Bool glamor_egl_create_textured_screen_ext(ScreenPtr screen,
- int handle,
- int stride,
- PixmapPtr *back_pixmap);
+ int handle,
+ int stride,
+ PixmapPtr
+ *back_pixmap);
/*
* @glamor_egl_create_textured_pixmap: Try to create a textured pixmap from
@@ -292,8 +293,7 @@ extern _X_EXPORT Bool glamor_egl_create_textured_screen_ext(ScreenPtr screen,
* as well. Return true if successful, otherwise return FALSE.
*/
extern _X_EXPORT Bool glamor_egl_create_textured_pixmap(PixmapPtr pixmap,
- int handle,
- int stride);
+ int handle, int stride);
/*
* @glamor_egl_create_textured_pixmap_from_bo: Try to create a textured pixmap
@@ -305,8 +305,7 @@ extern _X_EXPORT Bool glamor_egl_create_textured_pixmap(PixmapPtr pixmap,
* This function is similar to glamor_egl_create_textured_pixmap.
*/
extern _X_EXPORT Bool
- glamor_egl_create_textured_pixmap_from_gbm_bo(PixmapPtr pixmap,
- void *bo);
+ glamor_egl_create_textured_pixmap_from_gbm_bo(PixmapPtr pixmap, void *bo);
#endif
@@ -314,119 +313,131 @@ extern _X_EXPORT void glamor_egl_destroy_textured_pixmap(PixmapPtr pixmap);
extern _X_EXPORT int glamor_create_gc(GCPtr gc);
-extern _X_EXPORT void glamor_validate_gc(GCPtr gc, unsigned long changes, DrawablePtr drawable);
+extern _X_EXPORT void glamor_validate_gc(GCPtr gc, unsigned long changes,
+ DrawablePtr drawable);
/* Glamor rendering/drawing functions with XXX_nf.
* nf means no fallback within glamor internal if possible. If glamor
* fail to accelerate the operation, glamor will return a false, and the
* caller need to implement fallback method. Return a true means the
* rendering request get done successfully. */
extern _X_EXPORT Bool glamor_fill_spans_nf(DrawablePtr drawable,
- GCPtr gc,
- int n, DDXPointPtr points,
- int *widths, int sorted);
+ GCPtr gc,
+ int n, DDXPointPtr points,
+ int *widths, int sorted);
extern _X_EXPORT Bool glamor_poly_fill_rect_nf(DrawablePtr drawable,
- GCPtr gc,
- int nrect,
- xRectangle * prect);
+ GCPtr gc,
+ int nrect, xRectangle *prect);
extern _X_EXPORT Bool glamor_put_image_nf(DrawablePtr drawable,
- GCPtr gc, int depth, int x, int y,
- int w, int h, int left_pad,
- int image_format, char *bits);
+ GCPtr gc, int depth, int x, int y,
+ int w, int h, int left_pad,
+ int image_format, char *bits);
extern _X_EXPORT Bool glamor_copy_n_to_n_nf(DrawablePtr src,
- DrawablePtr dst,
- GCPtr gc,
- BoxPtr box,
- int nbox,
- int dx,
- int dy,
- Bool reverse,
- Bool upsidedown, Pixel bitplane,
- void *closure);
+ DrawablePtr dst,
+ GCPtr gc,
+ BoxPtr box,
+ int nbox,
+ int dx,
+ int dy,
+ Bool reverse,
+ Bool upsidedown, Pixel bitplane,
+ void *closure);
extern _X_EXPORT Bool glamor_composite_nf(CARD8 op,
- PicturePtr source,
- PicturePtr mask,
- PicturePtr dest,
- INT16 x_source,
- INT16 y_source,
- INT16 x_mask,
- INT16 y_mask,
- INT16 x_dest, INT16 y_dest,
- CARD16 width, CARD16 height);
+ PicturePtr source,
+ PicturePtr mask,
+ PicturePtr dest,
+ INT16 x_source,
+ INT16 y_source,
+ INT16 x_mask,
+ INT16 y_mask,
+ INT16 x_dest, INT16 y_dest,
+ CARD16 width, CARD16 height);
extern _X_EXPORT Bool glamor_trapezoids_nf(CARD8 op,
- PicturePtr src, PicturePtr dst,
- PictFormatPtr mask_format,
- INT16 x_src, INT16 y_src,
- int ntrap, xTrapezoid * traps);
+ PicturePtr src, PicturePtr dst,
+ PictFormatPtr mask_format,
+ INT16 x_src, INT16 y_src,
+ int ntrap, xTrapezoid *traps);
extern _X_EXPORT Bool glamor_glyphs_nf(CARD8 op,
- PicturePtr src,
- PicturePtr dst,
- PictFormatPtr mask_format,
- INT16 x_src,
- INT16 y_src, int nlist,
- GlyphListPtr list, GlyphPtr * glyphs);
+ PicturePtr src,
+ PicturePtr dst,
+ PictFormatPtr mask_format,
+ INT16 x_src,
+ INT16 y_src, int nlist,
+ GlyphListPtr list, GlyphPtr *glyphs);
extern _X_EXPORT Bool glamor_triangles_nf(CARD8 op,
- PicturePtr pSrc,
- PicturePtr pDst,
- PictFormatPtr maskFormat,
- INT16 xSrc, INT16 ySrc,
- int ntris, xTriangle * tris);
-
+ PicturePtr pSrc,
+ PicturePtr pDst,
+ PictFormatPtr maskFormat,
+ INT16 xSrc, INT16 ySrc,
+ int ntris, xTriangle *tris);
extern _X_EXPORT void glamor_glyph_unrealize(ScreenPtr screen, GlyphPtr glyph);
-extern _X_EXPORT Bool glamor_set_spans_nf(DrawablePtr drawable, GCPtr gc, char *src,
- DDXPointPtr points, int *widths, int n, int sorted);
+extern _X_EXPORT Bool glamor_set_spans_nf(DrawablePtr drawable, GCPtr gc,
+ char *src, DDXPointPtr points,
+ int *widths, int n, int sorted);
extern _X_EXPORT Bool glamor_get_spans_nf(DrawablePtr drawable, int wmax,
- DDXPointPtr points, int *widths, int count, char *dst);
+ DDXPointPtr points, int *widths,
+ int count, char *dst);
-extern _X_EXPORT Bool glamor_composite_rects_nf (CARD8 op,
- PicturePtr pDst,
- xRenderColor *color,
- int nRect,
- xRectangle *rects);
+extern _X_EXPORT Bool glamor_composite_rects_nf(CARD8 op,
+ PicturePtr pDst,
+ xRenderColor *color,
+ int nRect, xRectangle *rects);
-extern _X_EXPORT Bool glamor_get_image_nf(DrawablePtr pDrawable, int x, int y, int w, int h,
- unsigned int format, unsigned long planeMask, char *d);
+extern _X_EXPORT Bool glamor_get_image_nf(DrawablePtr pDrawable, int x, int y,
+ int w, int h, unsigned int format,
+ unsigned long planeMask, char *d);
extern _X_EXPORT Bool glamor_add_traps_nf(PicturePtr pPicture,
- INT16 x_off,
- INT16 y_off, int ntrap, xTrap * traps);
-
-extern _X_EXPORT Bool glamor_copy_plane_nf(DrawablePtr pSrc, DrawablePtr pDst, GCPtr pGC,
- int srcx, int srcy, int w, int h, int dstx, int dsty,
- unsigned long bitPlane, RegionPtr *pRegion);
-
-extern _X_EXPORT Bool glamor_image_glyph_blt_nf(DrawablePtr pDrawable, GCPtr pGC,
- int x, int y, unsigned int nglyph,
- CharInfoPtr * ppci, pointer pglyphBase);
+ INT16 x_off,
+ INT16 y_off, int ntrap,
+ xTrap *traps);
+
+extern _X_EXPORT Bool glamor_copy_plane_nf(DrawablePtr pSrc, DrawablePtr pDst,
+ GCPtr pGC, int srcx, int srcy, int w,
+ int h, int dstx, int dsty,
+ unsigned long bitPlane,
+ RegionPtr *pRegion);
+
+extern _X_EXPORT Bool glamor_image_glyph_blt_nf(DrawablePtr pDrawable,
+ GCPtr pGC, int x, int y,
+ unsigned int nglyph,
+ CharInfoPtr *ppci,
+ void *pglyphBase);
extern _X_EXPORT Bool glamor_poly_glyph_blt_nf(DrawablePtr pDrawable, GCPtr pGC,
- int x, int y, unsigned int nglyph,
- CharInfoPtr * ppci, pointer pglyphBase);
+ int x, int y,
+ unsigned int nglyph,
+ CharInfoPtr *ppci,
+ void *pglyphBase);
extern _X_EXPORT Bool glamor_push_pixels_nf(GCPtr pGC, PixmapPtr pBitmap,
- DrawablePtr pDrawable, int w, int h, int x, int y);
+ DrawablePtr pDrawable, int w, int h,
+ int x, int y);
-extern _X_EXPORT Bool glamor_poly_point_nf(DrawablePtr pDrawable, GCPtr pGC, int mode, int npt,
- DDXPointPtr ppt);
+extern _X_EXPORT Bool glamor_poly_point_nf(DrawablePtr pDrawable, GCPtr pGC,
+ int mode, int npt, DDXPointPtr ppt);
-extern _X_EXPORT Bool glamor_poly_segment_nf(DrawablePtr pDrawable, GCPtr pGC, int nseg,
- xSegment *pSeg);
+extern _X_EXPORT Bool glamor_poly_segment_nf(DrawablePtr pDrawable, GCPtr pGC,
+ int nseg, xSegment *pSeg);
-extern _X_EXPORT Bool glamor_poly_line_nf(DrawablePtr pDrawable, GCPtr pGC, int mode, int npt,
- DDXPointPtr ppt);
+extern _X_EXPORT Bool glamor_poly_line_nf(DrawablePtr pDrawable, GCPtr pGC,
+ int mode, int npt, DDXPointPtr ppt);
-extern _X_EXPORT Bool glamor_poly_lines_nf(DrawablePtr drawable, GCPtr gc, int mode, int n,
- DDXPointPtr points);
+extern _X_EXPORT Bool glamor_poly_lines_nf(DrawablePtr drawable, GCPtr gc,
+ int mode, int n, DDXPointPtr points);
-extern _X_EXPORT XF86VideoAdaptorPtr glamor_xv_init(ScreenPtr pScreen, int num_texture_ports);
+#if 0
+extern _X_EXPORT XF86VideoAdaptorPtr glamor_xv_init(ScreenPtr pScreen,
+ int num_texture_ports);
+#endif
-#endif /* GLAMOR_H */
+#endif /* GLAMOR_H */
diff --git a/xorg-server/glamor/glamor_addtraps.c b/xorg-server/glamor/glamor_addtraps.c
index ac852963c..655d87e3d 100644
--- a/xorg-server/glamor/glamor_addtraps.c
+++ b/xorg-server/glamor/glamor_addtraps.c
@@ -30,36 +30,32 @@
static Bool
_glamor_add_traps(PicturePtr pPicture,
- INT16 x_off,
- INT16 y_off, int ntrap, xTrap * traps,
- Bool fallback)
+ INT16 x_off,
+ INT16 y_off, int ntrap, xTrap *traps, Bool fallback)
{
- if (!fallback
- && ( !pPicture->pDrawable
- || glamor_ddx_fallback_check_pixmap(pPicture->pDrawable)))
- return FALSE;
+ if (!fallback
+ && (!pPicture->pDrawable
+ || glamor_ddx_fallback_check_pixmap(pPicture->pDrawable)))
+ return FALSE;
- if (glamor_prepare_access_picture(pPicture, GLAMOR_ACCESS_RW)) {
- fbAddTraps(pPicture, x_off, y_off, ntrap, traps);
- glamor_finish_access_picture(pPicture, GLAMOR_ACCESS_RW);
- }
+ if (glamor_prepare_access_picture(pPicture, GLAMOR_ACCESS_RW)) {
+ fbAddTraps(pPicture, x_off, y_off, ntrap, traps);
+ glamor_finish_access_picture(pPicture, GLAMOR_ACCESS_RW);
+ }
- return TRUE;
+ return TRUE;
}
void
glamor_add_traps(PicturePtr pPicture,
- INT16 x_off,
- INT16 y_off, int ntrap, xTrap * traps)
+ INT16 x_off, INT16 y_off, int ntrap, xTrap *traps)
{
- _glamor_add_traps(pPicture, x_off, y_off, ntrap, traps, TRUE);
+ _glamor_add_traps(pPicture, x_off, y_off, ntrap, traps, TRUE);
}
Bool
glamor_add_traps_nf(PicturePtr pPicture,
- INT16 x_off,
- INT16 y_off, int ntrap, xTrap * traps)
+ INT16 x_off, INT16 y_off, int ntrap, xTrap *traps)
{
- return _glamor_add_traps(pPicture, x_off, y_off, ntrap, traps, FALSE);
+ return _glamor_add_traps(pPicture, x_off, y_off, ntrap, traps, FALSE);
}
-
diff --git a/xorg-server/glamor/glamor_compositerects.c b/xorg-server/glamor/glamor_compositerects.c
index 1a5769958..3b6b2ed07 100644
--- a/xorg-server/glamor/glamor_compositerects.c
+++ b/xorg-server/glamor/glamor_compositerects.c
@@ -36,243 +36,241 @@
* compositeRects acceleration implementation
*/
-static int16_t bound(int16_t a, uint16_t b)
+static int16_t
+bound(int16_t a, uint16_t b)
{
- int v = (int)a + (int)b;
- if (v > MAXSHORT)
- return MAXSHORT;
- return v;
+ int v = (int) a + (int) b;
+
+ if (v > MAXSHORT)
+ return MAXSHORT;
+ return v;
}
static Bool
-_pixman_region_init_clipped_rectangles(pixman_region16_t *region,
- unsigned int num_rects,
- xRectangle *rects,
- int tx, int ty,
- BoxPtr extents)
+_pixman_region_init_clipped_rectangles(pixman_region16_t * region,
+ unsigned int num_rects,
+ xRectangle *rects,
+ int tx, int ty, BoxPtr extents)
{
- pixman_box16_t stack_boxes[64], *boxes = stack_boxes;
- pixman_bool_t ret;
- unsigned int i, j;
-
- if (num_rects > ARRAY_SIZE(stack_boxes)) {
- boxes = malloc(sizeof(pixman_box16_t) * num_rects);
- if (boxes == NULL)
- return FALSE;
- }
-
- for (i = j = 0; i < num_rects; i++) {
- boxes[j].x1 = rects[i].x + tx;
- if (boxes[j].x1 < extents->x1)
- boxes[j].x1 = extents->x1;
-
- boxes[j].y1 = rects[i].y + ty;
- if (boxes[j].y1 < extents->y1)
- boxes[j].y1 = extents->y1;
-
- boxes[j].x2 = bound(rects[i].x + tx, rects[i].width);
- if (boxes[j].x2 > extents->x2)
- boxes[j].x2 = extents->x2;
-
- boxes[j].y2 = bound(rects[i].y + ty, rects[i].height);
- if (boxes[j].y2 > extents->y2)
- boxes[j].y2 = extents->y2;
-
- if (boxes[j].x2 > boxes[j].x1 && boxes[j].y2 > boxes[j].y1)
- j++;
- }
-
- ret = FALSE;
- if (j)
- ret = pixman_region_init_rects(region, boxes, j);
-
- if (boxes != stack_boxes)
- free(boxes);
-
- DEBUGF("%s: nrects=%d, region=(%d, %d), (%d, %d) x %d\n",
- __FUNCTION__, num_rects,
- region->extents.x1, region->extents.y1,
- region->extents.x2, region->extents.y2,
- j);
- return ret;
+ pixman_box16_t stack_boxes[64], *boxes = stack_boxes;
+ pixman_bool_t ret;
+ unsigned int i, j;
+
+ if (num_rects > ARRAY_SIZE(stack_boxes)) {
+ boxes = malloc(sizeof(pixman_box16_t) * num_rects);
+ if (boxes == NULL)
+ return FALSE;
+ }
+
+ for (i = j = 0; i < num_rects; i++) {
+ boxes[j].x1 = rects[i].x + tx;
+ if (boxes[j].x1 < extents->x1)
+ boxes[j].x1 = extents->x1;
+
+ boxes[j].y1 = rects[i].y + ty;
+ if (boxes[j].y1 < extents->y1)
+ boxes[j].y1 = extents->y1;
+
+ boxes[j].x2 = bound(rects[i].x + tx, rects[i].width);
+ if (boxes[j].x2 > extents->x2)
+ boxes[j].x2 = extents->x2;
+
+ boxes[j].y2 = bound(rects[i].y + ty, rects[i].height);
+ if (boxes[j].y2 > extents->y2)
+ boxes[j].y2 = extents->y2;
+
+ if (boxes[j].x2 > boxes[j].x1 && boxes[j].y2 > boxes[j].y1)
+ j++;
+ }
+
+ ret = FALSE;
+ if (j)
+ ret = pixman_region_init_rects(region, boxes, j);
+
+ if (boxes != stack_boxes)
+ free(boxes);
+
+ DEBUGF("%s: nrects=%d, region=(%d, %d), (%d, %d) x %d\n",
+ __FUNCTION__, num_rects,
+ region->extents.x1, region->extents.y1,
+ region->extents.x2, region->extents.y2, j);
+ return ret;
}
-
void
-glamor_composite_rectangles(CARD8 op,
- PicturePtr dst,
- xRenderColor *color,
- int num_rects,
- xRectangle *rects)
+glamor_composite_rectangles(CARD8 op,
+ PicturePtr dst,
+ xRenderColor * color,
+ int num_rects, xRectangle *rects)
{
- PixmapPtr pixmap;
- struct glamor_pixmap_private *priv;
- pixman_region16_t region;
- pixman_box16_t *boxes;
- int dst_x, dst_y;
- int num_boxes;
- PicturePtr source = NULL;
- Bool need_free_region = FALSE;
-
- DEBUGF("%s(op=%d, %08x x %d [(%d, %d)x(%d, %d) ...])\n",
- __FUNCTION__, op,
- (color->alpha >> 8 << 24) |
- (color->red >> 8 << 16) |
- (color->green >> 8 << 8) |
- (color->blue >> 8 << 0),
- num_rects,
- rects[0].x, rects[0].y, rects[0].width, rects[0].height);
-
- if (!num_rects)
- return;
-
- if (region_is_empty(dst->pCompositeClip)) {
- DEBUGF("%s: empty clip, skipping\n", __FUNCTION__);
- return;
- }
-
- if ((color->red|color->green|color->blue|color->alpha) <= 0x00ff) {
- switch (op) {
- case PictOpOver:
- case PictOpOutReverse:
- case PictOpAdd:
- return;
- case PictOpInReverse:
- case PictOpSrc:
- op = PictOpClear;
- break;
- case PictOpAtopReverse:
- op = PictOpOut;
- break;
- case PictOpXor:
- op = PictOpOverReverse;
- break;
- }
- }
- if (color->alpha <= 0x00ff) {
- switch (op) {
- case PictOpOver:
- case PictOpOutReverse:
- return;
- case PictOpInReverse:
- op = PictOpClear;
- break;
- case PictOpAtopReverse:
- op = PictOpOut;
- break;
- case PictOpXor:
- op = PictOpOverReverse;
- break;
- }
- } else if (color->alpha >= 0xff00) {
- switch (op) {
- case PictOpOver:
- op = PictOpSrc;
- break;
- case PictOpInReverse:
- return;
- case PictOpOutReverse:
- op = PictOpClear;
- break;
- case PictOpAtopReverse:
- op = PictOpOverReverse;
- break;
- case PictOpXor:
- op = PictOpOut;
- break;
- }
- }
- DEBUGF("%s: converted to op %d\n", __FUNCTION__, op);
-
- if (!_pixman_region_init_clipped_rectangles(&region,
- num_rects, rects,
- dst->pDrawable->x,
- dst->pDrawable->y,
- &dst->pCompositeClip->extents))
- {
- DEBUGF("%s: allocation failed for region\n", __FUNCTION__);
- return;
- }
-
- pixmap = glamor_get_drawable_pixmap(dst->pDrawable);
- priv = glamor_get_pixmap_private(pixmap);
-
- if (!GLAMOR_PIXMAP_PRIV_HAS_FBO(priv))
- goto fallback;
- if (dst->alphaMap) {
- DEBUGF("%s: fallback, dst has an alpha-map\n", __FUNCTION__);
- goto fallback;
- }
-
- need_free_region = TRUE;
-
- DEBUGF("%s: drawable extents (%d, %d),(%d, %d) x %d\n",
- __FUNCTION__,
- RegionExtents(&region)->x1, RegionExtents(&region)->y1,
- RegionExtents(&region)->x2, RegionExtents(&region)->y2,
- RegionNumRects(&region));
-
- if (dst->pCompositeClip->data &&
- (!pixman_region_intersect(&region, &region, dst->pCompositeClip) ||
- region_is_empty(&region))) {
- DEBUGF("%s: zero-intersection between rectangles and clip\n",
- __FUNCTION__);
- pixman_region_fini(&region);
- return;
- }
-
- DEBUGF("%s: clipped extents (%d, %d),(%d, %d) x %d\n",
- __FUNCTION__,
- RegionExtents(&region)->x1, RegionExtents(&region)->y1,
- RegionExtents(&region)->x2, RegionExtents(&region)->y2,
- RegionNumRects(&region));
-
- glamor_get_drawable_deltas(dst->pDrawable, pixmap, &dst_x, &dst_y);
- pixman_region_translate(&region, dst_x, dst_y);
-
- DEBUGF("%s: pixmap +(%d, %d) extents (%d, %d),(%d, %d)\n",
- __FUNCTION__, dst_x, dst_y,
- RegionExtents(&region)->x1, RegionExtents(&region)->y1,
- RegionExtents(&region)->x2, RegionExtents(&region)->y2);
-
-
- boxes = pixman_region_rectangles(&region, &num_boxes);
- if (op == PictOpSrc || op == PictOpClear) {
- CARD32 pixel;
- if (op == PictOpClear)
- pixel = 0;
- else
- miRenderColorToPixel(dst->pFormat, color, &pixel);
- glamor_solid_boxes(pixmap, boxes, num_boxes, pixel);
-
- goto done;
- } else {
- if (likely(priv->type != GLAMOR_TEXTURE_LARGE)) {
- int error;
-
- source = CreateSolidPicture(0, color, &error);
- if (!source)
- goto done;
- if (glamor_composite_clipped_region(op, source,
- NULL, dst,
- NULL, NULL, priv,
- &region,
- 0,0,0,0,0,0))
- goto done;
- }
- }
-fallback:
- miCompositeRects(op, dst, color, num_rects, rects);
-done:
- /* XXX xserver-1.8: CompositeRects is not tracked by Damage, so we must
- * manually append the damaged regions ourselves.
- */
- DamageRegionAppend(&pixmap->drawable, &region);
- DamageRegionProcessPending(&pixmap->drawable);
-
- if (need_free_region)
- pixman_region_fini(&region);
- if (source)
- FreePicture(source, 0);
- return;
+ PixmapPtr pixmap;
+ struct glamor_pixmap_private *priv;
+ pixman_region16_t region;
+ pixman_box16_t *boxes;
+ int dst_x, dst_y;
+ int num_boxes;
+ PicturePtr source = NULL;
+ Bool need_free_region = FALSE;
+
+ DEBUGF("%s(op=%d, %08x x %d [(%d, %d)x(%d, %d) ...])\n",
+ __FUNCTION__, op,
+ (color->alpha >> 8 << 24) |
+ (color->red >> 8 << 16) |
+ (color->green >> 8 << 8) |
+ (color->blue >> 8 << 0),
+ num_rects, rects[0].x, rects[0].y, rects[0].width, rects[0].height);
+
+ if (!num_rects)
+ return;
+
+ if (RegionNil(dst->pCompositeClip)) {
+ DEBUGF("%s: empty clip, skipping\n", __FUNCTION__);
+ return;
+ }
+
+ if ((color->red | color->green | color->blue | color->alpha) <= 0x00ff) {
+ switch (op) {
+ case PictOpOver:
+ case PictOpOutReverse:
+ case PictOpAdd:
+ return;
+ case PictOpInReverse:
+ case PictOpSrc:
+ op = PictOpClear;
+ break;
+ case PictOpAtopReverse:
+ op = PictOpOut;
+ break;
+ case PictOpXor:
+ op = PictOpOverReverse;
+ break;
+ }
+ }
+ if (color->alpha <= 0x00ff) {
+ switch (op) {
+ case PictOpOver:
+ case PictOpOutReverse:
+ return;
+ case PictOpInReverse:
+ op = PictOpClear;
+ break;
+ case PictOpAtopReverse:
+ op = PictOpOut;
+ break;
+ case PictOpXor:
+ op = PictOpOverReverse;
+ break;
+ }
+ }
+ else if (color->alpha >= 0xff00) {
+ switch (op) {
+ case PictOpOver:
+ op = PictOpSrc;
+ break;
+ case PictOpInReverse:
+ return;
+ case PictOpOutReverse:
+ op = PictOpClear;
+ break;
+ case PictOpAtopReverse:
+ op = PictOpOverReverse;
+ break;
+ case PictOpXor:
+ op = PictOpOut;
+ break;
+ }
+ }
+ DEBUGF("%s: converted to op %d\n", __FUNCTION__, op);
+
+ if (!_pixman_region_init_clipped_rectangles(&region,
+ num_rects, rects,
+ dst->pDrawable->x,
+ dst->pDrawable->y,
+ &dst->pCompositeClip->extents))
+ {
+ DEBUGF("%s: allocation failed for region\n", __FUNCTION__);
+ return;
+ }
+
+ pixmap = glamor_get_drawable_pixmap(dst->pDrawable);
+ priv = glamor_get_pixmap_private(pixmap);
+
+ if (!GLAMOR_PIXMAP_PRIV_HAS_FBO(priv))
+ goto fallback;
+ if (dst->alphaMap) {
+ DEBUGF("%s: fallback, dst has an alpha-map\n", __FUNCTION__);
+ goto fallback;
+ }
+
+ need_free_region = TRUE;
+
+ DEBUGF("%s: drawable extents (%d, %d),(%d, %d) x %d\n",
+ __FUNCTION__,
+ RegionExtents(&region)->x1, RegionExtents(&region)->y1,
+ RegionExtents(&region)->x2, RegionExtents(&region)->y2,
+ RegionNumRects(&region));
+
+ if (dst->pCompositeClip->data &&
+ (!pixman_region_intersect(&region, &region, dst->pCompositeClip) ||
+ RegionNil(&region))) {
+ DEBUGF("%s: zero-intersection between rectangles and clip\n",
+ __FUNCTION__);
+ pixman_region_fini(&region);
+ return;
+ }
+
+ DEBUGF("%s: clipped extents (%d, %d),(%d, %d) x %d\n",
+ __FUNCTION__,
+ RegionExtents(&region)->x1, RegionExtents(&region)->y1,
+ RegionExtents(&region)->x2, RegionExtents(&region)->y2,
+ RegionNumRects(&region));
+
+ glamor_get_drawable_deltas(dst->pDrawable, pixmap, &dst_x, &dst_y);
+ pixman_region_translate(&region, dst_x, dst_y);
+
+ DEBUGF("%s: pixmap +(%d, %d) extents (%d, %d),(%d, %d)\n",
+ __FUNCTION__, dst_x, dst_y,
+ RegionExtents(&region)->x1, RegionExtents(&region)->y1,
+ RegionExtents(&region)->x2, RegionExtents(&region)->y2);
+
+ boxes = pixman_region_rectangles(&region, &num_boxes);
+ if (op == PictOpSrc || op == PictOpClear) {
+ CARD32 pixel;
+
+ if (op == PictOpClear)
+ pixel = 0;
+ else
+ miRenderColorToPixel(dst->pFormat, color, &pixel);
+ glamor_solid_boxes(pixmap, boxes, num_boxes, pixel);
+
+ goto done;
+ }
+ else {
+ if (_X_LIKELY(priv->type != GLAMOR_TEXTURE_LARGE)) {
+ int error;
+
+ source = CreateSolidPicture(0, color, &error);
+ if (!source)
+ goto done;
+ if (glamor_composite_clipped_region(op, source,
+ NULL, dst,
+ NULL, NULL, priv,
+ &region, 0, 0, 0, 0, 0, 0))
+ goto done;
+ }
+ }
+ fallback:
+ miCompositeRects(op, dst, color, num_rects, rects);
+ done:
+ /* XXX xserver-1.8: CompositeRects is not tracked by Damage, so we must
+ * manually append the damaged regions ourselves.
+ */
+ DamageRegionAppend(&pixmap->drawable, &region);
+ DamageRegionProcessPending(&pixmap->drawable);
+
+ if (need_free_region)
+ pixman_region_fini(&region);
+ if (source)
+ FreePicture(source, 0);
+ return;
}
diff --git a/xorg-server/glamor/glamor_copyarea.c b/xorg-server/glamor/glamor_copyarea.c
index 4e6f953d2..2735ba0bc 100644
--- a/xorg-server/glamor/glamor_copyarea.c
+++ b/xorg-server/glamor/glamor_copyarea.c
@@ -34,643 +34,624 @@
#ifndef GLAMOR_GLES2
static Bool
glamor_copy_n_to_n_fbo_blit(DrawablePtr src,
- DrawablePtr dst,
- GCPtr gc, BoxPtr box, int nbox, int dx, int dy)
+ DrawablePtr dst,
+ GCPtr gc, BoxPtr box, int nbox, int dx, int dy)
{
- ScreenPtr screen = dst->pScreen;
- PixmapPtr dst_pixmap = glamor_get_drawable_pixmap(dst);
- PixmapPtr src_pixmap = glamor_get_drawable_pixmap(src);
- glamor_pixmap_private *src_pixmap_priv, *dst_pixmap_priv;
- glamor_screen_private *glamor_priv =
- glamor_get_screen_private(screen);
- glamor_gl_dispatch *dispatch;
- int dst_x_off, dst_y_off, src_x_off, src_y_off, i;
- int fbo_x_off, fbo_y_off;
- int src_fbo_x_off, src_fbo_y_off;
-
- if (!glamor_priv->has_fbo_blit) {
- glamor_delayed_fallback(screen,
- "no EXT_framebuffer_blit\n");
- return FALSE;
- }
- src_pixmap_priv = glamor_get_pixmap_private(src_pixmap);
- dst_pixmap_priv = glamor_get_pixmap_private(dst_pixmap);
-
- if (gc) {
- if (gc->alu != GXcopy) {
- glamor_delayed_fallback(screen, "non-copy ALU\n");
- return FALSE;
- }
- }
-
- if (!GLAMOR_PIXMAP_PRIV_HAS_FBO(src_pixmap_priv)) {
- glamor_delayed_fallback(screen, "no src fbo\n");
- return FALSE;
- }
-
- if (glamor_set_destination_pixmap(dst_pixmap))
- return FALSE;
-
- pixmap_priv_get_fbo_off(dst_pixmap_priv, &fbo_x_off, &fbo_y_off);
- pixmap_priv_get_fbo_off(src_pixmap_priv, &src_fbo_x_off, &src_fbo_y_off);
-
- dispatch = glamor_get_dispatch(glamor_priv);
- dispatch->glBindFramebuffer(GL_READ_FRAMEBUFFER_EXT,
- src_pixmap_priv->base.fbo->fb);
- glamor_get_drawable_deltas(dst, dst_pixmap, &dst_x_off,
- &dst_y_off);
- glamor_get_drawable_deltas(src, src_pixmap, &src_x_off,
- &src_y_off);
- dst_x_off += fbo_x_off;
- dst_y_off += fbo_y_off;
- src_y_off += dy + src_fbo_y_off;
- src_x_off += src_fbo_x_off;
-
- for (i = 0; i < nbox; i++) {
- if (glamor_priv->yInverted) {
- dispatch->glBlitFramebuffer((box[i].x1 + dx +
- src_x_off),
- (box[i].y1 +
- src_y_off),
- (box[i].x2 + dx +
- src_x_off),
- (box[i].y2 +
- src_y_off),
- (box[i].x1 +
- dst_x_off),
- (box[i].y1 +
- dst_y_off),
- (box[i].x2 +
- dst_x_off),
- (box[i].y2 +
- dst_y_off),
- GL_COLOR_BUFFER_BIT,
- GL_NEAREST);
- } else {
- int flip_dst_y1 =
- dst_pixmap->drawable.height - (box[i].y2 +
- dst_y_off);
- int flip_dst_y2 =
- dst_pixmap->drawable.height - (box[i].y1 +
- dst_y_off);
- int flip_src_y1 =
- src_pixmap->drawable.height - (box[i].y2 +
- src_y_off);
- int flip_src_y2 =
- src_pixmap->drawable.height - (box[i].y1 +
- src_y_off);
-
- dispatch->glBlitFramebuffer(box[i].x1 + dx +
- src_x_off,
- flip_src_y1,
- box[i].x2 + dx +
- src_x_off,
- flip_src_y2,
- box[i].x1 +
- dst_x_off,
- flip_dst_y1,
- box[i].x2 +
- dst_x_off,
- flip_dst_y2,
- GL_COLOR_BUFFER_BIT,
- GL_NEAREST);
- }
- }
- glamor_put_dispatch(glamor_priv);
- glamor_priv->state = BLIT_STATE;
- return TRUE;
+ ScreenPtr screen = dst->pScreen;
+ PixmapPtr dst_pixmap = glamor_get_drawable_pixmap(dst);
+ PixmapPtr src_pixmap = glamor_get_drawable_pixmap(src);
+ glamor_pixmap_private *src_pixmap_priv, *dst_pixmap_priv;
+ glamor_screen_private *glamor_priv = glamor_get_screen_private(screen);
+ glamor_gl_dispatch *dispatch;
+ int dst_x_off, dst_y_off, src_x_off, src_y_off, i;
+ int fbo_x_off, fbo_y_off;
+ int src_fbo_x_off, src_fbo_y_off;
+
+ if (!glamor_priv->has_fbo_blit) {
+ glamor_delayed_fallback(screen, "no EXT_framebuffer_blit\n");
+ return FALSE;
+ }
+ src_pixmap_priv = glamor_get_pixmap_private(src_pixmap);
+ dst_pixmap_priv = glamor_get_pixmap_private(dst_pixmap);
+
+ if (gc) {
+ if (gc->alu != GXcopy) {
+ glamor_delayed_fallback(screen, "non-copy ALU\n");
+ return FALSE;
+ }
+ }
+
+ if (!GLAMOR_PIXMAP_PRIV_HAS_FBO(src_pixmap_priv)) {
+ glamor_delayed_fallback(screen, "no src fbo\n");
+ return FALSE;
+ }
+
+ if (glamor_set_destination_pixmap(dst_pixmap))
+ return FALSE;
+
+ pixmap_priv_get_fbo_off(dst_pixmap_priv, &fbo_x_off, &fbo_y_off);
+ pixmap_priv_get_fbo_off(src_pixmap_priv, &src_fbo_x_off, &src_fbo_y_off);
+
+ dispatch = glamor_get_dispatch(glamor_priv);
+ dispatch->glBindFramebuffer(GL_READ_FRAMEBUFFER_EXT,
+ src_pixmap_priv->base.fbo->fb);
+ glamor_get_drawable_deltas(dst, dst_pixmap, &dst_x_off, &dst_y_off);
+ glamor_get_drawable_deltas(src, src_pixmap, &src_x_off, &src_y_off);
+ dst_x_off += fbo_x_off;
+ dst_y_off += fbo_y_off;
+ src_y_off += dy + src_fbo_y_off;
+ src_x_off += src_fbo_x_off;
+
+ for (i = 0; i < nbox; i++) {
+ if (glamor_priv->yInverted) {
+ dispatch->glBlitFramebuffer((box[i].x1 + dx +
+ src_x_off),
+ (box[i].y1 +
+ src_y_off),
+ (box[i].x2 + dx +
+ src_x_off),
+ (box[i].y2 +
+ src_y_off),
+ (box[i].x1 +
+ dst_x_off),
+ (box[i].y1 +
+ dst_y_off),
+ (box[i].x2 +
+ dst_x_off),
+ (box[i].y2 +
+ dst_y_off),
+ GL_COLOR_BUFFER_BIT, GL_NEAREST);
+ }
+ else {
+ int flip_dst_y1 =
+ dst_pixmap->drawable.height - (box[i].y2 + dst_y_off);
+ int flip_dst_y2 =
+ dst_pixmap->drawable.height - (box[i].y1 + dst_y_off);
+ int flip_src_y1 =
+ src_pixmap->drawable.height - (box[i].y2 + src_y_off);
+ int flip_src_y2 =
+ src_pixmap->drawable.height - (box[i].y1 + src_y_off);
+
+ dispatch->glBlitFramebuffer(box[i].x1 + dx +
+ src_x_off,
+ flip_src_y1,
+ box[i].x2 + dx +
+ src_x_off,
+ flip_src_y2,
+ box[i].x1 +
+ dst_x_off,
+ flip_dst_y1,
+ box[i].x2 +
+ dst_x_off,
+ flip_dst_y2,
+ GL_COLOR_BUFFER_BIT, GL_NEAREST);
+ }
+ }
+ glamor_put_dispatch(glamor_priv);
+ glamor_priv->state = BLIT_STATE;
+ return TRUE;
}
#endif
static Bool
glamor_copy_n_to_n_textured(DrawablePtr src,
- DrawablePtr dst,
- GCPtr gc, BoxPtr box, int nbox, int dx, int dy)
+ DrawablePtr dst,
+ GCPtr gc, BoxPtr box, int nbox, int dx, int dy)
{
- glamor_screen_private *glamor_priv =
- glamor_get_screen_private(dst->pScreen);
- glamor_gl_dispatch *dispatch;
- PixmapPtr src_pixmap = glamor_get_drawable_pixmap(src);
- PixmapPtr dst_pixmap = glamor_get_drawable_pixmap(dst);
- int i;
- float vertices[8], texcoords[8];
- glamor_pixmap_private *src_pixmap_priv;
- glamor_pixmap_private *dst_pixmap_priv;
- int src_x_off, src_y_off, dst_x_off, dst_y_off;
- enum glamor_pixmap_status src_status = GLAMOR_NONE;
- GLfloat dst_xscale, dst_yscale, src_xscale, src_yscale;
-
- src_pixmap_priv = glamor_get_pixmap_private(src_pixmap);
- dst_pixmap_priv = glamor_get_pixmap_private(dst_pixmap);
-
- if (!src_pixmap_priv->base.gl_fbo) {
+ glamor_screen_private *glamor_priv =
+ glamor_get_screen_private(dst->pScreen);
+ glamor_gl_dispatch *dispatch;
+ PixmapPtr src_pixmap = glamor_get_drawable_pixmap(src);
+ PixmapPtr dst_pixmap = glamor_get_drawable_pixmap(dst);
+ int i;
+ float vertices[8], texcoords[8];
+ glamor_pixmap_private *src_pixmap_priv;
+ glamor_pixmap_private *dst_pixmap_priv;
+ int src_x_off, src_y_off, dst_x_off, dst_y_off;
+ enum glamor_pixmap_status src_status = GLAMOR_NONE;
+ GLfloat dst_xscale, dst_yscale, src_xscale, src_yscale;
+
+ src_pixmap_priv = glamor_get_pixmap_private(src_pixmap);
+ dst_pixmap_priv = glamor_get_pixmap_private(dst_pixmap);
+
+ if (!src_pixmap_priv->base.gl_fbo) {
#ifndef GLAMOR_PIXMAP_DYNAMIC_UPLOAD
- glamor_delayed_fallback(dst->pScreen, "src has no fbo.\n");
- return FALSE;
+ glamor_delayed_fallback(dst->pScreen, "src has no fbo.\n");
+ return FALSE;
#else
- src_status = glamor_upload_pixmap_to_texture(src_pixmap);
- if (src_status != GLAMOR_UPLOAD_DONE)
- return FALSE;
+ src_status = glamor_upload_pixmap_to_texture(src_pixmap);
+ if (src_status != GLAMOR_UPLOAD_DONE)
+ return FALSE;
- src_pixmap_priv = glamor_get_pixmap_private(src_pixmap);
+ src_pixmap_priv = glamor_get_pixmap_private(src_pixmap);
#endif
- }
+ }
+ pixmap_priv_get_dest_scale(dst_pixmap_priv, &dst_xscale, &dst_yscale);
+ pixmap_priv_get_scale(src_pixmap_priv, &src_xscale, &src_yscale);
- pixmap_priv_get_dest_scale(dst_pixmap_priv, &dst_xscale, &dst_yscale);
- pixmap_priv_get_scale(src_pixmap_priv, &src_xscale, &src_yscale);
+ glamor_get_drawable_deltas(dst, dst_pixmap, &dst_x_off, &dst_y_off);
- glamor_get_drawable_deltas(dst, dst_pixmap, &dst_x_off,
- &dst_y_off);
+ dispatch = glamor_get_dispatch(glamor_priv);
- dispatch = glamor_get_dispatch(glamor_priv);
+ glamor_set_destination_pixmap_priv_nc(dst_pixmap_priv);
+ dispatch->glVertexAttribPointer(GLAMOR_VERTEX_POS, 2, GL_FLOAT,
+ GL_FALSE, 2 * sizeof(float), vertices);
+ dispatch->glEnableVertexAttribArray(GLAMOR_VERTEX_POS);
+ glamor_get_drawable_deltas(src, src_pixmap, &src_x_off, &src_y_off);
+ dx += src_x_off;
+ dy += src_y_off;
- glamor_set_destination_pixmap_priv_nc(dst_pixmap_priv);
- dispatch->glVertexAttribPointer(GLAMOR_VERTEX_POS, 2, GL_FLOAT,
- GL_FALSE, 2 * sizeof(float),
- vertices);
- dispatch->glEnableVertexAttribArray(GLAMOR_VERTEX_POS);
-
- glamor_get_drawable_deltas(src, src_pixmap, &src_x_off,
- &src_y_off);
- dx += src_x_off;
- dy += src_y_off;
-
- dispatch->glActiveTexture(GL_TEXTURE0);
- dispatch->glBindTexture(GL_TEXTURE_2D,
- src_pixmap_priv->base.fbo->tex);
+ dispatch->glActiveTexture(GL_TEXTURE0);
+ dispatch->glBindTexture(GL_TEXTURE_2D, src_pixmap_priv->base.fbo->tex);
#ifndef GLAMOR_GLES2
- dispatch->glEnable(GL_TEXTURE_2D);
- dispatch->glTexParameteri(GL_TEXTURE_2D,
- GL_TEXTURE_WRAP_S,
- GL_CLAMP_TO_BORDER);
- dispatch->glTexParameteri(GL_TEXTURE_2D,
- GL_TEXTURE_WRAP_T,
- GL_CLAMP_TO_BORDER);
+ dispatch->glEnable(GL_TEXTURE_2D);
+ dispatch->glTexParameteri(GL_TEXTURE_2D,
+ GL_TEXTURE_WRAP_S, GL_CLAMP_TO_BORDER);
+ dispatch->glTexParameteri(GL_TEXTURE_2D,
+ GL_TEXTURE_WRAP_T, GL_CLAMP_TO_BORDER);
#endif
- dispatch->glTexParameteri(GL_TEXTURE_2D,
- GL_TEXTURE_MIN_FILTER,
- GL_NEAREST);
- dispatch->glTexParameteri(GL_TEXTURE_2D,
- GL_TEXTURE_MAG_FILTER,
- GL_NEAREST);
-
- dispatch->glVertexAttribPointer(GLAMOR_VERTEX_SOURCE, 2,
- GL_FLOAT, GL_FALSE,
- 2 * sizeof(float),
- texcoords);
- dispatch->glEnableVertexAttribArray(GLAMOR_VERTEX_SOURCE);
- dispatch->glUseProgram(glamor_priv->finish_access_prog[0]);
- dispatch->glUniform1i(glamor_priv->finish_access_revert[0],
- REVERT_NONE);
- dispatch->glUniform1i(glamor_priv->finish_access_swap_rb[0],
- SWAP_NONE_UPLOADING);
-
- for (i = 0; i < nbox; i++) {
-
- glamor_set_normalize_vcoords(dst_pixmap_priv,
- dst_xscale, dst_yscale,
- box[i].x1 + dst_x_off,
- box[i].y1 + dst_y_off,
- box[i].x2 + dst_x_off,
- box[i].y2 + dst_y_off,
- glamor_priv->yInverted,
- vertices);
-
- glamor_set_normalize_tcoords(src_pixmap_priv,
- src_xscale,
- src_yscale,
- box[i].x1 + dx,
- box[i].y1 + dy,
- box[i].x2 + dx,
- box[i].y2 + dy,
- glamor_priv->yInverted,
- texcoords);
- dispatch->glDrawArrays(GL_TRIANGLE_FAN, 0, 4);
- }
-
- dispatch->glDisableVertexAttribArray(GLAMOR_VERTEX_POS);
- dispatch->glDisableVertexAttribArray(GLAMOR_VERTEX_SOURCE);
+ dispatch->glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST);
+ dispatch->glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST);
+
+ dispatch->glVertexAttribPointer(GLAMOR_VERTEX_SOURCE, 2,
+ GL_FLOAT, GL_FALSE,
+ 2 * sizeof(float), texcoords);
+ dispatch->glEnableVertexAttribArray(GLAMOR_VERTEX_SOURCE);
+ dispatch->glUseProgram(glamor_priv->finish_access_prog[0]);
+ dispatch->glUniform1i(glamor_priv->finish_access_revert[0], REVERT_NONE);
+ dispatch->glUniform1i(glamor_priv->finish_access_swap_rb[0],
+ SWAP_NONE_UPLOADING);
+
+ for (i = 0; i < nbox; i++) {
+
+ glamor_set_normalize_vcoords(dst_pixmap_priv,
+ dst_xscale, dst_yscale,
+ box[i].x1 + dst_x_off,
+ box[i].y1 + dst_y_off,
+ box[i].x2 + dst_x_off,
+ box[i].y2 + dst_y_off,
+ glamor_priv->yInverted, vertices);
+
+ glamor_set_normalize_tcoords(src_pixmap_priv,
+ src_xscale,
+ src_yscale,
+ box[i].x1 + dx,
+ box[i].y1 + dy,
+ box[i].x2 + dx,
+ box[i].y2 + dy,
+ glamor_priv->yInverted, texcoords);
+ dispatch->glDrawArrays(GL_TRIANGLE_FAN, 0, 4);
+ }
+
+ dispatch->glDisableVertexAttribArray(GLAMOR_VERTEX_POS);
+ dispatch->glDisableVertexAttribArray(GLAMOR_VERTEX_SOURCE);
#ifndef GLAMOR_GLES2
- dispatch->glDisable(GL_TEXTURE_2D);
+ dispatch->glDisable(GL_TEXTURE_2D);
#endif
- dispatch->glUseProgram(0);
- /* The source texture is bound to a fbo, we have to flush it here. */
- glamor_put_dispatch(glamor_priv);
- glamor_priv->state = RENDER_STATE;
- glamor_priv->render_idle_cnt = 0;
- return TRUE;
+ dispatch->glUseProgram(0);
+ /* The source texture is bound to a fbo, we have to flush it here. */
+ glamor_put_dispatch(glamor_priv);
+ glamor_priv->state = RENDER_STATE;
+ glamor_priv->render_idle_cnt = 0;
+ return TRUE;
}
static Bool
__glamor_copy_n_to_n(DrawablePtr src,
- DrawablePtr dst,
- GCPtr gc,
- BoxPtr box,
- int nbox,
- int dx,
- int dy,
- Bool reverse,
- Bool upsidedown, Pixel bitplane,
- void *closure)
+ DrawablePtr dst,
+ GCPtr gc,
+ BoxPtr box,
+ int nbox,
+ int dx,
+ int dy,
+ Bool reverse,
+ Bool upsidedown, Pixel bitplane, void *closure)
{
- PixmapPtr dst_pixmap, src_pixmap, temp_pixmap = NULL;
- DrawablePtr temp_src = src;
- glamor_pixmap_private *dst_pixmap_priv, *src_pixmap_priv;
- glamor_screen_private *glamor_priv;
- BoxRec bound;
- ScreenPtr screen;
- int temp_dx = dx;
- int temp_dy = dy;
- int src_x_off, src_y_off, dst_x_off, dst_y_off;
- int i;
- int overlaped = 0;
- Bool ret = FALSE;
-
- dst_pixmap = glamor_get_drawable_pixmap(dst);
- dst_pixmap_priv = glamor_get_pixmap_private(dst_pixmap);
- src_pixmap = glamor_get_drawable_pixmap(src);
- src_pixmap_priv = glamor_get_pixmap_private(src_pixmap);
- screen = dst_pixmap->drawable.pScreen;
- glamor_priv = glamor_get_screen_private(dst->pScreen);
- glamor_get_drawable_deltas(src, src_pixmap, &src_x_off,
- &src_y_off);
-
- glamor_get_drawable_deltas(dst, dst_pixmap, &dst_x_off,
- &dst_y_off);
-
- if (src_pixmap_priv->base.fbo
- && src_pixmap_priv->base.fbo->fb == dst_pixmap_priv->base.fbo->fb) {
- int x_shift = abs(src_x_off - dx - dst_x_off);
- int y_shift = abs(src_y_off - dy - dst_y_off);
- for (i = 0; i < nbox; i++) {
- if (x_shift < abs(box[i].x2 - box[i].x1)
- && y_shift < abs(box[i].y2 - box[i].y1)) {
- overlaped = 1;
- break;
- }
- }
- }
- DEBUGF("Copy %d %d %dx%d dx %d dy %d from %p to %p \n",
- box[0].x1, box[0].y1,
- box[0].x2 - box[0].x1, box[0].y2 - box[0].y1,
- dx, dy,
- src_pixmap, dst_pixmap);
+ PixmapPtr dst_pixmap, src_pixmap, temp_pixmap = NULL;
+ DrawablePtr temp_src = src;
+ glamor_pixmap_private *dst_pixmap_priv, *src_pixmap_priv;
+ glamor_screen_private *glamor_priv;
+ BoxRec bound;
+ ScreenPtr screen;
+ int temp_dx = dx;
+ int temp_dy = dy;
+ int src_x_off, src_y_off, dst_x_off, dst_y_off;
+ int i;
+ int overlaped = 0;
+ Bool ret = FALSE;
+
+ dst_pixmap = glamor_get_drawable_pixmap(dst);
+ dst_pixmap_priv = glamor_get_pixmap_private(dst_pixmap);
+ src_pixmap = glamor_get_drawable_pixmap(src);
+ src_pixmap_priv = glamor_get_pixmap_private(src_pixmap);
+ screen = dst_pixmap->drawable.pScreen;
+ glamor_priv = glamor_get_screen_private(dst->pScreen);
+ glamor_get_drawable_deltas(src, src_pixmap, &src_x_off, &src_y_off);
+
+ glamor_get_drawable_deltas(dst, dst_pixmap, &dst_x_off, &dst_y_off);
+
+ if (src_pixmap_priv->base.fbo
+ && src_pixmap_priv->base.fbo->fb == dst_pixmap_priv->base.fbo->fb) {
+ int x_shift = abs(src_x_off - dx - dst_x_off);
+ int y_shift = abs(src_y_off - dy - dst_y_off);
+
+ for (i = 0; i < nbox; i++) {
+ if (x_shift < abs(box[i].x2 - box[i].x1)
+ && y_shift < abs(box[i].y2 - box[i].y1)) {
+ overlaped = 1;
+ break;
+ }
+ }
+ }
+ DEBUGF("Copy %d %d %dx%d dx %d dy %d from %p to %p \n",
+ box[0].x1, box[0].y1,
+ box[0].x2 - box[0].x1, box[0].y2 - box[0].y1,
+ dx, dy, src_pixmap, dst_pixmap);
#ifndef GLAMOR_GLES2
- if (!overlaped &&
- (glamor_priv->state != RENDER_STATE
- || !src_pixmap_priv->base.gl_tex || !dst_pixmap_priv->base.gl_tex)
- && glamor_copy_n_to_n_fbo_blit(src, dst, gc, box, nbox, dx,
- dy)) {
- ret = TRUE;
- goto done;
- }
+ if (!overlaped &&
+ (glamor_priv->state != RENDER_STATE
+ || !src_pixmap_priv->base.gl_tex || !dst_pixmap_priv->base.gl_tex)
+ && glamor_copy_n_to_n_fbo_blit(src, dst, gc, box, nbox, dx, dy)) {
+ ret = TRUE;
+ goto done;
+ }
#endif
- glamor_calculate_boxes_bound(&bound, box, nbox);
-
- /* Overlaped indicate the src and dst are the same pixmap. */
- if (overlaped || (!GLAMOR_PIXMAP_PRIV_HAS_FBO(src_pixmap_priv)
- && (((bound.x2 - bound.x1) * (bound.y2 - bound.y1)
- * 4 >
- src_pixmap->drawable.width *
- src_pixmap->drawable.height)
- || !(glamor_check_fbo_size(glamor_priv,
- src_pixmap->drawable.width,
- src_pixmap->drawable.height))))) {
-
- temp_pixmap = glamor_create_pixmap(screen,
- bound.x2 - bound.x1,
- bound.y2 - bound.y1,
- src_pixmap->
- drawable.depth,
- overlaped ? 0 :
- GLAMOR_CREATE_PIXMAP_CPU);
- assert(bound.x2 - bound.x1 <= glamor_priv->max_fbo_size);
- assert(bound.y2 - bound.y1 <= glamor_priv->max_fbo_size);
- if (!temp_pixmap)
- goto done;
- glamor_translate_boxes(box, nbox, -bound.x1, -bound.y1);
- temp_src = &temp_pixmap->drawable;
-
- if (overlaped)
- glamor_copy_n_to_n_textured(src, temp_src, gc, box,
- nbox,
- temp_dx + bound.x1,
- temp_dy + bound.y1);
- else
- fbCopyNtoN(src, temp_src, gc, box, nbox,
- temp_dx + bound.x1, temp_dy + bound.y1,
- reverse, upsidedown, bitplane, closure);
- glamor_translate_boxes(box, nbox, bound.x1, bound.y1);
- temp_dx = -bound.x1;
- temp_dy = -bound.y1;
- } else {
- temp_dx = dx;
- temp_dy = dy;
- temp_src = src;
- }
-
- if (glamor_copy_n_to_n_textured
- (temp_src, dst, gc, box, nbox, temp_dx, temp_dy)) {
- ret = TRUE;
- }
-done:
- if (temp_src != src)
- glamor_destroy_pixmap(temp_pixmap);
- return ret;
+ glamor_calculate_boxes_bound(&bound, box, nbox);
+
+ /* Overlaped indicate the src and dst are the same pixmap. */
+ if (overlaped || (!GLAMOR_PIXMAP_PRIV_HAS_FBO(src_pixmap_priv)
+ && (((bound.x2 - bound.x1) * (bound.y2 - bound.y1)
+ * 4 >
+ src_pixmap->drawable.width *
+ src_pixmap->drawable.height)
+ || !(glamor_check_fbo_size(glamor_priv,
+ src_pixmap->drawable.width,
+ src_pixmap->drawable.
+ height))))) {
+
+ temp_pixmap = glamor_create_pixmap(screen,
+ bound.x2 - bound.x1,
+ bound.y2 - bound.y1,
+ src_pixmap->drawable.depth,
+ overlaped ? 0 :
+ GLAMOR_CREATE_PIXMAP_CPU);
+ assert(bound.x2 - bound.x1 <= glamor_priv->max_fbo_size);
+ assert(bound.y2 - bound.y1 <= glamor_priv->max_fbo_size);
+ if (!temp_pixmap)
+ goto done;
+ glamor_translate_boxes(box, nbox, -bound.x1, -bound.y1);
+ temp_src = &temp_pixmap->drawable;
+
+ if (overlaped)
+ glamor_copy_n_to_n_textured(src, temp_src, gc, box,
+ nbox,
+ temp_dx + bound.x1, temp_dy + bound.y1);
+ else
+ fbCopyNtoN(src, temp_src, gc, box, nbox,
+ temp_dx + bound.x1, temp_dy + bound.y1,
+ reverse, upsidedown, bitplane, closure);
+ glamor_translate_boxes(box, nbox, bound.x1, bound.y1);
+ temp_dx = -bound.x1;
+ temp_dy = -bound.y1;
+ }
+ else {
+ temp_dx = dx;
+ temp_dy = dy;
+ temp_src = src;
+ }
+
+ if (glamor_copy_n_to_n_textured
+ (temp_src, dst, gc, box, nbox, temp_dx, temp_dy)) {
+ ret = TRUE;
+ }
+ done:
+ if (temp_src != src)
+ glamor_destroy_pixmap(temp_pixmap);
+ return ret;
}
static Bool
_glamor_copy_n_to_n(DrawablePtr src,
- DrawablePtr dst,
- GCPtr gc,
- BoxPtr box,
- int nbox,
- int dx,
- int dy,
- Bool reverse,
- Bool upsidedown, Pixel bitplane,
- void *closure, Bool fallback)
+ DrawablePtr dst,
+ GCPtr gc,
+ BoxPtr box,
+ int nbox,
+ int dx,
+ int dy,
+ Bool reverse,
+ Bool upsidedown, Pixel bitplane,
+ void *closure, Bool fallback)
{
- PixmapPtr dst_pixmap, src_pixmap;
- glamor_pixmap_private *dst_pixmap_priv, *src_pixmap_priv;
- glamor_screen_private *glamor_priv;
- glamor_gl_dispatch *dispatch;
- BoxPtr extent;
- RegionRec region;
- int src_x_off, src_y_off, dst_x_off, dst_y_off;
- Bool ok = FALSE;
- int force_clip = 0;
-
- if (nbox == 0)
- return TRUE;
- dst_pixmap = glamor_get_drawable_pixmap(dst);
- dst_pixmap_priv = glamor_get_pixmap_private(dst_pixmap);
- src_pixmap = glamor_get_drawable_pixmap(src);
- src_pixmap_priv = glamor_get_pixmap_private(src_pixmap);
-
- glamor_priv = glamor_get_screen_private(dst->pScreen);
-
- DEBUGF("Copy %d %d %dx%d dx %d dy %d from %p to %p \n",
- box[0].x1, box[0].y1,
- box[0].x2 - box[0].x1, box[0].y2 - box[0].y1,
- dx, dy,
- src_pixmap, dst_pixmap);
-
- if (!GLAMOR_PIXMAP_PRIV_HAS_FBO(dst_pixmap_priv))
- goto fall_back;
-
- if (gc) {
- if (!glamor_set_planemask(dst_pixmap, gc->planemask))
- goto fall_back;
- dispatch = glamor_get_dispatch(glamor_priv);
- if (!glamor_set_alu(dispatch, gc->alu)) {
- glamor_put_dispatch(glamor_priv);
- goto fail;
- }
- glamor_put_dispatch(glamor_priv);
- }
-
- if (!src_pixmap_priv) {
- glamor_set_pixmap_type(src_pixmap, GLAMOR_MEMORY);
- src_pixmap_priv = glamor_get_pixmap_private(src_pixmap);
- }
-
- glamor_get_drawable_deltas(src, src_pixmap, &src_x_off,
- &src_y_off);
- glamor_get_drawable_deltas(dst, dst_pixmap, &dst_x_off,
- &dst_y_off);
-
- RegionInitBoxes(&region, box, nbox);
- extent = RegionExtents(&region);
-
- if (!glamor_check_fbo_size(glamor_priv,
- extent->x2 - extent->x1, extent->y2 - extent->y1)
- && (src_pixmap_priv->type == GLAMOR_MEMORY
- || (src_pixmap_priv == dst_pixmap_priv))) {
- force_clip = 1;
- }
-
- if (force_clip || dst_pixmap_priv->type == GLAMOR_TEXTURE_LARGE
- || src_pixmap_priv->type == GLAMOR_TEXTURE_LARGE) {
- glamor_pixmap_clipped_regions *clipped_dst_regions;
- int n_dst_region, i, j;
- PixmapPtr temp_source_pixmap;
- glamor_pixmap_private *temp_source_priv = NULL;
-
- RegionTranslate(&region, dst_x_off, dst_y_off);
- if (!force_clip)
- clipped_dst_regions = glamor_compute_clipped_regions(dst_pixmap_priv,
- &region, &n_dst_region, 0,
- reverse, upsidedown);
- else
- clipped_dst_regions = glamor_compute_clipped_regions_ext(dst_pixmap_priv,
- &region, &n_dst_region,
- glamor_priv->max_fbo_size,
- glamor_priv->max_fbo_size,
- reverse, upsidedown);
- for(i = 0; i < n_dst_region; i++)
- {
- int n_src_region;
- glamor_pixmap_clipped_regions *clipped_src_regions;
- BoxPtr current_boxes;
- int n_current_boxes;
-
- SET_PIXMAP_FBO_CURRENT(dst_pixmap_priv, clipped_dst_regions[i].block_idx);
-
- temp_source_pixmap = NULL;
- if (src_pixmap_priv->type == GLAMOR_TEXTURE_LARGE) {
- RegionTranslate(clipped_dst_regions[i].region,
- -dst_x_off + src_x_off + dx, -dst_y_off + src_y_off + dy);
- clipped_src_regions = glamor_compute_clipped_regions(src_pixmap_priv,
- clipped_dst_regions[i].region,
- &n_src_region, 0,
- reverse, upsidedown);
- DEBUGF("Source is large pixmap.\n");
- for (j = 0; j < n_src_region; j++)
- {
- if (src_pixmap_priv != dst_pixmap_priv)
- SET_PIXMAP_FBO_CURRENT(src_pixmap_priv, clipped_src_regions[j].block_idx);
- else if (src_pixmap_priv == dst_pixmap_priv &&
- clipped_src_regions[j].block_idx != clipped_dst_regions[i].block_idx) {
- /* source and the dest are the same, but need different block_idx.
- * we create a empty pixmap and fill the required source fbo and box to
- * it. It's a little hacky, but avoid extra copy. */
- temp_source_pixmap = glamor_create_pixmap(src->pScreen, 0, 0,
- src->depth, 0);
- if (!temp_source_pixmap) {
- ok = FALSE;
- goto fail;
- }
- src->pScreen->ModifyPixmapHeader(temp_source_pixmap,
- src_pixmap->drawable.width,
- src_pixmap->drawable.height,
- 0, 0, src_pixmap->devKind, NULL);
- temp_source_priv = glamor_get_pixmap_private(temp_source_pixmap);
- *temp_source_priv = *src_pixmap_priv;
- temp_source_priv->large.box = src_pixmap_priv->large.box_array[clipped_src_regions[j].block_idx];
- temp_source_priv->base.fbo = src_pixmap_priv->large.fbo_array[clipped_src_regions[j].block_idx];
- temp_source_priv->base.pixmap = temp_source_pixmap;
- }
- assert(temp_source_pixmap || !(src_pixmap_priv == dst_pixmap_priv
- && (clipped_src_regions[j].block_idx != clipped_dst_regions[i].block_idx)));
-
- RegionTranslate(clipped_src_regions[j].region,
- -src_x_off - dx,
- -src_y_off - dy);
- current_boxes = RegionRects(clipped_src_regions[j].region);
- n_current_boxes = RegionNumRects(clipped_src_regions[j].region);
- DEBUGF("dst pixmap fbo idx %d src pixmap fbo idx %d \n",
- clipped_dst_regions[i].block_idx,
- clipped_src_regions[j].block_idx);
- DEBUGF("Copy %d %d %d %d dx %d dy %d from %p to %p \n",
- current_boxes[0].x1, current_boxes[0].y1,
- current_boxes[0].x2, current_boxes[0].y2,
- dx, dy, src_pixmap, dst_pixmap);
- if (!temp_source_pixmap)
- ok = __glamor_copy_n_to_n(src, dst, gc, current_boxes,
- n_current_boxes, dx, dy, reverse,
- upsidedown, bitplane, closure);
- else {
- ok = __glamor_copy_n_to_n(&temp_source_pixmap->drawable,
- dst, gc, current_boxes,
- n_current_boxes, dx, dy, reverse,
- upsidedown, bitplane, closure);
- temp_source_priv->type = GLAMOR_MEMORY;
- temp_source_priv->base.fbo = NULL;
- glamor_destroy_pixmap(temp_source_pixmap);
- temp_source_pixmap = NULL;
- }
-
- RegionDestroy(clipped_src_regions[j].region);
- if (!ok) {
- assert(0);
- goto fail;
- }
- }
-
- if (n_src_region == 0)
- ok = TRUE;
- free(clipped_src_regions);
- } else {
- RegionTranslate(clipped_dst_regions[i].region,
- - dst_x_off,
- - dst_y_off);
- current_boxes = RegionRects(clipped_dst_regions[i].region);
- n_current_boxes = RegionNumRects(clipped_dst_regions[i].region);
-
- DEBUGF("dest pixmap fbo idx %d \n",
- clipped_dst_regions[i].block_idx);
- DEBUGF("Copy %d %d %d %d dx %d dy %d from %p to %p \n",
- current_boxes[0].x1, current_boxes[0].y1,
- current_boxes[0].x2, current_boxes[0].y2,
- dx, dy, src_pixmap, dst_pixmap);
-
- ok = __glamor_copy_n_to_n(src, dst, gc, current_boxes,
- n_current_boxes, dx, dy, reverse,
- upsidedown, bitplane, closure);
-
- }
- RegionDestroy(clipped_dst_regions[i].region);
- }
- if (n_dst_region == 0)
- ok = TRUE;
- free(clipped_dst_regions);
- RegionUninit(&region);
- } else {
- ok = __glamor_copy_n_to_n(src, dst, gc, box, nbox, dx, dy,
- reverse, upsidedown, bitplane,
- closure);
- }
-
-fail:
- dispatch = glamor_get_dispatch(glamor_priv);
- glamor_set_alu(dispatch, GXcopy);
- glamor_put_dispatch(glamor_priv);
-
- if (ok)
- return TRUE;
-fall_back:
- if (!fallback
- && glamor_ddx_fallback_check_pixmap(src)
- && glamor_ddx_fallback_check_pixmap(dst))
- goto done;
-
- if (src_pixmap_priv->type == GLAMOR_DRM_ONLY
- || dst_pixmap_priv->type == GLAMOR_DRM_ONLY) {
- LogMessage(X_WARNING,
- "Access a DRM only pixmap is not allowed within glamor.\n");
- return TRUE;
- }
- glamor_report_delayed_fallbacks(src->pScreen);
- glamor_report_delayed_fallbacks(dst->pScreen);
-
- glamor_fallback("from %p to %p (%c,%c)\n", src, dst,
- glamor_get_drawable_location(src),
- glamor_get_drawable_location(dst));
-
- if (glamor_prepare_access(dst, GLAMOR_ACCESS_RW)) {
- if (dst == src
- || glamor_prepare_access(src, GLAMOR_ACCESS_RO)) {
- fbCopyNtoN(src, dst, gc, box, nbox,
- dx, dy, reverse, upsidedown, bitplane,
- closure);
- if (dst != src)
- glamor_finish_access(src, GLAMOR_ACCESS_RO);
- }
- glamor_finish_access(dst, GLAMOR_ACCESS_RW);
- }
- ok = TRUE;
-
- done:
- glamor_clear_delayed_fallbacks(src->pScreen);
- glamor_clear_delayed_fallbacks(dst->pScreen);
- return ok;
+ PixmapPtr dst_pixmap, src_pixmap;
+ glamor_pixmap_private *dst_pixmap_priv, *src_pixmap_priv;
+ glamor_screen_private *glamor_priv;
+ glamor_gl_dispatch *dispatch;
+ BoxPtr extent;
+ RegionRec region;
+ int src_x_off, src_y_off, dst_x_off, dst_y_off;
+ Bool ok = FALSE;
+ int force_clip = 0;
+
+ if (nbox == 0)
+ return TRUE;
+ dst_pixmap = glamor_get_drawable_pixmap(dst);
+ dst_pixmap_priv = glamor_get_pixmap_private(dst_pixmap);
+ src_pixmap = glamor_get_drawable_pixmap(src);
+ src_pixmap_priv = glamor_get_pixmap_private(src_pixmap);
+
+ glamor_priv = glamor_get_screen_private(dst->pScreen);
+
+ DEBUGF("Copy %d %d %dx%d dx %d dy %d from %p to %p \n",
+ box[0].x1, box[0].y1,
+ box[0].x2 - box[0].x1, box[0].y2 - box[0].y1,
+ dx, dy, src_pixmap, dst_pixmap);
+
+ if (!GLAMOR_PIXMAP_PRIV_HAS_FBO(dst_pixmap_priv))
+ goto fall_back;
+
+ if (gc) {
+ if (!glamor_set_planemask(dst_pixmap, gc->planemask))
+ goto fall_back;
+ dispatch = glamor_get_dispatch(glamor_priv);
+ if (!glamor_set_alu(dispatch, gc->alu)) {
+ glamor_put_dispatch(glamor_priv);
+ goto fail;
+ }
+ glamor_put_dispatch(glamor_priv);
+ }
+
+ if (!src_pixmap_priv) {
+ glamor_set_pixmap_type(src_pixmap, GLAMOR_MEMORY);
+ src_pixmap_priv = glamor_get_pixmap_private(src_pixmap);
+ }
+
+ glamor_get_drawable_deltas(src, src_pixmap, &src_x_off, &src_y_off);
+ glamor_get_drawable_deltas(dst, dst_pixmap, &dst_x_off, &dst_y_off);
+
+ RegionInitBoxes(&region, box, nbox);
+ extent = RegionExtents(&region);
+
+ if (!glamor_check_fbo_size(glamor_priv,
+ extent->x2 - extent->x1, extent->y2 - extent->y1)
+ && (src_pixmap_priv->type == GLAMOR_MEMORY
+ || (src_pixmap_priv == dst_pixmap_priv))) {
+ force_clip = 1;
+ }
+
+ if (force_clip || dst_pixmap_priv->type == GLAMOR_TEXTURE_LARGE
+ || src_pixmap_priv->type == GLAMOR_TEXTURE_LARGE) {
+ glamor_pixmap_clipped_regions *clipped_dst_regions;
+ int n_dst_region, i, j;
+ PixmapPtr temp_source_pixmap;
+ glamor_pixmap_private *temp_source_priv = NULL;
+
+ RegionTranslate(&region, dst_x_off, dst_y_off);
+ if (!force_clip)
+ clipped_dst_regions =
+ glamor_compute_clipped_regions(dst_pixmap_priv, &region,
+ &n_dst_region, 0, reverse,
+ upsidedown);
+ else
+ clipped_dst_regions =
+ glamor_compute_clipped_regions_ext(dst_pixmap_priv, &region,
+ &n_dst_region,
+ glamor_priv->max_fbo_size,
+ glamor_priv->max_fbo_size,
+ reverse, upsidedown);
+ for (i = 0; i < n_dst_region; i++) {
+ int n_src_region;
+ glamor_pixmap_clipped_regions *clipped_src_regions;
+ BoxPtr current_boxes;
+ int n_current_boxes;
+
+ SET_PIXMAP_FBO_CURRENT(dst_pixmap_priv,
+ clipped_dst_regions[i].block_idx);
+
+ temp_source_pixmap = NULL;
+ if (src_pixmap_priv->type == GLAMOR_TEXTURE_LARGE) {
+ RegionTranslate(clipped_dst_regions[i].region,
+ -dst_x_off + src_x_off + dx,
+ -dst_y_off + src_y_off + dy);
+ clipped_src_regions =
+ glamor_compute_clipped_regions(src_pixmap_priv,
+ clipped_dst_regions[i].
+ region, &n_src_region, 0,
+ reverse, upsidedown);
+ DEBUGF("Source is large pixmap.\n");
+ for (j = 0; j < n_src_region; j++) {
+ if (src_pixmap_priv != dst_pixmap_priv)
+ SET_PIXMAP_FBO_CURRENT(src_pixmap_priv,
+ clipped_src_regions[j].
+ block_idx);
+ else if (src_pixmap_priv == dst_pixmap_priv &&
+ clipped_src_regions[j].block_idx !=
+ clipped_dst_regions[i].block_idx) {
+ /* source and the dest are the same, but need different block_idx.
+ * we create a empty pixmap and fill the required source fbo and box to
+ * it. It's a little hacky, but avoid extra copy. */
+ temp_source_pixmap =
+ glamor_create_pixmap(src->pScreen, 0, 0, src->depth,
+ 0);
+ if (!temp_source_pixmap) {
+ ok = FALSE;
+ goto fail;
+ }
+ src->pScreen->ModifyPixmapHeader(temp_source_pixmap,
+ src_pixmap->drawable.
+ width,
+ src_pixmap->drawable.
+ height, 0, 0,
+ src_pixmap->devKind,
+ NULL);
+ temp_source_priv =
+ glamor_get_pixmap_private(temp_source_pixmap);
+ *temp_source_priv = *src_pixmap_priv;
+ temp_source_priv->large.box =
+ src_pixmap_priv->large.
+ box_array[clipped_src_regions[j].block_idx];
+ temp_source_priv->base.fbo =
+ src_pixmap_priv->large.
+ fbo_array[clipped_src_regions[j].block_idx];
+ temp_source_priv->base.pixmap = temp_source_pixmap;
+ }
+ assert(temp_source_pixmap ||
+ !(src_pixmap_priv == dst_pixmap_priv &&
+ (clipped_src_regions[j].block_idx !=
+ clipped_dst_regions[i].block_idx)));
+
+ RegionTranslate(clipped_src_regions[j].region,
+ -src_x_off - dx, -src_y_off - dy);
+ current_boxes = RegionRects(clipped_src_regions[j].region);
+ n_current_boxes =
+ RegionNumRects(clipped_src_regions[j].region);
+ DEBUGF("dst pixmap fbo idx %d src pixmap fbo idx %d \n",
+ clipped_dst_regions[i].block_idx,
+ clipped_src_regions[j].block_idx);
+ DEBUGF("Copy %d %d %d %d dx %d dy %d from %p to %p \n",
+ current_boxes[0].x1, current_boxes[0].y1,
+ current_boxes[0].x2, current_boxes[0].y2, dx, dy,
+ src_pixmap, dst_pixmap);
+ if (!temp_source_pixmap)
+ ok = __glamor_copy_n_to_n(src, dst, gc, current_boxes,
+ n_current_boxes, dx, dy,
+ reverse, upsidedown, bitplane,
+ closure);
+ else {
+ ok = __glamor_copy_n_to_n(&temp_source_pixmap->drawable,
+ dst, gc, current_boxes,
+ n_current_boxes, dx, dy,
+ reverse, upsidedown, bitplane,
+ closure);
+ temp_source_priv->type = GLAMOR_MEMORY;
+ temp_source_priv->base.fbo = NULL;
+ glamor_destroy_pixmap(temp_source_pixmap);
+ temp_source_pixmap = NULL;
+ }
+
+ RegionDestroy(clipped_src_regions[j].region);
+ if (!ok) {
+ assert(0);
+ goto fail;
+ }
+ }
+
+ if (n_src_region == 0)
+ ok = TRUE;
+ free(clipped_src_regions);
+ }
+ else {
+ RegionTranslate(clipped_dst_regions[i].region,
+ -dst_x_off, -dst_y_off);
+ current_boxes = RegionRects(clipped_dst_regions[i].region);
+ n_current_boxes = RegionNumRects(clipped_dst_regions[i].region);
+
+ DEBUGF("dest pixmap fbo idx %d \n",
+ clipped_dst_regions[i].block_idx);
+ DEBUGF("Copy %d %d %d %d dx %d dy %d from %p to %p \n",
+ current_boxes[0].x1, current_boxes[0].y1,
+ current_boxes[0].x2, current_boxes[0].y2,
+ dx, dy, src_pixmap, dst_pixmap);
+
+ ok = __glamor_copy_n_to_n(src, dst, gc, current_boxes,
+ n_current_boxes, dx, dy, reverse,
+ upsidedown, bitplane, closure);
+
+ }
+ RegionDestroy(clipped_dst_regions[i].region);
+ }
+ if (n_dst_region == 0)
+ ok = TRUE;
+ free(clipped_dst_regions);
+ RegionUninit(&region);
+ }
+ else {
+ ok = __glamor_copy_n_to_n(src, dst, gc, box, nbox, dx, dy,
+ reverse, upsidedown, bitplane, closure);
+ }
+
+ fail:
+ dispatch = glamor_get_dispatch(glamor_priv);
+ glamor_set_alu(dispatch, GXcopy);
+ glamor_put_dispatch(glamor_priv);
+
+ if (ok)
+ return TRUE;
+ fall_back:
+ if (!fallback && glamor_ddx_fallback_check_pixmap(src)
+ && glamor_ddx_fallback_check_pixmap(dst))
+ goto done;
+
+ if (src_pixmap_priv->type == GLAMOR_DRM_ONLY
+ || dst_pixmap_priv->type == GLAMOR_DRM_ONLY) {
+ LogMessage(X_WARNING,
+ "Access a DRM only pixmap is not allowed within glamor.\n");
+ return TRUE;
+ }
+ glamor_report_delayed_fallbacks(src->pScreen);
+ glamor_report_delayed_fallbacks(dst->pScreen);
+
+ glamor_fallback("from %p to %p (%c,%c)\n", src, dst,
+ glamor_get_drawable_location(src),
+ glamor_get_drawable_location(dst));
+
+ if (glamor_prepare_access(dst, GLAMOR_ACCESS_RW)) {
+ if (dst == src || glamor_prepare_access(src, GLAMOR_ACCESS_RO)) {
+ fbCopyNtoN(src, dst, gc, box, nbox,
+ dx, dy, reverse, upsidedown, bitplane, closure);
+ if (dst != src)
+ glamor_finish_access(src, GLAMOR_ACCESS_RO);
+ }
+ glamor_finish_access(dst, GLAMOR_ACCESS_RW);
+ }
+ ok = TRUE;
+
+ done:
+ glamor_clear_delayed_fallbacks(src->pScreen);
+ glamor_clear_delayed_fallbacks(dst->pScreen);
+ return ok;
}
RegionPtr
glamor_copy_area(DrawablePtr src, DrawablePtr dst, GCPtr gc,
- int srcx, int srcy, int width, int height, int dstx,
- int dsty)
+ int srcx, int srcy, int width, int height, int dstx, int dsty)
{
- RegionPtr region;
- region = miDoCopy(src, dst, gc,
- srcx, srcy, width, height,
- dstx, dsty, glamor_copy_n_to_n, 0, NULL);
+ RegionPtr region;
- return region;
+ region = miDoCopy(src, dst, gc,
+ srcx, srcy, width, height,
+ dstx, dsty, glamor_copy_n_to_n, 0, NULL);
+
+ return region;
}
void
glamor_copy_n_to_n(DrawablePtr src,
- DrawablePtr dst,
- GCPtr gc,
- BoxPtr box,
- int nbox,
- int dx,
- int dy,
- Bool reverse,
- Bool upsidedown, Pixel bitplane,
- void *closure)
+ DrawablePtr dst,
+ GCPtr gc,
+ BoxPtr box,
+ int nbox,
+ int dx,
+ int dy,
+ Bool reverse, Bool upsidedown, Pixel bitplane, void *closure)
{
- _glamor_copy_n_to_n(src, dst, gc, box, nbox, dx,
- dy, reverse, upsidedown, bitplane, closure, TRUE);
+ _glamor_copy_n_to_n(src, dst, gc, box, nbox, dx,
+ dy, reverse, upsidedown, bitplane, closure, TRUE);
}
Bool
glamor_copy_n_to_n_nf(DrawablePtr src,
- DrawablePtr dst,
- GCPtr gc,
- BoxPtr box,
- int nbox,
- int dx,
- int dy,
- Bool reverse,
- Bool upsidedown, Pixel bitplane,
- void *closure)
+ DrawablePtr dst,
+ GCPtr gc,
+ BoxPtr box,
+ int nbox,
+ int dx,
+ int dy,
+ Bool reverse,
+ Bool upsidedown, Pixel bitplane, void *closure)
{
- return _glamor_copy_n_to_n(src, dst, gc, box, nbox, dx,
- dy, reverse, upsidedown, bitplane, closure, FALSE);
+ return _glamor_copy_n_to_n(src, dst, gc, box, nbox, dx,
+ dy, reverse, upsidedown, bitplane, closure,
+ FALSE);
}
-
diff --git a/xorg-server/glamor/glamor_copyplane.c b/xorg-server/glamor/glamor_copyplane.c
index 3f2652ac7..c42d33e94 100644
--- a/xorg-server/glamor/glamor_copyplane.c
+++ b/xorg-server/glamor/glamor_copyplane.c
@@ -30,43 +30,43 @@
static Bool
_glamor_copy_plane(DrawablePtr pSrc, DrawablePtr pDst, GCPtr pGC,
- int srcx, int srcy, int w, int h, int dstx, int dsty,
- unsigned long bitPlane, RegionPtr *pRegion, Bool fallback)
+ int srcx, int srcy, int w, int h, int dstx, int dsty,
+ unsigned long bitPlane, RegionPtr *pRegion, Bool fallback)
{
- if (!fallback
- && glamor_ddx_fallback_check_gc(pGC)
- && glamor_ddx_fallback_check_pixmap(pSrc)
- && glamor_ddx_fallback_check_pixmap(pDst))
- goto fail;
+ if (!fallback && glamor_ddx_fallback_check_gc(pGC)
+ && glamor_ddx_fallback_check_pixmap(pSrc)
+ && glamor_ddx_fallback_check_pixmap(pDst))
+ goto fail;
- glamor_prepare_access(pDst, GLAMOR_ACCESS_RW);
- glamor_prepare_access(pSrc, GLAMOR_ACCESS_RO);
- *pRegion = fbCopyPlane(pSrc, pDst, pGC, srcx, srcy, w, h,
- dstx, dsty, bitPlane);
- glamor_finish_access(pSrc, GLAMOR_ACCESS_RO);
- glamor_finish_access(pDst, GLAMOR_ACCESS_RW);
- return TRUE;
+ glamor_prepare_access(pDst, GLAMOR_ACCESS_RW);
+ glamor_prepare_access(pSrc, GLAMOR_ACCESS_RO);
+ *pRegion = fbCopyPlane(pSrc, pDst, pGC, srcx, srcy, w, h,
+ dstx, dsty, bitPlane);
+ glamor_finish_access(pSrc, GLAMOR_ACCESS_RO);
+ glamor_finish_access(pDst, GLAMOR_ACCESS_RW);
+ return TRUE;
fail:
- return FALSE;
+ return FALSE;
}
RegionPtr
glamor_copy_plane(DrawablePtr pSrc, DrawablePtr pDst, GCPtr pGC,
- int srcx, int srcy, int w, int h, int dstx, int dsty,
- unsigned long bitPlane)
+ int srcx, int srcy, int w, int h, int dstx, int dsty,
+ unsigned long bitPlane)
{
- RegionPtr ret;
- _glamor_copy_plane(pSrc, pDst, pGC, srcx, srcy, w, h,
- dstx, dsty, bitPlane, &ret, TRUE);
- return ret;
+ RegionPtr ret;
+
+ _glamor_copy_plane(pSrc, pDst, pGC, srcx, srcy, w, h,
+ dstx, dsty, bitPlane, &ret, TRUE);
+ return ret;
}
Bool
glamor_copy_plane_nf(DrawablePtr pSrc, DrawablePtr pDst, GCPtr pGC,
- int srcx, int srcy, int w, int h, int dstx, int dsty,
- unsigned long bitPlane, RegionPtr *pRegion)
+ int srcx, int srcy, int w, int h, int dstx, int dsty,
+ unsigned long bitPlane, RegionPtr *pRegion)
{
- return _glamor_copy_plane(pSrc, pDst, pGC, srcx, srcy, w, h,
- dstx, dsty, bitPlane, pRegion, FALSE);
+ return _glamor_copy_plane(pSrc, pDst, pGC, srcx, srcy, w, h,
+ dstx, dsty, bitPlane, pRegion, FALSE);
}
diff --git a/xorg-server/glamor/glamor_copywindow.c b/xorg-server/glamor/glamor_copywindow.c
index b181ff529..1ced4b336 100644
--- a/xorg-server/glamor/glamor_copywindow.c
+++ b/xorg-server/glamor/glamor_copywindow.c
@@ -29,30 +29,28 @@
*/
void
-glamor_copy_window(WindowPtr win, DDXPointRec old_origin,
- RegionPtr src_region)
+glamor_copy_window(WindowPtr win, DDXPointRec old_origin, RegionPtr src_region)
{
- RegionRec dst_region;
- int dx, dy;
- PixmapPtr pixmap = win->drawable.pScreen->GetWindowPixmap(win);
+ RegionRec dst_region;
+ int dx, dy;
+ PixmapPtr pixmap = win->drawable.pScreen->GetWindowPixmap(win);
- dx = old_origin.x - win->drawable.x;
- dy = old_origin.y - win->drawable.y;
- REGION_TRANSLATE(win->drawable.pScreen, src_region, -dx, -dy);
+ dx = old_origin.x - win->drawable.x;
+ dy = old_origin.y - win->drawable.y;
+ REGION_TRANSLATE(win->drawable.pScreen, src_region, -dx, -dy);
- REGION_INIT(win->drawable.pScreen, &dst_region, NullBox, 0);
+ REGION_INIT(win->drawable.pScreen, &dst_region, NullBox, 0);
- REGION_INTERSECT(win->drawable.pScreen, &dst_region,
- &win->borderClip, src_region);
+ REGION_INTERSECT(win->drawable.pScreen, &dst_region,
+ &win->borderClip, src_region);
#ifdef COMPOSITE
- if (pixmap->screen_x || pixmap->screen_y)
- REGION_TRANSLATE(win->drawable.pScreen, &dst_region,
- -pixmap->screen_x, -pixmap->screen_y);
+ if (pixmap->screen_x || pixmap->screen_y)
+ REGION_TRANSLATE(win->drawable.pScreen, &dst_region,
+ -pixmap->screen_x, -pixmap->screen_y);
#endif
- miCopyRegion(&pixmap->drawable, &pixmap->drawable,
- NULL, &dst_region, dx, dy, glamor_copy_n_to_n, 0,
- NULL);
+ miCopyRegion(&pixmap->drawable, &pixmap->drawable,
+ NULL, &dst_region, dx, dy, glamor_copy_n_to_n, 0, NULL);
- REGION_UNINIT(win->drawable.pScreen, &dst_region);
+ REGION_UNINIT(win->drawable.pScreen, &dst_region);
}
diff --git a/xorg-server/glamor/glamor_core.c b/xorg-server/glamor/glamor_core.c
index eb1a08d43..4eac85603 100644
--- a/xorg-server/glamor/glamor_core.c
+++ b/xorg-server/glamor/glamor_core.c
@@ -38,76 +38,76 @@
const Bool
glamor_get_drawable_location(const DrawablePtr drawable)
{
- PixmapPtr pixmap = glamor_get_drawable_pixmap(drawable);
- glamor_pixmap_private *pixmap_priv =
- glamor_get_pixmap_private(pixmap);
- glamor_screen_private *glamor_priv =
- glamor_get_screen_private(drawable->pScreen);
- if (pixmap_priv == NULL || pixmap_priv->base.gl_fbo == 0)
- return 'm';
- if (pixmap_priv->base.fbo->fb == glamor_priv->screen_fbo)
- return 's';
- else
- return 'f';
+ PixmapPtr pixmap = glamor_get_drawable_pixmap(drawable);
+ glamor_pixmap_private *pixmap_priv = glamor_get_pixmap_private(pixmap);
+ glamor_screen_private *glamor_priv =
+ glamor_get_screen_private(drawable->pScreen);
+ if (pixmap_priv == NULL || pixmap_priv->base.gl_fbo == 0)
+ return 'm';
+ if (pixmap_priv->base.fbo->fb == glamor_priv->screen_fbo)
+ return 's';
+ else
+ return 'f';
}
GLint
glamor_compile_glsl_prog(glamor_gl_dispatch * dispatch, GLenum type,
- const char *source)
+ const char *source)
{
- GLint ok;
- GLint prog;
-
- prog = dispatch->glCreateShader(type);
- dispatch->glShaderSource(prog, 1, (const GLchar **) &source, NULL);
- dispatch->glCompileShader(prog);
- dispatch->glGetShaderiv(prog, GL_COMPILE_STATUS, &ok);
- if (!ok) {
- GLchar *info;
- GLint size;
-
- dispatch->glGetShaderiv(prog, GL_INFO_LOG_LENGTH, &size);
- info = malloc(size);
- if (info) {
- dispatch->glGetShaderInfoLog(prog, size, NULL, info);
- ErrorF("Failed to compile %s: %s\n",
- type == GL_FRAGMENT_SHADER ? "FS" : "VS", info);
- ErrorF("Program source:\n%s", source);
- free(info);
- } else
- ErrorF("Failed to get shader compilation info.\n");
- FatalError("GLSL compile failure\n");
- }
-
- return prog;
+ GLint ok;
+ GLint prog;
+
+ prog = dispatch->glCreateShader(type);
+ dispatch->glShaderSource(prog, 1, (const GLchar **) &source, NULL);
+ dispatch->glCompileShader(prog);
+ dispatch->glGetShaderiv(prog, GL_COMPILE_STATUS, &ok);
+ if (!ok) {
+ GLchar *info;
+ GLint size;
+
+ dispatch->glGetShaderiv(prog, GL_INFO_LOG_LENGTH, &size);
+ info = malloc(size);
+ if (info) {
+ dispatch->glGetShaderInfoLog(prog, size, NULL, info);
+ ErrorF("Failed to compile %s: %s\n",
+ type == GL_FRAGMENT_SHADER ? "FS" : "VS", info);
+ ErrorF("Program source:\n%s", source);
+ free(info);
+ }
+ else
+ ErrorF("Failed to get shader compilation info.\n");
+ FatalError("GLSL compile failure\n");
+ }
+
+ return prog;
}
void
glamor_link_glsl_prog(glamor_gl_dispatch * dispatch, GLint prog)
{
- GLint ok;
+ GLint ok;
- dispatch->glLinkProgram(prog);
- dispatch->glGetProgramiv(prog, GL_LINK_STATUS, &ok);
- if (!ok) {
- GLchar *info;
- GLint size;
+ dispatch->glLinkProgram(prog);
+ dispatch->glGetProgramiv(prog, GL_LINK_STATUS, &ok);
+ if (!ok) {
+ GLchar *info;
+ GLint size;
- dispatch->glGetProgramiv(prog, GL_INFO_LOG_LENGTH, &size);
- info = malloc(size);
+ dispatch->glGetProgramiv(prog, GL_INFO_LOG_LENGTH, &size);
+ info = malloc(size);
- dispatch->glGetProgramInfoLog(prog, size, NULL, info);
- ErrorF("Failed to link: %s\n", info);
- FatalError("GLSL link failure\n");
- }
+ dispatch->glGetProgramInfoLog(prog, size, NULL, info);
+ ErrorF("Failed to link: %s\n", info);
+ FatalError("GLSL link failure\n");
+ }
}
-
Bool
glamor_prepare_access(DrawablePtr drawable, glamor_access_t access)
{
- PixmapPtr pixmap = glamor_get_drawable_pixmap(drawable);
- return glamor_download_pixmap_to_cpu(pixmap, access);
+ PixmapPtr pixmap = glamor_get_drawable_pixmap(drawable);
+
+ return glamor_download_pixmap_to_cpu(pixmap, access);
}
/*
@@ -142,221 +142,205 @@ glamor_prepare_access(DrawablePtr drawable, glamor_access_t access)
void
glamor_init_finish_access_shaders(ScreenPtr screen)
{
- glamor_screen_private *glamor_priv;
- glamor_gl_dispatch *dispatch;
- const char *vs_source =
- "attribute vec4 v_position;\n"
- "attribute vec4 v_texcoord0;\n"
- "varying vec2 source_texture;\n"
- "void main()\n"
- "{\n"
- " gl_Position = v_position;\n"
- " source_texture = v_texcoord0.xy;\n" "}\n";
-
- const char *common_source =
- GLAMOR_DEFAULT_PRECISION
- "varying vec2 source_texture;\n"
- "uniform sampler2D sampler;\n"
- "uniform int revert;\n"
- "uniform int swap_rb;\n"
-
- "#define REVERT_NONE 0\n"
- "#define REVERT_NORMAL 1\n"
- "#define SWAP_NONE_DOWNLOADING 0\n"
- "#define SWAP_DOWNLOADING 1\n"
- "#define SWAP_UPLOADING 2\n"
- "#define SWAP_NONE_UPLOADING 3\n";
-
- const char *fs_source =
- "void main()\n"
- "{\n"
- " if (revert == REVERT_NONE) \n"
- " { \n"
- " if ((swap_rb != SWAP_NONE_DOWNLOADING) && (swap_rb != SWAP_NONE_UPLOADING)) \n"
- " gl_FragColor = texture2D(sampler, source_texture).bgra;\n"
- " else \n"
- " gl_FragColor = texture2D(sampler, source_texture).rgba;\n"
- " } \n"
- " else \n"
- " { \n"
- " if (swap_rb == SWAP_DOWNLOADING) \n"
- " gl_FragColor = texture2D(sampler, source_texture).argb;\n"
- " else if (swap_rb == SWAP_NONE_DOWNLOADING)\n"
- " gl_FragColor = texture2D(sampler, source_texture).abgr;\n"
- " else if (swap_rb == SWAP_UPLOADING)\n"
- " gl_FragColor = texture2D(sampler, source_texture).gbar;\n"
- " else if (swap_rb == SWAP_NONE_UPLOADING)\n"
- " gl_FragColor = texture2D(sampler, source_texture).abgr;\n"
- " } \n" "}\n";
-
- const char *set_alpha_source =
- "void main()\n"
- "{\n"
- " if (revert == REVERT_NONE) \n"
- " { \n"
- " if ((swap_rb != SWAP_NONE_DOWNLOADING) && (swap_rb != SWAP_NONE_UPLOADING)) \n"
- " gl_FragColor = vec4(texture2D(sampler, source_texture).bgr, 1);\n"
- " else \n"
- " gl_FragColor = vec4(texture2D(sampler, source_texture).rgb, 1);\n"
- " } \n"
- " else \n"
- " { \n"
- " if (swap_rb == SWAP_DOWNLOADING) \n"
- " gl_FragColor = vec4(1, texture2D(sampler, source_texture).rgb);\n"
- " else if (swap_rb == SWAP_NONE_DOWNLOADING)\n"
- " gl_FragColor = vec4(1, texture2D(sampler, source_texture).bgr);\n"
- " else if (swap_rb == SWAP_UPLOADING)\n"
- " gl_FragColor = vec4(texture2D(sampler, source_texture).gba, 1);\n"
- " else if (swap_rb == SWAP_NONE_UPLOADING)\n"
- " gl_FragColor = vec4(texture2D(sampler, source_texture).abg, 1);\n"
- " } \n"
- "}\n";
- GLint fs_prog, vs_prog, avs_prog, set_alpha_prog;
- GLint sampler_uniform_location;
- char *source;
-
- glamor_priv = glamor_get_screen_private(screen);
- dispatch = glamor_get_dispatch(glamor_priv);
- glamor_priv->finish_access_prog[0] = dispatch->glCreateProgram();
- glamor_priv->finish_access_prog[1] = dispatch->glCreateProgram();
-
- vs_prog = glamor_compile_glsl_prog(dispatch, GL_VERTEX_SHADER,
- vs_source);
-
- XNFasprintf(&source, "%s%s", common_source, fs_source);
- fs_prog = glamor_compile_glsl_prog(dispatch, GL_FRAGMENT_SHADER,
- source);
- free(source);
-
- dispatch->glAttachShader(glamor_priv->finish_access_prog[0],
- vs_prog);
- dispatch->glAttachShader(glamor_priv->finish_access_prog[0],
- fs_prog);
-
- avs_prog = glamor_compile_glsl_prog(dispatch, GL_VERTEX_SHADER,
- vs_source);
-
- XNFasprintf(&source, "%s%s", common_source, set_alpha_source);
- set_alpha_prog = glamor_compile_glsl_prog(dispatch, GL_FRAGMENT_SHADER,
- source);
- free(source);
-
- dispatch->glAttachShader(glamor_priv->finish_access_prog[1],
- avs_prog);
- dispatch->glAttachShader(glamor_priv->finish_access_prog[1],
- set_alpha_prog);
-
- dispatch->glBindAttribLocation(glamor_priv->finish_access_prog[0],
- GLAMOR_VERTEX_POS, "v_position");
- dispatch->glBindAttribLocation(glamor_priv->finish_access_prog[0],
- GLAMOR_VERTEX_SOURCE,
- "v_texcoord0");
- glamor_link_glsl_prog(dispatch,
- glamor_priv->finish_access_prog[0]);
-
- dispatch->glBindAttribLocation(glamor_priv->finish_access_prog[1],
- GLAMOR_VERTEX_POS, "v_position");
- dispatch->glBindAttribLocation(glamor_priv->finish_access_prog[1],
- GLAMOR_VERTEX_SOURCE,
- "v_texcoord0");
- glamor_link_glsl_prog(dispatch,
- glamor_priv->finish_access_prog[1]);
-
- glamor_priv->finish_access_revert[0] =
- dispatch->
- glGetUniformLocation(glamor_priv->finish_access_prog[0],
- "revert");
-
- glamor_priv->finish_access_swap_rb[0] =
- dispatch->
- glGetUniformLocation(glamor_priv->finish_access_prog[0],
- "swap_rb");
- sampler_uniform_location =
- dispatch->
- glGetUniformLocation(glamor_priv->finish_access_prog[0],
- "sampler");
- dispatch->glUseProgram(glamor_priv->finish_access_prog[0]);
- dispatch->glUniform1i(sampler_uniform_location, 0);
- dispatch->glUniform1i(glamor_priv->finish_access_revert[0], 0);
- dispatch->glUniform1i(glamor_priv->finish_access_swap_rb[0], 0);
- dispatch->glUseProgram(0);
-
- glamor_priv->finish_access_revert[1] =
- dispatch->
- glGetUniformLocation(glamor_priv->finish_access_prog[1],
- "revert");
- glamor_priv->finish_access_swap_rb[1] =
- dispatch->
- glGetUniformLocation(glamor_priv->finish_access_prog[1],
- "swap_rb");
- sampler_uniform_location =
- dispatch->
- glGetUniformLocation(glamor_priv->finish_access_prog[1],
- "sampler");
- dispatch->glUseProgram(glamor_priv->finish_access_prog[1]);
- dispatch->glUniform1i(glamor_priv->finish_access_revert[1], 0);
- dispatch->glUniform1i(sampler_uniform_location, 0);
- dispatch->glUniform1i(glamor_priv->finish_access_swap_rb[1], 0);
- dispatch->glUseProgram(0);
- glamor_put_dispatch(glamor_priv);
+ glamor_screen_private *glamor_priv;
+ glamor_gl_dispatch *dispatch;
+ const char *vs_source =
+ "attribute vec4 v_position;\n"
+ "attribute vec4 v_texcoord0;\n"
+ "varying vec2 source_texture;\n"
+ "void main()\n"
+ "{\n"
+ " gl_Position = v_position;\n"
+ " source_texture = v_texcoord0.xy;\n"
+ "}\n";
+
+ const char *common_source =
+ GLAMOR_DEFAULT_PRECISION
+ "varying vec2 source_texture;\n"
+ "uniform sampler2D sampler;\n"
+ "uniform int revert;\n"
+ "uniform int swap_rb;\n"
+ "#define REVERT_NONE 0\n"
+ "#define REVERT_NORMAL 1\n"
+ "#define SWAP_NONE_DOWNLOADING 0\n"
+ "#define SWAP_DOWNLOADING 1\n"
+ "#define SWAP_UPLOADING 2\n"
+ "#define SWAP_NONE_UPLOADING 3\n";
+
+ const char *fs_source =
+ "void main()\n"
+ "{\n"
+ " if (revert == REVERT_NONE) \n"
+ " { \n"
+ " if ((swap_rb != SWAP_NONE_DOWNLOADING) && (swap_rb != SWAP_NONE_UPLOADING)) \n"
+ " gl_FragColor = texture2D(sampler, source_texture).bgra;\n"
+ " else \n"
+ " gl_FragColor = texture2D(sampler, source_texture).rgba;\n"
+ " } \n"
+ " else \n"
+ " { \n"
+ " if (swap_rb == SWAP_DOWNLOADING) \n"
+ " gl_FragColor = texture2D(sampler, source_texture).argb;\n"
+ " else if (swap_rb == SWAP_NONE_DOWNLOADING)\n"
+ " gl_FragColor = texture2D(sampler, source_texture).abgr;\n"
+ " else if (swap_rb == SWAP_UPLOADING)\n"
+ " gl_FragColor = texture2D(sampler, source_texture).gbar;\n"
+ " else if (swap_rb == SWAP_NONE_UPLOADING)\n"
+ " gl_FragColor = texture2D(sampler, source_texture).abgr;\n"
+ " } \n"
+ "}\n";
+
+ const char *set_alpha_source =
+ "void main()\n"
+ "{\n"
+ " if (revert == REVERT_NONE) \n"
+ " { \n"
+ " if ((swap_rb != SWAP_NONE_DOWNLOADING) && (swap_rb != SWAP_NONE_UPLOADING)) \n"
+ " gl_FragColor = vec4(texture2D(sampler, source_texture).bgr, 1);\n"
+ " else \n"
+ " gl_FragColor = vec4(texture2D(sampler, source_texture).rgb, 1);\n"
+ " } \n"
+ " else \n"
+ " { \n"
+ " if (swap_rb == SWAP_DOWNLOADING) \n"
+ " gl_FragColor = vec4(1, texture2D(sampler, source_texture).rgb);\n"
+ " else if (swap_rb == SWAP_NONE_DOWNLOADING)\n"
+ " gl_FragColor = vec4(1, texture2D(sampler, source_texture).bgr);\n"
+ " else if (swap_rb == SWAP_UPLOADING)\n"
+ " gl_FragColor = vec4(texture2D(sampler, source_texture).gba, 1);\n"
+ " else if (swap_rb == SWAP_NONE_UPLOADING)\n"
+ " gl_FragColor = vec4(texture2D(sampler, source_texture).abg, 1);\n"
+ " } \n"
+ "}\n";
+ GLint fs_prog, vs_prog, avs_prog, set_alpha_prog;
+ GLint sampler_uniform_location;
+ char *source;
+
+ glamor_priv = glamor_get_screen_private(screen);
+ dispatch = glamor_get_dispatch(glamor_priv);
+ glamor_priv->finish_access_prog[0] = dispatch->glCreateProgram();
+ glamor_priv->finish_access_prog[1] = dispatch->glCreateProgram();
+
+ vs_prog = glamor_compile_glsl_prog(dispatch, GL_VERTEX_SHADER, vs_source);
+
+ XNFasprintf(&source, "%s%s", common_source, fs_source);
+ fs_prog = glamor_compile_glsl_prog(dispatch, GL_FRAGMENT_SHADER, source);
+ free(source);
+
+ dispatch->glAttachShader(glamor_priv->finish_access_prog[0], vs_prog);
+ dispatch->glAttachShader(glamor_priv->finish_access_prog[0], fs_prog);
+
+ avs_prog = glamor_compile_glsl_prog(dispatch, GL_VERTEX_SHADER, vs_source);
+
+ XNFasprintf(&source, "%s%s", common_source, set_alpha_source);
+ set_alpha_prog = glamor_compile_glsl_prog(dispatch, GL_FRAGMENT_SHADER,
+ source);
+ free(source);
+
+ dispatch->glAttachShader(glamor_priv->finish_access_prog[1], avs_prog);
+ dispatch->glAttachShader(glamor_priv->finish_access_prog[1],
+ set_alpha_prog);
+
+ dispatch->glBindAttribLocation(glamor_priv->finish_access_prog[0],
+ GLAMOR_VERTEX_POS, "v_position");
+ dispatch->glBindAttribLocation(glamor_priv->finish_access_prog[0],
+ GLAMOR_VERTEX_SOURCE, "v_texcoord0");
+ glamor_link_glsl_prog(dispatch, glamor_priv->finish_access_prog[0]);
+
+ dispatch->glBindAttribLocation(glamor_priv->finish_access_prog[1],
+ GLAMOR_VERTEX_POS, "v_position");
+ dispatch->glBindAttribLocation(glamor_priv->finish_access_prog[1],
+ GLAMOR_VERTEX_SOURCE, "v_texcoord0");
+ glamor_link_glsl_prog(dispatch, glamor_priv->finish_access_prog[1]);
+
+ glamor_priv->finish_access_revert[0] =
+ dispatch->glGetUniformLocation(glamor_priv->finish_access_prog[0],
+ "revert");
+
+ glamor_priv->finish_access_swap_rb[0] =
+ dispatch->glGetUniformLocation(glamor_priv->finish_access_prog[0],
+ "swap_rb");
+ sampler_uniform_location =
+ dispatch->glGetUniformLocation(glamor_priv->finish_access_prog[0],
+ "sampler");
+ dispatch->glUseProgram(glamor_priv->finish_access_prog[0]);
+ dispatch->glUniform1i(sampler_uniform_location, 0);
+ dispatch->glUniform1i(glamor_priv->finish_access_revert[0], 0);
+ dispatch->glUniform1i(glamor_priv->finish_access_swap_rb[0], 0);
+ dispatch->glUseProgram(0);
+
+ glamor_priv->finish_access_revert[1] =
+ dispatch->glGetUniformLocation(glamor_priv->finish_access_prog[1],
+ "revert");
+ glamor_priv->finish_access_swap_rb[1] =
+ dispatch->glGetUniformLocation(glamor_priv->finish_access_prog[1],
+ "swap_rb");
+ sampler_uniform_location =
+ dispatch->glGetUniformLocation(glamor_priv->finish_access_prog[1],
+ "sampler");
+ dispatch->glUseProgram(glamor_priv->finish_access_prog[1]);
+ dispatch->glUniform1i(glamor_priv->finish_access_revert[1], 0);
+ dispatch->glUniform1i(sampler_uniform_location, 0);
+ dispatch->glUniform1i(glamor_priv->finish_access_swap_rb[1], 0);
+ dispatch->glUseProgram(0);
+ glamor_put_dispatch(glamor_priv);
}
void
glamor_fini_finish_access_shaders(ScreenPtr screen)
{
- glamor_screen_private *glamor_priv;
- glamor_gl_dispatch *dispatch;
-
- glamor_priv = glamor_get_screen_private(screen);
- dispatch = glamor_get_dispatch(glamor_priv);
- dispatch->glDeleteProgram(glamor_priv->finish_access_prog[0]);
- dispatch->glDeleteProgram(glamor_priv->finish_access_prog[1]);
- glamor_put_dispatch(glamor_priv);
+ glamor_screen_private *glamor_priv;
+ glamor_gl_dispatch *dispatch;
+
+ glamor_priv = glamor_get_screen_private(screen);
+ dispatch = glamor_get_dispatch(glamor_priv);
+ dispatch->glDeleteProgram(glamor_priv->finish_access_prog[0]);
+ dispatch->glDeleteProgram(glamor_priv->finish_access_prog[1]);
+ glamor_put_dispatch(glamor_priv);
}
void
glamor_finish_access(DrawablePtr drawable, glamor_access_t access_mode)
{
- PixmapPtr pixmap = glamor_get_drawable_pixmap(drawable);
- glamor_pixmap_private *pixmap_priv =
- glamor_get_pixmap_private(pixmap);
- glamor_screen_private *glamor_priv =
- glamor_get_screen_private(drawable->pScreen);
+ PixmapPtr pixmap = glamor_get_drawable_pixmap(drawable);
+ glamor_pixmap_private *pixmap_priv = glamor_get_pixmap_private(pixmap);
+ glamor_screen_private *glamor_priv =
+ glamor_get_screen_private(drawable->pScreen);
- if (!GLAMOR_PIXMAP_PRIV_HAS_FBO_DOWNLOADED(pixmap_priv))
- return;
+ if (!GLAMOR_PIXMAP_PRIV_HAS_FBO_DOWNLOADED(pixmap_priv))
+ return;
- if (access_mode != GLAMOR_ACCESS_RO) {
- glamor_restore_pixmap_to_texture(pixmap);
- }
+ if (access_mode != GLAMOR_ACCESS_RO) {
+ glamor_restore_pixmap_to_texture(pixmap);
+ }
- if (pixmap_priv->base.fbo->pbo != 0 && pixmap_priv->base.fbo->pbo_valid) {
- glamor_gl_dispatch *dispatch;
+ if (pixmap_priv->base.fbo->pbo != 0 && pixmap_priv->base.fbo->pbo_valid) {
+ glamor_gl_dispatch *dispatch;
- assert(glamor_priv->gl_flavor == GLAMOR_GL_DESKTOP);
+ assert(glamor_priv->gl_flavor == GLAMOR_GL_DESKTOP);
- dispatch = glamor_get_dispatch(glamor_priv);
- dispatch->glBindBuffer(GL_PIXEL_PACK_BUFFER, 0);
- dispatch->glBindBuffer(GL_PIXEL_UNPACK_BUFFER, 0);
- dispatch->glDeleteBuffers(1, &pixmap_priv->base.fbo->pbo);
- glamor_put_dispatch(glamor_priv);
+ dispatch = glamor_get_dispatch(glamor_priv);
+ dispatch->glBindBuffer(GL_PIXEL_PACK_BUFFER, 0);
+ dispatch->glBindBuffer(GL_PIXEL_UNPACK_BUFFER, 0);
+ dispatch->glDeleteBuffers(1, &pixmap_priv->base.fbo->pbo);
+ glamor_put_dispatch(glamor_priv);
- pixmap_priv->base.fbo->pbo_valid = FALSE;
- pixmap_priv->base.fbo->pbo = 0;
- } else {
- free(pixmap->devPrivate.ptr);
- }
+ pixmap_priv->base.fbo->pbo_valid = FALSE;
+ pixmap_priv->base.fbo->pbo = 0;
+ }
+ else {
+ free(pixmap->devPrivate.ptr);
+ }
- if (pixmap_priv->type == GLAMOR_TEXTURE_DRM)
- pixmap->devKind = pixmap_priv->base.drm_stride;
+ if (pixmap_priv->type == GLAMOR_TEXTURE_DRM)
+ pixmap->devKind = pixmap_priv->base.drm_stride;
- if (pixmap_priv->base.gl_fbo == GLAMOR_FBO_DOWNLOADED)
- pixmap_priv->base.gl_fbo = GLAMOR_FBO_NORMAL;
+ if (pixmap_priv->base.gl_fbo == GLAMOR_FBO_DOWNLOADED)
+ pixmap_priv->base.gl_fbo = GLAMOR_FBO_NORMAL;
- pixmap->devPrivate.ptr = NULL;
+ pixmap->devPrivate.ptr = NULL;
}
-
/**
* Calls uxa_prepare_access with UXA_PREPARE_SRC for the tile, if that is the
* current fill style.
@@ -368,22 +352,19 @@ glamor_finish_access(DrawablePtr drawable, glamor_access_t access_mode)
Bool
glamor_prepare_access_gc(GCPtr gc)
{
- if (gc->stipple) {
- if (!glamor_prepare_access
- (&gc->stipple->drawable, GLAMOR_ACCESS_RO))
- return FALSE;
- }
- if (gc->fillStyle == FillTiled) {
- if (!glamor_prepare_access(&gc->tile.pixmap->drawable,
- GLAMOR_ACCESS_RO)) {
- if (gc->stipple)
- glamor_finish_access(&gc->
- stipple->drawable,
- GLAMOR_ACCESS_RO);
- return FALSE;
- }
- }
- return TRUE;
+ if (gc->stipple) {
+ if (!glamor_prepare_access(&gc->stipple->drawable, GLAMOR_ACCESS_RO))
+ return FALSE;
+ }
+ if (gc->fillStyle == FillTiled) {
+ if (!glamor_prepare_access(&gc->tile.pixmap->drawable,
+ GLAMOR_ACCESS_RO)) {
+ if (gc->stipple)
+ glamor_finish_access(&gc->stipple->drawable, GLAMOR_ACCESS_RO);
+ return FALSE;
+ }
+ }
+ return TRUE;
}
/**
@@ -392,45 +373,44 @@ glamor_prepare_access_gc(GCPtr gc)
void
glamor_finish_access_gc(GCPtr gc)
{
- if (gc->fillStyle == FillTiled)
- glamor_finish_access(&gc->tile.pixmap->drawable, GLAMOR_ACCESS_RO);
- if (gc->stipple)
- glamor_finish_access(&gc->stipple->drawable, GLAMOR_ACCESS_RO);
+ if (gc->fillStyle == FillTiled)
+ glamor_finish_access(&gc->tile.pixmap->drawable, GLAMOR_ACCESS_RO);
+ if (gc->stipple)
+ glamor_finish_access(&gc->stipple->drawable, GLAMOR_ACCESS_RO);
}
Bool
glamor_stipple(PixmapPtr pixmap, PixmapPtr stipple,
- int x, int y, int width, int height,
- unsigned char alu, unsigned long planemask,
- unsigned long fg_pixel, unsigned long bg_pixel,
- int stipple_x, int stipple_y)
+ int x, int y, int width, int height,
+ unsigned char alu, unsigned long planemask,
+ unsigned long fg_pixel, unsigned long bg_pixel,
+ int stipple_x, int stipple_y)
{
- glamor_fallback("stubbed out stipple depth %d\n",
- pixmap->drawable.depth);
- return FALSE;
+ glamor_fallback("stubbed out stipple depth %d\n", pixmap->drawable.depth);
+ return FALSE;
}
GCOps glamor_gc_ops = {
- .FillSpans = glamor_fill_spans,
- .SetSpans = glamor_set_spans,
- .PutImage = glamor_put_image,
- .CopyArea = glamor_copy_area,
- .CopyPlane = glamor_copy_plane,
- .PolyPoint = glamor_poly_point,
- .Polylines = glamor_poly_lines,
- .PolySegment = glamor_poly_segment,
- .PolyRectangle = miPolyRectangle,
- .PolyArc = miPolyArc,
- .FillPolygon = miFillPolygon,
- .PolyFillRect = glamor_poly_fill_rect,
- .PolyFillArc = miPolyFillArc,
- .PolyText8 = miPolyText8,
- .PolyText16 = miPolyText16,
- .ImageText8 = miImageText8,
- .ImageText16 = miImageText16,
- .ImageGlyphBlt = glamor_image_glyph_blt, //miImageGlyphBlt,
- .PolyGlyphBlt = glamor_poly_glyph_blt, //miPolyGlyphBlt,
- .PushPixels = glamor_push_pixels, //miPushPixels,
+ .FillSpans = glamor_fill_spans,
+ .SetSpans = glamor_set_spans,
+ .PutImage = glamor_put_image,
+ .CopyArea = glamor_copy_area,
+ .CopyPlane = glamor_copy_plane,
+ .PolyPoint = glamor_poly_point,
+ .Polylines = glamor_poly_lines,
+ .PolySegment = glamor_poly_segment,
+ .PolyRectangle = miPolyRectangle,
+ .PolyArc = miPolyArc,
+ .FillPolygon = miFillPolygon,
+ .PolyFillRect = glamor_poly_fill_rect,
+ .PolyFillArc = miPolyFillArc,
+ .PolyText8 = miPolyText8,
+ .PolyText16 = miPolyText16,
+ .ImageText8 = miImageText8,
+ .ImageText16 = miImageText16,
+ .ImageGlyphBlt = glamor_image_glyph_blt, //miImageGlyphBlt,
+ .PolyGlyphBlt = glamor_poly_glyph_blt, //miPolyGlyphBlt,
+ .PushPixels = glamor_push_pixels, //miPushPixels,
};
/**
@@ -440,104 +420,94 @@ GCOps glamor_gc_ops = {
void
glamor_validate_gc(GCPtr gc, unsigned long changes, DrawablePtr drawable)
{
- /* fbValidateGC will do direct access to pixmaps if the tiling has changed.
- * Preempt fbValidateGC by doing its work and masking the change out, so
- * that we can do the Prepare/finish_access.
- */
+ /* fbValidateGC will do direct access to pixmaps if the tiling has changed.
+ * Preempt fbValidateGC by doing its work and masking the change out, so
+ * that we can do the Prepare/finish_access.
+ */
#ifdef FB_24_32BIT
- if ((changes & GCTile) && fbGetRotatedPixmap(gc)) {
- gc->pScreen->DestroyPixmap(fbGetRotatedPixmap(gc));
- fbGetRotatedPixmap(gc) = 0;
- }
-
- if (gc->fillStyle == FillTiled) {
- PixmapPtr old_tile, new_tile;
-
- old_tile = gc->tile.pixmap;
- if (old_tile->drawable.bitsPerPixel !=
- drawable->bitsPerPixel) {
- new_tile = fbGetRotatedPixmap(gc);
- if (!new_tile ||
- new_tile->drawable.bitsPerPixel !=
- drawable->bitsPerPixel) {
- if (new_tile)
- gc->pScreen->DestroyPixmap
- (new_tile);
- /* fb24_32ReformatTile will do direct access of a newly-
- * allocated pixmap.
- */
- glamor_fallback
- ("GC %p tile FB_24_32 transformat %p.\n",
- gc, old_tile);
-
- if (glamor_prepare_access
- (&old_tile->drawable,
- GLAMOR_ACCESS_RO)) {
- new_tile =
- fb24_32ReformatTile
- (old_tile,
- drawable->bitsPerPixel);
- glamor_finish_access
- (&old_tile->drawable, GLAMOR_ACCESS_RO);
- }
- }
- if (new_tile) {
- fbGetRotatedPixmap(gc) = old_tile;
- gc->tile.pixmap = new_tile;
- changes |= GCTile;
- }
- }
- }
+ if ((changes & GCTile) && fbGetRotatedPixmap(gc)) {
+ gc->pScreen->DestroyPixmap(fbGetRotatedPixmap(gc));
+ fbGetRotatedPixmap(gc) = 0;
+ }
+
+ if (gc->fillStyle == FillTiled) {
+ PixmapPtr old_tile, new_tile;
+
+ old_tile = gc->tile.pixmap;
+ if (old_tile->drawable.bitsPerPixel != drawable->bitsPerPixel) {
+ new_tile = fbGetRotatedPixmap(gc);
+ if (!new_tile ||
+ new_tile->drawable.bitsPerPixel != drawable->bitsPerPixel) {
+ if (new_tile)
+ gc->pScreen->DestroyPixmap(new_tile);
+ /* fb24_32ReformatTile will do direct access of a newly-
+ * allocated pixmap.
+ */
+ glamor_fallback
+ ("GC %p tile FB_24_32 transformat %p.\n", gc, old_tile);
+
+ if (glamor_prepare_access
+ (&old_tile->drawable, GLAMOR_ACCESS_RO)) {
+ new_tile =
+ fb24_32ReformatTile(old_tile, drawable->bitsPerPixel);
+ glamor_finish_access(&old_tile->drawable, GLAMOR_ACCESS_RO);
+ }
+ }
+ if (new_tile) {
+ fbGetRotatedPixmap(gc) = old_tile;
+ gc->tile.pixmap = new_tile;
+ changes |= GCTile;
+ }
+ }
+ }
#endif
- if (changes & GCTile) {
- if (!gc->tileIsPixel) {
- glamor_pixmap_private *pixmap_priv =
- glamor_get_pixmap_private(gc->tile.pixmap);
- if ((!GLAMOR_PIXMAP_PRIV_HAS_FBO(pixmap_priv))
- && FbEvenTile(gc->tile.pixmap->drawable.width *
- drawable->bitsPerPixel)) {
- glamor_fallback
- ("GC %p tile changed %p.\n", gc,
- gc->tile.pixmap);
- if (glamor_prepare_access
- (&gc->tile.pixmap->drawable,
- GLAMOR_ACCESS_RW)) {
- fbPadPixmap(gc->tile.pixmap);
- glamor_finish_access
- (&gc->tile.pixmap->drawable, GLAMOR_ACCESS_RW);
- }
- }
- }
- /* Mask out the GCTile change notification, now that we've done FB's
- * job for it.
- */
- changes &= ~GCTile;
- }
-
- if (changes & GCStipple && gc->stipple) {
- /* We can't inline stipple handling like we do for GCTile because
- * it sets fbgc privates.
- */
- if (glamor_prepare_access
- (&gc->stipple->drawable, GLAMOR_ACCESS_RW)) {
- fbValidateGC(gc, changes, drawable);
- glamor_finish_access(&gc->stipple->drawable, GLAMOR_ACCESS_RW);
- }
- } else {
- fbValidateGC(gc, changes, drawable);
- }
-
- gc->ops = &glamor_gc_ops;
+ if (changes & GCTile) {
+ if (!gc->tileIsPixel) {
+ glamor_pixmap_private *pixmap_priv =
+ glamor_get_pixmap_private(gc->tile.pixmap);
+ if ((!GLAMOR_PIXMAP_PRIV_HAS_FBO(pixmap_priv))
+ && FbEvenTile(gc->tile.pixmap->drawable.width *
+ drawable->bitsPerPixel)) {
+ glamor_fallback
+ ("GC %p tile changed %p.\n", gc, gc->tile.pixmap);
+ if (glamor_prepare_access
+ (&gc->tile.pixmap->drawable, GLAMOR_ACCESS_RW)) {
+ fbPadPixmap(gc->tile.pixmap);
+ glamor_finish_access
+ (&gc->tile.pixmap->drawable, GLAMOR_ACCESS_RW);
+ }
+ }
+ }
+ /* Mask out the GCTile change notification, now that we've done FB's
+ * job for it.
+ */
+ changes &= ~GCTile;
+ }
+
+ if (changes & GCStipple && gc->stipple) {
+ /* We can't inline stipple handling like we do for GCTile because
+ * it sets fbgc privates.
+ */
+ if (glamor_prepare_access(&gc->stipple->drawable, GLAMOR_ACCESS_RW)) {
+ fbValidateGC(gc, changes, drawable);
+ glamor_finish_access(&gc->stipple->drawable, GLAMOR_ACCESS_RW);
+ }
+ }
+ else {
+ fbValidateGC(gc, changes, drawable);
+ }
+
+ gc->ops = &glamor_gc_ops;
}
static GCFuncs glamor_gc_funcs = {
- glamor_validate_gc,
- miChangeGC,
- miCopyGC,
- miDestroyGC,
- miChangeClip,
- miDestroyClip,
- miCopyClip
+ glamor_validate_gc,
+ miChangeGC,
+ miCopyGC,
+ miDestroyGC,
+ miChangeClip,
+ miDestroyClip,
+ miCopyClip
};
/**
@@ -547,66 +517,69 @@ static GCFuncs glamor_gc_funcs = {
int
glamor_create_gc(GCPtr gc)
{
- if (!fbCreateGC(gc))
- return FALSE;
+ if (!fbCreateGC(gc))
+ return FALSE;
- gc->funcs = &glamor_gc_funcs;
+ gc->funcs = &glamor_gc_funcs;
- return TRUE;
+ return TRUE;
}
RegionPtr
glamor_bitmap_to_region(PixmapPtr pixmap)
{
- RegionPtr ret;
- glamor_fallback("pixmap %p \n", pixmap);
- if (!glamor_prepare_access(&pixmap->drawable, GLAMOR_ACCESS_RO))
- return NULL;
- ret = fbPixmapToRegion(pixmap);
- glamor_finish_access(&pixmap->drawable, GLAMOR_ACCESS_RO);
- return ret;
+ RegionPtr ret;
+
+ glamor_fallback("pixmap %p \n", pixmap);
+ if (!glamor_prepare_access(&pixmap->drawable, GLAMOR_ACCESS_RO))
+ return NULL;
+ ret = fbPixmapToRegion(pixmap);
+ glamor_finish_access(&pixmap->drawable, GLAMOR_ACCESS_RO);
+ return ret;
}
/* Borrow from cairo. */
Bool
glamor_gl_has_extension(const char *extension)
{
- const char *pext;
- int ext_len;
- ext_len = strlen(extension);
+ const char *pext;
+ int ext_len;
+
+ ext_len = strlen(extension);
- pext = (const char*)glGetString(GL_EXTENSIONS);
+ pext = (const char *) glGetString(GL_EXTENSIONS);
- if (pext == NULL || extension == NULL)
- return FALSE;
+ if (pext == NULL || extension == NULL)
+ return FALSE;
- while ((pext = strstr(pext, extension)) != NULL) {
- if (pext[ext_len] == ' ' || pext[ext_len] == '\0')
- return TRUE;
- pext += ext_len;
- }
- return FALSE;
+ while ((pext = strstr(pext, extension)) != NULL) {
+ if (pext[ext_len] == ' ' || pext[ext_len] == '\0')
+ return TRUE;
+ pext += ext_len;
+ }
+ return FALSE;
}
int
glamor_gl_get_version(void)
{
- int major, minor;
- const char *version = (const char *) glGetString(GL_VERSION);
- const char *dot = version == NULL ? NULL : strchr(version, '.');
- const char *major_start = dot;
-
- /* Sanity check */
- if (dot == NULL || dot == version || *(dot + 1) == '\0') {
- major = 0;
- minor = 0;
- } else {
- /* Find the start of the major version in the string */
- while (major_start > version && *major_start != ' ')
- --major_start;
- major = strtol(major_start, NULL, 10);
- minor = strtol(dot + 1, NULL, 10);
- }
-
- return GLAMOR_GL_VERSION_ENCODE(major, minor);
+ int major, minor;
+ const char *version = (const char *) glGetString(GL_VERSION);
+ const char *dot = version == NULL ? NULL : strchr(version, '.');
+ const char *major_start = dot;
+
+ /* Sanity check */
+ if (dot == NULL || dot == version || *(dot + 1) == '\0') {
+ major = 0;
+ minor = 0;
+ }
+ else {
+ /* Find the start of the major version in the string */
+ while (major_start > version && *major_start != ' ')
+ --major_start;
+ major = strtol(major_start, NULL, 10);
+ minor = strtol(dot + 1, NULL, 10);
+ }
+
+ return GLAMOR_GL_VERSION_ENCODE(major, minor);
}
diff --git a/xorg-server/glamor/glamor_debug.h b/xorg-server/glamor/glamor_debug.h
index f0c969b11..638bee20c 100644
--- a/xorg-server/glamor/glamor_debug.h
+++ b/xorg-server/glamor/glamor_debug.h
@@ -29,7 +29,6 @@
#ifndef __GLAMOR_DEBUG_H__
#define __GLAMOR_DEBUG_H__
-
#define GLAMOR_DELAYED_STRING_MAX 64
#define GLAMOR_DEBUG_NONE 0
@@ -51,9 +50,6 @@ AbortServer(void)
exit(1); \
} while(0)
-
-
-
#define __debug_output_message(_format_, _prefix_, ...) \
LogMessageVerb(X_NONE, 0, \
"%32s:\t" _format_ , \
@@ -69,7 +65,6 @@ AbortServer(void)
##__VA_ARGS__); \
} while(0)
-
#define glamor_fallback(_format_,...) \
do { \
if (glamor_debug_level >= GLAMOR_DEBUG_FALLBACK) \
@@ -77,8 +72,6 @@ AbortServer(void)
"Glamor fallback", \
##__VA_ARGS__);} while(0)
-
-
#define glamor_delayed_fallback(_screen_, _format_,...) \
do { \
if (glamor_debug_level >= GLAMOR_DEBUG_FALLBACK) { \
@@ -90,7 +83,6 @@ AbortServer(void)
"glamor delayed fallback: \t%s " _format_ , \
__FUNCTION__, ##__VA_ARGS__); } } while(0)
-
#define glamor_clear_delayed_fallbacks(_screen_) \
do { \
if (glamor_debug_level >= GLAMOR_DEBUG_FALLBACK) { \
@@ -112,5 +104,4 @@ AbortServer(void)
#define DEBUGRegionPrint(x) do {} while (0)
//#define DEBUGRegionPrint RegionPrint
-
#endif
diff --git a/xorg-server/glamor/glamor_egl.c b/xorg-server/glamor/glamor_egl.c
index ff4c0bdd9..2f97a839b 100644
--- a/xorg-server/glamor/glamor_egl.c
+++ b/xorg-server/glamor/glamor_egl.c
@@ -27,9 +27,7 @@
*
*/
-#ifdef HAVE_CONFIG_H
-#include "config.h"
-#endif
+#include "dix-config.h"
#define GLAMOR_FOR_XORG
#include <xorg-server.h>
@@ -60,50 +58,45 @@
#include <EGL/eglext.h>
#include "glamor.h"
-#include "compat-api.h"
#include "glamor_gl_dispatch.h"
-#ifdef GLX_USE_SHARED_DISPATCH
-#include "glapi.h"
-#endif
static const char glamor_name[] = "glamor";
static DevPrivateKeyRec glamor_egl_pixmap_private_key_index;
-DevPrivateKey glamor_egl_pixmap_private_key = &glamor_egl_pixmap_private_key_index;
+DevPrivateKey glamor_egl_pixmap_private_key =
+ &glamor_egl_pixmap_private_key_index;
static void
glamor_identify(int flags)
{
- xf86Msg(X_INFO, "%s: OpenGL accelerated X.org driver based.\n",
- glamor_name);
+ xf86Msg(X_INFO, "%s: OpenGL accelerated X.org driver based.\n",
+ glamor_name);
}
struct glamor_egl_screen_private {
- EGLDisplay display;
- EGLContext context;
- EGLint major, minor;
-
- CreateScreenResourcesProcPtr CreateScreenResources;
- CloseScreenProcPtr CloseScreen;
- int fd;
- EGLImageKHR front_image;
- PixmapPtr *back_pixmap;
- int cpp;
+ EGLDisplay display;
+ EGLContext context;
+ EGLint major, minor;
+
+ CreateScreenResourcesProcPtr CreateScreenResources;
+ CloseScreenProcPtr CloseScreen;
+ int fd;
+ EGLImageKHR front_image;
+ PixmapPtr *back_pixmap;
+ int cpp;
#ifdef GLAMOR_HAS_GBM
- struct gbm_device *gbm;
+ struct gbm_device *gbm;
#endif
- int has_gem;
- void *glamor_context;
- void *current_context;
- int gl_context_depth;
- int dri3_capable;
-
- PFNEGLCREATEIMAGEKHRPROC egl_create_image_khr;
- PFNEGLDESTROYIMAGEKHRPROC egl_destroy_image_khr;
- PFNGLEGLIMAGETARGETTEXTURE2DOESPROC egl_image_target_texture2d_oes;
- struct glamor_gl_dispatch *dispatch;
- CloseScreenProcPtr saved_close_screen;
- xf86FreeScreenProc *saved_free_screen;
+ int has_gem;
+ int gl_context_depth;
+ int dri3_capable;
+
+ PFNEGLCREATEIMAGEKHRPROC egl_create_image_khr;
+ PFNEGLDESTROYIMAGEKHRPROC egl_destroy_image_khr;
+ PFNGLEGLIMAGETARGETTEXTURE2DOESPROC egl_image_target_texture2d_oes;
+ struct glamor_gl_dispatch *dispatch;
+ CloseScreenProcPtr saved_close_screen;
+ xf86FreeScreenProc *saved_free_screen;
};
int xf86GlamorEGLPrivateIndex = -1;
@@ -111,646 +104,625 @@ int xf86GlamorEGLPrivateIndex = -1;
static struct glamor_egl_screen_private *
glamor_egl_get_screen_private(ScrnInfoPtr scrn)
{
- return (struct glamor_egl_screen_private *)
- scrn->privates[xf86GlamorEGLPrivateIndex].ptr;
+ return (struct glamor_egl_screen_private *)
+ scrn->privates[xf86GlamorEGLPrivateIndex].ptr;
}
-#ifdef GLX_USE_SHARED_DISPATCH
+
_X_EXPORT void
glamor_egl_make_current(ScreenPtr screen)
{
- ScrnInfoPtr scrn = xf86ScreenToScrn(screen);
- struct glamor_egl_screen_private *glamor_egl =
- glamor_egl_get_screen_private(scrn);
-
- if (glamor_egl->gl_context_depth++)
- return;
-
- GET_CURRENT_CONTEXT(glamor_egl->current_context);
-
- if (glamor_egl->glamor_context != glamor_egl->current_context) {
- eglMakeCurrent(glamor_egl->display, EGL_NO_SURFACE,
- EGL_NO_SURFACE, EGL_NO_CONTEXT);
- if (!eglMakeCurrent(glamor_egl->display,
- EGL_NO_SURFACE, EGL_NO_SURFACE,
- glamor_egl->context)) {
- FatalError("Failed to make EGL context current\n");
- }
- }
+ ScrnInfoPtr scrn = xf86ScreenToScrn(screen);
+ struct glamor_egl_screen_private *glamor_egl =
+ glamor_egl_get_screen_private(scrn);
+
+ if (glamor_egl->gl_context_depth++)
+ return;
+
+ if (glamor_egl->context != eglGetCurrentContext()) {
+ eglMakeCurrent(glamor_egl->display, EGL_NO_SURFACE,
+ EGL_NO_SURFACE, EGL_NO_CONTEXT);
+ if (!eglMakeCurrent(glamor_egl->display,
+ EGL_NO_SURFACE, EGL_NO_SURFACE,
+ glamor_egl->context)) {
+ FatalError("Failed to make EGL context current\n");
+ }
+ }
}
_X_EXPORT void
glamor_egl_restore_context(ScreenPtr screen)
{
- ScrnInfoPtr scrn = xf86ScreenToScrn(screen);
- struct glamor_egl_screen_private *glamor_egl =
- glamor_egl_get_screen_private(scrn);
+ ScrnInfoPtr scrn = xf86ScreenToScrn(screen);
+ struct glamor_egl_screen_private *glamor_egl =
+ glamor_egl_get_screen_private(scrn);
- if (--glamor_egl->gl_context_depth)
- return;
+ if (--glamor_egl->gl_context_depth)
+ return;
- if (glamor_egl->current_context &&
- glamor_egl->glamor_context != glamor_egl->current_context)
- SET_CURRENT_CONTEXT(glamor_egl->current_context);
+ eglMakeCurrent(glamor_egl->display, EGL_NO_SURFACE,
+ EGL_NO_SURFACE, EGL_NO_CONTEXT);
}
-#else
-#define glamor_egl_make_current(x)
-#define glamor_egl_restore_context(s)
-#endif
static EGLImageKHR
_glamor_egl_create_image(struct glamor_egl_screen_private *glamor_egl,
- int width, int height, int stride, int name, int depth)
+ int width, int height, int stride, int name, int depth)
{
- EGLImageKHR image;
- EGLint attribs[] = {
- EGL_WIDTH, 0,
- EGL_HEIGHT, 0,
- EGL_DRM_BUFFER_STRIDE_MESA, 0,
- EGL_DRM_BUFFER_FORMAT_MESA,
- EGL_DRM_BUFFER_FORMAT_ARGB32_MESA,
- EGL_DRM_BUFFER_USE_MESA,
- EGL_DRM_BUFFER_USE_SHARE_MESA |
- EGL_DRM_BUFFER_USE_SCANOUT_MESA,
- EGL_NONE
- };
- attribs[1] = width;
- attribs[3] = height;
- attribs[5] = stride;
- if (depth != 32 && depth != 24)
- return EGL_NO_IMAGE_KHR;
- image = glamor_egl->egl_create_image_khr(glamor_egl->display,
- glamor_egl->context,
- EGL_DRM_BUFFER_MESA,
- (void *) (uintptr_t)name, attribs);
- if (image == EGL_NO_IMAGE_KHR)
- return EGL_NO_IMAGE_KHR;
-
-
- return image;
+ EGLImageKHR image;
+
+ EGLint attribs[] = {
+ EGL_WIDTH, 0,
+ EGL_HEIGHT, 0,
+ EGL_DRM_BUFFER_STRIDE_MESA, 0,
+ EGL_DRM_BUFFER_FORMAT_MESA,
+ EGL_DRM_BUFFER_FORMAT_ARGB32_MESA,
+ EGL_DRM_BUFFER_USE_MESA,
+ EGL_DRM_BUFFER_USE_SHARE_MESA | EGL_DRM_BUFFER_USE_SCANOUT_MESA,
+ EGL_NONE
+ };
+ attribs[1] = width;
+ attribs[3] = height;
+ attribs[5] = stride;
+ if (depth != 32 && depth != 24)
+ return EGL_NO_IMAGE_KHR;
+ image = glamor_egl->egl_create_image_khr(glamor_egl->display,
+ glamor_egl->context,
+ EGL_DRM_BUFFER_MESA,
+ (void *) (uintptr_t) name,
+ attribs);
+ if (image == EGL_NO_IMAGE_KHR)
+ return EGL_NO_IMAGE_KHR;
+
+ return image;
}
static int
glamor_get_flink_name(int fd, int handle, int *name)
{
- struct drm_gem_flink flink;
- flink.handle = handle;
- if (ioctl(fd, DRM_IOCTL_GEM_FLINK, &flink) < 0)
- return FALSE;
- *name = flink.name;
- return TRUE;
+ struct drm_gem_flink flink;
+
+ flink.handle = handle;
+ if (ioctl(fd, DRM_IOCTL_GEM_FLINK, &flink) < 0)
+ return FALSE;
+ *name = flink.name;
+ return TRUE;
}
static Bool
glamor_create_texture_from_image(struct glamor_egl_screen_private
- *glamor_egl,
- EGLImageKHR image, GLuint * texture)
+ *glamor_egl,
+ EGLImageKHR image, GLuint * texture)
{
- glamor_egl->dispatch->glGenTextures(1, texture);
- glamor_egl->dispatch->glBindTexture(GL_TEXTURE_2D, *texture);
- glamor_egl->dispatch->glTexParameteri(GL_TEXTURE_2D,
- GL_TEXTURE_MIN_FILTER,
- GL_NEAREST);
- glamor_egl->dispatch->glTexParameteri(GL_TEXTURE_2D,
- GL_TEXTURE_MAG_FILTER,
- GL_NEAREST);
-
- (glamor_egl->egl_image_target_texture2d_oes) (GL_TEXTURE_2D,
- image);
- glamor_egl->dispatch->glBindTexture(GL_TEXTURE_2D, 0);
- return TRUE;
+ glamor_egl->dispatch->glGenTextures(1, texture);
+ glamor_egl->dispatch->glBindTexture(GL_TEXTURE_2D, *texture);
+ glamor_egl->dispatch->glTexParameteri(GL_TEXTURE_2D,
+ GL_TEXTURE_MIN_FILTER, GL_NEAREST);
+ glamor_egl->dispatch->glTexParameteri(GL_TEXTURE_2D,
+ GL_TEXTURE_MAG_FILTER, GL_NEAREST);
+
+ (glamor_egl->egl_image_target_texture2d_oes) (GL_TEXTURE_2D, image);
+ glamor_egl->dispatch->glBindTexture(GL_TEXTURE_2D, 0);
+ return TRUE;
}
unsigned int
-glamor_egl_create_argb8888_based_texture(ScreenPtr screen,
- int w,
- int h)
+glamor_egl_create_argb8888_based_texture(ScreenPtr screen, int w, int h)
{
- ScrnInfoPtr scrn = xf86ScreenToScrn(screen);
- struct glamor_egl_screen_private *glamor_egl;
- EGLImageKHR image;
- GLuint texture;
+ ScrnInfoPtr scrn = xf86ScreenToScrn(screen);
+ struct glamor_egl_screen_private *glamor_egl;
+ EGLImageKHR image;
+ GLuint texture;
+
#ifdef GLAMOR_HAS_DRI3_SUPPORT
- struct gbm_bo *bo;
- EGLNativePixmapType native_pixmap;
- glamor_egl = glamor_egl_get_screen_private(scrn);
- bo = gbm_bo_create (glamor_egl->gbm, w, h, GBM_FORMAT_ARGB8888,
- GBM_BO_USE_RENDERING |
- GBM_BO_USE_SCANOUT);
- if (!bo)
- return 0;
-
- /* If the following assignment raises an error or a warning
- * then that means EGLNativePixmapType is not struct gbm_bo *
- * on your platform: This code won't work and you should not
- * compile with dri3 support enabled */
- native_pixmap = bo;
-
- image = glamor_egl->egl_create_image_khr(glamor_egl->display,
- EGL_NO_CONTEXT,
- EGL_NATIVE_PIXMAP_KHR,
- native_pixmap, NULL);
- gbm_bo_destroy(bo);
- if (image == EGL_NO_IMAGE_KHR)
- return 0;
- glamor_create_texture_from_image(glamor_egl, image, &texture);
- glamor_egl->egl_destroy_image_khr(glamor_egl->display, image);
-
- return texture;
+ struct gbm_bo *bo;
+ EGLNativePixmapType native_pixmap;
+
+ glamor_egl = glamor_egl_get_screen_private(scrn);
+ bo = gbm_bo_create(glamor_egl->gbm, w, h, GBM_FORMAT_ARGB8888,
+ GBM_BO_USE_RENDERING | GBM_BO_USE_SCANOUT);
+ if (!bo)
+ return 0;
+
+ /* If the following assignment raises an error or a warning
+ * then that means EGLNativePixmapType is not struct gbm_bo *
+ * on your platform: This code won't work and you should not
+ * compile with dri3 support enabled */
+ native_pixmap = bo;
+
+ image = glamor_egl->egl_create_image_khr(glamor_egl->display,
+ EGL_NO_CONTEXT,
+ EGL_NATIVE_PIXMAP_KHR,
+ native_pixmap, NULL);
+ gbm_bo_destroy(bo);
+ if (image == EGL_NO_IMAGE_KHR)
+ return 0;
+ glamor_create_texture_from_image(glamor_egl, image, &texture);
+ glamor_egl->egl_destroy_image_khr(glamor_egl->display, image);
+
+ return texture;
#else
- return 0; /* this path should never happen */
+ return 0; /* this path should never happen */
#endif
}
Bool
glamor_egl_create_textured_screen(ScreenPtr screen, int handle, int stride)
{
- ScrnInfoPtr scrn = xf86ScreenToScrn(screen);
- struct glamor_egl_screen_private *glamor_egl;
- PixmapPtr screen_pixmap;
-
- glamor_egl = glamor_egl_get_screen_private(scrn);
- screen_pixmap = screen->GetScreenPixmap(screen);
-
- if (!glamor_egl_create_textured_pixmap(screen_pixmap, handle, stride)) {
- xf86DrvMsg(scrn->scrnIndex, X_ERROR, "Failed to create textured screen.");
- return FALSE;
- }
-
- glamor_egl->front_image = dixLookupPrivate(&screen_pixmap->devPrivates,
- glamor_egl_pixmap_private_key);
- glamor_set_screen_pixmap(screen_pixmap, glamor_egl->back_pixmap);
- return TRUE;
+ ScrnInfoPtr scrn = xf86ScreenToScrn(screen);
+ struct glamor_egl_screen_private *glamor_egl;
+ PixmapPtr screen_pixmap;
+
+ glamor_egl = glamor_egl_get_screen_private(scrn);
+ screen_pixmap = screen->GetScreenPixmap(screen);
+
+ if (!glamor_egl_create_textured_pixmap(screen_pixmap, handle, stride)) {
+ xf86DrvMsg(scrn->scrnIndex, X_ERROR,
+ "Failed to create textured screen.");
+ return FALSE;
+ }
+
+ glamor_egl->front_image = dixLookupPrivate(&screen_pixmap->devPrivates,
+ glamor_egl_pixmap_private_key);
+ glamor_set_screen_pixmap(screen_pixmap, glamor_egl->back_pixmap);
+ return TRUE;
}
Bool
glamor_egl_create_textured_screen_ext(ScreenPtr screen,
- int handle,
- int stride,
- PixmapPtr *back_pixmap)
+ int handle,
+ int stride, PixmapPtr *back_pixmap)
{
- ScrnInfoPtr scrn = xf86ScreenToScrn(screen);
- struct glamor_egl_screen_private *glamor_egl;
+ ScrnInfoPtr scrn = xf86ScreenToScrn(screen);
+ struct glamor_egl_screen_private *glamor_egl;
- glamor_egl = glamor_egl_get_screen_private(scrn);
+ glamor_egl = glamor_egl_get_screen_private(scrn);
- glamor_egl->back_pixmap = back_pixmap;
- if (!glamor_egl_create_textured_screen(screen, handle, stride))
- return FALSE;
- return TRUE;
+ glamor_egl->back_pixmap = back_pixmap;
+ if (!glamor_egl_create_textured_screen(screen, handle, stride))
+ return FALSE;
+ return TRUE;
}
static Bool
glamor_egl_check_has_gem(int fd)
{
- struct drm_gem_flink flink;
- flink.handle = 0;
+ struct drm_gem_flink flink;
- ioctl(fd, DRM_IOCTL_GEM_FLINK, &flink);
- if (errno == ENOENT || errno == EINVAL)
- return TRUE;
- return FALSE;
+ flink.handle = 0;
+
+ ioctl(fd, DRM_IOCTL_GEM_FLINK, &flink);
+ if (errno == ENOENT || errno == EINVAL)
+ return TRUE;
+ return FALSE;
}
Bool
glamor_egl_create_textured_pixmap(PixmapPtr pixmap, int handle, int stride)
{
- ScreenPtr screen = pixmap->drawable.pScreen;
- ScrnInfoPtr scrn = xf86ScreenToScrn(screen);
- struct glamor_egl_screen_private *glamor_egl;
- EGLImageKHR image;
- GLuint texture;
- int name;
- Bool ret = FALSE;
-
- glamor_egl = glamor_egl_get_screen_private(scrn);
-
- glamor_egl_make_current(screen);
- if (glamor_egl->has_gem) {
- if (!glamor_get_flink_name(glamor_egl->fd, handle, &name)) {
- xf86DrvMsg(scrn->scrnIndex, X_ERROR,
- "Couldn't flink pixmap handle\n");
- glamor_set_pixmap_type(pixmap, GLAMOR_DRM_ONLY);
- assert(0);
- return FALSE;
- }
- } else
- name = handle;
-
- image = _glamor_egl_create_image(glamor_egl,
- pixmap->drawable.width,
- pixmap->drawable.height,
- ((stride * 8 + 7) / pixmap->drawable.bitsPerPixel),
- name,
- pixmap->drawable.depth);
- if (image == EGL_NO_IMAGE_KHR) {
- glamor_set_pixmap_type(pixmap, GLAMOR_DRM_ONLY);
- goto done;
- }
- glamor_create_texture_from_image(glamor_egl, image, &texture);
- glamor_set_pixmap_type(pixmap, GLAMOR_TEXTURE_DRM);
- glamor_set_pixmap_texture(pixmap, texture);
- dixSetPrivate(&pixmap->devPrivates, glamor_egl_pixmap_private_key,
- image);
- ret = TRUE;
-
-done:
- glamor_egl_restore_context(screen);
- return ret;
+ ScreenPtr screen = pixmap->drawable.pScreen;
+ ScrnInfoPtr scrn = xf86ScreenToScrn(screen);
+ struct glamor_egl_screen_private *glamor_egl;
+ EGLImageKHR image;
+ GLuint texture;
+ int name;
+ Bool ret = FALSE;
+
+ glamor_egl = glamor_egl_get_screen_private(scrn);
+
+ glamor_egl_make_current(screen);
+ if (glamor_egl->has_gem) {
+ if (!glamor_get_flink_name(glamor_egl->fd, handle, &name)) {
+ xf86DrvMsg(scrn->scrnIndex, X_ERROR,
+ "Couldn't flink pixmap handle\n");
+ glamor_set_pixmap_type(pixmap, GLAMOR_DRM_ONLY);
+ assert(0);
+ return FALSE;
+ }
+ }
+ else
+ name = handle;
+
+ image = _glamor_egl_create_image(glamor_egl,
+ pixmap->drawable.width,
+ pixmap->drawable.height,
+ ((stride * 8 +
+ 7) / pixmap->drawable.bitsPerPixel),
+ name, pixmap->drawable.depth);
+ if (image == EGL_NO_IMAGE_KHR) {
+ glamor_set_pixmap_type(pixmap, GLAMOR_DRM_ONLY);
+ goto done;
+ }
+ glamor_create_texture_from_image(glamor_egl, image, &texture);
+ glamor_set_pixmap_type(pixmap, GLAMOR_TEXTURE_DRM);
+ glamor_set_pixmap_texture(pixmap, texture);
+ dixSetPrivate(&pixmap->devPrivates, glamor_egl_pixmap_private_key, image);
+ ret = TRUE;
+
+ done:
+ glamor_egl_restore_context(screen);
+ return ret;
}
Bool
glamor_egl_create_textured_pixmap_from_gbm_bo(PixmapPtr pixmap, void *bo)
{
- ScreenPtr screen = pixmap->drawable.pScreen;
- ScrnInfoPtr scrn = xf86ScreenToScrn(screen);
- struct glamor_egl_screen_private *glamor_egl;
- EGLImageKHR image;
- GLuint texture;
- Bool ret = FALSE;
-
- glamor_egl = glamor_egl_get_screen_private(scrn);
-
- glamor_egl_make_current(screen);
-
- image = glamor_egl->egl_create_image_khr(glamor_egl->display,
- glamor_egl->context,
- EGL_NATIVE_PIXMAP_KHR,
- bo, NULL);
- if (image == EGL_NO_IMAGE_KHR) {
- glamor_set_pixmap_type(pixmap, GLAMOR_DRM_ONLY);
- goto done;
- }
- glamor_create_texture_from_image(glamor_egl, image, &texture);
- glamor_set_pixmap_type(pixmap, GLAMOR_TEXTURE_DRM);
- glamor_set_pixmap_texture(pixmap, texture);
- dixSetPrivate(&pixmap->devPrivates, glamor_egl_pixmap_private_key,
- image);
- ret = TRUE;
-
-done:
- glamor_egl_restore_context(screen);
- return ret;
+ ScreenPtr screen = pixmap->drawable.pScreen;
+ ScrnInfoPtr scrn = xf86ScreenToScrn(screen);
+ struct glamor_egl_screen_private *glamor_egl;
+ EGLImageKHR image;
+ GLuint texture;
+ Bool ret = FALSE;
+
+ glamor_egl = glamor_egl_get_screen_private(scrn);
+
+ glamor_egl_make_current(screen);
+
+ image = glamor_egl->egl_create_image_khr(glamor_egl->display,
+ glamor_egl->context,
+ EGL_NATIVE_PIXMAP_KHR, bo, NULL);
+ if (image == EGL_NO_IMAGE_KHR) {
+ glamor_set_pixmap_type(pixmap, GLAMOR_DRM_ONLY);
+ goto done;
+ }
+ glamor_create_texture_from_image(glamor_egl, image, &texture);
+ glamor_set_pixmap_type(pixmap, GLAMOR_TEXTURE_DRM);
+ glamor_set_pixmap_texture(pixmap, texture);
+ dixSetPrivate(&pixmap->devPrivates, glamor_egl_pixmap_private_key, image);
+ ret = TRUE;
+
+ done:
+ glamor_egl_restore_context(screen);
+ return ret;
}
#ifdef GLAMOR_HAS_DRI3_SUPPORT
-int glamor_get_fd_from_bo (int gbm_fd, struct gbm_bo *bo, int *fd);
-void glamor_get_name_from_bo (int gbm_fd, struct gbm_bo *bo, int *name);
+int glamor_get_fd_from_bo(int gbm_fd, struct gbm_bo *bo, int *fd);
+void glamor_get_name_from_bo(int gbm_fd, struct gbm_bo *bo, int *name);
int
-glamor_get_fd_from_bo (int gbm_fd, struct gbm_bo *bo, int *fd)
+glamor_get_fd_from_bo(int gbm_fd, struct gbm_bo *bo, int *fd)
{
- union gbm_bo_handle handle;
- struct drm_prime_handle args;
-
- handle = gbm_bo_get_handle(bo);
- args.handle = handle.u32;
- args.flags = DRM_CLOEXEC;
- if (ioctl (gbm_fd, DRM_IOCTL_PRIME_HANDLE_TO_FD, &args))
- return FALSE;
- *fd = args.fd;
- return TRUE;
+ union gbm_bo_handle handle;
+ struct drm_prime_handle args;
+
+ handle = gbm_bo_get_handle(bo);
+ args.handle = handle.u32;
+ args.flags = DRM_CLOEXEC;
+ if (ioctl(gbm_fd, DRM_IOCTL_PRIME_HANDLE_TO_FD, &args))
+ return FALSE;
+ *fd = args.fd;
+ return TRUE;
}
void
-glamor_get_name_from_bo (int gbm_fd, struct gbm_bo *bo, int *name)
+glamor_get_name_from_bo(int gbm_fd, struct gbm_bo *bo, int *name)
{
- union gbm_bo_handle handle;
+ union gbm_bo_handle handle;
- handle = gbm_bo_get_handle(bo);
- if (!glamor_get_flink_name(gbm_fd, handle.u32, name))
- *name = -1;
+ handle = gbm_bo_get_handle(bo);
+ if (!glamor_get_flink_name(gbm_fd, handle.u32, name))
+ *name = -1;
}
#endif
-int glamor_egl_dri3_fd_name_from_tex (ScreenPtr screen,
- PixmapPtr pixmap,
- unsigned int tex,
- Bool want_name,
- CARD16 *stride,
- CARD32 *size)
+int
+glamor_egl_dri3_fd_name_from_tex(ScreenPtr screen,
+ PixmapPtr pixmap,
+ unsigned int tex,
+ Bool want_name, CARD16 *stride, CARD32 *size)
{
#ifdef GLAMOR_HAS_DRI3_SUPPORT
- ScrnInfoPtr scrn = xf86ScreenToScrn(screen);
- struct glamor_egl_screen_private *glamor_egl;
- EGLImageKHR image;
- struct gbm_bo* bo;
- int fd = -1;
-
- EGLint attribs[] = {
- EGL_IMAGE_PRESERVED_KHR, EGL_TRUE,
- EGL_GL_TEXTURE_LEVEL_KHR, 0,
- EGL_NONE
- };
-
- glamor_egl = glamor_egl_get_screen_private(scrn);
-
- glamor_egl_make_current(screen);
-
- image = dixLookupPrivate(&pixmap->devPrivates,
- glamor_egl_pixmap_private_key);
-
- if (image == EGL_NO_IMAGE_KHR || image == NULL)
- {
- image = glamor_egl->egl_create_image_khr(glamor_egl->display,
- glamor_egl->context,
- EGL_GL_TEXTURE_2D_KHR,
- (EGLClientBuffer)(uintptr_t)tex, attribs);
- if (image == EGL_NO_IMAGE_KHR)
- goto failure;
-
- dixSetPrivate(&pixmap->devPrivates,
- glamor_egl_pixmap_private_key,
- image);
- glamor_set_pixmap_type(pixmap, GLAMOR_TEXTURE_DRM);
- }
-
- bo = gbm_bo_import(glamor_egl->gbm, GBM_BO_IMPORT_EGL_IMAGE, image, 0);
- if (!bo)
- goto failure;
-
- pixmap->devKind = gbm_bo_get_stride(bo);
-
- if (want_name)
- {
- if (glamor_egl->has_gem)
- glamor_get_name_from_bo(glamor_egl->fd, bo, &fd);
- }
- else
- {
- if (glamor_get_fd_from_bo(glamor_egl->fd, bo, &fd))
- {
- *stride = pixmap->devKind;
- *size = pixmap->devKind * gbm_bo_get_height(bo);
- }
- }
-
- gbm_bo_destroy(bo);
-failure:
- glamor_egl_restore_context(screen);
- return fd;
+ ScrnInfoPtr scrn = xf86ScreenToScrn(screen);
+ struct glamor_egl_screen_private *glamor_egl;
+ EGLImageKHR image;
+ struct gbm_bo *bo;
+ int fd = -1;
+
+ EGLint attribs[] = {
+ EGL_IMAGE_PRESERVED_KHR, EGL_TRUE,
+ EGL_GL_TEXTURE_LEVEL_KHR, 0,
+ EGL_NONE
+ };
+
+ glamor_egl = glamor_egl_get_screen_private(scrn);
+
+ glamor_egl_make_current(screen);
+
+ image = dixLookupPrivate(&pixmap->devPrivates,
+ glamor_egl_pixmap_private_key);
+
+ if (image == EGL_NO_IMAGE_KHR || image == NULL) {
+ image = glamor_egl->egl_create_image_khr(glamor_egl->display,
+ glamor_egl->context,
+ EGL_GL_TEXTURE_2D_KHR,
+ (EGLClientBuffer) (uintptr_t)
+ tex, attribs);
+ if (image == EGL_NO_IMAGE_KHR)
+ goto failure;
+
+ dixSetPrivate(&pixmap->devPrivates,
+ glamor_egl_pixmap_private_key, image);
+ glamor_set_pixmap_type(pixmap, GLAMOR_TEXTURE_DRM);
+ }
+
+ bo = gbm_bo_import(glamor_egl->gbm, GBM_BO_IMPORT_EGL_IMAGE, image, 0);
+ if (!bo)
+ goto failure;
+
+ pixmap->devKind = gbm_bo_get_stride(bo);
+
+ if (want_name) {
+ if (glamor_egl->has_gem)
+ glamor_get_name_from_bo(glamor_egl->fd, bo, &fd);
+ }
+ else {
+ if (glamor_get_fd_from_bo(glamor_egl->fd, bo, &fd)) {
+ *stride = pixmap->devKind;
+ *size = pixmap->devKind * gbm_bo_get_height(bo);
+ }
+ }
+
+ gbm_bo_destroy(bo);
+ failure:
+ glamor_egl_restore_context(screen);
+ return fd;
#else
- return -1;
+ return -1;
#endif
}
-PixmapPtr glamor_egl_dri3_pixmap_from_fd (ScreenPtr screen,
- int fd,
- CARD16 width,
- CARD16 height,
- CARD16 stride,
- CARD8 depth,
- CARD8 bpp)
+PixmapPtr
+glamor_egl_dri3_pixmap_from_fd(ScreenPtr screen,
+ int fd,
+ CARD16 width,
+ CARD16 height,
+ CARD16 stride, CARD8 depth, CARD8 bpp)
{
#ifdef GLAMOR_HAS_DRI3_SUPPORT
- ScrnInfoPtr scrn = xf86ScreenToScrn(screen);
- struct glamor_egl_screen_private *glamor_egl;
- struct gbm_bo* bo;
- EGLImageKHR image;
- PixmapPtr pixmap;
- Bool ret = FALSE;
- EGLint attribs[] = {
- EGL_WIDTH, 0,
- EGL_HEIGHT, 0,
- EGL_LINUX_DRM_FOURCC_EXT, DRM_FORMAT_ARGB8888,
- EGL_DMA_BUF_PLANE0_FD_EXT, 0,
- EGL_DMA_BUF_PLANE0_OFFSET_EXT, 0,
- EGL_DMA_BUF_PLANE0_PITCH_EXT, 0,
- EGL_NONE
- };
-
- glamor_egl = glamor_egl_get_screen_private(scrn);
-
- if (!glamor_egl->dri3_capable)
- return NULL;
-
- if (bpp != 32 || !(depth == 24 || depth == 32) || width == 0 || height == 0)
- return NULL;
-
- attribs[1] = width;
- attribs[3] = height;
- attribs[7] = fd;
- attribs[11] = stride;
- image = glamor_egl->egl_create_image_khr(glamor_egl->display,
- EGL_NO_CONTEXT,
- EGL_LINUX_DMA_BUF_EXT,
- NULL, attribs);
-
- if (image == EGL_NO_IMAGE_KHR)
- return NULL;
-
- /* EGL_EXT_image_dma_buf_import can impose restrictions on the
- * usage of the image. Use gbm_bo to bypass the limitations. */
-
- bo = gbm_bo_import(glamor_egl->gbm, GBM_BO_IMPORT_EGL_IMAGE, image, 0);
- glamor_egl->egl_destroy_image_khr(glamor_egl->display, image);
-
- if (!bo)
- return NULL;
-
- pixmap = screen->CreatePixmap(screen, 0, 0, depth, 0);
- screen->ModifyPixmapHeader (pixmap, width, height, 0, 0, stride, NULL);
-
- ret = glamor_egl_create_textured_pixmap_from_gbm_bo(pixmap, bo);
- gbm_bo_destroy(bo);
-
- if (ret)
- return pixmap;
- else
- {
- screen->DestroyPixmap(pixmap);
- return NULL;
- }
+ ScrnInfoPtr scrn = xf86ScreenToScrn(screen);
+ struct glamor_egl_screen_private *glamor_egl;
+ struct gbm_bo *bo;
+ EGLImageKHR image;
+ PixmapPtr pixmap;
+ Bool ret = FALSE;
+
+ EGLint attribs[] = {
+ EGL_WIDTH, 0,
+ EGL_HEIGHT, 0,
+ EGL_LINUX_DRM_FOURCC_EXT, DRM_FORMAT_ARGB8888,
+ EGL_DMA_BUF_PLANE0_FD_EXT, 0,
+ EGL_DMA_BUF_PLANE0_OFFSET_EXT, 0,
+ EGL_DMA_BUF_PLANE0_PITCH_EXT, 0,
+ EGL_NONE
+ };
+
+ glamor_egl = glamor_egl_get_screen_private(scrn);
+
+ if (!glamor_egl->dri3_capable)
+ return NULL;
+
+ if (bpp != 32 || !(depth == 24 || depth == 32) || width == 0 || height == 0)
+ return NULL;
+
+ attribs[1] = width;
+ attribs[3] = height;
+ attribs[7] = fd;
+ attribs[11] = stride;
+ image = glamor_egl->egl_create_image_khr(glamor_egl->display,
+ EGL_NO_CONTEXT,
+ EGL_LINUX_DMA_BUF_EXT,
+ NULL, attribs);
+
+ if (image == EGL_NO_IMAGE_KHR)
+ return NULL;
+
+ /* EGL_EXT_image_dma_buf_import can impose restrictions on the
+ * usage of the image. Use gbm_bo to bypass the limitations. */
+
+ bo = gbm_bo_import(glamor_egl->gbm, GBM_BO_IMPORT_EGL_IMAGE, image, 0);
+ glamor_egl->egl_destroy_image_khr(glamor_egl->display, image);
+
+ if (!bo)
+ return NULL;
+
+ pixmap = screen->CreatePixmap(screen, 0, 0, depth, 0);
+ screen->ModifyPixmapHeader(pixmap, width, height, 0, 0, stride, NULL);
+
+ ret = glamor_egl_create_textured_pixmap_from_gbm_bo(pixmap, bo);
+ gbm_bo_destroy(bo);
+
+ if (ret)
+ return pixmap;
+ else {
+ screen->DestroyPixmap(pixmap);
+ return NULL;
+ }
#else
- return NULL;
+ return NULL;
#endif
}
static void
_glamor_egl_destroy_pixmap_image(PixmapPtr pixmap)
{
- ScrnInfoPtr scrn = xf86ScreenToScrn(pixmap->drawable.pScreen);
- EGLImageKHR image;
- struct glamor_egl_screen_private *glamor_egl =
- glamor_egl_get_screen_private(scrn);
-
- image = dixLookupPrivate(&pixmap->devPrivates,
- glamor_egl_pixmap_private_key);
- if (image != EGL_NO_IMAGE_KHR && image != NULL) {
- /* Before destroy an image which was attached to
- * a texture. we must call glFlush to make sure the
- * operation on that texture has been done.*/
- glamor_block_handler(pixmap->drawable.pScreen);
- glamor_egl->egl_destroy_image_khr(glamor_egl->display, image);
- dixSetPrivate(&pixmap->devPrivates, glamor_egl_pixmap_private_key, NULL);
- }
+ ScrnInfoPtr scrn = xf86ScreenToScrn(pixmap->drawable.pScreen);
+ EGLImageKHR image;
+ struct glamor_egl_screen_private *glamor_egl =
+ glamor_egl_get_screen_private(scrn);
+
+ image = dixLookupPrivate(&pixmap->devPrivates,
+ glamor_egl_pixmap_private_key);
+ if (image != EGL_NO_IMAGE_KHR && image != NULL) {
+ /* Before destroy an image which was attached to
+ * a texture. we must call glFlush to make sure the
+ * operation on that texture has been done.*/
+ glamor_block_handler(pixmap->drawable.pScreen);
+ glamor_egl->egl_destroy_image_khr(glamor_egl->display, image);
+ dixSetPrivate(&pixmap->devPrivates, glamor_egl_pixmap_private_key,
+ NULL);
+ }
}
_X_EXPORT void
glamor_egl_exchange_buffers(PixmapPtr front, PixmapPtr back)
{
- ScrnInfoPtr scrn = xf86ScreenToScrn(front->drawable.pScreen);
- struct glamor_egl_screen_private *glamor_egl =
- glamor_egl_get_screen_private(scrn);
- EGLImageKHR old_front_image;
- EGLImageKHR new_front_image;
-
- glamor_pixmap_exchange_fbos(front, back);
- new_front_image = dixLookupPrivate(&back->devPrivates, glamor_egl_pixmap_private_key);
- old_front_image = dixLookupPrivate(&front->devPrivates, glamor_egl_pixmap_private_key);
- dixSetPrivate(&front->devPrivates, glamor_egl_pixmap_private_key, new_front_image);
- dixSetPrivate(&back->devPrivates, glamor_egl_pixmap_private_key, old_front_image);
- glamor_set_pixmap_type(front, GLAMOR_TEXTURE_DRM);
- glamor_set_pixmap_type(back, GLAMOR_TEXTURE_DRM);
- glamor_egl->front_image = new_front_image;
+ ScrnInfoPtr scrn = xf86ScreenToScrn(front->drawable.pScreen);
+ struct glamor_egl_screen_private *glamor_egl =
+ glamor_egl_get_screen_private(scrn);
+ EGLImageKHR old_front_image;
+ EGLImageKHR new_front_image;
+
+ glamor_pixmap_exchange_fbos(front, back);
+ new_front_image =
+ dixLookupPrivate(&back->devPrivates, glamor_egl_pixmap_private_key);
+ old_front_image =
+ dixLookupPrivate(&front->devPrivates, glamor_egl_pixmap_private_key);
+ dixSetPrivate(&front->devPrivates, glamor_egl_pixmap_private_key,
+ new_front_image);
+ dixSetPrivate(&back->devPrivates, glamor_egl_pixmap_private_key,
+ old_front_image);
+ glamor_set_pixmap_type(front, GLAMOR_TEXTURE_DRM);
+ glamor_set_pixmap_type(back, GLAMOR_TEXTURE_DRM);
+ glamor_egl->front_image = new_front_image;
}
void
glamor_egl_destroy_textured_pixmap(PixmapPtr pixmap)
{
- if (pixmap->refcnt == 1)
- _glamor_egl_destroy_pixmap_image(pixmap);
- glamor_destroy_textured_pixmap(pixmap);
+ if (pixmap->refcnt == 1)
+ _glamor_egl_destroy_pixmap_image(pixmap);
+ glamor_destroy_textured_pixmap(pixmap);
}
static Bool
-glamor_egl_close_screen(CLOSE_SCREEN_ARGS_DECL)
+glamor_egl_close_screen(ScreenPtr screen)
{
- ScrnInfoPtr scrn;
- struct glamor_egl_screen_private *glamor_egl;
- PixmapPtr screen_pixmap;
- EGLImageKHR back_image;
-
- scrn = xf86ScreenToScrn(screen);
- glamor_egl = glamor_egl_get_screen_private(scrn);
- screen_pixmap = screen->GetScreenPixmap(screen);
-
- glamor_egl->egl_destroy_image_khr(glamor_egl->display, glamor_egl->front_image);
- dixSetPrivate(&screen_pixmap->devPrivates, glamor_egl_pixmap_private_key, NULL);
- glamor_egl->front_image = NULL;
- if (glamor_egl->back_pixmap && *glamor_egl->back_pixmap) {
- back_image = dixLookupPrivate(&(*glamor_egl->back_pixmap)->devPrivates,
- glamor_egl_pixmap_private_key);
- if (back_image != NULL && back_image != EGL_NO_IMAGE_KHR) {
- glamor_egl->egl_destroy_image_khr(glamor_egl->display, back_image);
- dixSetPrivate(&(*glamor_egl->back_pixmap)->devPrivates,
- glamor_egl_pixmap_private_key, NULL);
- }
- }
-
- screen->CloseScreen = glamor_egl->saved_close_screen;
-
- return screen->CloseScreen(CLOSE_SCREEN_ARGS);
+ ScrnInfoPtr scrn;
+ struct glamor_egl_screen_private *glamor_egl;
+ PixmapPtr screen_pixmap;
+ EGLImageKHR back_image;
+
+ scrn = xf86ScreenToScrn(screen);
+ glamor_egl = glamor_egl_get_screen_private(scrn);
+ screen_pixmap = screen->GetScreenPixmap(screen);
+
+ glamor_egl->egl_destroy_image_khr(glamor_egl->display,
+ glamor_egl->front_image);
+ dixSetPrivate(&screen_pixmap->devPrivates, glamor_egl_pixmap_private_key,
+ NULL);
+ glamor_egl->front_image = NULL;
+ if (glamor_egl->back_pixmap && *glamor_egl->back_pixmap) {
+ back_image = dixLookupPrivate(&(*glamor_egl->back_pixmap)->devPrivates,
+ glamor_egl_pixmap_private_key);
+ if (back_image != NULL && back_image != EGL_NO_IMAGE_KHR) {
+ glamor_egl->egl_destroy_image_khr(glamor_egl->display, back_image);
+ dixSetPrivate(&(*glamor_egl->back_pixmap)->devPrivates,
+ glamor_egl_pixmap_private_key, NULL);
+ }
+ }
+
+ screen->CloseScreen = glamor_egl->saved_close_screen;
+
+ return screen->CloseScreen(screen);
}
static Bool
glamor_egl_has_extension(struct glamor_egl_screen_private *glamor_egl,
- const char *extension)
+ const char *extension)
{
- const char *pext;
- int ext_len;
-
- ext_len = strlen(extension);
- pext =
- (const char *) eglQueryString(glamor_egl->display,
- EGL_EXTENSIONS);
- if (pext == NULL || extension == NULL)
- return FALSE;
- while ((pext = strstr(pext, extension)) != NULL) {
- if (pext[ext_len] == ' ' || pext[ext_len] == '\0')
- return TRUE;
- pext += ext_len;
- }
- return FALSE;
+ const char *pext;
+ int ext_len;
+
+ ext_len = strlen(extension);
+ pext = (const char *) eglQueryString(glamor_egl->display, EGL_EXTENSIONS);
+ if (pext == NULL || extension == NULL)
+ return FALSE;
+ while ((pext = strstr(pext, extension)) != NULL) {
+ if (pext[ext_len] == ' ' || pext[ext_len] == '\0')
+ return TRUE;
+ pext += ext_len;
+ }
+ return FALSE;
}
void
glamor_egl_screen_init(ScreenPtr screen)
{
- ScrnInfoPtr scrn = xf86ScreenToScrn(screen);
- struct glamor_egl_screen_private *glamor_egl =
- glamor_egl_get_screen_private(scrn);
+ ScrnInfoPtr scrn = xf86ScreenToScrn(screen);
+ struct glamor_egl_screen_private *glamor_egl =
+ glamor_egl_get_screen_private(scrn);
- glamor_egl->saved_close_screen = screen->CloseScreen;
- screen->CloseScreen = glamor_egl_close_screen;
+ glamor_egl->saved_close_screen = screen->CloseScreen;
+ screen->CloseScreen = glamor_egl_close_screen;
}
static void
-glamor_egl_free_screen(FREE_SCREEN_ARGS_DECL)
+glamor_egl_free_screen(ScrnInfoPtr scrn)
{
- ScrnInfoPtr scrn;
- struct glamor_egl_screen_private *glamor_egl;
-#ifndef XF86_SCRN_INTERFACE
- scrn = xf86Screens[arg];
-#else
- scrn = arg;
-#endif
+ struct glamor_egl_screen_private *glamor_egl;
- glamor_egl = glamor_egl_get_screen_private(scrn);
- if (glamor_egl != NULL) {
+ glamor_egl = glamor_egl_get_screen_private(scrn);
+ if (glamor_egl != NULL) {
- eglMakeCurrent(glamor_egl->display,
- EGL_NO_SURFACE, EGL_NO_SURFACE,
- EGL_NO_CONTEXT);
+ eglMakeCurrent(glamor_egl->display,
+ EGL_NO_SURFACE, EGL_NO_SURFACE, EGL_NO_CONTEXT);
#ifdef GLAMOR_HAS_GBM
- if (glamor_egl->gbm)
- gbm_device_destroy(glamor_egl->gbm);
+ if (glamor_egl->gbm)
+ gbm_device_destroy(glamor_egl->gbm);
#endif
- scrn->FreeScreen = glamor_egl->saved_free_screen;
- free(glamor_egl);
- scrn->FreeScreen(FREE_SCREEN_ARGS);
- }
+ scrn->FreeScreen = glamor_egl->saved_free_screen;
+ free(glamor_egl);
+ scrn->FreeScreen(scrn);
+ }
}
Bool
glamor_egl_init(ScrnInfoPtr scrn, int fd)
{
- struct glamor_egl_screen_private *glamor_egl;
- const char *version;
- EGLint config_attribs[] = {
+ struct glamor_egl_screen_private *glamor_egl;
+ const char *version;
+
+ EGLint config_attribs[] = {
#ifdef GLAMOR_GLES2
- EGL_CONTEXT_CLIENT_VERSION, 2,
+ EGL_CONTEXT_CLIENT_VERSION, 2,
#endif
- EGL_NONE
- };
-
- glamor_identify(0);
- glamor_egl = calloc(sizeof(*glamor_egl), 1);
- if (glamor_egl == NULL)
- return FALSE;
- if (xf86GlamorEGLPrivateIndex == -1)
- xf86GlamorEGLPrivateIndex =
- xf86AllocateScrnInfoPrivateIndex();
-
- scrn->privates[xf86GlamorEGLPrivateIndex].ptr = glamor_egl;
- glamor_egl->fd = fd;
+ EGL_NONE
+ };
+
+ glamor_identify(0);
+ glamor_egl = calloc(sizeof(*glamor_egl), 1);
+ if (glamor_egl == NULL)
+ return FALSE;
+ if (xf86GlamorEGLPrivateIndex == -1)
+ xf86GlamorEGLPrivateIndex = xf86AllocateScrnInfoPrivateIndex();
+
+ scrn->privates[xf86GlamorEGLPrivateIndex].ptr = glamor_egl;
+ glamor_egl->fd = fd;
#ifdef GLAMOR_HAS_GBM
- glamor_egl->gbm = gbm_create_device(glamor_egl->fd);
- if (glamor_egl->gbm == NULL) {
- ErrorF("couldn't get display device\n");
- return FALSE;
- }
- glamor_egl->display = eglGetDisplay(glamor_egl->gbm);
+ glamor_egl->gbm = gbm_create_device(glamor_egl->fd);
+ if (glamor_egl->gbm == NULL) {
+ ErrorF("couldn't get display device\n");
+ return FALSE;
+ }
+ glamor_egl->display = eglGetDisplay(glamor_egl->gbm);
#else
- glamor_egl->display = eglGetDisplay((EGLNativeDisplayType)(intptr_t)fd);
+ glamor_egl->display = eglGetDisplay((EGLNativeDisplayType) (intptr_t) fd);
#endif
- glamor_egl->has_gem = glamor_egl_check_has_gem(fd);
+ glamor_egl->has_gem = glamor_egl_check_has_gem(fd);
#ifndef GLAMOR_GLES2
- eglBindAPI(EGL_OPENGL_API);
+ eglBindAPI(EGL_OPENGL_API);
#else
- eglBindAPI(EGL_OPENGL_ES_API);
+ eglBindAPI(EGL_OPENGL_ES_API);
#endif
- if (!eglInitialize
- (glamor_egl->display, &glamor_egl->major, &glamor_egl->minor))
- {
- xf86DrvMsg(scrn->scrnIndex, X_ERROR,
- "eglInitialize() failed\n");
- return FALSE;
- }
+ if (!eglInitialize
+ (glamor_egl->display, &glamor_egl->major, &glamor_egl->minor)) {
+ xf86DrvMsg(scrn->scrnIndex, X_ERROR, "eglInitialize() failed\n");
+ return FALSE;
+ }
- version = eglQueryString(glamor_egl->display, EGL_VERSION);
- xf86Msg(X_INFO, "%s: EGL version %s:\n", glamor_name, version);
+ version = eglQueryString(glamor_egl->display, EGL_VERSION);
+ xf86Msg(X_INFO, "%s: EGL version %s:\n", glamor_name, version);
#define GLAMOR_CHECK_EGL_EXTENSION(EXT) \
if (!glamor_egl_has_extension(glamor_egl, "EGL_" #EXT)) { \
@@ -765,96 +737,89 @@ glamor_egl_init(ScrnInfoPtr scrn, int fd)
return FALSE; \
}
- GLAMOR_CHECK_EGL_EXTENSION(MESA_drm_image);
- GLAMOR_CHECK_EGL_EXTENSION(KHR_gl_renderbuffer_image);
+ GLAMOR_CHECK_EGL_EXTENSION(MESA_drm_image);
+ GLAMOR_CHECK_EGL_EXTENSION(KHR_gl_renderbuffer_image);
#ifdef GLAMOR_GLES2
- GLAMOR_CHECK_EGL_EXTENSIONS(KHR_surfaceless_context, KHR_surfaceless_gles2);
+ GLAMOR_CHECK_EGL_EXTENSIONS(KHR_surfaceless_context, KHR_surfaceless_gles2);
#else
- GLAMOR_CHECK_EGL_EXTENSIONS(KHR_surfaceless_context, KHR_surfaceless_opengl);
+ GLAMOR_CHECK_EGL_EXTENSIONS(KHR_surfaceless_context,
+ KHR_surfaceless_opengl);
#endif
#ifdef GLAMOR_HAS_DRI3_SUPPORT
- if (glamor_egl_has_extension(glamor_egl, "EGL_KHR_gl_texture_2D_image") &&
- glamor_egl_has_extension(glamor_egl, "EGL_EXT_image_dma_buf_import") )
- glamor_egl->dri3_capable = TRUE;
+ if (glamor_egl_has_extension(glamor_egl, "EGL_KHR_gl_texture_2D_image") &&
+ glamor_egl_has_extension(glamor_egl, "EGL_EXT_image_dma_buf_import"))
+ glamor_egl->dri3_capable = TRUE;
#endif
- glamor_egl->egl_create_image_khr = (PFNEGLCREATEIMAGEKHRPROC)
- eglGetProcAddress("eglCreateImageKHR");
-
- glamor_egl->egl_destroy_image_khr = (PFNEGLDESTROYIMAGEKHRPROC)
- eglGetProcAddress("eglDestroyImageKHR");
-
- glamor_egl->egl_image_target_texture2d_oes =
- (PFNGLEGLIMAGETARGETTEXTURE2DOESPROC)
- eglGetProcAddress("glEGLImageTargetTexture2DOES");
-
- if (!glamor_egl->egl_create_image_khr
- || !glamor_egl->egl_image_target_texture2d_oes) {
- xf86DrvMsg(scrn->scrnIndex, X_ERROR,
- "eglGetProcAddress() failed\n");
- return FALSE;
- }
-
- glamor_egl->context = eglCreateContext(glamor_egl->display,
- NULL, EGL_NO_CONTEXT,
- config_attribs);
- if (glamor_egl->context == EGL_NO_CONTEXT) {
- xf86DrvMsg(scrn->scrnIndex, X_ERROR,
- "Failed to create EGL context\n");
- return FALSE;
- }
-
- if (!eglMakeCurrent(glamor_egl->display,
- EGL_NO_SURFACE, EGL_NO_SURFACE,
- glamor_egl->context)) {
- xf86DrvMsg(scrn->scrnIndex, X_ERROR,
- "Failed to make EGL context current\n");
- return FALSE;
- }
-#ifdef GLX_USE_SHARED_DISPATCH
- GET_CURRENT_CONTEXT(glamor_egl->glamor_context);
-#endif
- glamor_egl->saved_free_screen = scrn->FreeScreen;
- scrn->FreeScreen = glamor_egl_free_screen;
+ glamor_egl->egl_create_image_khr = (PFNEGLCREATEIMAGEKHRPROC)
+ eglGetProcAddress("eglCreateImageKHR");
+
+ glamor_egl->egl_destroy_image_khr = (PFNEGLDESTROYIMAGEKHRPROC)
+ eglGetProcAddress("eglDestroyImageKHR");
+
+ glamor_egl->egl_image_target_texture2d_oes =
+ (PFNGLEGLIMAGETARGETTEXTURE2DOESPROC)
+ eglGetProcAddress("glEGLImageTargetTexture2DOES");
+
+ if (!glamor_egl->egl_create_image_khr
+ || !glamor_egl->egl_image_target_texture2d_oes) {
+ xf86DrvMsg(scrn->scrnIndex, X_ERROR, "eglGetProcAddress() failed\n");
+ return FALSE;
+ }
+
+ glamor_egl->context = eglCreateContext(glamor_egl->display,
+ NULL, EGL_NO_CONTEXT,
+ config_attribs);
+ if (glamor_egl->context == EGL_NO_CONTEXT) {
+ xf86DrvMsg(scrn->scrnIndex, X_ERROR, "Failed to create EGL context\n");
+ return FALSE;
+ }
+
+ if (!eglMakeCurrent(glamor_egl->display,
+ EGL_NO_SURFACE, EGL_NO_SURFACE, glamor_egl->context)) {
+ xf86DrvMsg(scrn->scrnIndex, X_ERROR,
+ "Failed to make EGL context current\n");
+ return FALSE;
+ }
+ glamor_egl->saved_free_screen = scrn->FreeScreen;
+ scrn->FreeScreen = glamor_egl_free_screen;
#ifdef GLAMOR_GLES2
- xf86DrvMsg(scrn->scrnIndex, X_INFO, "Using GLES2.\n");
-#ifdef GLX_USE_SHARED_DISPATCH
- xf86DrvMsg(scrn->scrnIndex, X_WARNING, "Glamor is using GLES2 but GLX needs GL. "
- "Indirect GLX may not work correctly.\n");
+ xf86DrvMsg(scrn->scrnIndex, X_INFO, "Using GLES2.\n");
+ xf86DrvMsg(scrn->scrnIndex, X_WARNING,
+ "Glamor is using GLES2 but GLX needs GL. "
+ "Indirect GLX may not work correctly.\n");
#endif
-#endif
- return TRUE;
+ return TRUE;
}
Bool
glamor_egl_init_textured_pixmap(ScreenPtr screen)
{
- ScrnInfoPtr scrn = xf86ScreenToScrn(screen);
- struct glamor_egl_screen_private *glamor_egl =
- glamor_egl_get_screen_private(scrn);
- if (!dixRegisterPrivateKey
- (glamor_egl_pixmap_private_key, PRIVATE_PIXMAP, 0)) {
- LogMessage(X_WARNING,
- "glamor%d: Failed to allocate egl pixmap private\n",
- screen->myNum);
- return FALSE;
- }
- if (glamor_egl->dri3_capable)
- glamor_enable_dri3(screen);
- return TRUE;
+ ScrnInfoPtr scrn = xf86ScreenToScrn(screen);
+ struct glamor_egl_screen_private *glamor_egl =
+ glamor_egl_get_screen_private(scrn);
+ if (!dixRegisterPrivateKey
+ (glamor_egl_pixmap_private_key, PRIVATE_PIXMAP, 0)) {
+ LogMessage(X_WARNING,
+ "glamor%d: Failed to allocate egl pixmap private\n",
+ screen->myNum);
+ return FALSE;
+ }
+ if (glamor_egl->dri3_capable)
+ glamor_enable_dri3(screen);
+ return TRUE;
}
Bool
glamor_gl_dispatch_init(ScreenPtr screen,
- struct glamor_gl_dispatch *dispatch,
- int gl_version)
+ struct glamor_gl_dispatch *dispatch, int gl_version)
{
- ScrnInfoPtr scrn = xf86ScreenToScrn(screen);
- struct glamor_egl_screen_private *glamor_egl =
- glamor_egl_get_screen_private(scrn);
- if (!glamor_gl_dispatch_init_impl
- (dispatch, gl_version, (get_proc_address_t)eglGetProcAddress))
- return FALSE;
- glamor_egl->dispatch = dispatch;
- return TRUE;
+ ScrnInfoPtr scrn = xf86ScreenToScrn(screen);
+ struct glamor_egl_screen_private *glamor_egl =
+ glamor_egl_get_screen_private(scrn);
+ if (!glamor_gl_dispatch_init_impl
+ (dispatch, gl_version, (get_proc_address_t) eglGetProcAddress))
+ return FALSE;
+ glamor_egl->dispatch = dispatch;
+ return TRUE;
}
diff --git a/xorg-server/glamor/glamor_egl_stubs.c b/xorg-server/glamor/glamor_egl_stubs.c
new file mode 100644
index 000000000..1449d0874
--- /dev/null
+++ b/xorg-server/glamor/glamor_egl_stubs.c
@@ -0,0 +1,64 @@
+/*
+ * Copyright © 2013 Intel Corporation
+ *
+ * Permission is hereby granted, free of charge, to any person obtaining a
+ * copy of this software and associated documentation files (the "Software"),
+ * to deal in the Software without restriction, including without limitation
+ * the rights to use, copy, modify, merge, publish, distribute, sublicense,
+ * and/or sell copies of the Software, and to permit persons to whom the
+ * Software is furnished to do so, subject to the following conditions:
+ *
+ * The above copyright notice and this permission notice (including the next
+ * paragraph) shall be included in all copies or substantial portions of the
+ * Software.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
+ * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+ * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
+ * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS
+ * IN THE SOFTWARE.
+ */
+
+/** @file glamor_egl_stubs.c
+ *
+ * Stubbed out glamor_egl.c functions for servers other than Xorg.
+ */
+
+#include "glamor_priv.h"
+
+void
+glamor_egl_screen_init(ScreenPtr screen)
+{
+}
+
+void
+glamor_egl_destroy_textured_pixmap(PixmapPtr pixmap)
+{
+}
+
+void
+glamor_egl_make_current(ScreenPtr screen)
+{
+}
+
+void
+glamor_egl_restore_context(ScreenPtr screen)
+{
+}
+
+int
+glamor_egl_dri3_fd_name_from_tex(ScreenPtr screen,
+ PixmapPtr pixmap,
+ unsigned int tex,
+ Bool want_name, CARD16 *stride, CARD32 *size)
+{
+ return 0;
+}
+
+unsigned int
+glamor_egl_create_argb8888_based_texture(ScreenPtr screen, int w, int h)
+{
+ return 0;
+}
diff --git a/xorg-server/glamor/glamor_eglmodule.c b/xorg-server/glamor/glamor_eglmodule.c
index 9a0dec9f2..5ddd60235 100644
--- a/xorg-server/glamor/glamor_eglmodule.c
+++ b/xorg-server/glamor/glamor_eglmodule.c
@@ -27,9 +27,7 @@
* Zhigang Gong <zhigang.gong@gmail.com>
*/
-#ifdef HAVE_CONFIG_H
-#include "config.h"
-#endif
+#include "dix-config.h"
#include <xorg-server.h>
#define GLAMOR_FOR_XORG
@@ -37,16 +35,16 @@
#include "glamor.h"
static XF86ModuleVersionInfo VersRec = {
- GLAMOR_EGL_MODULE_NAME,
- MODULEVENDORSTRING,
- MODINFOSTRING1,
- MODINFOSTRING2,
- XORG_VERSION_CURRENT,
- PACKAGE_VERSION_MAJOR, PACKAGE_VERSION_MINOR, PACKAGE_VERSION_PATCHLEVEL,
- ABI_CLASS_ANSIC, /* Only need the ansic layer */
- ABI_ANSIC_VERSION,
- MOD_CLASS_NONE,
- {0, 0, 0, 0} /* signature, to be patched into the file by a tool */
+ GLAMOR_EGL_MODULE_NAME,
+ MODULEVENDORSTRING,
+ MODINFOSTRING1,
+ MODINFOSTRING2,
+ XORG_VERSION_CURRENT,
+ PACKAGE_VERSION_MAJOR, PACKAGE_VERSION_MINOR, PACKAGE_VERSION_PATCHLEVEL,
+ ABI_CLASS_ANSIC, /* Only need the ansic layer */
+ ABI_ANSIC_VERSION,
+ MOD_CLASS_NONE,
+ {0, 0, 0, 0} /* signature, to be patched into the file by a tool */
};
_X_EXPORT XF86ModuleData glamoreglModuleData = { &VersRec, NULL, NULL };
diff --git a/xorg-server/glamor/glamor_fbo.c b/xorg-server/glamor/glamor_fbo.c
index d1b087ebe..d94e53071 100644
--- a/xorg-server/glamor/glamor_fbo.c
+++ b/xorg-server/glamor/glamor_fbo.c
@@ -44,547 +44,552 @@
&pos->member != (head); \
pos = __container_of(pos->member.prev, pos, member))
-
#define xorg_list_for_each_entry_safe_reverse(pos, tmp, head, member) \
for (pos = __container_of((head)->prev, pos, member), \
tmp = __container_of(pos->member.prev, pos, member); \
&pos->member != (head); \
pos = tmp, tmp = __container_of(pos->member.prev, tmp, member))
-inline static int cache_wbucket(int size)
+inline static int
+cache_wbucket(int size)
{
- int order = __fls(size / 32);
- if (order >= CACHE_BUCKET_WCOUNT)
- order = CACHE_BUCKET_WCOUNT - 1;
- return order;
+ int order = __fls(size / 32);
+
+ if (order >= CACHE_BUCKET_WCOUNT)
+ order = CACHE_BUCKET_WCOUNT - 1;
+ return order;
}
-inline static int cache_hbucket(int size)
+inline static int
+cache_hbucket(int size)
{
- int order = __fls(size / 32);
- if (order >= CACHE_BUCKET_HCOUNT)
- order = CACHE_BUCKET_HCOUNT - 1;
- return order;
+ int order = __fls(size / 32);
+
+ if (order >= CACHE_BUCKET_HCOUNT)
+ order = CACHE_BUCKET_HCOUNT - 1;
+ return order;
}
static glamor_pixmap_fbo *
glamor_pixmap_fbo_cache_get(glamor_screen_private *glamor_priv,
- int w, int h, GLenum format, int flag)
+ int w, int h, GLenum format, int flag)
{
- struct xorg_list *cache;
- glamor_pixmap_fbo *fbo_entry, *ret_fbo = NULL;
- int n_format;
+ struct xorg_list *cache;
+ glamor_pixmap_fbo *fbo_entry, *ret_fbo = NULL;
+ int n_format;
+
#ifdef NO_FBO_CACHE
- return NULL;
+ return NULL;
#else
- n_format = cache_format(format);
- if (n_format == -1)
- return NULL;
- cache = &glamor_priv->fbo_cache[n_format]
- [cache_wbucket(w)]
- [cache_hbucket(h)];
- if (!(flag & GLAMOR_CACHE_EXACT_SIZE)) {
- xorg_list_for_each_entry(fbo_entry, cache, list) {
- if (fbo_entry->width >= w && fbo_entry->height >= h) {
-
- DEBUGF("Request w %d h %d format %x \n", w, h, format);
- DEBUGF("got cache entry %p w %d h %d fbo %d tex %d format %x\n",
- fbo_entry, fbo_entry->width, fbo_entry->height,
- fbo_entry->fb, fbo_entry->tex);
- xorg_list_del(&fbo_entry->list);
- ret_fbo = fbo_entry;
- break;
- }
- }
- }
- else {
- xorg_list_for_each_entry(fbo_entry, cache, list) {
- if (fbo_entry->width == w && fbo_entry->height == h) {
-
- DEBUGF("Request w %d h %d format %x \n", w, h, format);
- DEBUGF("got cache entry %p w %d h %d fbo %d tex %d format %x\n",
- fbo_entry, fbo_entry->width, fbo_entry->height,
- fbo_entry->fb, fbo_entry->tex, fbo_entry->format);
- assert(format == fbo_entry->format);
- xorg_list_del(&fbo_entry->list);
- ret_fbo = fbo_entry;
- break;
- }
- }
- }
-
- if (ret_fbo)
- glamor_priv->fbo_cache_watermark -= ret_fbo->width * ret_fbo->height;
-
- assert(glamor_priv->fbo_cache_watermark >= 0);
-
- return ret_fbo;
+ n_format = cache_format(format);
+ if (n_format == -1)
+ return NULL;
+ cache = &glamor_priv->fbo_cache[n_format]
+ [cache_wbucket(w)]
+ [cache_hbucket(h)];
+ if (!(flag & GLAMOR_CACHE_EXACT_SIZE)) {
+ xorg_list_for_each_entry(fbo_entry, cache, list) {
+ if (fbo_entry->width >= w && fbo_entry->height >= h) {
+
+ DEBUGF("Request w %d h %d format %x \n", w, h, format);
+ DEBUGF("got cache entry %p w %d h %d fbo %d tex %d format %x\n",
+ fbo_entry, fbo_entry->width, fbo_entry->height,
+ fbo_entry->fb, fbo_entry->tex);
+ xorg_list_del(&fbo_entry->list);
+ ret_fbo = fbo_entry;
+ break;
+ }
+ }
+ }
+ else {
+ xorg_list_for_each_entry(fbo_entry, cache, list) {
+ if (fbo_entry->width == w && fbo_entry->height == h) {
+
+ DEBUGF("Request w %d h %d format %x \n", w, h, format);
+ DEBUGF("got cache entry %p w %d h %d fbo %d tex %d format %x\n",
+ fbo_entry, fbo_entry->width, fbo_entry->height,
+ fbo_entry->fb, fbo_entry->tex, fbo_entry->format);
+ assert(format == fbo_entry->format);
+ xorg_list_del(&fbo_entry->list);
+ ret_fbo = fbo_entry;
+ break;
+ }
+ }
+ }
+
+ if (ret_fbo)
+ glamor_priv->fbo_cache_watermark -= ret_fbo->width * ret_fbo->height;
+
+ assert(glamor_priv->fbo_cache_watermark >= 0);
+
+ return ret_fbo;
#endif
}
void
glamor_purge_fbo(glamor_pixmap_fbo *fbo)
{
- glamor_gl_dispatch *dispatch = glamor_get_dispatch(fbo->glamor_priv);
- if (fbo->fb)
- dispatch->glDeleteFramebuffers(1, &fbo->fb);
- if (fbo->tex)
- dispatch->glDeleteTextures(1, &fbo->tex);
- if (fbo->pbo)
- dispatch->glDeleteBuffers(1, &fbo->pbo);
- glamor_put_dispatch(fbo->glamor_priv);
-
- free(fbo);
+ glamor_gl_dispatch *dispatch = glamor_get_dispatch(fbo->glamor_priv);
+
+ if (fbo->fb)
+ dispatch->glDeleteFramebuffers(1, &fbo->fb);
+ if (fbo->tex)
+ dispatch->glDeleteTextures(1, &fbo->tex);
+ if (fbo->pbo)
+ dispatch->glDeleteBuffers(1, &fbo->pbo);
+ glamor_put_dispatch(fbo->glamor_priv);
+
+ free(fbo);
}
static void
glamor_pixmap_fbo_cache_put(glamor_pixmap_fbo *fbo)
{
- struct xorg_list *cache;
- int n_format;
+ struct xorg_list *cache;
+ int n_format;
#ifdef NO_FBO_CACHE
- glamor_purge_fbo(fbo);
- return;
+ glamor_purge_fbo(fbo);
+ return;
#else
- n_format = cache_format(fbo->format);
-
- if (fbo->fb == 0 || n_format == -1
- || fbo->glamor_priv->fbo_cache_watermark >= FBO_CACHE_THRESHOLD) {
- fbo->glamor_priv->tick += GLAMOR_CACHE_EXPIRE_MAX;
- glamor_fbo_expire(fbo->glamor_priv);
- glamor_purge_fbo(fbo);
- return;
- }
-
- cache = &fbo->glamor_priv->fbo_cache[n_format]
- [cache_wbucket(fbo->width)]
- [cache_hbucket(fbo->height)];
- DEBUGF("Put cache entry %p to cache %p w %d h %d format %x fbo %d tex %d \n", fbo, cache,
- fbo->width, fbo->height, fbo->format, fbo->fb, fbo->tex);
-
- fbo->glamor_priv->fbo_cache_watermark += fbo->width * fbo->height;
- xorg_list_add(&fbo->list, cache);
- fbo->expire = fbo->glamor_priv->tick + GLAMOR_CACHE_EXPIRE_MAX;
+ n_format = cache_format(fbo->format);
+
+ if (fbo->fb == 0 || n_format == -1
+ || fbo->glamor_priv->fbo_cache_watermark >= FBO_CACHE_THRESHOLD) {
+ fbo->glamor_priv->tick += GLAMOR_CACHE_EXPIRE_MAX;
+ glamor_fbo_expire(fbo->glamor_priv);
+ glamor_purge_fbo(fbo);
+ return;
+ }
+
+ cache = &fbo->glamor_priv->fbo_cache[n_format]
+ [cache_wbucket(fbo->width)]
+ [cache_hbucket(fbo->height)];
+ DEBUGF
+ ("Put cache entry %p to cache %p w %d h %d format %x fbo %d tex %d \n",
+ fbo, cache, fbo->width, fbo->height, fbo->format, fbo->fb, fbo->tex);
+
+ fbo->glamor_priv->fbo_cache_watermark += fbo->width * fbo->height;
+ xorg_list_add(&fbo->list, cache);
+ fbo->expire = fbo->glamor_priv->tick + GLAMOR_CACHE_EXPIRE_MAX;
#endif
}
static void
glamor_pixmap_ensure_fb(glamor_pixmap_fbo *fbo)
{
- glamor_gl_dispatch *dispatch;
- int status;
-
- dispatch = glamor_get_dispatch(fbo->glamor_priv);
-
- if (fbo->fb == 0)
- dispatch->glGenFramebuffers(1, &fbo->fb);
- assert(fbo->tex != 0);
- dispatch->glBindFramebuffer(GL_FRAMEBUFFER, fbo->fb);
- dispatch->glFramebufferTexture2D(GL_FRAMEBUFFER,
- GL_COLOR_ATTACHMENT0,
- GL_TEXTURE_2D, fbo->tex,
- 0);
- status = dispatch->glCheckFramebufferStatus(GL_FRAMEBUFFER);
- if (status != GL_FRAMEBUFFER_COMPLETE) {
- const char *str;
- switch (status) {
- case GL_FRAMEBUFFER_INCOMPLETE_ATTACHMENT:
- str = "incomplete attachment";
- break;
- case GL_FRAMEBUFFER_INCOMPLETE_MISSING_ATTACHMENT:
- str = "incomplete/missing attachment";
- break;
- case GL_FRAMEBUFFER_INCOMPLETE_DRAW_BUFFER:
- str = "incomplete draw buffer";
- break;
- case GL_FRAMEBUFFER_INCOMPLETE_READ_BUFFER:
- str = "incomplete read buffer";
- break;
- case GL_FRAMEBUFFER_UNSUPPORTED:
- str = "unsupported";
- break;
- case GL_FRAMEBUFFER_INCOMPLETE_MULTISAMPLE:
- str = "incomplete multiple";
- break;
- default:
- str = "unknown error";
- break;
- }
-
- FatalError("destination is framebuffer incomplete: %s [%x]\n",
- str, status);
- }
- glamor_put_dispatch(fbo->glamor_priv);
+ glamor_gl_dispatch *dispatch;
+ int status;
+
+ dispatch = glamor_get_dispatch(fbo->glamor_priv);
+
+ if (fbo->fb == 0)
+ dispatch->glGenFramebuffers(1, &fbo->fb);
+ assert(fbo->tex != 0);
+ dispatch->glBindFramebuffer(GL_FRAMEBUFFER, fbo->fb);
+ dispatch->glFramebufferTexture2D(GL_FRAMEBUFFER,
+ GL_COLOR_ATTACHMENT0,
+ GL_TEXTURE_2D, fbo->tex, 0);
+ status = dispatch->glCheckFramebufferStatus(GL_FRAMEBUFFER);
+ if (status != GL_FRAMEBUFFER_COMPLETE) {
+ const char *str;
+
+ switch (status) {
+ case GL_FRAMEBUFFER_INCOMPLETE_ATTACHMENT:
+ str = "incomplete attachment";
+ break;
+ case GL_FRAMEBUFFER_INCOMPLETE_MISSING_ATTACHMENT:
+ str = "incomplete/missing attachment";
+ break;
+ case GL_FRAMEBUFFER_INCOMPLETE_DRAW_BUFFER:
+ str = "incomplete draw buffer";
+ break;
+ case GL_FRAMEBUFFER_INCOMPLETE_READ_BUFFER:
+ str = "incomplete read buffer";
+ break;
+ case GL_FRAMEBUFFER_UNSUPPORTED:
+ str = "unsupported";
+ break;
+ case GL_FRAMEBUFFER_INCOMPLETE_MULTISAMPLE:
+ str = "incomplete multiple";
+ break;
+ default:
+ str = "unknown error";
+ break;
+ }
+
+ FatalError("destination is framebuffer incomplete: %s [%x]\n",
+ str, status);
+ }
+ glamor_put_dispatch(fbo->glamor_priv);
}
glamor_pixmap_fbo *
glamor_create_fbo_from_tex(glamor_screen_private *glamor_priv,
- int w, int h, GLenum format, GLint tex, int flag)
+ int w, int h, GLenum format, GLint tex, int flag)
{
- glamor_pixmap_fbo *fbo;
+ glamor_pixmap_fbo *fbo;
- fbo = calloc(1, sizeof(*fbo));
- if (fbo == NULL)
- return NULL;
+ fbo = calloc(1, sizeof(*fbo));
+ if (fbo == NULL)
+ return NULL;
- xorg_list_init(&fbo->list);
+ xorg_list_init(&fbo->list);
- fbo->tex = tex;
- fbo->width = w;
- fbo->height = h;
- fbo->format = format;
- fbo->glamor_priv = glamor_priv;
+ fbo->tex = tex;
+ fbo->width = w;
+ fbo->height = h;
+ fbo->format = format;
+ fbo->glamor_priv = glamor_priv;
- if (flag == GLAMOR_CREATE_PIXMAP_MAP) {
- glamor_gl_dispatch *dispatch;
- dispatch = glamor_get_dispatch(glamor_priv);
- dispatch->glGenBuffers(1, &fbo->pbo);
- glamor_put_dispatch(glamor_priv);
- goto done;
- }
+ if (flag == GLAMOR_CREATE_PIXMAP_MAP) {
+ glamor_gl_dispatch *dispatch;
- if (flag != GLAMOR_CREATE_FBO_NO_FBO)
- glamor_pixmap_ensure_fb(fbo);
+ dispatch = glamor_get_dispatch(glamor_priv);
+ dispatch->glGenBuffers(1, &fbo->pbo);
+ glamor_put_dispatch(glamor_priv);
+ goto done;
+ }
-done:
- return fbo;
-}
+ if (flag != GLAMOR_CREATE_FBO_NO_FBO)
+ glamor_pixmap_ensure_fb(fbo);
+ done:
+ return fbo;
+}
void
glamor_fbo_expire(glamor_screen_private *glamor_priv)
{
- struct xorg_list *cache;
- glamor_pixmap_fbo *fbo_entry, *tmp;
- int i,j,k;
-
- for(i = 0; i < CACHE_FORMAT_COUNT; i++)
- for(j = 0; j < CACHE_BUCKET_WCOUNT; j++)
- for(k = 0; k < CACHE_BUCKET_HCOUNT; k++) {
- cache = &glamor_priv->fbo_cache[i][j][k];
- xorg_list_for_each_entry_safe_reverse(fbo_entry, tmp, cache, list) {
- if (GLAMOR_TICK_AFTER(fbo_entry->expire, glamor_priv->tick)) {
- break;
- }
-
- glamor_priv->fbo_cache_watermark -= fbo_entry->width * fbo_entry->height;
- xorg_list_del(&fbo_entry->list);
- DEBUGF("cache %p fbo %p expired %d current %d \n", cache, fbo_entry,
- fbo_entry->expire, glamor_priv->tick);
- glamor_purge_fbo(fbo_entry);
- }
- }
+ struct xorg_list *cache;
+ glamor_pixmap_fbo *fbo_entry, *tmp;
+ int i, j, k;
+
+ for (i = 0; i < CACHE_FORMAT_COUNT; i++)
+ for (j = 0; j < CACHE_BUCKET_WCOUNT; j++)
+ for (k = 0; k < CACHE_BUCKET_HCOUNT; k++) {
+ cache = &glamor_priv->fbo_cache[i][j][k];
+ xorg_list_for_each_entry_safe_reverse(fbo_entry, tmp, cache,
+ list) {
+ if (GLAMOR_TICK_AFTER(fbo_entry->expire, glamor_priv->tick)) {
+ break;
+ }
+
+ glamor_priv->fbo_cache_watermark -=
+ fbo_entry->width * fbo_entry->height;
+ xorg_list_del(&fbo_entry->list);
+ DEBUGF("cache %p fbo %p expired %d current %d \n", cache,
+ fbo_entry, fbo_entry->expire, glamor_priv->tick);
+ glamor_purge_fbo(fbo_entry);
+ }
+ }
}
void
glamor_init_pixmap_fbo(ScreenPtr screen)
{
- glamor_screen_private *glamor_priv;
- int i,j,k;
-
- glamor_priv = glamor_get_screen_private(screen);
- for(i = 0; i < CACHE_FORMAT_COUNT; i++)
- for(j = 0; j < CACHE_BUCKET_WCOUNT; j++)
- for(k = 0; k < CACHE_BUCKET_HCOUNT; k++)
- {
- xorg_list_init(&glamor_priv->fbo_cache[i][j][k]);
- }
- glamor_priv->fbo_cache_watermark = 0;
+ glamor_screen_private *glamor_priv;
+ int i, j, k;
+
+ glamor_priv = glamor_get_screen_private(screen);
+ for (i = 0; i < CACHE_FORMAT_COUNT; i++)
+ for (j = 0; j < CACHE_BUCKET_WCOUNT; j++)
+ for (k = 0; k < CACHE_BUCKET_HCOUNT; k++) {
+ xorg_list_init(&glamor_priv->fbo_cache[i][j][k]);
+ }
+ glamor_priv->fbo_cache_watermark = 0;
}
void
glamor_fini_pixmap_fbo(ScreenPtr screen)
{
- struct xorg_list *cache;
- glamor_screen_private *glamor_priv;
- glamor_pixmap_fbo *fbo_entry, *tmp;
- int i,j,k;
-
- glamor_priv = glamor_get_screen_private(screen);
- for(i = 0; i < CACHE_FORMAT_COUNT; i++)
- for(j = 0; j < CACHE_BUCKET_WCOUNT; j++)
- for(k = 0; k < CACHE_BUCKET_HCOUNT; k++)
- {
- cache = &glamor_priv->fbo_cache[i][j][k];
- xorg_list_for_each_entry_safe_reverse(fbo_entry, tmp, cache, list) {
- xorg_list_del(&fbo_entry->list);
- glamor_purge_fbo(fbo_entry);
- }
- }
+ struct xorg_list *cache;
+ glamor_screen_private *glamor_priv;
+ glamor_pixmap_fbo *fbo_entry, *tmp;
+ int i, j, k;
+
+ glamor_priv = glamor_get_screen_private(screen);
+ for (i = 0; i < CACHE_FORMAT_COUNT; i++)
+ for (j = 0; j < CACHE_BUCKET_WCOUNT; j++)
+ for (k = 0; k < CACHE_BUCKET_HCOUNT; k++) {
+ cache = &glamor_priv->fbo_cache[i][j][k];
+ xorg_list_for_each_entry_safe_reverse(fbo_entry, tmp, cache,
+ list) {
+ xorg_list_del(&fbo_entry->list);
+ glamor_purge_fbo(fbo_entry);
+ }
+ }
}
void
glamor_destroy_fbo(glamor_pixmap_fbo *fbo)
{
- xorg_list_del(&fbo->list);
- glamor_pixmap_fbo_cache_put(fbo);
+ xorg_list_del(&fbo->list);
+ glamor_pixmap_fbo_cache_put(fbo);
}
static int
_glamor_create_tex(glamor_screen_private *glamor_priv,
- int w, int h, GLenum format)
+ int w, int h, GLenum format)
{
- glamor_gl_dispatch *dispatch;
- unsigned int tex = 0;
-
- /* With dri3, we want to allocate ARGB8888 pixmaps only.
- * Depending on the implementation, GL_RGBA might not
- * give us ARGB8888. We ask glamor_egl to use get
- * an ARGB8888 based texture for us. */
- if (glamor_priv->dri3_enabled && format == GL_RGBA)
- {
- tex = glamor_egl_create_argb8888_based_texture(glamor_priv->screen,
- w, h);
- }
- if (!tex)
- {
- dispatch = glamor_get_dispatch(glamor_priv);
- dispatch->glGenTextures(1, &tex);
- dispatch->glBindTexture(GL_TEXTURE_2D, tex);
- dispatch->glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER,
- GL_NEAREST);
- dispatch->glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER,
- GL_NEAREST);
- dispatch->glTexImage2D(GL_TEXTURE_2D, 0, format, w, h, 0,
- format, GL_UNSIGNED_BYTE, NULL);
- glamor_put_dispatch(glamor_priv);
- }
- return tex;
+ glamor_gl_dispatch *dispatch;
+ unsigned int tex = 0;
+
+ /* With dri3, we want to allocate ARGB8888 pixmaps only.
+ * Depending on the implementation, GL_RGBA might not
+ * give us ARGB8888. We ask glamor_egl to use get
+ * an ARGB8888 based texture for us. */
+ if (glamor_priv->dri3_enabled && format == GL_RGBA) {
+ tex = glamor_egl_create_argb8888_based_texture(glamor_priv->screen,
+ w, h);
+ }
+ if (!tex) {
+ dispatch = glamor_get_dispatch(glamor_priv);
+ dispatch->glGenTextures(1, &tex);
+ dispatch->glBindTexture(GL_TEXTURE_2D, tex);
+ dispatch->glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER,
+ GL_NEAREST);
+ dispatch->glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER,
+ GL_NEAREST);
+ dispatch->glTexImage2D(GL_TEXTURE_2D, 0, format, w, h, 0,
+ format, GL_UNSIGNED_BYTE, NULL);
+ glamor_put_dispatch(glamor_priv);
+ }
+ return tex;
}
glamor_pixmap_fbo *
glamor_create_fbo(glamor_screen_private *glamor_priv,
- int w, int h,
- GLenum format,
- int flag)
+ int w, int h, GLenum format, int flag)
{
- glamor_pixmap_fbo *fbo;
- GLint tex = 0;
- int cache_flag;
-
- if (!glamor_check_fbo_size(glamor_priv, w, h))
- return NULL;
-
- if (flag == GLAMOR_CREATE_FBO_NO_FBO)
- goto new_fbo;
-
- if (flag == GLAMOR_CREATE_PIXMAP_MAP)
- goto no_tex;
-
- if (flag == GLAMOR_CREATE_PIXMAP_FIXUP)
- cache_flag = GLAMOR_CACHE_EXACT_SIZE;
- else
- cache_flag = 0;
-
- fbo = glamor_pixmap_fbo_cache_get(glamor_priv, w, h,
- format, cache_flag);
- if (fbo)
- return fbo;
-new_fbo:
- tex = _glamor_create_tex(glamor_priv, w, h, format);
-no_tex:
- fbo = glamor_create_fbo_from_tex(glamor_priv, w, h, format, tex, flag);
-
- return fbo;
+ glamor_pixmap_fbo *fbo;
+ GLint tex = 0;
+ int cache_flag;
+
+ if (!glamor_check_fbo_size(glamor_priv, w, h))
+ return NULL;
+
+ if (flag == GLAMOR_CREATE_FBO_NO_FBO)
+ goto new_fbo;
+
+ if (flag == GLAMOR_CREATE_PIXMAP_MAP)
+ goto no_tex;
+
+ if (flag == GLAMOR_CREATE_PIXMAP_FIXUP)
+ cache_flag = GLAMOR_CACHE_EXACT_SIZE;
+ else
+ cache_flag = 0;
+
+ fbo = glamor_pixmap_fbo_cache_get(glamor_priv, w, h, format, cache_flag);
+ if (fbo)
+ return fbo;
+ new_fbo:
+ tex = _glamor_create_tex(glamor_priv, w, h, format);
+ no_tex:
+ fbo = glamor_create_fbo_from_tex(glamor_priv, w, h, format, tex, flag);
+
+ return fbo;
}
static glamor_pixmap_fbo *
_glamor_create_fbo_array(glamor_screen_private *glamor_priv,
- int w, int h, GLenum format, int flag,
- int block_w, int block_h,
- glamor_pixmap_private *pixmap_priv,
- int has_fbo)
+ int w, int h, GLenum format, int flag,
+ int block_w, int block_h,
+ glamor_pixmap_private *pixmap_priv, int has_fbo)
{
- int block_wcnt;
- int block_hcnt;
- glamor_pixmap_fbo **fbo_array;
- BoxPtr box_array;
- int i,j;
- glamor_pixmap_private_large_t *priv;
-
- priv = &pixmap_priv->large;
-
- block_wcnt = (w + block_w - 1) / block_w;
- block_hcnt = (h + block_h - 1) / block_h;
-
- box_array = calloc(block_wcnt * block_hcnt, sizeof(box_array[0]));
- if (box_array == NULL)
- return NULL;
-
- fbo_array = calloc(block_wcnt * block_hcnt, sizeof(glamor_pixmap_fbo*));
- if (fbo_array == NULL) {
- free(box_array);
- return FALSE;
- }
- for(i = 0; i < block_hcnt; i++)
- {
- int block_y1, block_y2;
- int fbo_w, fbo_h;
-
- block_y1 = i * block_h;
- block_y2 = (block_y1 + block_h) > h ? h : (block_y1 + block_h);
- fbo_h = block_y2 - block_y1;
-
- for (j = 0; j < block_wcnt; j++)
- {
- box_array[i * block_wcnt + j].x1 = j * block_w;
- box_array[i * block_wcnt + j].y1 = block_y1;
- box_array[i * block_wcnt + j].x2 = (j + 1) * block_w > w ? w : (j + 1) * block_w;
- box_array[i * block_wcnt + j].y2 = block_y2;
- fbo_w = box_array[i * block_wcnt + j].x2 - box_array[i * block_wcnt + j].x1;
- if (!has_fbo)
- fbo_array[i * block_wcnt + j] = glamor_create_fbo(glamor_priv,
- fbo_w, fbo_h, format,
- GLAMOR_CREATE_PIXMAP_FIXUP);
- else
- fbo_array[i * block_wcnt + j] = priv->base.fbo;
- if (fbo_array[i * block_wcnt + j] == NULL)
- goto cleanup;
- }
- }
-
- priv->box = box_array[0];
- priv->box_array = box_array;
- priv->fbo_array = fbo_array;
- priv->block_wcnt = block_wcnt;
- priv->block_hcnt = block_hcnt;
- return fbo_array[0];
-
-cleanup:
- for(i = 0; i < block_wcnt * block_hcnt; i++)
- if ((fbo_array)[i])
- glamor_destroy_fbo((fbo_array)[i]);
- free(box_array);
- free(fbo_array);
- return NULL;
+ int block_wcnt;
+ int block_hcnt;
+ glamor_pixmap_fbo **fbo_array;
+ BoxPtr box_array;
+ int i, j;
+ glamor_pixmap_private_large_t *priv;
+
+ priv = &pixmap_priv->large;
+
+ block_wcnt = (w + block_w - 1) / block_w;
+ block_hcnt = (h + block_h - 1) / block_h;
+
+ box_array = calloc(block_wcnt * block_hcnt, sizeof(box_array[0]));
+ if (box_array == NULL)
+ return NULL;
+
+ fbo_array = calloc(block_wcnt * block_hcnt, sizeof(glamor_pixmap_fbo *));
+ if (fbo_array == NULL) {
+ free(box_array);
+ return FALSE;
+ }
+ for (i = 0; i < block_hcnt; i++) {
+ int block_y1, block_y2;
+ int fbo_w, fbo_h;
+
+ block_y1 = i * block_h;
+ block_y2 = (block_y1 + block_h) > h ? h : (block_y1 + block_h);
+ fbo_h = block_y2 - block_y1;
+
+ for (j = 0; j < block_wcnt; j++) {
+ box_array[i * block_wcnt + j].x1 = j * block_w;
+ box_array[i * block_wcnt + j].y1 = block_y1;
+ box_array[i * block_wcnt + j].x2 =
+ (j + 1) * block_w > w ? w : (j + 1) * block_w;
+ box_array[i * block_wcnt + j].y2 = block_y2;
+ fbo_w =
+ box_array[i * block_wcnt + j].x2 - box_array[i * block_wcnt +
+ j].x1;
+ if (!has_fbo)
+ fbo_array[i * block_wcnt + j] = glamor_create_fbo(glamor_priv,
+ fbo_w, fbo_h,
+ format,
+ GLAMOR_CREATE_PIXMAP_FIXUP);
+ else
+ fbo_array[i * block_wcnt + j] = priv->base.fbo;
+ if (fbo_array[i * block_wcnt + j] == NULL)
+ goto cleanup;
+ }
+ }
+
+ priv->box = box_array[0];
+ priv->box_array = box_array;
+ priv->fbo_array = fbo_array;
+ priv->block_wcnt = block_wcnt;
+ priv->block_hcnt = block_hcnt;
+ return fbo_array[0];
+
+ cleanup:
+ for (i = 0; i < block_wcnt * block_hcnt; i++)
+ if ((fbo_array)[i])
+ glamor_destroy_fbo((fbo_array)[i]);
+ free(box_array);
+ free(fbo_array);
+ return NULL;
}
-
/* Create a fbo array to cover the w*h region, by using block_w*block_h
* block.*/
glamor_pixmap_fbo *
glamor_create_fbo_array(glamor_screen_private *glamor_priv,
- int w, int h, GLenum format, int flag,
- int block_w, int block_h,
- glamor_pixmap_private *pixmap_priv)
+ int w, int h, GLenum format, int flag,
+ int block_w, int block_h,
+ glamor_pixmap_private *pixmap_priv)
{
- pixmap_priv->large.block_w = block_w;
- pixmap_priv->large.block_h = block_h;
- return _glamor_create_fbo_array(glamor_priv, w, h, format, flag,
- block_w, block_h, pixmap_priv, 0);
+ pixmap_priv->large.block_w = block_w;
+ pixmap_priv->large.block_h = block_h;
+ return _glamor_create_fbo_array(glamor_priv, w, h, format, flag,
+ block_w, block_h, pixmap_priv, 0);
}
glamor_pixmap_fbo *
glamor_pixmap_detach_fbo(glamor_pixmap_private *pixmap_priv)
{
- glamor_pixmap_fbo *fbo;
+ glamor_pixmap_fbo *fbo;
- if (pixmap_priv == NULL)
- return NULL;
+ if (pixmap_priv == NULL)
+ return NULL;
- fbo = pixmap_priv->base.fbo;
- if (fbo == NULL)
- return NULL;
+ fbo = pixmap_priv->base.fbo;
+ if (fbo == NULL)
+ return NULL;
- pixmap_priv->base.fbo = NULL;
- return fbo;
+ pixmap_priv->base.fbo = NULL;
+ return fbo;
}
/* The pixmap must not be attached to another fbo. */
void
glamor_pixmap_attach_fbo(PixmapPtr pixmap, glamor_pixmap_fbo *fbo)
{
- glamor_pixmap_private *pixmap_priv;
-
- pixmap_priv = glamor_get_pixmap_private(pixmap);
-
- if (pixmap_priv->base.fbo)
- return;
-
- pixmap_priv->base.fbo = fbo;
-
- switch (pixmap_priv->type) {
- case GLAMOR_TEXTURE_LARGE:
- case GLAMOR_TEXTURE_ONLY:
- case GLAMOR_TEXTURE_DRM:
- pixmap_priv->base.gl_fbo = 1;
- if (fbo->tex != 0)
- pixmap_priv->base.gl_tex = 1;
- else {
- /* XXX For the Xephyr only, may be broken now.*/
- pixmap_priv->base.gl_tex = 0;
- }
- case GLAMOR_MEMORY_MAP:
- pixmap->devPrivate.ptr = NULL;
- break;
- default:
- break;
- }
+ glamor_pixmap_private *pixmap_priv;
+
+ pixmap_priv = glamor_get_pixmap_private(pixmap);
+
+ if (pixmap_priv->base.fbo)
+ return;
+
+ pixmap_priv->base.fbo = fbo;
+
+ switch (pixmap_priv->type) {
+ case GLAMOR_TEXTURE_LARGE:
+ case GLAMOR_TEXTURE_ONLY:
+ case GLAMOR_TEXTURE_DRM:
+ pixmap_priv->base.gl_fbo = 1;
+ if (fbo->tex != 0)
+ pixmap_priv->base.gl_tex = 1;
+ else {
+ /* XXX For the Xephyr only, may be broken now. */
+ pixmap_priv->base.gl_tex = 0;
+ }
+ case GLAMOR_MEMORY_MAP:
+ pixmap->devPrivate.ptr = NULL;
+ break;
+ default:
+ break;
+ }
}
void
glamor_pixmap_destroy_fbo(glamor_pixmap_private *priv)
{
- glamor_pixmap_fbo *fbo;
- if (priv->type == GLAMOR_TEXTURE_LARGE) {
- int i;
- glamor_pixmap_private_large_t *large = &priv->large;
- for(i = 0; i < large->block_wcnt * large->block_hcnt; i++)
- glamor_destroy_fbo(large->fbo_array[i]);
- free(large->fbo_array);
- } else {
- fbo = glamor_pixmap_detach_fbo(priv);
- if (fbo)
- glamor_destroy_fbo(fbo);
- }
-
- free(priv);
+ glamor_pixmap_fbo *fbo;
+
+ if (priv->type == GLAMOR_TEXTURE_LARGE) {
+ int i;
+ glamor_pixmap_private_large_t *large = &priv->large;
+
+ for (i = 0; i < large->block_wcnt * large->block_hcnt; i++)
+ glamor_destroy_fbo(large->fbo_array[i]);
+ free(large->fbo_array);
+ }
+ else {
+ fbo = glamor_pixmap_detach_fbo(priv);
+ if (fbo)
+ glamor_destroy_fbo(fbo);
+ }
+
+ free(priv);
}
Bool
glamor_pixmap_ensure_fbo(PixmapPtr pixmap, GLenum format, int flag)
{
- glamor_screen_private *glamor_priv;
- glamor_pixmap_private *pixmap_priv;
- glamor_pixmap_fbo *fbo;
-
- glamor_priv = glamor_get_screen_private(pixmap->drawable.pScreen);
- pixmap_priv = glamor_get_pixmap_private(pixmap);
- if (pixmap_priv->base.fbo == NULL) {
-
- fbo = glamor_create_fbo(glamor_priv, pixmap->drawable.width,
- pixmap->drawable.height,
- format,
- flag);
- if (fbo == NULL)
- return FALSE;
-
- glamor_pixmap_attach_fbo(pixmap, fbo);
- } else {
- /* We do have a fbo, but it may lack of fb or tex. */
- if (!pixmap_priv->base.fbo->tex)
- pixmap_priv->base.fbo->tex = _glamor_create_tex(glamor_priv, pixmap->drawable.width,
- pixmap->drawable.height, format);
-
- if (flag != GLAMOR_CREATE_FBO_NO_FBO && pixmap_priv->base.fbo->fb == 0)
- glamor_pixmap_ensure_fb(pixmap_priv->base.fbo);
- }
-
- return TRUE;
+ glamor_screen_private *glamor_priv;
+ glamor_pixmap_private *pixmap_priv;
+ glamor_pixmap_fbo *fbo;
+
+ glamor_priv = glamor_get_screen_private(pixmap->drawable.pScreen);
+ pixmap_priv = glamor_get_pixmap_private(pixmap);
+ if (pixmap_priv->base.fbo == NULL) {
+
+ fbo = glamor_create_fbo(glamor_priv, pixmap->drawable.width,
+ pixmap->drawable.height, format, flag);
+ if (fbo == NULL)
+ return FALSE;
+
+ glamor_pixmap_attach_fbo(pixmap, fbo);
+ }
+ else {
+ /* We do have a fbo, but it may lack of fb or tex. */
+ if (!pixmap_priv->base.fbo->tex)
+ pixmap_priv->base.fbo->tex =
+ _glamor_create_tex(glamor_priv, pixmap->drawable.width,
+ pixmap->drawable.height, format);
+
+ if (flag != GLAMOR_CREATE_FBO_NO_FBO && pixmap_priv->base.fbo->fb == 0)
+ glamor_pixmap_ensure_fb(pixmap_priv->base.fbo);
+ }
+
+ return TRUE;
}
_X_EXPORT void
glamor_pixmap_exchange_fbos(PixmapPtr front, PixmapPtr back)
{
- glamor_pixmap_private *front_priv, *back_priv;
- glamor_pixmap_fbo *temp_fbo;
-
- front_priv = glamor_get_pixmap_private(front);
- back_priv = glamor_get_pixmap_private(back);
- temp_fbo = front_priv->base.fbo;
- front_priv->base.fbo = back_priv->base.fbo;
- back_priv->base.fbo = temp_fbo;
+ glamor_pixmap_private *front_priv, *back_priv;
+ glamor_pixmap_fbo *temp_fbo;
+
+ front_priv = glamor_get_pixmap_private(front);
+ back_priv = glamor_get_pixmap_private(back);
+ temp_fbo = front_priv->base.fbo;
+ front_priv->base.fbo = back_priv->base.fbo;
+ back_priv->base.fbo = temp_fbo;
}
diff --git a/xorg-server/glamor/glamor_fill.c b/xorg-server/glamor/glamor_fill.c
index fbc87392e..d59e6204f 100644
--- a/xorg-server/glamor/glamor_fill.c
+++ b/xorg-server/glamor/glamor_fill.c
@@ -33,332 +33,325 @@
*/
Bool
glamor_fill(DrawablePtr drawable,
- GCPtr gc, int x, int y, int width, int height, Bool fallback)
+ GCPtr gc, int x, int y, int width, int height, Bool fallback)
{
- PixmapPtr dst_pixmap = glamor_get_drawable_pixmap(drawable);
- int off_x, off_y;
- PixmapPtr sub_pixmap = NULL;
- glamor_access_t sub_pixmap_access;
- DrawablePtr saved_drawable = NULL;
- int saved_x = x, saved_y = y;
-
- glamor_get_drawable_deltas(drawable, dst_pixmap, &off_x, &off_y);
-
- switch (gc->fillStyle) {
- case FillSolid:
- if (!glamor_solid(dst_pixmap,
- x + off_x,
- y + off_y,
- width, height, gc->alu, gc->planemask,
- gc->fgPixel))
- goto fail;
- break;
- case FillStippled:
- case FillOpaqueStippled:
- if (!glamor_stipple(dst_pixmap,
- gc->stipple,
- x + off_x,
- y + off_y,
- width,
- height,
- gc->alu,
- gc->planemask,
- gc->fgPixel,
- gc->bgPixel, gc->patOrg.x,
- gc->patOrg.y))
- goto fail;
- break;
- case FillTiled:
- if (!glamor_tile(dst_pixmap,
- gc->tile.pixmap,
- x + off_x,
- y + off_y,
- width,
- height,
- gc->alu,
- gc->planemask,
- x - drawable->x - gc->patOrg.x,
- y - drawable->y - gc->patOrg.y))
- goto fail;
- break;
- }
- return TRUE;
-
- fail:
- if (!fallback) {
- if (glamor_ddx_fallback_check_pixmap(&dst_pixmap->drawable)
- && glamor_ddx_fallback_check_gc(gc))
- return FALSE;
- }
- /* Is it possible to set the access as WO? */
-
- sub_pixmap_access = GLAMOR_ACCESS_RW;
-
- sub_pixmap = glamor_get_sub_pixmap(dst_pixmap, x + off_x,
- y + off_y, width, height,
- sub_pixmap_access);
-
- if (sub_pixmap != NULL) {
- if (gc->fillStyle != FillSolid) {
- gc->patOrg.x += (drawable->x - x);
- gc->patOrg.y += (drawable->y - y);
- }
- saved_drawable = drawable;
- drawable = &sub_pixmap->drawable;
- saved_x = x;
- saved_y = y;
- x = 0;
- y = 0;
- }
- if (glamor_prepare_access(drawable, GLAMOR_ACCESS_RW)) {
- if (glamor_prepare_access_gc(gc)) {
- fbFill(drawable, gc, x, y, width, height);
- glamor_finish_access_gc(gc);
- }
- glamor_finish_access(drawable, GLAMOR_ACCESS_RW);
- }
-
- if (sub_pixmap != NULL) {
- if (gc->fillStyle != FillSolid) {
- gc->patOrg.x -= (saved_drawable->x - saved_x);
- gc->patOrg.y -= (saved_drawable->y - saved_y);
- }
-
- x = saved_x;
- y = saved_y;
-
- glamor_put_sub_pixmap(sub_pixmap, dst_pixmap,
- x + off_x, y + off_y,
- width, height, sub_pixmap_access);
- }
-
- return TRUE;
+ PixmapPtr dst_pixmap = glamor_get_drawable_pixmap(drawable);
+ int off_x, off_y;
+ PixmapPtr sub_pixmap = NULL;
+ glamor_access_t sub_pixmap_access;
+ DrawablePtr saved_drawable = NULL;
+ int saved_x = x, saved_y = y;
+
+ glamor_get_drawable_deltas(drawable, dst_pixmap, &off_x, &off_y);
+
+ switch (gc->fillStyle) {
+ case FillSolid:
+ if (!glamor_solid(dst_pixmap,
+ x + off_x,
+ y + off_y,
+ width, height, gc->alu, gc->planemask, gc->fgPixel))
+ goto fail;
+ break;
+ case FillStippled:
+ case FillOpaqueStippled:
+ if (!glamor_stipple(dst_pixmap,
+ gc->stipple,
+ x + off_x,
+ y + off_y,
+ width,
+ height,
+ gc->alu,
+ gc->planemask,
+ gc->fgPixel,
+ gc->bgPixel, gc->patOrg.x, gc->patOrg.y))
+ goto fail;
+ break;
+ case FillTiled:
+ if (!glamor_tile(dst_pixmap,
+ gc->tile.pixmap,
+ x + off_x,
+ y + off_y,
+ width,
+ height,
+ gc->alu,
+ gc->planemask,
+ x - drawable->x - gc->patOrg.x,
+ y - drawable->y - gc->patOrg.y))
+ goto fail;
+ break;
+ }
+ return TRUE;
+
+ fail:
+ if (!fallback) {
+ if (glamor_ddx_fallback_check_pixmap(&dst_pixmap->drawable)
+ && glamor_ddx_fallback_check_gc(gc))
+ return FALSE;
+ }
+ /* Is it possible to set the access as WO? */
+
+ sub_pixmap_access = GLAMOR_ACCESS_RW;
+
+ sub_pixmap = glamor_get_sub_pixmap(dst_pixmap, x + off_x,
+ y + off_y, width, height,
+ sub_pixmap_access);
+
+ if (sub_pixmap != NULL) {
+ if (gc->fillStyle != FillSolid) {
+ gc->patOrg.x += (drawable->x - x);
+ gc->patOrg.y += (drawable->y - y);
+ }
+ saved_drawable = drawable;
+ drawable = &sub_pixmap->drawable;
+ saved_x = x;
+ saved_y = y;
+ x = 0;
+ y = 0;
+ }
+ if (glamor_prepare_access(drawable, GLAMOR_ACCESS_RW)) {
+ if (glamor_prepare_access_gc(gc)) {
+ fbFill(drawable, gc, x, y, width, height);
+ glamor_finish_access_gc(gc);
+ }
+ glamor_finish_access(drawable, GLAMOR_ACCESS_RW);
+ }
+
+ if (sub_pixmap != NULL) {
+ if (gc->fillStyle != FillSolid) {
+ gc->patOrg.x -= (saved_drawable->x - saved_x);
+ gc->patOrg.y -= (saved_drawable->y - saved_y);
+ }
+
+ x = saved_x;
+ y = saved_y;
+
+ glamor_put_sub_pixmap(sub_pixmap, dst_pixmap,
+ x + off_x, y + off_y,
+ width, height, sub_pixmap_access);
+ }
+
+ return TRUE;
}
void
glamor_init_solid_shader(ScreenPtr screen)
{
- glamor_screen_private *glamor_priv;
- glamor_gl_dispatch *dispatch;
- const char *solid_vs =
- "attribute vec4 v_position;"
- "void main()\n" "{\n" " gl_Position = v_position;\n"
- "}\n";
- const char *solid_fs =
- GLAMOR_DEFAULT_PRECISION "uniform vec4 color;\n"
- "void main()\n" "{\n" " gl_FragColor = color;\n" "}\n";
- GLint fs_prog, vs_prog;
-
- glamor_priv = glamor_get_screen_private(screen);
- dispatch = glamor_get_dispatch(glamor_priv);
- glamor_priv->solid_prog = dispatch->glCreateProgram();
- vs_prog = glamor_compile_glsl_prog(dispatch, GL_VERTEX_SHADER, solid_vs);
- fs_prog = glamor_compile_glsl_prog(dispatch, GL_FRAGMENT_SHADER,
- solid_fs);
- dispatch->glAttachShader(glamor_priv->solid_prog, vs_prog);
- dispatch->glAttachShader(glamor_priv->solid_prog, fs_prog);
-
- dispatch->glBindAttribLocation(glamor_priv->solid_prog,
- GLAMOR_VERTEX_POS, "v_position");
- glamor_link_glsl_prog(dispatch, glamor_priv->solid_prog);
-
- glamor_priv->solid_color_uniform_location =
- dispatch->glGetUniformLocation(glamor_priv->solid_prog,
- "color");
- glamor_put_dispatch(glamor_priv);
+ glamor_screen_private *glamor_priv;
+ glamor_gl_dispatch *dispatch;
+ const char *solid_vs =
+ "attribute vec4 v_position;"
+ "void main()\n"
+ "{\n"
+ " gl_Position = v_position;\n"
+ "}\n";
+ const char *solid_fs =
+ GLAMOR_DEFAULT_PRECISION
+ "uniform vec4 color;\n"
+ "void main()\n"
+ "{\n"
+ " gl_FragColor = color;\n"
+ "}\n";
+ GLint fs_prog, vs_prog;
+
+ glamor_priv = glamor_get_screen_private(screen);
+ dispatch = glamor_get_dispatch(glamor_priv);
+ glamor_priv->solid_prog = dispatch->glCreateProgram();
+ vs_prog = glamor_compile_glsl_prog(dispatch, GL_VERTEX_SHADER, solid_vs);
+ fs_prog = glamor_compile_glsl_prog(dispatch, GL_FRAGMENT_SHADER, solid_fs);
+ dispatch->glAttachShader(glamor_priv->solid_prog, vs_prog);
+ dispatch->glAttachShader(glamor_priv->solid_prog, fs_prog);
+
+ dispatch->glBindAttribLocation(glamor_priv->solid_prog,
+ GLAMOR_VERTEX_POS, "v_position");
+ glamor_link_glsl_prog(dispatch, glamor_priv->solid_prog);
+
+ glamor_priv->solid_color_uniform_location =
+ dispatch->glGetUniformLocation(glamor_priv->solid_prog, "color");
+ glamor_put_dispatch(glamor_priv);
}
void
glamor_fini_solid_shader(ScreenPtr screen)
{
- glamor_screen_private *glamor_priv;
- glamor_gl_dispatch *dispatch;
+ glamor_screen_private *glamor_priv;
+ glamor_gl_dispatch *dispatch;
- glamor_priv = glamor_get_screen_private(screen);
- dispatch = glamor_get_dispatch(glamor_priv);
- dispatch->glDeleteProgram(glamor_priv->solid_prog);
- glamor_put_dispatch(glamor_priv);
+ glamor_priv = glamor_get_screen_private(screen);
+ dispatch = glamor_get_dispatch(glamor_priv);
+ dispatch->glDeleteProgram(glamor_priv->solid_prog);
+ glamor_put_dispatch(glamor_priv);
}
static void
_glamor_solid_boxes(PixmapPtr pixmap, BoxPtr box, int nbox, float *color)
{
- ScreenPtr screen = pixmap->drawable.pScreen;
- glamor_screen_private *glamor_priv =
- glamor_get_screen_private(screen);
- glamor_pixmap_private *pixmap_priv =
- glamor_get_pixmap_private(pixmap);
- glamor_gl_dispatch *dispatch;
- GLfloat xscale, yscale;
- float vertices[32];
- float *pvertices = vertices;
- int valid_nbox = ARRAY_SIZE(vertices);
-
- glamor_set_destination_pixmap_priv_nc(pixmap_priv);
-
- dispatch = glamor_get_dispatch(glamor_priv);
- dispatch->glUseProgram(glamor_priv->solid_prog);
-
- dispatch->glUniform4fv(glamor_priv->solid_color_uniform_location,
- 1, color);
-
- pixmap_priv_get_dest_scale(pixmap_priv, &xscale, &yscale);
-
- if (unlikely(nbox*4*2 > ARRAY_SIZE(vertices))) {
- int allocated_box;
-
- if (nbox * 6 > GLAMOR_COMPOSITE_VBO_VERT_CNT) {
- allocated_box = GLAMOR_COMPOSITE_VBO_VERT_CNT / 6;
- } else
- allocated_box = nbox;
- pvertices = malloc(allocated_box * 4 * 2 * sizeof(float));
- if (pvertices)
- valid_nbox = allocated_box;
- else {
- pvertices = vertices;
- valid_nbox = ARRAY_SIZE(vertices) / (4*2);
- }
- }
-
- if (unlikely(nbox > 1))
- dispatch->glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, glamor_priv->ebo);
-
- dispatch->glVertexAttribPointer(GLAMOR_VERTEX_POS, 2, GL_FLOAT,
- GL_FALSE, 2 * sizeof(float),
- pvertices);
- dispatch->glEnableVertexAttribArray(GLAMOR_VERTEX_POS);
-
- while(nbox) {
- int box_cnt, i;
- float *valid_vertices;
- valid_vertices = pvertices;
- box_cnt = nbox > valid_nbox ? valid_nbox : nbox;
- for (i = 0; i < box_cnt; i++) {
- glamor_set_normalize_vcoords(pixmap_priv, xscale, yscale,
- box[i].x1, box[i].y1,
- box[i].x2, box[i].y2,
- glamor_priv->yInverted,
- valid_vertices);
- valid_vertices += 4*2;
- }
- if (box_cnt == 1)
- dispatch->glDrawArrays(GL_TRIANGLE_FAN, 0, box_cnt * 4);
- else
+ ScreenPtr screen = pixmap->drawable.pScreen;
+ glamor_screen_private *glamor_priv = glamor_get_screen_private(screen);
+ glamor_pixmap_private *pixmap_priv = glamor_get_pixmap_private(pixmap);
+ glamor_gl_dispatch *dispatch;
+ GLfloat xscale, yscale;
+ float vertices[32];
+ float *pvertices = vertices;
+ int valid_nbox = ARRAY_SIZE(vertices);
+
+ glamor_set_destination_pixmap_priv_nc(pixmap_priv);
+
+ dispatch = glamor_get_dispatch(glamor_priv);
+ dispatch->glUseProgram(glamor_priv->solid_prog);
+
+ dispatch->glUniform4fv(glamor_priv->solid_color_uniform_location, 1, color);
+
+ pixmap_priv_get_dest_scale(pixmap_priv, &xscale, &yscale);
+
+ if (_X_UNLIKELY(nbox * 4 * 2 > ARRAY_SIZE(vertices))) {
+ int allocated_box;
+
+ if (nbox * 6 > GLAMOR_COMPOSITE_VBO_VERT_CNT) {
+ allocated_box = GLAMOR_COMPOSITE_VBO_VERT_CNT / 6;
+ }
+ else
+ allocated_box = nbox;
+ pvertices = malloc(allocated_box * 4 * 2 * sizeof(float));
+ if (pvertices)
+ valid_nbox = allocated_box;
+ else {
+ pvertices = vertices;
+ valid_nbox = ARRAY_SIZE(vertices) / (4 * 2);
+ }
+ }
+
+ if (_X_UNLIKELY(nbox > 1))
+ dispatch->glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, glamor_priv->ebo);
+
+ dispatch->glVertexAttribPointer(GLAMOR_VERTEX_POS, 2, GL_FLOAT,
+ GL_FALSE, 2 * sizeof(float), pvertices);
+ dispatch->glEnableVertexAttribArray(GLAMOR_VERTEX_POS);
+
+ while (nbox) {
+ int box_cnt, i;
+ float *valid_vertices;
+
+ valid_vertices = pvertices;
+ box_cnt = nbox > valid_nbox ? valid_nbox : nbox;
+ for (i = 0; i < box_cnt; i++) {
+ glamor_set_normalize_vcoords(pixmap_priv, xscale, yscale,
+ box[i].x1, box[i].y1,
+ box[i].x2, box[i].y2,
+ glamor_priv->yInverted,
+ valid_vertices);
+ valid_vertices += 4 * 2;
+ }
+ if (box_cnt == 1)
+ dispatch->glDrawArrays(GL_TRIANGLE_FAN, 0, box_cnt * 4);
+ else
#ifndef GLAMOR_GLES2
- dispatch->glDrawRangeElements(GL_TRIANGLES,
- 0,
- box_cnt * 4,
- box_cnt * 6,
- GL_UNSIGNED_SHORT,
- NULL);
+ dispatch->glDrawRangeElements(GL_TRIANGLES,
+ 0,
+ box_cnt * 4,
+ box_cnt * 6, GL_UNSIGNED_SHORT, NULL);
#else
- dispatch->glDrawElements(GL_TRIANGLES,
- box_cnt * 6,
- GL_UNSIGNED_SHORT,
- NULL);
+ dispatch->glDrawElements(GL_TRIANGLES,
+ box_cnt * 6, GL_UNSIGNED_SHORT, NULL);
#endif
- nbox -= box_cnt;
- box += box_cnt;
- }
-
- if (pvertices != vertices)
- free(pvertices);
-
- dispatch->glDisableVertexAttribArray(GLAMOR_VERTEX_POS);
- dispatch->glUseProgram(0);
- glamor_put_dispatch(glamor_priv);
- glamor_priv->state = RENDER_STATE;
- glamor_priv->render_idle_cnt = 0;
+ nbox -= box_cnt;
+ box += box_cnt;
+ }
+
+ if (pvertices != vertices)
+ free(pvertices);
+
+ dispatch->glDisableVertexAttribArray(GLAMOR_VERTEX_POS);
+ dispatch->glUseProgram(0);
+ glamor_put_dispatch(glamor_priv);
+ glamor_priv->state = RENDER_STATE;
+ glamor_priv->render_idle_cnt = 0;
}
Bool
glamor_solid_boxes(PixmapPtr pixmap,
- BoxPtr box, int nbox,
- unsigned long fg_pixel)
+ BoxPtr box, int nbox, unsigned long fg_pixel)
{
- glamor_pixmap_private *pixmap_priv;
- GLfloat color[4];
-
- pixmap_priv = glamor_get_pixmap_private(pixmap);
-
- if (!GLAMOR_PIXMAP_PRIV_HAS_FBO(pixmap_priv))
- return FALSE;
-
- glamor_get_rgba_from_pixel(fg_pixel,
- &color[0],
- &color[1],
- &color[2],
- &color[3], format_for_pixmap(pixmap));
-
- if (pixmap_priv->type == GLAMOR_TEXTURE_LARGE) {
- RegionRec region;
- int n_region;
- glamor_pixmap_clipped_regions *clipped_regions;
- int i;
-
- RegionInitBoxes(&region, box, nbox);
- clipped_regions = glamor_compute_clipped_regions(pixmap_priv, &region, &n_region, 0, 0, 0);
- for(i = 0; i < n_region; i++)
- {
- BoxPtr inner_box;
- int inner_nbox;
- SET_PIXMAP_FBO_CURRENT(pixmap_priv, clipped_regions[i].block_idx);
-
- inner_box = RegionRects(clipped_regions[i].region);
- inner_nbox = RegionNumRects(clipped_regions[i].region);
- _glamor_solid_boxes(pixmap, inner_box, inner_nbox, color);
- RegionDestroy(clipped_regions[i].region);
- }
- free(clipped_regions);
- RegionUninit(&region);
- } else
- _glamor_solid_boxes(pixmap, box, nbox, color);
-
- return TRUE;
+ glamor_pixmap_private *pixmap_priv;
+ GLfloat color[4];
+
+ pixmap_priv = glamor_get_pixmap_private(pixmap);
+
+ if (!GLAMOR_PIXMAP_PRIV_HAS_FBO(pixmap_priv))
+ return FALSE;
+
+ glamor_get_rgba_from_pixel(fg_pixel,
+ &color[0],
+ &color[1],
+ &color[2], &color[3], format_for_pixmap(pixmap));
+
+ if (pixmap_priv->type == GLAMOR_TEXTURE_LARGE) {
+ RegionRec region;
+ int n_region;
+ glamor_pixmap_clipped_regions *clipped_regions;
+ int i;
+
+ RegionInitBoxes(&region, box, nbox);
+ clipped_regions =
+ glamor_compute_clipped_regions(pixmap_priv, &region, &n_region, 0,
+ 0, 0);
+ for (i = 0; i < n_region; i++) {
+ BoxPtr inner_box;
+ int inner_nbox;
+
+ SET_PIXMAP_FBO_CURRENT(pixmap_priv, clipped_regions[i].block_idx);
+
+ inner_box = RegionRects(clipped_regions[i].region);
+ inner_nbox = RegionNumRects(clipped_regions[i].region);
+ _glamor_solid_boxes(pixmap, inner_box, inner_nbox, color);
+ RegionDestroy(clipped_regions[i].region);
+ }
+ free(clipped_regions);
+ RegionUninit(&region);
+ }
+ else
+ _glamor_solid_boxes(pixmap, box, nbox, color);
+
+ return TRUE;
}
Bool
glamor_solid(PixmapPtr pixmap, int x, int y, int width, int height,
- unsigned char alu, unsigned long planemask,
- unsigned long fg_pixel)
+ unsigned char alu, unsigned long planemask, unsigned long fg_pixel)
{
- ScreenPtr screen = pixmap->drawable.pScreen;
- glamor_screen_private *glamor_priv =
- glamor_get_screen_private(screen);
- glamor_pixmap_private *pixmap_priv;
- glamor_gl_dispatch *dispatch;
- BoxRec box;
-
- pixmap_priv = glamor_get_pixmap_private(pixmap);
-
- if (!GLAMOR_PIXMAP_PRIV_HAS_FBO(pixmap_priv))
- return FALSE;
-
- if (!glamor_set_planemask(pixmap, planemask)) {
- glamor_fallback
- ("Failedto set planemask in glamor_solid.\n");
- return FALSE;
- }
-
- dispatch = glamor_get_dispatch(glamor_priv);
- if (!glamor_set_alu(dispatch, alu)) {
- if (alu == GXclear)
- fg_pixel = 0;
- else {
- glamor_fallback("unsupported alu %x\n", alu);
- glamor_put_dispatch(glamor_priv);
- return FALSE;
- }
- }
- box.x1 = x;
- box.y1 = y;
- box.x2 = x + width;
- box.y2 = y + height;
- glamor_solid_boxes(pixmap, &box, 1, fg_pixel);
-
- glamor_set_alu(dispatch, GXcopy);
- glamor_put_dispatch(glamor_priv);
-
- return TRUE;
+ ScreenPtr screen = pixmap->drawable.pScreen;
+ glamor_screen_private *glamor_priv = glamor_get_screen_private(screen);
+ glamor_pixmap_private *pixmap_priv;
+ glamor_gl_dispatch *dispatch;
+ BoxRec box;
+
+ pixmap_priv = glamor_get_pixmap_private(pixmap);
+
+ if (!GLAMOR_PIXMAP_PRIV_HAS_FBO(pixmap_priv))
+ return FALSE;
+
+ if (!glamor_set_planemask(pixmap, planemask)) {
+ glamor_fallback("Failedto set planemask in glamor_solid.\n");
+ return FALSE;
+ }
+
+ dispatch = glamor_get_dispatch(glamor_priv);
+ if (!glamor_set_alu(dispatch, alu)) {
+ if (alu == GXclear)
+ fg_pixel = 0;
+ else {
+ glamor_fallback("unsupported alu %x\n", alu);
+ glamor_put_dispatch(glamor_priv);
+ return FALSE;
+ }
+ }
+ box.x1 = x;
+ box.y1 = y;
+ box.x2 = x + width;
+ box.y2 = y + height;
+ glamor_solid_boxes(pixmap, &box, 1, fg_pixel);
+
+ glamor_set_alu(dispatch, GXcopy);
+ glamor_put_dispatch(glamor_priv);
+
+ return TRUE;
}
-
diff --git a/xorg-server/glamor/glamor_fillspans.c b/xorg-server/glamor/glamor_fillspans.c
index 35e881f61..7261d2842 100644
--- a/xorg-server/glamor/glamor_fillspans.c
+++ b/xorg-server/glamor/glamor_fillspans.c
@@ -28,86 +28,81 @@
static Bool
_glamor_fill_spans(DrawablePtr drawable,
- GCPtr gc,
- int n, DDXPointPtr points, int *widths, int sorted, Bool fallback)
+ GCPtr gc,
+ int n, DDXPointPtr points, int *widths, int sorted,
+ Bool fallback)
{
- DDXPointPtr ppt;
- int nbox;
- BoxPtr pbox;
- int x1, x2, y;
- RegionPtr pClip = fbGetCompositeClip(gc);
- Bool ret = FALSE;
+ DDXPointPtr ppt;
+ int nbox;
+ BoxPtr pbox;
+ int x1, x2, y;
+ RegionPtr pClip = fbGetCompositeClip(gc);
+ Bool ret = FALSE;
- if (gc->fillStyle != FillSolid && gc->fillStyle != FillTiled)
- goto fail;
+ if (gc->fillStyle != FillSolid && gc->fillStyle != FillTiled)
+ goto fail;
- ppt = points;
- while (n--) {
- x1 = ppt->x;
- y = ppt->y;
- x2 = x1 + (int) *widths;
- ppt++;
- widths++;
+ ppt = points;
+ while (n--) {
+ x1 = ppt->x;
+ y = ppt->y;
+ x2 = x1 + (int) *widths;
+ ppt++;
+ widths++;
- nbox = REGION_NUM_RECTS(pClip);
- pbox = REGION_RECTS(pClip);
- while (nbox--) {
- int real_x1 = x1, real_x2 = x2;
+ nbox = REGION_NUM_RECTS(pClip);
+ pbox = REGION_RECTS(pClip);
+ while (nbox--) {
+ int real_x1 = x1, real_x2 = x2;
- if (real_x1 < pbox->x1)
- real_x1 = pbox->x1;
+ if (real_x1 < pbox->x1)
+ real_x1 = pbox->x1;
- if (real_x2 > pbox->x2)
- real_x2 = pbox->x2;
+ if (real_x2 > pbox->x2)
+ real_x2 = pbox->x2;
- if (real_x2 > real_x1 && pbox->y1 <= y && pbox->y2 > y) {
- if (!glamor_fill(drawable, gc, real_x1, y,
- real_x2 - real_x1, 1, fallback))
- goto fail;
- }
- pbox++;
- }
- }
- ret = TRUE;
- goto done;
+ if (real_x2 > real_x1 && pbox->y1 <= y && pbox->y2 > y) {
+ if (!glamor_fill(drawable, gc, real_x1, y,
+ real_x2 - real_x1, 1, fallback))
+ goto fail;
+ }
+ pbox++;
+ }
+ }
+ ret = TRUE;
+ goto done;
-fail:
- if (!fallback
- && glamor_ddx_fallback_check_pixmap(drawable)
- && glamor_ddx_fallback_check_gc(gc)) {
- goto done;
- }
- glamor_fallback("to %p (%c)\n", drawable,
- glamor_get_drawable_location(drawable));
- if (glamor_prepare_access(drawable, GLAMOR_ACCESS_RW)) {
- if (glamor_prepare_access_gc(gc)) {
- fbFillSpans(drawable, gc, n, points, widths,
- sorted);
- glamor_finish_access_gc(gc);
- }
- glamor_finish_access(drawable, GLAMOR_ACCESS_RW);
- }
- ret = TRUE;
+ fail:
+ if (!fallback && glamor_ddx_fallback_check_pixmap(drawable)
+ && glamor_ddx_fallback_check_gc(gc)) {
+ goto done;
+ }
+ glamor_fallback("to %p (%c)\n", drawable,
+ glamor_get_drawable_location(drawable));
+ if (glamor_prepare_access(drawable, GLAMOR_ACCESS_RW)) {
+ if (glamor_prepare_access_gc(gc)) {
+ fbFillSpans(drawable, gc, n, points, widths, sorted);
+ glamor_finish_access_gc(gc);
+ }
+ glamor_finish_access(drawable, GLAMOR_ACCESS_RW);
+ }
+ ret = TRUE;
-done:
- return ret;
+ done:
+ return ret;
}
-
void
glamor_fill_spans(DrawablePtr drawable,
- GCPtr gc,
- int n, DDXPointPtr points, int *widths, int sorted)
+ GCPtr gc, int n, DDXPointPtr points, int *widths, int sorted)
{
- _glamor_fill_spans(drawable, gc, n, points, widths, sorted, TRUE);
+ _glamor_fill_spans(drawable, gc, n, points, widths, sorted, TRUE);
}
Bool
glamor_fill_spans_nf(DrawablePtr drawable,
- GCPtr gc,
- int n, DDXPointPtr points, int *widths, int sorted)
+ GCPtr gc,
+ int n, DDXPointPtr points, int *widths, int sorted)
{
- return _glamor_fill_spans(drawable, gc, n, points, widths, sorted, FALSE);
+ return _glamor_fill_spans(drawable, gc, n, points, widths, sorted, FALSE);
}
-
-
diff --git a/xorg-server/glamor/glamor_getimage.c b/xorg-server/glamor/glamor_getimage.c
index 5df576c45..5609e707f 100644
--- a/xorg-server/glamor/glamor_getimage.c
+++ b/xorg-server/glamor/glamor_getimage.c
@@ -28,74 +28,71 @@
#include "glamor_priv.h"
-
static Bool
_glamor_get_image(DrawablePtr drawable, int x, int y, int w, int h,
- unsigned int format, unsigned long planeMask, char *d,
- Bool fallback)
+ unsigned int format, unsigned long planeMask, char *d,
+ Bool fallback)
{
- PixmapPtr pixmap, sub_pixmap;
- struct glamor_pixmap_private *pixmap_priv;
- int x_off, y_off;
- int stride;
- void *data;
-
- pixmap = glamor_get_drawable_pixmap(drawable);
- glamor_get_drawable_deltas(drawable, pixmap, &x_off, &y_off);
+ PixmapPtr pixmap, sub_pixmap;
+ struct glamor_pixmap_private *pixmap_priv;
+ int x_off, y_off;
+ int stride;
+ void *data;
- if (format != ZPixmap)
- goto fall_back;
- pixmap = glamor_get_drawable_pixmap(drawable);
- glamor_get_drawable_deltas(drawable, pixmap, &x_off, &y_off);
+ pixmap = glamor_get_drawable_pixmap(drawable);
+ glamor_get_drawable_deltas(drawable, pixmap, &x_off, &y_off);
- if (!glamor_set_planemask(pixmap, planeMask)) {
- glamor_fallback
- ("Failedto set planemask in glamor_solid.\n");
- goto fall_back;
- }
- pixmap_priv = glamor_get_pixmap_private(pixmap);
+ if (format != ZPixmap)
+ goto fall_back;
+ pixmap = glamor_get_drawable_pixmap(drawable);
+ glamor_get_drawable_deltas(drawable, pixmap, &x_off, &y_off);
+ if (!glamor_set_planemask(pixmap, planeMask)) {
+ glamor_fallback("Failedto set planemask in glamor_solid.\n");
+ goto fall_back;
+ }
+ pixmap_priv = glamor_get_pixmap_private(pixmap);
- if (!GLAMOR_PIXMAP_PRIV_HAS_FBO(pixmap_priv))
- goto fall_back;
- stride = PixmapBytePad(w, drawable->depth);
+ if (!GLAMOR_PIXMAP_PRIV_HAS_FBO(pixmap_priv))
+ goto fall_back;
+ stride = PixmapBytePad(w, drawable->depth);
- x += drawable->x + x_off;
- y += drawable->y + y_off;
+ x += drawable->x + x_off;
+ y += drawable->y + y_off;
- data = glamor_download_sub_pixmap_to_cpu(pixmap, x, y, w, h, stride,
- d, 0, GLAMOR_ACCESS_RO);
- if (data != NULL) {
- assert(data == d);
- return TRUE;
- }
-fall_back:
- sub_pixmap = glamor_get_sub_pixmap(pixmap, x + x_off + drawable->x,
- y + y_off + drawable->y, w, h,
- GLAMOR_ACCESS_RO);
- if (sub_pixmap) {
- fbGetImage(&sub_pixmap->drawable, 0, 0, w, h, format, planeMask, d);
- glamor_put_sub_pixmap(sub_pixmap, pixmap,
- x + x_off + drawable->x,
- y + y_off + drawable->y,
- w, h, GLAMOR_ACCESS_RO);
- } else
- miGetImage(drawable, x, y, w, h, format, planeMask, d);
+ data = glamor_download_sub_pixmap_to_cpu(pixmap, x, y, w, h, stride,
+ d, 0, GLAMOR_ACCESS_RO);
+ if (data != NULL) {
+ assert(data == d);
+ return TRUE;
+ }
+ fall_back:
+ sub_pixmap = glamor_get_sub_pixmap(pixmap, x + x_off + drawable->x,
+ y + y_off + drawable->y, w, h,
+ GLAMOR_ACCESS_RO);
+ if (sub_pixmap) {
+ fbGetImage(&sub_pixmap->drawable, 0, 0, w, h, format, planeMask, d);
+ glamor_put_sub_pixmap(sub_pixmap, pixmap,
+ x + x_off + drawable->x,
+ y + y_off + drawable->y, w, h, GLAMOR_ACCESS_RO);
+ }
+ else
+ miGetImage(drawable, x, y, w, h, format, planeMask, d);
- return TRUE;
+ return TRUE;
}
void
glamor_get_image(DrawablePtr pDrawable, int x, int y, int w, int h,
- unsigned int format, unsigned long planeMask, char *d)
+ unsigned int format, unsigned long planeMask, char *d)
{
- _glamor_get_image(pDrawable, x, y, w, h, format, planeMask, d, TRUE);
+ _glamor_get_image(pDrawable, x, y, w, h, format, planeMask, d, TRUE);
}
Bool
glamor_get_image_nf(DrawablePtr pDrawable, int x, int y, int w, int h,
- unsigned int format, unsigned long planeMask, char *d)
+ unsigned int format, unsigned long planeMask, char *d)
{
- return _glamor_get_image(pDrawable, x, y, w,
- h, format, planeMask, d, FALSE);
+ return _glamor_get_image(pDrawable, x, y, w,
+ h, format, planeMask, d, FALSE);
}
diff --git a/xorg-server/glamor/glamor_getspans.c b/xorg-server/glamor/glamor_getspans.c
index 6d6c8e9a4..ff58725d6 100644
--- a/xorg-server/glamor/glamor_getspans.c
+++ b/xorg-server/glamor/glamor_getspans.c
@@ -28,68 +28,65 @@
#include "glamor_priv.h"
-static Bool
+static Bool
_glamor_get_spans(DrawablePtr drawable,
- int wmax,
- DDXPointPtr points, int *widths, int count, char *dst,
- Bool fallback)
+ int wmax,
+ DDXPointPtr points, int *widths, int count, char *dst,
+ Bool fallback)
{
- PixmapPtr pixmap = glamor_get_drawable_pixmap(drawable);
- glamor_pixmap_private *pixmap_priv =
- glamor_get_pixmap_private(pixmap);
- int i;
- uint8_t *readpixels_dst = (uint8_t *) dst;
- void *data;
- int x_off, y_off;
- Bool ret = FALSE;
+ PixmapPtr pixmap = glamor_get_drawable_pixmap(drawable);
+ glamor_pixmap_private *pixmap_priv = glamor_get_pixmap_private(pixmap);
+ int i;
+ uint8_t *readpixels_dst = (uint8_t *) dst;
+ void *data;
+ int x_off, y_off;
+ Bool ret = FALSE;
- if (!GLAMOR_PIXMAP_PRIV_HAS_FBO(pixmap_priv))
- goto fail;
+ if (!GLAMOR_PIXMAP_PRIV_HAS_FBO(pixmap_priv))
+ goto fail;
- glamor_get_drawable_deltas(drawable, pixmap, &x_off, &y_off);
- for (i = 0; i < count; i++) {
- data = glamor_download_sub_pixmap_to_cpu(pixmap, points[i].x + x_off,
- points[i].y + y_off, widths[i], 1,
- PixmapBytePad(widths[i], drawable->depth),
- readpixels_dst, 0, GLAMOR_ACCESS_RO);
- assert(data == readpixels_dst);
- readpixels_dst += PixmapBytePad(widths[i], drawable->depth);
- }
+ glamor_get_drawable_deltas(drawable, pixmap, &x_off, &y_off);
+ for (i = 0; i < count; i++) {
+ data = glamor_download_sub_pixmap_to_cpu(pixmap, points[i].x + x_off,
+ points[i].y + y_off, widths[i],
+ 1, PixmapBytePad(widths[i],
+ drawable->
+ depth),
+ readpixels_dst, 0,
+ GLAMOR_ACCESS_RO);
+ (void)data;
+ assert(data == readpixels_dst);
+ readpixels_dst += PixmapBytePad(widths[i], drawable->depth);
+ }
- ret = TRUE;
- goto done;
-fail:
+ ret = TRUE;
+ goto done;
+ fail:
- if (!fallback
- && glamor_ddx_fallback_check_pixmap(drawable))
- goto done;
+ if (!fallback && glamor_ddx_fallback_check_pixmap(drawable))
+ goto done;
- ret = TRUE;
- if (glamor_prepare_access(drawable, GLAMOR_ACCESS_RO)) {
- fbGetSpans(drawable, wmax, points, widths, count, dst);
- glamor_finish_access(drawable, GLAMOR_ACCESS_RO);
- }
-done:
- return ret;
+ ret = TRUE;
+ if (glamor_prepare_access(drawable, GLAMOR_ACCESS_RO)) {
+ fbGetSpans(drawable, wmax, points, widths, count, dst);
+ glamor_finish_access(drawable, GLAMOR_ACCESS_RO);
+ }
+ done:
+ return ret;
}
void
glamor_get_spans(DrawablePtr drawable,
- int wmax,
- DDXPointPtr points, int *widths, int count, char *dst)
+ int wmax,
+ DDXPointPtr points, int *widths, int count, char *dst)
{
- _glamor_get_spans(drawable, wmax, points,
- widths, count, dst, TRUE);
+ _glamor_get_spans(drawable, wmax, points, widths, count, dst, TRUE);
}
Bool
glamor_get_spans_nf(DrawablePtr drawable,
- int wmax,
- DDXPointPtr points, int *widths, int count, char *dst)
+ int wmax,
+ DDXPointPtr points, int *widths, int count, char *dst)
{
- return _glamor_get_spans(drawable, wmax, points,
- widths, count, dst, FALSE);
+ return _glamor_get_spans(drawable, wmax, points, widths, count, dst, FALSE);
}
-
-
-
diff --git a/xorg-server/glamor/glamor_gl_dispatch.c b/xorg-server/glamor/glamor_gl_dispatch.c
index da99e2627..0bdda9c34 100644
--- a/xorg-server/glamor/glamor_gl_dispatch.c
+++ b/xorg-server/glamor/glamor_gl_dispatch.c
@@ -41,78 +41,78 @@
_X_EXPORT Bool
glamor_gl_dispatch_init_impl(struct glamor_gl_dispatch *dispatch,
- int gl_version,
- void *(*get_proc_address) (const char *))
+ int gl_version,
+ void *(*get_proc_address) (const char *))
{
#ifndef GLAMOR_GLES2
- INIT_FUNC(dispatch, glMatrixMode, get_proc_address);
- INIT_FUNC(dispatch, glLoadIdentity, get_proc_address);
- INIT_FUNC(dispatch, glRasterPos2i, get_proc_address);
- INIT_FUNC(dispatch, glDrawPixels, get_proc_address);
- INIT_FUNC(dispatch, glLogicOp, get_proc_address);
- INIT_FUNC(dispatch, glMapBuffer, get_proc_address);
- INIT_FUNC(dispatch, glMapBufferRange, get_proc_address);
- INIT_FUNC(dispatch, glUnmapBuffer, get_proc_address);
- INIT_FUNC(dispatch, glBlitFramebuffer, get_proc_address);
- INIT_FUNC(dispatch, glDrawRangeElements, get_proc_address);
+ INIT_FUNC(dispatch, glMatrixMode, get_proc_address);
+ INIT_FUNC(dispatch, glLoadIdentity, get_proc_address);
+ INIT_FUNC(dispatch, glRasterPos2i, get_proc_address);
+ INIT_FUNC(dispatch, glDrawPixels, get_proc_address);
+ INIT_FUNC(dispatch, glLogicOp, get_proc_address);
+ INIT_FUNC(dispatch, glMapBuffer, get_proc_address);
+ INIT_FUNC(dispatch, glMapBufferRange, get_proc_address);
+ INIT_FUNC(dispatch, glUnmapBuffer, get_proc_address);
+ INIT_FUNC(dispatch, glBlitFramebuffer, get_proc_address);
+ INIT_FUNC(dispatch, glDrawRangeElements, get_proc_address);
#endif
- INIT_FUNC(dispatch, glViewport, get_proc_address);
- INIT_FUNC(dispatch, glDrawArrays, get_proc_address);
- INIT_FUNC(dispatch, glDrawElements, get_proc_address);
- INIT_FUNC(dispatch, glReadPixels, get_proc_address);
- INIT_FUNC(dispatch, glPixelStorei, get_proc_address);
- INIT_FUNC(dispatch, glTexParameteri, get_proc_address);
- INIT_FUNC(dispatch, glTexImage2D, get_proc_address);
- INIT_FUNC(dispatch, glGenTextures, get_proc_address);
- INIT_FUNC(dispatch, glDeleteTextures, get_proc_address);
- INIT_FUNC(dispatch, glBindTexture, get_proc_address);
- INIT_FUNC(dispatch, glTexSubImage2D, get_proc_address);
- INIT_FUNC(dispatch, glFlush, get_proc_address);
- INIT_FUNC(dispatch, glFinish, get_proc_address);
- INIT_FUNC(dispatch, glGetIntegerv, get_proc_address);
- INIT_FUNC(dispatch, glGetString, get_proc_address);
- INIT_FUNC(dispatch, glScissor, get_proc_address);
- INIT_FUNC(dispatch, glEnable, get_proc_address);
- INIT_FUNC(dispatch, glDisable, get_proc_address);
- INIT_FUNC(dispatch, glBlendFunc, get_proc_address);
- INIT_FUNC(dispatch, glActiveTexture, get_proc_address);
- INIT_FUNC(dispatch, glGenBuffers, get_proc_address);
- INIT_FUNC(dispatch, glBufferData, get_proc_address);
- INIT_FUNC(dispatch, glBindBuffer, get_proc_address);
- INIT_FUNC(dispatch, glDeleteBuffers, get_proc_address);
- INIT_FUNC(dispatch, glFramebufferTexture2D, get_proc_address);
- INIT_FUNC(dispatch, glBindFramebuffer, get_proc_address);
- INIT_FUNC(dispatch, glDeleteFramebuffers, get_proc_address);
- INIT_FUNC(dispatch, glGenFramebuffers, get_proc_address);
- INIT_FUNC(dispatch, glCheckFramebufferStatus, get_proc_address);
- INIT_FUNC(dispatch, glVertexAttribPointer, get_proc_address);
- INIT_FUNC(dispatch, glDisableVertexAttribArray, get_proc_address);
- INIT_FUNC(dispatch, glEnableVertexAttribArray, get_proc_address);
- INIT_FUNC(dispatch, glBindAttribLocation, get_proc_address);
- INIT_FUNC(dispatch, glLinkProgram, get_proc_address);
- INIT_FUNC(dispatch, glShaderSource, get_proc_address);
+ INIT_FUNC(dispatch, glViewport, get_proc_address);
+ INIT_FUNC(dispatch, glDrawArrays, get_proc_address);
+ INIT_FUNC(dispatch, glDrawElements, get_proc_address);
+ INIT_FUNC(dispatch, glReadPixels, get_proc_address);
+ INIT_FUNC(dispatch, glPixelStorei, get_proc_address);
+ INIT_FUNC(dispatch, glTexParameteri, get_proc_address);
+ INIT_FUNC(dispatch, glTexImage2D, get_proc_address);
+ INIT_FUNC(dispatch, glGenTextures, get_proc_address);
+ INIT_FUNC(dispatch, glDeleteTextures, get_proc_address);
+ INIT_FUNC(dispatch, glBindTexture, get_proc_address);
+ INIT_FUNC(dispatch, glTexSubImage2D, get_proc_address);
+ INIT_FUNC(dispatch, glFlush, get_proc_address);
+ INIT_FUNC(dispatch, glFinish, get_proc_address);
+ INIT_FUNC(dispatch, glGetIntegerv, get_proc_address);
+ INIT_FUNC(dispatch, glGetString, get_proc_address);
+ INIT_FUNC(dispatch, glScissor, get_proc_address);
+ INIT_FUNC(dispatch, glEnable, get_proc_address);
+ INIT_FUNC(dispatch, glDisable, get_proc_address);
+ INIT_FUNC(dispatch, glBlendFunc, get_proc_address);
+ INIT_FUNC(dispatch, glActiveTexture, get_proc_address);
+ INIT_FUNC(dispatch, glGenBuffers, get_proc_address);
+ INIT_FUNC(dispatch, glBufferData, get_proc_address);
+ INIT_FUNC(dispatch, glBindBuffer, get_proc_address);
+ INIT_FUNC(dispatch, glDeleteBuffers, get_proc_address);
+ INIT_FUNC(dispatch, glFramebufferTexture2D, get_proc_address);
+ INIT_FUNC(dispatch, glBindFramebuffer, get_proc_address);
+ INIT_FUNC(dispatch, glDeleteFramebuffers, get_proc_address);
+ INIT_FUNC(dispatch, glGenFramebuffers, get_proc_address);
+ INIT_FUNC(dispatch, glCheckFramebufferStatus, get_proc_address);
+ INIT_FUNC(dispatch, glVertexAttribPointer, get_proc_address);
+ INIT_FUNC(dispatch, glDisableVertexAttribArray, get_proc_address);
+ INIT_FUNC(dispatch, glEnableVertexAttribArray, get_proc_address);
+ INIT_FUNC(dispatch, glBindAttribLocation, get_proc_address);
+ INIT_FUNC(dispatch, glLinkProgram, get_proc_address);
+ INIT_FUNC(dispatch, glShaderSource, get_proc_address);
- INIT_FUNC(dispatch, glUseProgram, get_proc_address);
- INIT_FUNC(dispatch, glUniform1i, get_proc_address);
- INIT_FUNC(dispatch, glUniform1f, get_proc_address);
- INIT_FUNC(dispatch, glUniform4f, get_proc_address);
- INIT_FUNC(dispatch, glUniform4fv, get_proc_address);
- INIT_FUNC(dispatch, glUniform1fv, get_proc_address);
- INIT_FUNC(dispatch, glUniform2fv, get_proc_address);
- INIT_FUNC(dispatch, glUniformMatrix3fv, get_proc_address);
- INIT_FUNC(dispatch, glCreateProgram, get_proc_address);
- INIT_FUNC(dispatch, glDeleteProgram, get_proc_address);
- INIT_FUNC(dispatch, glCreateShader, get_proc_address);
- INIT_FUNC(dispatch, glCompileShader, get_proc_address);
- INIT_FUNC(dispatch, glAttachShader, get_proc_address);
- INIT_FUNC(dispatch, glDeleteShader, get_proc_address);
- INIT_FUNC(dispatch, glGetShaderiv, get_proc_address);
- INIT_FUNC(dispatch, glGetShaderInfoLog, get_proc_address);
- INIT_FUNC(dispatch, glGetProgramiv, get_proc_address);
- INIT_FUNC(dispatch, glGetProgramInfoLog, get_proc_address);
- INIT_FUNC(dispatch, glGetUniformLocation, get_proc_address);
+ INIT_FUNC(dispatch, glUseProgram, get_proc_address);
+ INIT_FUNC(dispatch, glUniform1i, get_proc_address);
+ INIT_FUNC(dispatch, glUniform1f, get_proc_address);
+ INIT_FUNC(dispatch, glUniform4f, get_proc_address);
+ INIT_FUNC(dispatch, glUniform4fv, get_proc_address);
+ INIT_FUNC(dispatch, glUniform1fv, get_proc_address);
+ INIT_FUNC(dispatch, glUniform2fv, get_proc_address);
+ INIT_FUNC(dispatch, glUniformMatrix3fv, get_proc_address);
+ INIT_FUNC(dispatch, glCreateProgram, get_proc_address);
+ INIT_FUNC(dispatch, glDeleteProgram, get_proc_address);
+ INIT_FUNC(dispatch, glCreateShader, get_proc_address);
+ INIT_FUNC(dispatch, glCompileShader, get_proc_address);
+ INIT_FUNC(dispatch, glAttachShader, get_proc_address);
+ INIT_FUNC(dispatch, glDeleteShader, get_proc_address);
+ INIT_FUNC(dispatch, glGetShaderiv, get_proc_address);
+ INIT_FUNC(dispatch, glGetShaderInfoLog, get_proc_address);
+ INIT_FUNC(dispatch, glGetProgramiv, get_proc_address);
+ INIT_FUNC(dispatch, glGetProgramInfoLog, get_proc_address);
+ INIT_FUNC(dispatch, glGetUniformLocation, get_proc_address);
- return TRUE;
- fail:
- return FALSE;
+ return TRUE;
+ fail:
+ return FALSE;
}
diff --git a/xorg-server/glamor/glamor_gl_dispatch.h b/xorg-server/glamor/glamor_gl_dispatch.h
index 76dadd49e..63790b41f 100644
--- a/xorg-server/glamor/glamor_gl_dispatch.h
+++ b/xorg-server/glamor/glamor_gl_dispatch.h
@@ -1,138 +1,128 @@
typedef struct glamor_gl_dispatch {
- /* Transformation functions */
- void (*glMatrixMode) (GLenum mode);
- void (*glLoadIdentity) (void);
- void (*glViewport) (GLint x, GLint y, GLsizei width,
- GLsizei height);
- /* Drawing functions */
- void (*glRasterPos2i) (GLint x, GLint y);
-
- /* Vertex Array */
- void (*glDrawArrays) (GLenum mode, GLint first, GLsizei count);
-
- /* Elements Array*/
- void (*glDrawElements) (GLenum mode, GLsizei count, GLenum type, const GLvoid * indices);
- void (*glDrawRangeElements) (GLenum mode, GLuint start, GLuint end, GLsizei count, GLenum type, const GLvoid * indices);
-
- /* Raster functions */
- void (*glReadPixels) (GLint x, GLint y,
- GLsizei width, GLsizei height,
- GLenum format, GLenum type, GLvoid * pixels);
-
- void (*glDrawPixels) (GLsizei width, GLsizei height,
- GLenum format, GLenum type,
- const GLvoid * pixels);
- void (*glPixelStorei) (GLenum pname, GLint param);
- /* Texture Mapping */
-
- void (*glTexParameteri) (GLenum target, GLenum pname, GLint param);
- void (*glTexImage2D) (GLenum target, GLint level,
- GLint internalFormat,
- GLsizei width, GLsizei height,
- GLint border, GLenum format, GLenum type,
- const GLvoid * pixels);
- /* 1.1 */
- void (*glGenTextures) (GLsizei n, GLuint * textures);
- void (*glDeleteTextures) (GLsizei n, const GLuint * textures);
- void (*glBindTexture) (GLenum target, GLuint texture);
- void (*glTexSubImage2D) (GLenum target, GLint level,
- GLint xoffset, GLint yoffset,
- GLsizei width, GLsizei height,
- GLenum format, GLenum type,
- const GLvoid * pixels);
- /* MISC */
- void (*glFlush) (void);
- void (*glFinish) (void);
- void (*glGetIntegerv) (GLenum pname, GLint * params);
- const GLubyte *(*glGetString) (GLenum name);
- void (*glScissor) (GLint x, GLint y, GLsizei width,
- GLsizei height);
- void (*glEnable) (GLenum cap);
- void (*glDisable) (GLenum cap);
- void (*glBlendFunc) (GLenum sfactor, GLenum dfactor);
- void (*glLogicOp) (GLenum opcode);
-
- /* 1.3 */
- void (*glActiveTexture) (GLenum texture);
-
- /* GL Extentions */
- void (*glGenBuffers) (GLsizei n, GLuint * buffers);
- void (*glBufferData) (GLenum target, GLsizeiptr size,
- const GLvoid * data, GLenum usage);
- GLvoid *(*glMapBuffer) (GLenum target, GLenum access);
- GLvoid *(*glMapBufferRange) (GLenum target, GLintptr offset, GLsizeiptr length, GLbitfield access);
- GLboolean (*glUnmapBuffer) (GLenum target);
- void (*glBindBuffer) (GLenum target, GLuint buffer);
- void (*glDeleteBuffers) (GLsizei n, const GLuint * buffers);
-
- void (*glFramebufferTexture2D) (GLenum target, GLenum attachment,
- GLenum textarget, GLuint texture,
- GLint level);
- void (*glBindFramebuffer) (GLenum target, GLuint framebuffer);
- void (*glDeleteFramebuffers) (GLsizei n,
- const GLuint * framebuffers);
- void (*glGenFramebuffers) (GLsizei n, GLuint * framebuffers);
- GLenum (*glCheckFramebufferStatus) (GLenum target);
- void (*glBlitFramebuffer) (GLint srcX0, GLint srcY0, GLint srcX1,
- GLint srcY1, GLint dstX0, GLint dstY0,
- GLint dstX1, GLint dstY1,
- GLbitfield mask, GLenum filter);
-
- void (*glVertexAttribPointer) (GLuint index, GLint size,
- GLenum type, GLboolean normalized,
- GLsizei stride,
- const GLvoid * pointer);
- void (*glDisableVertexAttribArray) (GLuint index);
- void (*glEnableVertexAttribArray) (GLuint index);
- void (*glBindAttribLocation) (GLuint program, GLuint index,
- const GLchar * name);
-
- void (*glLinkProgram) (GLuint program);
- void (*glShaderSource) (GLuint shader, GLsizei count,
- const GLchar * *string,
- const GLint * length);
- void (*glUseProgram) (GLuint program);
- void (*glUniform1i) (GLint location, GLint v0);
- void (*glUniform1f) (GLint location, GLfloat v0);
- void (*glUniform4f) (GLint location, GLfloat v0, GLfloat v1,
- GLfloat v2, GLfloat v3);
- void (*glUniform1fv) (GLint location, GLsizei count,
- const GLfloat * value);
- void (*glUniform2fv) (GLint location, GLsizei count,
- const GLfloat * value);
- void (*glUniform4fv) (GLint location, GLsizei count,
- const GLfloat * value);
- void (*glUniformMatrix3fv) (GLint location, GLsizei count,
- GLboolean transpose, const GLfloat* value);
- GLuint (*glCreateProgram) (void);
- GLuint (*glDeleteProgram) (GLuint);
- GLuint (*glCreateShader) (GLenum type);
- void (*glCompileShader) (GLuint shader);
- void (*glAttachShader) (GLuint program, GLuint shader);
- void (*glDeleteShader) (GLuint shader);
- void (*glGetShaderiv) (GLuint shader, GLenum pname,
- GLint * params);
- void (*glGetShaderInfoLog) (GLuint shader, GLsizei bufSize,
- GLsizei * length, GLchar * infoLog);
- void (*glGetProgramiv) (GLuint program, GLenum pname,
- GLint * params);
- void (*glGetProgramInfoLog) (GLuint program, GLsizei bufSize,
- GLsizei * length, GLchar * infoLog);
- GLint (*glGetUniformLocation) (GLuint program,
- const GLchar * name);
+ /* Transformation functions */
+ void (*glMatrixMode) (GLenum mode);
+ void (*glLoadIdentity) (void);
+ void (*glViewport) (GLint x, GLint y, GLsizei width, GLsizei height);
+ /* Drawing functions */
+ void (*glRasterPos2i) (GLint x, GLint y);
+
+ /* Vertex Array */
+ void (*glDrawArrays) (GLenum mode, GLint first, GLsizei count);
+
+ /* Elements Array */
+ void (*glDrawElements) (GLenum mode, GLsizei count, GLenum type,
+ const GLvoid * indices);
+ void (*glDrawRangeElements) (GLenum mode, GLuint start, GLuint end,
+ GLsizei count, GLenum type,
+ const GLvoid * indices);
+
+ /* Raster functions */
+ void (*glReadPixels) (GLint x, GLint y,
+ GLsizei width, GLsizei height,
+ GLenum format, GLenum type, GLvoid * pixels);
+
+ void (*glDrawPixels) (GLsizei width, GLsizei height,
+ GLenum format, GLenum type, const GLvoid * pixels);
+ void (*glPixelStorei) (GLenum pname, GLint param);
+ /* Texture Mapping */
+
+ void (*glTexParameteri) (GLenum target, GLenum pname, GLint param);
+ void (*glTexImage2D) (GLenum target, GLint level,
+ GLint internalFormat,
+ GLsizei width, GLsizei height,
+ GLint border, GLenum format, GLenum type,
+ const GLvoid * pixels);
+ /* 1.1 */
+ void (*glGenTextures) (GLsizei n, GLuint * textures);
+ void (*glDeleteTextures) (GLsizei n, const GLuint * textures);
+ void (*glBindTexture) (GLenum target, GLuint texture);
+ void (*glTexSubImage2D) (GLenum target, GLint level,
+ GLint xoffset, GLint yoffset,
+ GLsizei width, GLsizei height,
+ GLenum format, GLenum type, const GLvoid * pixels);
+ /* MISC */
+ void (*glFlush) (void);
+ void (*glFinish) (void);
+ void (*glGetIntegerv) (GLenum pname, GLint * params);
+ const GLubyte *(*glGetString) (GLenum name);
+ void (*glScissor) (GLint x, GLint y, GLsizei width, GLsizei height);
+ void (*glEnable) (GLenum cap);
+ void (*glDisable) (GLenum cap);
+ void (*glBlendFunc) (GLenum sfactor, GLenum dfactor);
+ void (*glLogicOp) (GLenum opcode);
+
+ /* 1.3 */
+ void (*glActiveTexture) (GLenum texture);
+
+ /* GL Extentions */
+ void (*glGenBuffers) (GLsizei n, GLuint * buffers);
+ void (*glBufferData) (GLenum target, GLsizeiptr size,
+ const GLvoid * data, GLenum usage);
+ GLvoid *(*glMapBuffer) (GLenum target, GLenum access);
+ GLvoid *(*glMapBufferRange) (GLenum target, GLintptr offset,
+ GLsizeiptr length, GLbitfield access);
+ GLboolean(*glUnmapBuffer) (GLenum target);
+ void (*glBindBuffer) (GLenum target, GLuint buffer);
+ void (*glDeleteBuffers) (GLsizei n, const GLuint * buffers);
+
+ void (*glFramebufferTexture2D) (GLenum target, GLenum attachment,
+ GLenum textarget, GLuint texture,
+ GLint level);
+ void (*glBindFramebuffer) (GLenum target, GLuint framebuffer);
+ void (*glDeleteFramebuffers) (GLsizei n, const GLuint * framebuffers);
+ void (*glGenFramebuffers) (GLsizei n, GLuint * framebuffers);
+ GLenum(*glCheckFramebufferStatus) (GLenum target);
+ void (*glBlitFramebuffer) (GLint srcX0, GLint srcY0, GLint srcX1,
+ GLint srcY1, GLint dstX0, GLint dstY0,
+ GLint dstX1, GLint dstY1,
+ GLbitfield mask, GLenum filter);
+
+ void (*glVertexAttribPointer) (GLuint index, GLint size,
+ GLenum type, GLboolean normalized,
+ GLsizei stride, const GLvoid * pointer);
+ void (*glDisableVertexAttribArray) (GLuint index);
+ void (*glEnableVertexAttribArray) (GLuint index);
+ void (*glBindAttribLocation) (GLuint program, GLuint index,
+ const GLchar * name);
+
+ void (*glLinkProgram) (GLuint program);
+ void (*glShaderSource) (GLuint shader, GLsizei count,
+ const GLchar * *string, const GLint * length);
+ void (*glUseProgram) (GLuint program);
+ void (*glUniform1i) (GLint location, GLint v0);
+ void (*glUniform1f) (GLint location, GLfloat v0);
+ void (*glUniform4f) (GLint location, GLfloat v0, GLfloat v1,
+ GLfloat v2, GLfloat v3);
+ void (*glUniform1fv) (GLint location, GLsizei count, const GLfloat * value);
+ void (*glUniform2fv) (GLint location, GLsizei count, const GLfloat * value);
+ void (*glUniform4fv) (GLint location, GLsizei count, const GLfloat * value);
+ void (*glUniformMatrix3fv) (GLint location, GLsizei count,
+ GLboolean transpose, const GLfloat * value);
+ GLuint(*glCreateProgram) (void);
+ GLuint(*glDeleteProgram) (GLuint);
+ GLuint(*glCreateShader) (GLenum type);
+ void (*glCompileShader) (GLuint shader);
+ void (*glAttachShader) (GLuint program, GLuint shader);
+ void (*glDeleteShader) (GLuint shader);
+ void (*glGetShaderiv) (GLuint shader, GLenum pname, GLint * params);
+ void (*glGetShaderInfoLog) (GLuint shader, GLsizei bufSize,
+ GLsizei * length, GLchar * infoLog);
+ void (*glGetProgramiv) (GLuint program, GLenum pname, GLint * params);
+ void (*glGetProgramInfoLog) (GLuint program, GLsizei bufSize,
+ GLsizei * length, GLchar * infoLog);
+ GLint(*glGetUniformLocation) (GLuint program, const GLchar * name);
} glamor_gl_dispatch;
-
typedef void *(*get_proc_address_t) (const char *);
_X_EXPORT Bool
-glamor_gl_dispatch_init_impl(struct glamor_gl_dispatch *dispatch,
- int gl_version,
- get_proc_address_t get_proc_address);
+glamor_gl_dispatch_init_impl(struct glamor_gl_dispatch *dispatch,
+ int gl_version,
+ get_proc_address_t get_proc_address);
_X_EXPORT Bool
+
glamor_gl_dispatch_init(ScreenPtr screen,
- struct glamor_gl_dispatch *dispatch,
- int gl_version);
+ struct glamor_gl_dispatch *dispatch, int gl_version);
diff --git a/xorg-server/glamor/glamor_glext.h b/xorg-server/glamor/glamor_glext.h
index 1f7206b99..2a220c32f 100644
--- a/xorg-server/glamor/glamor_glext.h
+++ b/xorg-server/glamor/glamor_glext.h
@@ -26,7 +26,6 @@
*
*/
-
#ifdef GLAMOR_GLES2
#define GL_BGRA GL_BGRA_EXT
diff --git a/xorg-server/glamor/glamor_glyphblt.c b/xorg-server/glamor/glamor_glyphblt.c
index b55327c4b..6f754ce2b 100644
--- a/xorg-server/glamor/glamor_glyphblt.c
+++ b/xorg-server/glamor/glamor_glyphblt.c
@@ -30,89 +30,90 @@
static Bool
_glamor_image_glyph_blt(DrawablePtr pDrawable, GCPtr pGC,
- int x, int y, unsigned int nglyph,
- CharInfoPtr * ppci, pointer pglyphBase, Bool fallback)
+ int x, int y, unsigned int nglyph,
+ CharInfoPtr *ppci, void *pglyphBase, Bool fallback)
{
- if (!fallback
- && glamor_ddx_fallback_check_pixmap(pDrawable)
- && glamor_ddx_fallback_check_gc(pGC))
- return FALSE;
+ if (!fallback && glamor_ddx_fallback_check_pixmap(pDrawable)
+ && glamor_ddx_fallback_check_gc(pGC))
+ return FALSE;
- miImageGlyphBlt(pDrawable, pGC, x, y, nglyph, ppci, pglyphBase);
- return TRUE;
+ miImageGlyphBlt(pDrawable, pGC, x, y, nglyph, ppci, pglyphBase);
+ return TRUE;
}
void
glamor_image_glyph_blt(DrawablePtr pDrawable, GCPtr pGC,
- int x, int y, unsigned int nglyph,
- CharInfoPtr * ppci, pointer pglyphBase)
+ int x, int y, unsigned int nglyph,
+ CharInfoPtr *ppci, void *pglyphBase)
{
- _glamor_image_glyph_blt(pDrawable, pGC, x, y, nglyph, ppci, pglyphBase, TRUE);
+ _glamor_image_glyph_blt(pDrawable, pGC, x, y, nglyph, ppci, pglyphBase,
+ TRUE);
}
Bool
glamor_image_glyph_blt_nf(DrawablePtr pDrawable, GCPtr pGC,
- int x, int y, unsigned int nglyph,
- CharInfoPtr * ppci, pointer pglyphBase)
+ int x, int y, unsigned int nglyph,
+ CharInfoPtr *ppci, void *pglyphBase)
{
- return _glamor_image_glyph_blt(pDrawable, pGC, x, y, nglyph, ppci, pglyphBase, FALSE);
+ return _glamor_image_glyph_blt(pDrawable, pGC, x, y, nglyph, ppci,
+ pglyphBase, FALSE);
}
static Bool
_glamor_poly_glyph_blt(DrawablePtr pDrawable, GCPtr pGC,
- int x, int y, unsigned int nglyph,
- CharInfoPtr * ppci, pointer pglyphBase, Bool fallback)
+ int x, int y, unsigned int nglyph,
+ CharInfoPtr *ppci, void *pglyphBase, Bool fallback)
{
- if (!fallback
- && glamor_ddx_fallback_check_pixmap(pDrawable)
- && glamor_ddx_fallback_check_gc(pGC))
- return FALSE;
+ if (!fallback && glamor_ddx_fallback_check_pixmap(pDrawable)
+ && glamor_ddx_fallback_check_gc(pGC))
+ return FALSE;
- miPolyGlyphBlt(pDrawable, pGC, x, y, nglyph, ppci, pglyphBase);
- return TRUE;
+ miPolyGlyphBlt(pDrawable, pGC, x, y, nglyph, ppci, pglyphBase);
+ return TRUE;
}
void
glamor_poly_glyph_blt(DrawablePtr pDrawable, GCPtr pGC,
- int x, int y, unsigned int nglyph,
- CharInfoPtr * ppci, pointer pglyphBase)
+ int x, int y, unsigned int nglyph,
+ CharInfoPtr *ppci, void *pglyphBase)
{
- _glamor_poly_glyph_blt(pDrawable, pGC, x, y, nglyph, ppci, pglyphBase, TRUE);
+ _glamor_poly_glyph_blt(pDrawable, pGC, x, y, nglyph, ppci, pglyphBase,
+ TRUE);
}
Bool
glamor_poly_glyph_blt_nf(DrawablePtr pDrawable, GCPtr pGC,
- int x, int y, unsigned int nglyph,
- CharInfoPtr * ppci, pointer pglyphBase)
+ int x, int y, unsigned int nglyph,
+ CharInfoPtr *ppci, void *pglyphBase)
{
- return _glamor_poly_glyph_blt(pDrawable, pGC, x, y, nglyph, ppci, pglyphBase, FALSE);
+ return _glamor_poly_glyph_blt(pDrawable, pGC, x, y, nglyph, ppci,
+ pglyphBase, FALSE);
}
static Bool
_glamor_push_pixels(GCPtr pGC, PixmapPtr pBitmap,
- DrawablePtr pDrawable, int w, int h, int x, int y, Bool fallback)
+ DrawablePtr pDrawable, int w, int h, int x, int y,
+ Bool fallback)
{
- if (!fallback
- && glamor_ddx_fallback_check_pixmap(pDrawable)
- && glamor_ddx_fallback_check_pixmap(&pBitmap->drawable)
- && glamor_ddx_fallback_check_gc(pGC))
- return FALSE;
+ if (!fallback && glamor_ddx_fallback_check_pixmap(pDrawable)
+ && glamor_ddx_fallback_check_pixmap(&pBitmap->drawable)
+ && glamor_ddx_fallback_check_gc(pGC))
+ return FALSE;
- miPushPixels(pGC, pBitmap, pDrawable, w, h, x, y);
- return TRUE;
+ miPushPixels(pGC, pBitmap, pDrawable, w, h, x, y);
+ return TRUE;
}
void
glamor_push_pixels(GCPtr pGC, PixmapPtr pBitmap,
- DrawablePtr pDrawable, int w, int h, int x, int y)
+ DrawablePtr pDrawable, int w, int h, int x, int y)
{
- _glamor_push_pixels(pGC, pBitmap, pDrawable, w, h, x, y, TRUE);
+ _glamor_push_pixels(pGC, pBitmap, pDrawable, w, h, x, y, TRUE);
}
Bool
glamor_push_pixels_nf(GCPtr pGC, PixmapPtr pBitmap,
- DrawablePtr pDrawable, int w, int h, int x, int y)
+ DrawablePtr pDrawable, int w, int h, int x, int y)
{
- return _glamor_push_pixels(pGC, pBitmap, pDrawable, w, h, x, y, FALSE);
+ return _glamor_push_pixels(pGC, pBitmap, pDrawable, w, h, x, y, FALSE);
}
-
diff --git a/xorg-server/glamor/glamor_glyphs.c b/xorg-server/glamor/glamor_glyphs.c
index fc361df42..3586b33da 100644
--- a/xorg-server/glamor/glamor_glyphs.c
+++ b/xorg-server/glamor/glamor_glyphs.c
@@ -71,25 +71,25 @@
#define MASK_CACHE_MASK ((1LL << (MASK_CACHE_WIDTH)) - 1)
typedef struct {
- PicturePtr source;
- glamor_composite_rect_t rects[GLYPH_BUFFER_SIZE + 4];
- int count;
+ PicturePtr source;
+ glamor_composite_rect_t rects[GLYPH_BUFFER_SIZE + 4];
+ int count;
} glamor_glyph_buffer_t;
struct glamor_glyph {
- glamor_glyph_cache_t *cache;
- uint16_t x, y;
- uint16_t size, pos;
- unsigned long long left_x1_map, left_x2_map;
- unsigned long long right_x1_map, right_x2_map; /* Use to check real intersect or not. */
- Bool has_edge_map;
- Bool cached;
+ glamor_glyph_cache_t *cache;
+ uint16_t x, y;
+ uint16_t size, pos;
+ unsigned long long left_x1_map, left_x2_map;
+ unsigned long long right_x1_map, right_x2_map; /* Use to check real intersect or not. */
+ Bool has_edge_map;
+ Bool cached;
};
typedef enum {
- GLAMOR_GLYPH_SUCCESS, /* Glyph added to render buffer */
- GLAMOR_GLYPH_FAIL, /* out of memory, etc */
- GLAMOR_GLYPH_NEED_FLUSH, /* would evict a glyph already in the buffer */
+ GLAMOR_GLYPH_SUCCESS, /* Glyph added to render buffer */
+ GLAMOR_GLYPH_FAIL, /* out of memory, etc */
+ GLAMOR_GLYPH_NEED_FLUSH, /* would evict a glyph already in the buffer */
} glamor_glyph_cache_result_t;
#define NeedsComponent(f) (PICT_FORMAT_A(f) != 0 && PICT_FORMAT_RGB(f) != 0)
@@ -98,7 +98,7 @@ static DevPrivateKeyRec glamor_glyph_key;
static inline struct glamor_glyph *
glamor_glyph_get_private(GlyphPtr glyph)
{
- return (struct glamor_glyph*)glyph->devPrivates;
+ return (struct glamor_glyph *) glyph->devPrivates;
}
/*
@@ -122,170 +122,175 @@ glamor_glyph_get_private(GlyphPtr glyph)
*/
struct glamor_glyph_mask_cache_entry {
- int idx;
- int width;
- int height;
- int x;
- int y;
+ int idx;
+ int width;
+ int height;
+ int x;
+ int y;
};
static struct glamor_glyph_mask_cache {
- PixmapPtr pixmap;
- struct glamor_glyph_mask_cache_entry mcache[MASK_CACHE_WIDTH];
- unsigned int free_bitmap;
- unsigned int cleared_bitmap;
-}*mask_cache[GLAMOR_NUM_GLYPH_CACHE_FORMATS] = {NULL};
+ PixmapPtr pixmap;
+ struct glamor_glyph_mask_cache_entry mcache[MASK_CACHE_WIDTH];
+ unsigned int free_bitmap;
+ unsigned int cleared_bitmap;
+} *mask_cache[GLAMOR_NUM_GLYPH_CACHE_FORMATS] = {
+NULL};
static void
clear_mask_cache_bitmap(struct glamor_glyph_mask_cache *maskcache,
- unsigned int clear_mask_bits)
+ unsigned int clear_mask_bits)
{
- unsigned int i = 0;
- BoxRec box[MASK_CACHE_WIDTH];
- int box_cnt = 0;
-
- assert((clear_mask_bits & ~MASK_CACHE_MASK) == 0);
- for(i = 0; i < MASK_CACHE_WIDTH;i++)
- {
- if (clear_mask_bits & (1 << i)) {
- box[box_cnt].x1 = maskcache->mcache[i].x;
- box[box_cnt].x2 = maskcache->mcache[i].x + MASK_CACHE_MAX_SIZE;
- box[box_cnt].y1 = maskcache->mcache[i].y;
- box[box_cnt].y2 = maskcache->mcache[i].y + MASK_CACHE_MAX_SIZE;
- box_cnt++;
- }
- }
- glamor_solid_boxes(maskcache->pixmap, box, box_cnt, 0);
- maskcache->cleared_bitmap |= clear_mask_bits;
+ unsigned int i = 0;
+ BoxRec box[MASK_CACHE_WIDTH];
+ int box_cnt = 0;
+
+ assert((clear_mask_bits & ~MASK_CACHE_MASK) == 0);
+ for (i = 0; i < MASK_CACHE_WIDTH; i++) {
+ if (clear_mask_bits & (1 << i)) {
+ box[box_cnt].x1 = maskcache->mcache[i].x;
+ box[box_cnt].x2 = maskcache->mcache[i].x + MASK_CACHE_MAX_SIZE;
+ box[box_cnt].y1 = maskcache->mcache[i].y;
+ box[box_cnt].y2 = maskcache->mcache[i].y + MASK_CACHE_MAX_SIZE;
+ box_cnt++;
+ }
+ }
+ glamor_solid_boxes(maskcache->pixmap, box, box_cnt, 0);
+ maskcache->cleared_bitmap |= clear_mask_bits;
}
static void
clear_mask_cache(struct glamor_glyph_mask_cache *maskcache)
{
- int x = 0;
- int cnt = MASK_CACHE_WIDTH;
- unsigned int i = 0;
- struct glamor_glyph_mask_cache_entry *mce;
- glamor_solid(maskcache->pixmap, 0, CACHE_PICTURE_SIZE, CACHE_PICTURE_SIZE,
- MASK_CACHE_MAX_SIZE, GXcopy, 0xFFFFFFFF, 0);
- mce = &maskcache->mcache[0];
- while(cnt--) {
- mce->width = 0;
- mce->height = 0;
- mce->x = x;
- mce->y = CACHE_PICTURE_SIZE;
- mce->idx = i++;
- x += MASK_CACHE_MAX_SIZE;
- mce++;
- }
- maskcache->free_bitmap = MASK_CACHE_MASK;
- maskcache->cleared_bitmap = MASK_CACHE_MASK;
+ int x = 0;
+ int cnt = MASK_CACHE_WIDTH;
+ unsigned int i = 0;
+ struct glamor_glyph_mask_cache_entry *mce;
+
+ glamor_solid(maskcache->pixmap, 0, CACHE_PICTURE_SIZE, CACHE_PICTURE_SIZE,
+ MASK_CACHE_MAX_SIZE, GXcopy, 0xFFFFFFFF, 0);
+ mce = &maskcache->mcache[0];
+ while (cnt--) {
+ mce->width = 0;
+ mce->height = 0;
+ mce->x = x;
+ mce->y = CACHE_PICTURE_SIZE;
+ mce->idx = i++;
+ x += MASK_CACHE_MAX_SIZE;
+ mce++;
+ }
+ maskcache->free_bitmap = MASK_CACHE_MASK;
+ maskcache->cleared_bitmap = MASK_CACHE_MASK;
}
static int
find_continuous_bits(unsigned int bits, int bits_cnt, unsigned int *pbits_mask)
{
- int idx = 0;
- unsigned int bits_mask;
- bits_mask = ((1LL << bits_cnt) - 1);
-
- if (unlikely(bits_cnt > 56)) {
- while(bits) {
- if ((bits & bits_mask) == bits_mask) {
- *pbits_mask = bits_mask << idx;
- return idx;
- }
- bits >>= 1;
- idx++;
- }
- } else {
- idx = __fls(bits);
- while(bits) {
- unsigned int temp_bits;
- temp_bits = bits_mask << (idx - bits_cnt + 1);
- if ((bits & temp_bits) == temp_bits) {
- *pbits_mask = temp_bits;
- return (idx - bits_cnt + 1);
- }
- /* Find first zero. And clear the tested bit.*/
- bits &= ~(1LL<<idx);
- idx = __fls(~bits);
- bits &= ~((1LL << idx) - 1);
- idx--;
- }
- }
- return -1;
+ int idx = 0;
+ unsigned int bits_mask;
+
+ bits_mask = ((1LL << bits_cnt) - 1);
+
+ if (_X_UNLIKELY(bits_cnt > 56)) {
+ while (bits) {
+ if ((bits & bits_mask) == bits_mask) {
+ *pbits_mask = bits_mask << idx;
+ return idx;
+ }
+ bits >>= 1;
+ idx++;
+ }
+ }
+ else {
+ idx = __fls(bits);
+ while (bits) {
+ unsigned int temp_bits;
+
+ temp_bits = bits_mask << (idx - bits_cnt + 1);
+ if ((bits & temp_bits) == temp_bits) {
+ *pbits_mask = temp_bits;
+ return (idx - bits_cnt + 1);
+ }
+ /* Find first zero. And clear the tested bit. */
+ bits &= ~(1LL << idx);
+ idx = __fls(~bits);
+ bits &= ~((1LL << idx) - 1);
+ idx--;
+ }
+ }
+ return -1;
}
static struct glamor_glyph_mask_cache_entry *
get_mask_cache(struct glamor_glyph_mask_cache *maskcache, int blocks)
{
- int free_cleared_bit, idx = -1;
- int retry_cnt = 0;
- unsigned int bits_mask = 0;
-
- if (maskcache->free_bitmap == 0)
- return NULL;
-retry:
- free_cleared_bit = maskcache->free_bitmap & maskcache->cleared_bitmap;
- if (free_cleared_bit && blocks == 1) {
- idx = __fls(free_cleared_bit);
- bits_mask = 1 << idx;
- } else if (free_cleared_bit && blocks > 1) {
- idx = find_continuous_bits(free_cleared_bit, blocks, &bits_mask);
- }
-
- if (idx < 0) {
- clear_mask_cache_bitmap(maskcache, maskcache->free_bitmap);
- if (retry_cnt++ > 2)
- return NULL;
- goto retry;
- }
-
- maskcache->cleared_bitmap &= ~bits_mask;
- maskcache->free_bitmap &= ~bits_mask;
- DEBUGF("get idx %d free %x clear %x \n",
- idx, maskcache->free_bitmap, maskcache->cleared_bitmap);
- return &maskcache->mcache[idx];
+ int free_cleared_bit, idx = -1;
+ int retry_cnt = 0;
+ unsigned int bits_mask = 0;
+
+ if (maskcache->free_bitmap == 0)
+ return NULL;
+ retry:
+ free_cleared_bit = maskcache->free_bitmap & maskcache->cleared_bitmap;
+ if (free_cleared_bit && blocks == 1) {
+ idx = __fls(free_cleared_bit);
+ bits_mask = 1 << idx;
+ }
+ else if (free_cleared_bit && blocks > 1) {
+ idx = find_continuous_bits(free_cleared_bit, blocks, &bits_mask);
+ }
+
+ if (idx < 0) {
+ clear_mask_cache_bitmap(maskcache, maskcache->free_bitmap);
+ if (retry_cnt++ > 2)
+ return NULL;
+ goto retry;
+ }
+
+ maskcache->cleared_bitmap &= ~bits_mask;
+ maskcache->free_bitmap &= ~bits_mask;
+ DEBUGF("get idx %d free %x clear %x \n",
+ idx, maskcache->free_bitmap, maskcache->cleared_bitmap);
+ return &maskcache->mcache[idx];
}
static void
put_mask_cache_bitmap(struct glamor_glyph_mask_cache *maskcache,
- unsigned int bitmap)
+ unsigned int bitmap)
{
- maskcache->free_bitmap |= bitmap;
- DEBUGF("put bitmap %x free %x clear %x \n",
- bitmap, maskcache->free_bitmap, maskcache->cleared_bitmap);
+ maskcache->free_bitmap |= bitmap;
+ DEBUGF("put bitmap %x free %x clear %x \n",
+ bitmap, maskcache->free_bitmap, maskcache->cleared_bitmap);
}
static void
glamor_unrealize_glyph_caches(ScreenPtr pScreen)
{
- glamor_screen_private *glamor = glamor_get_screen_private(pScreen);
- int i;
+ glamor_screen_private *glamor = glamor_get_screen_private(pScreen);
+ int i;
- if (!glamor->glyph_cache_initialized)
- return;
+ if (!glamor->glyph_cache_initialized)
+ return;
- for (i = 0; i < GLAMOR_NUM_GLYPH_CACHE_FORMATS; i++) {
- glamor_glyph_cache_t *cache = &glamor->glyphCaches[i];
+ for (i = 0; i < GLAMOR_NUM_GLYPH_CACHE_FORMATS; i++) {
+ glamor_glyph_cache_t *cache = &glamor->glyphCaches[i];
- if (cache->picture)
- FreePicture(cache->picture, 0);
+ if (cache->picture)
+ FreePicture(cache->picture, 0);
- if (cache->glyphs)
- free(cache->glyphs);
+ if (cache->glyphs)
+ free(cache->glyphs);
- if (mask_cache[i])
- free(mask_cache[i]);
- }
- glamor->glyph_cache_initialized = FALSE;
+ if (mask_cache[i])
+ free(mask_cache[i]);
+ }
+ glamor->glyph_cache_initialized = FALSE;
}
void
glamor_glyphs_fini(ScreenPtr pScreen)
{
- glamor_unrealize_glyph_caches(pScreen);
+ glamor_unrealize_glyph_caches(pScreen);
}
/* All caches for a single format share a single pixmap for glyph storage,
@@ -301,80 +306,80 @@ glamor_glyphs_fini(ScreenPtr pScreen)
static Bool
glamor_realize_glyph_caches(ScreenPtr pScreen)
{
- glamor_screen_private *glamor = glamor_get_screen_private(pScreen);
- unsigned int formats[] = {
- PIXMAN_a8,
- PIXMAN_a8r8g8b8,
- };
- int i;
-
- if (glamor->glyph_cache_initialized)
- return TRUE;
-
- glamor->glyph_cache_initialized = TRUE;
- memset(glamor->glyphCaches, 0, sizeof(glamor->glyphCaches));
-
- for (i = 0; i < sizeof(formats) / sizeof(formats[0]); i++) {
- glamor_glyph_cache_t *cache = &glamor->glyphCaches[i];
- PixmapPtr pixmap;
- PicturePtr picture;
- XID component_alpha;
- int depth = PIXMAN_FORMAT_DEPTH(formats[i]);
- int error;
- PictFormatPtr pPictFormat =
- PictureMatchFormat(pScreen, depth, formats[i]);
- if (!pPictFormat)
- goto bail;
-
- /* Now allocate the pixmap and picture */
- pixmap = pScreen->CreatePixmap(pScreen,
- CACHE_PICTURE_SIZE,
- CACHE_PICTURE_SIZE + MASK_CACHE_MAX_SIZE, depth,
- 0);
- if (!pixmap)
- goto bail;
-
- component_alpha = NeedsComponent(pPictFormat->format);
- picture = CreatePicture(0, &pixmap->drawable, pPictFormat,
- CPComponentAlpha, &component_alpha,
- serverClient, &error);
-
- pScreen->DestroyPixmap(pixmap);
- if (!picture)
- goto bail;
-
- ValidatePicture(picture);
-
- cache->picture = picture;
- cache->glyphs = calloc(sizeof(GlyphPtr), GLYPH_CACHE_SIZE);
- if (!cache->glyphs)
- goto bail;
-
- cache->evict = rand() % GLYPH_CACHE_SIZE;
- mask_cache[i] = calloc(1, sizeof(*mask_cache[i]));
- mask_cache[i]->pixmap = pixmap;
- clear_mask_cache(mask_cache[i]);
- }
- assert(i == GLAMOR_NUM_GLYPH_CACHE_FORMATS);
-
- return TRUE;
-
- bail:
- glamor_unrealize_glyph_caches(pScreen);
- return FALSE;
+ glamor_screen_private *glamor = glamor_get_screen_private(pScreen);
+
+ unsigned int formats[] = {
+ PIXMAN_a8,
+ PIXMAN_a8r8g8b8,
+ };
+ int i;
+
+ if (glamor->glyph_cache_initialized)
+ return TRUE;
+
+ glamor->glyph_cache_initialized = TRUE;
+ memset(glamor->glyphCaches, 0, sizeof(glamor->glyphCaches));
+
+ for (i = 0; i < sizeof(formats) / sizeof(formats[0]); i++) {
+ glamor_glyph_cache_t *cache = &glamor->glyphCaches[i];
+ PixmapPtr pixmap;
+ PicturePtr picture;
+ XID component_alpha;
+ int depth = PIXMAN_FORMAT_DEPTH(formats[i]);
+ int error;
+ PictFormatPtr pPictFormat =
+ PictureMatchFormat(pScreen, depth, formats[i]);
+ if (!pPictFormat)
+ goto bail;
+
+ /* Now allocate the pixmap and picture */
+ pixmap = pScreen->CreatePixmap(pScreen,
+ CACHE_PICTURE_SIZE,
+ CACHE_PICTURE_SIZE + MASK_CACHE_MAX_SIZE,
+ depth, 0);
+ if (!pixmap)
+ goto bail;
+
+ component_alpha = NeedsComponent(pPictFormat->format);
+ picture = CreatePicture(0, &pixmap->drawable, pPictFormat,
+ CPComponentAlpha, &component_alpha,
+ serverClient, &error);
+
+ pScreen->DestroyPixmap(pixmap);
+ if (!picture)
+ goto bail;
+
+ ValidatePicture(picture);
+
+ cache->picture = picture;
+ cache->glyphs = calloc(sizeof(GlyphPtr), GLYPH_CACHE_SIZE);
+ if (!cache->glyphs)
+ goto bail;
+
+ cache->evict = rand() % GLYPH_CACHE_SIZE;
+ mask_cache[i] = calloc(1, sizeof(*mask_cache[i]));
+ mask_cache[i]->pixmap = pixmap;
+ clear_mask_cache(mask_cache[i]);
+ }
+ assert(i == GLAMOR_NUM_GLYPH_CACHE_FORMATS);
+
+ return TRUE;
+
+ bail:
+ glamor_unrealize_glyph_caches(pScreen);
+ return FALSE;
}
-
Bool
glamor_glyphs_init(ScreenPtr pScreen)
{
- if (!dixRegisterPrivateKey(&glamor_glyph_key,
- PRIVATE_GLYPH, sizeof(struct glamor_glyph)))
- return FALSE;
+ if (!dixRegisterPrivateKey(&glamor_glyph_key,
+ PRIVATE_GLYPH, sizeof(struct glamor_glyph)))
+ return FALSE;
- /* Skip pixmap creation if we don't intend to use it. */
+ /* Skip pixmap creation if we don't intend to use it. */
- return glamor_realize_glyph_caches(pScreen);
+ return glamor_realize_glyph_caches(pScreen);
}
/* The most efficient thing to way to upload the glyph to the screen
@@ -382,209 +387,209 @@ glamor_glyphs_init(ScreenPtr pScreen)
*/
static void
glamor_glyph_cache_upload_glyph(ScreenPtr screen,
- glamor_glyph_cache_t * cache,
- GlyphPtr glyph, int x, int y)
+ glamor_glyph_cache_t *cache,
+ GlyphPtr glyph, int x, int y)
{
- PicturePtr pGlyphPicture = GlyphPicture(glyph)[screen->myNum];
- PixmapPtr pGlyphPixmap = (PixmapPtr) pGlyphPicture->pDrawable;
- PixmapPtr pCachePixmap = (PixmapPtr) cache->picture->pDrawable;
- PixmapPtr scratch;
- BoxRec box;
- GCPtr gc;
-
- gc = GetScratchGC(pCachePixmap->drawable.depth, screen);
- if (!gc)
- return;
-
- ValidateGC(&pCachePixmap->drawable, gc);
-
- scratch = pGlyphPixmap;
- if (pGlyphPixmap->drawable.depth != pCachePixmap->drawable.depth) {
-
- scratch = glamor_create_pixmap(screen,
- glyph->info.width,
- glyph->info.height,
- pCachePixmap->
- drawable.depth, 0);
- if (scratch) {
- PicturePtr picture;
- int error;
-
- picture =
- CreatePicture(0,
- &scratch->drawable,
- PictureMatchFormat
- (screen,
- pCachePixmap->
- drawable.depth,
- cache->picture->format),
- 0, NULL, serverClient,
- &error);
- if (picture) {
- ValidatePicture(picture);
- glamor_composite(PictOpSrc,
- pGlyphPicture,
- NULL, picture,
- 0, 0, 0, 0, 0,
- 0,
- glyph->info.width,
- glyph->info.height);
- FreePicture(picture, 0);
- }
- } else {
- scratch = pGlyphPixmap;
- }
- }
-
- box.x1 = x;
- box.y1 = y;
- box.x2 = x + glyph->info.width;
- box.y2 = y + glyph->info.height;
- glamor_copy_n_to_n_nf(&scratch->drawable,
- &pCachePixmap->drawable, NULL,
- &box, 1,
- -x, -y,
- FALSE, FALSE, 0, NULL);
- if (scratch != pGlyphPixmap)
- screen->DestroyPixmap(scratch);
-
- FreeScratchGC(gc);
+ PicturePtr pGlyphPicture = GlyphPicture(glyph)[screen->myNum];
+ PixmapPtr pGlyphPixmap = (PixmapPtr) pGlyphPicture->pDrawable;
+ PixmapPtr pCachePixmap = (PixmapPtr) cache->picture->pDrawable;
+ PixmapPtr scratch;
+ BoxRec box;
+ GCPtr gc;
+
+ gc = GetScratchGC(pCachePixmap->drawable.depth, screen);
+ if (!gc)
+ return;
+
+ ValidateGC(&pCachePixmap->drawable, gc);
+
+ scratch = pGlyphPixmap;
+ if (pGlyphPixmap->drawable.depth != pCachePixmap->drawable.depth) {
+
+ scratch = glamor_create_pixmap(screen,
+ glyph->info.width,
+ glyph->info.height,
+ pCachePixmap->drawable.depth, 0);
+ if (scratch) {
+ PicturePtr picture;
+ int error;
+
+ picture =
+ CreatePicture(0,
+ &scratch->drawable,
+ PictureMatchFormat
+ (screen,
+ pCachePixmap->drawable.depth,
+ cache->picture->format),
+ 0, NULL, serverClient, &error);
+ if (picture) {
+ ValidatePicture(picture);
+ glamor_composite(PictOpSrc,
+ pGlyphPicture,
+ NULL, picture,
+ 0, 0, 0, 0, 0,
+ 0, glyph->info.width, glyph->info.height);
+ FreePicture(picture, 0);
+ }
+ }
+ else {
+ scratch = pGlyphPixmap;
+ }
+ }
+
+ box.x1 = x;
+ box.y1 = y;
+ box.x2 = x + glyph->info.width;
+ box.y2 = y + glyph->info.height;
+ glamor_copy_n_to_n_nf(&scratch->drawable,
+ &pCachePixmap->drawable, NULL,
+ &box, 1, -x, -y, FALSE, FALSE, 0, NULL);
+ if (scratch != pGlyphPixmap)
+ screen->DestroyPixmap(scratch);
+
+ FreeScratchGC(gc);
}
-
void
glamor_glyph_unrealize(ScreenPtr screen, GlyphPtr glyph)
{
- struct glamor_glyph *priv;
+ struct glamor_glyph *priv;
- /* Use Lookup in case we have not attached to this glyph. */
- priv = glamor_glyph_get_private(glyph);
+ /* Use Lookup in case we have not attached to this glyph. */
+ priv = glamor_glyph_get_private(glyph);
- if (priv->cached)
- priv->cache->glyphs[priv->pos] = NULL;
+ if (priv->cached)
+ priv->cache->glyphs[priv->pos] = NULL;
}
/* Cut and paste from render/glyph.c - probably should export it instead */
static void
glamor_glyph_extents(int nlist,
- GlyphListPtr list, GlyphPtr * glyphs, BoxPtr extents)
+ GlyphListPtr list, GlyphPtr *glyphs, BoxPtr extents)
{
- int x1, x2, y1, y2;
- int x, y, n;
-
- x1 = y1 = MAXSHORT;
- x2 = y2 = MINSHORT;
- x = y = 0;
- while (nlist--) {
- x += list->xOff;
- y += list->yOff;
- n = list->len;
- list++;
- while (n--) {
- GlyphPtr glyph = *glyphs++;
- int v;
-
- v = x - glyph->info.x;
- if (v < x1)
- x1 = v;
- v += glyph->info.width;
- if (v > x2)
- x2 = v;
-
- v = y - glyph->info.y;
- if (v < y1)
- y1 = v;
- v += glyph->info.height;
- if (v > y2)
- y2 = v;
-
- x += glyph->info.xOff;
- y += glyph->info.yOff;
- }
- }
-
- extents->x1 = x1 < MINSHORT ? MINSHORT : x1;
- extents->x2 = x2 > MAXSHORT ? MAXSHORT : x2;
- extents->y1 = y1 < MINSHORT ? MINSHORT : y1;
- extents->y2 = y2 > MAXSHORT ? MAXSHORT : y2;
+ int x1, x2, y1, y2;
+ int x, y, n;
+
+ x1 = y1 = MAXSHORT;
+ x2 = y2 = MINSHORT;
+ x = y = 0;
+ while (nlist--) {
+ x += list->xOff;
+ y += list->yOff;
+ n = list->len;
+ list++;
+ while (n--) {
+ GlyphPtr glyph = *glyphs++;
+ int v;
+
+ v = x - glyph->info.x;
+ if (v < x1)
+ x1 = v;
+ v += glyph->info.width;
+ if (v > x2)
+ x2 = v;
+
+ v = y - glyph->info.y;
+ if (v < y1)
+ y1 = v;
+ v += glyph->info.height;
+ if (v > y2)
+ y2 = v;
+
+ x += glyph->info.xOff;
+ y += glyph->info.yOff;
+ }
+ }
+
+ extents->x1 = x1 < MINSHORT ? MINSHORT : x1;
+ extents->x2 = x2 > MAXSHORT ? MAXSHORT : x2;
+ extents->y1 = y1 < MINSHORT ? MINSHORT : y1;
+ extents->y2 = y2 > MAXSHORT ? MAXSHORT : y2;
}
static void
glamor_glyph_priv_get_edge_map(GlyphPtr glyph, struct glamor_glyph *priv,
- PicturePtr glyph_picture)
+ PicturePtr glyph_picture)
{
- PixmapPtr glyph_pixmap = (PixmapPtr) glyph_picture->pDrawable;
- int j;
- unsigned long long left_x1_map = 0, left_x2_map = 0;
- unsigned long long right_x1_map = 0, right_x2_map = 0;
- int bitsPerPixel;
- int stride;
- void *bits;
- int width;
- unsigned int left_x1_data = 0, left_x2_data = 0;
- unsigned int right_x1_data = 0, right_x2_data = 0;
-
- bitsPerPixel = glyph_pixmap->drawable.bitsPerPixel;
- stride = glyph_pixmap->devKind;
- bits = glyph_pixmap->devPrivate.ptr;
- width = glyph->info.width;
-
- if (glyph_pixmap->drawable.width < 2
- || !(glyph_pixmap->drawable.depth == 8
- || glyph_pixmap->drawable.depth == 1
- || glyph_pixmap->drawable.depth == 32)) {
- priv->has_edge_map = FALSE;
- return;
- }
-
- left_x1_map = left_x2_map = 0;
- right_x1_map = right_x2_map = 0;
-
- for(j = 0; j < glyph_pixmap->drawable.height; j++)
- {
- if (bitsPerPixel == 8) {
- unsigned char *data;
- data = (unsigned char*)((unsigned char*)bits + stride * j);
- left_x1_data = *data++;
- left_x2_data = *data;
- data = (unsigned char*)((unsigned char*)bits + stride * j + width - 2);
- right_x1_data = *data++;
- right_x2_data = *data;
- } else if (bitsPerPixel == 32) {
- left_x1_data = *((unsigned int*)bits + stride/4 * j);
- left_x2_data = *((unsigned int*)bits + stride/4 * j + 1);
- right_x1_data = *((unsigned int*)bits + stride/4 * j + width - 2);
- right_x2_data = *((unsigned int*)bits + stride/4 * j + width - 1);
- } else if (bitsPerPixel == 1) {
- unsigned char temp;
- temp = *((unsigned char*)glyph_pixmap->devPrivate.ptr
- + glyph_pixmap->devKind * j) & 0x3;
- left_x1_data = temp & 0x1;
- left_x2_data = temp & 0x2;
-
- temp = *((unsigned char*)glyph_pixmap->devPrivate.ptr
- + glyph_pixmap->devKind * j
- + (glyph_pixmap->drawable.width - 2)/8);
- right_x1_data = temp
- & (1 << ((glyph_pixmap->drawable.width - 2) % 8));
- temp = *((unsigned char*)glyph_pixmap->devPrivate.ptr
- + glyph_pixmap->devKind * j
- + (glyph_pixmap->drawable.width - 1)/8);
- right_x2_data = temp
- & (1 << ((glyph_pixmap->drawable.width - 1) % 8));
- }
- left_x1_map |= (left_x1_data !=0) << j;
- left_x2_map |= (left_x2_data !=0) << j;
- right_x1_map |= (right_x1_data !=0) << j;
- right_x2_map |= (right_x2_data !=0) << j;
- }
-
- priv->left_x1_map = left_x1_map;
- priv->left_x2_map = left_x2_map;
- priv->right_x1_map = right_x1_map;
- priv->right_x2_map = right_x2_map;
- priv->has_edge_map = TRUE;
- return;
+ PixmapPtr glyph_pixmap = (PixmapPtr) glyph_picture->pDrawable;
+ int j;
+ unsigned long long left_x1_map = 0, left_x2_map = 0;
+ unsigned long long right_x1_map = 0, right_x2_map = 0;
+ int bitsPerPixel;
+ int stride;
+ void *bits;
+ int width;
+ unsigned int left_x1_data = 0, left_x2_data = 0;
+ unsigned int right_x1_data = 0, right_x2_data = 0;
+
+ bitsPerPixel = glyph_pixmap->drawable.bitsPerPixel;
+ stride = glyph_pixmap->devKind;
+ bits = glyph_pixmap->devPrivate.ptr;
+ width = glyph->info.width;
+
+ if (glyph_pixmap->drawable.width < 2
+ || !(glyph_pixmap->drawable.depth == 8
+ || glyph_pixmap->drawable.depth == 1
+ || glyph_pixmap->drawable.depth == 32)) {
+ priv->has_edge_map = FALSE;
+ return;
+ }
+
+ left_x1_map = left_x2_map = 0;
+ right_x1_map = right_x2_map = 0;
+
+ for (j = 0; j < glyph_pixmap->drawable.height; j++) {
+ if (bitsPerPixel == 8) {
+ unsigned char *data;
+
+ data = (unsigned char *) ((unsigned char *) bits + stride * j);
+ left_x1_data = *data++;
+ left_x2_data = *data;
+ data =
+ (unsigned char *) ((unsigned char *) bits + stride * j + width -
+ 2);
+ right_x1_data = *data++;
+ right_x2_data = *data;
+ }
+ else if (bitsPerPixel == 32) {
+ left_x1_data = *((unsigned int *) bits + stride / 4 * j);
+ left_x2_data = *((unsigned int *) bits + stride / 4 * j + 1);
+ right_x1_data =
+ *((unsigned int *) bits + stride / 4 * j + width - 2);
+ right_x2_data =
+ *((unsigned int *) bits + stride / 4 * j + width - 1);
+ }
+ else if (bitsPerPixel == 1) {
+ unsigned char temp;
+
+ temp = *((unsigned char *) glyph_pixmap->devPrivate.ptr
+ + glyph_pixmap->devKind * j) & 0x3;
+ left_x1_data = temp & 0x1;
+ left_x2_data = temp & 0x2;
+
+ temp = *((unsigned char *) glyph_pixmap->devPrivate.ptr
+ + glyph_pixmap->devKind * j
+ + (glyph_pixmap->drawable.width - 2) / 8);
+ right_x1_data = temp
+ & (1 << ((glyph_pixmap->drawable.width - 2) % 8));
+ temp = *((unsigned char *) glyph_pixmap->devPrivate.ptr
+ + glyph_pixmap->devKind * j
+ + (glyph_pixmap->drawable.width - 1) / 8);
+ right_x2_data = temp
+ & (1 << ((glyph_pixmap->drawable.width - 1) % 8));
+ }
+ left_x1_map |= (left_x1_data != 0) << j;
+ left_x2_map |= (left_x2_data != 0) << j;
+ right_x1_map |= (right_x1_data != 0) << j;
+ right_x2_map |= (right_x2_data != 0) << j;
+ }
+
+ priv->left_x1_map = left_x1_map;
+ priv->left_x2_map = left_x2_map;
+ priv->right_x1_map = right_x1_map;
+ priv->right_x2_map = right_x2_map;
+ priv->has_edge_map = TRUE;
+ return;
}
/**
@@ -597,82 +602,80 @@ glamor_glyph_priv_get_edge_map(GlyphPtr glyph, struct glamor_glyph *priv,
#define INTERSECTED 1
struct glamor_glyph_list {
- int nlist;
- GlyphListPtr list;
- GlyphPtr *glyphs;
- int type;
+ int nlist;
+ GlyphListPtr list;
+ GlyphPtr *glyphs;
+ int type;
};
static Bool
glyph_new_fixed_list(struct glamor_glyph_list *fixed_list,
- GlyphPtr *cur_glyphs,
- GlyphPtr **head_glyphs,
- GlyphListPtr cur_list,
- int cur_pos, int cur_x, int cur_y,
- int x1, int y1, int x2, int y2,
- GlyphListPtr *head_list,
- int *head_pos,
- int *head_x,
- int *head_y,
- int *fixed_cnt,
- int type,
- BoxPtr prev_extents
- )
+ GlyphPtr *cur_glyphs,
+ GlyphPtr ** head_glyphs,
+ GlyphListPtr cur_list,
+ int cur_pos, int cur_x, int cur_y,
+ int x1, int y1, int x2, int y2,
+ GlyphListPtr *head_list,
+ int *head_pos,
+ int *head_x,
+ int *head_y, int *fixed_cnt, int type, BoxPtr prev_extents)
{
- int x_off = 0;
- int y_off = 0;
- int n_off = 0;
- int list_cnt;
- if (type == NON_INTERSECTED) {
- if (x1 < prev_extents->x2 && x2 > prev_extents->x1
- && y1 < prev_extents->y2 && y2 > prev_extents->y1)
- return FALSE;
- x_off = (*(cur_glyphs-1))->info.xOff;
- y_off = (*(cur_glyphs-1))->info.yOff;
- n_off = 1;
- }
-
- list_cnt = cur_list - *head_list + 1;
- if (cur_pos <= n_off) {
- DEBUGF("break at %d n_off %d\n", cur_pos, n_off);
- list_cnt--;
- if (cur_pos < n_off) {
- /* we overlap with previous list's last glyph. */
- x_off += cur_list->xOff;
- y_off += cur_list->yOff;
- cur_list--;
- cur_pos = cur_list->len;
- if (cur_pos <= n_off) {
- list_cnt--;
- }
- }
- }
- DEBUGF("got %d lists\n", list_cnt);
- if (list_cnt != 0) {
- fixed_list->list = malloc(list_cnt * sizeof(*cur_list));
- memcpy(fixed_list->list, *head_list, list_cnt * sizeof(*cur_list));
- fixed_list->list[0].xOff = *head_x;
- fixed_list->list[0].yOff = *head_y;
- fixed_list->glyphs = *head_glyphs;
- fixed_list->type = type & INTERSECTED_TYPE_MASK;
- fixed_list->nlist = list_cnt;
- if (cur_list != *head_list) {
- fixed_list->list[0].len = (*head_list)->len - *head_pos;
- if (cur_pos != n_off)
- fixed_list->list[list_cnt - 1].len = cur_pos - n_off;
- } else
- fixed_list->list[0].len = cur_pos - *head_pos - n_off;
- (*fixed_cnt)++;
- }
-
- if (type <= INTERSECTED) {
- *head_list = cur_list;
- *head_pos = cur_pos - n_off;
- *head_x = cur_x - x_off;
- *head_y = cur_y - y_off;
- *head_glyphs = cur_glyphs - n_off;
- }
- return TRUE;
+ int x_off = 0;
+ int y_off = 0;
+ int n_off = 0;
+ int list_cnt;
+
+ if (type == NON_INTERSECTED) {
+ if (x1 < prev_extents->x2 && x2 > prev_extents->x1
+ && y1 < prev_extents->y2 && y2 > prev_extents->y1)
+ return FALSE;
+ x_off = (*(cur_glyphs - 1))->info.xOff;
+ y_off = (*(cur_glyphs - 1))->info.yOff;
+ n_off = 1;
+ }
+
+ list_cnt = cur_list - *head_list + 1;
+ if (cur_pos <= n_off) {
+ DEBUGF("break at %d n_off %d\n", cur_pos, n_off);
+ list_cnt--;
+ if (cur_pos < n_off) {
+ /* we overlap with previous list's last glyph. */
+ x_off += cur_list->xOff;
+ y_off += cur_list->yOff;
+ cur_list--;
+ cur_pos = cur_list->len;
+ if (cur_pos <= n_off) {
+ list_cnt--;
+ }
+ }
+ }
+ DEBUGF("got %d lists\n", list_cnt);
+ if (list_cnt != 0) {
+ fixed_list->list = malloc(list_cnt * sizeof(*cur_list));
+ memcpy(fixed_list->list, *head_list, list_cnt * sizeof(*cur_list));
+ fixed_list->list[0].xOff = *head_x;
+ fixed_list->list[0].yOff = *head_y;
+ fixed_list->glyphs = *head_glyphs;
+ fixed_list->type = type & INTERSECTED_TYPE_MASK;
+ fixed_list->nlist = list_cnt;
+ if (cur_list != *head_list) {
+ fixed_list->list[0].len = (*head_list)->len - *head_pos;
+ if (cur_pos != n_off)
+ fixed_list->list[list_cnt - 1].len = cur_pos - n_off;
+ }
+ else
+ fixed_list->list[0].len = cur_pos - *head_pos - n_off;
+ (*fixed_cnt)++;
+ }
+
+ if (type <= INTERSECTED) {
+ *head_list = cur_list;
+ *head_pos = cur_pos - n_off;
+ *head_x = cur_x - x_off;
+ *head_y = cur_y - y_off;
+ *head_glyphs = cur_glyphs - n_off;
+ }
+ return TRUE;
}
/*
@@ -692,463 +695,469 @@ glyph_new_fixed_list(struct glamor_glyph_list *fixed_list,
**/
static int
-glamor_glyphs_intersect(int nlist, GlyphListPtr list, GlyphPtr * glyphs,
- PictFormatShort mask_format,
- ScreenPtr screen, Bool check_fake_overlap,
- struct glamor_glyph_list * fixed_list,
- int fixed_size)
+glamor_glyphs_intersect(int nlist, GlyphListPtr list, GlyphPtr *glyphs,
+ PictFormatShort mask_format,
+ ScreenPtr screen, Bool check_fake_overlap,
+ struct glamor_glyph_list *fixed_list, int fixed_size)
{
- int x1, x2, y1, y2;
- int n;
- int x, y;
- BoxPtr extents;
- BoxRec prev_extents;
- Bool first = TRUE, first_list = TRUE;
- Bool need_free_list_region = FALSE;
- Bool need_free_fixed_list = FALSE;
- struct glamor_glyph *priv = NULL;
- Bool in_non_intersected_list = -1;
- GlyphListPtr head_list;
- int head_x, head_y, head_pos;
- int fixed_cnt = 0;
- GlyphPtr *head_glyphs;
- GlyphListPtr cur_list = list;
- RegionRec list_region;
- RegionRec current_region;
- BoxRec current_box;
-
- if (nlist > 1) {
- pixman_region_init(&list_region);
- need_free_list_region = TRUE;
- }
-
- pixman_region_init(&current_region);
-
- extents = pixman_region_extents(&current_region);
-
- x = 0;
- y = 0;
- x1 = x2 = y1 = y2 = 0;
- n = 0;
- extents->x1 = 0;
- extents->y1 = 0;
- extents->x2 = 0;
- extents->y2 = 0;
-
- head_list = list;
- DEBUGF("has %d lists.\n", nlist);
- while (nlist--) {
- BoxRec left_box, right_box = {0};
- Bool has_left_edge_box = FALSE, has_right_edge_box = FALSE;
- Bool left_to_right;
- struct glamor_glyph *left_priv = NULL, *right_priv = NULL;
-
- x += list->xOff;
- y += list->yOff;
- n = list->len;
- left_to_right = TRUE;
- cur_list = list++;
-
- if (unlikely(!first_list)) {
- pixman_region_init_with_extents(&current_region, extents);
- pixman_region_union(&list_region, &list_region, &current_region);
- first = TRUE;
- } else {
- head_list = cur_list;
- head_pos = cur_list->len - n;
- head_x = x;
- head_y = y;
- head_glyphs = glyphs;
- }
-
- DEBUGF("current list %p has %d glyphs\n", cur_list, n);
- while (n--) {
- GlyphPtr glyph = *glyphs++;
-
- DEBUGF("the %dth glyph\n", cur_list->len - n - 1);
- if (glyph->info.width == 0
- || glyph->info.height == 0) {
- x += glyph->info.xOff;
- y += glyph->info.yOff;
- continue;
- }
- if (mask_format
- && mask_format != GlyphPicture(glyph)[screen->myNum]->format) {
- need_free_fixed_list = TRUE;
- goto done;
- }
-
- x1 = x - glyph->info.x;
- if (x1 < MINSHORT)
- x1 = MINSHORT;
- y1 = y - glyph->info.y;
- if (y1 < MINSHORT)
- y1 = MINSHORT;
- if (check_fake_overlap)
- priv = glamor_glyph_get_private(glyph);
-
- x2 = x1 + glyph->info.width;
- y2 = y1 + glyph->info.height;
-
- if (x2 > MAXSHORT)
- x2 = MAXSHORT;
- if (y2 > MAXSHORT)
- y2 = MAXSHORT;
-
- if (first) {
- extents->x1 = x1;
- extents->y1 = y1;
- extents->x2 = x2;
- extents->y2 = y2;
-
- prev_extents = *extents;
-
- first = FALSE;
- if (check_fake_overlap && priv
- && priv->has_edge_map && glyph->info.yOff == 0) {
- left_box.x1 = x1;
- left_box.x2 = x1 + 1;
- left_box.y1 = y1;
-
- right_box.x1 = x2 - 2;
- right_box.x2 = x2 - 1;
- right_box.y1 = y1;
- left_priv = right_priv = priv;
- has_left_edge_box = TRUE;
- has_right_edge_box = TRUE;
- }
- } else {
- if (unlikely(!first_list)) {
- current_box.x1 = x1;
- current_box.y1 = y1;
- current_box.x2 = x2;
- current_box.y2 = y2;
- if (pixman_region_contains_rectangle(&list_region, &current_box) != PIXMAN_REGION_OUT) {
- need_free_fixed_list = TRUE;
- goto done;
- }
- }
-
- if (x1 < extents->x2 && x2 > extents->x1
- && y1 < extents->y2
- && y2 > extents->y1) {
-
- if (check_fake_overlap && (has_left_edge_box || has_right_edge_box)
- && priv->has_edge_map && glyph->info.yOff == 0) {
- int left_dx, right_dx;
- unsigned long long intersected;
-
- left_dx = has_left_edge_box ? 1 : 0;
- right_dx = has_right_edge_box ? 1 : 0;
- if (x1 + 1 < extents->x2 - right_dx && x2 - 1 > extents->x1 + left_dx)
- goto real_intersected;
-
- if (left_to_right && has_right_edge_box) {
- if (x1 == right_box.x1) {
- intersected = ((priv->left_x1_map & right_priv->right_x1_map)
- | (priv->left_x2_map & right_priv->right_x2_map));
- if (intersected)
- goto real_intersected;
- } else if (x1 == right_box.x2) {
- intersected = (priv->left_x1_map & right_priv->right_x2_map);
- if (intersected) {
- #ifdef GLYPHS_EDEGE_OVERLAP_LOOSE_CHECK
- /* tolerate with two pixels overlap. */
- intersected &= ~(1<<__fls(intersected));
- if ((intersected & (intersected - 1)))
- #endif
- goto real_intersected;
- }
- }
- } else if (!left_to_right && has_left_edge_box) {
- if (x2 - 1 == left_box.x1) {
- intersected = (priv->right_x2_map & left_priv->left_x1_map);
- if (intersected) {
- #ifdef GLYPHS_EDEGE_OVERLAP_LOOSE_CHECK
- /* tolerate with two pixels overlap. */
- intersected &= ~(1<<__fls(intersected));
- if ((intersected & (intersected - 1)))
- #endif
- goto real_intersected;
- }
- } else if (x2 - 1 == right_box.x2) {
- if ((priv->right_x1_map & left_priv->left_x1_map)
- || (priv->right_x2_map & left_priv->left_x2_map))
- goto real_intersected;
- }
- } else {
- if (x1 < extents->x2 && x1 + 2 > extents->x1)
- goto real_intersected;
- }
- goto non_intersected;
- } else {
-real_intersected:
- DEBUGF("overlap with previous glyph.\n");
- if (in_non_intersected_list == 1) {
- if (fixed_cnt >= fixed_size) {
- need_free_fixed_list = TRUE;
- goto done;
- }
- if (!glyph_new_fixed_list(&fixed_list[fixed_cnt],
- glyphs - 1,
- &head_glyphs,
- cur_list,
- cur_list->len - (n + 1), x, y,
- x1, y1, x2, y2,
- &head_list,
- &head_pos,
- &head_x,
- &head_y, &fixed_cnt,
- NON_INTERSECTED,
- &prev_extents
- )){
- need_free_fixed_list = TRUE;
- goto done;
- }
- }
-
- in_non_intersected_list = 0;
-
- }
- } else {
-non_intersected:
- DEBUGF("doesn't overlap with previous glyph.\n");
- if (in_non_intersected_list == 0) {
- if (fixed_cnt >= fixed_size) {
- need_free_fixed_list = TRUE;
- goto done;
- }
- if (!glyph_new_fixed_list(&fixed_list[fixed_cnt],
- glyphs - 1,
- &head_glyphs,
- cur_list,
- cur_list->len - (n + 1), x, y,
- x1, y1, x2, y2,
- &head_list,
- &head_pos,
- &head_x,
- &head_y, &fixed_cnt,
- INTERSECTED,
- &prev_extents
- )) {
- need_free_fixed_list = TRUE;
- goto done;
- }
- }
- in_non_intersected_list = 1;
- }
- prev_extents = *extents;
- }
-
- if (check_fake_overlap && priv
- && priv->has_edge_map && glyph->info.yOff == 0) {
- if (!has_left_edge_box || x1 < extents->x1) {
- left_box.x1 = x1;
- left_box.x2 = x1 + 1;
- left_box.y1 = y1;
- has_left_edge_box = TRUE;
- left_priv = priv;
- }
-
- if (!has_right_edge_box || x2 > extents->x2) {
- right_box.x1 = x2 - 2;
- right_box.x2 = x2 - 1;
- right_box.y1 = y1;
- has_right_edge_box = TRUE;
- right_priv = priv;
- }
- }
-
- if (x1 < extents->x1)
- extents->x1 = x1;
- if (x2 > extents->x2)
- extents->x2 = x2;
-
- if (y1 < extents->y1)
- extents->y1 = y1;
- if (y2 > extents->y2)
- extents->y2 = y2;
-
- x += glyph->info.xOff;
- y += glyph->info.yOff;
- }
- first_list = FALSE;
- }
-
- if (in_non_intersected_list == 0 && fixed_cnt == 0) {
- fixed_cnt = -1;
- goto done;
- }
-
- if ((in_non_intersected_list != -1
- || head_pos != n) && (fixed_cnt > 0)) {
- if (fixed_cnt >= fixed_size) {
- need_free_fixed_list = TRUE;
- goto done;
- }
- if (!glyph_new_fixed_list(&fixed_list[fixed_cnt],
- glyphs - 1,
- &head_glyphs,
- cur_list,
- cur_list->len - (n + 1), x, y,
- x1, y1, x2, y2,
- &head_list,
- &head_pos,
- &head_x,
- &head_y, &fixed_cnt,
- (!in_non_intersected_list) | 0x80,
- &prev_extents
- )) {
- need_free_fixed_list = TRUE;
- goto done;
- }
- }
-
-done:
- if (need_free_list_region)
- pixman_region_fini(&list_region);
- pixman_region_fini(&current_region);
-
- if (need_free_fixed_list && fixed_cnt >= 0) {
- while(fixed_cnt--) {
- free(fixed_list[fixed_cnt].list);
- }
- }
-
- DEBUGF("Got %d fixed list \n", fixed_cnt);
- return fixed_cnt;
+ int x1, x2, y1, y2;
+ int n;
+ int x, y;
+ BoxPtr extents;
+ BoxRec prev_extents;
+ Bool first = TRUE, first_list = TRUE;
+ Bool need_free_list_region = FALSE;
+ Bool need_free_fixed_list = FALSE;
+ struct glamor_glyph *priv = NULL;
+ Bool in_non_intersected_list = -1;
+ GlyphListPtr head_list;
+ int head_x, head_y, head_pos;
+ int fixed_cnt = 0;
+ GlyphPtr *head_glyphs;
+ GlyphListPtr cur_list = list;
+ RegionRec list_region;
+ RegionRec current_region;
+ BoxRec current_box;
+
+ if (nlist > 1) {
+ pixman_region_init(&list_region);
+ need_free_list_region = TRUE;
+ }
+
+ pixman_region_init(&current_region);
+
+ extents = pixman_region_extents(&current_region);
+
+ x = 0;
+ y = 0;
+ x1 = x2 = y1 = y2 = 0;
+ n = 0;
+ extents->x1 = 0;
+ extents->y1 = 0;
+ extents->x2 = 0;
+ extents->y2 = 0;
+
+ head_list = list;
+ DEBUGF("has %d lists.\n", nlist);
+ while (nlist--) {
+ BoxRec left_box, right_box = { 0 };
+ Bool has_left_edge_box = FALSE, has_right_edge_box = FALSE;
+ Bool left_to_right;
+ struct glamor_glyph *left_priv = NULL, *right_priv = NULL;
+
+ x += list->xOff;
+ y += list->yOff;
+ n = list->len;
+ left_to_right = TRUE;
+ cur_list = list++;
+
+ if (_X_UNLIKELY(!first_list)) {
+ pixman_region_init_with_extents(&current_region, extents);
+ pixman_region_union(&list_region, &list_region, &current_region);
+ first = TRUE;
+ }
+ else {
+ head_list = cur_list;
+ head_pos = cur_list->len - n;
+ head_x = x;
+ head_y = y;
+ head_glyphs = glyphs;
+ }
+
+ DEBUGF("current list %p has %d glyphs\n", cur_list, n);
+ while (n--) {
+ GlyphPtr glyph = *glyphs++;
+
+ DEBUGF("the %dth glyph\n", cur_list->len - n - 1);
+ if (glyph->info.width == 0 || glyph->info.height == 0) {
+ x += glyph->info.xOff;
+ y += glyph->info.yOff;
+ continue;
+ }
+ if (mask_format
+ && mask_format != GlyphPicture(glyph)[screen->myNum]->format) {
+ need_free_fixed_list = TRUE;
+ goto done;
+ }
+
+ x1 = x - glyph->info.x;
+ if (x1 < MINSHORT)
+ x1 = MINSHORT;
+ y1 = y - glyph->info.y;
+ if (y1 < MINSHORT)
+ y1 = MINSHORT;
+ if (check_fake_overlap)
+ priv = glamor_glyph_get_private(glyph);
+
+ x2 = x1 + glyph->info.width;
+ y2 = y1 + glyph->info.height;
+
+ if (x2 > MAXSHORT)
+ x2 = MAXSHORT;
+ if (y2 > MAXSHORT)
+ y2 = MAXSHORT;
+
+ if (first) {
+ extents->x1 = x1;
+ extents->y1 = y1;
+ extents->x2 = x2;
+ extents->y2 = y2;
+
+ prev_extents = *extents;
+
+ first = FALSE;
+ if (check_fake_overlap && priv
+ && priv->has_edge_map && glyph->info.yOff == 0) {
+ left_box.x1 = x1;
+ left_box.x2 = x1 + 1;
+ left_box.y1 = y1;
+
+ right_box.x1 = x2 - 2;
+ right_box.x2 = x2 - 1;
+ right_box.y1 = y1;
+ left_priv = right_priv = priv;
+ has_left_edge_box = TRUE;
+ has_right_edge_box = TRUE;
+ }
+ }
+ else {
+ if (_X_UNLIKELY(!first_list)) {
+ current_box.x1 = x1;
+ current_box.y1 = y1;
+ current_box.x2 = x2;
+ current_box.y2 = y2;
+ if (pixman_region_contains_rectangle
+ (&list_region, &current_box) != PIXMAN_REGION_OUT) {
+ need_free_fixed_list = TRUE;
+ goto done;
+ }
+ }
+
+ if (x1 < extents->x2 && x2 > extents->x1
+ && y1 < extents->y2 && y2 > extents->y1) {
+
+ if (check_fake_overlap &&
+ (has_left_edge_box || has_right_edge_box)
+ && priv->has_edge_map && glyph->info.yOff == 0) {
+ int left_dx, right_dx;
+ unsigned long long intersected;
+
+ left_dx = has_left_edge_box ? 1 : 0;
+ right_dx = has_right_edge_box ? 1 : 0;
+ if (x1 + 1 < extents->x2 - right_dx &&
+ x2 - 1 > extents->x1 + left_dx)
+ goto real_intersected;
+
+ if (left_to_right && has_right_edge_box) {
+ if (x1 == right_box.x1) {
+ intersected =
+ ((priv->left_x1_map & right_priv->
+ right_x1_map)
+ | (priv->left_x2_map & right_priv->
+ right_x2_map));
+ if (intersected)
+ goto real_intersected;
+ }
+ else if (x1 == right_box.x2) {
+ intersected =
+ (priv->left_x1_map & right_priv->
+ right_x2_map);
+ if (intersected) {
+#ifdef GLYPHS_EDEGE_OVERLAP_LOOSE_CHECK
+ /* tolerate with two pixels overlap. */
+ intersected &= ~(1 << __fls(intersected));
+ if ((intersected & (intersected - 1)))
+#endif
+ goto real_intersected;
+ }
+ }
+ }
+ else if (!left_to_right && has_left_edge_box) {
+ if (x2 - 1 == left_box.x1) {
+ intersected =
+ (priv->right_x2_map & left_priv->
+ left_x1_map);
+ if (intersected) {
+#ifdef GLYPHS_EDEGE_OVERLAP_LOOSE_CHECK
+ /* tolerate with two pixels overlap. */
+ intersected &= ~(1 << __fls(intersected));
+ if ((intersected & (intersected - 1)))
+#endif
+ goto real_intersected;
+ }
+ }
+ else if (x2 - 1 == right_box.x2) {
+ if ((priv->right_x1_map & left_priv->
+ left_x1_map)
+ || (priv->right_x2_map & left_priv->
+ left_x2_map))
+ goto real_intersected;
+ }
+ }
+ else {
+ if (x1 < extents->x2 && x1 + 2 > extents->x1)
+ goto real_intersected;
+ }
+ goto non_intersected;
+ }
+ else {
+ real_intersected:
+ DEBUGF("overlap with previous glyph.\n");
+ if (in_non_intersected_list == 1) {
+ if (fixed_cnt >= fixed_size) {
+ need_free_fixed_list = TRUE;
+ goto done;
+ }
+ if (!glyph_new_fixed_list(&fixed_list[fixed_cnt],
+ glyphs - 1,
+ &head_glyphs,
+ cur_list,
+ cur_list->len - (n + 1),
+ x, y, x1, y1, x2, y2,
+ &head_list, &head_pos,
+ &head_x, &head_y,
+ &fixed_cnt,
+ NON_INTERSECTED,
+ &prev_extents)) {
+ need_free_fixed_list = TRUE;
+ goto done;
+ }
+ }
+
+ in_non_intersected_list = 0;
+
+ }
+ }
+ else {
+ non_intersected:
+ DEBUGF("doesn't overlap with previous glyph.\n");
+ if (in_non_intersected_list == 0) {
+ if (fixed_cnt >= fixed_size) {
+ need_free_fixed_list = TRUE;
+ goto done;
+ }
+ if (!glyph_new_fixed_list(&fixed_list[fixed_cnt],
+ glyphs - 1,
+ &head_glyphs,
+ cur_list,
+ cur_list->len - (n + 1), x, y,
+ x1, y1, x2, y2,
+ &head_list,
+ &head_pos,
+ &head_x,
+ &head_y, &fixed_cnt,
+ INTERSECTED, &prev_extents)) {
+ need_free_fixed_list = TRUE;
+ goto done;
+ }
+ }
+ in_non_intersected_list = 1;
+ }
+ prev_extents = *extents;
+ }
+
+ if (check_fake_overlap && priv
+ && priv->has_edge_map && glyph->info.yOff == 0) {
+ if (!has_left_edge_box || x1 < extents->x1) {
+ left_box.x1 = x1;
+ left_box.x2 = x1 + 1;
+ left_box.y1 = y1;
+ has_left_edge_box = TRUE;
+ left_priv = priv;
+ }
+
+ if (!has_right_edge_box || x2 > extents->x2) {
+ right_box.x1 = x2 - 2;
+ right_box.x2 = x2 - 1;
+ right_box.y1 = y1;
+ has_right_edge_box = TRUE;
+ right_priv = priv;
+ }
+ }
+
+ if (x1 < extents->x1)
+ extents->x1 = x1;
+ if (x2 > extents->x2)
+ extents->x2 = x2;
+
+ if (y1 < extents->y1)
+ extents->y1 = y1;
+ if (y2 > extents->y2)
+ extents->y2 = y2;
+
+ x += glyph->info.xOff;
+ y += glyph->info.yOff;
+ }
+ first_list = FALSE;
+ }
+
+ if (in_non_intersected_list == 0 && fixed_cnt == 0) {
+ fixed_cnt = -1;
+ goto done;
+ }
+
+ if ((in_non_intersected_list != -1 || head_pos != n) && (fixed_cnt > 0)) {
+ if (fixed_cnt >= fixed_size) {
+ need_free_fixed_list = TRUE;
+ goto done;
+ }
+ if (!glyph_new_fixed_list(&fixed_list[fixed_cnt],
+ glyphs - 1,
+ &head_glyphs,
+ cur_list,
+ cur_list->len - (n + 1), x, y,
+ x1, y1, x2, y2,
+ &head_list,
+ &head_pos,
+ &head_x,
+ &head_y, &fixed_cnt,
+ (!in_non_intersected_list) | 0x80,
+ &prev_extents)) {
+ need_free_fixed_list = TRUE;
+ goto done;
+ }
+ }
+
+ done:
+ if (need_free_list_region)
+ pixman_region_fini(&list_region);
+ pixman_region_fini(&current_region);
+
+ if (need_free_fixed_list && fixed_cnt >= 0) {
+ while (fixed_cnt--) {
+ free(fixed_list[fixed_cnt].list);
+ }
+ }
+
+ DEBUGF("Got %d fixed list \n", fixed_cnt);
+ return fixed_cnt;
}
static inline unsigned int
glamor_glyph_size_to_count(int size)
{
- size /= GLYPH_MIN_SIZE;
- return size * size;
+ size /= GLYPH_MIN_SIZE;
+ return size * size;
}
static inline unsigned int
glamor_glyph_count_to_mask(int count)
{
- return ~(count - 1);
+ return ~(count - 1);
}
static inline unsigned int
glamor_glyph_size_to_mask(int size)
{
- return
- glamor_glyph_count_to_mask(glamor_glyph_size_to_count(size));
+ return glamor_glyph_count_to_mask(glamor_glyph_size_to_count(size));
}
static PicturePtr
glamor_glyph_cache(glamor_screen_private *glamor, GlyphPtr glyph, int *out_x,
- int *out_y)
+ int *out_y)
{
- ScreenPtr screen = glamor->screen;
- PicturePtr glyph_picture = GlyphPicture(glyph)[screen->myNum];
- glamor_glyph_cache_t *cache =
- &glamor->glyphCaches[PICT_FORMAT_RGB(glyph_picture->format) !=
- 0];
- struct glamor_glyph *priv = NULL, *evicted_priv = NULL;
- int size, mask, pos, s;
-
- if (glyph->info.width > GLYPH_MAX_SIZE
- || glyph->info.height > GLYPH_MAX_SIZE)
- return NULL;
-
- for (size = GLYPH_MIN_SIZE; size <= GLYPH_MAX_SIZE; size *= 2)
- if (glyph->info.width <= size
- && glyph->info.height <= size)
- break;
-
- s = glamor_glyph_size_to_count(size);
- mask = glamor_glyph_count_to_mask(s);
- pos = (cache->count + s - 1) & mask;
-
- priv = glamor_glyph_get_private(glyph);
- if (pos < GLYPH_CACHE_SIZE) {
- cache->count = pos + s;
- } else {
- for (s = size; s <= GLYPH_MAX_SIZE; s *= 2) {
- int i =
- cache->evict & glamor_glyph_size_to_mask(s);
- GlyphPtr evicted = cache->glyphs[i];
- if (evicted == NULL)
- continue;
-
- evicted_priv = glamor_glyph_get_private(evicted);
- assert(evicted_priv->pos == i);
- if (evicted_priv->size >= s) {
- cache->glyphs[i] = NULL;
- evicted_priv->cached = FALSE;
- pos = cache->evict &
- glamor_glyph_size_to_mask(size);
- } else
- evicted_priv = NULL;
- break;
- }
- if (evicted_priv == NULL) {
- int count = glamor_glyph_size_to_count(size);
- mask = glamor_glyph_count_to_mask(count);
- pos = cache->evict & mask;
- for (s = 0; s < count; s++) {
- GlyphPtr evicted = cache->glyphs[pos + s];
- if (evicted != NULL) {
-
- evicted_priv =
- glamor_glyph_get_private
- (evicted);
-
- assert(evicted_priv->pos == pos + s);
- evicted_priv->cached = FALSE;
- cache->glyphs[pos + s] = NULL;
- }
- }
-
- }
- /* And pick a new eviction position */
- cache->evict = rand() % GLYPH_CACHE_SIZE;
- }
-
-
- cache->glyphs[pos] = glyph;
-
- priv->cache = cache;
- priv->size = size;
- priv->pos = pos;
- s = pos / ((GLYPH_MAX_SIZE / GLYPH_MIN_SIZE) *
- (GLYPH_MAX_SIZE / GLYPH_MIN_SIZE));
- priv->x =
- s % (CACHE_PICTURE_SIZE / GLYPH_MAX_SIZE) * GLYPH_MAX_SIZE;
- priv->y =
- (s / (CACHE_PICTURE_SIZE / GLYPH_MAX_SIZE)) * GLYPH_MAX_SIZE;
- for (s = GLYPH_MIN_SIZE; s < GLYPH_MAX_SIZE; s *= 2) {
- if (pos & 1)
- priv->x += s;
- if (pos & 2)
- priv->y += s;
- pos >>= 2;
- }
-
- glamor_glyph_cache_upload_glyph(screen, cache, glyph, priv->x,
- priv->y);
+ ScreenPtr screen = glamor->screen;
+ PicturePtr glyph_picture = GlyphPicture(glyph)[screen->myNum];
+ glamor_glyph_cache_t *cache =
+ &glamor->glyphCaches[PICT_FORMAT_RGB(glyph_picture->format) != 0];
+ struct glamor_glyph *priv = NULL, *evicted_priv = NULL;
+ int size, mask, pos, s;
+
+ if (glyph->info.width > GLYPH_MAX_SIZE
+ || glyph->info.height > GLYPH_MAX_SIZE)
+ return NULL;
+
+ for (size = GLYPH_MIN_SIZE; size <= GLYPH_MAX_SIZE; size *= 2)
+ if (glyph->info.width <= size && glyph->info.height <= size)
+ break;
+
+ s = glamor_glyph_size_to_count(size);
+ mask = glamor_glyph_count_to_mask(s);
+ pos = (cache->count + s - 1) & mask;
+
+ priv = glamor_glyph_get_private(glyph);
+ if (pos < GLYPH_CACHE_SIZE) {
+ cache->count = pos + s;
+ }
+ else {
+ for (s = size; s <= GLYPH_MAX_SIZE; s *= 2) {
+ int i = cache->evict & glamor_glyph_size_to_mask(s);
+ GlyphPtr evicted = cache->glyphs[i];
+
+ if (evicted == NULL)
+ continue;
+
+ evicted_priv = glamor_glyph_get_private(evicted);
+ assert(evicted_priv->pos == i);
+ if (evicted_priv->size >= s) {
+ cache->glyphs[i] = NULL;
+ evicted_priv->cached = FALSE;
+ pos = cache->evict & glamor_glyph_size_to_mask(size);
+ }
+ else
+ evicted_priv = NULL;
+ break;
+ }
+ if (evicted_priv == NULL) {
+ int count = glamor_glyph_size_to_count(size);
+
+ mask = glamor_glyph_count_to_mask(count);
+ pos = cache->evict & mask;
+ for (s = 0; s < count; s++) {
+ GlyphPtr evicted = cache->glyphs[pos + s];
+
+ if (evicted != NULL) {
+
+ evicted_priv = glamor_glyph_get_private(evicted);
+
+ assert(evicted_priv->pos == pos + s);
+ evicted_priv->cached = FALSE;
+ cache->glyphs[pos + s] = NULL;
+ }
+ }
+
+ }
+ /* And pick a new eviction position */
+ cache->evict = rand() % GLYPH_CACHE_SIZE;
+ }
+
+ cache->glyphs[pos] = glyph;
+
+ priv->cache = cache;
+ priv->size = size;
+ priv->pos = pos;
+ s = pos / ((GLYPH_MAX_SIZE / GLYPH_MIN_SIZE) *
+ (GLYPH_MAX_SIZE / GLYPH_MIN_SIZE));
+ priv->x = s % (CACHE_PICTURE_SIZE / GLYPH_MAX_SIZE) * GLYPH_MAX_SIZE;
+ priv->y = (s / (CACHE_PICTURE_SIZE / GLYPH_MAX_SIZE)) * GLYPH_MAX_SIZE;
+ for (s = GLYPH_MIN_SIZE; s < GLYPH_MAX_SIZE; s *= 2) {
+ if (pos & 1)
+ priv->x += s;
+ if (pos & 2)
+ priv->y += s;
+ pos >>= 2;
+ }
+
+ glamor_glyph_cache_upload_glyph(screen, cache, glyph, priv->x, priv->y);
#ifndef GLYPHS_NO_EDEGEMAP_OVERLAP_CHECK
- if (priv->has_edge_map == FALSE && glyph->info.width >= 2)
- glamor_glyph_priv_get_edge_map(glyph, priv, glyph_picture);
+ if (priv->has_edge_map == FALSE && glyph->info.width >= 2)
+ glamor_glyph_priv_get_edge_map(glyph, priv, glyph_picture);
#endif
- priv->cached = TRUE;
+ priv->cached = TRUE;
- *out_x = priv->x;
- *out_y = priv->y;
- return cache->picture;
+ *out_x = priv->x;
+ *out_y = priv->y;
+ return cache->picture;
}
-typedef void (*glyphs_flush_func)(void * arg);
+
+typedef void (*glyphs_flush_func) (void *arg);
struct glyphs_flush_dst_arg {
- CARD8 op;
- PicturePtr src;
- PicturePtr dst;
- glamor_glyph_buffer_t * buffer;
- int x_src,y_src;
- int x_dst, y_dst;
+ CARD8 op;
+ PicturePtr src;
+ PicturePtr dst;
+ glamor_glyph_buffer_t *buffer;
+ int x_src, y_src;
+ int x_dst, y_dst;
};
static struct glyphs_flush_dst_arg dst_arg;
@@ -1157,650 +1166,638 @@ static glamor_glyph_buffer_t dst_buffer;
static glamor_glyph_buffer_t mask_buffer;
unsigned long long mask_glyphs_cnt = 0;
unsigned long long dst_glyphs_cnt = 0;
+
#define GLYPHS_DST_MODE_VIA_MASK 0
#define GLYPHS_DST_MODE_VIA_MASK_CACHE 1
#define GLYPHS_DST_MODE_TO_DST 2
#define GLYPHS_DST_MODE_MASK_TO_DST 3
struct glyphs_flush_mask_arg {
- PicturePtr mask;
- glamor_glyph_buffer_t *buffer;
- struct glamor_glyph_mask_cache *maskcache;
- unsigned int used_bitmap;
+ PicturePtr mask;
+ glamor_glyph_buffer_t *buffer;
+ struct glamor_glyph_mask_cache *maskcache;
+ unsigned int used_bitmap;
};
static void
glamor_glyphs_flush_mask(struct glyphs_flush_mask_arg *arg)
{
- if (arg->buffer->count>0) {
+ if (arg->buffer->count > 0) {
#ifdef RENDER
- glamor_composite_glyph_rects(PictOpAdd, arg->buffer->source,
- NULL, arg->mask,
- arg->buffer->count,
- arg->buffer->rects);
+ glamor_composite_glyph_rects(PictOpAdd, arg->buffer->source,
+ NULL, arg->mask,
+ arg->buffer->count, arg->buffer->rects);
#endif
- }
- arg->buffer->count = 0;
- arg->buffer->source = NULL;
+ }
+ arg->buffer->count = 0;
+ arg->buffer->source = NULL;
}
static void
-glamor_glyphs_flush_dst(struct glyphs_flush_dst_arg * arg)
+glamor_glyphs_flush_dst(struct glyphs_flush_dst_arg *arg)
{
- if (!arg->buffer)
- return;
-
- if (mask_buffer.count > 0) {
- glamor_glyphs_flush_mask(&mask_arg);
- }
- if (mask_arg.used_bitmap) {
- put_mask_cache_bitmap(mask_arg.maskcache, mask_arg.used_bitmap);
- mask_arg.used_bitmap = 0;
- }
-
- if (arg->buffer->count > 0) {
- glamor_composite_glyph_rects(arg->op, arg->src,
- arg->buffer->source, arg->dst,
- arg->buffer->count,
- &arg->buffer->rects[0]);
- arg->buffer->count = 0;
- arg->buffer->source = NULL;
- }
+ if (!arg->buffer)
+ return;
+
+ if (mask_buffer.count > 0) {
+ glamor_glyphs_flush_mask(&mask_arg);
+ }
+ if (mask_arg.used_bitmap) {
+ put_mask_cache_bitmap(mask_arg.maskcache, mask_arg.used_bitmap);
+ mask_arg.used_bitmap = 0;
+ }
+
+ if (arg->buffer->count > 0) {
+ glamor_composite_glyph_rects(arg->op, arg->src,
+ arg->buffer->source, arg->dst,
+ arg->buffer->count,
+ &arg->buffer->rects[0]);
+ arg->buffer->count = 0;
+ arg->buffer->source = NULL;
+ }
}
-
static glamor_glyph_cache_result_t
glamor_buffer_glyph(glamor_screen_private *glamor_priv,
- glamor_glyph_buffer_t * buffer,
- PictFormatShort format,
- GlyphPtr glyph, struct glamor_glyph *priv,
- int x_glyph, int y_glyph,
- int dx, int dy, int w, int h,
- int glyphs_dst_mode,
- glyphs_flush_func glyphs_flush, void *flush_arg)
+ glamor_glyph_buffer_t *buffer,
+ PictFormatShort format,
+ GlyphPtr glyph, struct glamor_glyph *priv,
+ int x_glyph, int y_glyph,
+ int dx, int dy, int w, int h,
+ int glyphs_dst_mode,
+ glyphs_flush_func glyphs_flush, void *flush_arg)
{
- ScreenPtr screen = glamor_priv->screen;
- glamor_composite_rect_t *rect;
- PicturePtr source;
- int x, y;
- glamor_glyph_cache_t *cache;
-
- if (glyphs_dst_mode != GLYPHS_DST_MODE_MASK_TO_DST)
- priv = glamor_glyph_get_private(glyph);
-
- if (PICT_FORMAT_BPP(format) == 1)
- format = PICT_a8;
-
- cache =
- &glamor_priv->glyphCaches[PICT_FORMAT_RGB(format) != 0];
-
- if (buffer->source
- && buffer->source != cache->picture
- && glyphs_flush) {
- (*glyphs_flush)(flush_arg);
- glyphs_flush = NULL;
- }
-
- if (buffer->count == GLYPH_BUFFER_SIZE
- && glyphs_flush) {
- (*glyphs_flush)(flush_arg);
- glyphs_flush = NULL;
- }
-
- if (priv && priv->cached) {
- rect = &buffer->rects[buffer->count++];
- rect->x_src = priv->x + dx;
- rect->y_src = priv->y + dy;
- if (buffer->source == NULL)
- buffer->source = priv->cache->picture;
- if (glyphs_dst_mode <= GLYPHS_DST_MODE_VIA_MASK_CACHE)
- assert(priv->cache->glyphs[priv->pos] == glyph);
- } else {
- assert(glyphs_dst_mode != GLYPHS_DST_MODE_MASK_TO_DST);
- if (glyphs_flush)
- (*glyphs_flush)(flush_arg);
- source = glamor_glyph_cache(glamor_priv, glyph, &x, &y);
-
- if (source != NULL) {
- rect = &buffer->rects[buffer->count++];
- rect->x_src = x + dx;
- rect->y_src = y + dy;
- if (buffer->source == NULL)
- buffer->source = source;
- if (glyphs_dst_mode == GLYPHS_DST_MODE_VIA_MASK_CACHE) {
- glamor_gl_dispatch *dispatch;
- /* mode 1 means we are using global mask cache,
- * thus we have to composite from the cache picture
- * to the cache picture, we need a flush here to make
- * sure latter we get the corret glyphs data.*/
- dispatch = glamor_get_dispatch(glamor_priv);
- dispatch->glFlush();
- glamor_put_dispatch(glamor_priv);
- }
- } else {
- /* Couldn't find the glyph in the cache, use the glyph picture directly */
- source = GlyphPicture(glyph)[screen->myNum];
- if (buffer->source
- && buffer->source != source
- && glyphs_flush)
- (*glyphs_flush)(flush_arg);
- buffer->source = source;
-
- rect = &buffer->rects[buffer->count++];
- rect->x_src = 0 + dx;
- rect->y_src = 0 + dy;
- }
- priv = glamor_glyph_get_private(glyph);
- }
-
- rect->x_dst = x_glyph;
- rect->y_dst = y_glyph;
- if (glyphs_dst_mode != GLYPHS_DST_MODE_MASK_TO_DST) {
- rect->x_dst -= glyph->info.x;
- rect->y_dst -= glyph->info.y;
- }
- rect->width = w;
- rect->height = h;
- if (glyphs_dst_mode > GLYPHS_DST_MODE_VIA_MASK_CACHE) {
- rect->x_mask = rect->x_src;
- rect->y_mask = rect->y_src;
- rect->x_src = dst_arg.x_src + rect->x_dst - dst_arg.x_dst;
- rect->y_src = dst_arg.y_src + rect->y_dst - dst_arg.y_dst;
- }
-
- return GLAMOR_GLYPH_SUCCESS;
+ ScreenPtr screen = glamor_priv->screen;
+ glamor_composite_rect_t *rect;
+ PicturePtr source;
+ int x, y;
+ glamor_glyph_cache_t *cache;
+
+ if (glyphs_dst_mode != GLYPHS_DST_MODE_MASK_TO_DST)
+ priv = glamor_glyph_get_private(glyph);
+
+ if (PICT_FORMAT_BPP(format) == 1)
+ format = PICT_a8;
+
+ cache = &glamor_priv->glyphCaches[PICT_FORMAT_RGB(format) != 0];
+
+ if (buffer->source && buffer->source != cache->picture && glyphs_flush) {
+ (*glyphs_flush) (flush_arg);
+ glyphs_flush = NULL;
+ }
+
+ if (buffer->count == GLYPH_BUFFER_SIZE && glyphs_flush) {
+ (*glyphs_flush) (flush_arg);
+ glyphs_flush = NULL;
+ }
+
+ if (priv && priv->cached) {
+ rect = &buffer->rects[buffer->count++];
+ rect->x_src = priv->x + dx;
+ rect->y_src = priv->y + dy;
+ if (buffer->source == NULL)
+ buffer->source = priv->cache->picture;
+ if (glyphs_dst_mode <= GLYPHS_DST_MODE_VIA_MASK_CACHE)
+ assert(priv->cache->glyphs[priv->pos] == glyph);
+ }
+ else {
+ assert(glyphs_dst_mode != GLYPHS_DST_MODE_MASK_TO_DST);
+ if (glyphs_flush)
+ (*glyphs_flush) (flush_arg);
+ source = glamor_glyph_cache(glamor_priv, glyph, &x, &y);
+
+ if (source != NULL) {
+ rect = &buffer->rects[buffer->count++];
+ rect->x_src = x + dx;
+ rect->y_src = y + dy;
+ if (buffer->source == NULL)
+ buffer->source = source;
+ if (glyphs_dst_mode == GLYPHS_DST_MODE_VIA_MASK_CACHE) {
+ glamor_gl_dispatch *dispatch;
+
+ /* mode 1 means we are using global mask cache,
+ * thus we have to composite from the cache picture
+ * to the cache picture, we need a flush here to make
+ * sure latter we get the corret glyphs data.*/
+ dispatch = glamor_get_dispatch(glamor_priv);
+ dispatch->glFlush();
+ glamor_put_dispatch(glamor_priv);
+ }
+ }
+ else {
+ /* Couldn't find the glyph in the cache, use the glyph picture directly */
+ source = GlyphPicture(glyph)[screen->myNum];
+ if (buffer->source && buffer->source != source && glyphs_flush)
+ (*glyphs_flush) (flush_arg);
+ buffer->source = source;
+
+ rect = &buffer->rects[buffer->count++];
+ rect->x_src = 0 + dx;
+ rect->y_src = 0 + dy;
+ }
+ priv = glamor_glyph_get_private(glyph);
+ }
+
+ rect->x_dst = x_glyph;
+ rect->y_dst = y_glyph;
+ if (glyphs_dst_mode != GLYPHS_DST_MODE_MASK_TO_DST) {
+ rect->x_dst -= glyph->info.x;
+ rect->y_dst -= glyph->info.y;
+ }
+ rect->width = w;
+ rect->height = h;
+ if (glyphs_dst_mode > GLYPHS_DST_MODE_VIA_MASK_CACHE) {
+ rect->x_mask = rect->x_src;
+ rect->y_mask = rect->y_src;
+ rect->x_src = dst_arg.x_src + rect->x_dst - dst_arg.x_dst;
+ rect->y_src = dst_arg.y_src + rect->y_dst - dst_arg.y_dst;
+ }
+
+ return GLAMOR_GLYPH_SUCCESS;
}
-
static void
glamor_buffer_glyph_clip(glamor_screen_private *glamor_priv,
- BoxPtr rects,
- int nrect, PictFormatShort format,
- GlyphPtr glyph, struct glamor_glyph *priv,
- int glyph_x, int glyph_y,
- int glyph_dx, int glyph_dy,
- int width, int height,
- int glyphs_mode,
- glyphs_flush_func flush_func,
- void *arg
- )
+ BoxPtr rects,
+ int nrect, PictFormatShort format,
+ GlyphPtr glyph, struct glamor_glyph *priv,
+ int glyph_x, int glyph_y,
+ int glyph_dx, int glyph_dy,
+ int width, int height,
+ int glyphs_mode,
+ glyphs_flush_func flush_func, void *arg)
{
- int i;
- for (i = 0; i < nrect; i++) {
- int dst_x, dst_y;
- int dx, dy;
- int x2, y2;
-
- dst_x = glyph_x - glyph_dx;
- dst_y = glyph_y - glyph_dy;
- x2 = dst_x + width;
- y2 = dst_y + height;
- dx = dy = 0;
- if (rects[i].y1 >= y2)
- break;
-
- if (dst_x < rects[i].x1)
- dx = rects[i].x1 - dst_x, dst_x = rects[i].x1;
- if (x2 > rects[i].x2)
- x2 = rects[i].x2;
- if (dst_y < rects[i].y1)
- dy = rects[i].y1 - dst_y, dst_y = rects[i].y1;
- if (y2 > rects[i].y2)
- y2 = rects[i].y2;
- if (dst_x < x2 && dst_y < y2) {
-
- glamor_buffer_glyph(glamor_priv,
- &dst_buffer,
- format,
- glyph, priv,
- dst_x + glyph_dx,
- dst_y + glyph_dy,
- dx, dy,
- x2 - dst_x, y2 - dst_y,
- glyphs_mode,
- flush_func,
- arg);
- }
- }
+ int i;
+
+ for (i = 0; i < nrect; i++) {
+ int dst_x, dst_y;
+ int dx, dy;
+ int x2, y2;
+
+ dst_x = glyph_x - glyph_dx;
+ dst_y = glyph_y - glyph_dy;
+ x2 = dst_x + width;
+ y2 = dst_y + height;
+ dx = dy = 0;
+ if (rects[i].y1 >= y2)
+ break;
+
+ if (dst_x < rects[i].x1)
+ dx = rects[i].x1 - dst_x, dst_x = rects[i].x1;
+ if (x2 > rects[i].x2)
+ x2 = rects[i].x2;
+ if (dst_y < rects[i].y1)
+ dy = rects[i].y1 - dst_y, dst_y = rects[i].y1;
+ if (y2 > rects[i].y2)
+ y2 = rects[i].y2;
+ if (dst_x < x2 && dst_y < y2) {
+
+ glamor_buffer_glyph(glamor_priv,
+ &dst_buffer,
+ format,
+ glyph, priv,
+ dst_x + glyph_dx,
+ dst_y + glyph_dy,
+ dx, dy,
+ x2 - dst_x, y2 - dst_y,
+ glyphs_mode, flush_func, arg);
+ }
+ }
}
-
static void
glamor_glyphs_via_mask(CARD8 op,
- PicturePtr src,
- PicturePtr dst,
- PictFormatPtr mask_format,
- INT16 x_src,
- INT16 y_src,
- int nlist, GlyphListPtr list, GlyphPtr * glyphs,
- Bool use_mask_cache)
+ PicturePtr src,
+ PicturePtr dst,
+ PictFormatPtr mask_format,
+ INT16 x_src,
+ INT16 y_src,
+ int nlist, GlyphListPtr list, GlyphPtr *glyphs,
+ Bool use_mask_cache)
{
- PixmapPtr mask_pixmap = 0;
- PicturePtr mask;
- ScreenPtr screen = dst->pDrawable->pScreen;
- int width = 0, height = 0;
- int x, y;
- int x_dst = list->xOff, y_dst = list->yOff;
- int n;
- GlyphPtr glyph;
- int error;
- BoxRec extents = { 0, 0, 0, 0 };
- XID component_alpha;
- glamor_screen_private *glamor_priv;
- int need_free_mask = FALSE;
- glamor_glyph_buffer_t buffer;
- struct glyphs_flush_mask_arg arg;
- glamor_glyph_buffer_t *pmask_buffer;
- struct glyphs_flush_mask_arg *pmask_arg;
- struct glamor_glyph_mask_cache_entry *mce = NULL;
- struct glamor_glyph_mask_cache *maskcache;
- glamor_glyph_cache_t *cache;
- int glyphs_dst_mode;
-
- glamor_glyph_extents(nlist, list, glyphs, &extents);
-
- if (extents.x2 <= extents.x1 || extents.y2 <= extents.y1)
- return;
- glamor_priv = glamor_get_screen_private(screen);
- width = extents.x2 - extents.x1;
- height = extents.y2 - extents.y1;
-
- if (mask_format->depth == 1) {
- PictFormatPtr a8Format =
- PictureMatchFormat(screen, 8, PICT_a8);
-
- if (a8Format)
- mask_format = a8Format;
- }
-
- cache = &glamor_priv->glyphCaches
- [PICT_FORMAT_RGB(mask_format->format) != 0];
- maskcache = mask_cache[PICT_FORMAT_RGB(mask_format->format) != 0];
-
- x = -extents.x1;
- y = -extents.y1;
- if (!use_mask_cache
- || width > (CACHE_PICTURE_SIZE/4)
- || height > MASK_CACHE_MAX_SIZE) {
-new_mask_pixmap:
- mask_pixmap = glamor_create_pixmap(screen, width, height,
- mask_format->depth,
- CREATE_PIXMAP_USAGE_SCRATCH);
- if (!mask_pixmap) {
- glamor_destroy_pixmap(mask_pixmap);
- return;
- }
- glamor_solid(mask_pixmap, 0, 0, width, height, GXcopy, 0xFFFFFFFF, 0);
- component_alpha = NeedsComponent(mask_format->format);
- mask = CreatePicture(0, &mask_pixmap->drawable,
- mask_format, CPComponentAlpha,
- &component_alpha, serverClient, &error);
- if (!mask)
- return;
- need_free_mask = TRUE;
- pmask_arg = &arg;
- pmask_buffer = &buffer;
- pmask_buffer->count = 0;
- pmask_buffer->source = NULL;
- pmask_arg->used_bitmap = 0;
- glyphs_dst_mode = GLYPHS_DST_MODE_VIA_MASK;
- } else {
- int retry_cnt = 0;
-retry:
- mce = get_mask_cache(maskcache,
- (width + MASK_CACHE_MAX_SIZE - 1) / MASK_CACHE_MAX_SIZE);
-
- if (mce == NULL) {
- glamor_glyphs_flush_dst(&dst_arg);
- retry_cnt++;
- if (retry_cnt > 2) {
- assert(0);
- goto new_mask_pixmap;
- }
- goto retry;
- }
-
- mask = cache->picture;
- x += mce->x;
- y += mce->y;
- mce->width = (width + MASK_CACHE_MAX_SIZE - 1) / MASK_CACHE_MAX_SIZE;
- mce->height = 1;
- if (mask_arg.mask && mask_arg.mask != mask
- && mask_buffer.count != 0)
- glamor_glyphs_flush_dst(&dst_arg);
- pmask_arg = &mask_arg;
- pmask_buffer = &mask_buffer;
- pmask_arg->maskcache = maskcache;
- glyphs_dst_mode = GLYPHS_DST_MODE_VIA_MASK_CACHE;
- }
- pmask_arg->mask = mask;
- pmask_arg->buffer = pmask_buffer;
- while (nlist--) {
- x += list->xOff;
- y += list->yOff;
- n = list->len;
- mask_glyphs_cnt += n;
- while (n--) {
- glyph = *glyphs++;
- if (glyph->info.width > 0
- && glyph->info.height > 0) {
- glyphs_flush_func flush_func;
- void *temp_arg;
- if (need_free_mask) {
- if (pmask_buffer->count)
- flush_func = (glyphs_flush_func)glamor_glyphs_flush_mask;
- else
- flush_func = NULL;
- temp_arg = pmask_arg;
- } else {
- /* If we are using global mask cache, then we need to
- * flush dst instead of mask. As some dst depends on the
- * previous mask result. Just flush mask can't get all previous's
- * overlapped glyphs.*/
- if (dst_buffer.count || mask_buffer.count)
- flush_func = (glyphs_flush_func)glamor_glyphs_flush_dst;
- else
- flush_func = NULL;
- temp_arg = &dst_arg;
- }
- glamor_buffer_glyph(glamor_priv, pmask_buffer,
- mask_format->format,
- glyph, NULL, x, y,
- 0, 0,
- glyph->info.width, glyph->info.height,
- glyphs_dst_mode,
- flush_func,
- (void*)temp_arg);
- }
- x += glyph->info.xOff;
- y += glyph->info.yOff;
- }
- list++;
- }
-
- x = extents.x1;
- y = extents.y1;
- if (need_free_mask) {
- glamor_glyphs_flush_mask(pmask_arg);
- CompositePicture(op,
- src,
- mask,
- dst,
- x_src + x - x_dst,
- y_src + y - y_dst, 0, 0, x, y, width, height);
- FreePicture(mask, 0);
- glamor_destroy_pixmap(mask_pixmap);
- } else {
- struct glamor_glyph priv;
- glyphs_flush_func flush_func;
- BoxPtr rects;
- int nrect;
-
- priv.cache = cache;
- priv.x = mce->x;
- priv.y = mce->y;
- priv.cached = TRUE;
- rects = REGION_RECTS(dst->pCompositeClip);
- nrect = REGION_NUM_RECTS(dst->pCompositeClip);
-
- pmask_arg->used_bitmap |= ((1 << mce->width) - 1) << mce->idx;
- dst_arg.op = op;
- dst_arg.src = src;
- dst_arg.dst = dst;
- dst_arg.buffer = &dst_buffer;
- dst_arg.x_src = x_src;
- dst_arg.y_src = y_src;
- dst_arg.x_dst = x_dst;
- dst_arg.y_dst = y_dst;
-
- if (dst_buffer.source == NULL) {
- dst_buffer.source = cache->picture;
- } else if (dst_buffer.source != cache->picture) {
- glamor_glyphs_flush_dst(&dst_arg);
- dst_buffer.source = cache->picture;
- }
-
- x += dst->pDrawable->x;
- y += dst->pDrawable->y;
-
- if (dst_buffer.count || mask_buffer.count)
- flush_func = (glyphs_flush_func)glamor_glyphs_flush_dst;
- else
- flush_func = NULL;
-
- glamor_buffer_glyph_clip(glamor_priv,
- rects, nrect,
- mask_format->format,
- NULL, &priv,
- x, y,
- 0, 0,
- width, height,
- GLYPHS_DST_MODE_MASK_TO_DST,
- flush_func,
- (void *)&dst_arg
- );
- }
+ PixmapPtr mask_pixmap = 0;
+ PicturePtr mask;
+ ScreenPtr screen = dst->pDrawable->pScreen;
+ int width = 0, height = 0;
+ int x, y;
+ int x_dst = list->xOff, y_dst = list->yOff;
+ int n;
+ GlyphPtr glyph;
+ int error;
+ BoxRec extents = { 0, 0, 0, 0 };
+ XID component_alpha;
+ glamor_screen_private *glamor_priv;
+ int need_free_mask = FALSE;
+ glamor_glyph_buffer_t buffer;
+ struct glyphs_flush_mask_arg arg;
+ glamor_glyph_buffer_t *pmask_buffer;
+ struct glyphs_flush_mask_arg *pmask_arg;
+ struct glamor_glyph_mask_cache_entry *mce = NULL;
+ struct glamor_glyph_mask_cache *maskcache;
+ glamor_glyph_cache_t *cache;
+ int glyphs_dst_mode;
+
+ glamor_glyph_extents(nlist, list, glyphs, &extents);
+
+ if (extents.x2 <= extents.x1 || extents.y2 <= extents.y1)
+ return;
+ glamor_priv = glamor_get_screen_private(screen);
+ width = extents.x2 - extents.x1;
+ height = extents.y2 - extents.y1;
+
+ if (mask_format->depth == 1) {
+ PictFormatPtr a8Format = PictureMatchFormat(screen, 8, PICT_a8);
+
+ if (a8Format)
+ mask_format = a8Format;
+ }
+
+ cache = &glamor_priv->glyphCaches
+ [PICT_FORMAT_RGB(mask_format->format) != 0];
+ maskcache = mask_cache[PICT_FORMAT_RGB(mask_format->format) != 0];
+
+ x = -extents.x1;
+ y = -extents.y1;
+ if (!use_mask_cache || width > (CACHE_PICTURE_SIZE / 4)
+ || height > MASK_CACHE_MAX_SIZE) {
+ new_mask_pixmap:
+ mask_pixmap = glamor_create_pixmap(screen, width, height,
+ mask_format->depth,
+ CREATE_PIXMAP_USAGE_SCRATCH);
+ if (!mask_pixmap) {
+ glamor_destroy_pixmap(mask_pixmap);
+ return;
+ }
+ glamor_solid(mask_pixmap, 0, 0, width, height, GXcopy, 0xFFFFFFFF, 0);
+ component_alpha = NeedsComponent(mask_format->format);
+ mask = CreatePicture(0, &mask_pixmap->drawable,
+ mask_format, CPComponentAlpha,
+ &component_alpha, serverClient, &error);
+ if (!mask)
+ return;
+ need_free_mask = TRUE;
+ pmask_arg = &arg;
+ pmask_buffer = &buffer;
+ pmask_buffer->count = 0;
+ pmask_buffer->source = NULL;
+ pmask_arg->used_bitmap = 0;
+ glyphs_dst_mode = GLYPHS_DST_MODE_VIA_MASK;
+ }
+ else {
+ int retry_cnt = 0;
+
+ retry:
+ mce = get_mask_cache(maskcache,
+ (width + MASK_CACHE_MAX_SIZE -
+ 1) / MASK_CACHE_MAX_SIZE);
+
+ if (mce == NULL) {
+ glamor_glyphs_flush_dst(&dst_arg);
+ retry_cnt++;
+ if (retry_cnt > 2) {
+ assert(0);
+ goto new_mask_pixmap;
+ }
+ goto retry;
+ }
+
+ mask = cache->picture;
+ x += mce->x;
+ y += mce->y;
+ mce->width = (width + MASK_CACHE_MAX_SIZE - 1) / MASK_CACHE_MAX_SIZE;
+ mce->height = 1;
+ if (mask_arg.mask && mask_arg.mask != mask && mask_buffer.count != 0)
+ glamor_glyphs_flush_dst(&dst_arg);
+ pmask_arg = &mask_arg;
+ pmask_buffer = &mask_buffer;
+ pmask_arg->maskcache = maskcache;
+ glyphs_dst_mode = GLYPHS_DST_MODE_VIA_MASK_CACHE;
+ }
+ pmask_arg->mask = mask;
+ pmask_arg->buffer = pmask_buffer;
+ while (nlist--) {
+ x += list->xOff;
+ y += list->yOff;
+ n = list->len;
+ mask_glyphs_cnt += n;
+ while (n--) {
+ glyph = *glyphs++;
+ if (glyph->info.width > 0 && glyph->info.height > 0) {
+ glyphs_flush_func flush_func;
+ void *temp_arg;
+
+ if (need_free_mask) {
+ if (pmask_buffer->count)
+ flush_func =
+ (glyphs_flush_func) glamor_glyphs_flush_mask;
+ else
+ flush_func = NULL;
+ temp_arg = pmask_arg;
+ }
+ else {
+ /* If we are using global mask cache, then we need to
+ * flush dst instead of mask. As some dst depends on the
+ * previous mask result. Just flush mask can't get all previous's
+ * overlapped glyphs.*/
+ if (dst_buffer.count || mask_buffer.count)
+ flush_func =
+ (glyphs_flush_func) glamor_glyphs_flush_dst;
+ else
+ flush_func = NULL;
+ temp_arg = &dst_arg;
+ }
+ glamor_buffer_glyph(glamor_priv, pmask_buffer,
+ mask_format->format,
+ glyph, NULL, x, y,
+ 0, 0,
+ glyph->info.width, glyph->info.height,
+ glyphs_dst_mode,
+ flush_func, (void *) temp_arg);
+ }
+ x += glyph->info.xOff;
+ y += glyph->info.yOff;
+ }
+ list++;
+ }
+
+ x = extents.x1;
+ y = extents.y1;
+ if (need_free_mask) {
+ glamor_glyphs_flush_mask(pmask_arg);
+ CompositePicture(op,
+ src,
+ mask,
+ dst,
+ x_src + x - x_dst,
+ y_src + y - y_dst, 0, 0, x, y, width, height);
+ FreePicture(mask, 0);
+ glamor_destroy_pixmap(mask_pixmap);
+ }
+ else {
+ struct glamor_glyph priv;
+ glyphs_flush_func flush_func;
+ BoxPtr rects;
+ int nrect;
+
+ priv.cache = cache;
+ priv.x = mce->x;
+ priv.y = mce->y;
+ priv.cached = TRUE;
+ rects = REGION_RECTS(dst->pCompositeClip);
+ nrect = REGION_NUM_RECTS(dst->pCompositeClip);
+
+ pmask_arg->used_bitmap |= ((1 << mce->width) - 1) << mce->idx;
+ dst_arg.op = op;
+ dst_arg.src = src;
+ dst_arg.dst = dst;
+ dst_arg.buffer = &dst_buffer;
+ dst_arg.x_src = x_src;
+ dst_arg.y_src = y_src;
+ dst_arg.x_dst = x_dst;
+ dst_arg.y_dst = y_dst;
+
+ if (dst_buffer.source == NULL) {
+ dst_buffer.source = cache->picture;
+ }
+ else if (dst_buffer.source != cache->picture) {
+ glamor_glyphs_flush_dst(&dst_arg);
+ dst_buffer.source = cache->picture;
+ }
+
+ x += dst->pDrawable->x;
+ y += dst->pDrawable->y;
+
+ if (dst_buffer.count || mask_buffer.count)
+ flush_func = (glyphs_flush_func) glamor_glyphs_flush_dst;
+ else
+ flush_func = NULL;
+
+ glamor_buffer_glyph_clip(glamor_priv,
+ rects, nrect,
+ mask_format->format,
+ NULL, &priv,
+ x, y,
+ 0, 0,
+ width, height,
+ GLYPHS_DST_MODE_MASK_TO_DST,
+ flush_func, (void *) &dst_arg);
+ }
}
static void
glamor_glyphs_to_dst(CARD8 op,
- PicturePtr src,
- PicturePtr dst,
- INT16 x_src,
- INT16 y_src,
- int nlist, GlyphListPtr list,
- GlyphPtr * glyphs)
+ PicturePtr src,
+ PicturePtr dst,
+ INT16 x_src,
+ INT16 y_src,
+ int nlist, GlyphListPtr list, GlyphPtr *glyphs)
{
- ScreenPtr screen = dst->pDrawable->pScreen;
- int x = 0, y = 0;
- int x_dst = list->xOff, y_dst = list->yOff;
- int n;
- GlyphPtr glyph;
- BoxPtr rects;
- int nrect;
- glamor_screen_private *glamor_priv;
-
- rects = REGION_RECTS(dst->pCompositeClip);
- nrect = REGION_NUM_RECTS(dst->pCompositeClip);
-
- glamor_priv = glamor_get_screen_private(screen);
-
- dst_arg.op = op;
- dst_arg.src = src;
- dst_arg.dst = dst;
- dst_arg.buffer = &dst_buffer;
- dst_arg.x_src = x_src;
- dst_arg.y_src = y_src;
- dst_arg.x_dst = x_dst;
- dst_arg.y_dst = y_dst;
-
- x = dst->pDrawable->x;
- y = dst->pDrawable->y;
-
- while (nlist--) {
- x += list->xOff;
- y += list->yOff;
- n = list->len;
- dst_glyphs_cnt += n;
- while (n--) {
- glyph = *glyphs++;
-
- if (glyph->info.width > 0
- && glyph->info.height > 0) {
- glyphs_flush_func flush_func;
-
- if (dst_buffer.count || mask_buffer.count)
- flush_func = (glyphs_flush_func)glamor_glyphs_flush_dst;
- else
- flush_func = NULL;
- glamor_buffer_glyph_clip(glamor_priv,
- rects, nrect,
- (GlyphPicture(glyph)[screen->myNum])->format,
- glyph, NULL,
- x, y,
- glyph->info.x, glyph->info.y,
- glyph->info.width, glyph->info.height,
- GLYPHS_DST_MODE_TO_DST,
- flush_func,
- (void *)&dst_arg
- );
- }
-
- x += glyph->info.xOff;
- y += glyph->info.yOff;
- }
- list++;
- }
+ ScreenPtr screen = dst->pDrawable->pScreen;
+ int x = 0, y = 0;
+ int x_dst = list->xOff, y_dst = list->yOff;
+ int n;
+ GlyphPtr glyph;
+ BoxPtr rects;
+ int nrect;
+ glamor_screen_private *glamor_priv;
+
+ rects = REGION_RECTS(dst->pCompositeClip);
+ nrect = REGION_NUM_RECTS(dst->pCompositeClip);
+
+ glamor_priv = glamor_get_screen_private(screen);
+
+ dst_arg.op = op;
+ dst_arg.src = src;
+ dst_arg.dst = dst;
+ dst_arg.buffer = &dst_buffer;
+ dst_arg.x_src = x_src;
+ dst_arg.y_src = y_src;
+ dst_arg.x_dst = x_dst;
+ dst_arg.y_dst = y_dst;
+
+ x = dst->pDrawable->x;
+ y = dst->pDrawable->y;
+
+ while (nlist--) {
+ x += list->xOff;
+ y += list->yOff;
+ n = list->len;
+ dst_glyphs_cnt += n;
+ while (n--) {
+ glyph = *glyphs++;
+
+ if (glyph->info.width > 0 && glyph->info.height > 0) {
+ glyphs_flush_func flush_func;
+
+ if (dst_buffer.count || mask_buffer.count)
+ flush_func = (glyphs_flush_func) glamor_glyphs_flush_dst;
+ else
+ flush_func = NULL;
+ glamor_buffer_glyph_clip(glamor_priv,
+ rects, nrect,
+ (GlyphPicture(glyph)[screen->myNum])->
+ format, glyph, NULL, x, y,
+ glyph->info.x, glyph->info.y,
+ glyph->info.width, glyph->info.height,
+ GLYPHS_DST_MODE_TO_DST, flush_func,
+ (void *) &dst_arg);
+ }
+
+ x += glyph->info.xOff;
+ y += glyph->info.yOff;
+ }
+ list++;
+ }
}
+
#define MAX_FIXED_SIZE
static void
glamor_glyphs_reset_buffer(glamor_glyph_buffer_t *buffer)
{
- buffer->count = 0;
- buffer->source = NULL;
+ buffer->count = 0;
+ buffer->source = NULL;
}
static Bool
_glamor_glyphs(CARD8 op,
- PicturePtr src,
- PicturePtr dst,
- PictFormatPtr mask_format,
- INT16 x_src,
- INT16 y_src, int nlist, GlyphListPtr list,
- GlyphPtr * glyphs, Bool fallback)
+ PicturePtr src,
+ PicturePtr dst,
+ PictFormatPtr mask_format,
+ INT16 x_src,
+ INT16 y_src, int nlist, GlyphListPtr list,
+ GlyphPtr *glyphs, Bool fallback)
{
- PictFormatShort format;
- int fixed_size, fixed_cnt = 0;
- struct glamor_glyph_list *fixed_list = NULL;
- Bool need_free_list = FALSE;
+ PictFormatShort format;
+ int fixed_size, fixed_cnt = 0;
+ struct glamor_glyph_list *fixed_list = NULL;
+ Bool need_free_list = FALSE;
+
#ifndef GLYPHS_NO_EDEGEMAP_OVERLAP_CHECK
- Bool check_fake_overlap = TRUE;
- if (!(op == PictOpOver
- || op == PictOpAdd
- || op == PictOpXor)) {
- /* C = (0,0,0,0) D = glyphs , SRC = A, DEST = B (faked overlapped glyphs, overlapped with (0,0,0,0)).
- * For those op, (A IN (C ADD D)) OP B != (A IN D) OP ((A IN C) OP B)
- * or (A IN (D ADD C)) OP B != (A IN C) OP ((A IN D) OP B)
- * We need to split the faked regions to three or two, and composite the disoverlapped small
- * boxes one by one. For other Ops, it's safe to composite the whole box. */
- check_fake_overlap = FALSE;
- }
+ Bool check_fake_overlap = TRUE;
+
+ if (!(op == PictOpOver || op == PictOpAdd || op == PictOpXor)) {
+ /* C = (0,0,0,0) D = glyphs , SRC = A, DEST = B (faked overlapped glyphs, overlapped with (0,0,0,0)).
+ * For those op, (A IN (C ADD D)) OP B != (A IN D) OP ((A IN C) OP B)
+ * or (A IN (D ADD C)) OP B != (A IN C) OP ((A IN D) OP B)
+ * We need to split the faked regions to three or two, and composite the disoverlapped small
+ * boxes one by one. For other Ops, it's safe to composite the whole box. */
+ check_fake_overlap = FALSE;
+ }
#else
- Bool check_fake_overlap = FALSE;
+ Bool check_fake_overlap = FALSE;
#endif
- if (mask_format)
- format = mask_format->depth << 24 | mask_format->format;
- else
- format = 0;
-
- fixed_size = 32;
- glamor_glyphs_reset_buffer(&dst_buffer);
-
- if (!mask_format || (((nlist == 1 && list->len == 1) || op == PictOpAdd)
- && (dst->format == ((mask_format->depth << 24) | mask_format->format)))) {
- glamor_glyphs_to_dst(op, src, dst, x_src, y_src, nlist,
- list, glyphs);
- goto last_flush;
- }
-
- glamor_glyphs_reset_buffer(&mask_buffer);
-
- /* We have mask_format. Need to check the real overlap or not.*/
- format = mask_format->depth << 24 | mask_format->format;
-
- fixed_list = calloc(fixed_size, sizeof(*fixed_list));
- if (unlikely(fixed_list == NULL))
- fixed_size = 0;
- fixed_cnt = glamor_glyphs_intersect(nlist, list, glyphs,
- format, dst->pDrawable->pScreen,
- check_fake_overlap,
- fixed_list, fixed_size);
- if (fixed_cnt == 0)
- mask_format = NULL;
- need_free_list = TRUE;
-
- if (fixed_cnt <= 0) {
- if (mask_format == NULL) {
- glamor_glyphs_to_dst(op, src, dst, x_src, y_src, nlist,
- list, glyphs);
- goto last_flush;
- } else {
- glamor_glyphs_via_mask(op, src, dst, mask_format,
- x_src, y_src, nlist, list, glyphs,
- FALSE);
- goto free_fixed_list;
- }
- } else {
-
- /* We have splitted the original list to serval list, some are overlapped
- * and some are non-overlapped. For the non-overlapped, we render it to
- * dst directly. For the overlapped, we render it to mask picture firstly,
- * then render the mask to dst. If we can use mask cache which is in the
- * glyphs cache's last row, we can accumulate the rendering of mask to dst
- * with the other dst_buffer's rendering operations thus can reduce the call
- * of glDrawElements.
- *
- * */
- struct glamor_glyph_list *saved_list;
-
- saved_list = fixed_list;
- mask_arg.used_bitmap = 0;
- while(fixed_cnt--) {
- if (fixed_list->type == NON_INTERSECTED) {
- glamor_glyphs_to_dst(op, src, dst,
- x_src, y_src,
- fixed_list->nlist,
- fixed_list->list,
- fixed_list->glyphs);
- }
- else
- glamor_glyphs_via_mask(op, src, dst,
- mask_format, x_src, y_src,
- fixed_list->nlist,
- fixed_list->list,
- fixed_list->glyphs, TRUE);
-
- free(fixed_list->list);
- fixed_list++;
- }
- free(saved_list);
- need_free_list = FALSE;
- }
-
-last_flush:
- if (dst_buffer.count || mask_buffer.count)
- glamor_glyphs_flush_dst(&dst_arg);
-free_fixed_list:
- if(need_free_list) {
- assert(fixed_cnt <= 0);
- free(fixed_list);
- }
- return TRUE;
+ if (mask_format)
+ format = mask_format->depth << 24 | mask_format->format;
+ else
+ format = 0;
+
+ fixed_size = 32;
+ glamor_glyphs_reset_buffer(&dst_buffer);
+
+ if (!mask_format || (((nlist == 1 && list->len == 1) || op == PictOpAdd)
+ && (dst->format ==
+ ((mask_format->depth << 24) | mask_format->
+ format)))) {
+ glamor_glyphs_to_dst(op, src, dst, x_src, y_src, nlist, list, glyphs);
+ goto last_flush;
+ }
+
+ glamor_glyphs_reset_buffer(&mask_buffer);
+
+ /* We have mask_format. Need to check the real overlap or not. */
+ format = mask_format->depth << 24 | mask_format->format;
+
+ fixed_list = calloc(fixed_size, sizeof(*fixed_list));
+ if (_X_UNLIKELY(fixed_list == NULL))
+ fixed_size = 0;
+ fixed_cnt = glamor_glyphs_intersect(nlist, list, glyphs,
+ format, dst->pDrawable->pScreen,
+ check_fake_overlap,
+ fixed_list, fixed_size);
+ if (fixed_cnt == 0)
+ mask_format = NULL;
+ need_free_list = TRUE;
+
+ if (fixed_cnt <= 0) {
+ if (mask_format == NULL) {
+ glamor_glyphs_to_dst(op, src, dst, x_src, y_src, nlist,
+ list, glyphs);
+ goto last_flush;
+ }
+ else {
+ glamor_glyphs_via_mask(op, src, dst, mask_format,
+ x_src, y_src, nlist, list, glyphs, FALSE);
+ goto free_fixed_list;
+ }
+ }
+ else {
+
+ /* We have splitted the original list to serval list, some are overlapped
+ * and some are non-overlapped. For the non-overlapped, we render it to
+ * dst directly. For the overlapped, we render it to mask picture firstly,
+ * then render the mask to dst. If we can use mask cache which is in the
+ * glyphs cache's last row, we can accumulate the rendering of mask to dst
+ * with the other dst_buffer's rendering operations thus can reduce the call
+ * of glDrawElements.
+ *
+ * */
+ struct glamor_glyph_list *saved_list;
+
+ saved_list = fixed_list;
+ mask_arg.used_bitmap = 0;
+ while (fixed_cnt--) {
+ if (fixed_list->type == NON_INTERSECTED) {
+ glamor_glyphs_to_dst(op, src, dst,
+ x_src, y_src,
+ fixed_list->nlist,
+ fixed_list->list, fixed_list->glyphs);
+ }
+ else
+ glamor_glyphs_via_mask(op, src, dst,
+ mask_format, x_src, y_src,
+ fixed_list->nlist,
+ fixed_list->list,
+ fixed_list->glyphs, TRUE);
+
+ free(fixed_list->list);
+ fixed_list++;
+ }
+ free(saved_list);
+ need_free_list = FALSE;
+ }
+
+ last_flush:
+ if (dst_buffer.count || mask_buffer.count)
+ glamor_glyphs_flush_dst(&dst_arg);
+ free_fixed_list:
+ if (need_free_list) {
+ assert(fixed_cnt <= 0);
+ free(fixed_list);
+ }
+ return TRUE;
}
void
glamor_glyphs(CARD8 op,
- PicturePtr src,
- PicturePtr dst,
- PictFormatPtr mask_format,
- INT16 x_src,
- INT16 y_src, int nlist, GlyphListPtr list, GlyphPtr * glyphs)
+ PicturePtr src,
+ PicturePtr dst,
+ PictFormatPtr mask_format,
+ INT16 x_src,
+ INT16 y_src, int nlist, GlyphListPtr list, GlyphPtr *glyphs)
{
- _glamor_glyphs(op, src, dst, mask_format, x_src,
- y_src, nlist, list, glyphs, TRUE);
+ _glamor_glyphs(op, src, dst, mask_format, x_src,
+ y_src, nlist, list, glyphs, TRUE);
}
Bool
glamor_glyphs_nf(CARD8 op,
- PicturePtr src,
- PicturePtr dst,
- PictFormatPtr mask_format,
- INT16 x_src,
- INT16 y_src, int nlist,
- GlyphListPtr list, GlyphPtr * glyphs)
+ PicturePtr src,
+ PicturePtr dst,
+ PictFormatPtr mask_format,
+ INT16 x_src,
+ INT16 y_src, int nlist, GlyphListPtr list, GlyphPtr *glyphs)
{
- return _glamor_glyphs(op, src, dst, mask_format, x_src,
- y_src, nlist, list, glyphs, FALSE);
+ return _glamor_glyphs(op, src, dst, mask_format, x_src,
+ y_src, nlist, list, glyphs, FALSE);
}
-
diff --git a/xorg-server/glamor/glamor_gradient.c b/xorg-server/glamor/glamor_gradient.c
index 4abc82d74..df2ccb8a0 100644
--- a/xorg-server/glamor/glamor_gradient.c
+++ b/xorg-server/glamor/glamor_gradient.c
@@ -43,15 +43,16 @@
#ifdef GLAMOR_GRADIENT_SHADER
static GLint
-_glamor_create_getcolor_fs_program(ScreenPtr screen, int stops_count, int use_array)
+_glamor_create_getcolor_fs_program(ScreenPtr screen, int stops_count,
+ int use_array)
{
- glamor_screen_private *glamor_priv;
- glamor_gl_dispatch *dispatch;
+ glamor_screen_private *glamor_priv;
+ glamor_gl_dispatch *dispatch;
- char *gradient_fs = NULL;
- GLint fs_getcolor_prog;
+ char *gradient_fs = NULL;
+ GLint fs_getcolor_prog;
- #define gradient_fs_getcolor\
+#define gradient_fs_getcolor\
GLAMOR_DEFAULT_PRECISION\
"uniform int n_stop;\n"\
"uniform float stops[%d];\n"\
@@ -82,163 +83,166 @@ _glamor_create_getcolor_fs_program(ScreenPtr screen, int stops_count, int use_ar
" return gradient_color;\n"\
"}\n"
- /* Because the array access for shader is very slow, the performance is very low
- if use array. So use global uniform to replace for it if the number of n_stops is small.*/
- const char *gradient_fs_getcolor_no_array =
- GLAMOR_DEFAULT_PRECISION
- "uniform int n_stop;\n"
- "uniform float stop0;\n"
- "uniform float stop1;\n"
- "uniform float stop2;\n"
- "uniform float stop3;\n"
- "uniform float stop4;\n"
- "uniform float stop5;\n"
- "uniform float stop6;\n"
- "uniform float stop7;\n"
- "uniform vec4 stop_color0;\n"
- "uniform vec4 stop_color1;\n"
- "uniform vec4 stop_color2;\n"
- "uniform vec4 stop_color3;\n"
- "uniform vec4 stop_color4;\n"
- "uniform vec4 stop_color5;\n"
- "uniform vec4 stop_color6;\n"
- "uniform vec4 stop_color7;\n"
- "\n"
- "vec4 get_color(float stop_len)\n"
- "{\n"
- " float stop_after;\n"
- " float stop_before;\n"
- " vec4 stop_color_before;\n"
- " vec4 stop_color_after;\n"
- " float new_alpha; \n"
- " vec4 gradient_color;\n"
- " float percentage; \n"
- " \n"
- " if((stop_len < stop0) && (n_stop >= 1)) {\n"
- " stop_color_before = stop_color0;\n"
- " stop_color_after = stop_color0;\n"
- " stop_after = stop0;\n"
- " stop_before = stop0;\n"
- " } else if((stop_len < stop1) && (n_stop >= 2)) {\n"
- " stop_color_before = stop_color0;\n"
- " stop_color_after = stop_color1;\n"
- " stop_after = stop1;\n"
- " stop_before = stop0;\n"
- " } else if((stop_len < stop2) && (n_stop >= 3)) {\n"
- " stop_color_before = stop_color1;\n"
- " stop_color_after = stop_color2;\n"
- " stop_after = stop2;\n"
- " stop_before = stop1;\n"
- " } else if((stop_len < stop3) && (n_stop >= 4)){\n"
- " stop_color_before = stop_color2;\n"
- " stop_color_after = stop_color3;\n"
- " stop_after = stop3;\n"
- " stop_before = stop2;\n"
- " } else if((stop_len < stop4) && (n_stop >= 5)){\n"
- " stop_color_before = stop_color3;\n"
- " stop_color_after = stop_color4;\n"
- " stop_after = stop4;\n"
- " stop_before = stop3;\n"
- " } else if((stop_len < stop5) && (n_stop >= 6)){\n"
- " stop_color_before = stop_color4;\n"
- " stop_color_after = stop_color5;\n"
- " stop_after = stop5;\n"
- " stop_before = stop4;\n"
- " } else if((stop_len < stop6) && (n_stop >= 7)){\n"
- " stop_color_before = stop_color5;\n"
- " stop_color_after = stop_color6;\n"
- " stop_after = stop6;\n"
- " stop_before = stop5;\n"
- " } else if((stop_len < stop7) && (n_stop >= 8)){\n"
- " stop_color_before = stop_color6;\n"
- " stop_color_after = stop_color7;\n"
- " stop_after = stop7;\n"
- " stop_before = stop6;\n"
- " } else {\n"
- " stop_color_before = stop_color7;\n"
- " stop_color_after = stop_color7;\n"
- " stop_after = stop7;\n"
- " stop_before = stop7;\n"
- " }\n"
- " if(stop_after - stop_before > 2.0)\n"
- " percentage = 0.0;\n"//For comply with pixman, walker->stepper overflow.
- " else if(stop_after - stop_before < 0.000001)\n"
- " percentage = 0.0;\n"
- " else \n"
- " percentage = (stop_len - stop_before)/(stop_after - stop_before);\n"
- " new_alpha = percentage * stop_color_after.a + \n"
- " (1.0-percentage) * stop_color_before.a; \n"
- " gradient_color = vec4((percentage * stop_color_after.rgb \n"
- " + (1.0-percentage) * stop_color_before.rgb)*new_alpha, \n"
- " new_alpha);\n"
- " \n"
- " return gradient_color;\n"
- "}\n";
-
- glamor_priv = glamor_get_screen_private(screen);
- dispatch = glamor_get_dispatch(glamor_priv);
-
- if(use_array) {
- XNFasprintf(&gradient_fs,
- gradient_fs_getcolor, stops_count, stops_count);
- fs_getcolor_prog = glamor_compile_glsl_prog(dispatch, GL_FRAGMENT_SHADER,
- gradient_fs);
- free(gradient_fs);
- } else {
- fs_getcolor_prog = glamor_compile_glsl_prog(dispatch, GL_FRAGMENT_SHADER,
- gradient_fs_getcolor_no_array);
- }
-
- return fs_getcolor_prog;
+ /* Because the array access for shader is very slow, the performance is very low
+ if use array. So use global uniform to replace for it if the number of n_stops is small. */
+ const char *gradient_fs_getcolor_no_array =
+ GLAMOR_DEFAULT_PRECISION
+ "uniform int n_stop;\n"
+ "uniform float stop0;\n"
+ "uniform float stop1;\n"
+ "uniform float stop2;\n"
+ "uniform float stop3;\n"
+ "uniform float stop4;\n"
+ "uniform float stop5;\n"
+ "uniform float stop6;\n"
+ "uniform float stop7;\n"
+ "uniform vec4 stop_color0;\n"
+ "uniform vec4 stop_color1;\n"
+ "uniform vec4 stop_color2;\n"
+ "uniform vec4 stop_color3;\n"
+ "uniform vec4 stop_color4;\n"
+ "uniform vec4 stop_color5;\n"
+ "uniform vec4 stop_color6;\n"
+ "uniform vec4 stop_color7;\n"
+ "\n"
+ "vec4 get_color(float stop_len)\n"
+ "{\n"
+ " float stop_after;\n"
+ " float stop_before;\n"
+ " vec4 stop_color_before;\n"
+ " vec4 stop_color_after;\n"
+ " float new_alpha; \n"
+ " vec4 gradient_color;\n"
+ " float percentage; \n"
+ " \n"
+ " if((stop_len < stop0) && (n_stop >= 1)) {\n"
+ " stop_color_before = stop_color0;\n"
+ " stop_color_after = stop_color0;\n"
+ " stop_after = stop0;\n"
+ " stop_before = stop0;\n"
+ " } else if((stop_len < stop1) && (n_stop >= 2)) {\n"
+ " stop_color_before = stop_color0;\n"
+ " stop_color_after = stop_color1;\n"
+ " stop_after = stop1;\n"
+ " stop_before = stop0;\n"
+ " } else if((stop_len < stop2) && (n_stop >= 3)) {\n"
+ " stop_color_before = stop_color1;\n"
+ " stop_color_after = stop_color2;\n"
+ " stop_after = stop2;\n"
+ " stop_before = stop1;\n"
+ " } else if((stop_len < stop3) && (n_stop >= 4)){\n"
+ " stop_color_before = stop_color2;\n"
+ " stop_color_after = stop_color3;\n"
+ " stop_after = stop3;\n"
+ " stop_before = stop2;\n"
+ " } else if((stop_len < stop4) && (n_stop >= 5)){\n"
+ " stop_color_before = stop_color3;\n"
+ " stop_color_after = stop_color4;\n"
+ " stop_after = stop4;\n"
+ " stop_before = stop3;\n"
+ " } else if((stop_len < stop5) && (n_stop >= 6)){\n"
+ " stop_color_before = stop_color4;\n"
+ " stop_color_after = stop_color5;\n"
+ " stop_after = stop5;\n"
+ " stop_before = stop4;\n"
+ " } else if((stop_len < stop6) && (n_stop >= 7)){\n"
+ " stop_color_before = stop_color5;\n"
+ " stop_color_after = stop_color6;\n"
+ " stop_after = stop6;\n"
+ " stop_before = stop5;\n"
+ " } else if((stop_len < stop7) && (n_stop >= 8)){\n"
+ " stop_color_before = stop_color6;\n"
+ " stop_color_after = stop_color7;\n"
+ " stop_after = stop7;\n"
+ " stop_before = stop6;\n"
+ " } else {\n"
+ " stop_color_before = stop_color7;\n"
+ " stop_color_after = stop_color7;\n"
+ " stop_after = stop7;\n"
+ " stop_before = stop7;\n"
+ " }\n"
+ " if(stop_after - stop_before > 2.0)\n"
+ " percentage = 0.0;\n" //For comply with pixman, walker->stepper overflow.
+ " else if(stop_after - stop_before < 0.000001)\n"
+ " percentage = 0.0;\n"
+ " else \n"
+ " percentage = (stop_len - stop_before)/(stop_after - stop_before);\n"
+ " new_alpha = percentage * stop_color_after.a + \n"
+ " (1.0-percentage) * stop_color_before.a; \n"
+ " gradient_color = vec4((percentage * stop_color_after.rgb \n"
+ " + (1.0-percentage) * stop_color_before.rgb)*new_alpha, \n"
+ " new_alpha);\n"
+ " \n"
+ " return gradient_color;\n"
+ "}\n";
+
+ glamor_priv = glamor_get_screen_private(screen);
+ dispatch = glamor_get_dispatch(glamor_priv);
+
+ if (use_array) {
+ XNFasprintf(&gradient_fs,
+ gradient_fs_getcolor, stops_count, stops_count);
+ fs_getcolor_prog =
+ glamor_compile_glsl_prog(dispatch, GL_FRAGMENT_SHADER, gradient_fs);
+ free(gradient_fs);
+ }
+ else {
+ fs_getcolor_prog =
+ glamor_compile_glsl_prog(dispatch, GL_FRAGMENT_SHADER,
+ gradient_fs_getcolor_no_array);
+ }
+
+ return fs_getcolor_prog;
}
static void
-_glamor_create_radial_gradient_program(ScreenPtr screen, int stops_count, int dyn_gen)
+_glamor_create_radial_gradient_program(ScreenPtr screen, int stops_count,
+ int dyn_gen)
{
- glamor_screen_private *glamor_priv;
- glamor_gl_dispatch *dispatch;
- int index;
-
- GLint gradient_prog = 0;
- char *gradient_fs = NULL;
- GLint fs_main_prog, fs_getcolor_prog, vs_prog;
-
- const char *gradient_vs =
- GLAMOR_DEFAULT_PRECISION
- "attribute vec4 v_position;\n"
- "attribute vec4 v_texcoord;\n"
- "varying vec2 source_texture;\n"
- "\n"
- "void main()\n"
- "{\n"
- " gl_Position = v_position;\n"
- " source_texture = v_texcoord.xy;\n"
- "}\n";
-
- /*
- * Refer to pixman radial gradient.
- *
- * The problem is given the two circles of c1 and c2 with the radius of r1 and
- * r1, we need to caculate the t, which is used to do interpolate with stops,
- * using the fomula:
- * length((1-t)*c1 + t*c2 - p) = (1-t)*r1 + t*r2
- * expand the fomula with xy coond, get the following:
- * sqrt(sqr((1-t)*c1.x + t*c2.x - p.x) + sqr((1-t)*c1.y + t*c2.y - p.y))
- * = (1-t)r1 + t*r2
- * <====> At*t- 2Bt + C = 0
- * where A = sqr(c2.x - c1.x) + sqr(c2.y - c1.y) - sqr(r2 -r1)
- * B = (p.x - c1.x)*(c2.x - c1.x) + (p.y - c1.y)*(c2.y - c1.y) + r1*(r2 -r1)
- * C = sqr(p.x - c1.x) + sqr(p.y - c1.y) - r1*r1
- *
- * solve the fomula and we get the result of
- * t = (B + sqrt(B*B - A*C)) / A or
- * t = (B - sqrt(B*B - A*C)) / A (quadratic equation have two solutions)
- *
- * The solution we are going to prefer is the bigger one, unless the
- * radius associated to it is negative (or it falls outside the valid t range)
- */
-
- #define gradient_radial_fs_template\
+ glamor_screen_private *glamor_priv;
+ glamor_gl_dispatch *dispatch;
+ int index;
+
+ GLint gradient_prog = 0;
+ char *gradient_fs = NULL;
+ GLint fs_main_prog, fs_getcolor_prog, vs_prog;
+
+ const char *gradient_vs =
+ GLAMOR_DEFAULT_PRECISION
+ "attribute vec4 v_position;\n"
+ "attribute vec4 v_texcoord;\n"
+ "varying vec2 source_texture;\n"
+ "\n"
+ "void main()\n"
+ "{\n"
+ " gl_Position = v_position;\n"
+ " source_texture = v_texcoord.xy;\n"
+ "}\n";
+
+ /*
+ * Refer to pixman radial gradient.
+ *
+ * The problem is given the two circles of c1 and c2 with the radius of r1 and
+ * r1, we need to caculate the t, which is used to do interpolate with stops,
+ * using the fomula:
+ * length((1-t)*c1 + t*c2 - p) = (1-t)*r1 + t*r2
+ * expand the fomula with xy coond, get the following:
+ * sqrt(sqr((1-t)*c1.x + t*c2.x - p.x) + sqr((1-t)*c1.y + t*c2.y - p.y))
+ * = (1-t)r1 + t*r2
+ * <====> At*t- 2Bt + C = 0
+ * where A = sqr(c2.x - c1.x) + sqr(c2.y - c1.y) - sqr(r2 -r1)
+ * B = (p.x - c1.x)*(c2.x - c1.x) + (p.y - c1.y)*(c2.y - c1.y) + r1*(r2 -r1)
+ * C = sqr(p.x - c1.x) + sqr(p.y - c1.y) - r1*r1
+ *
+ * solve the fomula and we get the result of
+ * t = (B + sqrt(B*B - A*C)) / A or
+ * t = (B - sqrt(B*B - A*C)) / A (quadratic equation have two solutions)
+ *
+ * The solution we are going to prefer is the bigger one, unless the
+ * radius associated to it is negative (or it falls outside the valid t range)
+ */
+
+#define gradient_radial_fs_template\
GLAMOR_DEFAULT_PRECISION\
"uniform mat3 transform_mat;\n"\
"uniform int repeat_type;\n"\
@@ -344,149 +348,165 @@ _glamor_create_radial_gradient_program(ScreenPtr screen, int stops_count, int dy
" }\n"\
"}\n"
- glamor_priv = glamor_get_screen_private(screen);
-
- if ((glamor_priv->radial_max_nstops >= stops_count) && (dyn_gen)) {
- /* Very Good, not to generate again. */
- return;
- }
-
- dispatch = glamor_get_dispatch(glamor_priv);
-
- if (dyn_gen && glamor_priv->gradient_prog[SHADER_GRADIENT_RADIAL][2]) {
- dispatch->glDeleteShader(
- glamor_priv->radial_gradient_shaders[SHADER_GRADIENT_VS_PROG][2]);
- glamor_priv->radial_gradient_shaders[SHADER_GRADIENT_VS_PROG][2] = 0;
-
- dispatch->glDeleteShader(
- glamor_priv->radial_gradient_shaders[SHADER_GRADIENT_FS_MAIN_PROG][2]);
- glamor_priv->radial_gradient_shaders[SHADER_GRADIENT_FS_MAIN_PROG][2] = 0;
-
- dispatch->glDeleteShader(
- glamor_priv->radial_gradient_shaders[SHADER_GRADIENT_FS_GETCOLOR_PROG][2]);
- glamor_priv->radial_gradient_shaders[SHADER_GRADIENT_FS_GETCOLOR_PROG][2] = 0;
-
- dispatch->glDeleteProgram(glamor_priv->gradient_prog[SHADER_GRADIENT_RADIAL][2]);
- glamor_priv->gradient_prog[SHADER_GRADIENT_RADIAL][2] = 0;
- }
-
- gradient_prog = dispatch->glCreateProgram();
-
- vs_prog = glamor_compile_glsl_prog(dispatch,
- GL_VERTEX_SHADER, gradient_vs);
-
- XNFasprintf(&gradient_fs,
- gradient_radial_fs_template,
- PIXMAN_REPEAT_NONE, PIXMAN_REPEAT_NORMAL, PIXMAN_REPEAT_REFLECT);
-
- fs_main_prog = glamor_compile_glsl_prog(dispatch,
- GL_FRAGMENT_SHADER, gradient_fs);
-
- free(gradient_fs);
-
- fs_getcolor_prog =
- _glamor_create_getcolor_fs_program(screen, stops_count, (stops_count > 0));
-
- dispatch->glAttachShader(gradient_prog, vs_prog);
- dispatch->glAttachShader(gradient_prog, fs_getcolor_prog);
- dispatch->glAttachShader(gradient_prog, fs_main_prog);
-
- dispatch->glBindAttribLocation(gradient_prog, GLAMOR_VERTEX_POS, "v_positionsition");
- dispatch->glBindAttribLocation(gradient_prog, GLAMOR_VERTEX_SOURCE, "v_texcoord");
-
- glamor_link_glsl_prog(dispatch, gradient_prog);
-
- dispatch->glUseProgram(0);
-
- if (dyn_gen) {
- index = 2;
- glamor_priv->radial_max_nstops = stops_count;
- } else if (stops_count) {
- index = 1;
- } else {
- index = 0;
- }
-
- glamor_priv->gradient_prog[SHADER_GRADIENT_RADIAL][index] = gradient_prog;
- glamor_priv->radial_gradient_shaders[SHADER_GRADIENT_VS_PROG][index] = vs_prog;
- glamor_priv->radial_gradient_shaders[SHADER_GRADIENT_FS_MAIN_PROG][index] = fs_main_prog;
- glamor_priv->radial_gradient_shaders[SHADER_GRADIENT_FS_GETCOLOR_PROG][index] = fs_getcolor_prog;
-
- glamor_put_dispatch(glamor_priv);
+ glamor_priv = glamor_get_screen_private(screen);
+
+ if ((glamor_priv->radial_max_nstops >= stops_count) && (dyn_gen)) {
+ /* Very Good, not to generate again. */
+ return;
+ }
+
+ dispatch = glamor_get_dispatch(glamor_priv);
+
+ if (dyn_gen && glamor_priv->gradient_prog[SHADER_GRADIENT_RADIAL][2]) {
+ dispatch->glDeleteShader(glamor_priv->
+ radial_gradient_shaders
+ [SHADER_GRADIENT_VS_PROG][2]);
+ glamor_priv->radial_gradient_shaders[SHADER_GRADIENT_VS_PROG][2] = 0;
+
+ dispatch->glDeleteShader(glamor_priv->
+ radial_gradient_shaders
+ [SHADER_GRADIENT_FS_MAIN_PROG][2]);
+ glamor_priv->radial_gradient_shaders[SHADER_GRADIENT_FS_MAIN_PROG][2] =
+ 0;
+
+ dispatch->glDeleteShader(glamor_priv->
+ radial_gradient_shaders
+ [SHADER_GRADIENT_FS_GETCOLOR_PROG][2]);
+ glamor_priv->
+ radial_gradient_shaders[SHADER_GRADIENT_FS_GETCOLOR_PROG][2] = 0;
+
+ dispatch->glDeleteProgram(glamor_priv->
+ gradient_prog[SHADER_GRADIENT_RADIAL][2]);
+ glamor_priv->gradient_prog[SHADER_GRADIENT_RADIAL][2] = 0;
+ }
+
+ gradient_prog = dispatch->glCreateProgram();
+
+ vs_prog = glamor_compile_glsl_prog(dispatch, GL_VERTEX_SHADER, gradient_vs);
+
+ XNFasprintf(&gradient_fs,
+ gradient_radial_fs_template,
+ PIXMAN_REPEAT_NONE, PIXMAN_REPEAT_NORMAL,
+ PIXMAN_REPEAT_REFLECT);
+
+ fs_main_prog = glamor_compile_glsl_prog(dispatch,
+ GL_FRAGMENT_SHADER, gradient_fs);
+
+ free(gradient_fs);
+
+ fs_getcolor_prog =
+ _glamor_create_getcolor_fs_program(screen, stops_count,
+ (stops_count > 0));
+
+ dispatch->glAttachShader(gradient_prog, vs_prog);
+ dispatch->glAttachShader(gradient_prog, fs_getcolor_prog);
+ dispatch->glAttachShader(gradient_prog, fs_main_prog);
+
+ dispatch->glBindAttribLocation(gradient_prog, GLAMOR_VERTEX_POS,
+ "v_positionsition");
+ dispatch->glBindAttribLocation(gradient_prog, GLAMOR_VERTEX_SOURCE,
+ "v_texcoord");
+
+ glamor_link_glsl_prog(dispatch, gradient_prog);
+
+ dispatch->glUseProgram(0);
+
+ if (dyn_gen) {
+ index = 2;
+ glamor_priv->radial_max_nstops = stops_count;
+ }
+ else if (stops_count) {
+ index = 1;
+ }
+ else {
+ index = 0;
+ }
+
+ glamor_priv->gradient_prog[SHADER_GRADIENT_RADIAL][index] = gradient_prog;
+ glamor_priv->radial_gradient_shaders[SHADER_GRADIENT_VS_PROG][index] =
+ vs_prog;
+ glamor_priv->radial_gradient_shaders[SHADER_GRADIENT_FS_MAIN_PROG][index] =
+ fs_main_prog;
+ glamor_priv->
+ radial_gradient_shaders[SHADER_GRADIENT_FS_GETCOLOR_PROG][index] =
+ fs_getcolor_prog;
+
+ glamor_put_dispatch(glamor_priv);
}
static void
-_glamor_create_linear_gradient_program(ScreenPtr screen, int stops_count, int dyn_gen)
+_glamor_create_linear_gradient_program(ScreenPtr screen, int stops_count,
+ int dyn_gen)
{
- glamor_screen_private *glamor_priv;
- glamor_gl_dispatch *dispatch;
-
- int index = 0;
- GLint gradient_prog = 0;
- char *gradient_fs = NULL;
- GLint fs_main_prog, fs_getcolor_prog, vs_prog;
-
- const char *gradient_vs =
- GLAMOR_DEFAULT_PRECISION
- "attribute vec4 v_position;\n"
- "attribute vec4 v_texcoord;\n"
- "varying vec2 source_texture;\n"
- "\n"
- "void main()\n"
- "{\n"
- " gl_Position = v_position;\n"
- " source_texture = v_texcoord.xy;\n"
- "}\n";
-
- /*
- * |
- * |\
- * | \
- * | \
- * | \
- * |\ \
- * | \ \
- * cos_val = |\ p1d \ /
- * sqrt(1/(slope*slope+1.0)) ------>\ \ \ /
- * | \ \ \
- * | \ \ / \
- * | \ *Pt1\
- * *p1 | \ \ *P
- * \ | / \ \ /
- * \ | / \ \ /
- * \ | pd \
- * \ | \ / \
- * p2* | \ / \ /
- * slope = (p2.y - p1.y) / | / p2d /
- * (p2.x - p1.x) | / \ /
- * | / \ /
- * | / /
- * | / /
- * | / *Pt2
- * | /
- * | /
- * | /
- * | /
- * | /
- * -------+---------------------------------
- * O|
- * |
- * |
- *
- * step 1: compute the distance of p, pt1 and pt2 in the slope direction.
- * Caculate the distance on Y axis first and multiply cos_val to
- * get the value on slope direction(pd, p1d and p2d represent the
- * distance of p, pt1, and pt2 respectively).
- *
- * step 2: caculate the percentage of (pd - p1d)/(p2d - p1d).
- * If (pd - p1d) > (p2d - p1d) or < 0, then sub or add (p2d - p1d)
- * to make it in the range of [0, (p2d - p1d)].
- *
- * step 3: compare the percentage to every stop and find the stpos just
- * before and after it. Use the interpolation fomula to compute RGBA.
- */
-
- #define gradient_fs_template \
+ glamor_screen_private *glamor_priv;
+ glamor_gl_dispatch *dispatch;
+
+ int index = 0;
+ GLint gradient_prog = 0;
+ char *gradient_fs = NULL;
+ GLint fs_main_prog, fs_getcolor_prog, vs_prog;
+
+ const char *gradient_vs =
+ GLAMOR_DEFAULT_PRECISION
+ "attribute vec4 v_position;\n"
+ "attribute vec4 v_texcoord;\n"
+ "varying vec2 source_texture;\n"
+ "\n"
+ "void main()\n"
+ "{\n"
+ " gl_Position = v_position;\n"
+ " source_texture = v_texcoord.xy;\n"
+ "}\n";
+
+ /*
+ * |
+ * |\
+ * | \
+ * | \
+ * | \
+ * |\ \
+ * | \ \
+ * cos_val = |\ p1d \ /
+ * sqrt(1/(slope*slope+1.0)) ------>\ \ \ /
+ * | \ \ \
+ * | \ \ / \
+ * | \ *Pt1\
+ * *p1 | \ \ *P
+ * \ | / \ \ /
+ * \ | / \ \ /
+ * \ | pd \
+ * \ | \ / \
+ * p2* | \ / \ /
+ * slope = (p2.y - p1.y) / | / p2d /
+ * (p2.x - p1.x) | / \ /
+ * | / \ /
+ * | / /
+ * | / /
+ * | / *Pt2
+ * | /
+ * | /
+ * | /
+ * | /
+ * | /
+ * -------+---------------------------------
+ * O|
+ * |
+ * |
+ *
+ * step 1: compute the distance of p, pt1 and pt2 in the slope direction.
+ * Caculate the distance on Y axis first and multiply cos_val to
+ * get the value on slope direction(pd, p1d and p2d represent the
+ * distance of p, pt1, and pt2 respectively).
+ *
+ * step 2: caculate the percentage of (pd - p1d)/(p2d - p1d).
+ * If (pd - p1d) > (p2d - p1d) or < 0, then sub or add (p2d - p1d)
+ * to make it in the range of [0, (p2d - p1d)].
+ *
+ * step 3: compare the percentage to every stop and find the stpos just
+ * before and after it. Use the interpolation fomula to compute RGBA.
+ */
+
+#define gradient_fs_template \
GLAMOR_DEFAULT_PRECISION\
"uniform mat3 transform_mat;\n"\
"uniform int repeat_type;\n"\
@@ -569,209 +589,238 @@ _glamor_create_linear_gradient_program(ScreenPtr screen, int stops_count, int dy
" gl_FragColor = get_color(stop_len);\n"\
"}\n"
- glamor_priv = glamor_get_screen_private(screen);
-
- if ((glamor_priv->linear_max_nstops >= stops_count) && (dyn_gen)) {
- /* Very Good, not to generate again. */
- return;
- }
-
- dispatch = glamor_get_dispatch(glamor_priv);
- if (dyn_gen && glamor_priv->gradient_prog[SHADER_GRADIENT_LINEAR][2]) {
- dispatch->glDeleteShader(
- glamor_priv->linear_gradient_shaders[SHADER_GRADIENT_VS_PROG][2]);
- glamor_priv->linear_gradient_shaders[SHADER_GRADIENT_VS_PROG][2] = 0;
-
- dispatch->glDeleteShader(
- glamor_priv->linear_gradient_shaders[SHADER_GRADIENT_FS_MAIN_PROG][2]);
- glamor_priv->linear_gradient_shaders[SHADER_GRADIENT_FS_MAIN_PROG][2] = 0;
-
- dispatch->glDeleteShader(
- glamor_priv->linear_gradient_shaders[SHADER_GRADIENT_FS_GETCOLOR_PROG][2]);
- glamor_priv->linear_gradient_shaders[SHADER_GRADIENT_FS_GETCOLOR_PROG][2] = 0;
-
- dispatch->glDeleteProgram(glamor_priv->gradient_prog[SHADER_GRADIENT_LINEAR][2]);
- glamor_priv->gradient_prog[SHADER_GRADIENT_LINEAR][2] = 0;
- }
-
- gradient_prog = dispatch->glCreateProgram();
-
- vs_prog = glamor_compile_glsl_prog(dispatch,
- GL_VERTEX_SHADER, gradient_vs);
-
- XNFasprintf(&gradient_fs,
- gradient_fs_template,
- PIXMAN_REPEAT_NORMAL, PIXMAN_REPEAT_REFLECT);
-
- fs_main_prog = glamor_compile_glsl_prog(dispatch,
- GL_FRAGMENT_SHADER, gradient_fs);
- free(gradient_fs);
-
- fs_getcolor_prog =
- _glamor_create_getcolor_fs_program(screen, stops_count, (stops_count > 0));
-
- dispatch->glAttachShader(gradient_prog, vs_prog);
- dispatch->glAttachShader(gradient_prog, fs_getcolor_prog);
- dispatch->glAttachShader(gradient_prog, fs_main_prog);
-
- dispatch->glBindAttribLocation(gradient_prog, GLAMOR_VERTEX_POS, "v_position");
- dispatch->glBindAttribLocation(gradient_prog, GLAMOR_VERTEX_SOURCE, "v_texcoord");
-
- glamor_link_glsl_prog(dispatch, gradient_prog);
-
- dispatch->glUseProgram(0);
-
- if (dyn_gen) {
- index = 2;
- glamor_priv->linear_max_nstops = stops_count;
- } else if (stops_count) {
- index = 1;
- } else {
- index = 0;
- }
-
- glamor_priv->gradient_prog[SHADER_GRADIENT_LINEAR][index] = gradient_prog;
- glamor_priv->linear_gradient_shaders[SHADER_GRADIENT_VS_PROG][index] = vs_prog;
- glamor_priv->linear_gradient_shaders[SHADER_GRADIENT_FS_MAIN_PROG][index] = fs_main_prog;
- glamor_priv->linear_gradient_shaders[SHADER_GRADIENT_FS_GETCOLOR_PROG][index] = fs_getcolor_prog;
-
- glamor_put_dispatch(glamor_priv);
+ glamor_priv = glamor_get_screen_private(screen);
+
+ if ((glamor_priv->linear_max_nstops >= stops_count) && (dyn_gen)) {
+ /* Very Good, not to generate again. */
+ return;
+ }
+
+ dispatch = glamor_get_dispatch(glamor_priv);
+ if (dyn_gen && glamor_priv->gradient_prog[SHADER_GRADIENT_LINEAR][2]) {
+ dispatch->glDeleteShader(glamor_priv->
+ linear_gradient_shaders
+ [SHADER_GRADIENT_VS_PROG][2]);
+ glamor_priv->linear_gradient_shaders[SHADER_GRADIENT_VS_PROG][2] = 0;
+
+ dispatch->glDeleteShader(glamor_priv->
+ linear_gradient_shaders
+ [SHADER_GRADIENT_FS_MAIN_PROG][2]);
+ glamor_priv->linear_gradient_shaders[SHADER_GRADIENT_FS_MAIN_PROG][2] =
+ 0;
+
+ dispatch->glDeleteShader(glamor_priv->
+ linear_gradient_shaders
+ [SHADER_GRADIENT_FS_GETCOLOR_PROG][2]);
+ glamor_priv->
+ linear_gradient_shaders[SHADER_GRADIENT_FS_GETCOLOR_PROG][2] = 0;
+
+ dispatch->glDeleteProgram(glamor_priv->
+ gradient_prog[SHADER_GRADIENT_LINEAR][2]);
+ glamor_priv->gradient_prog[SHADER_GRADIENT_LINEAR][2] = 0;
+ }
+
+ gradient_prog = dispatch->glCreateProgram();
+
+ vs_prog = glamor_compile_glsl_prog(dispatch, GL_VERTEX_SHADER, gradient_vs);
+
+ XNFasprintf(&gradient_fs,
+ gradient_fs_template,
+ PIXMAN_REPEAT_NORMAL, PIXMAN_REPEAT_REFLECT);
+
+ fs_main_prog = glamor_compile_glsl_prog(dispatch,
+ GL_FRAGMENT_SHADER, gradient_fs);
+ free(gradient_fs);
+
+ fs_getcolor_prog =
+ _glamor_create_getcolor_fs_program(screen, stops_count,
+ (stops_count > 0));
+
+ dispatch->glAttachShader(gradient_prog, vs_prog);
+ dispatch->glAttachShader(gradient_prog, fs_getcolor_prog);
+ dispatch->glAttachShader(gradient_prog, fs_main_prog);
+
+ dispatch->glBindAttribLocation(gradient_prog, GLAMOR_VERTEX_POS,
+ "v_position");
+ dispatch->glBindAttribLocation(gradient_prog, GLAMOR_VERTEX_SOURCE,
+ "v_texcoord");
+
+ glamor_link_glsl_prog(dispatch, gradient_prog);
+
+ dispatch->glUseProgram(0);
+
+ if (dyn_gen) {
+ index = 2;
+ glamor_priv->linear_max_nstops = stops_count;
+ }
+ else if (stops_count) {
+ index = 1;
+ }
+ else {
+ index = 0;
+ }
+
+ glamor_priv->gradient_prog[SHADER_GRADIENT_LINEAR][index] = gradient_prog;
+ glamor_priv->linear_gradient_shaders[SHADER_GRADIENT_VS_PROG][index] =
+ vs_prog;
+ glamor_priv->linear_gradient_shaders[SHADER_GRADIENT_FS_MAIN_PROG][index] =
+ fs_main_prog;
+ glamor_priv->
+ linear_gradient_shaders[SHADER_GRADIENT_FS_GETCOLOR_PROG][index] =
+ fs_getcolor_prog;
+
+ glamor_put_dispatch(glamor_priv);
}
void
glamor_init_gradient_shader(ScreenPtr screen)
{
- glamor_screen_private *glamor_priv;
- int i;
-
- glamor_priv = glamor_get_screen_private(screen);
-
- for (i = 0; i < 3; i++) {
- glamor_priv->gradient_prog[SHADER_GRADIENT_LINEAR][i] = 0;
- glamor_priv->linear_gradient_shaders[SHADER_GRADIENT_VS_PROG][i] = 0;
- glamor_priv->linear_gradient_shaders[SHADER_GRADIENT_FS_MAIN_PROG][i] = 0;
- glamor_priv->linear_gradient_shaders[SHADER_GRADIENT_FS_GETCOLOR_PROG][i] = 0;
-
- glamor_priv->gradient_prog[SHADER_GRADIENT_RADIAL][i] = 0;
- glamor_priv->radial_gradient_shaders[SHADER_GRADIENT_VS_PROG][i] = 0;
- glamor_priv->radial_gradient_shaders[SHADER_GRADIENT_FS_MAIN_PROG][i] = 0;
- glamor_priv->radial_gradient_shaders[SHADER_GRADIENT_FS_GETCOLOR_PROG][i] = 0;
- }
- glamor_priv->linear_max_nstops = 0;
- glamor_priv->radial_max_nstops = 0;
-
- _glamor_create_linear_gradient_program(screen, 0, 0);
- _glamor_create_linear_gradient_program(screen, LINEAR_LARGE_STOPS, 0);
-
- _glamor_create_radial_gradient_program(screen, 0, 0);
- _glamor_create_radial_gradient_program(screen, RADIAL_LARGE_STOPS, 0);
+ glamor_screen_private *glamor_priv;
+ int i;
+
+ glamor_priv = glamor_get_screen_private(screen);
+
+ for (i = 0; i < 3; i++) {
+ glamor_priv->gradient_prog[SHADER_GRADIENT_LINEAR][i] = 0;
+ glamor_priv->linear_gradient_shaders[SHADER_GRADIENT_VS_PROG][i] = 0;
+ glamor_priv->linear_gradient_shaders[SHADER_GRADIENT_FS_MAIN_PROG][i] =
+ 0;
+ glamor_priv->
+ linear_gradient_shaders[SHADER_GRADIENT_FS_GETCOLOR_PROG][i] = 0;
+
+ glamor_priv->gradient_prog[SHADER_GRADIENT_RADIAL][i] = 0;
+ glamor_priv->radial_gradient_shaders[SHADER_GRADIENT_VS_PROG][i] = 0;
+ glamor_priv->radial_gradient_shaders[SHADER_GRADIENT_FS_MAIN_PROG][i] =
+ 0;
+ glamor_priv->
+ radial_gradient_shaders[SHADER_GRADIENT_FS_GETCOLOR_PROG][i] = 0;
+ }
+ glamor_priv->linear_max_nstops = 0;
+ glamor_priv->radial_max_nstops = 0;
+
+ _glamor_create_linear_gradient_program(screen, 0, 0);
+ _glamor_create_linear_gradient_program(screen, LINEAR_LARGE_STOPS, 0);
+
+ _glamor_create_radial_gradient_program(screen, 0, 0);
+ _glamor_create_radial_gradient_program(screen, RADIAL_LARGE_STOPS, 0);
}
void
glamor_fini_gradient_shader(ScreenPtr screen)
{
- glamor_screen_private *glamor_priv;
- glamor_gl_dispatch *dispatch;
- int i = 0;
-
- glamor_priv = glamor_get_screen_private(screen);
- dispatch = glamor_get_dispatch(glamor_priv);
-
- for (i = 0; i < 3; i++) {
- /* Linear Gradient */
- if (glamor_priv->linear_gradient_shaders[SHADER_GRADIENT_VS_PROG][i])
- dispatch->glDeleteShader(
- glamor_priv->linear_gradient_shaders[SHADER_GRADIENT_VS_PROG][i]);
-
- if (glamor_priv->linear_gradient_shaders[SHADER_GRADIENT_FS_MAIN_PROG][i])
- dispatch->glDeleteShader(
- glamor_priv->linear_gradient_shaders[SHADER_GRADIENT_FS_MAIN_PROG][i]);
-
- if (glamor_priv->linear_gradient_shaders[SHADER_GRADIENT_FS_GETCOLOR_PROG][i])
- dispatch->glDeleteShader(
- glamor_priv->linear_gradient_shaders[SHADER_GRADIENT_FS_GETCOLOR_PROG][i]);
-
- if (glamor_priv->gradient_prog[SHADER_GRADIENT_LINEAR][i])
- dispatch->glDeleteProgram(glamor_priv->gradient_prog[SHADER_GRADIENT_LINEAR][i]);
-
- /* Radial Gradient */
- if (glamor_priv->radial_gradient_shaders[SHADER_GRADIENT_VS_PROG][i])
- dispatch->glDeleteShader(
- glamor_priv->radial_gradient_shaders[SHADER_GRADIENT_VS_PROG][i]);
-
- if (glamor_priv->radial_gradient_shaders[SHADER_GRADIENT_FS_MAIN_PROG][i])
- dispatch->glDeleteShader(
- glamor_priv->radial_gradient_shaders[SHADER_GRADIENT_FS_MAIN_PROG][i]);
-
- if (glamor_priv->radial_gradient_shaders[SHADER_GRADIENT_FS_GETCOLOR_PROG][i])
- dispatch->glDeleteShader(
- glamor_priv->radial_gradient_shaders[SHADER_GRADIENT_FS_GETCOLOR_PROG][i]);
-
- if (glamor_priv->gradient_prog[SHADER_GRADIENT_RADIAL][i])
- dispatch->glDeleteProgram(glamor_priv->gradient_prog[SHADER_GRADIENT_RADIAL][i]);
- }
-
- glamor_put_dispatch(glamor_priv);
+ glamor_screen_private *glamor_priv;
+ glamor_gl_dispatch *dispatch;
+ int i = 0;
+
+ glamor_priv = glamor_get_screen_private(screen);
+ dispatch = glamor_get_dispatch(glamor_priv);
+
+ for (i = 0; i < 3; i++) {
+ /* Linear Gradient */
+ if (glamor_priv->linear_gradient_shaders[SHADER_GRADIENT_VS_PROG][i])
+ dispatch->glDeleteShader(glamor_priv->
+ linear_gradient_shaders
+ [SHADER_GRADIENT_VS_PROG][i]);
+
+ if (glamor_priv->
+ linear_gradient_shaders[SHADER_GRADIENT_FS_MAIN_PROG][i])
+ dispatch->glDeleteShader(glamor_priv->
+ linear_gradient_shaders
+ [SHADER_GRADIENT_FS_MAIN_PROG][i]);
+
+ if (glamor_priv->
+ linear_gradient_shaders[SHADER_GRADIENT_FS_GETCOLOR_PROG][i])
+ dispatch->glDeleteShader(glamor_priv->
+ linear_gradient_shaders
+ [SHADER_GRADIENT_FS_GETCOLOR_PROG][i]);
+
+ if (glamor_priv->gradient_prog[SHADER_GRADIENT_LINEAR][i])
+ dispatch->glDeleteProgram(glamor_priv->
+ gradient_prog[SHADER_GRADIENT_LINEAR][i]);
+
+ /* Radial Gradient */
+ if (glamor_priv->radial_gradient_shaders[SHADER_GRADIENT_VS_PROG][i])
+ dispatch->glDeleteShader(glamor_priv->
+ radial_gradient_shaders
+ [SHADER_GRADIENT_VS_PROG][i]);
+
+ if (glamor_priv->
+ radial_gradient_shaders[SHADER_GRADIENT_FS_MAIN_PROG][i])
+ dispatch->glDeleteShader(glamor_priv->
+ radial_gradient_shaders
+ [SHADER_GRADIENT_FS_MAIN_PROG][i]);
+
+ if (glamor_priv->
+ radial_gradient_shaders[SHADER_GRADIENT_FS_GETCOLOR_PROG][i])
+ dispatch->glDeleteShader(glamor_priv->
+ radial_gradient_shaders
+ [SHADER_GRADIENT_FS_GETCOLOR_PROG][i]);
+
+ if (glamor_priv->gradient_prog[SHADER_GRADIENT_RADIAL][i])
+ dispatch->glDeleteProgram(glamor_priv->
+ gradient_prog[SHADER_GRADIENT_RADIAL][i]);
+ }
+
+ glamor_put_dispatch(glamor_priv);
}
static void
_glamor_gradient_convert_trans_matrix(PictTransform *from, float to[3][3],
- int width, int height, int normalize)
+ int width, int height, int normalize)
{
- /*
- * Because in the shader program, we normalize all the pixel cood to [0, 1],
- * so with the transform matrix, the correct logic should be:
- * v_s = A*T*v
- * v_s: point vector in shader after normalized.
- * A: The transition matrix from width X height --> 1.0 X 1.0
- * T: The transform matrix.
- * v: point vector in width X height space.
- *
- * result is OK if we use this fomula. But for every point in width X height space,
- * we can just use their normalized point vector in shader, namely we can just
- * use the result of A*v in shader. So we have no chance to insert T in A*v.
- * We can just convert v_s = A*T*v to v_s = A*T*inv(A)*A*v, where inv(A) is the
- * inverse matrix of A. Now, v_s = (A*T*inv(A)) * (A*v)
- * So, to get the correct v_s, we need to cacula1 the matrix: (A*T*inv(A)), and
- * we name this matrix T_s.
- *
- * Firstly, because A is for the scale convertion, we find
- * -- --
- * |1/w 0 0 |
- * A = | 0 1/h 0 |
- * | 0 0 1.0|
- * -- --
- * so T_s = A*T*inv(a) and result
- *
- * -- --
- * | t11 h*t12/w t13/w|
- * T_s = | w*t21/h t22 t23/h|
- * | w*t31 h*t32 t33 |
- * -- --
- */
-
- to[0][0] = (float)pixman_fixed_to_double(from->matrix[0][0]);
- to[0][1] = (float)pixman_fixed_to_double(from->matrix[0][1])
- * (normalize ? (((float)height) / ((float)width)) : 1.0);
- to[0][2] = (float)pixman_fixed_to_double(from->matrix[0][2])
- / (normalize ? ((float)width) : 1.0);
-
- to[1][0] = (float)pixman_fixed_to_double(from->matrix[1][0])
- * (normalize ? (((float)width) / ((float)height)) : 1.0);
- to[1][1] = (float)pixman_fixed_to_double(from->matrix[1][1]);
- to[1][2] = (float)pixman_fixed_to_double(from->matrix[1][2])
- / (normalize ? ((float)height) : 1.0);
-
- to[2][0] = (float)pixman_fixed_to_double(from->matrix[2][0])
- * (normalize ? ((float)width) : 1.0);
- to[2][1] = (float)pixman_fixed_to_double(from->matrix[2][1])
- * (normalize ? ((float)height) : 1.0);
- to[2][2] = (float)pixman_fixed_to_double(from->matrix[2][2]);
-
- DEBUGF("the transform matrix is:\n%f\t%f\t%f\n%f\t%f\t%f\n%f\t%f\t%f\n",
- to[0][0], to[0][1], to[0][2],
- to[1][0], to[1][1], to[1][2],
- to[2][0], to[2][1], to[2][2]);
+ /*
+ * Because in the shader program, we normalize all the pixel cood to [0, 1],
+ * so with the transform matrix, the correct logic should be:
+ * v_s = A*T*v
+ * v_s: point vector in shader after normalized.
+ * A: The transition matrix from width X height --> 1.0 X 1.0
+ * T: The transform matrix.
+ * v: point vector in width X height space.
+ *
+ * result is OK if we use this fomula. But for every point in width X height space,
+ * we can just use their normalized point vector in shader, namely we can just
+ * use the result of A*v in shader. So we have no chance to insert T in A*v.
+ * We can just convert v_s = A*T*v to v_s = A*T*inv(A)*A*v, where inv(A) is the
+ * inverse matrix of A. Now, v_s = (A*T*inv(A)) * (A*v)
+ * So, to get the correct v_s, we need to cacula1 the matrix: (A*T*inv(A)), and
+ * we name this matrix T_s.
+ *
+ * Firstly, because A is for the scale convertion, we find
+ * -- --
+ * |1/w 0 0 |
+ * A = | 0 1/h 0 |
+ * | 0 0 1.0|
+ * -- --
+ * so T_s = A*T*inv(a) and result
+ *
+ * -- --
+ * | t11 h*t12/w t13/w|
+ * T_s = | w*t21/h t22 t23/h|
+ * | w*t31 h*t32 t33 |
+ * -- --
+ */
+
+ to[0][0] = (float) pixman_fixed_to_double(from->matrix[0][0]);
+ to[0][1] = (float) pixman_fixed_to_double(from->matrix[0][1])
+ * (normalize ? (((float) height) / ((float) width)) : 1.0);
+ to[0][2] = (float) pixman_fixed_to_double(from->matrix[0][2])
+ / (normalize ? ((float) width) : 1.0);
+
+ to[1][0] = (float) pixman_fixed_to_double(from->matrix[1][0])
+ * (normalize ? (((float) width) / ((float) height)) : 1.0);
+ to[1][1] = (float) pixman_fixed_to_double(from->matrix[1][1]);
+ to[1][2] = (float) pixman_fixed_to_double(from->matrix[1][2])
+ / (normalize ? ((float) height) : 1.0);
+
+ to[2][0] = (float) pixman_fixed_to_double(from->matrix[2][0])
+ * (normalize ? ((float) width) : 1.0);
+ to[2][1] = (float) pixman_fixed_to_double(from->matrix[2][1])
+ * (normalize ? ((float) height) : 1.0);
+ to[2][2] = (float) pixman_fixed_to_double(from->matrix[2][2]);
+
+ DEBUGF("the transform matrix is:\n%f\t%f\t%f\n%f\t%f\t%f\n%f\t%f\t%f\n",
+ to[0][0], to[0][1], to[0][2],
+ to[1][0], to[1][1], to[1][2], to[2][0], to[2][1], to[2][2]);
}
static int
@@ -782,803 +831,844 @@ _glamor_gradient_set_pixmap_destination(ScreenPtr screen,
int x_source, int y_source,
float vertices[8],
float tex_vertices[8],
- int tex_normalize)
+ int tex_normalize)
{
- glamor_pixmap_private *pixmap_priv;
- PixmapPtr pixmap = NULL;
- glamor_gl_dispatch *dispatch = NULL;
-
- pixmap = glamor_get_drawable_pixmap(dst_picture->pDrawable);
- pixmap_priv = glamor_get_pixmap_private(pixmap);
-
- if (!GLAMOR_PIXMAP_PRIV_HAS_FBO(pixmap_priv)) { /* should always have here. */
- return 0;
- }
-
- glamor_set_destination_pixmap_priv_nc(pixmap_priv);
-
- pixmap_priv_get_dest_scale(pixmap_priv, xscale, yscale);
-
- DEBUGF("xscale = %f, yscale = %f,"
- " x_source = %d, y_source = %d, width = %d, height = %d\n",
- *xscale, *yscale, x_source, y_source,
- dst_picture->pDrawable->width, dst_picture->pDrawable->height);
-
- glamor_set_normalize_vcoords_tri_strip(*xscale, *yscale,
- 0, 0,
- (INT16)(dst_picture->pDrawable->width),
- (INT16)(dst_picture->pDrawable->height),
- glamor_priv->yInverted, vertices);
-
- if (tex_normalize) {
- glamor_set_normalize_tcoords_tri_stripe(*xscale, *yscale,
- x_source, y_source,
- (INT16)(dst_picture->pDrawable->width + x_source),
- (INT16)(dst_picture->pDrawable->height + y_source),
- glamor_priv->yInverted, tex_vertices);
- } else {
- glamor_set_tcoords_tri_strip((INT16)(dst_picture->pDrawable->width),
- (INT16)(dst_picture->pDrawable->height),
- x_source, y_source,
- (INT16)(dst_picture->pDrawable->width) + x_source,
- (INT16)(dst_picture->pDrawable->height) + y_source,
- glamor_priv->yInverted, tex_vertices);
- }
-
- DEBUGF("vertices --> leftup : %f X %f, rightup: %f X %f,"
- "rightbottom: %f X %f, leftbottom : %f X %f\n",
- vertices[0], vertices[1], vertices[2], vertices[3],
- vertices[4], vertices[5], vertices[6], vertices[7]);
- DEBUGF("tex_vertices --> leftup : %f X %f, rightup: %f X %f,"
- "rightbottom: %f X %f, leftbottom : %f X %f\n",
- tex_vertices[0], tex_vertices[1], tex_vertices[2], tex_vertices[3],
- tex_vertices[4], tex_vertices[5], tex_vertices[6], tex_vertices[7]);
-
- dispatch = glamor_get_dispatch(glamor_priv);
-
- dispatch->glVertexAttribPointer(GLAMOR_VERTEX_POS, 2, GL_FLOAT,
- GL_FALSE, 0, vertices);
- dispatch->glVertexAttribPointer(GLAMOR_VERTEX_SOURCE, 2, GL_FLOAT,
- GL_FALSE, 0, tex_vertices);
-
- dispatch->glEnableVertexAttribArray(GLAMOR_VERTEX_POS);
- dispatch->glEnableVertexAttribArray(GLAMOR_VERTEX_SOURCE);
-
- glamor_put_dispatch(glamor_priv);
-
- return 1;
+ glamor_pixmap_private *pixmap_priv;
+ PixmapPtr pixmap = NULL;
+ glamor_gl_dispatch *dispatch = NULL;
+
+ pixmap = glamor_get_drawable_pixmap(dst_picture->pDrawable);
+ pixmap_priv = glamor_get_pixmap_private(pixmap);
+
+ if (!GLAMOR_PIXMAP_PRIV_HAS_FBO(pixmap_priv)) { /* should always have here. */
+ return 0;
+ }
+
+ glamor_set_destination_pixmap_priv_nc(pixmap_priv);
+
+ pixmap_priv_get_dest_scale(pixmap_priv, xscale, yscale);
+
+ DEBUGF("xscale = %f, yscale = %f,"
+ " x_source = %d, y_source = %d, width = %d, height = %d\n",
+ *xscale, *yscale, x_source, y_source,
+ dst_picture->pDrawable->width, dst_picture->pDrawable->height);
+
+ glamor_set_normalize_vcoords_tri_strip(*xscale, *yscale,
+ 0, 0,
+ (INT16) (dst_picture->pDrawable->
+ width),
+ (INT16) (dst_picture->pDrawable->
+ height),
+ glamor_priv->yInverted, vertices);
+
+ if (tex_normalize) {
+ glamor_set_normalize_tcoords_tri_stripe(*xscale, *yscale,
+ x_source, y_source,
+ (INT16) (dst_picture->
+ pDrawable->width +
+ x_source),
+ (INT16) (dst_picture->
+ pDrawable->height +
+ y_source),
+ glamor_priv->yInverted,
+ tex_vertices);
+ }
+ else {
+ glamor_set_tcoords_tri_strip((INT16) (dst_picture->pDrawable->width),
+ (INT16) (dst_picture->pDrawable->height),
+ x_source, y_source,
+ (INT16) (dst_picture->pDrawable->width) +
+ x_source,
+ (INT16) (dst_picture->pDrawable->height) +
+ y_source, glamor_priv->yInverted,
+ tex_vertices);
+ }
+
+ DEBUGF("vertices --> leftup : %f X %f, rightup: %f X %f,"
+ "rightbottom: %f X %f, leftbottom : %f X %f\n",
+ vertices[0], vertices[1], vertices[2], vertices[3],
+ vertices[4], vertices[5], vertices[6], vertices[7]);
+ DEBUGF("tex_vertices --> leftup : %f X %f, rightup: %f X %f,"
+ "rightbottom: %f X %f, leftbottom : %f X %f\n",
+ tex_vertices[0], tex_vertices[1], tex_vertices[2], tex_vertices[3],
+ tex_vertices[4], tex_vertices[5], tex_vertices[6], tex_vertices[7]);
+
+ dispatch = glamor_get_dispatch(glamor_priv);
+
+ dispatch->glVertexAttribPointer(GLAMOR_VERTEX_POS, 2, GL_FLOAT,
+ GL_FALSE, 0, vertices);
+ dispatch->glVertexAttribPointer(GLAMOR_VERTEX_SOURCE, 2, GL_FLOAT,
+ GL_FALSE, 0, tex_vertices);
+
+ dispatch->glEnableVertexAttribArray(GLAMOR_VERTEX_POS);
+ dispatch->glEnableVertexAttribArray(GLAMOR_VERTEX_SOURCE);
+
+ glamor_put_dispatch(glamor_priv);
+
+ return 1;
}
static int
-_glamor_gradient_set_stops(PicturePtr src_picture, PictGradient * pgradient,
- GLfloat *stop_colors, GLfloat *n_stops)
+_glamor_gradient_set_stops(PicturePtr src_picture, PictGradient *pgradient,
+ GLfloat *stop_colors, GLfloat *n_stops)
{
- int i;
- int count = 1;
-
- for (i = 0; i < pgradient->nstops; i++) {
- stop_colors[count*4] = pixman_fixed_to_double(
- pgradient->stops[i].color.red);
- stop_colors[count*4+1] = pixman_fixed_to_double(
- pgradient->stops[i].color.green);
- stop_colors[count*4+2] = pixman_fixed_to_double(
- pgradient->stops[i].color.blue);
- stop_colors[count*4+3] = pixman_fixed_to_double(
- pgradient->stops[i].color.alpha);
-
- n_stops[count] = (GLfloat)pixman_fixed_to_double(
- pgradient->stops[i].x);
- count++;
- }
-
- /* for the end stop. */
- count++;
-
- switch (src_picture->repeatType) {
+ int i;
+ int count = 1;
+
+ for (i = 0; i < pgradient->nstops; i++) {
+ stop_colors[count * 4] =
+ pixman_fixed_to_double(pgradient->stops[i].color.red);
+ stop_colors[count * 4 + 1] =
+ pixman_fixed_to_double(pgradient->stops[i].color.green);
+ stop_colors[count * 4 + 2] =
+ pixman_fixed_to_double(pgradient->stops[i].color.blue);
+ stop_colors[count * 4 + 3] =
+ pixman_fixed_to_double(pgradient->stops[i].color.alpha);
+
+ n_stops[count] =
+ (GLfloat) pixman_fixed_to_double(pgradient->stops[i].x);
+ count++;
+ }
+
+ /* for the end stop. */
+ count++;
+
+ switch (src_picture->repeatType) {
#define REPEAT_FILL_STOPS(m, n) \
stop_colors[(m)*4 + 0] = stop_colors[(n)*4 + 0]; \
stop_colors[(m)*4 + 1] = stop_colors[(n)*4 + 1]; \
stop_colors[(m)*4 + 2] = stop_colors[(n)*4 + 2]; \
stop_colors[(m)*4 + 3] = stop_colors[(n)*4 + 3];
- default:
- case PIXMAN_REPEAT_NONE:
- stop_colors[0] = 0.0; //R
- stop_colors[1] = 0.0; //G
- stop_colors[2] = 0.0; //B
- stop_colors[3] = 0.0; //Alpha
- n_stops[0] = -(float)INT_MAX; //should be small enough.
-
- stop_colors[0 + (count-1)*4] = 0.0; //R
- stop_colors[1 + (count-1)*4] = 0.0; //G
- stop_colors[2 + (count-1)*4] = 0.0; //B
- stop_colors[3 + (count-1)*4] = 0.0; //Alpha
- n_stops[count-1] = (float)INT_MAX; //should be large enough.
- break;
- case PIXMAN_REPEAT_NORMAL:
- REPEAT_FILL_STOPS(0, count - 2);
- n_stops[0] = n_stops[count-2] - 1.0;
-
- REPEAT_FILL_STOPS(count - 1, 1);
- n_stops[count-1] = n_stops[1] + 1.0;
- break;
- case PIXMAN_REPEAT_REFLECT:
- REPEAT_FILL_STOPS(0, 1);
- n_stops[0] = -n_stops[1];
-
- REPEAT_FILL_STOPS(count - 1, count - 2);
- n_stops[count-1] = 1.0 + 1.0 - n_stops[count-2];
- break;
- case PIXMAN_REPEAT_PAD:
- REPEAT_FILL_STOPS(0, 1);
- n_stops[0] = -(float)INT_MAX;
-
- REPEAT_FILL_STOPS(count - 1, count - 2);
- n_stops[count-1] = (float)INT_MAX;
- break;
+ default:
+ case PIXMAN_REPEAT_NONE:
+ stop_colors[0] = 0.0; //R
+ stop_colors[1] = 0.0; //G
+ stop_colors[2] = 0.0; //B
+ stop_colors[3] = 0.0; //Alpha
+ n_stops[0] = -(float) INT_MAX; //should be small enough.
+
+ stop_colors[0 + (count - 1) * 4] = 0.0; //R
+ stop_colors[1 + (count - 1) * 4] = 0.0; //G
+ stop_colors[2 + (count - 1) * 4] = 0.0; //B
+ stop_colors[3 + (count - 1) * 4] = 0.0; //Alpha
+ n_stops[count - 1] = (float) INT_MAX; //should be large enough.
+ break;
+ case PIXMAN_REPEAT_NORMAL:
+ REPEAT_FILL_STOPS(0, count - 2);
+ n_stops[0] = n_stops[count - 2] - 1.0;
+
+ REPEAT_FILL_STOPS(count - 1, 1);
+ n_stops[count - 1] = n_stops[1] + 1.0;
+ break;
+ case PIXMAN_REPEAT_REFLECT:
+ REPEAT_FILL_STOPS(0, 1);
+ n_stops[0] = -n_stops[1];
+
+ REPEAT_FILL_STOPS(count - 1, count - 2);
+ n_stops[count - 1] = 1.0 + 1.0 - n_stops[count - 2];
+ break;
+ case PIXMAN_REPEAT_PAD:
+ REPEAT_FILL_STOPS(0, 1);
+ n_stops[0] = -(float) INT_MAX;
+
+ REPEAT_FILL_STOPS(count - 1, count - 2);
+ n_stops[count - 1] = (float) INT_MAX;
+ break;
#undef REPEAT_FILL_STOPS
- }
+ }
- for (i = 0; i < count; i++) {
- DEBUGF("n_stops[%d] = %f, color = r:%f g:%f b:%f a:%f\n",
- i, n_stops[i],
- stop_colors[i*4], stop_colors[i*4+1],
- stop_colors[i*4+2], stop_colors[i*4+3]);
- }
+ for (i = 0; i < count; i++) {
+ DEBUGF("n_stops[%d] = %f, color = r:%f g:%f b:%f a:%f\n",
+ i, n_stops[i],
+ stop_colors[i * 4], stop_colors[i * 4 + 1],
+ stop_colors[i * 4 + 2], stop_colors[i * 4 + 3]);
+ }
- return count;
+ return count;
}
PicturePtr
glamor_generate_radial_gradient_picture(ScreenPtr screen,
- PicturePtr src_picture,
- int x_source, int y_source,
- int width, int height,
- PictFormatShort format)
+ PicturePtr src_picture,
+ int x_source, int y_source,
+ int width, int height,
+ PictFormatShort format)
{
- glamor_screen_private *glamor_priv;
- glamor_gl_dispatch *dispatch;
- PicturePtr dst_picture = NULL;
- PixmapPtr pixmap = NULL;
- GLint gradient_prog = 0;
- int error;
- float tex_vertices[8];
- int stops_count = 0;
- int count = 0;
- GLfloat *stop_colors = NULL;
- GLfloat *n_stops = NULL;
- GLfloat xscale, yscale;
- float vertices[8];
- float transform_mat[3][3];
- static const float identity_mat[3][3] = {{1.0, 0.0, 0.0},
- {0.0, 1.0, 0.0},
- {0.0, 0.0, 1.0}};
- GLfloat stop_colors_st[RADIAL_SMALL_STOPS*4];
- GLfloat n_stops_st[RADIAL_SMALL_STOPS];
- GLfloat A_value;
- GLfloat cxy[4];
- float c1x, c1y, c2x, c2y, r1, r2;
-
- GLint transform_mat_uniform_location = 0;
- GLint repeat_type_uniform_location = 0;
- GLint n_stop_uniform_location = 0;
- GLint stops_uniform_location = 0;
- GLint stop_colors_uniform_location = 0;
- GLint stop0_uniform_location = 0;
- GLint stop1_uniform_location = 0;
- GLint stop2_uniform_location = 0;
- GLint stop3_uniform_location = 0;
- GLint stop4_uniform_location = 0;
- GLint stop5_uniform_location = 0;
- GLint stop6_uniform_location = 0;
- GLint stop7_uniform_location = 0;
- GLint stop_color0_uniform_location = 0;
- GLint stop_color1_uniform_location = 0;
- GLint stop_color2_uniform_location = 0;
- GLint stop_color3_uniform_location = 0;
- GLint stop_color4_uniform_location = 0;
- GLint stop_color5_uniform_location = 0;
- GLint stop_color6_uniform_location = 0;
- GLint stop_color7_uniform_location = 0;
- GLint A_value_uniform_location = 0;
- GLint c1_uniform_location = 0;
- GLint r1_uniform_location = 0;
- GLint c2_uniform_location = 0;
- GLint r2_uniform_location = 0;
-
- glamor_priv = glamor_get_screen_private(screen);
- dispatch = glamor_get_dispatch(glamor_priv);
-
- /* Create a pixmap with VBO. */
- pixmap = glamor_create_pixmap(screen,
- width, height,
- PIXMAN_FORMAT_DEPTH(format),
- 0);
- if (!pixmap)
- goto GRADIENT_FAIL;
-
- dst_picture = CreatePicture(0, &pixmap->drawable,
- PictureMatchFormat(screen,
- PIXMAN_FORMAT_DEPTH(format), format),
- 0, 0, serverClient, &error);
-
- /* Release the reference, picture will hold the last one. */
- glamor_destroy_pixmap(pixmap);
-
- if (!dst_picture)
- goto GRADIENT_FAIL;
-
- ValidatePicture(dst_picture);
-
- stops_count = src_picture->pSourcePict->radial.nstops + 2;
-
- /* Because the max value of nstops is unkown, so create a program
- when nstops > LINEAR_LARGE_STOPS.*/
- if (stops_count <= RADIAL_SMALL_STOPS) {
- gradient_prog = glamor_priv->gradient_prog[SHADER_GRADIENT_RADIAL][0];
- } else if (stops_count <= RADIAL_LARGE_STOPS) {
- gradient_prog = glamor_priv->gradient_prog[SHADER_GRADIENT_RADIAL][1];
- } else {
- _glamor_create_radial_gradient_program(screen,
- src_picture->pSourcePict->linear.nstops + 2,
- 1);
- gradient_prog = glamor_priv->gradient_prog[SHADER_GRADIENT_RADIAL][2];
- }
-
- /* Bind all the uniform vars .*/
- transform_mat_uniform_location =
- dispatch->glGetUniformLocation(gradient_prog, "transform_mat");
- repeat_type_uniform_location =
- dispatch->glGetUniformLocation(gradient_prog, "repeat_type");
- n_stop_uniform_location =
- dispatch->glGetUniformLocation(gradient_prog, "n_stop");
- A_value_uniform_location =
- dispatch->glGetUniformLocation(gradient_prog, "A_value");
- repeat_type_uniform_location =
- dispatch->glGetUniformLocation(gradient_prog, "repeat_type");
- c1_uniform_location =
- dispatch->glGetUniformLocation(gradient_prog, "c1");
- r1_uniform_location =
- dispatch->glGetUniformLocation(gradient_prog, "r1");
- c2_uniform_location =
- dispatch->glGetUniformLocation(gradient_prog, "c2");
- r2_uniform_location =
- dispatch->glGetUniformLocation(gradient_prog, "r2");
-
- if (src_picture->pSourcePict->radial.nstops + 2 <= RADIAL_SMALL_STOPS) {
- stop0_uniform_location =
- dispatch->glGetUniformLocation(gradient_prog, "stop0");
- stop1_uniform_location =
- dispatch->glGetUniformLocation(gradient_prog, "stop1");
- stop2_uniform_location =
- dispatch->glGetUniformLocation(gradient_prog, "stop2");
- stop3_uniform_location =
- dispatch->glGetUniformLocation(gradient_prog, "stop3");
- stop4_uniform_location =
- dispatch->glGetUniformLocation(gradient_prog, "stop4");
- stop5_uniform_location =
- dispatch->glGetUniformLocation(gradient_prog, "stop5");
- stop6_uniform_location =
- dispatch->glGetUniformLocation(gradient_prog, "stop6");
- stop7_uniform_location =
- dispatch->glGetUniformLocation(gradient_prog, "stop7");
-
- stop_color0_uniform_location =
- dispatch->glGetUniformLocation(gradient_prog, "stop_color0");
- stop_color1_uniform_location =
- dispatch->glGetUniformLocation(gradient_prog, "stop_color1");
- stop_color2_uniform_location =
- dispatch->glGetUniformLocation(gradient_prog, "stop_color2");
- stop_color3_uniform_location =
- dispatch->glGetUniformLocation(gradient_prog, "stop_color3");
- stop_color4_uniform_location =
- dispatch->glGetUniformLocation(gradient_prog, "stop_color4");
- stop_color5_uniform_location =
- dispatch->glGetUniformLocation(gradient_prog, "stop_color5");
- stop_color6_uniform_location =
- dispatch->glGetUniformLocation(gradient_prog, "stop_color6");
- stop_color7_uniform_location =
- dispatch->glGetUniformLocation(gradient_prog, "stop_color7");
- } else {
- stops_uniform_location =
- dispatch->glGetUniformLocation(gradient_prog, "stops");
- stop_colors_uniform_location =
- dispatch->glGetUniformLocation(gradient_prog, "stop_colors");
- }
-
- dispatch->glUseProgram(gradient_prog);
-
- dispatch->glUniform1i(repeat_type_uniform_location, src_picture->repeatType);
-
-
- if (src_picture->transform) {
- _glamor_gradient_convert_trans_matrix(src_picture->transform,
- transform_mat,
- width, height, 0);
- dispatch->glUniformMatrix3fv(transform_mat_uniform_location,
- 1, 1, &transform_mat[0][0]);
- } else {
- dispatch->glUniformMatrix3fv(transform_mat_uniform_location,
- 1, 1, &identity_mat[0][0]);
- }
-
- if (!_glamor_gradient_set_pixmap_destination(screen, glamor_priv, dst_picture,
- &xscale, &yscale, x_source, y_source,
- vertices, tex_vertices, 0))
- goto GRADIENT_FAIL;
-
- /* Set all the stops and colors to shader. */
- if (stops_count > RADIAL_SMALL_STOPS) {
- stop_colors = malloc(4 * stops_count * sizeof(float));
- if (stop_colors == NULL) {
- ErrorF("Failed to allocate stop_colors memory.\n");
- goto GRADIENT_FAIL;
- }
-
- n_stops = malloc(stops_count * sizeof(float));
- if (n_stops == NULL) {
- ErrorF("Failed to allocate n_stops memory.\n");
- goto GRADIENT_FAIL;
- }
- } else {
- stop_colors = stop_colors_st;
- n_stops = n_stops_st;
- }
-
- count = _glamor_gradient_set_stops(src_picture, &src_picture->pSourcePict->gradient,
- stop_colors, n_stops);
-
- if (src_picture->pSourcePict->linear.nstops + 2 <= RADIAL_SMALL_STOPS) {
- int j = 0;
- dispatch->glUniform4f(stop_color0_uniform_location,
- stop_colors[4*j+0], stop_colors[4*j+1],
- stop_colors[4*j+2], stop_colors[4*j+3]);
- j++;
- dispatch->glUniform4f(stop_color1_uniform_location,
- stop_colors[4*j+0], stop_colors[4*j+1],
- stop_colors[4*j+2], stop_colors[4*j+3]);
- j++;
- dispatch->glUniform4f(stop_color2_uniform_location,
- stop_colors[4*j+0], stop_colors[4*j+1],
- stop_colors[4*j+2], stop_colors[4*j+3]);
- j++;
- dispatch->glUniform4f(stop_color3_uniform_location,
- stop_colors[4*j+0], stop_colors[4*j+1],
- stop_colors[4*j+2], stop_colors[4*j+3]);
- j++;
- dispatch->glUniform4f(stop_color4_uniform_location,
- stop_colors[4*j+0], stop_colors[4*j+1],
- stop_colors[4*j+2], stop_colors[4*j+3]);
- j++;
- dispatch->glUniform4f(stop_color5_uniform_location,
- stop_colors[4*j+0], stop_colors[4*j+1],
- stop_colors[4*j+2], stop_colors[4*j+3]);
- j++;
- dispatch->glUniform4f(stop_color6_uniform_location,
- stop_colors[4*j+0], stop_colors[4*j+1],
- stop_colors[4*j+2], stop_colors[4*j+3]);
- j++;
- dispatch->glUniform4f(stop_color7_uniform_location,
- stop_colors[4*j+0], stop_colors[4*j+1],
- stop_colors[4*j+2], stop_colors[4*j+3]);
-
- j = 0;
- dispatch->glUniform1f(stop0_uniform_location, n_stops[j++]);
- dispatch->glUniform1f(stop1_uniform_location, n_stops[j++]);
- dispatch->glUniform1f(stop2_uniform_location, n_stops[j++]);
- dispatch->glUniform1f(stop3_uniform_location, n_stops[j++]);
- dispatch->glUniform1f(stop4_uniform_location, n_stops[j++]);
- dispatch->glUniform1f(stop5_uniform_location, n_stops[j++]);
- dispatch->glUniform1f(stop6_uniform_location, n_stops[j++]);
- dispatch->glUniform1f(stop7_uniform_location, n_stops[j++]);
- dispatch->glUniform1i(n_stop_uniform_location, count);
- } else {
- dispatch->glUniform4fv(stop_colors_uniform_location, count, stop_colors);
- dispatch->glUniform1fv(stops_uniform_location, count, n_stops);
- dispatch->glUniform1i(n_stop_uniform_location, count);
- }
-
- c1x = (float)pixman_fixed_to_double(src_picture->pSourcePict->radial.c1.x);
- c1y = (float)pixman_fixed_to_double(src_picture->pSourcePict->radial.c1.y);
- c2x = (float)pixman_fixed_to_double(src_picture->pSourcePict->radial.c2.x);
- c2y = (float)pixman_fixed_to_double(src_picture->pSourcePict->radial.c2.y);
-
- r1 = (float)pixman_fixed_to_double(src_picture->pSourcePict->radial.c1.radius);
- r2 = (float)pixman_fixed_to_double(src_picture->pSourcePict->radial.c2.radius);
-
- glamor_set_circle_centre(width, height, c1x, c1y, glamor_priv->yInverted, cxy);
- dispatch->glUniform2fv(c1_uniform_location, 1, cxy);
- dispatch->glUniform1f(r1_uniform_location, r1);
-
- glamor_set_circle_centre(width, height, c2x, c2y, glamor_priv->yInverted, cxy);
- dispatch->glUniform2fv(c2_uniform_location, 1, cxy);
- dispatch->glUniform1f(r2_uniform_location, r2);
-
- A_value = (c2x - c1x) * (c2x - c1x) + (c2y - c1y) * (c2y - c1y) - (r2 - r1) * (r2 - r1);
- dispatch->glUniform1f(A_value_uniform_location, A_value);
-
- DEBUGF("C1:(%f, %f) R1:%f\nC2:(%f, %f) R2:%f\nA = %f\n",
- c1x, c1y, r1, c2x, c2y, r2, A_value);
-
- /* Now rendering. */
- dispatch->glDrawArrays(GL_TRIANGLE_STRIP, 0, 4);
-
- /* Do the clear logic.*/
- if (stops_count > RADIAL_SMALL_STOPS) {
- free(n_stops);
- free(stop_colors);
- }
-
- dispatch->glBindBuffer(GL_ARRAY_BUFFER, 0);
- dispatch->glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, 0);
-
- dispatch->glDisableVertexAttribArray(GLAMOR_VERTEX_POS);
- dispatch->glDisableVertexAttribArray(GLAMOR_VERTEX_SOURCE);
- dispatch->glUseProgram(0);
-
- glamor_put_dispatch(glamor_priv);
- return dst_picture;
-
-GRADIENT_FAIL:
- if (dst_picture) {
- FreePicture(dst_picture, 0);
- }
-
- if (stops_count > RADIAL_SMALL_STOPS) {
- if (n_stops)
- free(n_stops);
- if (stop_colors)
- free(stop_colors);
- }
-
- dispatch->glBindBuffer(GL_ARRAY_BUFFER, 0);
- dispatch->glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, 0);
-
- dispatch->glDisableVertexAttribArray(GLAMOR_VERTEX_POS);
- dispatch->glDisableVertexAttribArray(GLAMOR_VERTEX_SOURCE);
- dispatch->glUseProgram(0);
- glamor_put_dispatch(glamor_priv);
- return NULL;
+ glamor_screen_private *glamor_priv;
+ glamor_gl_dispatch *dispatch;
+ PicturePtr dst_picture = NULL;
+ PixmapPtr pixmap = NULL;
+ GLint gradient_prog = 0;
+ int error;
+ float tex_vertices[8];
+ int stops_count = 0;
+ int count = 0;
+ GLfloat *stop_colors = NULL;
+ GLfloat *n_stops = NULL;
+ GLfloat xscale, yscale;
+ float vertices[8];
+ float transform_mat[3][3];
+ static const float identity_mat[3][3] = { {1.0, 0.0, 0.0},
+ {0.0, 1.0, 0.0},
+ {0.0, 0.0, 1.0}
+ };
+ GLfloat stop_colors_st[RADIAL_SMALL_STOPS * 4];
+ GLfloat n_stops_st[RADIAL_SMALL_STOPS];
+ GLfloat A_value;
+ GLfloat cxy[4];
+ float c1x, c1y, c2x, c2y, r1, r2;
+
+ GLint transform_mat_uniform_location = 0;
+ GLint repeat_type_uniform_location = 0;
+ GLint n_stop_uniform_location = 0;
+ GLint stops_uniform_location = 0;
+ GLint stop_colors_uniform_location = 0;
+ GLint stop0_uniform_location = 0;
+ GLint stop1_uniform_location = 0;
+ GLint stop2_uniform_location = 0;
+ GLint stop3_uniform_location = 0;
+ GLint stop4_uniform_location = 0;
+ GLint stop5_uniform_location = 0;
+ GLint stop6_uniform_location = 0;
+ GLint stop7_uniform_location = 0;
+ GLint stop_color0_uniform_location = 0;
+ GLint stop_color1_uniform_location = 0;
+ GLint stop_color2_uniform_location = 0;
+ GLint stop_color3_uniform_location = 0;
+ GLint stop_color4_uniform_location = 0;
+ GLint stop_color5_uniform_location = 0;
+ GLint stop_color6_uniform_location = 0;
+ GLint stop_color7_uniform_location = 0;
+ GLint A_value_uniform_location = 0;
+ GLint c1_uniform_location = 0;
+ GLint r1_uniform_location = 0;
+ GLint c2_uniform_location = 0;
+ GLint r2_uniform_location = 0;
+
+ glamor_priv = glamor_get_screen_private(screen);
+ dispatch = glamor_get_dispatch(glamor_priv);
+
+ /* Create a pixmap with VBO. */
+ pixmap = glamor_create_pixmap(screen,
+ width, height,
+ PIXMAN_FORMAT_DEPTH(format), 0);
+ if (!pixmap)
+ goto GRADIENT_FAIL;
+
+ dst_picture = CreatePicture(0, &pixmap->drawable,
+ PictureMatchFormat(screen,
+ PIXMAN_FORMAT_DEPTH(format),
+ format), 0, 0, serverClient,
+ &error);
+
+ /* Release the reference, picture will hold the last one. */
+ glamor_destroy_pixmap(pixmap);
+
+ if (!dst_picture)
+ goto GRADIENT_FAIL;
+
+ ValidatePicture(dst_picture);
+
+ stops_count = src_picture->pSourcePict->radial.nstops + 2;
+
+ /* Because the max value of nstops is unkown, so create a program
+ when nstops > LINEAR_LARGE_STOPS. */
+ if (stops_count <= RADIAL_SMALL_STOPS) {
+ gradient_prog = glamor_priv->gradient_prog[SHADER_GRADIENT_RADIAL][0];
+ }
+ else if (stops_count <= RADIAL_LARGE_STOPS) {
+ gradient_prog = glamor_priv->gradient_prog[SHADER_GRADIENT_RADIAL][1];
+ }
+ else {
+ _glamor_create_radial_gradient_program(screen,
+ src_picture->pSourcePict->linear.
+ nstops + 2, 1);
+ gradient_prog = glamor_priv->gradient_prog[SHADER_GRADIENT_RADIAL][2];
+ }
+
+ /* Bind all the uniform vars . */
+ transform_mat_uniform_location =
+ dispatch->glGetUniformLocation(gradient_prog, "transform_mat");
+ repeat_type_uniform_location =
+ dispatch->glGetUniformLocation(gradient_prog, "repeat_type");
+ n_stop_uniform_location =
+ dispatch->glGetUniformLocation(gradient_prog, "n_stop");
+ A_value_uniform_location =
+ dispatch->glGetUniformLocation(gradient_prog, "A_value");
+ repeat_type_uniform_location =
+ dispatch->glGetUniformLocation(gradient_prog, "repeat_type");
+ c1_uniform_location = dispatch->glGetUniformLocation(gradient_prog, "c1");
+ r1_uniform_location = dispatch->glGetUniformLocation(gradient_prog, "r1");
+ c2_uniform_location = dispatch->glGetUniformLocation(gradient_prog, "c2");
+ r2_uniform_location = dispatch->glGetUniformLocation(gradient_prog, "r2");
+
+ if (src_picture->pSourcePict->radial.nstops + 2 <= RADIAL_SMALL_STOPS) {
+ stop0_uniform_location =
+ dispatch->glGetUniformLocation(gradient_prog, "stop0");
+ stop1_uniform_location =
+ dispatch->glGetUniformLocation(gradient_prog, "stop1");
+ stop2_uniform_location =
+ dispatch->glGetUniformLocation(gradient_prog, "stop2");
+ stop3_uniform_location =
+ dispatch->glGetUniformLocation(gradient_prog, "stop3");
+ stop4_uniform_location =
+ dispatch->glGetUniformLocation(gradient_prog, "stop4");
+ stop5_uniform_location =
+ dispatch->glGetUniformLocation(gradient_prog, "stop5");
+ stop6_uniform_location =
+ dispatch->glGetUniformLocation(gradient_prog, "stop6");
+ stop7_uniform_location =
+ dispatch->glGetUniformLocation(gradient_prog, "stop7");
+
+ stop_color0_uniform_location =
+ dispatch->glGetUniformLocation(gradient_prog, "stop_color0");
+ stop_color1_uniform_location =
+ dispatch->glGetUniformLocation(gradient_prog, "stop_color1");
+ stop_color2_uniform_location =
+ dispatch->glGetUniformLocation(gradient_prog, "stop_color2");
+ stop_color3_uniform_location =
+ dispatch->glGetUniformLocation(gradient_prog, "stop_color3");
+ stop_color4_uniform_location =
+ dispatch->glGetUniformLocation(gradient_prog, "stop_color4");
+ stop_color5_uniform_location =
+ dispatch->glGetUniformLocation(gradient_prog, "stop_color5");
+ stop_color6_uniform_location =
+ dispatch->glGetUniformLocation(gradient_prog, "stop_color6");
+ stop_color7_uniform_location =
+ dispatch->glGetUniformLocation(gradient_prog, "stop_color7");
+ }
+ else {
+ stops_uniform_location =
+ dispatch->glGetUniformLocation(gradient_prog, "stops");
+ stop_colors_uniform_location =
+ dispatch->glGetUniformLocation(gradient_prog, "stop_colors");
+ }
+
+ dispatch->glUseProgram(gradient_prog);
+
+ dispatch->glUniform1i(repeat_type_uniform_location,
+ src_picture->repeatType);
+
+ if (src_picture->transform) {
+ _glamor_gradient_convert_trans_matrix(src_picture->transform,
+ transform_mat, width, height, 0);
+ dispatch->glUniformMatrix3fv(transform_mat_uniform_location,
+ 1, 1, &transform_mat[0][0]);
+ }
+ else {
+ dispatch->glUniformMatrix3fv(transform_mat_uniform_location,
+ 1, 1, &identity_mat[0][0]);
+ }
+
+ if (!_glamor_gradient_set_pixmap_destination
+ (screen, glamor_priv, dst_picture, &xscale, &yscale, x_source, y_source,
+ vertices, tex_vertices, 0))
+ goto GRADIENT_FAIL;
+
+ /* Set all the stops and colors to shader. */
+ if (stops_count > RADIAL_SMALL_STOPS) {
+ stop_colors = malloc(4 * stops_count * sizeof(float));
+ if (stop_colors == NULL) {
+ ErrorF("Failed to allocate stop_colors memory.\n");
+ goto GRADIENT_FAIL;
+ }
+
+ n_stops = malloc(stops_count * sizeof(float));
+ if (n_stops == NULL) {
+ ErrorF("Failed to allocate n_stops memory.\n");
+ goto GRADIENT_FAIL;
+ }
+ }
+ else {
+ stop_colors = stop_colors_st;
+ n_stops = n_stops_st;
+ }
+
+ count =
+ _glamor_gradient_set_stops(src_picture,
+ &src_picture->pSourcePict->gradient,
+ stop_colors, n_stops);
+
+ if (src_picture->pSourcePict->linear.nstops + 2 <= RADIAL_SMALL_STOPS) {
+ int j = 0;
+
+ dispatch->glUniform4f(stop_color0_uniform_location,
+ stop_colors[4 * j + 0], stop_colors[4 * j + 1],
+ stop_colors[4 * j + 2], stop_colors[4 * j + 3]);
+ j++;
+ dispatch->glUniform4f(stop_color1_uniform_location,
+ stop_colors[4 * j + 0], stop_colors[4 * j + 1],
+ stop_colors[4 * j + 2], stop_colors[4 * j + 3]);
+ j++;
+ dispatch->glUniform4f(stop_color2_uniform_location,
+ stop_colors[4 * j + 0], stop_colors[4 * j + 1],
+ stop_colors[4 * j + 2], stop_colors[4 * j + 3]);
+ j++;
+ dispatch->glUniform4f(stop_color3_uniform_location,
+ stop_colors[4 * j + 0], stop_colors[4 * j + 1],
+ stop_colors[4 * j + 2], stop_colors[4 * j + 3]);
+ j++;
+ dispatch->glUniform4f(stop_color4_uniform_location,
+ stop_colors[4 * j + 0], stop_colors[4 * j + 1],
+ stop_colors[4 * j + 2], stop_colors[4 * j + 3]);
+ j++;
+ dispatch->glUniform4f(stop_color5_uniform_location,
+ stop_colors[4 * j + 0], stop_colors[4 * j + 1],
+ stop_colors[4 * j + 2], stop_colors[4 * j + 3]);
+ j++;
+ dispatch->glUniform4f(stop_color6_uniform_location,
+ stop_colors[4 * j + 0], stop_colors[4 * j + 1],
+ stop_colors[4 * j + 2], stop_colors[4 * j + 3]);
+ j++;
+ dispatch->glUniform4f(stop_color7_uniform_location,
+ stop_colors[4 * j + 0], stop_colors[4 * j + 1],
+ stop_colors[4 * j + 2], stop_colors[4 * j + 3]);
+
+ j = 0;
+ dispatch->glUniform1f(stop0_uniform_location, n_stops[j++]);
+ dispatch->glUniform1f(stop1_uniform_location, n_stops[j++]);
+ dispatch->glUniform1f(stop2_uniform_location, n_stops[j++]);
+ dispatch->glUniform1f(stop3_uniform_location, n_stops[j++]);
+ dispatch->glUniform1f(stop4_uniform_location, n_stops[j++]);
+ dispatch->glUniform1f(stop5_uniform_location, n_stops[j++]);
+ dispatch->glUniform1f(stop6_uniform_location, n_stops[j++]);
+ dispatch->glUniform1f(stop7_uniform_location, n_stops[j++]);
+ dispatch->glUniform1i(n_stop_uniform_location, count);
+ }
+ else {
+ dispatch->glUniform4fv(stop_colors_uniform_location, count,
+ stop_colors);
+ dispatch->glUniform1fv(stops_uniform_location, count, n_stops);
+ dispatch->glUniform1i(n_stop_uniform_location, count);
+ }
+
+ c1x = (float) pixman_fixed_to_double(src_picture->pSourcePict->radial.c1.x);
+ c1y = (float) pixman_fixed_to_double(src_picture->pSourcePict->radial.c1.y);
+ c2x = (float) pixman_fixed_to_double(src_picture->pSourcePict->radial.c2.x);
+ c2y = (float) pixman_fixed_to_double(src_picture->pSourcePict->radial.c2.y);
+
+ r1 = (float) pixman_fixed_to_double(src_picture->pSourcePict->radial.c1.
+ radius);
+ r2 = (float) pixman_fixed_to_double(src_picture->pSourcePict->radial.c2.
+ radius);
+
+ glamor_set_circle_centre(width, height, c1x, c1y, glamor_priv->yInverted,
+ cxy);
+ dispatch->glUniform2fv(c1_uniform_location, 1, cxy);
+ dispatch->glUniform1f(r1_uniform_location, r1);
+
+ glamor_set_circle_centre(width, height, c2x, c2y, glamor_priv->yInverted,
+ cxy);
+ dispatch->glUniform2fv(c2_uniform_location, 1, cxy);
+ dispatch->glUniform1f(r2_uniform_location, r2);
+
+ A_value =
+ (c2x - c1x) * (c2x - c1x) + (c2y - c1y) * (c2y - c1y) - (r2 -
+ r1) * (r2 -
+ r1);
+ dispatch->glUniform1f(A_value_uniform_location, A_value);
+
+ DEBUGF("C1:(%f, %f) R1:%f\nC2:(%f, %f) R2:%f\nA = %f\n",
+ c1x, c1y, r1, c2x, c2y, r2, A_value);
+
+ /* Now rendering. */
+ dispatch->glDrawArrays(GL_TRIANGLE_STRIP, 0, 4);
+
+ /* Do the clear logic. */
+ if (stops_count > RADIAL_SMALL_STOPS) {
+ free(n_stops);
+ free(stop_colors);
+ }
+
+ dispatch->glBindBuffer(GL_ARRAY_BUFFER, 0);
+ dispatch->glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, 0);
+
+ dispatch->glDisableVertexAttribArray(GLAMOR_VERTEX_POS);
+ dispatch->glDisableVertexAttribArray(GLAMOR_VERTEX_SOURCE);
+ dispatch->glUseProgram(0);
+
+ glamor_put_dispatch(glamor_priv);
+ return dst_picture;
+
+ GRADIENT_FAIL:
+ if (dst_picture) {
+ FreePicture(dst_picture, 0);
+ }
+
+ if (stops_count > RADIAL_SMALL_STOPS) {
+ if (n_stops)
+ free(n_stops);
+ if (stop_colors)
+ free(stop_colors);
+ }
+
+ dispatch->glBindBuffer(GL_ARRAY_BUFFER, 0);
+ dispatch->glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, 0);
+
+ dispatch->glDisableVertexAttribArray(GLAMOR_VERTEX_POS);
+ dispatch->glDisableVertexAttribArray(GLAMOR_VERTEX_SOURCE);
+ dispatch->glUseProgram(0);
+ glamor_put_dispatch(glamor_priv);
+ return NULL;
}
PicturePtr
glamor_generate_linear_gradient_picture(ScreenPtr screen,
- PicturePtr src_picture,
- int x_source, int y_source,
- int width, int height,
- PictFormatShort format)
+ PicturePtr src_picture,
+ int x_source, int y_source,
+ int width, int height,
+ PictFormatShort format)
{
- glamor_screen_private *glamor_priv;
- glamor_gl_dispatch *dispatch;
- PicturePtr dst_picture = NULL;
- PixmapPtr pixmap = NULL;
- GLint gradient_prog = 0;
- int error;
- float pt_distance;
- float p1_distance;
- GLfloat cos_val;
- float tex_vertices[8];
- int stops_count = 0;
- GLfloat *stop_colors = NULL;
- GLfloat *n_stops = NULL;
- int count = 0;
- float slope;
- GLfloat xscale, yscale;
- GLfloat pt1[2], pt2[2];
- float vertices[8];
- float transform_mat[3][3];
- static const float identity_mat[3][3] = {{1.0, 0.0, 0.0},
- {0.0, 1.0, 0.0},
- {0.0, 0.0, 1.0}};
- GLfloat stop_colors_st[LINEAR_SMALL_STOPS*4];
- GLfloat n_stops_st[LINEAR_SMALL_STOPS];
-
- GLint transform_mat_uniform_location = 0;
- GLint n_stop_uniform_location = 0;
- GLint stops_uniform_location = 0;
- GLint stop0_uniform_location = 0;
- GLint stop1_uniform_location = 0;
- GLint stop2_uniform_location = 0;
- GLint stop3_uniform_location = 0;
- GLint stop4_uniform_location = 0;
- GLint stop5_uniform_location = 0;
- GLint stop6_uniform_location = 0;
- GLint stop7_uniform_location = 0;
- GLint stop_colors_uniform_location = 0;
- GLint stop_color0_uniform_location = 0;
- GLint stop_color1_uniform_location = 0;
- GLint stop_color2_uniform_location = 0;
- GLint stop_color3_uniform_location = 0;
- GLint stop_color4_uniform_location = 0;
- GLint stop_color5_uniform_location = 0;
- GLint stop_color6_uniform_location = 0;
- GLint stop_color7_uniform_location = 0;
- GLint pt_slope_uniform_location = 0;
- GLint repeat_type_uniform_location = 0;
- GLint hor_ver_uniform_location = 0;
- GLint cos_val_uniform_location = 0;
- GLint p1_distance_uniform_location = 0;
- GLint pt_distance_uniform_location = 0;
-
- glamor_priv = glamor_get_screen_private(screen);
- dispatch = glamor_get_dispatch(glamor_priv);
-
- /* Create a pixmap with VBO. */
- pixmap = glamor_create_pixmap(screen,
- width, height,
- PIXMAN_FORMAT_DEPTH(format),
- 0);
-
- if (!pixmap)
- goto GRADIENT_FAIL;
-
- dst_picture = CreatePicture(0, &pixmap->drawable,
- PictureMatchFormat(screen,
- PIXMAN_FORMAT_DEPTH(format), format),
- 0, 0, serverClient, &error);
-
- /* Release the reference, picture will hold the last one. */
- glamor_destroy_pixmap(pixmap);
-
- if (!dst_picture)
- goto GRADIENT_FAIL;
-
- ValidatePicture(dst_picture);
-
- stops_count = src_picture->pSourcePict->linear.nstops + 2;
-
- /* Because the max value of nstops is unkown, so create a program
- when nstops > LINEAR_LARGE_STOPS.*/
- if (stops_count <= LINEAR_SMALL_STOPS) {
- gradient_prog = glamor_priv->gradient_prog[SHADER_GRADIENT_LINEAR][0];
- } else if (stops_count <= LINEAR_LARGE_STOPS) {
- gradient_prog = glamor_priv->gradient_prog[SHADER_GRADIENT_LINEAR][1];
- } else {
- _glamor_create_linear_gradient_program(screen,
- src_picture->pSourcePict->linear.nstops + 2, 1);
- gradient_prog = glamor_priv->gradient_prog[SHADER_GRADIENT_LINEAR][2];
- }
-
- /* Bind all the uniform vars .*/
- n_stop_uniform_location =
- dispatch->glGetUniformLocation(gradient_prog, "n_stop");
- pt_slope_uniform_location =
- dispatch->glGetUniformLocation(gradient_prog, "pt_slope");
- repeat_type_uniform_location =
- dispatch->glGetUniformLocation(gradient_prog, "repeat_type");
- hor_ver_uniform_location =
- dispatch->glGetUniformLocation(gradient_prog, "hor_ver");
- transform_mat_uniform_location =
- dispatch->glGetUniformLocation(gradient_prog, "transform_mat");
- cos_val_uniform_location =
- dispatch->glGetUniformLocation(gradient_prog, "cos_val");
- p1_distance_uniform_location =
- dispatch->glGetUniformLocation(gradient_prog, "p1_distance");
- pt_distance_uniform_location =
- dispatch->glGetUniformLocation(gradient_prog, "pt_distance");
-
- if (src_picture->pSourcePict->linear.nstops + 2 <= LINEAR_SMALL_STOPS) {
- stop0_uniform_location =
- dispatch->glGetUniformLocation(gradient_prog, "stop0");
- stop1_uniform_location =
- dispatch->glGetUniformLocation(gradient_prog, "stop1");
- stop2_uniform_location =
- dispatch->glGetUniformLocation(gradient_prog, "stop2");
- stop3_uniform_location =
- dispatch->glGetUniformLocation(gradient_prog, "stop3");
- stop4_uniform_location =
- dispatch->glGetUniformLocation(gradient_prog, "stop4");
- stop5_uniform_location =
- dispatch->glGetUniformLocation(gradient_prog, "stop5");
- stop6_uniform_location =
- dispatch->glGetUniformLocation(gradient_prog, "stop6");
- stop7_uniform_location =
- dispatch->glGetUniformLocation(gradient_prog, "stop7");
-
- stop_color0_uniform_location =
- dispatch->glGetUniformLocation(gradient_prog, "stop_color0");
- stop_color1_uniform_location =
- dispatch->glGetUniformLocation(gradient_prog, "stop_color1");
- stop_color2_uniform_location =
- dispatch->glGetUniformLocation(gradient_prog, "stop_color2");
- stop_color3_uniform_location =
- dispatch->glGetUniformLocation(gradient_prog, "stop_color3");
- stop_color4_uniform_location =
- dispatch->glGetUniformLocation(gradient_prog, "stop_color4");
- stop_color5_uniform_location =
- dispatch->glGetUniformLocation(gradient_prog, "stop_color5");
- stop_color6_uniform_location =
- dispatch->glGetUniformLocation(gradient_prog, "stop_color6");
- stop_color7_uniform_location =
- dispatch->glGetUniformLocation(gradient_prog, "stop_color7");
- } else {
- stops_uniform_location =
- dispatch->glGetUniformLocation(gradient_prog, "stops");
- stop_colors_uniform_location =
- dispatch->glGetUniformLocation(gradient_prog, "stop_colors");
- }
-
- dispatch->glUseProgram(gradient_prog);
-
- dispatch->glUniform1i(repeat_type_uniform_location, src_picture->repeatType);
-
- /* set the transform matrix. */
- if (src_picture->transform) {
- _glamor_gradient_convert_trans_matrix(src_picture->transform,
- transform_mat,
- width, height, 1);
- dispatch->glUniformMatrix3fv(transform_mat_uniform_location,
- 1, 1, &transform_mat[0][0]);
- } else {
- dispatch->glUniformMatrix3fv(transform_mat_uniform_location,
- 1, 1, &identity_mat[0][0]);
- }
-
- if (!_glamor_gradient_set_pixmap_destination(screen, glamor_priv, dst_picture,
- &xscale, &yscale, x_source, y_source,
- vertices, tex_vertices, 1))
- goto GRADIENT_FAIL;
-
- /* Normalize the PTs. */
- glamor_set_normalize_pt(xscale, yscale,
- pixman_fixed_to_double(src_picture->pSourcePict->linear.p1.x),
- pixman_fixed_to_double(src_picture->pSourcePict->linear.p1.y),
- glamor_priv->yInverted,
- pt1);
- DEBUGF("pt1:(%f, %f) ---> (%f %f)\n", pixman_fixed_to_double(src_picture->pSourcePict->linear.p1.x),
- pixman_fixed_to_double(src_picture->pSourcePict->linear.p1.y), pt1[0], pt1[1]);
-
- glamor_set_normalize_pt(xscale, yscale,
- pixman_fixed_to_double(src_picture->pSourcePict->linear.p2.x),
- pixman_fixed_to_double(src_picture->pSourcePict->linear.p2.y),
- glamor_priv->yInverted,
- pt2);
- DEBUGF("pt2:(%f, %f) ---> (%f %f)\n", pixman_fixed_to_double(src_picture->pSourcePict->linear.p2.x),
- pixman_fixed_to_double(src_picture->pSourcePict->linear.p2.y), pt2[0], pt2[1]);
-
- /* Set all the stops and colors to shader. */
- if (stops_count > LINEAR_SMALL_STOPS) {
- stop_colors = malloc(4 * stops_count * sizeof(float));
- if (stop_colors == NULL) {
- ErrorF("Failed to allocate stop_colors memory.\n");
- goto GRADIENT_FAIL;
- }
-
- n_stops = malloc(stops_count * sizeof(float));
- if (n_stops == NULL) {
- ErrorF("Failed to allocate n_stops memory.\n");
- goto GRADIENT_FAIL;
- }
- } else {
- stop_colors = stop_colors_st;
- n_stops = n_stops_st;
- }
-
- count = _glamor_gradient_set_stops(src_picture, &src_picture->pSourcePict->gradient,
- stop_colors, n_stops);
-
- if (src_picture->pSourcePict->linear.nstops + 2 <= LINEAR_SMALL_STOPS) {
- int j = 0;
- dispatch->glUniform4f(stop_color0_uniform_location,
- stop_colors[4*j+0], stop_colors[4*j+1],
- stop_colors[4*j+2], stop_colors[4*j+3]);
- j++;
- dispatch->glUniform4f(stop_color1_uniform_location,
- stop_colors[4*j+0], stop_colors[4*j+1],
- stop_colors[4*j+2], stop_colors[4*j+3]);
- j++;
- dispatch->glUniform4f(stop_color2_uniform_location,
- stop_colors[4*j+0], stop_colors[4*j+1],
- stop_colors[4*j+2], stop_colors[4*j+3]);
- j++;
- dispatch->glUniform4f(stop_color3_uniform_location,
- stop_colors[4*j+0], stop_colors[4*j+1],
- stop_colors[4*j+2], stop_colors[4*j+3]);
- j++;
- dispatch->glUniform4f(stop_color4_uniform_location,
- stop_colors[4*j+0], stop_colors[4*j+1],
- stop_colors[4*j+2], stop_colors[4*j+3]);
- j++;
- dispatch->glUniform4f(stop_color5_uniform_location,
- stop_colors[4*j+0], stop_colors[4*j+1],
- stop_colors[4*j+2], stop_colors[4*j+3]);
- j++;
- dispatch->glUniform4f(stop_color6_uniform_location,
- stop_colors[4*j+0], stop_colors[4*j+1],
- stop_colors[4*j+2], stop_colors[4*j+3]);
- j++;
- dispatch->glUniform4f(stop_color7_uniform_location,
- stop_colors[4*j+0], stop_colors[4*j+1],
- stop_colors[4*j+2], stop_colors[4*j+3]);
-
- j = 0;
- dispatch->glUniform1f(stop0_uniform_location, n_stops[j++]);
- dispatch->glUniform1f(stop1_uniform_location, n_stops[j++]);
- dispatch->glUniform1f(stop2_uniform_location, n_stops[j++]);
- dispatch->glUniform1f(stop3_uniform_location, n_stops[j++]);
- dispatch->glUniform1f(stop4_uniform_location, n_stops[j++]);
- dispatch->glUniform1f(stop5_uniform_location, n_stops[j++]);
- dispatch->glUniform1f(stop6_uniform_location, n_stops[j++]);
- dispatch->glUniform1f(stop7_uniform_location, n_stops[j++]);
-
- dispatch->glUniform1i(n_stop_uniform_location, count);
- } else {
- dispatch->glUniform4fv(stop_colors_uniform_location, count, stop_colors);
- dispatch->glUniform1fv(stops_uniform_location, count, n_stops);
- dispatch->glUniform1i(n_stop_uniform_location, count);
- }
-
- if (src_picture->pSourcePict->linear.p2.y ==
- src_picture->pSourcePict->linear.p1.y) { // The horizontal case.
- dispatch->glUniform1i(hor_ver_uniform_location, 1);
- DEBUGF("p1.y: %f, p2.y: %f, enter the horizontal case\n",
- pt1[1], pt2[1]);
-
- p1_distance = pt1[0];
- pt_distance = (pt2[0] - p1_distance);
- dispatch->glUniform1f(p1_distance_uniform_location, p1_distance);
- dispatch->glUniform1f(pt_distance_uniform_location, pt_distance);
- } else {
- /* The slope need to compute here. In shader, the viewport set will change
- the orginal slope and the slope which is vertical to it will not be correct.*/
- slope = - (float)(src_picture->pSourcePict->linear.p2.x
- - src_picture->pSourcePict->linear.p1.x) /
- (float)(src_picture->pSourcePict->linear.p2.y
- - src_picture->pSourcePict->linear.p1.y);
- slope = slope * yscale / xscale;
- dispatch->glUniform1f(pt_slope_uniform_location, slope);
- dispatch->glUniform1i(hor_ver_uniform_location, 0);
-
- cos_val = sqrt(1.0 / (slope * slope + 1.0));
- dispatch->glUniform1f(cos_val_uniform_location, cos_val);
-
- p1_distance = (pt1[1] - pt1[0] * slope) * cos_val;
- pt_distance = (pt2[1] - pt2[0] * slope) * cos_val - p1_distance;
- dispatch->glUniform1f(p1_distance_uniform_location, p1_distance);
- dispatch->glUniform1f(pt_distance_uniform_location, pt_distance);
- }
-
- /* Now rendering. */
- dispatch->glDrawArrays(GL_TRIANGLE_STRIP, 0, 4);
-
- /* Do the clear logic.*/
- if (stops_count > LINEAR_SMALL_STOPS) {
- free(n_stops);
- free(stop_colors);
- }
-
- dispatch->glBindBuffer(GL_ARRAY_BUFFER, 0);
- dispatch->glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, 0);
-
- dispatch->glDisableVertexAttribArray(GLAMOR_VERTEX_POS);
- dispatch->glDisableVertexAttribArray(GLAMOR_VERTEX_SOURCE);
- dispatch->glUseProgram(0);
-
- glamor_put_dispatch(glamor_priv);
- return dst_picture;
-
-GRADIENT_FAIL:
- if (dst_picture) {
- FreePicture(dst_picture, 0);
- }
-
- if (stops_count > LINEAR_SMALL_STOPS) {
- if (n_stops)
- free(n_stops);
- if (stop_colors)
- free(stop_colors);
- }
-
- dispatch->glBindBuffer(GL_ARRAY_BUFFER, 0);
- dispatch->glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, 0);
-
- dispatch->glDisableVertexAttribArray(GLAMOR_VERTEX_POS);
- dispatch->glDisableVertexAttribArray(GLAMOR_VERTEX_SOURCE);
- dispatch->glUseProgram(0);
- glamor_put_dispatch(glamor_priv);
- return NULL;
+ glamor_screen_private *glamor_priv;
+ glamor_gl_dispatch *dispatch;
+ PicturePtr dst_picture = NULL;
+ PixmapPtr pixmap = NULL;
+ GLint gradient_prog = 0;
+ int error;
+ float pt_distance;
+ float p1_distance;
+ GLfloat cos_val;
+ float tex_vertices[8];
+ int stops_count = 0;
+ GLfloat *stop_colors = NULL;
+ GLfloat *n_stops = NULL;
+ int count = 0;
+ float slope;
+ GLfloat xscale, yscale;
+ GLfloat pt1[2], pt2[2];
+ float vertices[8];
+ float transform_mat[3][3];
+ static const float identity_mat[3][3] = { {1.0, 0.0, 0.0},
+ {0.0, 1.0, 0.0},
+ {0.0, 0.0, 1.0}
+ };
+ GLfloat stop_colors_st[LINEAR_SMALL_STOPS * 4];
+ GLfloat n_stops_st[LINEAR_SMALL_STOPS];
+
+ GLint transform_mat_uniform_location = 0;
+ GLint n_stop_uniform_location = 0;
+ GLint stops_uniform_location = 0;
+ GLint stop0_uniform_location = 0;
+ GLint stop1_uniform_location = 0;
+ GLint stop2_uniform_location = 0;
+ GLint stop3_uniform_location = 0;
+ GLint stop4_uniform_location = 0;
+ GLint stop5_uniform_location = 0;
+ GLint stop6_uniform_location = 0;
+ GLint stop7_uniform_location = 0;
+ GLint stop_colors_uniform_location = 0;
+ GLint stop_color0_uniform_location = 0;
+ GLint stop_color1_uniform_location = 0;
+ GLint stop_color2_uniform_location = 0;
+ GLint stop_color3_uniform_location = 0;
+ GLint stop_color4_uniform_location = 0;
+ GLint stop_color5_uniform_location = 0;
+ GLint stop_color6_uniform_location = 0;
+ GLint stop_color7_uniform_location = 0;
+ GLint pt_slope_uniform_location = 0;
+ GLint repeat_type_uniform_location = 0;
+ GLint hor_ver_uniform_location = 0;
+ GLint cos_val_uniform_location = 0;
+ GLint p1_distance_uniform_location = 0;
+ GLint pt_distance_uniform_location = 0;
+
+ glamor_priv = glamor_get_screen_private(screen);
+ dispatch = glamor_get_dispatch(glamor_priv);
+
+ /* Create a pixmap with VBO. */
+ pixmap = glamor_create_pixmap(screen,
+ width, height,
+ PIXMAN_FORMAT_DEPTH(format), 0);
+
+ if (!pixmap)
+ goto GRADIENT_FAIL;
+
+ dst_picture = CreatePicture(0, &pixmap->drawable,
+ PictureMatchFormat(screen,
+ PIXMAN_FORMAT_DEPTH(format),
+ format), 0, 0, serverClient,
+ &error);
+
+ /* Release the reference, picture will hold the last one. */
+ glamor_destroy_pixmap(pixmap);
+
+ if (!dst_picture)
+ goto GRADIENT_FAIL;
+
+ ValidatePicture(dst_picture);
+
+ stops_count = src_picture->pSourcePict->linear.nstops + 2;
+
+ /* Because the max value of nstops is unkown, so create a program
+ when nstops > LINEAR_LARGE_STOPS. */
+ if (stops_count <= LINEAR_SMALL_STOPS) {
+ gradient_prog = glamor_priv->gradient_prog[SHADER_GRADIENT_LINEAR][0];
+ }
+ else if (stops_count <= LINEAR_LARGE_STOPS) {
+ gradient_prog = glamor_priv->gradient_prog[SHADER_GRADIENT_LINEAR][1];
+ }
+ else {
+ _glamor_create_linear_gradient_program(screen,
+ src_picture->pSourcePict->linear.
+ nstops + 2, 1);
+ gradient_prog = glamor_priv->gradient_prog[SHADER_GRADIENT_LINEAR][2];
+ }
+
+ /* Bind all the uniform vars . */
+ n_stop_uniform_location =
+ dispatch->glGetUniformLocation(gradient_prog, "n_stop");
+ pt_slope_uniform_location =
+ dispatch->glGetUniformLocation(gradient_prog, "pt_slope");
+ repeat_type_uniform_location =
+ dispatch->glGetUniformLocation(gradient_prog, "repeat_type");
+ hor_ver_uniform_location =
+ dispatch->glGetUniformLocation(gradient_prog, "hor_ver");
+ transform_mat_uniform_location =
+ dispatch->glGetUniformLocation(gradient_prog, "transform_mat");
+ cos_val_uniform_location =
+ dispatch->glGetUniformLocation(gradient_prog, "cos_val");
+ p1_distance_uniform_location =
+ dispatch->glGetUniformLocation(gradient_prog, "p1_distance");
+ pt_distance_uniform_location =
+ dispatch->glGetUniformLocation(gradient_prog, "pt_distance");
+
+ if (src_picture->pSourcePict->linear.nstops + 2 <= LINEAR_SMALL_STOPS) {
+ stop0_uniform_location =
+ dispatch->glGetUniformLocation(gradient_prog, "stop0");
+ stop1_uniform_location =
+ dispatch->glGetUniformLocation(gradient_prog, "stop1");
+ stop2_uniform_location =
+ dispatch->glGetUniformLocation(gradient_prog, "stop2");
+ stop3_uniform_location =
+ dispatch->glGetUniformLocation(gradient_prog, "stop3");
+ stop4_uniform_location =
+ dispatch->glGetUniformLocation(gradient_prog, "stop4");
+ stop5_uniform_location =
+ dispatch->glGetUniformLocation(gradient_prog, "stop5");
+ stop6_uniform_location =
+ dispatch->glGetUniformLocation(gradient_prog, "stop6");
+ stop7_uniform_location =
+ dispatch->glGetUniformLocation(gradient_prog, "stop7");
+
+ stop_color0_uniform_location =
+ dispatch->glGetUniformLocation(gradient_prog, "stop_color0");
+ stop_color1_uniform_location =
+ dispatch->glGetUniformLocation(gradient_prog, "stop_color1");
+ stop_color2_uniform_location =
+ dispatch->glGetUniformLocation(gradient_prog, "stop_color2");
+ stop_color3_uniform_location =
+ dispatch->glGetUniformLocation(gradient_prog, "stop_color3");
+ stop_color4_uniform_location =
+ dispatch->glGetUniformLocation(gradient_prog, "stop_color4");
+ stop_color5_uniform_location =
+ dispatch->glGetUniformLocation(gradient_prog, "stop_color5");
+ stop_color6_uniform_location =
+ dispatch->glGetUniformLocation(gradient_prog, "stop_color6");
+ stop_color7_uniform_location =
+ dispatch->glGetUniformLocation(gradient_prog, "stop_color7");
+ }
+ else {
+ stops_uniform_location =
+ dispatch->glGetUniformLocation(gradient_prog, "stops");
+ stop_colors_uniform_location =
+ dispatch->glGetUniformLocation(gradient_prog, "stop_colors");
+ }
+
+ dispatch->glUseProgram(gradient_prog);
+
+ dispatch->glUniform1i(repeat_type_uniform_location,
+ src_picture->repeatType);
+
+ /* set the transform matrix. */
+ if (src_picture->transform) {
+ _glamor_gradient_convert_trans_matrix(src_picture->transform,
+ transform_mat, width, height, 1);
+ dispatch->glUniformMatrix3fv(transform_mat_uniform_location,
+ 1, 1, &transform_mat[0][0]);
+ }
+ else {
+ dispatch->glUniformMatrix3fv(transform_mat_uniform_location,
+ 1, 1, &identity_mat[0][0]);
+ }
+
+ if (!_glamor_gradient_set_pixmap_destination
+ (screen, glamor_priv, dst_picture, &xscale, &yscale, x_source, y_source,
+ vertices, tex_vertices, 1))
+ goto GRADIENT_FAIL;
+
+ /* Normalize the PTs. */
+ glamor_set_normalize_pt(xscale, yscale,
+ pixman_fixed_to_double(src_picture->pSourcePict->
+ linear.p1.x),
+ pixman_fixed_to_double(src_picture->pSourcePict->
+ linear.p1.y),
+ glamor_priv->yInverted, pt1);
+ DEBUGF("pt1:(%f, %f) ---> (%f %f)\n",
+ pixman_fixed_to_double(src_picture->pSourcePict->linear.p1.x),
+ pixman_fixed_to_double(src_picture->pSourcePict->linear.p1.y),
+ pt1[0], pt1[1]);
+
+ glamor_set_normalize_pt(xscale, yscale,
+ pixman_fixed_to_double(src_picture->pSourcePict->
+ linear.p2.x),
+ pixman_fixed_to_double(src_picture->pSourcePict->
+ linear.p2.y),
+ glamor_priv->yInverted, pt2);
+ DEBUGF("pt2:(%f, %f) ---> (%f %f)\n",
+ pixman_fixed_to_double(src_picture->pSourcePict->linear.p2.x),
+ pixman_fixed_to_double(src_picture->pSourcePict->linear.p2.y),
+ pt2[0], pt2[1]);
+
+ /* Set all the stops and colors to shader. */
+ if (stops_count > LINEAR_SMALL_STOPS) {
+ stop_colors = malloc(4 * stops_count * sizeof(float));
+ if (stop_colors == NULL) {
+ ErrorF("Failed to allocate stop_colors memory.\n");
+ goto GRADIENT_FAIL;
+ }
+
+ n_stops = malloc(stops_count * sizeof(float));
+ if (n_stops == NULL) {
+ ErrorF("Failed to allocate n_stops memory.\n");
+ goto GRADIENT_FAIL;
+ }
+ }
+ else {
+ stop_colors = stop_colors_st;
+ n_stops = n_stops_st;
+ }
+
+ count =
+ _glamor_gradient_set_stops(src_picture,
+ &src_picture->pSourcePict->gradient,
+ stop_colors, n_stops);
+
+ if (src_picture->pSourcePict->linear.nstops + 2 <= LINEAR_SMALL_STOPS) {
+ int j = 0;
+
+ dispatch->glUniform4f(stop_color0_uniform_location,
+ stop_colors[4 * j + 0], stop_colors[4 * j + 1],
+ stop_colors[4 * j + 2], stop_colors[4 * j + 3]);
+ j++;
+ dispatch->glUniform4f(stop_color1_uniform_location,
+ stop_colors[4 * j + 0], stop_colors[4 * j + 1],
+ stop_colors[4 * j + 2], stop_colors[4 * j + 3]);
+ j++;
+ dispatch->glUniform4f(stop_color2_uniform_location,
+ stop_colors[4 * j + 0], stop_colors[4 * j + 1],
+ stop_colors[4 * j + 2], stop_colors[4 * j + 3]);
+ j++;
+ dispatch->glUniform4f(stop_color3_uniform_location,
+ stop_colors[4 * j + 0], stop_colors[4 * j + 1],
+ stop_colors[4 * j + 2], stop_colors[4 * j + 3]);
+ j++;
+ dispatch->glUniform4f(stop_color4_uniform_location,
+ stop_colors[4 * j + 0], stop_colors[4 * j + 1],
+ stop_colors[4 * j + 2], stop_colors[4 * j + 3]);
+ j++;
+ dispatch->glUniform4f(stop_color5_uniform_location,
+ stop_colors[4 * j + 0], stop_colors[4 * j + 1],
+ stop_colors[4 * j + 2], stop_colors[4 * j + 3]);
+ j++;
+ dispatch->glUniform4f(stop_color6_uniform_location,
+ stop_colors[4 * j + 0], stop_colors[4 * j + 1],
+ stop_colors[4 * j + 2], stop_colors[4 * j + 3]);
+ j++;
+ dispatch->glUniform4f(stop_color7_uniform_location,
+ stop_colors[4 * j + 0], stop_colors[4 * j + 1],
+ stop_colors[4 * j + 2], stop_colors[4 * j + 3]);
+
+ j = 0;
+ dispatch->glUniform1f(stop0_uniform_location, n_stops[j++]);
+ dispatch->glUniform1f(stop1_uniform_location, n_stops[j++]);
+ dispatch->glUniform1f(stop2_uniform_location, n_stops[j++]);
+ dispatch->glUniform1f(stop3_uniform_location, n_stops[j++]);
+ dispatch->glUniform1f(stop4_uniform_location, n_stops[j++]);
+ dispatch->glUniform1f(stop5_uniform_location, n_stops[j++]);
+ dispatch->glUniform1f(stop6_uniform_location, n_stops[j++]);
+ dispatch->glUniform1f(stop7_uniform_location, n_stops[j++]);
+
+ dispatch->glUniform1i(n_stop_uniform_location, count);
+ }
+ else {
+ dispatch->glUniform4fv(stop_colors_uniform_location, count,
+ stop_colors);
+ dispatch->glUniform1fv(stops_uniform_location, count, n_stops);
+ dispatch->glUniform1i(n_stop_uniform_location, count);
+ }
+
+ if (src_picture->pSourcePict->linear.p2.y == src_picture->pSourcePict->linear.p1.y) { // The horizontal case.
+ dispatch->glUniform1i(hor_ver_uniform_location, 1);
+ DEBUGF("p1.y: %f, p2.y: %f, enter the horizontal case\n",
+ pt1[1], pt2[1]);
+
+ p1_distance = pt1[0];
+ pt_distance = (pt2[0] - p1_distance);
+ dispatch->glUniform1f(p1_distance_uniform_location, p1_distance);
+ dispatch->glUniform1f(pt_distance_uniform_location, pt_distance);
+ }
+ else {
+ /* The slope need to compute here. In shader, the viewport set will change
+ the orginal slope and the slope which is vertical to it will not be correct. */
+ slope = -(float) (src_picture->pSourcePict->linear.p2.x
+ - src_picture->pSourcePict->linear.p1.x) /
+ (float) (src_picture->pSourcePict->linear.p2.y
+ - src_picture->pSourcePict->linear.p1.y);
+ slope = slope * yscale / xscale;
+ dispatch->glUniform1f(pt_slope_uniform_location, slope);
+ dispatch->glUniform1i(hor_ver_uniform_location, 0);
+
+ cos_val = sqrt(1.0 / (slope * slope + 1.0));
+ dispatch->glUniform1f(cos_val_uniform_location, cos_val);
+
+ p1_distance = (pt1[1] - pt1[0] * slope) * cos_val;
+ pt_distance = (pt2[1] - pt2[0] * slope) * cos_val - p1_distance;
+ dispatch->glUniform1f(p1_distance_uniform_location, p1_distance);
+ dispatch->glUniform1f(pt_distance_uniform_location, pt_distance);
+ }
+
+ /* Now rendering. */
+ dispatch->glDrawArrays(GL_TRIANGLE_STRIP, 0, 4);
+
+ /* Do the clear logic. */
+ if (stops_count > LINEAR_SMALL_STOPS) {
+ free(n_stops);
+ free(stop_colors);
+ }
+
+ dispatch->glBindBuffer(GL_ARRAY_BUFFER, 0);
+ dispatch->glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, 0);
+
+ dispatch->glDisableVertexAttribArray(GLAMOR_VERTEX_POS);
+ dispatch->glDisableVertexAttribArray(GLAMOR_VERTEX_SOURCE);
+ dispatch->glUseProgram(0);
+
+ glamor_put_dispatch(glamor_priv);
+ return dst_picture;
+
+ GRADIENT_FAIL:
+ if (dst_picture) {
+ FreePicture(dst_picture, 0);
+ }
+
+ if (stops_count > LINEAR_SMALL_STOPS) {
+ if (n_stops)
+ free(n_stops);
+ if (stop_colors)
+ free(stop_colors);
+ }
+
+ dispatch->glBindBuffer(GL_ARRAY_BUFFER, 0);
+ dispatch->glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, 0);
+
+ dispatch->glDisableVertexAttribArray(GLAMOR_VERTEX_POS);
+ dispatch->glDisableVertexAttribArray(GLAMOR_VERTEX_SOURCE);
+ dispatch->glUseProgram(0);
+ glamor_put_dispatch(glamor_priv);
+ return NULL;
}
-#endif /* End of GLAMOR_GRADIENT_SHADER */
+#endif /* End of GLAMOR_GRADIENT_SHADER */
-#endif /* End of RENDER */
+#endif /* End of RENDER */
diff --git a/xorg-server/glamor/glamor_largepixmap.c b/xorg-server/glamor/glamor_largepixmap.c
index 91ee8f2df..b8c064038 100644
--- a/xorg-server/glamor/glamor_largepixmap.c
+++ b/xorg-server/glamor/glamor_largepixmap.c
@@ -17,117 +17,117 @@
static glamor_pixmap_clipped_regions *
__glamor_compute_clipped_regions(int block_w,
- int block_h,
- int block_stride,
- int x, int y,
- int w, int h,
- RegionPtr region,
- int *n_region,
- int reverse,
- int upsidedown)
+ int block_h,
+ int block_stride,
+ int x, int y,
+ int w, int h,
+ RegionPtr region,
+ int *n_region, int reverse, int upsidedown)
{
- glamor_pixmap_clipped_regions * clipped_regions;
- BoxPtr extent;
- int start_x, start_y, end_x, end_y;
- int start_block_x, start_block_y;
- int end_block_x, end_block_y;
- int loop_start_block_x, loop_start_block_y;
- int loop_end_block_x, loop_end_block_y;
- int loop_block_stride;
- int i, j, delta_i, delta_j;
- RegionRec temp_region;
- RegionPtr current_region;
- int block_idx;
- int k = 0;
- int temp_block_idx;
-
- extent = RegionExtents(region);
- start_x = MAX(x, extent->x1);
- start_y = MAX(y, extent->y1);
- end_x = MIN(x + w, extent->x2);
- end_y = MIN(y + h, extent->y2);
-
- DEBUGF("start compute clipped regions:\n");
- DEBUGF("block w %d h %d x %d y %d w %d h %d, block_stride %d \n",
- block_w, block_h, x, y, w, h, block_stride);
- DEBUGRegionPrint(region);
-
- DEBUGF("start_x %d start_y %d end_x %d end_y %d \n", start_x, start_y, end_x, end_y);
-
- if (start_x >= end_x || start_y >= end_y) {
- *n_region = 0;
- return NULL;
- }
-
- start_block_x = (start_x - x)/ block_w;
- start_block_y = (start_y - y)/ block_h;
- end_block_x = (end_x - x)/ block_w;
- end_block_y = (end_y - y)/ block_h;
-
- clipped_regions = calloc((end_block_x - start_block_x + 1)
- * (end_block_y - start_block_y + 1),
- sizeof(*clipped_regions));
-
-
- DEBUGF("startx %d starty %d endx %d endy %d \n",
- start_x, start_y, end_x, end_y);
- DEBUGF("start_block_x %d end_block_x %d \n", start_block_x, end_block_x);
- DEBUGF("start_block_y %d end_block_y %d \n", start_block_y, end_block_y);
-
- if (!reverse) {
- loop_start_block_x = start_block_x;
- loop_end_block_x = end_block_x + 1;
- delta_i = 1;
- } else {
- loop_start_block_x = end_block_x;
- loop_end_block_x = start_block_x - 1;
- delta_i = -1;
- }
-
- if (!upsidedown) {
- loop_start_block_y = start_block_y;
- loop_end_block_y = end_block_y + 1;
- delta_j = 1;
- } else {
- loop_start_block_y = end_block_y;
- loop_end_block_y = start_block_y - 1;
- delta_j = -1;
- }
-
- loop_block_stride = delta_j * block_stride;
- block_idx = (loop_start_block_y - delta_j) * block_stride;
-
- for(j = loop_start_block_y; j != loop_end_block_y; j += delta_j)
- {
- block_idx += loop_block_stride;
- temp_block_idx = block_idx + loop_start_block_x;
- for(i = loop_start_block_x;
- i != loop_end_block_x; i += delta_i, temp_block_idx += delta_i)
- {
- BoxRec temp_box;
- temp_box.x1 = x + i * block_w;
- temp_box.y1 = y + j * block_h;
- temp_box.x2 = MIN(temp_box.x1 + block_w, end_x);
- temp_box.y2 = MIN(temp_box.y1 + block_h, end_y);
- RegionInitBoxes(&temp_region, &temp_box, 1);
- DEBUGF("block idx %d \n",temp_block_idx);
- DEBUGRegionPrint(&temp_region);
- current_region = RegionCreate(NULL, 4);
- RegionIntersect(current_region, &temp_region, region);
- DEBUGF("i %d j %d region: \n",i ,j);
- DEBUGRegionPrint(current_region);
- if (RegionNumRects(current_region)) {
- clipped_regions[k].region = current_region;
- clipped_regions[k].block_idx = temp_block_idx;
- k++;
- } else
- RegionDestroy(current_region);
- RegionUninit(&temp_region);
- }
- }
-
- *n_region = k;
- return clipped_regions;
+ glamor_pixmap_clipped_regions *clipped_regions;
+ BoxPtr extent;
+ int start_x, start_y, end_x, end_y;
+ int start_block_x, start_block_y;
+ int end_block_x, end_block_y;
+ int loop_start_block_x, loop_start_block_y;
+ int loop_end_block_x, loop_end_block_y;
+ int loop_block_stride;
+ int i, j, delta_i, delta_j;
+ RegionRec temp_region;
+ RegionPtr current_region;
+ int block_idx;
+ int k = 0;
+ int temp_block_idx;
+
+ extent = RegionExtents(region);
+ start_x = MAX(x, extent->x1);
+ start_y = MAX(y, extent->y1);
+ end_x = MIN(x + w, extent->x2);
+ end_y = MIN(y + h, extent->y2);
+
+ DEBUGF("start compute clipped regions:\n");
+ DEBUGF("block w %d h %d x %d y %d w %d h %d, block_stride %d \n",
+ block_w, block_h, x, y, w, h, block_stride);
+ DEBUGRegionPrint(region);
+
+ DEBUGF("start_x %d start_y %d end_x %d end_y %d \n", start_x, start_y,
+ end_x, end_y);
+
+ if (start_x >= end_x || start_y >= end_y) {
+ *n_region = 0;
+ return NULL;
+ }
+
+ start_block_x = (start_x - x) / block_w;
+ start_block_y = (start_y - y) / block_h;
+ end_block_x = (end_x - x) / block_w;
+ end_block_y = (end_y - y) / block_h;
+
+ clipped_regions = calloc((end_block_x - start_block_x + 1)
+ * (end_block_y - start_block_y + 1),
+ sizeof(*clipped_regions));
+
+ DEBUGF("startx %d starty %d endx %d endy %d \n",
+ start_x, start_y, end_x, end_y);
+ DEBUGF("start_block_x %d end_block_x %d \n", start_block_x, end_block_x);
+ DEBUGF("start_block_y %d end_block_y %d \n", start_block_y, end_block_y);
+
+ if (!reverse) {
+ loop_start_block_x = start_block_x;
+ loop_end_block_x = end_block_x + 1;
+ delta_i = 1;
+ }
+ else {
+ loop_start_block_x = end_block_x;
+ loop_end_block_x = start_block_x - 1;
+ delta_i = -1;
+ }
+
+ if (!upsidedown) {
+ loop_start_block_y = start_block_y;
+ loop_end_block_y = end_block_y + 1;
+ delta_j = 1;
+ }
+ else {
+ loop_start_block_y = end_block_y;
+ loop_end_block_y = start_block_y - 1;
+ delta_j = -1;
+ }
+
+ loop_block_stride = delta_j * block_stride;
+ block_idx = (loop_start_block_y - delta_j) * block_stride;
+
+ for (j = loop_start_block_y; j != loop_end_block_y; j += delta_j) {
+ block_idx += loop_block_stride;
+ temp_block_idx = block_idx + loop_start_block_x;
+ for (i = loop_start_block_x;
+ i != loop_end_block_x; i += delta_i, temp_block_idx += delta_i) {
+ BoxRec temp_box;
+
+ temp_box.x1 = x + i * block_w;
+ temp_box.y1 = y + j * block_h;
+ temp_box.x2 = MIN(temp_box.x1 + block_w, end_x);
+ temp_box.y2 = MIN(temp_box.y1 + block_h, end_y);
+ RegionInitBoxes(&temp_region, &temp_box, 1);
+ DEBUGF("block idx %d \n", temp_block_idx);
+ DEBUGRegionPrint(&temp_region);
+ current_region = RegionCreate(NULL, 4);
+ RegionIntersect(current_region, &temp_region, region);
+ DEBUGF("i %d j %d region: \n", i, j);
+ DEBUGRegionPrint(current_region);
+ if (RegionNumRects(current_region)) {
+ clipped_regions[k].region = current_region;
+ clipped_regions[k].block_idx = temp_block_idx;
+ k++;
+ }
+ else
+ RegionDestroy(current_region);
+ RegionUninit(&temp_region);
+ }
+ }
+
+ *n_region = k;
+ return clipped_regions;
}
/**
@@ -145,82 +145,87 @@ __glamor_compute_clipped_regions(int block_w,
glamor_pixmap_clipped_regions *
glamor_compute_clipped_regions_ext(glamor_pixmap_private *pixmap_priv,
- RegionPtr region,
- int *n_region,
- int inner_block_w, int inner_block_h,
- int reverse, int upsidedown)
+ RegionPtr region,
+ int *n_region,
+ int inner_block_w, int inner_block_h,
+ int reverse, int upsidedown)
{
- glamor_pixmap_clipped_regions * clipped_regions, *inner_regions, *result_regions;
- int i, j, x, y, k, inner_n_regions;
- int width, height;
- glamor_pixmap_private_large_t *priv;
- priv = &pixmap_priv->large;
-
- DEBUGF("ext called \n");
-
- if (pixmap_priv->type != GLAMOR_TEXTURE_LARGE) {
- clipped_regions = calloc(1, sizeof(*clipped_regions));
- if (clipped_regions == NULL) {
- *n_region = 0;
- return NULL;
- }
- clipped_regions[0].region = RegionCreate(NULL, 1);
- clipped_regions[0].block_idx = 0;
- RegionCopy(clipped_regions[0].region, region);
- *n_region = 1;
- priv->block_w = priv->base.pixmap->drawable.width;
- priv->block_h = priv->base.pixmap->drawable.height;
- priv->box_array = &priv->box;
- priv->box.x1 = priv->box.y1 = 0;
- priv->box.x2 = priv->block_w;
- priv->box.y2 = priv->block_h;
- } else {
- clipped_regions = __glamor_compute_clipped_regions(priv->block_w,
- priv->block_h,
- priv->block_wcnt,
- 0, 0,
- priv->base.pixmap->drawable.width,
- priv->base.pixmap->drawable.height,
- region, n_region, reverse, upsidedown
- );
-
- if (clipped_regions == NULL) {
- *n_region = 0;
- return NULL;
- }
- }
- if (inner_block_w >= priv->block_w
- && inner_block_h >= priv->block_h)
- return clipped_regions;
- result_regions = calloc(*n_region
- * ((priv->block_w + inner_block_w - 1)/inner_block_w)
- * ((priv->block_h + inner_block_h - 1)/ inner_block_h),
- sizeof(*result_regions));
- k = 0;
- for(i = 0; i < *n_region; i++)
- {
- x = priv->box_array[clipped_regions[i].block_idx].x1;
- y = priv->box_array[clipped_regions[i].block_idx].y1;
- width = priv->box_array[clipped_regions[i].block_idx].x2 - x;
- height = priv->box_array[clipped_regions[i].block_idx].y2 - y;
- inner_regions = __glamor_compute_clipped_regions(inner_block_w,
- inner_block_h,
- 0, x, y,
- width,
- height,
- clipped_regions[i].region,
- &inner_n_regions, reverse, upsidedown);
- for(j = 0; j < inner_n_regions; j++)
- {
- result_regions[k].region = inner_regions[j].region;
- result_regions[k].block_idx = clipped_regions[i].block_idx;
- k++;
- }
- free(inner_regions);
- }
- *n_region = k;
- free(clipped_regions);
- return result_regions;
+ glamor_pixmap_clipped_regions *clipped_regions, *inner_regions,
+ *result_regions;
+ int i, j, x, y, k, inner_n_regions;
+ int width, height;
+ glamor_pixmap_private_large_t *priv;
+
+ priv = &pixmap_priv->large;
+
+ DEBUGF("ext called \n");
+
+ if (pixmap_priv->type != GLAMOR_TEXTURE_LARGE) {
+ clipped_regions = calloc(1, sizeof(*clipped_regions));
+ if (clipped_regions == NULL) {
+ *n_region = 0;
+ return NULL;
+ }
+ clipped_regions[0].region = RegionCreate(NULL, 1);
+ clipped_regions[0].block_idx = 0;
+ RegionCopy(clipped_regions[0].region, region);
+ *n_region = 1;
+ priv->block_w = priv->base.pixmap->drawable.width;
+ priv->block_h = priv->base.pixmap->drawable.height;
+ priv->box_array = &priv->box;
+ priv->box.x1 = priv->box.y1 = 0;
+ priv->box.x2 = priv->block_w;
+ priv->box.y2 = priv->block_h;
+ }
+ else {
+ clipped_regions = __glamor_compute_clipped_regions(priv->block_w,
+ priv->block_h,
+ priv->block_wcnt,
+ 0, 0,
+ priv->base.pixmap->
+ drawable.width,
+ priv->base.pixmap->
+ drawable.height,
+ region, n_region,
+ reverse, upsidedown);
+
+ if (clipped_regions == NULL) {
+ *n_region = 0;
+ return NULL;
+ }
+ }
+ if (inner_block_w >= priv->block_w && inner_block_h >= priv->block_h)
+ return clipped_regions;
+ result_regions = calloc(*n_region
+ * ((priv->block_w + inner_block_w - 1) /
+ inner_block_w)
+ * ((priv->block_h + inner_block_h - 1) /
+ inner_block_h), sizeof(*result_regions));
+ k = 0;
+ for (i = 0; i < *n_region; i++) {
+ x = priv->box_array[clipped_regions[i].block_idx].x1;
+ y = priv->box_array[clipped_regions[i].block_idx].y1;
+ width = priv->box_array[clipped_regions[i].block_idx].x2 - x;
+ height = priv->box_array[clipped_regions[i].block_idx].y2 - y;
+ inner_regions = __glamor_compute_clipped_regions(inner_block_w,
+ inner_block_h,
+ 0, x, y,
+ width,
+ height,
+ clipped_regions[i].
+ region,
+ &inner_n_regions,
+ reverse, upsidedown);
+ for (j = 0; j < inner_n_regions; j++) {
+ result_regions[k].region = inner_regions[j].region;
+ result_regions[k].block_idx = clipped_regions[i].block_idx;
+ k++;
+ }
+ free(inner_regions);
+ }
+ *n_region = k;
+ free(clipped_regions);
+ return result_regions;
}
/*
@@ -232,35 +237,36 @@ glamor_compute_clipped_regions_ext(glamor_pixmap_private *pixmap_priv,
static RegionPtr
_glamor_convert_pad_region(RegionPtr region, int w, int h)
{
- RegionPtr pad_region;
- int nrect;
- BoxPtr box;
- int overlap;
-
- nrect = RegionNumRects(region);
- box = RegionRects(region);
- pad_region = RegionCreate(NULL, 4);
- if (pad_region == NULL)
- return NULL;
- while(nrect--) {
- BoxRec pad_box;
- RegionRec temp_region;
- pad_box = *box;
- if (pad_box.x1 < 0 && pad_box.x2 <= 0)
- pad_box.x2 = 1;
- else if (pad_box.x1 >= w && pad_box.x2 > w)
- pad_box.x1 = w - 1;
- if (pad_box.y1 < 0 && pad_box.y2 <=0)
- pad_box.y2 = 1;
- else if (pad_box.y1 >= h && pad_box.y2 > h)
- pad_box.y1 = h - 1;
- RegionInitBoxes(&temp_region, &pad_box, 1);
- RegionAppend(pad_region, &temp_region);
- RegionUninit(&temp_region);
- box++;
- }
- RegionValidate(pad_region, &overlap);
- return pad_region;
+ RegionPtr pad_region;
+ int nrect;
+ BoxPtr box;
+ int overlap;
+
+ nrect = RegionNumRects(region);
+ box = RegionRects(region);
+ pad_region = RegionCreate(NULL, 4);
+ if (pad_region == NULL)
+ return NULL;
+ while (nrect--) {
+ BoxRec pad_box;
+ RegionRec temp_region;
+
+ pad_box = *box;
+ if (pad_box.x1 < 0 && pad_box.x2 <= 0)
+ pad_box.x2 = 1;
+ else if (pad_box.x1 >= w && pad_box.x2 > w)
+ pad_box.x1 = w - 1;
+ if (pad_box.y1 < 0 && pad_box.y2 <= 0)
+ pad_box.y2 = 1;
+ else if (pad_box.y1 >= h && pad_box.y2 > h)
+ pad_box.y1 = h - 1;
+ RegionInitBoxes(&temp_region, &pad_box, 1);
+ RegionAppend(pad_region, &temp_region);
+ RegionUninit(&temp_region);
+ box++;
+ }
+ RegionValidate(pad_region, &overlap);
+ return pad_region;
}
/*
@@ -278,32 +284,35 @@ _glamor_convert_pad_region(RegionPtr region, int w, int h)
static void
_glamor_largepixmap_reflect_fixup(short *xy1, short *xy2, int wh)
{
- int odd1, odd2;
- int c1, c2;
-
- if (*xy2 - *xy1 > wh) {
- *xy1 = 0;
- *xy2 = wh;
- return;
- }
- modulus(*xy1, wh, c1);
- odd1 = ((*xy1 - c1) / wh) & 0x1;
- modulus(*xy2, wh, c2);
- odd2 = ((*xy2 - c2) / wh) & 0x1;
-
- if (odd1 && odd2) {
- *xy1 = wh - c2;
- *xy2 = wh - c1;
- } else if (odd1 && !odd2) {
- *xy1 = 0;
- *xy2 = MAX(c2, wh - c1);
- } else if (!odd1 && odd2) {
- *xy2 = wh;
- *xy1 = MIN(c1, wh - c2);
- } else {
- *xy1 = c1;
- *xy2 = c2;
- }
+ int odd1, odd2;
+ int c1, c2;
+
+ if (*xy2 - *xy1 > wh) {
+ *xy1 = 0;
+ *xy2 = wh;
+ return;
+ }
+ modulus(*xy1, wh, c1);
+ odd1 = ((*xy1 - c1) / wh) & 0x1;
+ modulus(*xy2, wh, c2);
+ odd2 = ((*xy2 - c2) / wh) & 0x1;
+
+ if (odd1 && odd2) {
+ *xy1 = wh - c2;
+ *xy2 = wh - c1;
+ }
+ else if (odd1 && !odd2) {
+ *xy1 = 0;
+ *xy2 = MAX(c2, wh - c1);
+ }
+ else if (!odd1 && odd2) {
+ *xy2 = wh;
+ *xy1 = MIN(c1, wh - c2);
+ }
+ else {
+ *xy1 = c1;
+ *xy2 = c2;
+ }
}
/**
@@ -317,366 +326,404 @@ _glamor_largepixmap_reflect_fixup(short *xy1, short *xy2, int wh)
*/
static glamor_pixmap_clipped_regions *
_glamor_compute_clipped_regions(glamor_pixmap_private *pixmap_priv,
- RegionPtr region, int *n_region,
- int repeat_type, int is_transform,
- int reverse, int upsidedown)
+ RegionPtr region, int *n_region,
+ int repeat_type, int is_transform,
+ int reverse, int upsidedown)
{
- glamor_pixmap_clipped_regions * clipped_regions;
- BoxPtr extent;
- int i, j;
- RegionPtr current_region;
- int pixmap_width, pixmap_height;
- int m;
- BoxRec repeat_box;
- RegionRec repeat_region;
- int right_shift = 0;
- int down_shift = 0;
- int x_center_shift = 0, y_center_shift = 0;
- glamor_pixmap_private_large_t *priv;
- priv = &pixmap_priv->large;
-
- DEBUGRegionPrint(region);
- if (pixmap_priv->type != GLAMOR_TEXTURE_LARGE) {
- clipped_regions = calloc(1, sizeof(*clipped_regions));
- clipped_regions[0].region = RegionCreate(NULL, 1);
- clipped_regions[0].block_idx = 0;
- RegionCopy(clipped_regions[0].region, region);
- *n_region = 1;
- return clipped_regions;
- }
-
- pixmap_width = priv->base.pixmap->drawable.width;
- pixmap_height = priv->base.pixmap->drawable.height;
- if (repeat_type == 0 || repeat_type == RepeatPad) {
- RegionPtr saved_region = NULL;
- if (repeat_type == RepeatPad) {
- saved_region = region;
- region = _glamor_convert_pad_region(saved_region, pixmap_width, pixmap_height);
- if (region == NULL) {
- *n_region = 0;
- return NULL;
- }
- }
- clipped_regions = __glamor_compute_clipped_regions(priv->block_w,
- priv->block_h,
- priv->block_wcnt,
- 0, 0,
- priv->base.pixmap->drawable.width,
- priv->base.pixmap->drawable.height,
- region, n_region, reverse, upsidedown
- );
- if (saved_region)
- RegionDestroy(region);
- return clipped_regions;
- }
- extent = RegionExtents(region);
-
- x_center_shift = extent->x1 / pixmap_width;
- if (x_center_shift < 0)
- x_center_shift--;
- if (abs(x_center_shift) & 1)
- x_center_shift++;
- y_center_shift = extent->y1 / pixmap_height;
- if (y_center_shift < 0)
- y_center_shift--;
- if (abs(y_center_shift) & 1)
- y_center_shift++;
-
- if (extent->x1 < 0)
- right_shift = ((-extent->x1 + pixmap_width - 1) / pixmap_width );
- if (extent->y1 < 0)
- down_shift = ((-extent->y1 + pixmap_height - 1) / pixmap_height );
-
- if (right_shift != 0 || down_shift != 0) {
- if (repeat_type == RepeatReflect) {
- right_shift = (right_shift + 1)&~1;
- down_shift = (down_shift + 1)&~1;
- }
- RegionTranslate(region, right_shift * pixmap_width, down_shift * pixmap_height);
- }
-
- extent = RegionExtents(region);
- /* Tile a large pixmap to another large pixmap.
- * We can't use the target large pixmap as the
- * loop variable, instead we need to loop for all
- * the blocks in the tile pixmap.
- *
- * simulate repeat each single block to cover the
- * target's blocks. Two special case:
- * a block_wcnt == 1 or block_hcnt ==1, then we
- * only need to loop one direction as the other
- * direction is fully included in the first block.
- *
- * For the other cases, just need to start
- * from a proper shiftx/shifty, and then increase
- * y by tile_height each time to walk trhough the
- * target block and then walk trhough the target
- * at x direction by increate tile_width each time.
- *
- * This way, we can consolidate all the sub blocks
- * of the target boxes into one tile source's block.
- *
- * */
- m = 0;
- clipped_regions = calloc(priv->block_wcnt * priv->block_hcnt,
- sizeof(*clipped_regions));
- if (clipped_regions == NULL) {
- *n_region = 0;
- return NULL;
- }
- if (right_shift != 0 || down_shift != 0) {
- DEBUGF("region to be repeated shifted \n");
- DEBUGRegionPrint(region);
- }
- DEBUGF("repeat pixmap width %d height %d \n", pixmap_width, pixmap_height);
- DEBUGF("extent x1 %d y1 %d x2 %d y2 %d \n", extent->x1, extent->y1, extent->x2, extent->y2);
- for(j = 0; j < priv->block_hcnt; j++)
- {
- for(i = 0; i < priv->block_wcnt; i++)
- {
- int dx = pixmap_width;
- int dy = pixmap_height;
- int idx;
- int shift_x;
- int shift_y;
- int saved_y1, saved_y2;
- int x_idx = 0, y_idx = 0, saved_y_idx = 0;
- RegionRec temp_region;
- BoxRec reflect_repeat_box;
- BoxPtr valid_repeat_box;
-
- shift_x = (extent->x1 / pixmap_width) * pixmap_width;
- shift_y = (extent->y1 / pixmap_height) * pixmap_height;
- idx = j * priv->block_wcnt + i;
- if (repeat_type == RepeatReflect) {
- x_idx = (extent->x1 / pixmap_width);
- y_idx = (extent->y1 / pixmap_height);
- }
-
- /* Construct a rect to clip the target region. */
- repeat_box.x1 = shift_x + priv->box_array[idx].x1;
- repeat_box.y1 = shift_y + priv->box_array[idx].y1;
- if (priv->block_wcnt == 1) {
- repeat_box.x2 = extent->x2;
- dx = extent->x2 - repeat_box.x1;
- } else
- repeat_box.x2 = shift_x + priv->box_array[idx].x2;
- if (priv->block_hcnt == 1) {
- repeat_box.y2 = extent->y2;
- dy = extent->y2 - repeat_box.y1;
- } else
- repeat_box.y2 = shift_y + priv->box_array[idx].y2;
-
- current_region = RegionCreate(NULL, 4);
- RegionInit(&temp_region, NULL, 4);
- DEBUGF("init repeat box %d %d %d %d \n",
- repeat_box.x1, repeat_box.y1, repeat_box.x2, repeat_box.y2);
-
- if (repeat_type == RepeatNormal) {
- saved_y1 = repeat_box.y1;
- saved_y2 = repeat_box.y2;
- for(; repeat_box.x1 < extent->x2;
- repeat_box.x1 += dx, repeat_box.x2 += dx)
- {
- repeat_box.y1 = saved_y1;
- repeat_box.y2 = saved_y2;
- for( repeat_box.y1 = saved_y1, repeat_box.y2 = saved_y2;
- repeat_box.y1 < extent->y2;
- repeat_box.y1 += dy, repeat_box.y2 += dy)
- {
-
- RegionInitBoxes(&repeat_region, &repeat_box, 1);
- DEBUGF("Start to clip repeat region: \n");
- DEBUGRegionPrint(&repeat_region);
- RegionIntersect(&temp_region, &repeat_region, region);
- DEBUGF("clip result:\n");
- DEBUGRegionPrint(&temp_region);
- RegionAppend(current_region, &temp_region);
- RegionUninit(&repeat_region);
- }
- }
- } else if (repeat_type == RepeatReflect) {
- saved_y1 = repeat_box.y1;
- saved_y2 = repeat_box.y2;
- saved_y_idx = y_idx;
- for(; ; repeat_box.x1 += dx, repeat_box.x2 += dx)
- {
- repeat_box.y1 = saved_y1;
- repeat_box.y2 = saved_y2;
- y_idx = saved_y_idx;
- reflect_repeat_box.x1 = (x_idx & 1) ?
- ((2 * x_idx + 1) * dx - repeat_box.x2) : repeat_box.x1;
- reflect_repeat_box.x2 = (x_idx & 1) ?
- ((2 * x_idx + 1) * dx - repeat_box.x1) : repeat_box.x2;
- valid_repeat_box = &reflect_repeat_box;
-
- if (valid_repeat_box->x1 >= extent->x2)
- break;
- for( repeat_box.y1 = saved_y1, repeat_box.y2 = saved_y2;
- ;
- repeat_box.y1 += dy, repeat_box.y2 += dy)
- {
-
- DEBUGF("x_idx %d y_idx %d dx %d dy %d\n", x_idx, y_idx, dx, dy);
- DEBUGF("repeat box %d %d %d %d \n",
- repeat_box.x1, repeat_box.y1, repeat_box.x2, repeat_box.y2);
-
- if (priv->block_hcnt > 1) {
- reflect_repeat_box.y1 = (y_idx & 1) ?
- ((2 * y_idx + 1) * dy - repeat_box.y2) : repeat_box.y1;
- reflect_repeat_box.y2 = (y_idx & 1) ?
- ((2 * y_idx + 1) * dy - repeat_box.y1) : repeat_box.y2;
- } else {
- reflect_repeat_box.y1 = repeat_box.y1;
- reflect_repeat_box.y2 = repeat_box.y2;
- }
-
- DEBUGF("valid_repeat_box x1 %d y1 %d \n",
- valid_repeat_box->x1, valid_repeat_box->y1);
- if (valid_repeat_box->y1 >= extent->y2)
- break;
- RegionInitBoxes(&repeat_region, valid_repeat_box, 1);
- DEBUGF("start to clip repeat[reflect] region: \n");
- DEBUGRegionPrint(&repeat_region);
- RegionIntersect(&temp_region, &repeat_region, region);
- DEBUGF("result:\n");
- DEBUGRegionPrint(&temp_region);
- if (is_transform && RegionNumRects(&temp_region)) {
- BoxRec temp_box;
- BoxPtr temp_extent;
- temp_extent = RegionExtents(&temp_region);
- if (priv->block_wcnt > 1) {
- if (x_idx & 1) {
- temp_box.x1 = ((2 * x_idx + 1)*dx - temp_extent->x2);
- temp_box.x2 = ((2 * x_idx + 1)*dx - temp_extent->x1);
- } else {
- temp_box.x1 = temp_extent->x1;
- temp_box.x2 = temp_extent->x2;
- }
- modulus(temp_box.x1, pixmap_width, temp_box.x1);
- modulus(temp_box.x2, pixmap_width, temp_box.x2);
- if (temp_box.x2 == 0) temp_box.x2 = pixmap_width;
- } else {
- temp_box.x1 = temp_extent->x1;
- temp_box.x2 = temp_extent->x2;
- _glamor_largepixmap_reflect_fixup(&temp_box.x1, &temp_box.x2, pixmap_width);
- }
-
- if (priv->block_hcnt > 1) {
- if (y_idx & 1) {
- temp_box.y1 = ((2 * y_idx + 1)*dy - temp_extent->y2);
- temp_box.y2 = ((2 * y_idx + 1)*dy - temp_extent->y1);
- } else {
- temp_box.y1 = temp_extent->y1;
- temp_box.y2 = temp_extent->y2;
- }
-
- modulus(temp_box.y1, pixmap_height, temp_box.y1);
- modulus(temp_box.y2, pixmap_height, temp_box.y2);
- if (temp_box.y2 == 0) temp_box.y2 = pixmap_height;
- } else {
- temp_box.y1 = temp_extent->y1;
- temp_box.y2 = temp_extent->y2;
- _glamor_largepixmap_reflect_fixup(&temp_box.y1, &temp_box.y2, pixmap_height);
- }
-
- RegionInitBoxes(&temp_region, &temp_box, 1);
- RegionTranslate(&temp_region, x_center_shift * pixmap_width, y_center_shift * pixmap_height);
- DEBUGF("for transform result:\n");
- DEBUGRegionPrint(&temp_region);
- }
- RegionAppend(current_region, &temp_region);
- RegionUninit(&repeat_region);
- y_idx++;
- }
- x_idx++;
- }
- }
- DEBUGF("dx %d dy %d \n", dx, dy);
-
- if (RegionNumRects(current_region)) {
-
- if ((right_shift != 0 || down_shift != 0) && !(is_transform && repeat_type == RepeatReflect))
- RegionTranslate(current_region,
- -right_shift * pixmap_width,
- -down_shift * pixmap_height);
- clipped_regions[m].region = current_region;
- clipped_regions[m].block_idx = idx;
- m++;
- } else
- RegionDestroy(current_region);
- RegionUninit(&temp_region);
- }
- }
-
- if (right_shift != 0 || down_shift != 0)
- RegionTranslate(region, -right_shift * pixmap_width, -down_shift * pixmap_height);
- *n_region = m;
-
- return clipped_regions;
+ glamor_pixmap_clipped_regions *clipped_regions;
+ BoxPtr extent;
+ int i, j;
+ RegionPtr current_region;
+ int pixmap_width, pixmap_height;
+ int m;
+ BoxRec repeat_box;
+ RegionRec repeat_region;
+ int right_shift = 0;
+ int down_shift = 0;
+ int x_center_shift = 0, y_center_shift = 0;
+ glamor_pixmap_private_large_t *priv;
+
+ priv = &pixmap_priv->large;
+
+ DEBUGRegionPrint(region);
+ if (pixmap_priv->type != GLAMOR_TEXTURE_LARGE) {
+ clipped_regions = calloc(1, sizeof(*clipped_regions));
+ clipped_regions[0].region = RegionCreate(NULL, 1);
+ clipped_regions[0].block_idx = 0;
+ RegionCopy(clipped_regions[0].region, region);
+ *n_region = 1;
+ return clipped_regions;
+ }
+
+ pixmap_width = priv->base.pixmap->drawable.width;
+ pixmap_height = priv->base.pixmap->drawable.height;
+ if (repeat_type == 0 || repeat_type == RepeatPad) {
+ RegionPtr saved_region = NULL;
+
+ if (repeat_type == RepeatPad) {
+ saved_region = region;
+ region =
+ _glamor_convert_pad_region(saved_region, pixmap_width,
+ pixmap_height);
+ if (region == NULL) {
+ *n_region = 0;
+ return NULL;
+ }
+ }
+ clipped_regions = __glamor_compute_clipped_regions(priv->block_w,
+ priv->block_h,
+ priv->block_wcnt,
+ 0, 0,
+ priv->base.pixmap->
+ drawable.width,
+ priv->base.pixmap->
+ drawable.height,
+ region, n_region,
+ reverse, upsidedown);
+ if (saved_region)
+ RegionDestroy(region);
+ return clipped_regions;
+ }
+ extent = RegionExtents(region);
+
+ x_center_shift = extent->x1 / pixmap_width;
+ if (x_center_shift < 0)
+ x_center_shift--;
+ if (abs(x_center_shift) & 1)
+ x_center_shift++;
+ y_center_shift = extent->y1 / pixmap_height;
+ if (y_center_shift < 0)
+ y_center_shift--;
+ if (abs(y_center_shift) & 1)
+ y_center_shift++;
+
+ if (extent->x1 < 0)
+ right_shift = ((-extent->x1 + pixmap_width - 1) / pixmap_width);
+ if (extent->y1 < 0)
+ down_shift = ((-extent->y1 + pixmap_height - 1) / pixmap_height);
+
+ if (right_shift != 0 || down_shift != 0) {
+ if (repeat_type == RepeatReflect) {
+ right_shift = (right_shift + 1) & ~1;
+ down_shift = (down_shift + 1) & ~1;
+ }
+ RegionTranslate(region, right_shift * pixmap_width,
+ down_shift * pixmap_height);
+ }
+
+ extent = RegionExtents(region);
+ /* Tile a large pixmap to another large pixmap.
+ * We can't use the target large pixmap as the
+ * loop variable, instead we need to loop for all
+ * the blocks in the tile pixmap.
+ *
+ * simulate repeat each single block to cover the
+ * target's blocks. Two special case:
+ * a block_wcnt == 1 or block_hcnt ==1, then we
+ * only need to loop one direction as the other
+ * direction is fully included in the first block.
+ *
+ * For the other cases, just need to start
+ * from a proper shiftx/shifty, and then increase
+ * y by tile_height each time to walk trhough the
+ * target block and then walk trhough the target
+ * at x direction by increate tile_width each time.
+ *
+ * This way, we can consolidate all the sub blocks
+ * of the target boxes into one tile source's block.
+ *
+ * */
+ m = 0;
+ clipped_regions = calloc(priv->block_wcnt * priv->block_hcnt,
+ sizeof(*clipped_regions));
+ if (clipped_regions == NULL) {
+ *n_region = 0;
+ return NULL;
+ }
+ if (right_shift != 0 || down_shift != 0) {
+ DEBUGF("region to be repeated shifted \n");
+ DEBUGRegionPrint(region);
+ }
+ DEBUGF("repeat pixmap width %d height %d \n", pixmap_width, pixmap_height);
+ DEBUGF("extent x1 %d y1 %d x2 %d y2 %d \n", extent->x1, extent->y1,
+ extent->x2, extent->y2);
+ for (j = 0; j < priv->block_hcnt; j++) {
+ for (i = 0; i < priv->block_wcnt; i++) {
+ int dx = pixmap_width;
+ int dy = pixmap_height;
+ int idx;
+ int shift_x;
+ int shift_y;
+ int saved_y1, saved_y2;
+ int x_idx = 0, y_idx = 0, saved_y_idx = 0;
+ RegionRec temp_region;
+ BoxRec reflect_repeat_box;
+ BoxPtr valid_repeat_box;
+
+ shift_x = (extent->x1 / pixmap_width) * pixmap_width;
+ shift_y = (extent->y1 / pixmap_height) * pixmap_height;
+ idx = j * priv->block_wcnt + i;
+ if (repeat_type == RepeatReflect) {
+ x_idx = (extent->x1 / pixmap_width);
+ y_idx = (extent->y1 / pixmap_height);
+ }
+
+ /* Construct a rect to clip the target region. */
+ repeat_box.x1 = shift_x + priv->box_array[idx].x1;
+ repeat_box.y1 = shift_y + priv->box_array[idx].y1;
+ if (priv->block_wcnt == 1) {
+ repeat_box.x2 = extent->x2;
+ dx = extent->x2 - repeat_box.x1;
+ }
+ else
+ repeat_box.x2 = shift_x + priv->box_array[idx].x2;
+ if (priv->block_hcnt == 1) {
+ repeat_box.y2 = extent->y2;
+ dy = extent->y2 - repeat_box.y1;
+ }
+ else
+ repeat_box.y2 = shift_y + priv->box_array[idx].y2;
+
+ current_region = RegionCreate(NULL, 4);
+ RegionInit(&temp_region, NULL, 4);
+ DEBUGF("init repeat box %d %d %d %d \n",
+ repeat_box.x1, repeat_box.y1, repeat_box.x2, repeat_box.y2);
+
+ if (repeat_type == RepeatNormal) {
+ saved_y1 = repeat_box.y1;
+ saved_y2 = repeat_box.y2;
+ for (; repeat_box.x1 < extent->x2;
+ repeat_box.x1 += dx, repeat_box.x2 += dx) {
+ repeat_box.y1 = saved_y1;
+ repeat_box.y2 = saved_y2;
+ for (repeat_box.y1 = saved_y1, repeat_box.y2 = saved_y2;
+ repeat_box.y1 < extent->y2;
+ repeat_box.y1 += dy, repeat_box.y2 += dy) {
+
+ RegionInitBoxes(&repeat_region, &repeat_box, 1);
+ DEBUGF("Start to clip repeat region: \n");
+ DEBUGRegionPrint(&repeat_region);
+ RegionIntersect(&temp_region, &repeat_region, region);
+ DEBUGF("clip result:\n");
+ DEBUGRegionPrint(&temp_region);
+ RegionAppend(current_region, &temp_region);
+ RegionUninit(&repeat_region);
+ }
+ }
+ }
+ else if (repeat_type == RepeatReflect) {
+ saved_y1 = repeat_box.y1;
+ saved_y2 = repeat_box.y2;
+ saved_y_idx = y_idx;
+ for (;; repeat_box.x1 += dx, repeat_box.x2 += dx) {
+ repeat_box.y1 = saved_y1;
+ repeat_box.y2 = saved_y2;
+ y_idx = saved_y_idx;
+ reflect_repeat_box.x1 = (x_idx & 1) ?
+ ((2 * x_idx + 1) * dx - repeat_box.x2) : repeat_box.x1;
+ reflect_repeat_box.x2 = (x_idx & 1) ?
+ ((2 * x_idx + 1) * dx - repeat_box.x1) : repeat_box.x2;
+ valid_repeat_box = &reflect_repeat_box;
+
+ if (valid_repeat_box->x1 >= extent->x2)
+ break;
+ for (repeat_box.y1 = saved_y1, repeat_box.y2 = saved_y2;;
+ repeat_box.y1 += dy, repeat_box.y2 += dy) {
+
+ DEBUGF("x_idx %d y_idx %d dx %d dy %d\n", x_idx, y_idx,
+ dx, dy);
+ DEBUGF("repeat box %d %d %d %d \n", repeat_box.x1,
+ repeat_box.y1, repeat_box.x2, repeat_box.y2);
+
+ if (priv->block_hcnt > 1) {
+ reflect_repeat_box.y1 = (y_idx & 1) ?
+ ((2 * y_idx + 1) * dy -
+ repeat_box.y2) : repeat_box.y1;
+ reflect_repeat_box.y2 =
+ (y_idx & 1) ? ((2 * y_idx + 1) * dy -
+ repeat_box.y1) : repeat_box.y2;
+ }
+ else {
+ reflect_repeat_box.y1 = repeat_box.y1;
+ reflect_repeat_box.y2 = repeat_box.y2;
+ }
+
+ DEBUGF("valid_repeat_box x1 %d y1 %d \n",
+ valid_repeat_box->x1, valid_repeat_box->y1);
+ if (valid_repeat_box->y1 >= extent->y2)
+ break;
+ RegionInitBoxes(&repeat_region, valid_repeat_box, 1);
+ DEBUGF("start to clip repeat[reflect] region: \n");
+ DEBUGRegionPrint(&repeat_region);
+ RegionIntersect(&temp_region, &repeat_region, region);
+ DEBUGF("result:\n");
+ DEBUGRegionPrint(&temp_region);
+ if (is_transform && RegionNumRects(&temp_region)) {
+ BoxRec temp_box;
+ BoxPtr temp_extent;
+
+ temp_extent = RegionExtents(&temp_region);
+ if (priv->block_wcnt > 1) {
+ if (x_idx & 1) {
+ temp_box.x1 =
+ ((2 * x_idx + 1) * dx -
+ temp_extent->x2);
+ temp_box.x2 =
+ ((2 * x_idx + 1) * dx -
+ temp_extent->x1);
+ }
+ else {
+ temp_box.x1 = temp_extent->x1;
+ temp_box.x2 = temp_extent->x2;
+ }
+ modulus(temp_box.x1, pixmap_width, temp_box.x1);
+ modulus(temp_box.x2, pixmap_width, temp_box.x2);
+ if (temp_box.x2 == 0)
+ temp_box.x2 = pixmap_width;
+ }
+ else {
+ temp_box.x1 = temp_extent->x1;
+ temp_box.x2 = temp_extent->x2;
+ _glamor_largepixmap_reflect_fixup(&temp_box.x1,
+ &temp_box.x2,
+ pixmap_width);
+ }
+
+ if (priv->block_hcnt > 1) {
+ if (y_idx & 1) {
+ temp_box.y1 =
+ ((2 * y_idx + 1) * dy -
+ temp_extent->y2);
+ temp_box.y2 =
+ ((2 * y_idx + 1) * dy -
+ temp_extent->y1);
+ }
+ else {
+ temp_box.y1 = temp_extent->y1;
+ temp_box.y2 = temp_extent->y2;
+ }
+
+ modulus(temp_box.y1, pixmap_height,
+ temp_box.y1);
+ modulus(temp_box.y2, pixmap_height,
+ temp_box.y2);
+ if (temp_box.y2 == 0)
+ temp_box.y2 = pixmap_height;
+ }
+ else {
+ temp_box.y1 = temp_extent->y1;
+ temp_box.y2 = temp_extent->y2;
+ _glamor_largepixmap_reflect_fixup(&temp_box.y1,
+ &temp_box.y2,
+ pixmap_height);
+ }
+
+ RegionInitBoxes(&temp_region, &temp_box, 1);
+ RegionTranslate(&temp_region,
+ x_center_shift * pixmap_width,
+ y_center_shift * pixmap_height);
+ DEBUGF("for transform result:\n");
+ DEBUGRegionPrint(&temp_region);
+ }
+ RegionAppend(current_region, &temp_region);
+ RegionUninit(&repeat_region);
+ y_idx++;
+ }
+ x_idx++;
+ }
+ }
+ DEBUGF("dx %d dy %d \n", dx, dy);
+
+ if (RegionNumRects(current_region)) {
+
+ if ((right_shift != 0 || down_shift != 0) &&
+ !(is_transform && repeat_type == RepeatReflect))
+ RegionTranslate(current_region, -right_shift * pixmap_width,
+ -down_shift * pixmap_height);
+ clipped_regions[m].region = current_region;
+ clipped_regions[m].block_idx = idx;
+ m++;
+ }
+ else
+ RegionDestroy(current_region);
+ RegionUninit(&temp_region);
+ }
+ }
+
+ if (right_shift != 0 || down_shift != 0)
+ RegionTranslate(region, -right_shift * pixmap_width,
+ -down_shift * pixmap_height);
+ *n_region = m;
+
+ return clipped_regions;
}
glamor_pixmap_clipped_regions *
glamor_compute_clipped_regions(glamor_pixmap_private *priv, RegionPtr region,
- int *n_region, int repeat_type,
- int reverse, int upsidedown)
+ int *n_region, int repeat_type,
+ int reverse, int upsidedown)
{
- return _glamor_compute_clipped_regions(priv, region, n_region, repeat_type, 0, reverse, upsidedown);
+ return _glamor_compute_clipped_regions(priv, region, n_region, repeat_type,
+ 0, reverse, upsidedown);
}
/* XXX overflow still exist. maybe we need to change to use region32.
* by default. Or just use region32 for repeat cases?
**/
glamor_pixmap_clipped_regions *
-glamor_compute_transform_clipped_regions(glamor_pixmap_private *priv, struct pixman_transform *transform,
- RegionPtr region, int *n_region, int dx, int dy, int repeat_type,
- int reverse, int upsidedown)
+glamor_compute_transform_clipped_regions(glamor_pixmap_private *priv,
+ struct pixman_transform *transform,
+ RegionPtr region, int *n_region,
+ int dx, int dy, int repeat_type,
+ int reverse, int upsidedown)
{
- BoxPtr temp_extent;
- struct pixman_box32 temp_box;
- struct pixman_box16 short_box;
- RegionPtr temp_region;
- glamor_pixmap_clipped_regions *ret;
-
- temp_region = RegionCreate(NULL, 4);
- temp_extent = RegionExtents(region);
- DEBUGF("dest region \n");
- DEBUGRegionPrint(region);
- /* dx/dy may exceed MAX SHORT. we have to use
- * a box32 to represent it.*/
- temp_box.x1 = temp_extent->x1 + dx;
- temp_box.x2 = temp_extent->x2 + dx;
- temp_box.y1 = temp_extent->y1 + dy;
- temp_box.y2 = temp_extent->y2 + dy;
-
- DEBUGF("source box %d %d %d %d \n", temp_box.x1, temp_box.y1, temp_box.x2, temp_box.y2);
- if (transform)
- glamor_get_transform_extent_from_box(&temp_box, transform);
- if (repeat_type == RepeatNone) {
- if (temp_box.x1 < 0) temp_box.x1 = 0;
- if (temp_box.y1 < 0) temp_box.y1 = 0;
- temp_box.x2 = MIN(temp_box.x2, priv->base.pixmap->drawable.width);
- temp_box.y2 = MIN(temp_box.y2, priv->base.pixmap->drawable.height);
- }
- /* Now copy back the box32 to a box16 box. */
- short_box.x1 = temp_box.x1;
- short_box.y1 = temp_box.y1;
- short_box.x2 = temp_box.x2;
- short_box.y2 = temp_box.y2;
- RegionInitBoxes(temp_region, &short_box, 1);
- DEBUGF("copy to temp source region \n");
- DEBUGRegionPrint(temp_region);
- ret = _glamor_compute_clipped_regions(priv,
- temp_region,
- n_region,
- repeat_type,
- 1, reverse,
- upsidedown);
- DEBUGF("n_regions = %d \n", *n_region);
- RegionDestroy(temp_region);
-
- return ret;
+ BoxPtr temp_extent;
+ struct pixman_box32 temp_box;
+ struct pixman_box16 short_box;
+ RegionPtr temp_region;
+ glamor_pixmap_clipped_regions *ret;
+
+ temp_region = RegionCreate(NULL, 4);
+ temp_extent = RegionExtents(region);
+ DEBUGF("dest region \n");
+ DEBUGRegionPrint(region);
+ /* dx/dy may exceed MAX SHORT. we have to use
+ * a box32 to represent it.*/
+ temp_box.x1 = temp_extent->x1 + dx;
+ temp_box.x2 = temp_extent->x2 + dx;
+ temp_box.y1 = temp_extent->y1 + dy;
+ temp_box.y2 = temp_extent->y2 + dy;
+
+ DEBUGF("source box %d %d %d %d \n", temp_box.x1, temp_box.y1, temp_box.x2,
+ temp_box.y2);
+ if (transform)
+ glamor_get_transform_extent_from_box(&temp_box, transform);
+ if (repeat_type == RepeatNone) {
+ if (temp_box.x1 < 0)
+ temp_box.x1 = 0;
+ if (temp_box.y1 < 0)
+ temp_box.y1 = 0;
+ temp_box.x2 = MIN(temp_box.x2, priv->base.pixmap->drawable.width);
+ temp_box.y2 = MIN(temp_box.y2, priv->base.pixmap->drawable.height);
+ }
+ /* Now copy back the box32 to a box16 box. */
+ short_box.x1 = temp_box.x1;
+ short_box.y1 = temp_box.y1;
+ short_box.x2 = temp_box.x2;
+ short_box.y2 = temp_box.y2;
+ RegionInitBoxes(temp_region, &short_box, 1);
+ DEBUGF("copy to temp source region \n");
+ DEBUGRegionPrint(temp_region);
+ ret = _glamor_compute_clipped_regions(priv,
+ temp_region,
+ n_region,
+ repeat_type, 1, reverse, upsidedown);
+ DEBUGF("n_regions = %d \n", *n_region);
+ RegionDestroy(temp_region);
+
+ return ret;
}
+
/*
* As transform and repeatpad mode.
* We may get a clipped result which in multipe regions.
@@ -689,120 +736,121 @@ glamor_compute_transform_clipped_regions(glamor_pixmap_private *priv, struct pix
* if the clipped result cross the region boundary.
*/
static void
-glamor_merge_clipped_regions(glamor_pixmap_private *pixmap_priv, int repeat_type,
- glamor_pixmap_clipped_regions *clipped_regions,
- int *n_regions, int *need_clean_fbo)
+glamor_merge_clipped_regions(glamor_pixmap_private *pixmap_priv,
+ int repeat_type,
+ glamor_pixmap_clipped_regions *clipped_regions,
+ int *n_regions, int *need_clean_fbo)
{
- BoxPtr temp_extent;
- BoxRec temp_box, copy_box;
- RegionPtr temp_region;
- glamor_pixmap_private *temp_priv;
- PixmapPtr temp_pixmap;
- int overlap;
- int i;
- int pixmap_width, pixmap_height;
- glamor_pixmap_private_large_t *priv;
-
- priv = &pixmap_priv->large;
- pixmap_width = priv->base.pixmap->drawable.width;
- pixmap_height = priv->base.pixmap->drawable.height;
-
- temp_region = RegionCreate(NULL, 4);
- for(i = 0; i < *n_regions; i++)
- {
- DEBUGF("Region %d:\n", i);
- DEBUGRegionPrint(clipped_regions[i].region);
- RegionAppend(temp_region, clipped_regions[i].region);
- }
-
- RegionValidate(temp_region, &overlap);
- DEBUGF("temp region: \n");
- DEBUGRegionPrint(temp_region);
- temp_extent = RegionExtents(temp_region);
-
- temp_box = *temp_extent;
-
- DEBUGF("need copy region: \n");
- DEBUGF("%d %d %d %d \n", temp_box.x1, temp_box.y1, temp_box.x2, temp_box.y2);
- temp_pixmap = glamor_create_pixmap(priv->base.pixmap->drawable.pScreen,
- temp_box.x2 - temp_box.x1,
- temp_box.y2 - temp_box.y1,
- priv->base.pixmap->drawable.depth,
- GLAMOR_CREATE_PIXMAP_FIXUP);
- if (temp_pixmap == NULL) {
- assert(0);
- return;
- }
-
- temp_priv = glamor_get_pixmap_private(temp_pixmap);
- assert(temp_priv->type != GLAMOR_TEXTURE_LARGE);
-
- priv->box = temp_box;
- if (temp_extent->x1 >= 0 && temp_extent->x2 <= pixmap_width
- && temp_extent->y1 >= 0 && temp_extent->y2 <= pixmap_height) {
- int dx, dy;
- copy_box.x1 = 0;
- copy_box.y1 = 0;
- copy_box.x2 = temp_extent->x2 - temp_extent->x1;
- copy_box.y2 = temp_extent->y2 - temp_extent->y1;
- dx = temp_extent->x1;
- dy = temp_extent->y1;
- glamor_copy_n_to_n(&priv->base.pixmap->drawable,
- &temp_pixmap->drawable,
- NULL, &copy_box, 1, dx,
- dy, 0, 0, 0, NULL);
-// glamor_solid(temp_pixmap, 0, 0, temp_pixmap->drawable.width,
-// temp_pixmap->drawable.height, GXcopy, 0xffffffff, 0xff00);
- } else {
- for (i = 0; i < *n_regions; i++)
- {
- BoxPtr box;
- int nbox;
- box = REGION_RECTS(clipped_regions[i].region);
- nbox = REGION_NUM_RECTS(clipped_regions[i].region);
- while(nbox--) {
- int dx, dy, c, d;
- DEBUGF("box x1 %d y1 %d x2 %d y2 %d \n",
- box->x1, box->y1, box->x2, box->y2);
- modulus(box->x1, pixmap_width, c);
- dx = c - (box->x1 - temp_box.x1);
- copy_box.x1 = box->x1 - temp_box.x1;
- copy_box.x2 = box->x2 - temp_box.x1;
-
- modulus(box->y1, pixmap_height, d);
- dy = d - (box->y1 - temp_box.y1);
- copy_box.y1 = box->y1 - temp_box.y1;
- copy_box.y2 = box->y2 - temp_box.y1;
-
- DEBUGF("copying box %d %d %d %d, dx %d dy %d\n",
- copy_box.x1, copy_box.y1, copy_box.x2,
- copy_box.y2, dx, dy);
-
- glamor_copy_n_to_n(&priv->base.pixmap->drawable,
- &temp_pixmap->drawable,
- NULL, &copy_box, 1, dx,
- dy, 0, 0, 0, NULL);
- box++;
- }
- }
- //glamor_solid(temp_pixmap, 0, 0, temp_pixmap->drawable.width,
- // temp_pixmap->drawable.height, GXcopy, 0xffffffff, 0xff);
- }
- /* The first region will be released at caller side. */
- for(i = 1; i < *n_regions; i++)
- RegionDestroy(clipped_regions[i].region);
- RegionDestroy(temp_region);
- priv->box = temp_box;
- priv->base.fbo = glamor_pixmap_detach_fbo(temp_priv);
- DEBUGF("priv box x1 %d y1 %d x2 %d y2 %d \n",
- priv->box.x1, priv->box.y1, priv->box.x2, priv->box.y2);
- glamor_destroy_pixmap(temp_pixmap);
- *need_clean_fbo = 1;
- *n_regions = 1;
+ BoxPtr temp_extent;
+ BoxRec temp_box, copy_box;
+ RegionPtr temp_region;
+ glamor_pixmap_private *temp_priv;
+ PixmapPtr temp_pixmap;
+ int overlap;
+ int i;
+ int pixmap_width, pixmap_height;
+ glamor_pixmap_private_large_t *priv;
+
+ priv = &pixmap_priv->large;
+ pixmap_width = priv->base.pixmap->drawable.width;
+ pixmap_height = priv->base.pixmap->drawable.height;
+
+ temp_region = RegionCreate(NULL, 4);
+ for (i = 0; i < *n_regions; i++) {
+ DEBUGF("Region %d:\n", i);
+ DEBUGRegionPrint(clipped_regions[i].region);
+ RegionAppend(temp_region, clipped_regions[i].region);
+ }
+
+ RegionValidate(temp_region, &overlap);
+ DEBUGF("temp region: \n");
+ DEBUGRegionPrint(temp_region);
+ temp_extent = RegionExtents(temp_region);
+
+ temp_box = *temp_extent;
+
+ DEBUGF("need copy region: \n");
+ DEBUGF("%d %d %d %d \n", temp_box.x1, temp_box.y1, temp_box.x2,
+ temp_box.y2);
+ temp_pixmap =
+ glamor_create_pixmap(priv->base.pixmap->drawable.pScreen,
+ temp_box.x2 - temp_box.x1,
+ temp_box.y2 - temp_box.y1,
+ priv->base.pixmap->drawable.depth,
+ GLAMOR_CREATE_PIXMAP_FIXUP);
+ if (temp_pixmap == NULL) {
+ assert(0);
+ return;
+ }
+
+ temp_priv = glamor_get_pixmap_private(temp_pixmap);
+ assert(temp_priv->type != GLAMOR_TEXTURE_LARGE);
+
+ priv->box = temp_box;
+ if (temp_extent->x1 >= 0 && temp_extent->x2 <= pixmap_width
+ && temp_extent->y1 >= 0 && temp_extent->y2 <= pixmap_height) {
+ int dx, dy;
+
+ copy_box.x1 = 0;
+ copy_box.y1 = 0;
+ copy_box.x2 = temp_extent->x2 - temp_extent->x1;
+ copy_box.y2 = temp_extent->y2 - temp_extent->y1;
+ dx = temp_extent->x1;
+ dy = temp_extent->y1;
+ glamor_copy_n_to_n(&priv->base.pixmap->drawable,
+ &temp_pixmap->drawable,
+ NULL, &copy_box, 1, dx, dy, 0, 0, 0, NULL);
+// glamor_solid(temp_pixmap, 0, 0, temp_pixmap->drawable.width,
+// temp_pixmap->drawable.height, GXcopy, 0xffffffff, 0xff00);
+ }
+ else {
+ for (i = 0; i < *n_regions; i++) {
+ BoxPtr box;
+ int nbox;
+
+ box = REGION_RECTS(clipped_regions[i].region);
+ nbox = REGION_NUM_RECTS(clipped_regions[i].region);
+ while (nbox--) {
+ int dx, dy, c, d;
+
+ DEBUGF("box x1 %d y1 %d x2 %d y2 %d \n",
+ box->x1, box->y1, box->x2, box->y2);
+ modulus(box->x1, pixmap_width, c);
+ dx = c - (box->x1 - temp_box.x1);
+ copy_box.x1 = box->x1 - temp_box.x1;
+ copy_box.x2 = box->x2 - temp_box.x1;
+
+ modulus(box->y1, pixmap_height, d);
+ dy = d - (box->y1 - temp_box.y1);
+ copy_box.y1 = box->y1 - temp_box.y1;
+ copy_box.y2 = box->y2 - temp_box.y1;
+
+ DEBUGF("copying box %d %d %d %d, dx %d dy %d\n",
+ copy_box.x1, copy_box.y1, copy_box.x2,
+ copy_box.y2, dx, dy);
+
+ glamor_copy_n_to_n(&priv->base.pixmap->drawable,
+ &temp_pixmap->drawable,
+ NULL, &copy_box, 1, dx, dy, 0, 0, 0, NULL);
+ box++;
+ }
+ }
+ //glamor_solid(temp_pixmap, 0, 0, temp_pixmap->drawable.width,
+ // temp_pixmap->drawable.height, GXcopy, 0xffffffff, 0xff);
+ }
+ /* The first region will be released at caller side. */
+ for (i = 1; i < *n_regions; i++)
+ RegionDestroy(clipped_regions[i].region);
+ RegionDestroy(temp_region);
+ priv->box = temp_box;
+ priv->base.fbo = glamor_pixmap_detach_fbo(temp_priv);
+ DEBUGF("priv box x1 %d y1 %d x2 %d y2 %d \n",
+ priv->box.x1, priv->box.y1, priv->box.x2, priv->box.y2);
+ glamor_destroy_pixmap(temp_pixmap);
+ *need_clean_fbo = 1;
+ *n_regions = 1;
}
-
-
/**
* Given an expected transformed block width and block height,
*
@@ -817,45 +865,47 @@ glamor_merge_clipped_regions(glamor_pixmap_private *pixmap_priv, int repeat_type
**/
Bool
glamor_get_transform_block_size(struct pixman_transform *transform,
- int block_w, int block_h,
- int *transformed_block_w,
- int *transformed_block_h)
+ int block_w, int block_h,
+ int *transformed_block_w,
+ int *transformed_block_h)
{
- double a,b,c,d,e,f,g,h;
- double scale;
- int width, height;
- a = pixman_fixed_to_double(transform->matrix[0][0]);
- b = pixman_fixed_to_double(transform->matrix[0][1]);
- c = pixman_fixed_to_double(transform->matrix[1][0]);
- d = pixman_fixed_to_double(transform->matrix[1][1]);
- scale = pixman_fixed_to_double(transform->matrix[2][2]);
- if (block_w > 2048) {
- /* For large block size, we shrink it to smaller box,
- * thus latter we may get less cross boundary regions and
- * thus can avoid some extra copy.
- *
- **/
- width = block_w / 4;
- height = block_h / 4;
- } else {
- width = block_w - 2;
- height = block_h - 2;
- }
- e = a + b;
- f = c + d;
-
- g = a - b;
- h = c - d;
-
- e = MIN(block_w, floor(width * scale) / MAX(fabs(e), fabs(g)));
- f = MIN(block_h, floor(height * scale) / MAX(fabs(f), fabs(h)));
- *transformed_block_w = MIN(e, f) - 1;
- *transformed_block_h = *transformed_block_w;
- if (*transformed_block_w <= 0 || *transformed_block_h <= 0)
- return FALSE;
- DEBUGF("original block_w/h %d %d, fixed %d %d \n", block_w, block_h,
- *transformed_block_w, *transformed_block_h);
- return TRUE;
+ double a, b, c, d, e, f, g, h;
+ double scale;
+ int width, height;
+
+ a = pixman_fixed_to_double(transform->matrix[0][0]);
+ b = pixman_fixed_to_double(transform->matrix[0][1]);
+ c = pixman_fixed_to_double(transform->matrix[1][0]);
+ d = pixman_fixed_to_double(transform->matrix[1][1]);
+ scale = pixman_fixed_to_double(transform->matrix[2][2]);
+ if (block_w > 2048) {
+ /* For large block size, we shrink it to smaller box,
+ * thus latter we may get less cross boundary regions and
+ * thus can avoid some extra copy.
+ *
+ **/
+ width = block_w / 4;
+ height = block_h / 4;
+ }
+ else {
+ width = block_w - 2;
+ height = block_h - 2;
+ }
+ e = a + b;
+ f = c + d;
+
+ g = a - b;
+ h = c - d;
+
+ e = MIN(block_w, floor(width * scale) / MAX(fabs(e), fabs(g)));
+ f = MIN(block_h, floor(height * scale) / MAX(fabs(f), fabs(h)));
+ *transformed_block_w = MIN(e, f) - 1;
+ *transformed_block_h = *transformed_block_w;
+ if (*transformed_block_w <= 0 || *transformed_block_h <= 0)
+ return FALSE;
+ DEBUGF("original block_w/h %d %d, fixed %d %d \n", block_w, block_h,
+ *transformed_block_w, *transformed_block_h);
+ return TRUE;
}
#define VECTOR_FROM_POINT(p, x, y) \
@@ -864,314 +914,341 @@ glamor_get_transform_block_size(struct pixman_transform *transform,
p.v[2] = 1.0;
void
glamor_get_transform_extent_from_box(struct pixman_box32 *box,
- struct pixman_transform *transform)
+ struct pixman_transform *transform)
{
- struct pixman_f_vector p0, p1, p2, p3;
- float min_x, min_y, max_x, max_y;
-
- struct pixman_f_transform ftransform;
-
- VECTOR_FROM_POINT(p0, box->x1, box->y1)
- VECTOR_FROM_POINT(p1, box->x2, box->y1)
- VECTOR_FROM_POINT(p2, box->x2, box->y2)
- VECTOR_FROM_POINT(p3, box->x1, box->y2)
-
- pixman_f_transform_from_pixman_transform(&ftransform, transform);
- pixman_f_transform_point(&ftransform, &p0);
- pixman_f_transform_point(&ftransform, &p1);
- pixman_f_transform_point(&ftransform, &p2);
- pixman_f_transform_point(&ftransform, &p3);
-
- min_x = MIN(p0.v[0], p1.v[0]);
- min_x = MIN(min_x, p2.v[0]);
- min_x = MIN(min_x, p3.v[0]);
-
- min_y = MIN(p0.v[1], p1.v[1]);
- min_y = MIN(min_y, p2.v[1]);
- min_y = MIN(min_y, p3.v[1]);
-
- max_x = MAX(p0.v[0], p1.v[0]);
- max_x = MAX(max_x, p2.v[0]);
- max_x = MAX(max_x, p3.v[0]);
-
- max_y = MAX(p0.v[1], p1.v[1]);
- max_y = MAX(max_y, p2.v[1]);
- max_y = MAX(max_y, p3.v[1]);
- box->x1 = floor(min_x) - 1;
- box->y1 = floor(min_y) - 1;
- box->x2 = ceil(max_x) + 1;
- box->y2 = ceil(max_y) + 1;
+ struct pixman_f_vector p0, p1, p2, p3;
+ float min_x, min_y, max_x, max_y;
+
+ struct pixman_f_transform ftransform;
+
+ VECTOR_FROM_POINT(p0, box->x1, box->y1)
+ VECTOR_FROM_POINT(p1, box->x2, box->y1)
+ VECTOR_FROM_POINT(p2, box->x2, box->y2)
+ VECTOR_FROM_POINT(p3, box->x1, box->y2)
+
+ pixman_f_transform_from_pixman_transform(&ftransform, transform);
+ pixman_f_transform_point(&ftransform, &p0);
+ pixman_f_transform_point(&ftransform, &p1);
+ pixman_f_transform_point(&ftransform, &p2);
+ pixman_f_transform_point(&ftransform, &p3);
+
+ min_x = MIN(p0.v[0], p1.v[0]);
+ min_x = MIN(min_x, p2.v[0]);
+ min_x = MIN(min_x, p3.v[0]);
+
+ min_y = MIN(p0.v[1], p1.v[1]);
+ min_y = MIN(min_y, p2.v[1]);
+ min_y = MIN(min_y, p3.v[1]);
+
+ max_x = MAX(p0.v[0], p1.v[0]);
+ max_x = MAX(max_x, p2.v[0]);
+ max_x = MAX(max_x, p3.v[0]);
+
+ max_y = MAX(p0.v[1], p1.v[1]);
+ max_y = MAX(max_y, p2.v[1]);
+ max_y = MAX(max_y, p3.v[1]);
+ box->x1 = floor(min_x) - 1;
+ box->y1 = floor(min_y) - 1;
+ box->x2 = ceil(max_x) + 1;
+ box->y2 = ceil(max_y) + 1;
}
static void
_glamor_process_transformed_clipped_region(glamor_pixmap_private *priv,
- int repeat_type,
- glamor_pixmap_clipped_regions *clipped_regions,
- int *n_regions, int *need_clean_fbo)
+ int repeat_type,
+ glamor_pixmap_clipped_regions *
+ clipped_regions, int *n_regions,
+ int *need_clean_fbo)
{
- int shift_x, shift_y;
- if (*n_regions != 1) {
- /* Merge all source regions into one region. */
- glamor_merge_clipped_regions(priv, repeat_type,
- clipped_regions, n_regions,
- need_clean_fbo);
- } else {
- SET_PIXMAP_FBO_CURRENT(priv,
- clipped_regions[0].block_idx);
- if (repeat_type == RepeatReflect || repeat_type == RepeatNormal) {
- /* The required source areas are in one region,
- * we need to shift the corresponding box's coords to proper position,
- * thus we can calculate the relative coords correctly.*/
- BoxPtr temp_box;
- int rem;
- temp_box = RegionExtents(clipped_regions[0].region);
- modulus(temp_box->x1, priv->base.pixmap->drawable.width, rem);
- shift_x = (temp_box->x1 - rem) / priv->base.pixmap->drawable.width;
- modulus(temp_box->y1, priv->base.pixmap->drawable.height, rem);
- shift_y = (temp_box->y1 - rem) / priv->base.pixmap->drawable.height;
-
- if (shift_x != 0) {
- priv->large.box.x1 += shift_x * priv->base.pixmap->drawable.width;
- priv->large.box.x2 += shift_x * priv->base.pixmap->drawable.width;
- }
- if (shift_y != 0) {
- priv->large.box.y1 += shift_y * priv->base.pixmap->drawable.height;
- priv->large.box.y2 += shift_y * priv->base.pixmap->drawable.height;
- }
- }
- }
+ int shift_x, shift_y;
+
+ if (*n_regions != 1) {
+ /* Merge all source regions into one region. */
+ glamor_merge_clipped_regions(priv, repeat_type,
+ clipped_regions, n_regions,
+ need_clean_fbo);
+ }
+ else {
+ SET_PIXMAP_FBO_CURRENT(priv, clipped_regions[0].block_idx);
+ if (repeat_type == RepeatReflect || repeat_type == RepeatNormal) {
+ /* The required source areas are in one region,
+ * we need to shift the corresponding box's coords to proper position,
+ * thus we can calculate the relative coords correctly.*/
+ BoxPtr temp_box;
+ int rem;
+
+ temp_box = RegionExtents(clipped_regions[0].region);
+ modulus(temp_box->x1, priv->base.pixmap->drawable.width, rem);
+ shift_x = (temp_box->x1 - rem) / priv->base.pixmap->drawable.width;
+ modulus(temp_box->y1, priv->base.pixmap->drawable.height, rem);
+ shift_y = (temp_box->y1 - rem) / priv->base.pixmap->drawable.height;
+
+ if (shift_x != 0) {
+ priv->large.box.x1 +=
+ shift_x * priv->base.pixmap->drawable.width;
+ priv->large.box.x2 +=
+ shift_x * priv->base.pixmap->drawable.width;
+ }
+ if (shift_y != 0) {
+ priv->large.box.y1 +=
+ shift_y * priv->base.pixmap->drawable.height;
+ priv->large.box.y2 +=
+ shift_y * priv->base.pixmap->drawable.height;
+ }
+ }
+ }
}
-
Bool
glamor_composite_largepixmap_region(CARD8 op,
- PicturePtr source,
- PicturePtr mask,
- PicturePtr dest,
- glamor_pixmap_private * source_pixmap_priv,
- glamor_pixmap_private * mask_pixmap_priv,
- glamor_pixmap_private * dest_pixmap_priv,
- RegionPtr region, Bool force_clip,
- INT16 x_source,
- INT16 y_source,
- INT16 x_mask,
- INT16 y_mask,
- INT16 x_dest, INT16 y_dest,
- CARD16 width, CARD16 height)
+ PicturePtr source,
+ PicturePtr mask,
+ PicturePtr dest,
+ glamor_pixmap_private *source_pixmap_priv,
+ glamor_pixmap_private *mask_pixmap_priv,
+ glamor_pixmap_private *dest_pixmap_priv,
+ RegionPtr region, Bool force_clip,
+ INT16 x_source,
+ INT16 y_source,
+ INT16 x_mask,
+ INT16 y_mask,
+ INT16 x_dest, INT16 y_dest,
+ CARD16 width, CARD16 height)
{
- glamor_screen_private *glamor_priv;
- glamor_pixmap_clipped_regions *clipped_dest_regions;
- glamor_pixmap_clipped_regions *clipped_source_regions;
- glamor_pixmap_clipped_regions *clipped_mask_regions;
- int n_dest_regions;
- int n_mask_regions;
- int n_source_regions;
- int i,j,k;
- int need_clean_source_fbo = 0;
- int need_clean_mask_fbo = 0;
- int is_normal_source_fbo = 0;
- int is_normal_mask_fbo = 0;
- int fixed_block_width, fixed_block_height;
- int null_source, null_mask;
- glamor_pixmap_private * need_free_source_pixmap_priv = NULL;
- glamor_pixmap_private * need_free_mask_pixmap_priv = NULL;
- int source_repeat_type = 0, mask_repeat_type = 0;
- int ok = TRUE;
-
- if (source->repeat)
- source_repeat_type = source->repeatType;
- else
- source_repeat_type = RepeatNone;
-
- if (mask && mask->repeat)
- mask_repeat_type = mask->repeatType;
- else
- mask_repeat_type = RepeatNone;
-
- glamor_priv = dest_pixmap_priv->base.glamor_priv;
- fixed_block_width = glamor_priv->max_fbo_size;
- fixed_block_height = glamor_priv->max_fbo_size;
- /* If we got an totally out-of-box region for a source or mask
- * region without repeat, we need to set it as null_source and
- * give it a solid color (0,0,0,0). */
- null_source = 0;
- null_mask = 0;
- RegionTranslate(region, -dest->pDrawable->x,
- -dest->pDrawable->y);
-
- /* need to transform the dest region to the correct sourcei/mask region.
- * it's a little complex, as one single edge of the
- * target region may be transformed to cross a block boundary of the
- * source or mask. Then it's impossible to handle it as usual way.
- * We may have to split the original dest region to smaller region, and
- * make sure each region's transformed region can fit into one texture,
- * and then continue this loop again, and each time when a transformed region
- * cross the bound, we need to copy it to a single pixmap and do the composition
- * with the new pixmap. If the transformed region doesn't cross a source/mask's
- * boundary then we don't need to copy.
- *
- */
- if (source_pixmap_priv
- && source->transform
- && source_pixmap_priv->type == GLAMOR_TEXTURE_LARGE) {
- int source_transformed_block_width, source_transformed_block_height;
- if (!glamor_get_transform_block_size(source->transform,
- source_pixmap_priv->large.block_w,
- source_pixmap_priv->large.block_h,
- &source_transformed_block_width,
- &source_transformed_block_height)) {
- DEBUGF("source block size less than 1, fallback.\n");
- RegionTranslate(region, dest->pDrawable->x,
- dest->pDrawable->y);
- return FALSE;
- }
- fixed_block_width = min(fixed_block_width , source_transformed_block_width);
- fixed_block_height = min(fixed_block_height , source_transformed_block_height);
- DEBUGF("new source block size %d x %d \n", fixed_block_width, fixed_block_height);
- }
-
- if (mask_pixmap_priv
- && mask->transform
- && mask_pixmap_priv->type == GLAMOR_TEXTURE_LARGE) {
- int mask_transformed_block_width, mask_transformed_block_height;
- if (!glamor_get_transform_block_size(mask->transform,
- mask_pixmap_priv->large.block_w,
- mask_pixmap_priv->large.block_h,
- &mask_transformed_block_width,
- &mask_transformed_block_height)) {
- DEBUGF("mask block size less than 1, fallback.\n");
- RegionTranslate(region, dest->pDrawable->x,
- dest->pDrawable->y);
- return FALSE;
- }
- fixed_block_width = min(fixed_block_width , mask_transformed_block_width);
- fixed_block_height = min(fixed_block_height , mask_transformed_block_height);
- DEBUGF("new mask block size %d x %d \n", fixed_block_width, fixed_block_height);
- }
-
- /*compute the correct block width and height whose transformed source/mask
- *region can fit into one texture.*/
- if (force_clip || fixed_block_width < glamor_priv->max_fbo_size
- || fixed_block_height < glamor_priv->max_fbo_size)
- clipped_dest_regions = glamor_compute_clipped_regions_ext(dest_pixmap_priv,
- region,
- &n_dest_regions,
- fixed_block_width,
- fixed_block_height,
- 0, 0);
- else
- clipped_dest_regions = glamor_compute_clipped_regions(dest_pixmap_priv,
- region,
- &n_dest_regions,
- 0, 0, 0);
- DEBUGF("dest clipped result %d region: \n", n_dest_regions);
- if (source_pixmap_priv
- && (source_pixmap_priv == dest_pixmap_priv || source_pixmap_priv == mask_pixmap_priv)
- && source_pixmap_priv->type == GLAMOR_TEXTURE_LARGE) {
- /* XXX self-copy...*/
- need_free_source_pixmap_priv = source_pixmap_priv;
- source_pixmap_priv = malloc(sizeof(*source_pixmap_priv));
- *source_pixmap_priv = *need_free_source_pixmap_priv;
- need_free_source_pixmap_priv = source_pixmap_priv;
- }
- assert(mask_pixmap_priv != dest_pixmap_priv);
-
- for(i = 0; i < n_dest_regions; i++)
- {
- DEBUGF("dest region %d idx %d\n", i, clipped_dest_regions[i].block_idx);
- DEBUGRegionPrint(clipped_dest_regions[i].region);
- SET_PIXMAP_FBO_CURRENT(dest_pixmap_priv, clipped_dest_regions[i].block_idx);
- if ( source_pixmap_priv && source_pixmap_priv->type == GLAMOR_TEXTURE_LARGE) {
- if (!source->transform && source_repeat_type != RepeatPad) {
- RegionTranslate(clipped_dest_regions[i].region,
- x_source - x_dest,
- y_source - y_dest);
- clipped_source_regions = glamor_compute_clipped_regions(source_pixmap_priv,
- clipped_dest_regions[i].region,
- &n_source_regions, source_repeat_type,
- 0, 0);
- is_normal_source_fbo = 1;
- }
- else {
- clipped_source_regions = glamor_compute_transform_clipped_regions(source_pixmap_priv,
- source->transform,
- clipped_dest_regions[i].region,
- &n_source_regions,
- x_source - x_dest, y_source - y_dest,
- source_repeat_type, 0, 0);
- is_normal_source_fbo = 0;
- if (n_source_regions == 0) {
- /* Pad the out-of-box region to (0,0,0,0). */
- null_source = 1;
- n_source_regions = 1;
- } else
- _glamor_process_transformed_clipped_region(source_pixmap_priv,
- source_repeat_type, clipped_source_regions, &n_source_regions,
- &need_clean_source_fbo);
- }
- DEBUGF("source clipped result %d region: \n", n_source_regions);
- for(j = 0; j < n_source_regions; j++)
- {
- if (is_normal_source_fbo)
- SET_PIXMAP_FBO_CURRENT(source_pixmap_priv,
- clipped_source_regions[j].block_idx);
-
- if (mask_pixmap_priv && mask_pixmap_priv->type == GLAMOR_TEXTURE_LARGE) {
- if (is_normal_mask_fbo && is_normal_source_fbo) {
- /* both mask and source are normal fbo box without transform or repeatpad.
- * The region is clipped against source and then we clip it against mask here.*/
- DEBUGF("source region %d idx %d\n", j, clipped_source_regions[j].block_idx);
- DEBUGRegionPrint(clipped_source_regions[j].region);
- RegionTranslate(clipped_source_regions[j].region,
- - x_source + x_mask,
- - y_source + y_mask);
- clipped_mask_regions = glamor_compute_clipped_regions(mask_pixmap_priv,
- clipped_source_regions[j].region,
- &n_mask_regions, mask_repeat_type,
- 0, 0);
- is_normal_mask_fbo = 1;
- } else if (is_normal_mask_fbo && !is_normal_source_fbo) {
- assert(n_source_regions == 1);
- /* The source fbo is not a normal fbo box, it has transform or repeatpad.
- * the valid clip region should be the clip dest region rather than the
- * clip source region.*/
- RegionTranslate(clipped_dest_regions[i].region,
- - x_dest + x_mask,
- - y_dest + y_mask);
- clipped_mask_regions = glamor_compute_clipped_regions(mask_pixmap_priv,
- clipped_dest_regions[i].region,
- &n_mask_regions, mask_repeat_type,
- 0, 0);
- is_normal_mask_fbo = 1;
- } else {
- /* This mask region has transform or repeatpad, we need clip it agains the previous
- * valid region rather than the mask region. */
- if (!is_normal_source_fbo)
- clipped_mask_regions = glamor_compute_transform_clipped_regions(mask_pixmap_priv,
- mask->transform,
- clipped_dest_regions[i].region,
- &n_mask_regions,
- x_mask - x_dest,
- y_mask - y_dest,
- mask_repeat_type, 0, 0);
- else
- clipped_mask_regions = glamor_compute_transform_clipped_regions(mask_pixmap_priv,
- mask->transform,
- clipped_source_regions[j].region,
- &n_mask_regions,
- x_mask - x_source, y_mask - y_source,
- mask_repeat_type, 0, 0);
- is_normal_mask_fbo = 0;
- if (n_mask_regions == 0) {
- /* Pad the out-of-box region to (0,0,0,0). */
- null_mask = 1;
- n_mask_regions = 1;
- } else
- _glamor_process_transformed_clipped_region(mask_pixmap_priv,
- mask_repeat_type, clipped_mask_regions, &n_mask_regions,
- &need_clean_mask_fbo);
- }
- DEBUGF("mask clipped result %d region: \n", n_mask_regions);
+ glamor_screen_private *glamor_priv;
+ glamor_pixmap_clipped_regions *clipped_dest_regions;
+ glamor_pixmap_clipped_regions *clipped_source_regions;
+ glamor_pixmap_clipped_regions *clipped_mask_regions;
+ int n_dest_regions;
+ int n_mask_regions;
+ int n_source_regions;
+ int i, j, k;
+ int need_clean_source_fbo = 0;
+ int need_clean_mask_fbo = 0;
+ int is_normal_source_fbo = 0;
+ int is_normal_mask_fbo = 0;
+ int fixed_block_width, fixed_block_height;
+ int null_source, null_mask;
+ glamor_pixmap_private *need_free_source_pixmap_priv = NULL;
+ glamor_pixmap_private *need_free_mask_pixmap_priv = NULL;
+ int source_repeat_type = 0, mask_repeat_type = 0;
+ int ok = TRUE;
+
+ if (source->repeat)
+ source_repeat_type = source->repeatType;
+ else
+ source_repeat_type = RepeatNone;
+
+ if (mask && mask->repeat)
+ mask_repeat_type = mask->repeatType;
+ else
+ mask_repeat_type = RepeatNone;
+
+ glamor_priv = dest_pixmap_priv->base.glamor_priv;
+ fixed_block_width = glamor_priv->max_fbo_size;
+ fixed_block_height = glamor_priv->max_fbo_size;
+ /* If we got an totally out-of-box region for a source or mask
+ * region without repeat, we need to set it as null_source and
+ * give it a solid color (0,0,0,0). */
+ null_source = 0;
+ null_mask = 0;
+ RegionTranslate(region, -dest->pDrawable->x, -dest->pDrawable->y);
+
+ /* need to transform the dest region to the correct sourcei/mask region.
+ * it's a little complex, as one single edge of the
+ * target region may be transformed to cross a block boundary of the
+ * source or mask. Then it's impossible to handle it as usual way.
+ * We may have to split the original dest region to smaller region, and
+ * make sure each region's transformed region can fit into one texture,
+ * and then continue this loop again, and each time when a transformed region
+ * cross the bound, we need to copy it to a single pixmap and do the composition
+ * with the new pixmap. If the transformed region doesn't cross a source/mask's
+ * boundary then we don't need to copy.
+ *
+ */
+ if (source_pixmap_priv
+ && source->transform
+ && source_pixmap_priv->type == GLAMOR_TEXTURE_LARGE) {
+ int source_transformed_block_width, source_transformed_block_height;
+
+ if (!glamor_get_transform_block_size(source->transform,
+ source_pixmap_priv->large.block_w,
+ source_pixmap_priv->large.block_h,
+ &source_transformed_block_width,
+ &source_transformed_block_height))
+ {
+ DEBUGF("source block size less than 1, fallback.\n");
+ RegionTranslate(region, dest->pDrawable->x, dest->pDrawable->y);
+ return FALSE;
+ }
+ fixed_block_width =
+ min(fixed_block_width, source_transformed_block_width);
+ fixed_block_height =
+ min(fixed_block_height, source_transformed_block_height);
+ DEBUGF("new source block size %d x %d \n", fixed_block_width,
+ fixed_block_height);
+ }
+
+ if (mask_pixmap_priv
+ && mask->transform && mask_pixmap_priv->type == GLAMOR_TEXTURE_LARGE) {
+ int mask_transformed_block_width, mask_transformed_block_height;
+
+ if (!glamor_get_transform_block_size(mask->transform,
+ mask_pixmap_priv->large.block_w,
+ mask_pixmap_priv->large.block_h,
+ &mask_transformed_block_width,
+ &mask_transformed_block_height)) {
+ DEBUGF("mask block size less than 1, fallback.\n");
+ RegionTranslate(region, dest->pDrawable->x, dest->pDrawable->y);
+ return FALSE;
+ }
+ fixed_block_width =
+ min(fixed_block_width, mask_transformed_block_width);
+ fixed_block_height =
+ min(fixed_block_height, mask_transformed_block_height);
+ DEBUGF("new mask block size %d x %d \n", fixed_block_width,
+ fixed_block_height);
+ }
+
+ /*compute the correct block width and height whose transformed source/mask
+ *region can fit into one texture.*/
+ if (force_clip || fixed_block_width < glamor_priv->max_fbo_size
+ || fixed_block_height < glamor_priv->max_fbo_size)
+ clipped_dest_regions =
+ glamor_compute_clipped_regions_ext(dest_pixmap_priv, region,
+ &n_dest_regions,
+ fixed_block_width,
+ fixed_block_height, 0, 0);
+ else
+ clipped_dest_regions = glamor_compute_clipped_regions(dest_pixmap_priv,
+ region,
+ &n_dest_regions,
+ 0, 0, 0);
+ DEBUGF("dest clipped result %d region: \n", n_dest_regions);
+ if (source_pixmap_priv
+ && (source_pixmap_priv == dest_pixmap_priv ||
+ source_pixmap_priv == mask_pixmap_priv)
+ && source_pixmap_priv->type == GLAMOR_TEXTURE_LARGE) {
+ /* XXX self-copy... */
+ need_free_source_pixmap_priv = source_pixmap_priv;
+ source_pixmap_priv = malloc(sizeof(*source_pixmap_priv));
+ *source_pixmap_priv = *need_free_source_pixmap_priv;
+ need_free_source_pixmap_priv = source_pixmap_priv;
+ }
+ assert(mask_pixmap_priv != dest_pixmap_priv);
+
+ for (i = 0; i < n_dest_regions; i++) {
+ DEBUGF("dest region %d idx %d\n", i,
+ clipped_dest_regions[i].block_idx);
+ DEBUGRegionPrint(clipped_dest_regions[i].region);
+ SET_PIXMAP_FBO_CURRENT(dest_pixmap_priv,
+ clipped_dest_regions[i].block_idx);
+ if (source_pixmap_priv &&
+ source_pixmap_priv->type == GLAMOR_TEXTURE_LARGE) {
+ if (!source->transform && source_repeat_type != RepeatPad) {
+ RegionTranslate(clipped_dest_regions[i].region,
+ x_source - x_dest, y_source - y_dest);
+ clipped_source_regions =
+ glamor_compute_clipped_regions(source_pixmap_priv,
+ clipped_dest_regions[i].
+ region, &n_source_regions,
+ source_repeat_type, 0, 0);
+ is_normal_source_fbo = 1;
+ }
+ else {
+ clipped_source_regions =
+ glamor_compute_transform_clipped_regions(source_pixmap_priv,
+ source->transform,
+ clipped_dest_regions
+ [i].region,
+ &n_source_regions,
+ x_source - x_dest,
+ y_source - y_dest,
+ source_repeat_type,
+ 0, 0);
+ is_normal_source_fbo = 0;
+ if (n_source_regions == 0) {
+ /* Pad the out-of-box region to (0,0,0,0). */
+ null_source = 1;
+ n_source_regions = 1;
+ }
+ else
+ _glamor_process_transformed_clipped_region
+ (source_pixmap_priv, source_repeat_type,
+ clipped_source_regions, &n_source_regions,
+ &need_clean_source_fbo);
+ }
+ DEBUGF("source clipped result %d region: \n", n_source_regions);
+ for (j = 0; j < n_source_regions; j++) {
+ if (is_normal_source_fbo)
+ SET_PIXMAP_FBO_CURRENT(source_pixmap_priv,
+ clipped_source_regions[j].block_idx);
+
+ if (mask_pixmap_priv &&
+ mask_pixmap_priv->type == GLAMOR_TEXTURE_LARGE) {
+ if (is_normal_mask_fbo && is_normal_source_fbo) {
+ /* both mask and source are normal fbo box without transform or repeatpad.
+ * The region is clipped against source and then we clip it against mask here.*/
+ DEBUGF("source region %d idx %d\n", j,
+ clipped_source_regions[j].block_idx);
+ DEBUGRegionPrint(clipped_source_regions[j].region);
+ RegionTranslate(clipped_source_regions[j].region,
+ -x_source + x_mask, -y_source + y_mask);
+ clipped_mask_regions =
+ glamor_compute_clipped_regions(mask_pixmap_priv,
+ clipped_source_regions
+ [j].region,
+ &n_mask_regions,
+ mask_repeat_type, 0,
+ 0);
+ is_normal_mask_fbo = 1;
+ }
+ else if (is_normal_mask_fbo && !is_normal_source_fbo) {
+ assert(n_source_regions == 1);
+ /* The source fbo is not a normal fbo box, it has transform or repeatpad.
+ * the valid clip region should be the clip dest region rather than the
+ * clip source region.*/
+ RegionTranslate(clipped_dest_regions[i].region,
+ -x_dest + x_mask, -y_dest + y_mask);
+ clipped_mask_regions =
+ glamor_compute_clipped_regions(mask_pixmap_priv,
+ clipped_dest_regions
+ [i].region,
+ &n_mask_regions,
+ mask_repeat_type, 0,
+ 0);
+ is_normal_mask_fbo = 1;
+ }
+ else {
+ /* This mask region has transform or repeatpad, we need clip it agains the previous
+ * valid region rather than the mask region. */
+ if (!is_normal_source_fbo)
+ clipped_mask_regions =
+ glamor_compute_transform_clipped_regions
+ (mask_pixmap_priv, mask->transform,
+ clipped_dest_regions[i].region,
+ &n_mask_regions, x_mask - x_dest,
+ y_mask - y_dest, mask_repeat_type, 0, 0);
+ else
+ clipped_mask_regions =
+ glamor_compute_transform_clipped_regions
+ (mask_pixmap_priv, mask->transform,
+ clipped_source_regions[j].region,
+ &n_mask_regions, x_mask - x_source,
+ y_mask - y_source, mask_repeat_type, 0, 0);
+ is_normal_mask_fbo = 0;
+ if (n_mask_regions == 0) {
+ /* Pad the out-of-box region to (0,0,0,0). */
+ null_mask = 1;
+ n_mask_regions = 1;
+ }
+ else
+ _glamor_process_transformed_clipped_region
+ (mask_pixmap_priv, mask_repeat_type,
+ clipped_mask_regions, &n_mask_regions,
+ &need_clean_mask_fbo);
+ }
+ DEBUGF("mask clipped result %d region: \n", n_mask_regions);
#define COMPOSITE_REGION(region) do { \
if (!glamor_composite_clipped_region(op, \
@@ -1186,139 +1263,157 @@ glamor_composite_largepixmap_region(CARD8 op,
} \
} while(0)
- for(k = 0; k < n_mask_regions; k++)
- {
- DEBUGF("mask region %d idx %d\n", k, clipped_mask_regions[k].block_idx);
- DEBUGRegionPrint(clipped_mask_regions[k].region);
- if (is_normal_mask_fbo) {
- SET_PIXMAP_FBO_CURRENT(mask_pixmap_priv,
- clipped_mask_regions[k].block_idx);
- DEBUGF("mask fbo off %d %d \n",
- mask_pixmap_priv->large.box.x1,
- mask_pixmap_priv->large.box.y1);
- DEBUGF("start composite mask hasn't transform.\n");
- RegionTranslate(clipped_mask_regions[k].region,
- x_dest - x_mask + dest->pDrawable->x,
- y_dest - y_mask + dest->pDrawable->y);
- COMPOSITE_REGION(clipped_mask_regions[k].region);
- } else if (!is_normal_mask_fbo && !is_normal_source_fbo) {
- DEBUGF("start composite both mask and source have transform.\n");
- RegionTranslate(clipped_dest_regions[i].region,
- dest->pDrawable->x,
- dest->pDrawable->y);
- COMPOSITE_REGION(clipped_dest_regions[i].region);
- } else {
- DEBUGF("start composite only mask has transform.\n");
- RegionTranslate(clipped_source_regions[j].region,
- x_dest - x_source + dest->pDrawable->x,
- y_dest - y_source + dest->pDrawable->y);
- COMPOSITE_REGION(clipped_source_regions[j].region);
- }
- RegionDestroy(clipped_mask_regions[k].region);
- }
- free(clipped_mask_regions);
- if (null_mask) null_mask = 0;
- if (need_clean_mask_fbo) {
- assert(is_normal_mask_fbo == 0);
- glamor_destroy_fbo(mask_pixmap_priv->base.fbo);
- mask_pixmap_priv->base.fbo = NULL;
- need_clean_mask_fbo = 0;
- }
- } else {
- if (is_normal_source_fbo) {
- RegionTranslate(clipped_source_regions[j].region,
- -x_source + x_dest + dest->pDrawable->x,
- -y_source + y_dest + dest->pDrawable->y);
- COMPOSITE_REGION(clipped_source_regions[j].region);
- } else {
- /* Source has transform or repeatPad. dest regions is the right
- * region to do the composite. */
- RegionTranslate(clipped_dest_regions[i].region,
- dest->pDrawable->x,
- dest->pDrawable->y);
- COMPOSITE_REGION(clipped_dest_regions[i].region);
- }
- }
- if (clipped_source_regions && clipped_source_regions[j].region)
- RegionDestroy(clipped_source_regions[j].region);
- }
- free(clipped_source_regions);
- if (null_source) null_source = 0;
- if (need_clean_source_fbo) {
- assert(is_normal_source_fbo == 0);
- glamor_destroy_fbo(source_pixmap_priv->base.fbo);
- source_pixmap_priv->base.fbo = NULL;
- need_clean_source_fbo = 0;
- }
- }
- else {
- if (mask_pixmap_priv && mask_pixmap_priv->type == GLAMOR_TEXTURE_LARGE) {
- if (!mask->transform && mask_repeat_type != RepeatPad) {
- RegionTranslate(clipped_dest_regions[i].region,
- x_mask - x_dest,
- y_mask - y_dest);
- clipped_mask_regions = glamor_compute_clipped_regions(mask_pixmap_priv,
- clipped_dest_regions[i].region,
- &n_mask_regions, mask_repeat_type, 0, 0);
- is_normal_mask_fbo = 1;
- }
- else {
- clipped_mask_regions = glamor_compute_transform_clipped_regions(mask_pixmap_priv,
- mask->transform,
- clipped_dest_regions[i].region,
- &n_mask_regions,
- x_mask - x_dest, y_mask - y_dest,
- mask_repeat_type, 0, 0);
- is_normal_mask_fbo = 0;
- if (n_mask_regions == 0) {
- /* Pad the out-of-box region to (0,0,0,0). */
- null_mask = 1;
- n_mask_regions = 1;
- } else
- _glamor_process_transformed_clipped_region(mask_pixmap_priv,
- mask_repeat_type, clipped_mask_regions, &n_mask_regions,
- &need_clean_mask_fbo);
- }
-
- for(k = 0; k < n_mask_regions; k++)
- {
- DEBUGF("mask region %d idx %d\n", k, clipped_mask_regions[k].block_idx);
- DEBUGRegionPrint(clipped_mask_regions[k].region);
- if (is_normal_mask_fbo) {
- SET_PIXMAP_FBO_CURRENT(mask_pixmap_priv,
- clipped_mask_regions[k].block_idx);
- RegionTranslate(clipped_mask_regions[k].region,
- x_dest - x_mask + dest->pDrawable->x,
- y_dest - y_mask + dest->pDrawable->y);
- COMPOSITE_REGION(clipped_mask_regions[k].region);
- } else {
- RegionTranslate(clipped_dest_regions[i].region,
- dest->pDrawable->x,
- dest->pDrawable->y);
- COMPOSITE_REGION(clipped_dest_regions[i].region);
- }
- RegionDestroy(clipped_mask_regions[k].region);
- }
- free(clipped_mask_regions);
- if (null_mask) null_mask = 0;
- if (need_clean_mask_fbo) {
- glamor_destroy_fbo(mask_pixmap_priv->base.fbo);
- mask_pixmap_priv->base.fbo = NULL;
- need_clean_mask_fbo = 0;
- }
- }
- else {
- RegionTranslate(clipped_dest_regions[i].region,
- dest->pDrawable->x,
- dest->pDrawable->y);
- COMPOSITE_REGION(clipped_dest_regions[i].region);
- }
- }
- RegionDestroy(clipped_dest_regions[i].region);
- }
- free(clipped_dest_regions);
- free(need_free_source_pixmap_priv);
- free(need_free_mask_pixmap_priv);
- ok = TRUE;
- return ok;
+ for (k = 0; k < n_mask_regions; k++) {
+ DEBUGF("mask region %d idx %d\n", k,
+ clipped_mask_regions[k].block_idx);
+ DEBUGRegionPrint(clipped_mask_regions[k].region);
+ if (is_normal_mask_fbo) {
+ SET_PIXMAP_FBO_CURRENT(mask_pixmap_priv,
+ clipped_mask_regions[k].
+ block_idx);
+ DEBUGF("mask fbo off %d %d \n",
+ mask_pixmap_priv->large.box.x1,
+ mask_pixmap_priv->large.box.y1);
+ DEBUGF("start composite mask hasn't transform.\n");
+ RegionTranslate(clipped_mask_regions[k].region,
+ x_dest - x_mask +
+ dest->pDrawable->x,
+ y_dest - y_mask +
+ dest->pDrawable->y);
+ COMPOSITE_REGION(clipped_mask_regions[k].region);
+ }
+ else if (!is_normal_mask_fbo && !is_normal_source_fbo) {
+ DEBUGF
+ ("start composite both mask and source have transform.\n");
+ RegionTranslate(clipped_dest_regions[i].region,
+ dest->pDrawable->x,
+ dest->pDrawable->y);
+ COMPOSITE_REGION(clipped_dest_regions[i].region);
+ }
+ else {
+ DEBUGF
+ ("start composite only mask has transform.\n");
+ RegionTranslate(clipped_source_regions[j].region,
+ x_dest - x_source +
+ dest->pDrawable->x,
+ y_dest - y_source +
+ dest->pDrawable->y);
+ COMPOSITE_REGION(clipped_source_regions[j].region);
+ }
+ RegionDestroy(clipped_mask_regions[k].region);
+ }
+ free(clipped_mask_regions);
+ if (null_mask)
+ null_mask = 0;
+ if (need_clean_mask_fbo) {
+ assert(is_normal_mask_fbo == 0);
+ glamor_destroy_fbo(mask_pixmap_priv->base.fbo);
+ mask_pixmap_priv->base.fbo = NULL;
+ need_clean_mask_fbo = 0;
+ }
+ }
+ else {
+ if (is_normal_source_fbo) {
+ RegionTranslate(clipped_source_regions[j].region,
+ -x_source + x_dest + dest->pDrawable->x,
+ -y_source + y_dest +
+ dest->pDrawable->y);
+ COMPOSITE_REGION(clipped_source_regions[j].region);
+ }
+ else {
+ /* Source has transform or repeatPad. dest regions is the right
+ * region to do the composite. */
+ RegionTranslate(clipped_dest_regions[i].region,
+ dest->pDrawable->x, dest->pDrawable->y);
+ COMPOSITE_REGION(clipped_dest_regions[i].region);
+ }
+ }
+ if (clipped_source_regions && clipped_source_regions[j].region)
+ RegionDestroy(clipped_source_regions[j].region);
+ }
+ free(clipped_source_regions);
+ if (null_source)
+ null_source = 0;
+ if (need_clean_source_fbo) {
+ assert(is_normal_source_fbo == 0);
+ glamor_destroy_fbo(source_pixmap_priv->base.fbo);
+ source_pixmap_priv->base.fbo = NULL;
+ need_clean_source_fbo = 0;
+ }
+ }
+ else {
+ if (mask_pixmap_priv &&
+ mask_pixmap_priv->type == GLAMOR_TEXTURE_LARGE) {
+ if (!mask->transform && mask_repeat_type != RepeatPad) {
+ RegionTranslate(clipped_dest_regions[i].region,
+ x_mask - x_dest, y_mask - y_dest);
+ clipped_mask_regions =
+ glamor_compute_clipped_regions(mask_pixmap_priv,
+ clipped_dest_regions[i].
+ region, &n_mask_regions,
+ mask_repeat_type, 0, 0);
+ is_normal_mask_fbo = 1;
+ }
+ else {
+ clipped_mask_regions =
+ glamor_compute_transform_clipped_regions
+ (mask_pixmap_priv, mask->transform,
+ clipped_dest_regions[i].region, &n_mask_regions,
+ x_mask - x_dest, y_mask - y_dest, mask_repeat_type, 0,
+ 0);
+ is_normal_mask_fbo = 0;
+ if (n_mask_regions == 0) {
+ /* Pad the out-of-box region to (0,0,0,0). */
+ null_mask = 1;
+ n_mask_regions = 1;
+ }
+ else
+ _glamor_process_transformed_clipped_region
+ (mask_pixmap_priv, mask_repeat_type,
+ clipped_mask_regions, &n_mask_regions,
+ &need_clean_mask_fbo);
+ }
+
+ for (k = 0; k < n_mask_regions; k++) {
+ DEBUGF("mask region %d idx %d\n", k,
+ clipped_mask_regions[k].block_idx);
+ DEBUGRegionPrint(clipped_mask_regions[k].region);
+ if (is_normal_mask_fbo) {
+ SET_PIXMAP_FBO_CURRENT(mask_pixmap_priv,
+ clipped_mask_regions[k].
+ block_idx);
+ RegionTranslate(clipped_mask_regions[k].region,
+ x_dest - x_mask + dest->pDrawable->x,
+ y_dest - y_mask + dest->pDrawable->y);
+ COMPOSITE_REGION(clipped_mask_regions[k].region);
+ }
+ else {
+ RegionTranslate(clipped_dest_regions[i].region,
+ dest->pDrawable->x, dest->pDrawable->y);
+ COMPOSITE_REGION(clipped_dest_regions[i].region);
+ }
+ RegionDestroy(clipped_mask_regions[k].region);
+ }
+ free(clipped_mask_regions);
+ if (null_mask)
+ null_mask = 0;
+ if (need_clean_mask_fbo) {
+ glamor_destroy_fbo(mask_pixmap_priv->base.fbo);
+ mask_pixmap_priv->base.fbo = NULL;
+ need_clean_mask_fbo = 0;
+ }
+ }
+ else {
+ RegionTranslate(clipped_dest_regions[i].region,
+ dest->pDrawable->x, dest->pDrawable->y);
+ COMPOSITE_REGION(clipped_dest_regions[i].region);
+ }
+ }
+ RegionDestroy(clipped_dest_regions[i].region);
+ }
+ free(clipped_dest_regions);
+ free(need_free_source_pixmap_priv);
+ free(need_free_mask_pixmap_priv);
+ ok = TRUE;
+ return ok;
}
diff --git a/xorg-server/glamor/glamor_picture.c b/xorg-server/glamor/glamor_picture.c
index 7d5ffbb76..f51a7e459 100644
--- a/xorg-server/glamor/glamor_picture.c
+++ b/xorg-server/glamor/glamor_picture.c
@@ -37,30 +37,30 @@
enum glamor_pixmap_status
glamor_upload_picture_to_texture(PicturePtr picture)
{
- PixmapPtr pixmap;
- assert(picture->pDrawable);
- pixmap = glamor_get_drawable_pixmap(picture->pDrawable);
+ PixmapPtr pixmap;
- return glamor_upload_pixmap_to_texture(pixmap);
-}
+ assert(picture->pDrawable);
+ pixmap = glamor_get_drawable_pixmap(picture->pDrawable);
+ return glamor_upload_pixmap_to_texture(pixmap);
+}
Bool
glamor_prepare_access_picture(PicturePtr picture, glamor_access_t access)
{
- if (!picture || !picture->pDrawable)
- return TRUE;
+ if (!picture || !picture->pDrawable)
+ return TRUE;
- return glamor_prepare_access(picture->pDrawable, access);
+ return glamor_prepare_access(picture->pDrawable, access);
}
void
glamor_finish_access_picture(PicturePtr picture, glamor_access_t access)
{
- if (!picture || !picture->pDrawable)
- return;
+ if (!picture || !picture->pDrawable)
+ return;
- glamor_finish_access(picture->pDrawable, access);
+ glamor_finish_access(picture->pDrawable, access);
}
/*
@@ -71,61 +71,62 @@ glamor_finish_access_picture(PicturePtr picture, glamor_access_t access)
int
glamor_create_picture(PicturePtr picture)
{
- PixmapPtr pixmap;
- glamor_pixmap_private *pixmap_priv;
-
- if (!picture || !picture->pDrawable)
- return 0;
-
- pixmap = glamor_get_drawable_pixmap(picture->pDrawable);
- pixmap_priv = glamor_get_pixmap_private(pixmap);
- if (!pixmap_priv) {
- /* We must create a pixmap priv to track the picture format even
- * if the pixmap is a pure in memory pixmap. The reason is that
- * we may need to upload this pixmap to a texture on the fly. During
- * the uploading, we need to know the picture format. */
- glamor_set_pixmap_type(pixmap, GLAMOR_MEMORY);
- pixmap_priv = glamor_get_pixmap_private(pixmap);
- } else {
- if (GLAMOR_PIXMAP_PRIV_HAS_FBO(pixmap_priv)) {
- /* If the picture format is not compatible with glamor fbo format,
- * we have to mark this pixmap as a separated texture, and don't
- * fallback to DDX layer. */
- if (pixmap_priv->type == GLAMOR_TEXTURE_DRM
- && !glamor_pict_format_is_compatible(picture->format,
- pixmap->drawable.depth))
- glamor_set_pixmap_type(pixmap, GLAMOR_SEPARATE_TEXTURE);
- }
- }
-
- pixmap_priv->base.is_picture = 1;
- pixmap_priv->base.picture = picture;
-
- return miCreatePicture(picture);
+ PixmapPtr pixmap;
+ glamor_pixmap_private *pixmap_priv;
+
+ if (!picture || !picture->pDrawable)
+ return 0;
+
+ pixmap = glamor_get_drawable_pixmap(picture->pDrawable);
+ pixmap_priv = glamor_get_pixmap_private(pixmap);
+ if (!pixmap_priv) {
+ /* We must create a pixmap priv to track the picture format even
+ * if the pixmap is a pure in memory pixmap. The reason is that
+ * we may need to upload this pixmap to a texture on the fly. During
+ * the uploading, we need to know the picture format. */
+ glamor_set_pixmap_type(pixmap, GLAMOR_MEMORY);
+ pixmap_priv = glamor_get_pixmap_private(pixmap);
+ }
+ else {
+ if (GLAMOR_PIXMAP_PRIV_HAS_FBO(pixmap_priv)) {
+ /* If the picture format is not compatible with glamor fbo format,
+ * we have to mark this pixmap as a separated texture, and don't
+ * fallback to DDX layer. */
+ if (pixmap_priv->type == GLAMOR_TEXTURE_DRM
+ && !glamor_pict_format_is_compatible(picture->format,
+ pixmap->drawable.depth))
+ glamor_set_pixmap_type(pixmap, GLAMOR_SEPARATE_TEXTURE);
+ }
+ }
+
+ pixmap_priv->base.is_picture = 1;
+ pixmap_priv->base.picture = picture;
+
+ return miCreatePicture(picture);
}
void
glamor_destroy_picture(PicturePtr picture)
{
- PixmapPtr pixmap;
- glamor_pixmap_private *pixmap_priv;
+ PixmapPtr pixmap;
+ glamor_pixmap_private *pixmap_priv;
- if (!picture || !picture->pDrawable)
- return;
+ if (!picture || !picture->pDrawable)
+ return;
- pixmap = glamor_get_drawable_pixmap(picture->pDrawable);
- pixmap_priv = glamor_get_pixmap_private(pixmap);
+ pixmap = glamor_get_drawable_pixmap(picture->pDrawable);
+ pixmap_priv = glamor_get_pixmap_private(pixmap);
- if (pixmap_priv) {
- pixmap_priv->base.is_picture = 0;
- pixmap_priv->base.picture = NULL;
- }
- miDestroyPicture(picture);
+ if (pixmap_priv) {
+ pixmap_priv->base.is_picture = 0;
+ pixmap_priv->base.picture = NULL;
+ }
+ miDestroyPicture(picture);
}
void
glamor_picture_format_fixup(PicturePtr picture,
- glamor_pixmap_private * pixmap_priv)
+ glamor_pixmap_private *pixmap_priv)
{
- pixmap_priv->base.picture = picture;
+ pixmap_priv->base.picture = picture;
}
diff --git a/xorg-server/glamor/glamor_pixmap.c b/xorg-server/glamor/glamor_pixmap.c
index 84694ec3c..f7de59c39 100644
--- a/xorg-server/glamor/glamor_pixmap.c
+++ b/xorg-server/glamor/glamor_pixmap.c
@@ -37,21 +37,20 @@
*/
void
glamor_get_drawable_deltas(DrawablePtr drawable, PixmapPtr pixmap,
- int *x, int *y)
+ int *x, int *y)
{
#ifdef COMPOSITE
- if (drawable->type == DRAWABLE_WINDOW) {
- *x = -pixmap->screen_x;
- *y = -pixmap->screen_y;
- return;
- }
+ if (drawable->type == DRAWABLE_WINDOW) {
+ *x = -pixmap->screen_x;
+ *y = -pixmap->screen_y;
+ return;
+ }
#endif
- *x = 0;
- *y = 0;
+ *x = 0;
+ *y = 0;
}
-
void
glamor_pixmap_init(ScreenPtr screen)
{
@@ -64,173 +63,168 @@ glamor_pixmap_fini(ScreenPtr screen)
}
void
-glamor_set_destination_pixmap_fbo(glamor_pixmap_fbo * fbo, int x0, int y0, int width, int height)
+glamor_set_destination_pixmap_fbo(glamor_pixmap_fbo *fbo, int x0, int y0,
+ int width, int height)
{
- glamor_gl_dispatch *dispatch = glamor_get_dispatch(fbo->glamor_priv);
- dispatch->glBindFramebuffer(GL_FRAMEBUFFER, fbo->fb);
+ glamor_gl_dispatch *dispatch = glamor_get_dispatch(fbo->glamor_priv);
+
+ dispatch->glBindFramebuffer(GL_FRAMEBUFFER, fbo->fb);
#ifndef GLAMOR_GLES2
- dispatch->glMatrixMode(GL_PROJECTION);
- dispatch->glLoadIdentity();
- dispatch->glMatrixMode(GL_MODELVIEW);
- dispatch->glLoadIdentity();
+ dispatch->glMatrixMode(GL_PROJECTION);
+ dispatch->glLoadIdentity();
+ dispatch->glMatrixMode(GL_MODELVIEW);
+ dispatch->glLoadIdentity();
#endif
- dispatch->glViewport(x0, y0,
- width, height);
+ dispatch->glViewport(x0, y0, width, height);
- glamor_put_dispatch(fbo->glamor_priv);
+ glamor_put_dispatch(fbo->glamor_priv);
}
void
-glamor_set_destination_pixmap_priv_nc(glamor_pixmap_private * pixmap_priv)
+glamor_set_destination_pixmap_priv_nc(glamor_pixmap_private *pixmap_priv)
{
- int w,h;
+ int w, h;
- PIXMAP_PRIV_GET_ACTUAL_SIZE(pixmap_priv, w, h);
- glamor_set_destination_pixmap_fbo(pixmap_priv->base.fbo, 0, 0,
- w, h);
+ PIXMAP_PRIV_GET_ACTUAL_SIZE(pixmap_priv, w, h);
+ glamor_set_destination_pixmap_fbo(pixmap_priv->base.fbo, 0, 0, w, h);
}
int
-glamor_set_destination_pixmap_priv(glamor_pixmap_private * pixmap_priv)
+glamor_set_destination_pixmap_priv(glamor_pixmap_private *pixmap_priv)
{
- if (!GLAMOR_PIXMAP_PRIV_HAS_FBO(pixmap_priv))
- return -1;
+ if (!GLAMOR_PIXMAP_PRIV_HAS_FBO(pixmap_priv))
+ return -1;
- glamor_set_destination_pixmap_priv_nc(pixmap_priv);
- return 0;
+ glamor_set_destination_pixmap_priv_nc(pixmap_priv);
+ return 0;
}
int
glamor_set_destination_pixmap(PixmapPtr pixmap)
{
- int err;
- glamor_pixmap_private *pixmap_priv =
- glamor_get_pixmap_private(pixmap);
+ int err;
+ glamor_pixmap_private *pixmap_priv = glamor_get_pixmap_private(pixmap);
- err = glamor_set_destination_pixmap_priv(pixmap_priv);
- return err;
+ err = glamor_set_destination_pixmap_priv(pixmap_priv);
+ return err;
}
Bool
glamor_set_planemask(PixmapPtr pixmap, unsigned long planemask)
{
- if (glamor_pm_is_solid(&pixmap->drawable, planemask)) {
- return GL_TRUE;
- }
+ if (glamor_pm_is_solid(&pixmap->drawable, planemask)) {
+ return GL_TRUE;
+ }
- glamor_fallback("unsupported planemask %lx\n", planemask);
- return GL_FALSE;
+ glamor_fallback("unsupported planemask %lx\n", planemask);
+ return GL_FALSE;
}
Bool
glamor_set_alu(struct glamor_gl_dispatch *dispatch, unsigned char alu)
{
#ifndef GLAMOR_GLES2
- if (alu == GXcopy) {
- dispatch->glDisable(GL_COLOR_LOGIC_OP);
- return TRUE;
- }
- dispatch->glEnable(GL_COLOR_LOGIC_OP);
- switch (alu) {
- case GXclear:
- dispatch->glLogicOp(GL_CLEAR);
- break;
- case GXand:
- dispatch->glLogicOp(GL_AND);
- break;
- case GXandReverse:
- dispatch->glLogicOp(GL_AND_REVERSE);
- break;
- case GXandInverted:
- dispatch->glLogicOp(GL_AND_INVERTED);
- break;
- case GXnoop:
- dispatch->glLogicOp(GL_NOOP);
- break;
- case GXxor:
- dispatch->glLogicOp(GL_XOR);
- break;
- case GXor:
- dispatch->glLogicOp(GL_OR);
- break;
- case GXnor:
- dispatch->glLogicOp(GL_NOR);
- break;
- case GXequiv:
- dispatch->glLogicOp(GL_EQUIV);
- break;
- case GXinvert:
- dispatch->glLogicOp(GL_INVERT);
- break;
- case GXorReverse:
- dispatch->glLogicOp(GL_OR_REVERSE);
- break;
- case GXcopyInverted:
- dispatch->glLogicOp(GL_COPY_INVERTED);
- break;
- case GXorInverted:
- dispatch->glLogicOp(GL_OR_INVERTED);
- break;
- case GXnand:
- dispatch->glLogicOp(GL_NAND);
- break;
- case GXset:
- dispatch->glLogicOp(GL_SET);
- break;
- default:
- glamor_fallback("unsupported alu %x\n", alu);
- return FALSE;
- }
+ if (alu == GXcopy) {
+ dispatch->glDisable(GL_COLOR_LOGIC_OP);
+ return TRUE;
+ }
+ dispatch->glEnable(GL_COLOR_LOGIC_OP);
+ switch (alu) {
+ case GXclear:
+ dispatch->glLogicOp(GL_CLEAR);
+ break;
+ case GXand:
+ dispatch->glLogicOp(GL_AND);
+ break;
+ case GXandReverse:
+ dispatch->glLogicOp(GL_AND_REVERSE);
+ break;
+ case GXandInverted:
+ dispatch->glLogicOp(GL_AND_INVERTED);
+ break;
+ case GXnoop:
+ dispatch->glLogicOp(GL_NOOP);
+ break;
+ case GXxor:
+ dispatch->glLogicOp(GL_XOR);
+ break;
+ case GXor:
+ dispatch->glLogicOp(GL_OR);
+ break;
+ case GXnor:
+ dispatch->glLogicOp(GL_NOR);
+ break;
+ case GXequiv:
+ dispatch->glLogicOp(GL_EQUIV);
+ break;
+ case GXinvert:
+ dispatch->glLogicOp(GL_INVERT);
+ break;
+ case GXorReverse:
+ dispatch->glLogicOp(GL_OR_REVERSE);
+ break;
+ case GXcopyInverted:
+ dispatch->glLogicOp(GL_COPY_INVERTED);
+ break;
+ case GXorInverted:
+ dispatch->glLogicOp(GL_OR_INVERTED);
+ break;
+ case GXnand:
+ dispatch->glLogicOp(GL_NAND);
+ break;
+ case GXset:
+ dispatch->glLogicOp(GL_SET);
+ break;
+ default:
+ glamor_fallback("unsupported alu %x\n", alu);
+ return FALSE;
+ }
#else
- if (alu != GXcopy)
- return FALSE;
+ if (alu != GXcopy)
+ return FALSE;
#endif
- return TRUE;
+ return TRUE;
}
static void *
-_glamor_color_convert_a1_a8(void *src_bits, void *dst_bits, int w, int h, int stride, int revert)
+_glamor_color_convert_a1_a8(void *src_bits, void *dst_bits, int w, int h,
+ int stride, int revert)
{
- PictFormatShort dst_format, src_format;
- pixman_image_t *dst_image;
- pixman_image_t *src_image;
- int src_stride;
-
- if (revert == REVERT_UPLOADING_A1) {
- src_format = PICT_a1;
- dst_format = PICT_a8;
- src_stride = PixmapBytePad(w, 1);
- } else {
- dst_format = PICT_a1;
- src_format = PICT_a8;
- src_stride = (((w * 8 + 7) / 8) + 3) & ~3;
- }
-
- dst_image = pixman_image_create_bits(dst_format,
- w, h,
- dst_bits,
- stride);
- if (dst_image == NULL) {
- return NULL;
- }
-
- src_image = pixman_image_create_bits(src_format,
- w, h,
- src_bits,
- src_stride);
-
- if (src_image == NULL) {
- pixman_image_unref(dst_image);
- return NULL;
- }
-
- pixman_image_composite(PictOpSrc, src_image, NULL, dst_image,
- 0, 0, 0, 0, 0, 0,
- w,h);
-
- pixman_image_unref(src_image);
- pixman_image_unref(dst_image);
- return dst_bits;
+ PictFormatShort dst_format, src_format;
+ pixman_image_t *dst_image;
+ pixman_image_t *src_image;
+ int src_stride;
+
+ if (revert == REVERT_UPLOADING_A1) {
+ src_format = PICT_a1;
+ dst_format = PICT_a8;
+ src_stride = PixmapBytePad(w, 1);
+ }
+ else {
+ dst_format = PICT_a1;
+ src_format = PICT_a8;
+ src_stride = (((w * 8 + 7) / 8) + 3) & ~3;
+ }
+
+ dst_image = pixman_image_create_bits(dst_format, w, h, dst_bits, stride);
+ if (dst_image == NULL) {
+ return NULL;
+ }
+
+ src_image = pixman_image_create_bits(src_format,
+ w, h, src_bits, src_stride);
+
+ if (src_image == NULL) {
+ pixman_image_unref(dst_image);
+ return NULL;
+ }
+
+ pixman_image_composite(PictOpSrc, src_image, NULL, dst_image,
+ 0, 0, 0, 0, 0, 0, w, h);
+
+ pixman_image_unref(src_image);
+ pixman_image_unref(dst_image);
+ return dst_bits;
}
#define ADJUST_BITS(d, src_bits, dst_bits) (((dst_bits) == (src_bits)) ? (d) : \
@@ -248,7 +242,7 @@ _glamor_color_convert_a1_a8(void *src_bits, void *dst_bits, int w, int h, int st
b_shift, b_bits, \
g_shift, g_bits, \
r_shift, r_bits) \
- { \
+ do { \
typeof(src) a,b,g,r; \
typeof(src) a_mask_src, b_mask_src, g_mask_src, r_mask_src;\
a_mask_src = (((1 << (a_bits_src)) - 1) << a_shift_src);\
@@ -270,79 +264,80 @@ _glamor_color_convert_a1_a8(void *src_bits, void *dst_bits, int w, int h, int st
(*dst) = ((a) << (a_shift)) | ((b) << (b_shift)) | ((g) << (g_shift)) | ((r) << (r_shift)); \
else \
(*dst) = ((a) << (a_shift)) | ((r) << (b_shift)) | ((g) << (g_shift)) | ((b) << (r_shift)); \
- }
+ } while (0)
static void *
-_glamor_color_revert_x2b10g10r10(void *src_bits, void *dst_bits, int w, int h, int stride, int no_alpha, int revert, int swap_rb)
+_glamor_color_revert_x2b10g10r10(void *src_bits, void *dst_bits, int w, int h,
+ int stride, int no_alpha, int revert,
+ int swap_rb)
{
- int x,y;
- unsigned int *words, *saved_words, *source_words;
- int swap = !(swap_rb == SWAP_NONE_DOWNLOADING || swap_rb == SWAP_NONE_UPLOADING);
-
- source_words = src_bits;
- words = dst_bits;
- saved_words = words;
-
- for (y = 0; y < h; y++)
- {
- DEBUGF("Line %d : ", y);
- for (x = 0; x < w; x++)
- {
- unsigned int pixel = source_words[x];
-
- if (revert == REVERT_DOWNLOADING_2_10_10_10)
- GLAMOR_DO_CONVERT(pixel, &words[x], no_alpha, swap,
- 24, 8, 16, 8, 8, 8, 0, 8,
- 30, 2, 20, 10, 10, 10, 0, 10)
- else
- GLAMOR_DO_CONVERT(pixel, &words[x], no_alpha, swap,
- 30, 2, 20, 10, 10, 10, 0, 10,
- 24, 8, 16, 8, 8, 8, 0, 8);
- DEBUGF("%x:%x ", pixel, words[x]);
- }
- DEBUGF("\n");
- words += stride / sizeof(*words);
- source_words += stride / sizeof(*words);
- }
- DEBUGF("\n");
- return saved_words;
+ int x, y;
+ unsigned int *words, *saved_words, *source_words;
+ int swap = !(swap_rb == SWAP_NONE_DOWNLOADING ||
+ swap_rb == SWAP_NONE_UPLOADING);
+
+ source_words = src_bits;
+ words = dst_bits;
+ saved_words = words;
+
+ for (y = 0; y < h; y++) {
+ DEBUGF("Line %d : ", y);
+ for (x = 0; x < w; x++) {
+ unsigned int pixel = source_words[x];
+
+ if (revert == REVERT_DOWNLOADING_2_10_10_10)
+ GLAMOR_DO_CONVERT(pixel, &words[x], no_alpha, swap,
+ 24, 8, 16, 8, 8, 8, 0, 8,
+ 30, 2, 20, 10, 10, 10, 0, 10);
+ else
+ GLAMOR_DO_CONVERT(pixel, &words[x], no_alpha, swap,
+ 30, 2, 20, 10, 10, 10, 0, 10,
+ 24, 8, 16, 8, 8, 8, 0, 8);
+ DEBUGF("%x:%x ", pixel, words[x]);
+ }
+ DEBUGF("\n");
+ words += stride / sizeof(*words);
+ source_words += stride / sizeof(*words);
+ }
+ DEBUGF("\n");
+ return saved_words;
}
static void *
-_glamor_color_revert_x1b5g5r5(void *src_bits, void *dst_bits, int w, int h, int stride, int no_alpha, int revert, int swap_rb)
+_glamor_color_revert_x1b5g5r5(void *src_bits, void *dst_bits, int w, int h,
+ int stride, int no_alpha, int revert, int swap_rb)
{
- int x,y;
- unsigned short *words, *saved_words, *source_words;
- int swap = !(swap_rb == SWAP_NONE_DOWNLOADING || swap_rb == SWAP_NONE_UPLOADING);
-
- words = dst_bits;
- source_words = src_bits;
- saved_words = words;
-
- for (y = 0; y < h; y++)
- {
- DEBUGF("Line %d : ", y);
- for (x = 0; x < w; x++)
- {
- unsigned short pixel = source_words[x];
-
- if (revert == REVERT_DOWNLOADING_1_5_5_5)
- GLAMOR_DO_CONVERT(pixel, &words[x], no_alpha, swap,
- 0, 1, 1, 5, 6, 5, 11, 5,
- 15, 1, 10, 5, 5, 5, 0, 5)
- else
- GLAMOR_DO_CONVERT(pixel, &words[x], no_alpha, swap,
- 15, 1, 10, 5, 5, 5, 0, 5,
- 0, 1, 1, 5, 6, 5, 11, 5);
- DEBUGF("%04x:%04x ", pixel, words[x]);
- }
- DEBUGF("\n");
- words += stride / sizeof(*words);
- source_words += stride / sizeof(*words);
- }
- DEBUGF("\n");
- return saved_words;
+ int x, y;
+ unsigned short *words, *saved_words, *source_words;
+ int swap = !(swap_rb == SWAP_NONE_DOWNLOADING ||
+ swap_rb == SWAP_NONE_UPLOADING);
+
+ words = dst_bits;
+ source_words = src_bits;
+ saved_words = words;
+
+ for (y = 0; y < h; y++) {
+ DEBUGF("Line %d : ", y);
+ for (x = 0; x < w; x++) {
+ unsigned short pixel = source_words[x];
+
+ if (revert == REVERT_DOWNLOADING_1_5_5_5)
+ GLAMOR_DO_CONVERT(pixel, &words[x], no_alpha, swap,
+ 0, 1, 1, 5, 6, 5, 11, 5,
+ 15, 1, 10, 5, 5, 5, 0, 5);
+ else
+ GLAMOR_DO_CONVERT(pixel, &words[x], no_alpha, swap,
+ 15, 1, 10, 5, 5, 5, 0, 5,
+ 0, 1, 1, 5, 6, 5, 11, 5);
+ DEBUGF("%04x:%04x ", pixel, words[x]);
+ }
+ DEBUGF("\n");
+ words += stride / sizeof(*words);
+ source_words += stride / sizeof(*words);
+ }
+ DEBUGF("\n");
+ return saved_words;
}
/*
@@ -364,18 +359,28 @@ _glamor_color_revert_x1b5g5r5(void *src_bits, void *dst_bits, int w, int h, int
*/
static void *
-glamor_color_convert_to_bits(void *src_bits, void *dst_bits, int w, int h, int stride, int no_alpha, int revert, int swap_rb)
+glamor_color_convert_to_bits(void *src_bits, void *dst_bits, int w, int h,
+ int stride, int no_alpha, int revert, int swap_rb)
{
- if (revert == REVERT_DOWNLOADING_A1 || revert == REVERT_UPLOADING_A1) {
- return _glamor_color_convert_a1_a8(src_bits, dst_bits, w, h, stride, revert);
- } else if (revert == REVERT_DOWNLOADING_2_10_10_10 || revert == REVERT_UPLOADING_2_10_10_10) {
- return _glamor_color_revert_x2b10g10r10(src_bits, dst_bits, w, h, stride, no_alpha, revert, swap_rb);
- } else if (revert == REVERT_DOWNLOADING_1_5_5_5 || revert == REVERT_UPLOADING_1_5_5_5) {
- return _glamor_color_revert_x1b5g5r5(src_bits, dst_bits, w, h, stride, no_alpha, revert, swap_rb);
- } else
- ErrorF("convert a non-supported mode %x.\n", revert);
-
- return NULL;
+ if (revert == REVERT_DOWNLOADING_A1 || revert == REVERT_UPLOADING_A1) {
+ return _glamor_color_convert_a1_a8(src_bits, dst_bits, w, h, stride,
+ revert);
+ }
+ else if (revert == REVERT_DOWNLOADING_2_10_10_10 ||
+ revert == REVERT_UPLOADING_2_10_10_10) {
+ return _glamor_color_revert_x2b10g10r10(src_bits, dst_bits, w, h,
+ stride, no_alpha, revert,
+ swap_rb);
+ }
+ else if (revert == REVERT_DOWNLOADING_1_5_5_5 ||
+ revert == REVERT_UPLOADING_1_5_5_5) {
+ return _glamor_color_revert_x1b5g5r5(src_bits, dst_bits, w, h, stride,
+ no_alpha, revert, swap_rb);
+ }
+ else
+ ErrorF("convert a non-supported mode %x.\n", revert);
+
+ return NULL;
}
/**
@@ -385,198 +390,182 @@ glamor_color_convert_to_bits(void *src_bits, void *dst_bits, int w, int h, int s
int in_restore = 0;
static void
__glamor_upload_pixmap_to_texture(PixmapPtr pixmap, unsigned int *tex,
- GLenum format,
- GLenum type,
- int x, int y, int w, int h,
- void *bits, int pbo)
+ GLenum format,
+ GLenum type,
+ int x, int y, int w, int h,
+ void *bits, int pbo)
{
- glamor_screen_private *glamor_priv =
- glamor_get_screen_private(pixmap->drawable.pScreen);
- glamor_gl_dispatch *dispatch;
- int non_sub = 0;
- unsigned int iformat = 0;
-
- dispatch = glamor_get_dispatch(glamor_priv);
- if (*tex == 0) {
- dispatch->glGenTextures(1, tex);
- if (glamor_priv->gl_flavor == GLAMOR_GL_DESKTOP)
- gl_iformat_for_depth(pixmap->drawable.depth, &iformat);
- else
- iformat = format;
- non_sub = 1;
- assert(x == 0 && y == 0);
- }
-
- dispatch->glBindTexture(GL_TEXTURE_2D, *tex);
- dispatch->glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER,
- GL_NEAREST);
- dispatch->glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER,
- GL_NEAREST);
- dispatch->glPixelStorei(GL_UNPACK_ALIGNMENT, 4);
-
- if (bits == NULL)
- dispatch->glBindBuffer(GL_PIXEL_UNPACK_BUFFER,
- pbo);
- if (non_sub)
- dispatch->glTexImage2D(GL_TEXTURE_2D,
- 0, iformat, w, h, 0,
- format, type,
- bits);
- else
- dispatch->glTexSubImage2D(GL_TEXTURE_2D,
- 0, x, y, w, h,
- format, type,
- bits);
-
- if (bits == NULL)
- dispatch->glBindBuffer(GL_PIXEL_UNPACK_BUFFER, 0);
- glamor_put_dispatch(glamor_priv);
+ glamor_screen_private *glamor_priv =
+ glamor_get_screen_private(pixmap->drawable.pScreen);
+ glamor_gl_dispatch *dispatch;
+ int non_sub = 0;
+ unsigned int iformat = 0;
+
+ dispatch = glamor_get_dispatch(glamor_priv);
+ if (*tex == 0) {
+ dispatch->glGenTextures(1, tex);
+ if (glamor_priv->gl_flavor == GLAMOR_GL_DESKTOP)
+ gl_iformat_for_depth(pixmap->drawable.depth, &iformat);
+ else
+ iformat = format;
+ non_sub = 1;
+ assert(x == 0 && y == 0);
+ }
+
+ dispatch->glBindTexture(GL_TEXTURE_2D, *tex);
+ dispatch->glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST);
+ dispatch->glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST);
+ dispatch->glPixelStorei(GL_UNPACK_ALIGNMENT, 4);
+
+ if (bits == NULL)
+ dispatch->glBindBuffer(GL_PIXEL_UNPACK_BUFFER, pbo);
+ if (non_sub)
+ dispatch->glTexImage2D(GL_TEXTURE_2D,
+ 0, iformat, w, h, 0, format, type, bits);
+ else
+ dispatch->glTexSubImage2D(GL_TEXTURE_2D,
+ 0, x, y, w, h, format, type, bits);
+
+ if (bits == NULL)
+ dispatch->glBindBuffer(GL_PIXEL_UNPACK_BUFFER, 0);
+ glamor_put_dispatch(glamor_priv);
}
static Bool
-_glamor_upload_bits_to_pixmap_texture(PixmapPtr pixmap, GLenum format, GLenum type,
- int no_alpha, int revert,
- int swap_rb, int x, int y, int w, int h,
- int stride, void* bits, int pbo)
+_glamor_upload_bits_to_pixmap_texture(PixmapPtr pixmap, GLenum format,
+ GLenum type, int no_alpha, int revert,
+ int swap_rb, int x, int y, int w, int h,
+ int stride, void *bits, int pbo)
{
- glamor_pixmap_private *pixmap_priv = glamor_get_pixmap_private(pixmap);
- glamor_screen_private *glamor_priv = glamor_get_screen_private(pixmap->drawable.pScreen);
- glamor_gl_dispatch *dispatch;
- static float vertices[8];
- static float texcoords[8] = { 0, 1,
- 1, 1,
- 1, 0,
- 0, 0
- };
- static float texcoords_inv[8] = { 0, 0,
- 1, 0,
- 1, 1,
- 0, 1
- };
- float *ptexcoords;
- float dst_xscale, dst_yscale;
- GLuint tex = 0;
- int need_flip;
- int need_free_bits = 0;
-
- need_flip = !glamor_priv->yInverted;
-
- if (bits == NULL)
- goto ready_to_upload;
-
- if (revert > REVERT_NORMAL) {
- /* XXX if we are restoring the pixmap, then we may not need to allocate
- * new buffer */
- void *converted_bits;
-
- if (pixmap->drawable.depth == 1)
- stride = (((w * 8 + 7) / 8) + 3) & ~3;
-
- converted_bits = malloc(h * stride);
-
- if (converted_bits == NULL)
- return FALSE;
- bits = glamor_color_convert_to_bits(bits, converted_bits, w, h,
- stride,
- no_alpha, revert, swap_rb);
- if (bits == NULL) {
- ErrorF("Failed to convert pixmap no_alpha %d,"
- "revert mode %d, swap mode %d\n", no_alpha, revert, swap_rb);
- return FALSE;
- }
- no_alpha = 0;
- revert = REVERT_NONE;
- swap_rb = SWAP_NONE_UPLOADING;
- need_free_bits = TRUE;
- }
-
-ready_to_upload:
-
- /* Try fast path firstly, upload the pixmap to the texture attached
- * to the fbo directly. */
- if (no_alpha == 0
- && revert == REVERT_NONE
- && swap_rb == SWAP_NONE_UPLOADING
- && !need_flip
+ glamor_pixmap_private *pixmap_priv = glamor_get_pixmap_private(pixmap);
+ glamor_screen_private *glamor_priv =
+ glamor_get_screen_private(pixmap->drawable.pScreen);
+ glamor_gl_dispatch *dispatch;
+ static float vertices[8];
+
+ static float texcoords[8] = { 0, 1,
+ 1, 1,
+ 1, 0,
+ 0, 0
+ };
+ static float texcoords_inv[8] = { 0, 0,
+ 1, 0,
+ 1, 1,
+ 0, 1
+ };
+ float *ptexcoords;
+ float dst_xscale, dst_yscale;
+ GLuint tex = 0;
+ int need_flip;
+ int need_free_bits = 0;
+
+ need_flip = !glamor_priv->yInverted;
+
+ if (bits == NULL)
+ goto ready_to_upload;
+
+ if (revert > REVERT_NORMAL) {
+ /* XXX if we are restoring the pixmap, then we may not need to allocate
+ * new buffer */
+ void *converted_bits;
+
+ if (pixmap->drawable.depth == 1)
+ stride = (((w * 8 + 7) / 8) + 3) & ~3;
+
+ converted_bits = malloc(h * stride);
+
+ if (converted_bits == NULL)
+ return FALSE;
+ bits = glamor_color_convert_to_bits(bits, converted_bits, w, h,
+ stride, no_alpha, revert, swap_rb);
+ if (bits == NULL) {
+ ErrorF("Failed to convert pixmap no_alpha %d,"
+ "revert mode %d, swap mode %d\n", no_alpha, revert, swap_rb);
+ return FALSE;
+ }
+ no_alpha = 0;
+ revert = REVERT_NONE;
+ swap_rb = SWAP_NONE_UPLOADING;
+ need_free_bits = TRUE;
+ }
+
+ ready_to_upload:
+
+ /* Try fast path firstly, upload the pixmap to the texture attached
+ * to the fbo directly. */
+ if (no_alpha == 0
+ && revert == REVERT_NONE && swap_rb == SWAP_NONE_UPLOADING && !need_flip
#ifdef WALKAROUND_LARGE_TEXTURE_MAP
- && pixmap_priv->type != GLAMOR_TEXTURE_LARGE
+ && pixmap_priv->type != GLAMOR_TEXTURE_LARGE
#endif
- ) {
- int fbo_x_off, fbo_y_off;
- assert(pixmap_priv->base.fbo->tex);
- pixmap_priv_get_fbo_off(pixmap_priv, &fbo_x_off, &fbo_y_off);
-
- assert(x + fbo_x_off >= 0 && y + fbo_y_off >= 0);
- assert(x + fbo_x_off + w <= pixmap_priv->base.fbo->width);
- assert(y + fbo_y_off + h <= pixmap_priv->base.fbo->height);
- __glamor_upload_pixmap_to_texture(pixmap, &pixmap_priv->base.fbo->tex,
- format, type,
- x + fbo_x_off, y + fbo_y_off, w, h,
- bits, pbo);
- return TRUE;
- }
-
- if (need_flip)
- ptexcoords = texcoords;
- else
- ptexcoords = texcoords_inv;
-
- pixmap_priv_get_dest_scale(pixmap_priv, &dst_xscale, &dst_yscale);
- glamor_set_normalize_vcoords(pixmap_priv, dst_xscale,
- dst_yscale,
- x, y,
- x + w, y + h,
- glamor_priv->yInverted,
- vertices);
- /* Slow path, we need to flip y or wire alpha to 1. */
- dispatch = glamor_get_dispatch(glamor_priv);
- dispatch->glVertexAttribPointer(GLAMOR_VERTEX_POS, 2, GL_FLOAT,
- GL_FALSE, 2 * sizeof(float),
- vertices);
- dispatch->glEnableVertexAttribArray(GLAMOR_VERTEX_POS);
- dispatch->glVertexAttribPointer(GLAMOR_VERTEX_SOURCE, 2, GL_FLOAT,
- GL_FALSE, 2 * sizeof(float),
- ptexcoords);
- dispatch->glEnableVertexAttribArray(GLAMOR_VERTEX_SOURCE);
-
- glamor_set_destination_pixmap_priv_nc(pixmap_priv);
- __glamor_upload_pixmap_to_texture(pixmap, &tex,
- format, type,
- 0, 0, w, h,
- bits, pbo);
- dispatch->glActiveTexture(GL_TEXTURE0);
- dispatch->glBindTexture(GL_TEXTURE_2D, tex);
-
- dispatch->glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER,
- GL_NEAREST);
- dispatch->glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER,
- GL_NEAREST);
+ ) {
+ int fbo_x_off, fbo_y_off;
+
+ assert(pixmap_priv->base.fbo->tex);
+ pixmap_priv_get_fbo_off(pixmap_priv, &fbo_x_off, &fbo_y_off);
+
+ assert(x + fbo_x_off >= 0 && y + fbo_y_off >= 0);
+ assert(x + fbo_x_off + w <= pixmap_priv->base.fbo->width);
+ assert(y + fbo_y_off + h <= pixmap_priv->base.fbo->height);
+ __glamor_upload_pixmap_to_texture(pixmap, &pixmap_priv->base.fbo->tex,
+ format, type,
+ x + fbo_x_off, y + fbo_y_off, w, h,
+ bits, pbo);
+ return TRUE;
+ }
+
+ if (need_flip)
+ ptexcoords = texcoords;
+ else
+ ptexcoords = texcoords_inv;
+
+ pixmap_priv_get_dest_scale(pixmap_priv, &dst_xscale, &dst_yscale);
+ glamor_set_normalize_vcoords(pixmap_priv, dst_xscale,
+ dst_yscale,
+ x, y,
+ x + w, y + h,
+ glamor_priv->yInverted, vertices);
+ /* Slow path, we need to flip y or wire alpha to 1. */
+ dispatch = glamor_get_dispatch(glamor_priv);
+ dispatch->glVertexAttribPointer(GLAMOR_VERTEX_POS, 2, GL_FLOAT,
+ GL_FALSE, 2 * sizeof(float), vertices);
+ dispatch->glEnableVertexAttribArray(GLAMOR_VERTEX_POS);
+ dispatch->glVertexAttribPointer(GLAMOR_VERTEX_SOURCE, 2, GL_FLOAT,
+ GL_FALSE, 2 * sizeof(float), ptexcoords);
+ dispatch->glEnableVertexAttribArray(GLAMOR_VERTEX_SOURCE);
+
+ glamor_set_destination_pixmap_priv_nc(pixmap_priv);
+ __glamor_upload_pixmap_to_texture(pixmap, &tex,
+ format, type, 0, 0, w, h, bits, pbo);
+ dispatch->glActiveTexture(GL_TEXTURE0);
+ dispatch->glBindTexture(GL_TEXTURE_2D, tex);
+
+ dispatch->glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST);
+ dispatch->glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST);
#ifndef GLAMOR_GLES2
- dispatch->glEnable(GL_TEXTURE_2D);
+ dispatch->glEnable(GL_TEXTURE_2D);
#endif
- dispatch->glUseProgram(glamor_priv->finish_access_prog[no_alpha]);
- dispatch->glUniform1i(glamor_priv->
- finish_access_revert[no_alpha],
- revert);
- dispatch->glUniform1i(glamor_priv->finish_access_swap_rb[no_alpha],
- swap_rb);
+ dispatch->glUseProgram(glamor_priv->finish_access_prog[no_alpha]);
+ dispatch->glUniform1i(glamor_priv->finish_access_revert[no_alpha], revert);
+ dispatch->glUniform1i(glamor_priv->finish_access_swap_rb[no_alpha],
+ swap_rb);
- dispatch->glDrawArrays(GL_TRIANGLE_FAN, 0, 4);
+ dispatch->glDrawArrays(GL_TRIANGLE_FAN, 0, 4);
#ifndef GLAMOR_GLES2
- dispatch->glDisable(GL_TEXTURE_2D);
+ dispatch->glDisable(GL_TEXTURE_2D);
#endif
- dispatch->glUseProgram(0);
- dispatch->glDisableVertexAttribArray(GLAMOR_VERTEX_POS);
- dispatch->glDisableVertexAttribArray(GLAMOR_VERTEX_SOURCE);
- dispatch->glDeleteTextures(1, &tex);
- dispatch->glBindFramebuffer(GL_FRAMEBUFFER, 0);
+ dispatch->glUseProgram(0);
+ dispatch->glDisableVertexAttribArray(GLAMOR_VERTEX_POS);
+ dispatch->glDisableVertexAttribArray(GLAMOR_VERTEX_SOURCE);
+ dispatch->glDeleteTextures(1, &tex);
+ dispatch->glBindFramebuffer(GL_FRAMEBUFFER, 0);
- glamor_put_dispatch(glamor_priv);
+ glamor_put_dispatch(glamor_priv);
- if (need_free_bits)
- free(bits);
- return TRUE;
+ if (need_free_bits)
+ free(bits);
+ return TRUE;
}
/*
@@ -587,54 +576,53 @@ ready_to_upload:
* 2. no_alpha != 0, we need to wire the alpha.
* */
static int
-glamor_pixmap_upload_prepare(PixmapPtr pixmap, GLenum format, int no_alpha, int revert, int swap_rb)
+glamor_pixmap_upload_prepare(PixmapPtr pixmap, GLenum format, int no_alpha,
+ int revert, int swap_rb)
{
- int flag = 0;
- glamor_pixmap_private *pixmap_priv;
- glamor_screen_private *glamor_priv;
- glamor_pixmap_fbo *fbo;
- GLenum iformat;
-
- pixmap_priv = glamor_get_pixmap_private(pixmap);
- glamor_priv = glamor_get_screen_private(pixmap->drawable.pScreen);
-
- if (pixmap_priv->base.gl_fbo)
- return 0;
-
- if (pixmap_priv->base.fbo
- && (pixmap_priv->base.fbo->width < pixmap->drawable.width
- || pixmap_priv->base.fbo->height < pixmap->drawable.height)) {
- fbo = glamor_pixmap_detach_fbo(pixmap_priv);
- glamor_destroy_fbo(fbo);
- }
-
- if (pixmap_priv->base.fbo && pixmap_priv->base.fbo->fb)
- return 0;
-
- if (!(no_alpha
- || (revert == REVERT_NORMAL)
- || (swap_rb != SWAP_NONE_UPLOADING)
- || !glamor_priv->yInverted)) {
- /* We don't need a fbo, a simple texture uploading should work. */
-
- flag = GLAMOR_CREATE_FBO_NO_FBO;
- }
-
- if ((flag == GLAMOR_CREATE_FBO_NO_FBO
- && pixmap_priv->base.fbo && pixmap_priv->base.fbo->tex)
- || (flag == 0
- && pixmap_priv->base.fbo && pixmap_priv->base.fbo->fb))
- return 0;
-
- if (glamor_priv->gl_flavor == GLAMOR_GL_DESKTOP)
- gl_iformat_for_depth(pixmap->drawable.depth, &iformat);
- else
- iformat = format;
-
- if (!glamor_pixmap_ensure_fbo(pixmap, iformat, flag))
- return -1;
-
- return 0;
+ int flag = 0;
+ glamor_pixmap_private *pixmap_priv;
+ glamor_screen_private *glamor_priv;
+ glamor_pixmap_fbo *fbo;
+ GLenum iformat;
+
+ pixmap_priv = glamor_get_pixmap_private(pixmap);
+ glamor_priv = glamor_get_screen_private(pixmap->drawable.pScreen);
+
+ if (pixmap_priv->base.gl_fbo)
+ return 0;
+
+ if (pixmap_priv->base.fbo
+ && (pixmap_priv->base.fbo->width < pixmap->drawable.width
+ || pixmap_priv->base.fbo->height < pixmap->drawable.height)) {
+ fbo = glamor_pixmap_detach_fbo(pixmap_priv);
+ glamor_destroy_fbo(fbo);
+ }
+
+ if (pixmap_priv->base.fbo && pixmap_priv->base.fbo->fb)
+ return 0;
+
+ if (!(no_alpha || (revert == REVERT_NORMAL)
+ || (swap_rb != SWAP_NONE_UPLOADING)
+ || !glamor_priv->yInverted)) {
+ /* We don't need a fbo, a simple texture uploading should work. */
+
+ flag = GLAMOR_CREATE_FBO_NO_FBO;
+ }
+
+ if ((flag == GLAMOR_CREATE_FBO_NO_FBO
+ && pixmap_priv->base.fbo && pixmap_priv->base.fbo->tex)
+ || (flag == 0 && pixmap_priv->base.fbo && pixmap_priv->base.fbo->fb))
+ return 0;
+
+ if (glamor_priv->gl_flavor == GLAMOR_GL_DESKTOP)
+ gl_iformat_for_depth(pixmap->drawable.depth, &iformat);
+ else
+ iformat = format;
+
+ if (!glamor_pixmap_ensure_fbo(pixmap, iformat, flag))
+ return -1;
+
+ return 0;
}
/*
@@ -642,185 +630,188 @@ glamor_pixmap_upload_prepare(PixmapPtr pixmap, GLenum format, int no_alpha, int
* */
static void
glamor_put_bits(char *dst_bits, int dst_stride, char *src_bits,
- int src_stride, int bpp,
- int x, int y, int w, int h)
+ int src_stride, int bpp, int x, int y, int w, int h)
{
- int j;
- int byte_per_pixel;
-
- byte_per_pixel = bpp / 8;
- src_bits += y * src_stride + (x * byte_per_pixel);
-
- for(j = y; j < y + h; j++)
- {
- memcpy(dst_bits, src_bits, w * byte_per_pixel);
- src_bits += src_stride;
- dst_bits += dst_stride;
- }
+ int j;
+ int byte_per_pixel;
+
+ byte_per_pixel = bpp / 8;
+ src_bits += y * src_stride + (x * byte_per_pixel);
+
+ for (j = y; j < y + h; j++) {
+ memcpy(dst_bits, src_bits, w * byte_per_pixel);
+ src_bits += src_stride;
+ dst_bits += dst_stride;
+ }
}
+
/*
* download sub region from a large region.
*/
static void
glamor_get_bits(char *dst_bits, int dst_stride, char *src_bits,
- int src_stride, int bpp,
- int x, int y, int w, int h)
+ int src_stride, int bpp, int x, int y, int w, int h)
{
- int j;
- int byte_per_pixel;
-
- byte_per_pixel = bpp / 8;
- dst_bits += y * dst_stride + x * byte_per_pixel;
-
- for(j = y; j < y + h; j++)
- {
- memcpy(dst_bits, src_bits, w * byte_per_pixel);
- src_bits += src_stride;
- dst_bits += dst_stride;
- }
-}
+ int j;
+ int byte_per_pixel;
+ byte_per_pixel = bpp / 8;
+ dst_bits += y * dst_stride + x * byte_per_pixel;
+
+ for (j = y; j < y + h; j++) {
+ memcpy(dst_bits, src_bits, w * byte_per_pixel);
+ src_bits += src_stride;
+ dst_bits += dst_stride;
+ }
+}
Bool
-glamor_upload_sub_pixmap_to_texture(PixmapPtr pixmap, int x, int y, int w, int h,
- int stride, void *bits, int pbo)
+glamor_upload_sub_pixmap_to_texture(PixmapPtr pixmap, int x, int y, int w,
+ int h, int stride, void *bits, int pbo)
{
- GLenum format, type;
- int no_alpha, revert, swap_rb;
- glamor_pixmap_private *pixmap_priv;
- Bool force_clip;
-
- if (glamor_get_tex_format_type_from_pixmap(pixmap,
- &format,
- &type,
- &no_alpha,
- &revert,
- &swap_rb, 1)) {
- glamor_fallback("Unknown pixmap depth %d.\n",
- pixmap->drawable.depth);
- return TRUE;
- }
- if (glamor_pixmap_upload_prepare(pixmap, format, no_alpha, revert, swap_rb))
- return FALSE;
-
- pixmap_priv = glamor_get_pixmap_private(pixmap);
- force_clip = pixmap_priv->base.glamor_priv->gl_flavor != GLAMOR_GL_DESKTOP
- && !glamor_check_fbo_size(pixmap_priv->base.glamor_priv, w, h);
-
- if (pixmap_priv->type == GLAMOR_TEXTURE_LARGE || force_clip) {
- RegionRec region;
- BoxRec box;
- int n_region;
- glamor_pixmap_clipped_regions *clipped_regions;
- void *sub_bits;
- int i,j;
-
- sub_bits = malloc(h * stride);
- if (sub_bits == NULL)
- return FALSE;
- box.x1 = x;
- box.y1 = y;
- box.x2 = x + w;
- box.y2 = y + h;
- RegionInitBoxes(&region, &box, 1);
- if (!force_clip)
- clipped_regions = glamor_compute_clipped_regions(pixmap_priv, &region, &n_region, 0, 0, 0);
- else
- clipped_regions = glamor_compute_clipped_regions_ext(pixmap_priv, &region, &n_region,
- pixmap_priv->base.glamor_priv->max_fbo_size,
- pixmap_priv->base.glamor_priv->max_fbo_size, 0, 0);
- DEBUGF("prepare upload %dx%d to a large pixmap %p\n", w, h, pixmap);
- for(i = 0; i < n_region; i++)
- {
- BoxPtr boxes;
- int nbox;
- int temp_stride;
- void *temp_bits;
-
- assert(pbo == 0);
-
- SET_PIXMAP_FBO_CURRENT(pixmap_priv, clipped_regions[i].block_idx);
-
- boxes = RegionRects(clipped_regions[i].region);
- nbox = RegionNumRects(clipped_regions[i].region);
- DEBUGF("split to %d boxes\n", nbox);
- for(j = 0; j < nbox; j++)
- {
- temp_stride = PixmapBytePad(boxes[j].x2 - boxes[j].x1,
- pixmap->drawable.depth);
-
- if (boxes[j].x1 == x && temp_stride == stride) {
- temp_bits = (char*)bits + (boxes[j].y1 - y) * stride;
- } else {
- temp_bits = sub_bits;
- glamor_put_bits(temp_bits, temp_stride, bits, stride,
- pixmap->drawable.bitsPerPixel,
- boxes[j].x1 - x, boxes[j].y1 - y,
- boxes[j].x2 - boxes[j].x1,
- boxes[j].y2 - boxes[j].y1);
- }
- DEBUGF("upload x %d y %d w %d h %d temp stride %d \n",
- boxes[j].x1 - x, boxes[j].y1 - y,
- boxes[j].x2 - boxes[j].x1,
- boxes[j].y2 - boxes[j].y1, temp_stride);
- if (_glamor_upload_bits_to_pixmap_texture(pixmap, format, type, no_alpha,
- revert, swap_rb, boxes[j].x1, boxes[j].y1,
- boxes[j].x2 - boxes[j].x1,
- boxes[j].y2 - boxes[j].y1,
- temp_stride, temp_bits, pbo) == FALSE) {
- RegionUninit(&region);
- free(sub_bits);
- assert(0);
- return FALSE;
- }
- }
- RegionDestroy(clipped_regions[i].region);
- }
- free(sub_bits);
- free(clipped_regions);
- RegionUninit(&region);
- return TRUE;
- } else
- return _glamor_upload_bits_to_pixmap_texture(pixmap, format, type, no_alpha, revert, swap_rb,
- x, y, w, h, stride, bits, pbo);
+ GLenum format, type;
+ int no_alpha, revert, swap_rb;
+ glamor_pixmap_private *pixmap_priv;
+ Bool force_clip;
+
+ if (glamor_get_tex_format_type_from_pixmap(pixmap,
+ &format,
+ &type,
+ &no_alpha,
+ &revert, &swap_rb, 1)) {
+ glamor_fallback("Unknown pixmap depth %d.\n", pixmap->drawable.depth);
+ return TRUE;
+ }
+ if (glamor_pixmap_upload_prepare(pixmap, format, no_alpha, revert, swap_rb))
+ return FALSE;
+
+ pixmap_priv = glamor_get_pixmap_private(pixmap);
+ force_clip = pixmap_priv->base.glamor_priv->gl_flavor != GLAMOR_GL_DESKTOP
+ && !glamor_check_fbo_size(pixmap_priv->base.glamor_priv, w, h);
+
+ if (pixmap_priv->type == GLAMOR_TEXTURE_LARGE || force_clip) {
+ RegionRec region;
+ BoxRec box;
+ int n_region;
+ glamor_pixmap_clipped_regions *clipped_regions;
+ void *sub_bits;
+ int i, j;
+
+ sub_bits = malloc(h * stride);
+ if (sub_bits == NULL)
+ return FALSE;
+ box.x1 = x;
+ box.y1 = y;
+ box.x2 = x + w;
+ box.y2 = y + h;
+ RegionInitBoxes(&region, &box, 1);
+ if (!force_clip)
+ clipped_regions =
+ glamor_compute_clipped_regions(pixmap_priv, &region, &n_region,
+ 0, 0, 0);
+ else
+ clipped_regions =
+ glamor_compute_clipped_regions_ext(pixmap_priv, &region,
+ &n_region,
+ pixmap_priv->base.
+ glamor_priv->max_fbo_size,
+ pixmap_priv->base.
+ glamor_priv->max_fbo_size, 0,
+ 0);
+ DEBUGF("prepare upload %dx%d to a large pixmap %p\n", w, h, pixmap);
+ for (i = 0; i < n_region; i++) {
+ BoxPtr boxes;
+ int nbox;
+ int temp_stride;
+ void *temp_bits;
+
+ assert(pbo == 0);
+
+ SET_PIXMAP_FBO_CURRENT(pixmap_priv, clipped_regions[i].block_idx);
+
+ boxes = RegionRects(clipped_regions[i].region);
+ nbox = RegionNumRects(clipped_regions[i].region);
+ DEBUGF("split to %d boxes\n", nbox);
+ for (j = 0; j < nbox; j++) {
+ temp_stride = PixmapBytePad(boxes[j].x2 - boxes[j].x1,
+ pixmap->drawable.depth);
+
+ if (boxes[j].x1 == x && temp_stride == stride) {
+ temp_bits = (char *) bits + (boxes[j].y1 - y) * stride;
+ }
+ else {
+ temp_bits = sub_bits;
+ glamor_put_bits(temp_bits, temp_stride, bits, stride,
+ pixmap->drawable.bitsPerPixel,
+ boxes[j].x1 - x, boxes[j].y1 - y,
+ boxes[j].x2 - boxes[j].x1,
+ boxes[j].y2 - boxes[j].y1);
+ }
+ DEBUGF("upload x %d y %d w %d h %d temp stride %d \n",
+ boxes[j].x1 - x, boxes[j].y1 - y,
+ boxes[j].x2 - boxes[j].x1,
+ boxes[j].y2 - boxes[j].y1, temp_stride);
+ if (_glamor_upload_bits_to_pixmap_texture
+ (pixmap, format, type, no_alpha, revert, swap_rb,
+ boxes[j].x1, boxes[j].y1, boxes[j].x2 - boxes[j].x1,
+ boxes[j].y2 - boxes[j].y1, temp_stride, temp_bits,
+ pbo) == FALSE) {
+ RegionUninit(&region);
+ free(sub_bits);
+ assert(0);
+ return FALSE;
+ }
+ }
+ RegionDestroy(clipped_regions[i].region);
+ }
+ free(sub_bits);
+ free(clipped_regions);
+ RegionUninit(&region);
+ return TRUE;
+ }
+ else
+ return _glamor_upload_bits_to_pixmap_texture(pixmap, format, type,
+ no_alpha, revert, swap_rb,
+ x, y, w, h, stride, bits,
+ pbo);
}
enum glamor_pixmap_status
glamor_upload_pixmap_to_texture(PixmapPtr pixmap)
{
- glamor_pixmap_private *pixmap_priv;
- void *data;
- int pbo;
- int ret;
-
- pixmap_priv = glamor_get_pixmap_private(pixmap);
-
- if ((pixmap_priv->base.fbo)
- && (pixmap_priv->base.fbo->pbo_valid)) {
- data = NULL;
- pbo = pixmap_priv->base.fbo->pbo;
- } else {
- data = pixmap->devPrivate.ptr;
- pbo = 0;
- }
-
- if (glamor_upload_sub_pixmap_to_texture(pixmap, 0, 0,
- pixmap->drawable.width,
- pixmap->drawable.height,
- pixmap->devKind,
- data, pbo))
- ret = GLAMOR_UPLOAD_DONE;
- else
- ret = GLAMOR_UPLOAD_FAILED;
-
- return ret;
+ glamor_pixmap_private *pixmap_priv;
+ void *data;
+ int pbo;
+ int ret;
+
+ pixmap_priv = glamor_get_pixmap_private(pixmap);
+
+ if ((pixmap_priv->base.fbo)
+ && (pixmap_priv->base.fbo->pbo_valid)) {
+ data = NULL;
+ pbo = pixmap_priv->base.fbo->pbo;
+ }
+ else {
+ data = pixmap->devPrivate.ptr;
+ pbo = 0;
+ }
+
+ if (glamor_upload_sub_pixmap_to_texture(pixmap, 0, 0,
+ pixmap->drawable.width,
+ pixmap->drawable.height,
+ pixmap->devKind, data, pbo))
+ ret = GLAMOR_UPLOAD_DONE;
+ else
+ ret = GLAMOR_UPLOAD_FAILED;
+
+ return ret;
}
void
glamor_restore_pixmap_to_texture(PixmapPtr pixmap)
{
- if (glamor_upload_pixmap_to_texture(pixmap) != GLAMOR_UPLOAD_DONE)
- LogMessage(X_WARNING, "Failed to restore pixmap to texture.\n");
+ if (glamor_upload_pixmap_to_texture(pixmap) != GLAMOR_UPLOAD_DONE)
+ LogMessage(X_WARNING, "Failed to restore pixmap to texture.\n");
}
/*
@@ -832,83 +823,68 @@ glamor_restore_pixmap_to_texture(PixmapPtr pixmap)
* */
glamor_pixmap_fbo *
-glamor_es2_pixmap_read_prepare(PixmapPtr source, int x, int y, int w, int h, GLenum format,
- GLenum type, int no_alpha, int revert, int swap_rb)
-
+glamor_es2_pixmap_read_prepare(PixmapPtr source, int x, int y, int w, int h,
+ GLenum format, GLenum type, int no_alpha,
+ int revert, int swap_rb)
{
- glamor_pixmap_private *source_priv;
- glamor_screen_private *glamor_priv;
- ScreenPtr screen;
- glamor_pixmap_fbo *temp_fbo;
- glamor_gl_dispatch *dispatch;
- float temp_xscale, temp_yscale, source_xscale, source_yscale;
- static float vertices[8];
- static float texcoords[8];
-
- screen = source->drawable.pScreen;
-
- glamor_priv = glamor_get_screen_private(screen);
- source_priv = glamor_get_pixmap_private(source);
- temp_fbo = glamor_create_fbo(glamor_priv,
- w, h,
- format,
- 0);
- if (temp_fbo == NULL)
- return NULL;
-
- dispatch = glamor_get_dispatch(glamor_priv);
- temp_xscale = 1.0 / w;
- temp_yscale = 1.0 / h;
-
- glamor_set_normalize_vcoords((struct glamor_pixmap_private*)NULL,temp_xscale,
- temp_yscale,
- 0, 0,
- w, h,
- glamor_priv->yInverted,
- vertices);
-
- dispatch->glVertexAttribPointer(GLAMOR_VERTEX_POS, 2, GL_FLOAT,
- GL_FALSE, 2 * sizeof(float),
- vertices);
- dispatch->glEnableVertexAttribArray(GLAMOR_VERTEX_POS);
-
- pixmap_priv_get_scale(source_priv, &source_xscale, &source_yscale);
- glamor_set_normalize_tcoords(source_priv, source_xscale,
- source_yscale,
- x, y,
- x + w, y + h,
- glamor_priv->yInverted,
- texcoords);
-
- dispatch->glVertexAttribPointer(GLAMOR_VERTEX_SOURCE, 2, GL_FLOAT,
- GL_FALSE, 2 * sizeof(float),
- texcoords);
- dispatch->glEnableVertexAttribArray(GLAMOR_VERTEX_SOURCE);
-
- dispatch->glActiveTexture(GL_TEXTURE0);
- dispatch->glBindTexture(GL_TEXTURE_2D, source_priv->base.fbo->tex);
- dispatch->glTexParameteri(GL_TEXTURE_2D,
- GL_TEXTURE_MIN_FILTER,
- GL_NEAREST);
- dispatch->glTexParameteri(GL_TEXTURE_2D,
- GL_TEXTURE_MAG_FILTER,
- GL_NEAREST);
-
- glamor_set_destination_pixmap_fbo(temp_fbo, 0, 0, w, h);
- dispatch->glUseProgram(glamor_priv->finish_access_prog[no_alpha]);
- dispatch->glUniform1i(glamor_priv->
- finish_access_revert[no_alpha],
- revert);
- dispatch->glUniform1i(glamor_priv->finish_access_swap_rb[no_alpha],
- swap_rb);
-
- dispatch->glDrawArrays(GL_TRIANGLE_FAN, 0, 4);
-
- dispatch->glDisableVertexAttribArray(GLAMOR_VERTEX_POS);
- dispatch->glDisableVertexAttribArray(GLAMOR_VERTEX_SOURCE);
- dispatch->glUseProgram(0);
- glamor_put_dispatch(glamor_priv);
- return temp_fbo;
+ glamor_pixmap_private *source_priv;
+ glamor_screen_private *glamor_priv;
+ ScreenPtr screen;
+ glamor_pixmap_fbo *temp_fbo;
+ glamor_gl_dispatch *dispatch;
+ float temp_xscale, temp_yscale, source_xscale, source_yscale;
+ static float vertices[8];
+ static float texcoords[8];
+
+ screen = source->drawable.pScreen;
+
+ glamor_priv = glamor_get_screen_private(screen);
+ source_priv = glamor_get_pixmap_private(source);
+ temp_fbo = glamor_create_fbo(glamor_priv, w, h, format, 0);
+ if (temp_fbo == NULL)
+ return NULL;
+
+ dispatch = glamor_get_dispatch(glamor_priv);
+ temp_xscale = 1.0 / w;
+ temp_yscale = 1.0 / h;
+
+ glamor_set_normalize_vcoords((struct glamor_pixmap_private *) NULL,
+ temp_xscale, temp_yscale, 0, 0, w, h,
+ glamor_priv->yInverted, vertices);
+
+ dispatch->glVertexAttribPointer(GLAMOR_VERTEX_POS, 2, GL_FLOAT,
+ GL_FALSE, 2 * sizeof(float), vertices);
+ dispatch->glEnableVertexAttribArray(GLAMOR_VERTEX_POS);
+
+ pixmap_priv_get_scale(source_priv, &source_xscale, &source_yscale);
+ glamor_set_normalize_tcoords(source_priv, source_xscale,
+ source_yscale,
+ x, y,
+ x + w, y + h,
+ glamor_priv->yInverted, texcoords);
+
+ dispatch->glVertexAttribPointer(GLAMOR_VERTEX_SOURCE, 2, GL_FLOAT,
+ GL_FALSE, 2 * sizeof(float), texcoords);
+ dispatch->glEnableVertexAttribArray(GLAMOR_VERTEX_SOURCE);
+
+ dispatch->glActiveTexture(GL_TEXTURE0);
+ dispatch->glBindTexture(GL_TEXTURE_2D, source_priv->base.fbo->tex);
+ dispatch->glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST);
+ dispatch->glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST);
+
+ glamor_set_destination_pixmap_fbo(temp_fbo, 0, 0, w, h);
+ dispatch->glUseProgram(glamor_priv->finish_access_prog[no_alpha]);
+ dispatch->glUniform1i(glamor_priv->finish_access_revert[no_alpha], revert);
+ dispatch->glUniform1i(glamor_priv->finish_access_swap_rb[no_alpha],
+ swap_rb);
+
+ dispatch->glDrawArrays(GL_TRIANGLE_FAN, 0, 4);
+
+ dispatch->glDisableVertexAttribArray(GLAMOR_VERTEX_POS);
+ dispatch->glDisableVertexAttribArray(GLAMOR_VERTEX_SOURCE);
+ dispatch->glUseProgram(0);
+ glamor_put_dispatch(glamor_priv);
+ return temp_fbo;
}
/*
@@ -918,263 +894,263 @@ glamor_es2_pixmap_read_prepare(PixmapPtr source, int x, int y, int w, int h, GLe
static void *
_glamor_download_sub_pixmap_to_cpu(PixmapPtr pixmap, GLenum format,
- GLenum type, int no_alpha,
- int revert, int swap_rb,
- int x, int y, int w, int h,
- int stride, void *bits, int pbo, glamor_access_t access)
+ GLenum type, int no_alpha,
+ int revert, int swap_rb,
+ int x, int y, int w, int h,
+ int stride, void *bits, int pbo,
+ glamor_access_t access)
{
- glamor_pixmap_private *pixmap_priv;
- GLenum gl_access = 0, gl_usage = 0;
- void *data, *read;
- glamor_screen_private *glamor_priv =
- glamor_get_screen_private(pixmap->drawable.pScreen);
- glamor_gl_dispatch *dispatch;
- glamor_pixmap_fbo *temp_fbo = NULL;
- int need_post_conversion = 0;
- int need_free_data = 0;
- int fbo_x_off, fbo_y_off;
-
- data = bits;
- pixmap_priv = glamor_get_pixmap_private(pixmap);
- if (!GLAMOR_PIXMAP_PRIV_HAS_FBO(pixmap_priv))
- return NULL;
-
- switch (access) {
- case GLAMOR_ACCESS_RO:
- gl_access = GL_READ_ONLY;
- gl_usage = GL_STREAM_READ;
- break;
- case GLAMOR_ACCESS_WO:
- return bits;
- case GLAMOR_ACCESS_RW:
- gl_access = GL_READ_WRITE;
- gl_usage = GL_DYNAMIC_DRAW;
- break;
- default:
- ErrorF("Glamor: Invalid access code. %d\n", access);
- assert(0);
- }
-
- glamor_set_destination_pixmap_priv_nc(pixmap_priv);
-
- need_post_conversion = (revert > REVERT_NORMAL);
- if (need_post_conversion) {
- if (pixmap->drawable.depth == 1) {
- int temp_stride;
- temp_stride = (((w * 8 + 7) / 8) + 3) & ~3;
- data = malloc(temp_stride * h);
- if (data == NULL)
- return NULL;
- need_free_data = 1;
- }
- }
-
- pixmap_priv_get_fbo_off(pixmap_priv, &fbo_x_off, &fbo_y_off);
-
- if (glamor_priv->gl_flavor == GLAMOR_GL_ES2
- && !need_post_conversion
- && (swap_rb != SWAP_NONE_DOWNLOADING || revert != REVERT_NONE)) {
- if (!(temp_fbo = glamor_es2_pixmap_read_prepare(pixmap, x, y, w, h,
- format, type, no_alpha,
- revert, swap_rb))) {
- free(data);
- return NULL;
- }
- x = 0;
- y = 0;
- fbo_x_off = 0;
- fbo_y_off = 0;
- }
-
- dispatch = glamor_get_dispatch(glamor_priv);
- dispatch->glPixelStorei(GL_PACK_ALIGNMENT, 4);
-
- if (glamor_priv->has_pack_invert || glamor_priv->yInverted) {
-
- if (!glamor_priv->yInverted) {
- assert(glamor_priv->gl_flavor ==
- GLAMOR_GL_DESKTOP);
- dispatch->glPixelStorei(GL_PACK_INVERT_MESA, 1);
- }
-
- if (glamor_priv->gl_flavor == GLAMOR_GL_DESKTOP && data == NULL) {
- assert(pbo > 0);
- dispatch->glBindBuffer(GL_PIXEL_PACK_BUFFER, pbo);
- dispatch->glBufferData(GL_PIXEL_PACK_BUFFER,
- stride *
- h,
- NULL, gl_usage);
- }
-
- dispatch->glReadPixels(x + fbo_x_off, y + fbo_y_off, w, h, format, type, data);
-
- if (!glamor_priv->yInverted) {
- assert(glamor_priv->gl_flavor == GLAMOR_GL_DESKTOP);
- dispatch->glPixelStorei(GL_PACK_INVERT_MESA, 0);
- }
- if (glamor_priv->gl_flavor == GLAMOR_GL_DESKTOP && bits == NULL) {
- bits = dispatch->glMapBuffer(GL_PIXEL_PACK_BUFFER,
- gl_access);
- dispatch->glBindBuffer(GL_PIXEL_PACK_BUFFER, 0);
- }
- } else {
- unsigned int temp_pbo;
- int yy;
-
- dispatch = glamor_get_dispatch(glamor_priv);
- dispatch->glGenBuffers(1, &temp_pbo);
- dispatch->glBindBuffer(GL_PIXEL_PACK_BUFFER,
- temp_pbo);
- dispatch->glBufferData(GL_PIXEL_PACK_BUFFER,
- stride *
- h,
- NULL, GL_STREAM_READ);
- dispatch->glReadPixels(x + fbo_x_off, y + fbo_y_off, w, h,
- format, type, 0);
- read = dispatch->glMapBuffer(GL_PIXEL_PACK_BUFFER,
- GL_READ_ONLY);
- for (yy = 0; yy < pixmap->drawable.height; yy++)
- memcpy((char*)data + yy * stride,
- (char*)read + (h - yy - 1) * stride, stride);
- dispatch->glUnmapBuffer(GL_PIXEL_PACK_BUFFER);
- dispatch->glBindBuffer(GL_PIXEL_PACK_BUFFER, 0);
- dispatch->glDeleteBuffers(1, &temp_pbo);
- }
-
- dispatch->glBindFramebuffer(GL_FRAMEBUFFER, 0);
- glamor_put_dispatch(glamor_priv);
-
- if (need_post_conversion) {
- /* As OpenGL desktop version never enters here.
- * Don't need to consider if the pbo is valid.*/
- bits = glamor_color_convert_to_bits(data, bits,
- w, h,
- stride,
- no_alpha,
- revert, swap_rb);
- }
-
- if (temp_fbo != NULL)
- glamor_destroy_fbo(temp_fbo);
- if (need_free_data)
- free(data);
-
- return bits;
+ glamor_pixmap_private *pixmap_priv;
+ GLenum gl_access = 0, gl_usage = 0;
+ void *data, *read;
+ glamor_screen_private *glamor_priv =
+ glamor_get_screen_private(pixmap->drawable.pScreen);
+ glamor_gl_dispatch *dispatch;
+ glamor_pixmap_fbo *temp_fbo = NULL;
+ int need_post_conversion = 0;
+ int need_free_data = 0;
+ int fbo_x_off, fbo_y_off;
+
+ data = bits;
+ pixmap_priv = glamor_get_pixmap_private(pixmap);
+ if (!GLAMOR_PIXMAP_PRIV_HAS_FBO(pixmap_priv))
+ return NULL;
+
+ switch (access) {
+ case GLAMOR_ACCESS_RO:
+ gl_access = GL_READ_ONLY;
+ gl_usage = GL_STREAM_READ;
+ break;
+ case GLAMOR_ACCESS_WO:
+ return bits;
+ case GLAMOR_ACCESS_RW:
+ gl_access = GL_READ_WRITE;
+ gl_usage = GL_DYNAMIC_DRAW;
+ break;
+ default:
+ ErrorF("Glamor: Invalid access code. %d\n", access);
+ assert(0);
+ }
+
+ glamor_set_destination_pixmap_priv_nc(pixmap_priv);
+
+ need_post_conversion = (revert > REVERT_NORMAL);
+ if (need_post_conversion) {
+ if (pixmap->drawable.depth == 1) {
+ int temp_stride;
+
+ temp_stride = (((w * 8 + 7) / 8) + 3) & ~3;
+ data = malloc(temp_stride * h);
+ if (data == NULL)
+ return NULL;
+ need_free_data = 1;
+ }
+ }
+
+ pixmap_priv_get_fbo_off(pixmap_priv, &fbo_x_off, &fbo_y_off);
+
+ if (glamor_priv->gl_flavor == GLAMOR_GL_ES2
+ && !need_post_conversion
+ && (swap_rb != SWAP_NONE_DOWNLOADING || revert != REVERT_NONE)) {
+ if (!(temp_fbo = glamor_es2_pixmap_read_prepare(pixmap, x, y, w, h,
+ format, type, no_alpha,
+ revert, swap_rb))) {
+ free(data);
+ return NULL;
+ }
+ x = 0;
+ y = 0;
+ fbo_x_off = 0;
+ fbo_y_off = 0;
+ }
+
+ dispatch = glamor_get_dispatch(glamor_priv);
+ dispatch->glPixelStorei(GL_PACK_ALIGNMENT, 4);
+
+ if (glamor_priv->has_pack_invert || glamor_priv->yInverted) {
+
+ if (!glamor_priv->yInverted) {
+ assert(glamor_priv->gl_flavor == GLAMOR_GL_DESKTOP);
+ dispatch->glPixelStorei(GL_PACK_INVERT_MESA, 1);
+ }
+
+ if (glamor_priv->gl_flavor == GLAMOR_GL_DESKTOP && data == NULL) {
+ assert(pbo > 0);
+ dispatch->glBindBuffer(GL_PIXEL_PACK_BUFFER, pbo);
+ dispatch->glBufferData(GL_PIXEL_PACK_BUFFER,
+ stride * h, NULL, gl_usage);
+ }
+
+ dispatch->glReadPixels(x + fbo_x_off, y + fbo_y_off, w, h, format, type,
+ data);
+
+ if (!glamor_priv->yInverted) {
+ assert(glamor_priv->gl_flavor == GLAMOR_GL_DESKTOP);
+ dispatch->glPixelStorei(GL_PACK_INVERT_MESA, 0);
+ }
+ if (glamor_priv->gl_flavor == GLAMOR_GL_DESKTOP && bits == NULL) {
+ bits = dispatch->glMapBuffer(GL_PIXEL_PACK_BUFFER, gl_access);
+ dispatch->glBindBuffer(GL_PIXEL_PACK_BUFFER, 0);
+ }
+ }
+ else {
+ unsigned int temp_pbo;
+ int yy;
+
+ dispatch = glamor_get_dispatch(glamor_priv);
+ dispatch->glGenBuffers(1, &temp_pbo);
+ dispatch->glBindBuffer(GL_PIXEL_PACK_BUFFER, temp_pbo);
+ dispatch->glBufferData(GL_PIXEL_PACK_BUFFER,
+ stride * h, NULL, GL_STREAM_READ);
+ dispatch->glReadPixels(x + fbo_x_off, y + fbo_y_off, w, h,
+ format, type, 0);
+ read = dispatch->glMapBuffer(GL_PIXEL_PACK_BUFFER, GL_READ_ONLY);
+ for (yy = 0; yy < pixmap->drawable.height; yy++)
+ memcpy((char *) data + yy * stride,
+ (char *) read + (h - yy - 1) * stride, stride);
+ dispatch->glUnmapBuffer(GL_PIXEL_PACK_BUFFER);
+ dispatch->glBindBuffer(GL_PIXEL_PACK_BUFFER, 0);
+ dispatch->glDeleteBuffers(1, &temp_pbo);
+ }
+
+ dispatch->glBindFramebuffer(GL_FRAMEBUFFER, 0);
+ glamor_put_dispatch(glamor_priv);
+
+ if (need_post_conversion) {
+ /* As OpenGL desktop version never enters here.
+ * Don't need to consider if the pbo is valid.*/
+ bits = glamor_color_convert_to_bits(data, bits,
+ w, h,
+ stride, no_alpha, revert, swap_rb);
+ }
+
+ if (temp_fbo != NULL)
+ glamor_destroy_fbo(temp_fbo);
+ if (need_free_data)
+ free(data);
+
+ return bits;
}
void *
glamor_download_sub_pixmap_to_cpu(PixmapPtr pixmap, int x, int y, int w, int h,
- int stride, void *bits, int pbo, glamor_access_t access)
+ int stride, void *bits, int pbo,
+ glamor_access_t access)
{
- GLenum format, type;
- int no_alpha, revert, swap_rb;
- glamor_pixmap_private *pixmap_priv;
- Bool force_clip;
-
- if (glamor_get_tex_format_type_from_pixmap(pixmap,
- &format,
- &type,
- &no_alpha,
- &revert,
- &swap_rb, 0)) {
- glamor_fallback("Unknown pixmap depth %d.\n",
- pixmap->drawable.depth);
- return NULL;
- }
-
- pixmap_priv = glamor_get_pixmap_private(pixmap);
- if (!GLAMOR_PIXMAP_PRIV_HAS_FBO(pixmap_priv))
- return NULL;
-
- force_clip = pixmap_priv->base.glamor_priv->gl_flavor != GLAMOR_GL_DESKTOP
- && !glamor_check_fbo_size(pixmap_priv->base.glamor_priv, w, h);
-
- if (pixmap_priv->type == GLAMOR_TEXTURE_LARGE || force_clip) {
-
- RegionRec region;
- BoxRec box;
- int n_region;
- glamor_pixmap_clipped_regions *clipped_regions;
- void *sub_bits;
- int i,j;
-
- sub_bits = malloc(h * stride);
- if (sub_bits == NULL)
- return FALSE;
- box.x1 = x;
- box.y1 = y;
- box.x2 = x + w;
- box.y2 = y + h;
- RegionInitBoxes(&region, &box, 1);
-
- if (!force_clip)
- clipped_regions = glamor_compute_clipped_regions(pixmap_priv, &region, &n_region, 0, 0, 0);
- else
- clipped_regions = glamor_compute_clipped_regions_ext(pixmap_priv, &region, &n_region,
- pixmap_priv->base.glamor_priv->max_fbo_size,
- pixmap_priv->base.glamor_priv->max_fbo_size, 0, 0);
-
- DEBUGF("start download large pixmap %p %dx%d \n", pixmap, w, h);
- for(i = 0; i < n_region; i++)
- {
- BoxPtr boxes;
- int nbox;
- int temp_stride;
- void *temp_bits;
-
- assert(pbo == 0);
- SET_PIXMAP_FBO_CURRENT(pixmap_priv, clipped_regions[i].block_idx);
-
- boxes = RegionRects(clipped_regions[i].region);
- nbox = RegionNumRects(clipped_regions[i].region);
- for(j = 0; j < nbox; j++)
- {
- temp_stride = PixmapBytePad(boxes[j].x2 - boxes[j].x1,
- pixmap->drawable.depth);
-
- if (boxes[j].x1 == x && temp_stride == stride) {
- temp_bits = (char*)bits + (boxes[j].y1 - y) * stride;
- } else {
- temp_bits = sub_bits;
- }
- DEBUGF("download x %d y %d w %d h %d temp stride %d \n",
- boxes[j].x1, boxes[j].y1,
- boxes[j].x2 - boxes[j].x1,
- boxes[j].y2 - boxes[j].y1, temp_stride);
-
- /* For large pixmap, we don't support pbo currently.*/
- assert(pbo == 0);
- if (_glamor_download_sub_pixmap_to_cpu(pixmap, format, type, no_alpha,
- revert, swap_rb, boxes[j].x1, boxes[j].y1,
- boxes[j].x2 - boxes[j].x1,
- boxes[j].y2 - boxes[j].y1,
- temp_stride, temp_bits, pbo, access) == FALSE) {
- RegionUninit(&region);
- free(sub_bits);
- assert(0);
- return NULL;
- }
- if (boxes[j].x1 != x || temp_stride != stride)
- glamor_get_bits(bits, stride, temp_bits, temp_stride,
- pixmap->drawable.bitsPerPixel,
- boxes[j].x1 - x , boxes[j].y1 - y,
- boxes[j].x2 - boxes[j].x1,
- boxes[j].y2 - boxes[j].y1);
- }
-
- RegionDestroy(clipped_regions[i].region);
- }
- free(sub_bits);
- free(clipped_regions);
- RegionUninit(&region);
- return bits;
- } else
- return _glamor_download_sub_pixmap_to_cpu(pixmap, format, type, no_alpha, revert, swap_rb,
- x, y, w, h, stride,
- bits, pbo, access);
+ GLenum format, type;
+ int no_alpha, revert, swap_rb;
+ glamor_pixmap_private *pixmap_priv;
+ Bool force_clip;
+
+ if (glamor_get_tex_format_type_from_pixmap(pixmap,
+ &format,
+ &type,
+ &no_alpha,
+ &revert, &swap_rb, 0)) {
+ glamor_fallback("Unknown pixmap depth %d.\n", pixmap->drawable.depth);
+ return NULL;
+ }
+
+ pixmap_priv = glamor_get_pixmap_private(pixmap);
+ if (!GLAMOR_PIXMAP_PRIV_HAS_FBO(pixmap_priv))
+ return NULL;
+
+ force_clip = pixmap_priv->base.glamor_priv->gl_flavor != GLAMOR_GL_DESKTOP
+ && !glamor_check_fbo_size(pixmap_priv->base.glamor_priv, w, h);
+
+ if (pixmap_priv->type == GLAMOR_TEXTURE_LARGE || force_clip) {
+
+ RegionRec region;
+ BoxRec box;
+ int n_region;
+ glamor_pixmap_clipped_regions *clipped_regions;
+ void *sub_bits;
+ int i, j;
+
+ sub_bits = malloc(h * stride);
+ if (sub_bits == NULL)
+ return FALSE;
+ box.x1 = x;
+ box.y1 = y;
+ box.x2 = x + w;
+ box.y2 = y + h;
+ RegionInitBoxes(&region, &box, 1);
+
+ if (!force_clip)
+ clipped_regions =
+ glamor_compute_clipped_regions(pixmap_priv, &region, &n_region,
+ 0, 0, 0);
+ else
+ clipped_regions =
+ glamor_compute_clipped_regions_ext(pixmap_priv, &region,
+ &n_region,
+ pixmap_priv->base.
+ glamor_priv->max_fbo_size,
+ pixmap_priv->base.
+ glamor_priv->max_fbo_size, 0,
+ 0);
+
+ DEBUGF("start download large pixmap %p %dx%d \n", pixmap, w, h);
+ for (i = 0; i < n_region; i++) {
+ BoxPtr boxes;
+ int nbox;
+ int temp_stride;
+ void *temp_bits;
+
+ assert(pbo == 0);
+ SET_PIXMAP_FBO_CURRENT(pixmap_priv, clipped_regions[i].block_idx);
+
+ boxes = RegionRects(clipped_regions[i].region);
+ nbox = RegionNumRects(clipped_regions[i].region);
+ for (j = 0; j < nbox; j++) {
+ temp_stride = PixmapBytePad(boxes[j].x2 - boxes[j].x1,
+ pixmap->drawable.depth);
+
+ if (boxes[j].x1 == x && temp_stride == stride) {
+ temp_bits = (char *) bits + (boxes[j].y1 - y) * stride;
+ }
+ else {
+ temp_bits = sub_bits;
+ }
+ DEBUGF("download x %d y %d w %d h %d temp stride %d \n",
+ boxes[j].x1, boxes[j].y1,
+ boxes[j].x2 - boxes[j].x1,
+ boxes[j].y2 - boxes[j].y1, temp_stride);
+
+ /* For large pixmap, we don't support pbo currently. */
+ assert(pbo == 0);
+ if (_glamor_download_sub_pixmap_to_cpu
+ (pixmap, format, type, no_alpha, revert, swap_rb,
+ boxes[j].x1, boxes[j].y1, boxes[j].x2 - boxes[j].x1,
+ boxes[j].y2 - boxes[j].y1, temp_stride, temp_bits, pbo,
+ access) == FALSE) {
+ RegionUninit(&region);
+ free(sub_bits);
+ assert(0);
+ return NULL;
+ }
+ if (boxes[j].x1 != x || temp_stride != stride)
+ glamor_get_bits(bits, stride, temp_bits, temp_stride,
+ pixmap->drawable.bitsPerPixel,
+ boxes[j].x1 - x, boxes[j].y1 - y,
+ boxes[j].x2 - boxes[j].x1,
+ boxes[j].y2 - boxes[j].y1);
+ }
+
+ RegionDestroy(clipped_regions[i].region);
+ }
+ free(sub_bits);
+ free(clipped_regions);
+ RegionUninit(&region);
+ return bits;
+ }
+ else
+ return _glamor_download_sub_pixmap_to_cpu(pixmap, format, type,
+ no_alpha, revert, swap_rb, x,
+ y, w, h, stride, bits, pbo,
+ access);
}
-
/**
* Move a pixmap to CPU memory.
* The input data is the pixmap's fbo.
@@ -1187,67 +1163,64 @@ glamor_download_sub_pixmap_to_cpu(PixmapPtr pixmap, int x, int y, int w, int h,
Bool
glamor_download_pixmap_to_cpu(PixmapPtr pixmap, glamor_access_t access)
{
- glamor_pixmap_private *pixmap_priv =
- glamor_get_pixmap_private(pixmap);
- unsigned int stride;
- void *data = NULL, *dst;
- glamor_screen_private *glamor_priv =
- glamor_get_screen_private(pixmap->drawable.pScreen);
- glamor_gl_dispatch *dispatch;
- int pbo = 0;
-
- if (!GLAMOR_PIXMAP_PRIV_HAS_FBO(pixmap_priv))
- return TRUE;
-
- glamor_debug_output(GLAMOR_DEBUG_TEXTURE_DOWNLOAD,
- "Downloading pixmap %p %dx%d depth%d\n",
- pixmap,
- pixmap->drawable.width,
- pixmap->drawable.height,
- pixmap->drawable.depth);
-
- stride = pixmap->devKind;
-
- if (access == GLAMOR_ACCESS_WO
- || glamor_priv->gl_flavor == GLAMOR_GL_ES2
- || (!glamor_priv->has_pack_invert && !glamor_priv->yInverted)
- || pixmap_priv->type == GLAMOR_TEXTURE_LARGE) {
- data = malloc(stride * pixmap->drawable.height);
- } else {
- dispatch = glamor_get_dispatch(glamor_priv);
- if (pixmap_priv->base.fbo->pbo == 0)
- dispatch->glGenBuffers(1,
- &pixmap_priv->base.fbo->pbo);
- glamor_put_dispatch(glamor_priv);
- pbo = pixmap_priv->base.fbo->pbo;
- }
-
- if (pixmap_priv->type == GLAMOR_TEXTURE_DRM) {
- stride = PixmapBytePad(pixmap->drawable.width, pixmap->drawable.depth);
- pixmap_priv->base.drm_stride = pixmap->devKind;
- pixmap->devKind = stride;
- }
-
- dst = glamor_download_sub_pixmap_to_cpu(pixmap, 0, 0,
- pixmap->drawable.width,
- pixmap->drawable.height,
- pixmap->devKind,
- data, pbo, access);
-
- if (!dst) {
- if (data)
- free(data);
- return FALSE;
- }
-
- if (pbo != 0)
- pixmap_priv->base.fbo->pbo_valid = 1;
-
- pixmap_priv->base.gl_fbo = GLAMOR_FBO_DOWNLOADED;
-
- pixmap->devPrivate.ptr = dst;
-
- return TRUE;
+ glamor_pixmap_private *pixmap_priv = glamor_get_pixmap_private(pixmap);
+ unsigned int stride;
+ void *data = NULL, *dst;
+ glamor_screen_private *glamor_priv =
+ glamor_get_screen_private(pixmap->drawable.pScreen);
+ glamor_gl_dispatch *dispatch;
+ int pbo = 0;
+
+ if (!GLAMOR_PIXMAP_PRIV_HAS_FBO(pixmap_priv))
+ return TRUE;
+
+ glamor_debug_output(GLAMOR_DEBUG_TEXTURE_DOWNLOAD,
+ "Downloading pixmap %p %dx%d depth%d\n",
+ pixmap,
+ pixmap->drawable.width,
+ pixmap->drawable.height, pixmap->drawable.depth);
+
+ stride = pixmap->devKind;
+
+ if (access == GLAMOR_ACCESS_WO
+ || glamor_priv->gl_flavor == GLAMOR_GL_ES2
+ || (!glamor_priv->has_pack_invert && !glamor_priv->yInverted)
+ || pixmap_priv->type == GLAMOR_TEXTURE_LARGE) {
+ data = malloc(stride * pixmap->drawable.height);
+ }
+ else {
+ dispatch = glamor_get_dispatch(glamor_priv);
+ if (pixmap_priv->base.fbo->pbo == 0)
+ dispatch->glGenBuffers(1, &pixmap_priv->base.fbo->pbo);
+ glamor_put_dispatch(glamor_priv);
+ pbo = pixmap_priv->base.fbo->pbo;
+ }
+
+ if (pixmap_priv->type == GLAMOR_TEXTURE_DRM) {
+ stride = PixmapBytePad(pixmap->drawable.width, pixmap->drawable.depth);
+ pixmap_priv->base.drm_stride = pixmap->devKind;
+ pixmap->devKind = stride;
+ }
+
+ dst = glamor_download_sub_pixmap_to_cpu(pixmap, 0, 0,
+ pixmap->drawable.width,
+ pixmap->drawable.height,
+ pixmap->devKind, data, pbo, access);
+
+ if (!dst) {
+ if (data)
+ free(data);
+ return FALSE;
+ }
+
+ if (pbo != 0)
+ pixmap_priv->base.fbo->pbo_valid = 1;
+
+ pixmap_priv->base.gl_fbo = GLAMOR_FBO_DOWNLOADED;
+
+ pixmap->devPrivate.ptr = dst;
+
+ return TRUE;
}
/* fixup a fbo to the exact size as the pixmap. */
@@ -1255,60 +1228,58 @@ glamor_download_pixmap_to_cpu(PixmapPtr pixmap, glamor_access_t access)
Bool
glamor_fixup_pixmap_priv(ScreenPtr screen, glamor_pixmap_private *pixmap_priv)
{
- glamor_pixmap_fbo *old_fbo;
- glamor_pixmap_fbo *new_fbo = NULL;
- PixmapPtr scratch = NULL;
- glamor_pixmap_private *scratch_priv;
- DrawablePtr drawable;
- GCPtr gc = NULL;
- int ret = FALSE;
-
- drawable = &pixmap_priv->base.pixmap->drawable;
-
- if (!GLAMOR_PIXMAP_FBO_NOT_EAXCT_SIZE(pixmap_priv))
- return TRUE;
-
- old_fbo = pixmap_priv->base.fbo;
-
- if (!old_fbo)
- return FALSE;
-
- gc = GetScratchGC(drawable->depth, screen);
- if (!gc)
- goto fail;
-
- scratch = glamor_create_pixmap(screen, drawable->width, drawable->height,
- drawable->depth,
- GLAMOR_CREATE_PIXMAP_FIXUP);
-
- scratch_priv = glamor_get_pixmap_private(scratch);
-
- if (!scratch_priv->base.fbo)
- goto fail;
-
- ValidateGC(&scratch->drawable, gc);
- glamor_copy_area(drawable,
- &scratch->drawable,
- gc, 0, 0,
- drawable->width, drawable->height,
- 0, 0);
- old_fbo = glamor_pixmap_detach_fbo(pixmap_priv);
- new_fbo = glamor_pixmap_detach_fbo(scratch_priv);
- glamor_pixmap_attach_fbo(pixmap_priv->base.pixmap, new_fbo);
- glamor_pixmap_attach_fbo(scratch, old_fbo);
-
- DEBUGF("old %dx%d type %d\n",
- drawable->width, drawable->height, pixmap_priv->type);
- DEBUGF("copy tex %d %dx%d to tex %d %dx%d \n",
- old_fbo->tex, old_fbo->width, old_fbo->height, new_fbo->tex, new_fbo->width, new_fbo->height);
- ret = TRUE;
-fail:
- if (gc)
- FreeScratchGC(gc);
- if (scratch)
- glamor_destroy_pixmap(scratch);
-
- return ret;
+ glamor_pixmap_fbo *old_fbo;
+ glamor_pixmap_fbo *new_fbo = NULL;
+ PixmapPtr scratch = NULL;
+ glamor_pixmap_private *scratch_priv;
+ DrawablePtr drawable;
+ GCPtr gc = NULL;
+ int ret = FALSE;
+
+ drawable = &pixmap_priv->base.pixmap->drawable;
+
+ if (!GLAMOR_PIXMAP_FBO_NOT_EAXCT_SIZE(pixmap_priv))
+ return TRUE;
+
+ old_fbo = pixmap_priv->base.fbo;
+
+ if (!old_fbo)
+ return FALSE;
+
+ gc = GetScratchGC(drawable->depth, screen);
+ if (!gc)
+ goto fail;
+
+ scratch = glamor_create_pixmap(screen, drawable->width, drawable->height,
+ drawable->depth, GLAMOR_CREATE_PIXMAP_FIXUP);
+
+ scratch_priv = glamor_get_pixmap_private(scratch);
+
+ if (!scratch_priv->base.fbo)
+ goto fail;
+
+ ValidateGC(&scratch->drawable, gc);
+ glamor_copy_area(drawable,
+ &scratch->drawable,
+ gc, 0, 0, drawable->width, drawable->height, 0, 0);
+ old_fbo = glamor_pixmap_detach_fbo(pixmap_priv);
+ new_fbo = glamor_pixmap_detach_fbo(scratch_priv);
+ glamor_pixmap_attach_fbo(pixmap_priv->base.pixmap, new_fbo);
+ glamor_pixmap_attach_fbo(scratch, old_fbo);
+
+ DEBUGF("old %dx%d type %d\n",
+ drawable->width, drawable->height, pixmap_priv->type);
+ DEBUGF("copy tex %d %dx%d to tex %d %dx%d \n",
+ old_fbo->tex, old_fbo->width, old_fbo->height, new_fbo->tex,
+ new_fbo->width, new_fbo->height);
+ ret = TRUE;
+ fail:
+ if (gc)
+ FreeScratchGC(gc);
+ if (scratch)
+ glamor_destroy_pixmap(scratch);
+
+ return ret;
}
/*
@@ -1328,106 +1299,120 @@ fail:
*
* */
PixmapPtr
-glamor_get_sub_pixmap(PixmapPtr pixmap, int x, int y, int w, int h, glamor_access_t access)
+glamor_get_sub_pixmap(PixmapPtr pixmap, int x, int y, int w, int h,
+ glamor_access_t access)
{
- glamor_screen_private *glamor_priv;
- PixmapPtr sub_pixmap;
- glamor_pixmap_private *sub_pixmap_priv, *pixmap_priv;
- void *data;
- int pbo;
- int flag;
- if (x < 0 || y < 0)
- return NULL;
- w = (x + w) > pixmap->drawable.width ? (pixmap->drawable.width - x) : w;
- h = (y + h) > pixmap->drawable.height ? (pixmap->drawable.height - y) : h;
- if (access == GLAMOR_ACCESS_WO) {
- sub_pixmap = glamor_create_pixmap(pixmap->drawable.pScreen, w, h,
- pixmap->drawable.depth, GLAMOR_CREATE_PIXMAP_CPU);
- return sub_pixmap;
- }
-
- glamor_priv = glamor_get_screen_private(pixmap->drawable.pScreen);
- pixmap_priv = glamor_get_pixmap_private(pixmap);
-
- if (!GLAMOR_PIXMAP_PRIV_HAS_FBO(pixmap_priv))
- return NULL;
- if (glamor_priv->gl_flavor == GLAMOR_GL_ES2 || pixmap_priv->type == GLAMOR_TEXTURE_LARGE)
- flag = GLAMOR_CREATE_PIXMAP_CPU;
- else
- flag = GLAMOR_CREATE_PIXMAP_MAP;
-
- sub_pixmap = glamor_create_pixmap(pixmap->drawable.pScreen, w, h,
- pixmap->drawable.depth, flag);
-
- if (sub_pixmap == NULL)
- return NULL;
-
- sub_pixmap_priv = glamor_get_pixmap_private(sub_pixmap);
- pbo = sub_pixmap_priv ? (sub_pixmap_priv->base.fbo ? sub_pixmap_priv->base.fbo->pbo : 0): 0;
-
- if (pixmap_priv->base.is_picture) {
- sub_pixmap_priv->base.picture = pixmap_priv->base.picture;
- sub_pixmap_priv->base.is_picture = pixmap_priv->base.is_picture;
- }
-
- if (pbo)
- data = NULL;
- else
- data = sub_pixmap->devPrivate.ptr;
-
- data = glamor_download_sub_pixmap_to_cpu(pixmap, x, y, w, h, sub_pixmap->devKind,
- data, pbo, access);
- if(data == NULL) {
- fbDestroyPixmap(sub_pixmap);
- return NULL;
- }
- if (pbo) {
- assert(sub_pixmap->devPrivate.ptr == NULL);
- sub_pixmap->devPrivate.ptr = data;
- sub_pixmap_priv->base.fbo->pbo_valid = 1;
- }
+ glamor_screen_private *glamor_priv;
+ PixmapPtr sub_pixmap;
+ glamor_pixmap_private *sub_pixmap_priv, *pixmap_priv;
+ void *data;
+ int pbo;
+ int flag;
+
+ if (x < 0 || y < 0)
+ return NULL;
+ w = (x + w) > pixmap->drawable.width ? (pixmap->drawable.width - x) : w;
+ h = (y + h) > pixmap->drawable.height ? (pixmap->drawable.height - y) : h;
+ if (access == GLAMOR_ACCESS_WO) {
+ sub_pixmap = glamor_create_pixmap(pixmap->drawable.pScreen, w, h,
+ pixmap->drawable.depth,
+ GLAMOR_CREATE_PIXMAP_CPU);
+ return sub_pixmap;
+ }
+
+ glamor_priv = glamor_get_screen_private(pixmap->drawable.pScreen);
+ pixmap_priv = glamor_get_pixmap_private(pixmap);
+
+ if (!GLAMOR_PIXMAP_PRIV_HAS_FBO(pixmap_priv))
+ return NULL;
+ if (glamor_priv->gl_flavor == GLAMOR_GL_ES2 ||
+ pixmap_priv->type == GLAMOR_TEXTURE_LARGE)
+ flag = GLAMOR_CREATE_PIXMAP_CPU;
+ else
+ flag = GLAMOR_CREATE_PIXMAP_MAP;
+
+ sub_pixmap = glamor_create_pixmap(pixmap->drawable.pScreen, w, h,
+ pixmap->drawable.depth, flag);
+
+ if (sub_pixmap == NULL)
+ return NULL;
+
+ sub_pixmap_priv = glamor_get_pixmap_private(sub_pixmap);
+ pbo =
+ sub_pixmap_priv ? (sub_pixmap_priv->base.fbo ? sub_pixmap_priv->base.
+ fbo->pbo : 0) : 0;
+
+ if (pixmap_priv->base.is_picture) {
+ sub_pixmap_priv->base.picture = pixmap_priv->base.picture;
+ sub_pixmap_priv->base.is_picture = pixmap_priv->base.is_picture;
+ }
+
+ if (pbo)
+ data = NULL;
+ else
+ data = sub_pixmap->devPrivate.ptr;
+
+ data =
+ glamor_download_sub_pixmap_to_cpu(pixmap, x, y, w, h,
+ sub_pixmap->devKind, data, pbo,
+ access);
+ if (data == NULL) {
+ fbDestroyPixmap(sub_pixmap);
+ return NULL;
+ }
+ if (pbo) {
+ assert(sub_pixmap->devPrivate.ptr == NULL);
+ sub_pixmap->devPrivate.ptr = data;
+ sub_pixmap_priv->base.fbo->pbo_valid = 1;
+ }
#if 0
- struct pixman_box16 box;
- PixmapPtr new_sub_pixmap;
- int dx, dy;
- box.x1 = 0;
- box.y1 = 0;
- box.x2 = w;
- box.y2 = h;
-
- dx = x;
- dy = y;
-
- new_sub_pixmap = glamor_create_pixmap(pixmap->drawable.pScreen, w, h,
- pixmap->drawable.depth, GLAMOR_CREATE_PIXMAP_CPU);
- glamor_copy_n_to_n(&pixmap->drawable, &new_sub_pixmap->drawable, NULL, &box, 1, dx, dy, 0, 0, 0, NULL);
- glamor_compare_pixmaps(new_sub_pixmap, sub_pixmap, 0, 0, w, h, 1, 1);
+ struct pixman_box16 box;
+ PixmapPtr new_sub_pixmap;
+ int dx, dy;
+
+ box.x1 = 0;
+ box.y1 = 0;
+ box.x2 = w;
+ box.y2 = h;
+
+ dx = x;
+ dy = y;
+
+ new_sub_pixmap = glamor_create_pixmap(pixmap->drawable.pScreen, w, h,
+ pixmap->drawable.depth,
+ GLAMOR_CREATE_PIXMAP_CPU);
+ glamor_copy_n_to_n(&pixmap->drawable, &new_sub_pixmap->drawable, NULL, &box,
+ 1, dx, dy, 0, 0, 0, NULL);
+ glamor_compare_pixmaps(new_sub_pixmap, sub_pixmap, 0, 0, w, h, 1, 1);
#endif
- return sub_pixmap;
+ return sub_pixmap;
}
void
-glamor_put_sub_pixmap(PixmapPtr sub_pixmap, PixmapPtr pixmap, int x, int y, int w, int h, glamor_access_t access)
+glamor_put_sub_pixmap(PixmapPtr sub_pixmap, PixmapPtr pixmap, int x, int y,
+ int w, int h, glamor_access_t access)
{
- void *bits;
- int pbo;
- glamor_pixmap_private *sub_pixmap_priv;
- if (access != GLAMOR_ACCESS_RO) {
- sub_pixmap_priv = glamor_get_pixmap_private(sub_pixmap);
- if (sub_pixmap_priv->base.fbo
- && sub_pixmap_priv->base.fbo->pbo_valid) {
- bits = NULL;
- pbo = sub_pixmap_priv->base.fbo->pbo;
- } else {
- bits = sub_pixmap->devPrivate.ptr;
- pbo = 0;
- }
-
- assert(x >= 0 && y >= 0);
- w = (w > sub_pixmap->drawable.width) ? sub_pixmap->drawable.width : w;
- h = (h > sub_pixmap->drawable.height) ? sub_pixmap->drawable.height : h;
- glamor_upload_sub_pixmap_to_texture(pixmap, x, y, w, h, sub_pixmap->devKind, bits, pbo);
- }
- glamor_destroy_pixmap(sub_pixmap);
+ void *bits;
+ int pbo;
+ glamor_pixmap_private *sub_pixmap_priv;
+
+ if (access != GLAMOR_ACCESS_RO) {
+ sub_pixmap_priv = glamor_get_pixmap_private(sub_pixmap);
+ if (sub_pixmap_priv->base.fbo && sub_pixmap_priv->base.fbo->pbo_valid) {
+ bits = NULL;
+ pbo = sub_pixmap_priv->base.fbo->pbo;
+ }
+ else {
+ bits = sub_pixmap->devPrivate.ptr;
+ pbo = 0;
+ }
+
+ assert(x >= 0 && y >= 0);
+ w = (w > sub_pixmap->drawable.width) ? sub_pixmap->drawable.width : w;
+ h = (h > sub_pixmap->drawable.height) ? sub_pixmap->drawable.height : h;
+ glamor_upload_sub_pixmap_to_texture(pixmap, x, y, w, h,
+ sub_pixmap->devKind, bits, pbo);
+ }
+ glamor_destroy_pixmap(sub_pixmap);
}
diff --git a/xorg-server/glamor/glamor_polyfillrect.c b/xorg-server/glamor/glamor_polyfillrect.c
index 4e1f7b3a9..a25fc4ed5 100644
--- a/xorg-server/glamor/glamor_polyfillrect.c
+++ b/xorg-server/glamor/glamor_polyfillrect.c
@@ -35,93 +35,90 @@
static Bool
_glamor_poly_fill_rect(DrawablePtr drawable,
- GCPtr gc, int nrect, xRectangle * prect, Bool fallback)
+ GCPtr gc, int nrect, xRectangle *prect, Bool fallback)
{
- int fullX1, fullX2, fullY1, fullY2;
- int xorg, yorg;
- int n;
- register BoxPtr pbox;
- RegionPtr pClip = fbGetCompositeClip(gc);
- Bool ret = FALSE;
+ int fullX1, fullX2, fullY1, fullY2;
+ int xorg, yorg;
+ int n;
+ register BoxPtr pbox;
+ RegionPtr pClip = fbGetCompositeClip(gc);
+ Bool ret = FALSE;
- xorg = drawable->x;
- yorg = drawable->y;
+ xorg = drawable->x;
+ yorg = drawable->y;
- while (nrect--) {
- fullX1 = prect->x + xorg;
- fullY1 = prect->y + yorg;
- fullX2 = fullX1 + (int) prect->width;
- fullY2 = fullY1 + (int) prect->height;
+ while (nrect--) {
+ fullX1 = prect->x + xorg;
+ fullY1 = prect->y + yorg;
+ fullX2 = fullX1 + (int) prect->width;
+ fullY2 = fullY1 + (int) prect->height;
- n = REGION_NUM_RECTS(pClip);
- pbox = REGION_RECTS(pClip);
- /*
- * clip the rectangle to each box in the clip region
- * this is logically equivalent to calling Intersect(),
- * but rectangles may overlap each other here.
- */
- while (n--) {
- int x1 = fullX1;
- int x2 = fullX2;
- int y1 = fullY1;
- int y2 = fullY2;
+ n = REGION_NUM_RECTS(pClip);
+ pbox = REGION_RECTS(pClip);
+ /*
+ * clip the rectangle to each box in the clip region
+ * this is logically equivalent to calling Intersect(),
+ * but rectangles may overlap each other here.
+ */
+ while (n--) {
+ int x1 = fullX1;
+ int x2 = fullX2;
+ int y1 = fullY1;
+ int y2 = fullY2;
- if (pbox->x1 > x1)
- x1 = pbox->x1;
- if (pbox->x2 < x2)
- x2 = pbox->x2;
- if (pbox->y1 > y1)
- y1 = pbox->y1;
- if (pbox->y2 < y2)
- y2 = pbox->y2;
+ if (pbox->x1 > x1)
+ x1 = pbox->x1;
+ if (pbox->x2 < x2)
+ x2 = pbox->x2;
+ if (pbox->y1 > y1)
+ y1 = pbox->y1;
+ if (pbox->y2 < y2)
+ y2 = pbox->y2;
- pbox++;
- if (x1 >= x2 || y1 >= y2)
- continue;
- if (!glamor_fill(drawable, gc, x1, y1, x2 - x1,
- y2 - y1, fallback)) {
- nrect++;
- goto fail;
- }
- }
- prect++;
- }
- ret = TRUE;
- goto done;
+ pbox++;
+ if (x1 >= x2 || y1 >= y2)
+ continue;
+ if (!glamor_fill(drawable, gc, x1, y1, x2 - x1, y2 - y1, fallback)) {
+ nrect++;
+ goto fail;
+ }
+ }
+ prect++;
+ }
+ ret = TRUE;
+ goto done;
-fail:
+ fail:
- if (!fallback
- && glamor_ddx_fallback_check_pixmap(drawable)
- && glamor_ddx_fallback_check_gc(gc))
- goto done;
+ if (!fallback && glamor_ddx_fallback_check_pixmap(drawable)
+ && glamor_ddx_fallback_check_gc(gc))
+ goto done;
- glamor_fallback(" to %p (%c)\n",
- drawable, glamor_get_drawable_location(drawable));
- if (glamor_prepare_access(drawable, GLAMOR_ACCESS_RW)) {
- if (glamor_prepare_access_gc(gc)) {
- fbPolyFillRect(drawable, gc, nrect, prect);
- glamor_finish_access_gc(gc);
- }
- glamor_finish_access(drawable, GLAMOR_ACCESS_RW);
- }
- ret = TRUE;
+ glamor_fallback(" to %p (%c)\n",
+ drawable, glamor_get_drawable_location(drawable));
+ if (glamor_prepare_access(drawable, GLAMOR_ACCESS_RW)) {
+ if (glamor_prepare_access_gc(gc)) {
+ fbPolyFillRect(drawable, gc, nrect, prect);
+ glamor_finish_access_gc(gc);
+ }
+ glamor_finish_access(drawable, GLAMOR_ACCESS_RW);
+ }
+ ret = TRUE;
-done:
- return ret;
+ done:
+ return ret;
}
-
void
glamor_poly_fill_rect(DrawablePtr drawable,
- GCPtr gc, int nrect, xRectangle * prect)
+ GCPtr gc, int nrect, xRectangle *prect)
{
- _glamor_poly_fill_rect(drawable, gc, nrect, prect, TRUE);
+ _glamor_poly_fill_rect(drawable, gc, nrect, prect, TRUE);
}
Bool
glamor_poly_fill_rect_nf(DrawablePtr drawable,
- GCPtr gc, int nrect, xRectangle * prect)
+ GCPtr gc, int nrect, xRectangle *prect)
{
- return _glamor_poly_fill_rect(drawable, gc, nrect, prect, FALSE);
+ return _glamor_poly_fill_rect(drawable, gc, nrect, prect, FALSE);
}
diff --git a/xorg-server/glamor/glamor_polylines.c b/xorg-server/glamor/glamor_polylines.c
index e723e9500..b94161760 100644
--- a/xorg-server/glamor/glamor_polylines.c
+++ b/xorg-server/glamor/glamor_polylines.c
@@ -40,96 +40,97 @@
*/
static Bool
_glamor_poly_lines(DrawablePtr drawable, GCPtr gc, int mode, int n,
- DDXPointPtr points, Bool fallback)
+ DDXPointPtr points, Bool fallback)
{
- xRectangle *rects;
- int x1, x2, y1, y2;
- int i;
+ xRectangle *rects;
+ int x1, x2, y1, y2;
+ int i;
- /* Don't try to do wide lines or non-solid fill style. */
- if (gc->lineWidth != 0) {
- /* This ends up in miSetSpans, which is accelerated as well as we
- * can hope X wide lines will be.
- */
- goto wide_line;
- }
- if (gc->lineStyle != LineSolid) {
- glamor_fallback
- ("non-solid fill line style %d\n",
- gc->lineStyle);
- goto fail;
- }
- rects = malloc(sizeof(xRectangle) * (n - 1));
- x1 = points[0].x;
- y1 = points[0].y;
- /* If we have any non-horizontal/vertical, fall back. */
- for (i = 0; i < n - 1; i++) {
- if (mode == CoordModePrevious) {
- x2 = x1 + points[i + 1].x;
- y2 = y1 + points[i + 1].y;
- } else {
- x2 = points[i + 1].x;
- y2 = points[i + 1].y;
- }
- if (x1 != x2 && y1 != y2) {
- free(rects);
- glamor_fallback("stub diagonal poly_line\n");
- goto fail;
- }
- if (x1 < x2) {
- rects[i].x = x1;
- rects[i].width = x2 - x1 + 1;
- } else {
- rects[i].x = x2;
- rects[i].width = x1 - x2 + 1;
- }
- if (y1 < y2) {
- rects[i].y = y1;
- rects[i].height = y2 - y1 + 1;
- } else {
- rects[i].y = y2;
- rects[i].height = y1 - y2 + 1;
- }
+ /* Don't try to do wide lines or non-solid fill style. */
+ if (gc->lineWidth != 0) {
+ /* This ends up in miSetSpans, which is accelerated as well as we
+ * can hope X wide lines will be.
+ */
+ goto wide_line;
+ }
+ if (gc->lineStyle != LineSolid) {
+ glamor_fallback("non-solid fill line style %d\n", gc->lineStyle);
+ goto fail;
+ }
+ rects = malloc(sizeof(xRectangle) * (n - 1));
+ x1 = points[0].x;
+ y1 = points[0].y;
+ /* If we have any non-horizontal/vertical, fall back. */
+ for (i = 0; i < n - 1; i++) {
+ if (mode == CoordModePrevious) {
+ x2 = x1 + points[i + 1].x;
+ y2 = y1 + points[i + 1].y;
+ }
+ else {
+ x2 = points[i + 1].x;
+ y2 = points[i + 1].y;
+ }
+ if (x1 != x2 && y1 != y2) {
+ free(rects);
+ glamor_fallback("stub diagonal poly_line\n");
+ goto fail;
+ }
+ if (x1 < x2) {
+ rects[i].x = x1;
+ rects[i].width = x2 - x1 + 1;
+ }
+ else {
+ rects[i].x = x2;
+ rects[i].width = x1 - x2 + 1;
+ }
+ if (y1 < y2) {
+ rects[i].y = y1;
+ rects[i].height = y2 - y1 + 1;
+ }
+ else {
+ rects[i].y = y2;
+ rects[i].height = y1 - y2 + 1;
+ }
- x1 = x2;
- y1 = y2;
- }
- gc->ops->PolyFillRect(drawable, gc, n - 1, rects);
- free(rects);
- return TRUE;
+ x1 = x2;
+ y1 = y2;
+ }
+ gc->ops->PolyFillRect(drawable, gc, n - 1, rects);
+ free(rects);
+ return TRUE;
- fail:
- if (!fallback
- && glamor_ddx_fallback_check_pixmap(drawable)
- && glamor_ddx_fallback_check_gc(gc))
- return FALSE;
+ fail:
+ if (!fallback && glamor_ddx_fallback_check_pixmap(drawable)
+ && glamor_ddx_fallback_check_gc(gc))
+ return FALSE;
- if (gc->lineWidth == 0) {
- if (glamor_prepare_access(drawable, GLAMOR_ACCESS_RW)) {
- if (glamor_prepare_access_gc(gc)) {
- fbPolyLine(drawable, gc, mode, n, points);
- glamor_finish_access_gc(gc);
- }
- glamor_finish_access(drawable, GLAMOR_ACCESS_RW);
- }
- } else {
-wide_line:
- /* fb calls mi functions in the lineWidth != 0 case. */
- fbPolyLine(drawable, gc, mode, n, points);
- }
- return TRUE;
+ if (gc->lineWidth == 0) {
+ if (glamor_prepare_access(drawable, GLAMOR_ACCESS_RW)) {
+ if (glamor_prepare_access_gc(gc)) {
+ fbPolyLine(drawable, gc, mode, n, points);
+ glamor_finish_access_gc(gc);
+ }
+ glamor_finish_access(drawable, GLAMOR_ACCESS_RW);
+ }
+ }
+ else {
+ wide_line:
+ /* fb calls mi functions in the lineWidth != 0 case. */
+ fbPolyLine(drawable, gc, mode, n, points);
+ }
+ return TRUE;
}
void
glamor_poly_lines(DrawablePtr drawable, GCPtr gc, int mode, int n,
- DDXPointPtr points)
+ DDXPointPtr points)
{
- _glamor_poly_lines(drawable, gc, mode, n, points, TRUE);
+ _glamor_poly_lines(drawable, gc, mode, n, points, TRUE);
}
Bool
glamor_poly_lines_nf(DrawablePtr drawable, GCPtr gc, int mode, int n,
- DDXPointPtr points)
+ DDXPointPtr points)
{
- return _glamor_poly_lines(drawable, gc, mode, n, points, FALSE);
+ return _glamor_poly_lines(drawable, gc, mode, n, points, FALSE);
}
diff --git a/xorg-server/glamor/glamor_polyops.c b/xorg-server/glamor/glamor_polyops.c
index 59301784d..1484d80f1 100644
--- a/xorg-server/glamor/glamor_polyops.c
+++ b/xorg-server/glamor/glamor_polyops.c
@@ -30,56 +30,53 @@
static Bool
_glamor_poly_point(DrawablePtr pDrawable, GCPtr pGC, int mode, int npt,
- DDXPointPtr ppt, Bool fallback)
+ DDXPointPtr ppt, Bool fallback)
{
- if (!fallback
- && glamor_ddx_fallback_check_gc(pGC)
- && glamor_ddx_fallback_check_pixmap(pDrawable))
- return FALSE;
+ if (!fallback && glamor_ddx_fallback_check_gc(pGC)
+ && glamor_ddx_fallback_check_pixmap(pDrawable))
+ return FALSE;
- miPolyPoint(pDrawable, pGC, mode, npt, ppt);
+ miPolyPoint(pDrawable, pGC, mode, npt, ppt);
- return TRUE;
+ return TRUE;
}
void
glamor_poly_point(DrawablePtr pDrawable, GCPtr pGC, int mode, int npt,
- DDXPointPtr ppt)
+ DDXPointPtr ppt)
{
- _glamor_poly_point(pDrawable, pGC, mode, npt, ppt, TRUE);
+ _glamor_poly_point(pDrawable, pGC, mode, npt, ppt, TRUE);
}
Bool
glamor_poly_point_nf(DrawablePtr pDrawable, GCPtr pGC, int mode, int npt,
- DDXPointPtr ppt)
+ DDXPointPtr ppt)
{
- return _glamor_poly_point(pDrawable, pGC, mode, npt, ppt, FALSE);
+ return _glamor_poly_point(pDrawable, pGC, mode, npt, ppt, FALSE);
}
static Bool
_glamor_poly_segment(DrawablePtr pDrawable, GCPtr pGC, int nseg,
- xSegment *pSeg, Bool fallback)
+ xSegment *pSeg, Bool fallback)
{
- if (!fallback
- && glamor_ddx_fallback_check_gc(pGC)
- && glamor_ddx_fallback_check_pixmap(pDrawable))
- return FALSE;
+ if (!fallback && glamor_ddx_fallback_check_gc(pGC)
+ && glamor_ddx_fallback_check_pixmap(pDrawable))
+ return FALSE;
- miPolySegment(pDrawable, pGC, nseg, pSeg);
+ miPolySegment(pDrawable, pGC, nseg, pSeg);
- return TRUE;
+ return TRUE;
}
void
-glamor_poly_segment(DrawablePtr pDrawable, GCPtr pGC, int nseg,
- xSegment *pSeg)
+glamor_poly_segment(DrawablePtr pDrawable, GCPtr pGC, int nseg, xSegment *pSeg)
{
- _glamor_poly_segment(pDrawable, pGC, nseg, pSeg, TRUE);
+ _glamor_poly_segment(pDrawable, pGC, nseg, pSeg, TRUE);
}
Bool
glamor_poly_segment_nf(DrawablePtr pDrawable, GCPtr pGC, int nseg,
- xSegment *pSeg)
+ xSegment *pSeg)
{
- return _glamor_poly_segment(pDrawable, pGC, nseg, pSeg, FALSE);
+ return _glamor_poly_segment(pDrawable, pGC, nseg, pSeg, FALSE);
}
diff --git a/xorg-server/glamor/glamor_priv.h b/xorg-server/glamor/glamor_priv.h
index 7b8f762c9..dc3873013 100644
--- a/xorg-server/glamor/glamor_priv.h
+++ b/xorg-server/glamor/glamor_priv.h
@@ -27,20 +27,13 @@
#ifndef GLAMOR_PRIV_H
#define GLAMOR_PRIV_H
-#ifdef HAVE_CONFIG_H
-#include "config.h"
-#endif
-
-#include "compiler.h"
+#include "dix-config.h"
#include <xorg-server.h>
#ifndef DEBUG
#define NDEBUG
#endif
#include "glamor.h"
-#include "compat-api.h"
-
-#define GL_GLEXT_PROTOTYPES
#ifdef GLAMOR_GLES2
#include <GLES2/gl2.h>
@@ -61,125 +54,110 @@
#include "glamor_debug.h"
#include <list.h>
-/* The list.h rename all the function to add xorg_ prefix.
- We add hack here to avoid the compile error when using
- old version xserver header file.
- These will be removed in future. */
-#ifndef xorg_list_entry
-#define xorg_list list
-#define xorg_list_for_each_entry list_for_each_entry
-#define xorg_list_for_each_entry_safe list_for_each_entry_safe
-#define xorg_list_del list_del
-#define xorg_list_add list_add
-#define xorg_list_append list_append
-#define xorg_list_init list_init
-#endif
struct glamor_pixmap_private;
typedef struct glamor_composite_shader {
- GLuint prog;
- GLint dest_to_dest_uniform_location;
- GLint dest_to_source_uniform_location;
- GLint dest_to_mask_uniform_location;
- GLint source_uniform_location;
- GLint mask_uniform_location;
- GLint source_wh;
- GLint mask_wh;
- GLint source_repeat_mode;
- GLint mask_repeat_mode;
- union {
- float source_solid_color[4];
- struct {
- struct glamor_pixmap_private *source_priv;
- PicturePtr source;
- };
- };
-
- union {
- float mask_solid_color[4];
- struct {
- struct glamor_pixmap_private *mask_priv;
- PicturePtr mask;
- };
- };
+ GLuint prog;
+ GLint dest_to_dest_uniform_location;
+ GLint dest_to_source_uniform_location;
+ GLint dest_to_mask_uniform_location;
+ GLint source_uniform_location;
+ GLint mask_uniform_location;
+ GLint source_wh;
+ GLint mask_wh;
+ GLint source_repeat_mode;
+ GLint mask_repeat_mode;
+ union {
+ float source_solid_color[4];
+ struct {
+ struct glamor_pixmap_private *source_priv;
+ PicturePtr source;
+ };
+ };
+
+ union {
+ float mask_solid_color[4];
+ struct {
+ struct glamor_pixmap_private *mask_priv;
+ PicturePtr mask;
+ };
+ };
} glamor_composite_shader;
enum shader_source {
- SHADER_SOURCE_SOLID,
- SHADER_SOURCE_TEXTURE,
- SHADER_SOURCE_TEXTURE_ALPHA,
- SHADER_SOURCE_COUNT,
+ SHADER_SOURCE_SOLID,
+ SHADER_SOURCE_TEXTURE,
+ SHADER_SOURCE_TEXTURE_ALPHA,
+ SHADER_SOURCE_COUNT,
};
enum shader_mask {
- SHADER_MASK_NONE,
- SHADER_MASK_SOLID,
- SHADER_MASK_TEXTURE,
- SHADER_MASK_TEXTURE_ALPHA,
- SHADER_MASK_COUNT,
+ SHADER_MASK_NONE,
+ SHADER_MASK_SOLID,
+ SHADER_MASK_TEXTURE,
+ SHADER_MASK_TEXTURE_ALPHA,
+ SHADER_MASK_COUNT,
};
enum shader_in {
- SHADER_IN_SOURCE_ONLY,
- SHADER_IN_NORMAL,
- SHADER_IN_CA_SOURCE,
- SHADER_IN_CA_ALPHA,
- SHADER_IN_COUNT,
+ SHADER_IN_SOURCE_ONLY,
+ SHADER_IN_NORMAL,
+ SHADER_IN_CA_SOURCE,
+ SHADER_IN_CA_ALPHA,
+ SHADER_IN_COUNT,
};
struct shader_key {
- enum shader_source source;
- enum shader_mask mask;
- enum shader_in in;
+ enum shader_source source;
+ enum shader_mask mask;
+ enum shader_in in;
};
struct blendinfo {
- Bool dest_alpha;
- Bool source_alpha;
- GLenum source_blend;
- GLenum dest_blend;
+ Bool dest_alpha;
+ Bool source_alpha;
+ GLenum source_blend;
+ GLenum dest_blend;
};
typedef struct {
- INT16 x_src;
- INT16 y_src;
- INT16 x_mask;
- INT16 y_mask;
- INT16 x_dst;
- INT16 y_dst;
- INT16 width;
- INT16 height;
+ INT16 x_src;
+ INT16 y_src;
+ INT16 x_mask;
+ INT16 y_mask;
+ INT16 x_dst;
+ INT16 y_dst;
+ INT16 width;
+ INT16 height;
} glamor_composite_rect_t;
-
enum glamor_vertex_type {
- GLAMOR_VERTEX_POS,
- GLAMOR_VERTEX_SOURCE,
- GLAMOR_VERTEX_MASK
+ GLAMOR_VERTEX_POS,
+ GLAMOR_VERTEX_SOURCE,
+ GLAMOR_VERTEX_MASK
};
-
enum gradient_shader {
- SHADER_GRADIENT_LINEAR,
- SHADER_GRADIENT_RADIAL,
- SHADER_GRADIENT_CONICAL,
- SHADER_GRADIENT_COUNT,
+ SHADER_GRADIENT_LINEAR,
+ SHADER_GRADIENT_RADIAL,
+ SHADER_GRADIENT_CONICAL,
+ SHADER_GRADIENT_COUNT,
};
enum gradient_shader_prog {
- SHADER_GRADIENT_VS_PROG,
- SHADER_GRADIENT_FS_MAIN_PROG,
- SHADER_GRADIENT_FS_GETCOLOR_PROG,
- SHADER_GRADIENT_PROG_COUNT,
+ SHADER_GRADIENT_VS_PROG,
+ SHADER_GRADIENT_FS_MAIN_PROG,
+ SHADER_GRADIENT_FS_GETCOLOR_PROG,
+ SHADER_GRADIENT_PROG_COUNT,
};
struct glamor_screen_private;
struct glamor_pixmap_private;
enum glamor_gl_flavor {
- GLAMOR_GL_DESKTOP, // OPENGL API
- GLAMOR_GL_ES2 // OPENGL ES2.0 API
+ GLAMOR_GL_DESKTOP, // OPENGL API
+ GLAMOR_GL_ES2 // OPENGL ES2.0 API
};
#define GLAMOR_CREATE_PIXMAP_CPU 0x100
@@ -194,34 +172,34 @@ enum glamor_gl_flavor {
#define GLAMOR_COMPOSITE_VBO_VERT_CNT (64*1024)
typedef struct {
- PicturePtr picture; /* Where the glyphs of the cache are stored */
- GlyphPtr *glyphs;
- uint16_t count;
- uint16_t evict;
+ PicturePtr picture; /* Where the glyphs of the cache are stored */
+ GlyphPtr *glyphs;
+ uint16_t count;
+ uint16_t evict;
} glamor_glyph_cache_t;
#include "glamor_gl_dispatch.h"
-struct glamor_saved_procs {
- CloseScreenProcPtr close_screen;
- CreateGCProcPtr create_gc;
- CreatePixmapProcPtr create_pixmap;
- DestroyPixmapProcPtr destroy_pixmap;
- GetSpansProcPtr get_spans;
- GetImageProcPtr get_image;
- CompositeProcPtr composite;
- CompositeRectsProcPtr composite_rects;
- TrapezoidsProcPtr trapezoids;
- GlyphsProcPtr glyphs;
- ChangeWindowAttributesProcPtr change_window_attributes;
- CopyWindowProcPtr copy_window;
- BitmapToRegionProcPtr bitmap_to_region;
- TrianglesProcPtr triangles;
- AddTrapsProcPtr addtraps;
- CreatePictureProcPtr create_picture;
- DestroyPictureProcPtr destroy_picture;
- UnrealizeGlyphProcPtr unrealize_glyph;
- SetWindowPixmapProcPtr set_window_pixmap;
+struct glamor_saved_procs {
+ CloseScreenProcPtr close_screen;
+ CreateGCProcPtr create_gc;
+ CreatePixmapProcPtr create_pixmap;
+ DestroyPixmapProcPtr destroy_pixmap;
+ GetSpansProcPtr get_spans;
+ GetImageProcPtr get_image;
+ CompositeProcPtr composite;
+ CompositeRectsProcPtr composite_rects;
+ TrapezoidsProcPtr trapezoids;
+ GlyphsProcPtr glyphs;
+ ChangeWindowAttributesProcPtr change_window_attributes;
+ CopyWindowProcPtr copy_window;
+ BitmapToRegionProcPtr bitmap_to_region;
+ TrianglesProcPtr triangles;
+ AddTrapsProcPtr addtraps;
+ CreatePictureProcPtr create_picture;
+ DestroyPictureProcPtr destroy_picture;
+ UnrealizeGlyphProcPtr unrealize_glyph;
+ SetWindowPixmapProcPtr set_window_pixmap;
};
#ifdef GLAMOR_GLES2
@@ -242,79 +220,80 @@ struct glamor_saved_procs {
#define RENDER_IDEL_MAX 32
typedef struct glamor_screen_private {
- struct glamor_gl_dispatch _dispatch;
- int yInverted;
- unsigned int tick;
- enum glamor_gl_flavor gl_flavor;
- int has_pack_invert;
- int has_fbo_blit;
- int max_fbo_size;
-
- struct xorg_list fbo_cache[CACHE_FORMAT_COUNT][CACHE_BUCKET_WCOUNT][CACHE_BUCKET_HCOUNT];
- unsigned long fbo_cache_watermark;
-
- /* glamor_solid */
- GLint solid_prog;
- GLint solid_color_uniform_location;
-
- /* vertext/elment_index buffer object for render */
- GLuint vbo, ebo;
- int vbo_offset;
- int vbo_size;
- char *vb;
- int vb_stride;
- Bool has_source_coords, has_mask_coords;
- int render_nr_verts;
- glamor_composite_shader composite_shader[SHADER_SOURCE_COUNT]
- [SHADER_MASK_COUNT]
- [SHADER_IN_COUNT];
- glamor_glyph_cache_t glyphCaches[GLAMOR_NUM_GLYPH_CACHE_FORMATS];
- Bool glyph_cache_initialized;
-
- /* shaders to restore a texture to another texture.*/
- GLint finish_access_prog[2];
- GLint finish_access_revert[2];
- GLint finish_access_swap_rb[2];
-
- /* glamor_tile */
- GLint tile_prog;
- GLint tile_wh;
-
- /* glamor gradient, 0 for small nstops, 1 for
- large nstops and 2 for dynamic generate. */
- GLint gradient_prog[SHADER_GRADIENT_COUNT][3];
- GLint linear_gradient_shaders[SHADER_GRADIENT_PROG_COUNT][3];
- int linear_max_nstops;
- GLint radial_gradient_shaders[SHADER_GRADIENT_PROG_COUNT][3];
- int radial_max_nstops;
-
- /* glamor trapezoid shader. */
- GLint trapezoid_prog;
-
- /* glamor_putimage */
- GLint put_image_xybitmap_prog;
- GLint put_image_xybitmap_fg_uniform_location;
- GLint put_image_xybitmap_bg_uniform_location;
-
- PixmapPtr *back_pixmap;
- int screen_fbo;
- struct glamor_saved_procs saved_procs;
- char delayed_fallback_string[GLAMOR_DELAYED_STRING_MAX + 1];
- int delayed_fallback_pending;
- int flags;
- int state;
- unsigned int render_idle_cnt;
- ScreenPtr screen;
- int dri3_enabled;
-
- /* xv */
- GLint xv_prog;
+ struct glamor_gl_dispatch _dispatch;
+ int yInverted;
+ unsigned int tick;
+ enum glamor_gl_flavor gl_flavor;
+ int has_pack_invert;
+ int has_fbo_blit;
+ int max_fbo_size;
+
+ struct xorg_list
+ fbo_cache[CACHE_FORMAT_COUNT][CACHE_BUCKET_WCOUNT][CACHE_BUCKET_HCOUNT];
+ unsigned long fbo_cache_watermark;
+
+ /* glamor_solid */
+ GLint solid_prog;
+ GLint solid_color_uniform_location;
+
+ /* vertext/elment_index buffer object for render */
+ GLuint vbo, ebo;
+ int vbo_offset;
+ int vbo_size;
+ char *vb;
+ int vb_stride;
+ Bool has_source_coords, has_mask_coords;
+ int render_nr_verts;
+ glamor_composite_shader composite_shader[SHADER_SOURCE_COUNT]
+ [SHADER_MASK_COUNT]
+ [SHADER_IN_COUNT];
+ glamor_glyph_cache_t glyphCaches[GLAMOR_NUM_GLYPH_CACHE_FORMATS];
+ Bool glyph_cache_initialized;
+
+ /* shaders to restore a texture to another texture. */
+ GLint finish_access_prog[2];
+ GLint finish_access_revert[2];
+ GLint finish_access_swap_rb[2];
+
+ /* glamor_tile */
+ GLint tile_prog;
+ GLint tile_wh;
+
+ /* glamor gradient, 0 for small nstops, 1 for
+ large nstops and 2 for dynamic generate. */
+ GLint gradient_prog[SHADER_GRADIENT_COUNT][3];
+ GLint linear_gradient_shaders[SHADER_GRADIENT_PROG_COUNT][3];
+ int linear_max_nstops;
+ GLint radial_gradient_shaders[SHADER_GRADIENT_PROG_COUNT][3];
+ int radial_max_nstops;
+
+ /* glamor trapezoid shader. */
+ GLint trapezoid_prog;
+
+ /* glamor_putimage */
+ GLint put_image_xybitmap_prog;
+ GLint put_image_xybitmap_fg_uniform_location;
+ GLint put_image_xybitmap_bg_uniform_location;
+
+ PixmapPtr *back_pixmap;
+ int screen_fbo;
+ struct glamor_saved_procs saved_procs;
+ char delayed_fallback_string[GLAMOR_DELAYED_STRING_MAX + 1];
+ int delayed_fallback_pending;
+ int flags;
+ int state;
+ unsigned int render_idle_cnt;
+ ScreenPtr screen;
+ int dri3_enabled;
+
+ /* xv */
+ GLint xv_prog;
} glamor_screen_private;
typedef enum glamor_access {
- GLAMOR_ACCESS_RO,
- GLAMOR_ACCESS_RW,
- GLAMOR_ACCESS_WO,
+ GLAMOR_ACCESS_RO,
+ GLAMOR_ACCESS_RW,
+ GLAMOR_ACCESS_WO,
} glamor_access_t;
#define GLAMOR_FBO_NORMAL 1
@@ -335,17 +314,17 @@ typedef enum glamor_access {
* @glamor_priv: point to glamor private data.
*/
typedef struct glamor_pixmap_fbo {
- struct xorg_list list;
- unsigned int expire;
- unsigned char pbo_valid;
- GLuint tex;
- GLuint fb;
- GLuint pbo;
- int width;
- int height;
- GLenum format;
- GLenum type;
- glamor_screen_private *glamor_priv;
+ struct xorg_list list;
+ unsigned int expire;
+ unsigned char pbo_valid;
+ GLuint tex;
+ GLuint fb;
+ GLuint pbo;
+ int width;
+ int height;
+ GLenum format;
+ GLenum type;
+ glamor_screen_private *glamor_priv;
} glamor_pixmap_fbo;
/*
@@ -414,9 +393,9 @@ typedef struct glamor_pixmap_fbo {
*
**/
-typedef struct glamor_pixmap_clipped_regions{
- int block_idx;
- RegionPtr region;
+typedef struct glamor_pixmap_clipped_regions {
+ int block_idx;
+ RegionPtr region;
} glamor_pixmap_clipped_regions;
#define SET_PIXMAP_FBO_CURRENT(priv, idx) \
@@ -428,16 +407,16 @@ typedef struct glamor_pixmap_clipped_regions{
} while(0)
typedef struct glamor_pixmap_private_base {
- glamor_pixmap_type_t type;
- unsigned char gl_fbo:2;
- unsigned char is_picture:1;
- unsigned char gl_tex:1;
- glamor_pixmap_fbo *fbo;
- PixmapPtr pixmap;
- int drm_stride;
- glamor_screen_private *glamor_priv;
- PicturePtr picture;
-}glamor_pixmap_private_base_t;
+ glamor_pixmap_type_t type;
+ unsigned char gl_fbo:2;
+ unsigned char is_picture:1;
+ unsigned char gl_tex:1;
+ glamor_pixmap_fbo *fbo;
+ PixmapPtr pixmap;
+ int drm_stride;
+ glamor_screen_private *glamor_priv;
+ PicturePtr picture;
+} glamor_pixmap_private_base_t;
/*
* @base.fbo: current fbo.
@@ -452,39 +431,39 @@ typedef struct glamor_pixmap_private_base {
*
**/
typedef struct glamor_pixmap_private_large {
- union {
- glamor_pixmap_type_t type;
- glamor_pixmap_private_base_t base;
- };
- BoxRec box;
- int block_w;
- int block_h;
- int block_wcnt;
- int block_hcnt;
- int nbox;
- BoxPtr box_array;
- glamor_pixmap_fbo **fbo_array;
-}glamor_pixmap_private_large_t;
+ union {
+ glamor_pixmap_type_t type;
+ glamor_pixmap_private_base_t base;
+ };
+ BoxRec box;
+ int block_w;
+ int block_h;
+ int block_wcnt;
+ int block_hcnt;
+ int nbox;
+ BoxPtr box_array;
+ glamor_pixmap_fbo **fbo_array;
+} glamor_pixmap_private_large_t;
/*
* @box: the relative coords in the corresponding fbo.
*/
typedef struct glamor_pixmap_private_atlas {
- union {
- glamor_pixmap_type_t type;
- glamor_pixmap_private_base_t base;
- };
- BoxRec box;
-}glamor_pixmap_private_atlas_t;
+ union {
+ glamor_pixmap_type_t type;
+ glamor_pixmap_private_base_t base;
+ };
+ BoxRec box;
+} glamor_pixmap_private_atlas_t;
typedef struct glamor_pixmap_private {
- union {
- glamor_pixmap_type_t type;
- glamor_pixmap_private_base_t base;
- glamor_pixmap_private_large_t large;
- glamor_pixmap_private_atlas_t atlas;
- };
-}glamor_pixmap_private;
+ union {
+ glamor_pixmap_type_t type;
+ glamor_pixmap_private_base_t base;
+ glamor_pixmap_private_large_t large;
+ glamor_pixmap_private_atlas_t atlas;
+ };
+} glamor_pixmap_private;
/*
* Pixmap dynamic status, used by dynamic upload feature.
@@ -496,10 +475,10 @@ typedef struct glamor_pixmap_private {
*
* */
typedef enum glamor_pixmap_status {
- GLAMOR_NONE,
- GLAMOR_UPLOAD_PENDING,
- GLAMOR_UPLOAD_DONE,
- GLAMOR_UPLOAD_FAILED
+ GLAMOR_NONE,
+ GLAMOR_UPLOAD_PENDING,
+ GLAMOR_UPLOAD_DONE,
+ GLAMOR_UPLOAD_FAILED
} glamor_pixmap_status_t;
extern DevPrivateKey glamor_screen_private_key;
@@ -507,33 +486,28 @@ extern DevPrivateKey glamor_pixmap_private_key;
static inline glamor_screen_private *
glamor_get_screen_private(ScreenPtr screen)
{
- return (glamor_screen_private *)
- dixLookupPrivate(&screen->devPrivates,
- glamor_screen_private_key);
+ return (glamor_screen_private *)
+ dixLookupPrivate(&screen->devPrivates, glamor_screen_private_key);
}
static inline void
glamor_set_screen_private(ScreenPtr screen, glamor_screen_private *priv)
{
- dixSetPrivate(&screen->devPrivates,
- glamor_screen_private_key,
- priv);
+ dixSetPrivate(&screen->devPrivates, glamor_screen_private_key, priv);
}
-
-
static inline glamor_pixmap_private *
glamor_get_pixmap_private(PixmapPtr pixmap)
{
- glamor_pixmap_private *priv;
- priv = dixLookupPrivate(&pixmap->devPrivates,
- glamor_pixmap_private_key);
- if (!priv) {
- glamor_set_pixmap_type(pixmap, GLAMOR_MEMORY);
- priv = dixLookupPrivate(&pixmap->devPrivates,
- glamor_pixmap_private_key);
- }
- return priv;
+ glamor_pixmap_private *priv;
+
+ priv = dixLookupPrivate(&pixmap->devPrivates, glamor_pixmap_private_key);
+ if (!priv) {
+ glamor_set_pixmap_type(pixmap, GLAMOR_MEMORY);
+ priv = dixLookupPrivate(&pixmap->devPrivates,
+ glamor_pixmap_private_key);
+ }
+ return priv;
}
void glamor_set_pixmap_private(PixmapPtr pixmap, glamor_pixmap_private *priv);
@@ -545,8 +519,8 @@ void glamor_set_pixmap_private(PixmapPtr pixmap, glamor_pixmap_private *priv);
static inline Bool
glamor_pm_is_solid(DrawablePtr drawable, unsigned long planemask)
{
- return (planemask & FbFullMask(drawable->depth)) ==
- FbFullMask(drawable->depth);
+ return (planemask & FbFullMask(drawable->depth)) ==
+ FbFullMask(drawable->depth);
}
extern int glamor_debug_level;
@@ -556,12 +530,15 @@ PixmapPtr glamor_get_drawable_pixmap(DrawablePtr drawable);
Bool glamor_destroy_pixmap(PixmapPtr pixmap);
-glamor_pixmap_fbo* glamor_pixmap_detach_fbo(glamor_pixmap_private *pixmap_priv);
+glamor_pixmap_fbo *glamor_pixmap_detach_fbo(glamor_pixmap_private *
+ pixmap_priv);
void glamor_pixmap_attach_fbo(PixmapPtr pixmap, glamor_pixmap_fbo *fbo);
-glamor_pixmap_fbo * glamor_create_fbo_from_tex(glamor_screen_private *glamor_priv,
- int w, int h, GLenum format, GLint tex, int flag);
-glamor_pixmap_fbo * glamor_create_fbo(glamor_screen_private *glamor_priv,
- int w, int h, GLenum format, int flag);
+glamor_pixmap_fbo *glamor_create_fbo_from_tex(glamor_screen_private *
+ glamor_priv, int w, int h,
+ GLenum format, GLint tex,
+ int flag);
+glamor_pixmap_fbo *glamor_create_fbo(glamor_screen_private *glamor_priv, int w,
+ int h, GLenum format, int flag);
void glamor_destroy_fbo(glamor_pixmap_fbo *fbo);
void glamor_pixmap_destroy_fbo(glamor_pixmap_private *priv);
void glamor_purge_fbo(glamor_pixmap_fbo *fbo);
@@ -571,23 +548,23 @@ void glamor_fini_pixmap_fbo(ScreenPtr screen);
Bool glamor_pixmap_fbo_fixup(ScreenPtr screen, PixmapPtr pixmap);
void glamor_fbo_expire(glamor_screen_private *glamor_priv);
-glamor_pixmap_fbo *
-glamor_create_fbo_array(glamor_screen_private *glamor_priv,
- int w, int h, GLenum format, int flag,
- int block_w, int block_h, glamor_pixmap_private *);
+glamor_pixmap_fbo *glamor_create_fbo_array(glamor_screen_private *glamor_priv,
+ int w, int h, GLenum format,
+ int flag, int block_w, int block_h,
+ glamor_pixmap_private *);
/* glamor_copyarea.c */
RegionPtr
+
glamor_copy_area(DrawablePtr src, DrawablePtr dst, GCPtr gc,
- int srcx, int srcy, int width, int height, int dstx,
- int dsty);
+ int srcx, int srcy, int width, int height, int dstx, int dsty);
void glamor_copy_n_to_n(DrawablePtr src, DrawablePtr dst, GCPtr gc,
- BoxPtr box, int nbox, int dx, int dy, Bool reverse,
- Bool upsidedown, Pixel bitplane, void *closure);
+ BoxPtr box, int nbox, int dx, int dy, Bool reverse,
+ Bool upsidedown, Pixel bitplane, void *closure);
/* glamor_copywindow.c */
void glamor_copy_window(WindowPtr win, DDXPointRec old_origin,
- RegionPtr src_region);
+ RegionPtr src_region);
/* glamor_core.c */
Bool glamor_prepare_access(DrawablePtr drawable, glamor_access_t access);
@@ -600,36 +577,34 @@ void glamor_init_finish_access_shaders(ScreenPtr screen);
void glamor_fini_finish_access_shaders(ScreenPtr screen);
const Bool glamor_get_drawable_location(const DrawablePtr drawable);
void glamor_get_drawable_deltas(DrawablePtr drawable, PixmapPtr pixmap,
- int *x, int *y);
+ int *x, int *y);
Bool glamor_stipple(PixmapPtr pixmap, PixmapPtr stipple,
- int x, int y, int width, int height,
- unsigned char alu, unsigned long planemask,
- unsigned long fg_pixel, unsigned long bg_pixel,
- int stipple_x, int stipple_y);
-GLint glamor_compile_glsl_prog(glamor_gl_dispatch * dispatch, GLenum type,
- const char *source);
-void glamor_link_glsl_prog(glamor_gl_dispatch * dispatch, GLint prog);
+ int x, int y, int width, int height,
+ unsigned char alu, unsigned long planemask,
+ unsigned long fg_pixel, unsigned long bg_pixel,
+ int stipple_x, int stipple_y);
+GLint glamor_compile_glsl_prog(glamor_gl_dispatch *dispatch, GLenum type,
+ const char *source);
+void glamor_link_glsl_prog(glamor_gl_dispatch *dispatch, GLint prog);
void glamor_get_color_4f_from_pixel(PixmapPtr pixmap,
- unsigned long fg_pixel,
- GLfloat * color);
+ unsigned long fg_pixel, GLfloat *color);
int glamor_set_destination_pixmap(PixmapPtr pixmap);
-int glamor_set_destination_pixmap_priv(glamor_pixmap_private *
- pixmap_priv);
+int glamor_set_destination_pixmap_priv(glamor_pixmap_private *pixmap_priv);
void glamor_set_destination_pixmap_fbo(glamor_pixmap_fbo *, int, int, int, int);
/* nc means no check. caller must ensure this pixmap has valid fbo.
* usually use the GLAMOR_PIXMAP_PRIV_HAS_FBO firstly.
* */
-void glamor_set_destination_pixmap_priv_nc(glamor_pixmap_private *
- pixmap_priv);
+void glamor_set_destination_pixmap_priv_nc(glamor_pixmap_private *pixmap_priv);
-glamor_pixmap_fbo *
-glamor_es2_pixmap_read_prepare(PixmapPtr source, int x, int y, int w, int h, GLenum format,
- GLenum type, int no_alpha, int revert, int swap_rb);
+glamor_pixmap_fbo *glamor_es2_pixmap_read_prepare(PixmapPtr source, int x,
+ int y, int w, int h,
+ GLenum format, GLenum type,
+ int no_alpha, int revert,
+ int swap_rb);
-Bool glamor_set_alu(struct glamor_gl_dispatch *dispatch,
- unsigned char alu);
+Bool glamor_set_alu(struct glamor_gl_dispatch *dispatch, unsigned char alu);
Bool glamor_set_planemask(PixmapPtr pixmap, unsigned long planemask);
Bool glamor_change_window_attributes(WindowPtr pWin, unsigned long mask);
RegionPtr glamor_bitmap_to_region(PixmapPtr pixmap);
@@ -640,107 +615,88 @@ int glamor_gl_get_version(void);
((major) * 256) \
+ ((minor) * 1))
-
-
-
/* glamor_fill.c */
Bool glamor_fill(DrawablePtr drawable,
- GCPtr gc, int x, int y, int width, int height, Bool fallback);
+ GCPtr gc, int x, int y, int width, int height, Bool fallback);
Bool glamor_solid(PixmapPtr pixmap, int x, int y, int width, int height,
- unsigned char alu, unsigned long planemask,
- unsigned long fg_pixel);
-Bool
-glamor_solid_boxes(PixmapPtr pixmap,
- BoxPtr box, int nbox,
- unsigned long fg_pixel);
+ unsigned char alu, unsigned long planemask,
+ unsigned long fg_pixel);
+Bool glamor_solid_boxes(PixmapPtr pixmap,
+ BoxPtr box, int nbox, unsigned long fg_pixel);
/* glamor_fillspans.c */
void glamor_fill_spans(DrawablePtr drawable,
- GCPtr gc,
- int n, DDXPointPtr points, int *widths, int sorted);
+ GCPtr gc,
+ int n, DDXPointPtr points, int *widths, int sorted);
void glamor_init_solid_shader(ScreenPtr screen);
void glamor_fini_solid_shader(ScreenPtr screen);
/* glamor_getspans.c */
-void
-
-glamor_get_spans(DrawablePtr drawable,
- int wmax,
- DDXPointPtr points,
- int *widths, int nspans, char *dst_start);
+void glamor_get_spans(DrawablePtr drawable,
+ int wmax, DDXPointPtr points, int *widths,
+ int nspans, char *dst_start);
/* glamor_glyphs.c */
void glamor_glyphs_fini(ScreenPtr screen);
void glamor_glyphs(CARD8 op,
- PicturePtr pSrc,
- PicturePtr pDst,
- PictFormatPtr maskFormat,
- INT16 xSrc,
- INT16 ySrc, int nlist, GlyphListPtr list,
- GlyphPtr * glyphs);
+ PicturePtr pSrc,
+ PicturePtr pDst,
+ PictFormatPtr maskFormat,
+ INT16 xSrc,
+ INT16 ySrc, int nlist, GlyphListPtr list, GlyphPtr *glyphs);
/* glamor_setspans.c */
void glamor_set_spans(DrawablePtr drawable, GCPtr gc, char *src,
- DDXPointPtr points, int *widths, int n, int sorted);
+ DDXPointPtr points, int *widths, int n, int sorted);
/* glamor_polyfillrect.c */
-void
-glamor_poly_fill_rect(DrawablePtr drawable,
- GCPtr gc, int nrect, xRectangle * prect);
+void glamor_poly_fill_rect(DrawablePtr drawable,
+ GCPtr gc, int nrect, xRectangle *prect);
/* glamor_polylines.c */
-void
-
-glamor_poly_lines(DrawablePtr drawable, GCPtr gc, int mode, int n,
- DDXPointPtr points);
+void glamor_poly_lines(DrawablePtr drawable, GCPtr gc, int mode, int n,
+ DDXPointPtr points);
/* glamor_putimage.c */
-void
-
-glamor_put_image(DrawablePtr drawable, GCPtr gc, int depth, int x, int y,
- int w, int h, int leftPad, int format, char *bits);
+void glamor_put_image(DrawablePtr drawable, GCPtr gc, int depth, int x, int y,
+ int w, int h, int leftPad, int format, char *bits);
void glamor_init_putimage_shaders(ScreenPtr screen);
void glamor_fini_putimage_shaders(ScreenPtr screen);
/* glamor_render.c */
-Bool
-glamor_composite_clipped_region(CARD8 op,
- PicturePtr source,
- PicturePtr mask,
- PicturePtr dest,
- glamor_pixmap_private *soruce_pixmap_priv,
- glamor_pixmap_private *mask_pixmap_priv,
- glamor_pixmap_private *dest_pixmap_priv,
- RegionPtr region,
- int x_source,
- int y_source,
- int x_mask,
- int y_mask,
- int x_dest,
- int y_dest);
+Bool glamor_composite_clipped_region(CARD8 op,
+ PicturePtr source,
+ PicturePtr mask,
+ PicturePtr dest,
+ glamor_pixmap_private *soruce_pixmap_priv,
+ glamor_pixmap_private *mask_pixmap_priv,
+ glamor_pixmap_private *dest_pixmap_priv,
+ RegionPtr region,
+ int x_source,
+ int y_source,
+ int x_mask, int y_mask,
+ int x_dest, int y_dest);
void glamor_composite(CARD8 op,
- PicturePtr pSrc,
- PicturePtr pMask,
- PicturePtr pDst,
- INT16 xSrc,
- INT16 ySrc,
- INT16 xMask,
- INT16 yMask,
- INT16 xDst, INT16 yDst, CARD16 width, CARD16 height);
+ PicturePtr pSrc,
+ PicturePtr pMask,
+ PicturePtr pDst,
+ INT16 xSrc,
+ INT16 ySrc,
+ INT16 xMask,
+ INT16 yMask,
+ INT16 xDst, INT16 yDst, CARD16 width, CARD16 height);
void glamor_init_composite_shaders(ScreenPtr screen);
void glamor_fini_composite_shaders(ScreenPtr screen);
void glamor_composite_glyph_rects(CARD8 op,
- PicturePtr src, PicturePtr mask,
- PicturePtr dst, int nrect,
- glamor_composite_rect_t * rects);
-void glamor_composite_rects (CARD8 op,
- PicturePtr pDst,
- xRenderColor *color,
- int nRect,
- xRectangle *rects);
+ PicturePtr src, PicturePtr mask,
+ PicturePtr dst, int nrect,
+ glamor_composite_rect_t *rects);
+void glamor_composite_rects(CARD8 op,
+ PicturePtr pDst,
+ xRenderColor *color, int nRect, xRectangle *rects);
void glamor_init_trapezoid_shader(ScreenPtr screen);
void glamor_fini_trapezoid_shader(ScreenPtr screen);
PicturePtr glamor_convert_gradient_picture(ScreenPtr screen,
@@ -752,19 +708,18 @@ Bool glamor_composite_choose_shader(CARD8 op,
PicturePtr source,
PicturePtr mask,
PicturePtr dest,
- glamor_pixmap_private *source_pixmap_priv,
- glamor_pixmap_private *mask_pixmap_priv,
- glamor_pixmap_private *dest_pixmap_priv,
+ glamor_pixmap_private *source_pixmap_priv,
+ glamor_pixmap_private *mask_pixmap_priv,
+ glamor_pixmap_private *dest_pixmap_priv,
struct shader_key *s_key,
- glamor_composite_shader **shader,
- struct blendinfo *op_info,
+ glamor_composite_shader ** shader,
+ struct blendinfo *op_info,
PictFormatShort *psaved_source_format);
-void
-glamor_composite_set_shader_blend(glamor_pixmap_private *dest_priv,
- struct shader_key *key,
- glamor_composite_shader *shader,
- struct blendinfo *op_info);
+void glamor_composite_set_shader_blend(glamor_pixmap_private *dest_priv,
+ struct shader_key *key,
+ glamor_composite_shader *shader,
+ struct blendinfo *op_info);
void glamor_setup_composite_vbo(ScreenPtr screen, int n_verts);
void glamor_emit_composite_vert(ScreenPtr screen,
@@ -774,15 +729,15 @@ void glamor_emit_composite_vert(ScreenPtr screen,
/* glamor_trapezoid.c */
void glamor_trapezoids(CARD8 op,
- PicturePtr src, PicturePtr dst,
- PictFormatPtr mask_format, INT16 x_src, INT16 y_src,
- int ntrap, xTrapezoid * traps);
+ PicturePtr src, PicturePtr dst,
+ PictFormatPtr mask_format, INT16 x_src, INT16 y_src,
+ int ntrap, xTrapezoid *traps);
/* glamor_tile.c */
Bool glamor_tile(PixmapPtr pixmap, PixmapPtr tile,
- int x, int y, int width, int height,
- unsigned char alu, unsigned long planemask,
- int tile_x, int tile_y);
+ int x, int y, int width, int height,
+ unsigned char alu, unsigned long planemask,
+ int tile_x, int tile_y);
void glamor_init_tile_shader(ScreenPtr screen);
void glamor_fini_tile_shader(ScreenPtr screen);
@@ -801,18 +756,17 @@ PicturePtr glamor_generate_radial_gradient_picture(ScreenPtr screen,
PictFormatShort format);
/* glamor_triangles.c */
-void
-
-glamor_triangles(CARD8 op,
- PicturePtr pSrc,
- PicturePtr pDst,
- PictFormatPtr maskFormat,
- INT16 xSrc, INT16 ySrc, int ntris, xTriangle * tris);
+void glamor_triangles(CARD8 op,
+ PicturePtr pSrc,
+ PicturePtr pDst,
+ PictFormatPtr maskFormat,
+ INT16 xSrc, INT16 ySrc, int ntris, xTriangle * tris);
/* glamor_pixmap.c */
void glamor_pixmap_init(ScreenPtr screen);
void glamor_pixmap_fini(ScreenPtr screen);
+
/**
* Download a pixmap's texture to cpu memory. If success,
* One copy of current pixmap's texture will be put into
@@ -822,13 +776,11 @@ void glamor_pixmap_fini(ScreenPtr screen);
* gl_tex must be 1. Used by glamor_prepare_access.
*
*/
-Bool glamor_download_pixmap_to_cpu(PixmapPtr pixmap,
- glamor_access_t access);
-
-void *
-glamor_download_sub_pixmap_to_cpu(PixmapPtr pixmap, int x, int y, int w, int h,
- int stride, void *bits, int pbo, glamor_access_t access);
+Bool glamor_download_pixmap_to_cpu(PixmapPtr pixmap, glamor_access_t access);
+void *glamor_download_sub_pixmap_to_cpu(PixmapPtr pixmap, int x, int y, int w,
+ int h, int stride, void *bits, int pbo,
+ glamor_access_t access);
/**
* Restore a pixmap's data which is downloaded by
@@ -848,85 +800,81 @@ void glamor_restore_pixmap_to_texture(PixmapPtr pixmap);
* the fbo has valid texture and attach to a valid fb.
* If the fbo already has a valid glfbo then do nothing.
*/
-Bool
-glamor_pixmap_ensure_fbo(PixmapPtr pixmap, GLenum format, int flag);
+Bool glamor_pixmap_ensure_fbo(PixmapPtr pixmap, GLenum format, int flag);
/**
* Upload a pixmap to gl texture. Used by dynamic pixmap
* uploading feature. The pixmap must be a software pixmap.
* This function will change current FBO and current shaders.
*/
-enum glamor_pixmap_status glamor_upload_pixmap_to_texture(PixmapPtr
- pixmap);
+enum glamor_pixmap_status glamor_upload_pixmap_to_texture(PixmapPtr pixmap);
-Bool
-glamor_upload_sub_pixmap_to_texture(PixmapPtr pixmap, int x, int y, int w, int h,
- int stride, void *bits, int pbo);
+Bool glamor_upload_sub_pixmap_to_texture(PixmapPtr pixmap, int x, int y, int w,
+ int h, int stride, void *bits,
+ int pbo);
-PixmapPtr
-glamor_get_sub_pixmap(PixmapPtr pixmap, int x, int y,
- int w, int h, glamor_access_t access);
-void
-glamor_put_sub_pixmap(PixmapPtr sub_pixmap, PixmapPtr pixmap, int x, int y,
- int w, int h, glamor_access_t access);
+PixmapPtr glamor_get_sub_pixmap(PixmapPtr pixmap, int x, int y,
+ int w, int h, glamor_access_t access);
+void glamor_put_sub_pixmap(PixmapPtr sub_pixmap, PixmapPtr pixmap, int x, int y,
+ int w, int h, glamor_access_t access);
glamor_pixmap_clipped_regions *
-glamor_compute_clipped_regions(glamor_pixmap_private *priv, RegionPtr region,
- int *clipped_nbox, int repeat_type,
- int reverse, int upsidedown);
+glamor_compute_clipped_regions(glamor_pixmap_private *priv,
+ RegionPtr region, int *clipped_nbox,
+ int repeat_type, int reverse,
+ int upsidedown);
glamor_pixmap_clipped_regions *
glamor_compute_clipped_regions_ext(glamor_pixmap_private *pixmap_priv,
- RegionPtr region,
- int *n_region,
- int inner_block_w, int inner_block_h,
- int reverse, int upsidedown);
+ RegionPtr region, int *n_region,
+ int inner_block_w, int inner_block_h,
+ int reverse, int upsidedown);
glamor_pixmap_clipped_regions *
-glamor_compute_transform_clipped_regions(glamor_pixmap_private *priv, struct pixman_transform *transform,
- RegionPtr region, int *n_region, int dx, int dy, int repeat_type,
- int reverse, int upsidedown);
-
-Bool
-glamor_composite_largepixmap_region(CARD8 op,
- PicturePtr source,
- PicturePtr mask,
- PicturePtr dest,
- glamor_pixmap_private * source_pixmap_priv,
- glamor_pixmap_private * mask_pixmap_priv,
- glamor_pixmap_private * dest_pixmap_priv,
- RegionPtr region, Bool force_clip,
- INT16 x_source,
- INT16 y_source,
- INT16 x_mask,
- INT16 y_mask,
- INT16 x_dest, INT16 y_dest,
- CARD16 width, CARD16 height);
-
-Bool
-glamor_get_transform_block_size(struct pixman_transform *transform,
- int block_w, int block_h,
- int *transformed_block_w,
- int *transformed_block_h);
-
-void
-glamor_get_transform_extent_from_box(struct pixman_box32 *temp_box,
- struct pixman_transform *transform);
+glamor_compute_transform_clipped_regions(glamor_pixmap_private *priv,
+ struct pixman_transform *transform,
+ RegionPtr region,
+ int *n_region, int dx, int dy,
+ int repeat_type, int reverse,
+ int upsidedown);
+
+Bool glamor_composite_largepixmap_region(CARD8 op,
+ PicturePtr source,
+ PicturePtr mask,
+ PicturePtr dest,
+ glamor_pixmap_private *source_pixmap_priv,
+ glamor_pixmap_private *mask_pixmap_priv,
+ glamor_pixmap_private *dest_pixmap_priv,
+ RegionPtr region, Bool force_clip,
+ INT16 x_source,
+ INT16 y_source,
+ INT16 x_mask,
+ INT16 y_mask,
+ INT16 x_dest, INT16 y_dest,
+ CARD16 width, CARD16 height);
+
+Bool glamor_get_transform_block_size(struct pixman_transform *transform,
+ int block_w, int block_h,
+ int *transformed_block_w,
+ int *transformed_block_h);
+
+void glamor_get_transform_extent_from_box(struct pixman_box32 *temp_box,
+ struct pixman_transform *transform);
/**
* Upload a picture to gl texture. Similar to the
* glamor_upload_pixmap_to_texture. Used in rendering.
**/
-enum glamor_pixmap_status
- glamor_upload_picture_to_texture(PicturePtr picture);
+enum glamor_pixmap_status glamor_upload_picture_to_texture(PicturePtr picture);
/**
* Upload bits to a pixmap's texture. This function will
* convert the bits to the specified format/type format
* if the conversion is unavoidable.
**/
-Bool glamor_upload_bits_to_pixmap_texture(PixmapPtr pixmap, GLenum format, GLenum type,
- int no_alpha, int revert, int swap_rb, void *bits);
+Bool glamor_upload_bits_to_pixmap_texture(PixmapPtr pixmap, GLenum format,
+ GLenum type, int no_alpha, int revert,
+ int swap_rb, void *bits);
/**
* Destroy all the resources allocated on the uploading
@@ -938,72 +886,59 @@ int glamor_create_picture(PicturePtr picture);
void glamor_set_window_pixmap(WindowPtr pWindow, PixmapPtr pPixmap);
-Bool
-glamor_prepare_access_picture(PicturePtr picture, glamor_access_t access);
+Bool glamor_prepare_access_picture(PicturePtr picture, glamor_access_t access);
void glamor_finish_access_picture(PicturePtr picture, glamor_access_t access);
void glamor_destroy_picture(PicturePtr picture);
/* fixup a fbo to the exact size as the pixmap. */
-Bool
-glamor_fixup_pixmap_priv(ScreenPtr screen, glamor_pixmap_private *pixmap_priv);
+Bool glamor_fixup_pixmap_priv(ScreenPtr screen,
+ glamor_pixmap_private *pixmap_priv);
-void
-glamor_picture_format_fixup(PicturePtr picture,
- glamor_pixmap_private * pixmap_priv);
+void glamor_picture_format_fixup(PicturePtr picture,
+ glamor_pixmap_private *pixmap_priv);
-void
-glamor_get_image(DrawablePtr pDrawable, int x, int y, int w, int h,
- unsigned int format, unsigned long planeMask, char *d);
+void glamor_get_image(DrawablePtr pDrawable, int x, int y, int w, int h,
+ unsigned int format, unsigned long planeMask, char *d);
-void
-glamor_add_traps(PicturePtr pPicture,
- INT16 x_off,
- INT16 y_off, int ntrap, xTrap * traps);
+void glamor_add_traps(PicturePtr pPicture,
+ INT16 x_off, INT16 y_off, int ntrap, xTrap *traps);
-RegionPtr
-glamor_copy_plane(DrawablePtr pSrc, DrawablePtr pDst, GCPtr pGC,
- int srcx, int srcy, int w, int h, int dstx, int dsty,
- unsigned long bitPlane);
-
-void
-glamor_image_glyph_blt(DrawablePtr pDrawable, GCPtr pGC,
- int x, int y, unsigned int nglyph,
- CharInfoPtr * ppci, pointer pglyphBase);
-
-void
-glamor_poly_glyph_blt(DrawablePtr pDrawable, GCPtr pGC,
- int x, int y, unsigned int nglyph,
- CharInfoPtr * ppci, pointer pglyphBase);
-
-void
-glamor_push_pixels(GCPtr pGC, PixmapPtr pBitmap,
- DrawablePtr pDrawable, int w, int h, int x, int y);
-
-void
-glamor_poly_point(DrawablePtr pDrawable, GCPtr pGC, int mode, int npt,
- DDXPointPtr ppt);
-
-void
-glamor_poly_segment(DrawablePtr pDrawable, GCPtr pGC, int nseg,
- xSegment *pSeg);
-
-void
-glamor_poly_line(DrawablePtr pDrawable, GCPtr pGC, int mode, int npt,
- DDXPointPtr ppt);
-
-void
-glamor_composite_rectangles(CARD8 op,
- PicturePtr dst,
- xRenderColor *color,
- int num_rects,
- xRectangle *rects);
+RegionPtr glamor_copy_plane(DrawablePtr pSrc, DrawablePtr pDst, GCPtr pGC,
+ int srcx, int srcy, int w, int h,
+ int dstx, int dsty,
+ unsigned long bitPlane);
+
+void glamor_image_glyph_blt(DrawablePtr pDrawable, GCPtr pGC,
+ int x, int y, unsigned int nglyph,
+ CharInfoPtr *ppci, void *pglyphBase);
+
+void glamor_poly_glyph_blt(DrawablePtr pDrawable, GCPtr pGC,
+ int x, int y, unsigned int nglyph,
+ CharInfoPtr *ppci, void *pglyphBase);
+
+void glamor_push_pixels(GCPtr pGC, PixmapPtr pBitmap,
+ DrawablePtr pDrawable, int w, int h, int x, int y);
+
+void glamor_poly_point(DrawablePtr pDrawable, GCPtr pGC, int mode, int npt,
+ DDXPointPtr ppt);
+
+void glamor_poly_segment(DrawablePtr pDrawable, GCPtr pGC, int nseg,
+ xSegment *pSeg);
+
+void glamor_poly_line(DrawablePtr pDrawable, GCPtr pGC, int mode, int npt,
+ DDXPointPtr ppt);
+
+void glamor_composite_rectangles(CARD8 op,
+ PicturePtr dst,
+ xRenderColor *color,
+ int num_rects, xRectangle *rects);
/* glamor_xv */
typedef struct {
- uint32_t transform_index;
- uint32_t gamma; /* gamma value x 1000 */
+ uint32_t transform_index;
+ uint32_t gamma; /* gamma value x 1000 */
int brightness;
int saturation;
int hue;
@@ -1016,8 +951,8 @@ typedef struct {
int src_w, src_h, dst_w, dst_h;
int src_x, src_y, drw_x, drw_y;
int w, h;
- RegionRec clip;
- PixmapPtr src_pix[3]; /* y, u, v for planar */
+ RegionRec clip;
+ PixmapPtr src_pix[3]; /* y, u, v for planar */
int src_pix_w, src_pix_h;
} glamor_port_private;
@@ -1039,9 +974,9 @@ void glamor_fini_xv_shader(ScreenPtr screen);
#define GLAMOR_TEXTURED_LARGE_PIXMAP 1
#define WALKAROUND_LARGE_TEXTURE_MAP
#if 0
-#define MAX_FBO_SIZE 32 /* For test purpose only. */
+#define MAX_FBO_SIZE 32 /* For test purpose only. */
#endif
//#define GLYPHS_NO_EDEGEMAP_OVERLAP_CHECK
#define GLYPHS_EDEGE_OVERLAP_LOOSE_CHECK
-#endif /* GLAMOR_PRIV_H */
+#endif /* GLAMOR_PRIV_H */
diff --git a/xorg-server/glamor/glamor_putimage.c b/xorg-server/glamor/glamor_putimage.c
index 99f7ac6f5..6b25bec84 100644
--- a/xorg-server/glamor/glamor_putimage.c
+++ b/xorg-server/glamor/glamor_putimage.c
@@ -26,7 +26,6 @@
*
*/
-
/** @file glamor_putaimge.c
*
* XPutImage implementation
@@ -37,54 +36,61 @@ void
glamor_init_putimage_shaders(ScreenPtr screen)
{
#if 0
- glamor_screen_private *glamor_priv =
- glamor_get_screen_private(screen);
- const char *xybitmap_vs =
- "uniform float x_bias;\n" "uniform float x_scale;\n"
- "uniform float y_bias;\n" "uniform float y_scale;\n"
- "varying vec2 bitmap_coords;\n" "void main()\n" "{\n"
- " gl_Position = vec4((gl_Vertex.x + x_bias) * x_scale,\n"
- " (gl_Vertex.y + y_bias) * y_scale,\n"
- " 0,\n"
- " 1);\n"
- " bitmap_coords = gl_MultiTexCoord0.xy;\n" "}\n";
- const char *xybitmap_fs =
- "uniform vec4 fg, bg;\n" "varying vec2 bitmap_coords;\n"
- "uniform sampler2D bitmap_sampler;\n" "void main()\n" "{\n"
- " float bitmap_value = texture2D(bitmap_sampler,\n"
- " bitmap_coords).x;\n"
- " gl_FragColor = mix(bg, fg, bitmap_value);\n" "}\n";
- GLint fs_prog, vs_prog, prog;
- GLint sampler_uniform_location;
-
- if (!GLEW_ARB_fragment_shader)
- return;
-
- prog = dispatch->glCreateProgram();
- vs_prog = glamor_compile_glsl_prog(GL_VERTEX_SHADER, xybitmap_vs);
- fs_prog =
- glamor_compile_glsl_prog(GL_FRAGMENT_SHADER, xybitmap_fs);
- dispatch->glAttachShader(prog, vs_prog);
- dispatch->glAttachShader(prog, fs_prog);
- glamor_link_glsl_prog(prog);
-
- dispatch->glUseProgram(prog);
- sampler_uniform_location =
- dispatch->glGetUniformLocation(prog, "bitmap_sampler");
- dispatch->glUniform1i(sampler_uniform_location, 0);
-
- glamor_priv->put_image_xybitmap_fg_uniform_location =
- dispatch->glGetUniformLocation(prog, "fg");
- glamor_priv->put_image_xybitmap_bg_uniform_location =
- dispatch->glGetUniformLocation(prog, "bg");
- glamor_get_transform_uniform_locations(prog,
- &glamor_priv->put_image_xybitmap_transform);
- glamor_priv->put_image_xybitmap_prog = prog;
- dispatch->glUseProgram(0);
+ glamor_screen_private *glamor_priv = glamor_get_screen_private(screen);
+ const char *xybitmap_vs =
+ "uniform float x_bias;\n"
+ "uniform float x_scale;\n"
+ "uniform float y_bias;\n"
+ "uniform float y_scale;\n"
+ "varying vec2 bitmap_coords;\n"
+ "void main()\n"
+ "{\n"
+ " gl_Position = vec4((gl_Vertex.x + x_bias) * x_scale,\n"
+ " (gl_Vertex.y + y_bias) * y_scale,\n"
+ " 0,\n"
+ " 1);\n"
+ " bitmap_coords = gl_MultiTexCoord0.xy;\n"
+ "}\n";
+ const char *xybitmap_fs =
+ "uniform vec4 fg, bg;\n"
+ "varying vec2 bitmap_coords;\n"
+ "uniform sampler2D bitmap_sampler;\n"
+ "void main()\n"
+ "{\n"
+ " float bitmap_value = texture2D(bitmap_sampler,\n"
+ " bitmap_coords).x;\n"
+ " gl_FragColor = mix(bg, fg, bitmap_value);\n"
+ "}\n";
+ GLint fs_prog, vs_prog, prog;
+ GLint sampler_uniform_location;
+
+ if (!GLEW_ARB_fragment_shader)
+ return;
+
+ prog = dispatch->glCreateProgram();
+ vs_prog = glamor_compile_glsl_prog(GL_VERTEX_SHADER, xybitmap_vs);
+ fs_prog = glamor_compile_glsl_prog(GL_FRAGMENT_SHADER, xybitmap_fs);
+ dispatch->glAttachShader(prog, vs_prog);
+ dispatch->glAttachShader(prog, fs_prog);
+ glamor_link_glsl_prog(prog);
+
+ dispatch->glUseProgram(prog);
+ sampler_uniform_location =
+ dispatch->glGetUniformLocation(prog, "bitmap_sampler");
+ dispatch->glUniform1i(sampler_uniform_location, 0);
+
+ glamor_priv->put_image_xybitmap_fg_uniform_location =
+ dispatch->glGetUniformLocation(prog, "fg");
+ glamor_priv->put_image_xybitmap_bg_uniform_location =
+ dispatch->glGetUniformLocation(prog, "bg");
+ glamor_get_transform_uniform_locations(prog,
+ &glamor_priv->
+ put_image_xybitmap_transform);
+ glamor_priv->put_image_xybitmap_prog = prog;
+ dispatch->glUseProgram(0);
#endif
}
-
/* Do an XYBitmap putimage. The bits are byte-aligned rows of bitmap
* data (where each row starts at a bit index of left_pad), and the
* destination gets filled with the gc's fg color where the bitmap is set
@@ -101,141 +107,136 @@ glamor_init_putimage_shaders(ScreenPtr screen)
static int
y_flip(PixmapPtr pixmap, int y)
{
- ScreenPtr screen = pixmap->drawable.pScreen;
- PixmapPtr screen_pixmap = screen->GetScreenPixmap(screen);
+ ScreenPtr screen = pixmap->drawable.pScreen;
+ PixmapPtr screen_pixmap = screen->GetScreenPixmap(screen);
- if (pixmap == screen_pixmap)
- return (pixmap->drawable.height - 1) - y;
- else
- return y;
+ if (pixmap == screen_pixmap)
+ return (pixmap->drawable.height - 1) - y;
+ else
+ return y;
}
-
static void
glamor_put_image_xybitmap(DrawablePtr drawable, GCPtr gc,
- int x, int y, int w, int h, int left_pad,
- int image_format, char *bits)
+ int x, int y, int w, int h, int left_pad,
+ int image_format, char *bits)
{
- ScreenPtr screen = drawable->pScreen;
- PixmapPtr pixmap = glamor_get_drawable_pixmap(drawable);
- glamor_screen_private *glamor_priv =
- glamor_get_screen_private(screen);
- float fg[4], bg[4];
- GLuint tex;
- unsigned int stride = PixmapBytePad(1, w + left_pad);
- RegionPtr clip;
- BoxPtr box;
- int nbox;
- float dest_coords[8];
- const float bitmap_coords[8] = {
- 0.0, 0.0,
- 1.0, 0.0,
- 1.0, 1.0,
- 0.0, 1.0,
- };
- GLfloat xscale, yscale;
- glamor_pixmap_private *pixmap_priv;
-
- pixmap_priv = glamor_get_pixmap_private(pixmap);
-
- pixmap_priv_get_scale(pixmap_priv, &xscale, &yscale);
-
- glamor_set_normalize_vcoords(xscale, yscale,
- x, y,
- x + w, y + h,
- glamor_priv->yInverted, dest_coords);
-
- glamor_fallback("glamor_put_image_xybitmap: disabled\n");
- goto fail;
-
- if (glamor_priv->put_image_xybitmap_prog == 0) {
- ErrorF("no program for xybitmap putimage\n");
- goto fail;
- }
-
- glamor_set_alu(gc->alu);
- if (!glamor_set_planemask(pixmap, gc->planemask))
- goto fail;
-
- dispatch->glUseProgram(glamor_priv->put_image_xybitmap_prog);
-
- glamor_get_color_4f_from_pixel(pixmap, gc->fgPixel, fg);
- dispatch->glUniform4fv
- (glamor_priv->put_image_xybitmap_fg_uniform_location, 1, fg);
- glamor_get_color_4f_from_pixel(pixmap, gc->bgPixel, bg);
- dispatch->glUniform4fv
- (glamor_priv->put_image_xybitmap_bg_uniform_location, 1, bg);
-
- dispatch->glGenTextures(1, &tex);
- dispatch->glActiveTexture(GL_TEXTURE0);
- dispatch->glEnable(GL_TEXTURE_2D);
- dispatch->glBindTexture(GL_TEXTURE_2D, tex);
- dispatch->glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER,
- GL_NEAREST);
- dispatch->glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER,
- GL_NEAREST);
- dispatch->glPixelStorei(GL_UNPACK_ALIGNMENT, 1);
- dispatch->glPixelStorei(GL_UNPACK_ROW_LENGTH, stride * 8);
- dispatch->glPixelStorei(GL_UNPACK_SKIP_PIXELS, left_pad);
- dispatch->glTexImage2D(GL_TEXTURE_2D, 0, GL_ALPHA,
- w, h, 0, GL_COLOR_INDEX, GL_BITMAP, bits);
- dispatch->glPixelStorei(GL_UNPACK_ROW_LENGTH, 0);
- dispatch->glPixelStorei(GL_UNPACK_SKIP_PIXELS, 0);
-
- /* Now that we've set up our bitmap texture and the shader, shove
- * the destination rectangle through the cliprects and run the
- * shader on the resulting fragments.
- */
- dispatch->glVertexPointer(2, GL_FLOAT, 0, dest_coords);
- dispatch->glEnableClientState(GL_VERTEX_ARRAY);
- dispatch->glClientActiveTexture(GL_TEXTURE0);
- dispatch->glTexCoordPointer(2, GL_FLOAT, 0, bitmap_coords);
- dispatch->glEnableClientState(GL_TEXTURE_COORD_ARRAY);
-
- dispatch->glEnable(GL_SCISSOR_TEST);
- clip = fbGetCompositeClip(gc);
- for (nbox = REGION_NUM_RECTS(clip),
- box = REGION_RECTS(clip); nbox--; box++) {
- int x1 = x;
- int y1 = y;
- int x2 = x + w;
- int y2 = y + h;
-
- if (x1 < box->x1)
- x1 = box->x1;
- if (y1 < box->y1)
- y1 = box->y1;
- if (x2 > box->x2)
- x2 = box->x2;
- if (y2 > box->y2)
- y2 = box->y2;
- if (x1 >= x2 || y1 >= y2)
- continue;
-
- dispatch->glScissor(box->x1,
- y_flip(pixmap, box->y1),
- box->x2 - box->x1, box->y2 - box->y1);
- dispatch->glDrawArrays(GL_QUADS, 0, 4);
- }
-
- dispatch->glDisable(GL_SCISSOR_TEST);
- glamor_set_alu(GXcopy);
- glamor_set_planemask(pixmap, ~0);
- dispatch->glDeleteTextures(1, &tex);
- dispatch->glDisable(GL_TEXTURE_2D);
- dispatch->glDisableClientState(GL_VERTEX_ARRAY);
- dispatch->glDisableClientState(GL_TEXTURE_COORD_ARRAY);
- return;
- glamor_set_alu(GXcopy);
- glamor_set_planemask(pixmap, ~0);
- glamor_fallback(": to %p (%c)\n",
- drawable, glamor_get_drawable_location(drawable));
-fail:
- if (glamor_prepare_access(drawable, GLAMOR_ACCESS_RW)) {
- fbPutImage(drawable, gc, 1, x, y, w, h, left_pad, XYBitmap,
- bits);
- glamor_finish_access(drawable, GLAMOR_ACCESS_RW);
- }
+ ScreenPtr screen = drawable->pScreen;
+ PixmapPtr pixmap = glamor_get_drawable_pixmap(drawable);
+ glamor_screen_private *glamor_priv = glamor_get_screen_private(screen);
+ float fg[4], bg[4];
+ GLuint tex;
+ unsigned int stride = PixmapBytePad(1, w + left_pad);
+ RegionPtr clip;
+ BoxPtr box;
+ int nbox;
+ float dest_coords[8];
+
+ const float bitmap_coords[8] = {
+ 0.0, 0.0,
+ 1.0, 0.0,
+ 1.0, 1.0,
+ 0.0, 1.0,
+ };
+ GLfloat xscale, yscale;
+ glamor_pixmap_private *pixmap_priv;
+
+ pixmap_priv = glamor_get_pixmap_private(pixmap);
+
+ pixmap_priv_get_scale(pixmap_priv, &xscale, &yscale);
+
+ glamor_set_normalize_vcoords(xscale, yscale,
+ x, y,
+ x + w, y + h,
+ glamor_priv->yInverted, dest_coords);
+
+ glamor_fallback("glamor_put_image_xybitmap: disabled\n");
+ goto fail;
+
+ if (glamor_priv->put_image_xybitmap_prog == 0) {
+ ErrorF("no program for xybitmap putimage\n");
+ goto fail;
+ }
+
+ glamor_set_alu(gc->alu);
+ if (!glamor_set_planemask(pixmap, gc->planemask))
+ goto fail;
+
+ dispatch->glUseProgram(glamor_priv->put_image_xybitmap_prog);
+
+ glamor_get_color_4f_from_pixel(pixmap, gc->fgPixel, fg);
+ dispatch->glUniform4fv
+ (glamor_priv->put_image_xybitmap_fg_uniform_location, 1, fg);
+ glamor_get_color_4f_from_pixel(pixmap, gc->bgPixel, bg);
+ dispatch->glUniform4fv
+ (glamor_priv->put_image_xybitmap_bg_uniform_location, 1, bg);
+
+ dispatch->glGenTextures(1, &tex);
+ dispatch->glActiveTexture(GL_TEXTURE0);
+ dispatch->glEnable(GL_TEXTURE_2D);
+ dispatch->glBindTexture(GL_TEXTURE_2D, tex);
+ dispatch->glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST);
+ dispatch->glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST);
+ dispatch->glPixelStorei(GL_UNPACK_ALIGNMENT, 1);
+ dispatch->glPixelStorei(GL_UNPACK_ROW_LENGTH, stride * 8);
+ dispatch->glPixelStorei(GL_UNPACK_SKIP_PIXELS, left_pad);
+ dispatch->glTexImage2D(GL_TEXTURE_2D, 0, GL_ALPHA,
+ w, h, 0, GL_COLOR_INDEX, GL_BITMAP, bits);
+ dispatch->glPixelStorei(GL_UNPACK_ROW_LENGTH, 0);
+ dispatch->glPixelStorei(GL_UNPACK_SKIP_PIXELS, 0);
+
+ /* Now that we've set up our bitmap texture and the shader, shove
+ * the destination rectangle through the cliprects and run the
+ * shader on the resulting fragments.
+ */
+ dispatch->glVertexPointer(2, GL_FLOAT, 0, dest_coords);
+ dispatch->glEnableClientState(GL_VERTEX_ARRAY);
+ dispatch->glClientActiveTexture(GL_TEXTURE0);
+ dispatch->glTexCoordPointer(2, GL_FLOAT, 0, bitmap_coords);
+ dispatch->glEnableClientState(GL_TEXTURE_COORD_ARRAY);
+
+ dispatch->glEnable(GL_SCISSOR_TEST);
+ clip = fbGetCompositeClip(gc);
+ for (nbox = REGION_NUM_RECTS(clip), box = REGION_RECTS(clip); nbox--; box++) {
+ int x1 = x;
+ int y1 = y;
+ int x2 = x + w;
+ int y2 = y + h;
+
+ if (x1 < box->x1)
+ x1 = box->x1;
+ if (y1 < box->y1)
+ y1 = box->y1;
+ if (x2 > box->x2)
+ x2 = box->x2;
+ if (y2 > box->y2)
+ y2 = box->y2;
+ if (x1 >= x2 || y1 >= y2)
+ continue;
+
+ dispatch->glScissor(box->x1,
+ y_flip(pixmap, box->y1),
+ box->x2 - box->x1, box->y2 - box->y1);
+ dispatch->glDrawArrays(GL_QUADS, 0, 4);
+ }
+
+ dispatch->glDisable(GL_SCISSOR_TEST);
+ glamor_set_alu(GXcopy);
+ glamor_set_planemask(pixmap, ~0);
+ dispatch->glDeleteTextures(1, &tex);
+ dispatch->glDisable(GL_TEXTURE_2D);
+ dispatch->glDisableClientState(GL_VERTEX_ARRAY);
+ dispatch->glDisableClientState(GL_TEXTURE_COORD_ARRAY);
+ return;
+ glamor_set_alu(GXcopy);
+ glamor_set_planemask(pixmap, ~0);
+ glamor_fallback(": to %p (%c)\n",
+ drawable, glamor_get_drawable_location(drawable));
+ fail:
+ if (glamor_prepare_access(drawable, GLAMOR_ACCESS_RW)) {
+ fbPutImage(drawable, gc, 1, x, y, w, h, left_pad, XYBitmap, bits);
+ glamor_finish_access(drawable, GLAMOR_ACCESS_RW);
+ }
}
#endif
@@ -244,120 +245,120 @@ glamor_fini_putimage_shaders(ScreenPtr screen)
{
}
-
-static Bool
+static Bool
_glamor_put_image(DrawablePtr drawable, GCPtr gc, int depth, int x, int y,
- int w, int h, int left_pad, int image_format, char *bits, Bool fallback)
+ int w, int h, int left_pad, int image_format, char *bits,
+ Bool fallback)
{
- PixmapPtr pixmap = glamor_get_drawable_pixmap(drawable);
- glamor_pixmap_private *pixmap_priv =
- glamor_get_pixmap_private(pixmap);
- RegionPtr clip;
- int x_off, y_off;
- Bool ret = FALSE;
- PixmapPtr temp_pixmap, sub_pixmap;
- glamor_pixmap_private *temp_pixmap_priv;
- BoxRec box;
-
- glamor_get_drawable_deltas(drawable, pixmap, &x_off, &y_off);
- clip = fbGetCompositeClip(gc);
- if (image_format == XYBitmap) {
- assert(depth == 1);
- goto fail;
- }
-
- if (!GLAMOR_PIXMAP_PRIV_HAS_FBO(pixmap_priv)) {
- glamor_fallback("has no fbo.\n");
- goto fail;
- }
-
- if (image_format != ZPixmap) {
- glamor_fallback("non-ZPixmap\n");
- goto fail;
- }
-
- if (!glamor_set_planemask(pixmap, gc->planemask)) {
- goto fail;
- }
- /* create a temporary pixmap and upload the bits to that
- * pixmap, then apply clip copy it to the destination pixmap.*/
- box.x1 = x + drawable->x;
- box.y1 = y + drawable->y;
- box.x2 = x + w + drawable->x;
- box.y2 = y + h + drawable->y;
-
- if ((clip != NULL && RegionContainsRect(clip, &box) != rgnIN)
- || gc->alu != GXcopy) {
- temp_pixmap = glamor_create_pixmap(drawable->pScreen, w, h, depth, 0);
- if (temp_pixmap == NULL)
- goto fail;
-
- temp_pixmap_priv = glamor_get_pixmap_private(temp_pixmap);
-
- if (GLAMOR_PIXMAP_PRIV_IS_PICTURE(pixmap_priv)) {
- temp_pixmap_priv->base.picture = pixmap_priv->base.picture;
- temp_pixmap_priv->base.is_picture = pixmap_priv->base.is_picture;
- }
-
- glamor_upload_sub_pixmap_to_texture(temp_pixmap, 0, 0, w, h,
- pixmap->devKind, bits, 0);
-
- glamor_copy_area(&temp_pixmap->drawable, drawable, gc, 0, 0, w, h, x, y);
- glamor_destroy_pixmap(temp_pixmap);
- } else
- glamor_upload_sub_pixmap_to_texture(pixmap, x + drawable->x + x_off, y + drawable->y + y_off,
- w, h, PixmapBytePad(w, depth), bits, 0);
- ret = TRUE;
- goto done;
-
-fail:
- glamor_set_planemask(pixmap, ~0);
-
- if (!fallback
- && glamor_ddx_fallback_check_pixmap(&pixmap->drawable))
- goto done;
-
- glamor_fallback("to %p (%c)\n",
- drawable, glamor_get_drawable_location(drawable));
-
- sub_pixmap = glamor_get_sub_pixmap(pixmap, x + x_off + drawable->x,
- y + y_off + drawable->y, w, h,
- GLAMOR_ACCESS_RW);
- if (sub_pixmap) {
- if (clip != NULL)
- pixman_region_translate (clip, -x - drawable->x, -y - drawable->y);
-
- fbPutImage(&sub_pixmap->drawable, gc, depth, 0, 0, w, h,
- left_pad, image_format, bits);
-
- glamor_put_sub_pixmap(sub_pixmap, pixmap,
- x + x_off + drawable->x,
- y + y_off + drawable->y,
- w, h, GLAMOR_ACCESS_RW);
- if (clip != NULL)
- pixman_region_translate (clip, x + drawable->x, y + drawable->y);
- } else
- fbPutImage(drawable, gc, depth, x, y, w, h,
- left_pad, image_format, bits);
- ret = TRUE;
-
-done:
- return ret;
+ PixmapPtr pixmap = glamor_get_drawable_pixmap(drawable);
+ glamor_pixmap_private *pixmap_priv = glamor_get_pixmap_private(pixmap);
+ RegionPtr clip;
+ int x_off, y_off;
+ Bool ret = FALSE;
+ PixmapPtr temp_pixmap, sub_pixmap;
+ glamor_pixmap_private *temp_pixmap_priv;
+ BoxRec box;
+
+ glamor_get_drawable_deltas(drawable, pixmap, &x_off, &y_off);
+ clip = fbGetCompositeClip(gc);
+ if (image_format == XYBitmap) {
+ assert(depth == 1);
+ goto fail;
+ }
+
+ if (!GLAMOR_PIXMAP_PRIV_HAS_FBO(pixmap_priv)) {
+ glamor_fallback("has no fbo.\n");
+ goto fail;
+ }
+
+ if (image_format != ZPixmap) {
+ glamor_fallback("non-ZPixmap\n");
+ goto fail;
+ }
+
+ if (!glamor_set_planemask(pixmap, gc->planemask)) {
+ goto fail;
+ }
+ /* create a temporary pixmap and upload the bits to that
+ * pixmap, then apply clip copy it to the destination pixmap.*/
+ box.x1 = x + drawable->x;
+ box.y1 = y + drawable->y;
+ box.x2 = x + w + drawable->x;
+ box.y2 = y + h + drawable->y;
+
+ if ((clip != NULL && RegionContainsRect(clip, &box) != rgnIN)
+ || gc->alu != GXcopy) {
+ temp_pixmap = glamor_create_pixmap(drawable->pScreen, w, h, depth, 0);
+ if (temp_pixmap == NULL)
+ goto fail;
+
+ temp_pixmap_priv = glamor_get_pixmap_private(temp_pixmap);
+
+ if (GLAMOR_PIXMAP_PRIV_IS_PICTURE(pixmap_priv)) {
+ temp_pixmap_priv->base.picture = pixmap_priv->base.picture;
+ temp_pixmap_priv->base.is_picture = pixmap_priv->base.is_picture;
+ }
+
+ glamor_upload_sub_pixmap_to_texture(temp_pixmap, 0, 0, w, h,
+ pixmap->devKind, bits, 0);
+
+ glamor_copy_area(&temp_pixmap->drawable, drawable, gc, 0, 0, w, h, x,
+ y);
+ glamor_destroy_pixmap(temp_pixmap);
+ }
+ else
+ glamor_upload_sub_pixmap_to_texture(pixmap, x + drawable->x + x_off,
+ y + drawable->y + y_off, w, h,
+ PixmapBytePad(w, depth), bits, 0);
+ ret = TRUE;
+ goto done;
+
+ fail:
+ glamor_set_planemask(pixmap, ~0);
+
+ if (!fallback && glamor_ddx_fallback_check_pixmap(&pixmap->drawable))
+ goto done;
+
+ glamor_fallback("to %p (%c)\n",
+ drawable, glamor_get_drawable_location(drawable));
+
+ sub_pixmap = glamor_get_sub_pixmap(pixmap, x + x_off + drawable->x,
+ y + y_off + drawable->y, w, h,
+ GLAMOR_ACCESS_RW);
+ if (sub_pixmap) {
+ if (clip != NULL)
+ pixman_region_translate(clip, -x - drawable->x, -y - drawable->y);
+
+ fbPutImage(&sub_pixmap->drawable, gc, depth, 0, 0, w, h,
+ left_pad, image_format, bits);
+
+ glamor_put_sub_pixmap(sub_pixmap, pixmap,
+ x + x_off + drawable->x,
+ y + y_off + drawable->y, w, h, GLAMOR_ACCESS_RW);
+ if (clip != NULL)
+ pixman_region_translate(clip, x + drawable->x, y + drawable->y);
+ }
+ else
+ fbPutImage(drawable, gc, depth, x, y, w, h,
+ left_pad, image_format, bits);
+ ret = TRUE;
+
+ done:
+ return ret;
}
void
glamor_put_image(DrawablePtr drawable, GCPtr gc, int depth, int x, int y,
- int w, int h, int left_pad, int image_format, char *bits)
+ int w, int h, int left_pad, int image_format, char *bits)
{
- _glamor_put_image(drawable, gc, depth, x, y, w, h,
- left_pad, image_format, bits, TRUE);
+ _glamor_put_image(drawable, gc, depth, x, y, w, h,
+ left_pad, image_format, bits, TRUE);
}
Bool
glamor_put_image_nf(DrawablePtr drawable, GCPtr gc, int depth, int x, int y,
- int w, int h, int left_pad, int image_format, char *bits)
+ int w, int h, int left_pad, int image_format, char *bits)
{
- return _glamor_put_image(drawable, gc, depth, x, y, w, h,
- left_pad, image_format, bits, FALSE);
+ return _glamor_put_image(drawable, gc, depth, x, y, w, h,
+ left_pad, image_format, bits, FALSE);
}
-
diff --git a/xorg-server/glamor/glamor_render.c b/xorg-server/glamor/glamor_render.c
index 76a571f8b..4a3a97ccd 100644
--- a/xorg-server/glamor/glamor_render.c
+++ b/xorg-server/glamor/glamor_render.c
@@ -45,1425 +45,1428 @@
#endif
static struct blendinfo composite_op_info[] = {
- [PictOpClear] = {0, 0, GL_ZERO, GL_ZERO},
- [PictOpSrc] = {0, 0, GL_ONE, GL_ZERO},
- [PictOpDst] = {0, 0, GL_ZERO, GL_ONE},
- [PictOpOver] = {0, 1, GL_ONE, GL_ONE_MINUS_SRC_ALPHA},
- [PictOpOverReverse] = {1, 0, GL_ONE_MINUS_DST_ALPHA, GL_ONE},
- [PictOpIn] = {1, 0, GL_DST_ALPHA, GL_ZERO},
- [PictOpInReverse] = {0, 1, GL_ZERO, GL_SRC_ALPHA},
- [PictOpOut] = {1, 0, GL_ONE_MINUS_DST_ALPHA, GL_ZERO},
- [PictOpOutReverse] = {0, 1, GL_ZERO, GL_ONE_MINUS_SRC_ALPHA},
- [PictOpAtop] = {1, 1, GL_DST_ALPHA, GL_ONE_MINUS_SRC_ALPHA},
- [PictOpAtopReverse] = {1, 1, GL_ONE_MINUS_DST_ALPHA, GL_SRC_ALPHA},
- [PictOpXor] =
- {1, 1, GL_ONE_MINUS_DST_ALPHA, GL_ONE_MINUS_SRC_ALPHA},
- [PictOpAdd] = {0, 0, GL_ONE, GL_ONE},
+ [PictOpClear] = {0, 0, GL_ZERO, GL_ZERO},
+ [PictOpSrc] = {0, 0, GL_ONE, GL_ZERO},
+ [PictOpDst] = {0, 0, GL_ZERO, GL_ONE},
+ [PictOpOver] = {0, 1, GL_ONE, GL_ONE_MINUS_SRC_ALPHA},
+ [PictOpOverReverse] = {1, 0, GL_ONE_MINUS_DST_ALPHA, GL_ONE},
+ [PictOpIn] = {1, 0, GL_DST_ALPHA, GL_ZERO},
+ [PictOpInReverse] = {0, 1, GL_ZERO, GL_SRC_ALPHA},
+ [PictOpOut] = {1, 0, GL_ONE_MINUS_DST_ALPHA, GL_ZERO},
+ [PictOpOutReverse] = {0, 1, GL_ZERO, GL_ONE_MINUS_SRC_ALPHA},
+ [PictOpAtop] = {1, 1, GL_DST_ALPHA, GL_ONE_MINUS_SRC_ALPHA},
+ [PictOpAtopReverse] = {1, 1, GL_ONE_MINUS_DST_ALPHA, GL_SRC_ALPHA},
+ [PictOpXor] = {1, 1, GL_ONE_MINUS_DST_ALPHA, GL_ONE_MINUS_SRC_ALPHA},
+ [PictOpAdd] = {0, 0, GL_ONE, GL_ONE},
};
+
#define RepeatFix 10
static GLuint
-glamor_create_composite_fs(glamor_gl_dispatch * dispatch,
- struct shader_key *key)
+glamor_create_composite_fs(glamor_gl_dispatch *dispatch,
+ struct shader_key *key)
{
- const char *repeat_define =
- "#define RepeatNone 0\n"
- "#define RepeatNormal 1\n"
- "#define RepeatPad 2\n"
- "#define RepeatReflect 3\n"
- "#define RepeatFix 10\n"
- "uniform int source_repeat_mode;\n"
- "uniform int mask_repeat_mode;\n";
- const char *relocate_texture =
- GLAMOR_DEFAULT_PRECISION
- "vec2 rel_tex_coord(vec2 texture, vec4 wh, int repeat) \n"
- "{\n"
- " vec2 rel_tex; \n"
- " rel_tex = texture * wh.xy; \n"
- " if (repeat == RepeatNone)\n"
- " return rel_tex; \n"
- " else if (repeat == RepeatNormal) \n"
- " rel_tex = floor(rel_tex) + (fract(rel_tex) / wh.xy); \n"
- " else if(repeat == RepeatPad) { \n"
- " if (rel_tex.x >= 1.0) rel_tex.x = 1.0 - wh.z * wh.x / 2.; \n"
- " else if(rel_tex.x < 0.0) rel_tex.x = 0.0; \n"
- " if (rel_tex.y >= 1.0) rel_tex.y = 1.0 - wh.w * wh.y / 2.; \n"
- " else if(rel_tex.y < 0.0) rel_tex.y = 0.0; \n"
- " rel_tex = rel_tex / wh.xy; \n"
- " } \n"
- " else if(repeat == RepeatReflect) {\n"
- " if ((1.0 - mod(abs(floor(rel_tex.x)), 2.0)) < 0.001)\n"
- " rel_tex.x = 2.0 - (1.0 - fract(rel_tex.x))/wh.x;\n"
- " else \n"
- " rel_tex.x = fract(rel_tex.x)/wh.x;\n"
- " if ((1.0 - mod(abs(floor(rel_tex.y)), 2.0)) < 0.001)\n"
- " rel_tex.y = 2.0 - (1.0 - fract(rel_tex.y))/wh.y;\n"
- " else \n"
- " rel_tex.y = fract(rel_tex.y)/wh.y;\n"
- " } \n"
- " return rel_tex; \n"
- "}\n";
- /* The texture and the pixmap size is not match eaxctly, so can't sample it directly.
- * rel_sampler will recalculate the texture coords.*/
- const char *rel_sampler =
- " vec4 rel_sampler(sampler2D tex_image, vec2 tex, vec4 wh, int repeat, int set_alpha)\n"
- "{\n"
- " tex = rel_tex_coord(tex, wh, repeat - RepeatFix);\n"
- " if (repeat == RepeatFix) {\n"
- " if (!(tex.x >= 0.0 && tex.x < 1.0 \n"
- " && tex.y >= 0.0 && tex.y < 1.0))\n"
- " return vec4(0.0, 0.0, 0.0, set_alpha);\n"
- " tex = (fract(tex) / wh.xy);\n"
- " }\n"
- " if (set_alpha != 1)\n"
- " return texture2D(tex_image, tex);\n"
- " else\n"
- " return vec4(texture2D(tex_image, tex).rgb, 1.0);\n"
- "}\n";
-
- const char *source_solid_fetch =
- GLAMOR_DEFAULT_PRECISION
- "uniform vec4 source;\n"
- "vec4 get_source()\n" "{\n" " return source;\n" "}\n";
- const char *source_alpha_pixmap_fetch =
- GLAMOR_DEFAULT_PRECISION
- "varying vec2 source_texture;\n"
- "uniform sampler2D source_sampler;\n"
- "uniform vec4 source_wh;"
- "vec4 get_source()\n"
- "{\n"
- " if (source_repeat_mode < RepeatFix)\n"
- " return texture2D(source_sampler, source_texture);\n"
- " else \n"
- " return rel_sampler(source_sampler, source_texture,\n"
- " source_wh, source_repeat_mode, 0);\n"
- "}\n";
- const char *source_pixmap_fetch =
- GLAMOR_DEFAULT_PRECISION "varying vec2 source_texture;\n"
- "uniform sampler2D source_sampler;\n"
- "uniform vec4 source_wh;\n"
- "vec4 get_source()\n"
- "{\n"
- " if (source_repeat_mode < RepeatFix) \n"
- " return vec4(texture2D(source_sampler, source_texture).rgb, 1);\n"
- " else \n"
- " return rel_sampler(source_sampler, source_texture,\n"
- " source_wh, source_repeat_mode, 1);\n"
- "}\n";
- const char *mask_solid_fetch =
- GLAMOR_DEFAULT_PRECISION "uniform vec4 mask;\n"
- "vec4 get_mask()\n" "{\n" " return mask;\n" "}\n";
- const char *mask_alpha_pixmap_fetch =
- GLAMOR_DEFAULT_PRECISION "varying vec2 mask_texture;\n"
- "uniform sampler2D mask_sampler;\n"
- "uniform vec4 mask_wh;\n"
- "vec4 get_mask()\n"
- "{\n"
- " if (mask_repeat_mode < RepeatFix) \n"
- " return texture2D(mask_sampler, mask_texture);\n"
- " else \n"
- " return rel_sampler(mask_sampler, mask_texture,\n"
- " mask_wh, mask_repeat_mode, 0);\n"
- "}\n";
- const char *mask_pixmap_fetch =
- GLAMOR_DEFAULT_PRECISION "varying vec2 mask_texture;\n"
- "uniform sampler2D mask_sampler;\n"
- "uniform vec4 mask_wh;\n"
- "vec4 get_mask()\n"
- "{\n"
- " if (mask_repeat_mode < RepeatFix) \n"
- " return vec4(texture2D(mask_sampler, mask_texture).rgb, 1);\n"
- " else \n"
- " return rel_sampler(mask_sampler, mask_texture,\n"
- " mask_wh, mask_repeat_mode, 1);\n"
- "}\n";
- const char *in_source_only =
- GLAMOR_DEFAULT_PRECISION "void main()\n" "{\n"
- " gl_FragColor = get_source();\n" "}\n";
- const char *in_normal =
- GLAMOR_DEFAULT_PRECISION "void main()\n" "{\n"
- " gl_FragColor = get_source() * get_mask().a;\n" "}\n";
- const char *in_ca_source =
- GLAMOR_DEFAULT_PRECISION "void main()\n" "{\n"
- " gl_FragColor = get_source() * get_mask();\n" "}\n";
- const char *in_ca_alpha =
- GLAMOR_DEFAULT_PRECISION "void main()\n" "{\n"
- " gl_FragColor = get_source().a * get_mask();\n" "}\n";
- char *source;
- const char *source_fetch;
- const char *mask_fetch = "";
- const char *in;
- GLuint prog;
-
- switch (key->source) {
- case SHADER_SOURCE_SOLID:
- source_fetch = source_solid_fetch;
- break;
- case SHADER_SOURCE_TEXTURE_ALPHA:
- source_fetch = source_alpha_pixmap_fetch;
- break;
- case SHADER_SOURCE_TEXTURE:
- source_fetch = source_pixmap_fetch;
- break;
- default:
- FatalError("Bad composite shader source");
- }
-
- switch (key->mask) {
- case SHADER_MASK_NONE:
- break;
- case SHADER_MASK_SOLID:
- mask_fetch = mask_solid_fetch;
- break;
- case SHADER_MASK_TEXTURE_ALPHA:
- mask_fetch = mask_alpha_pixmap_fetch;
- break;
- case SHADER_MASK_TEXTURE:
- mask_fetch = mask_pixmap_fetch;
- break;
- default:
- FatalError("Bad composite shader mask");
- }
-
- switch (key->in) {
- case SHADER_IN_SOURCE_ONLY:
- in = in_source_only;
- break;
- case SHADER_IN_NORMAL:
- in = in_normal;
- break;
- case SHADER_IN_CA_SOURCE:
- in = in_ca_source;
- break;
- case SHADER_IN_CA_ALPHA:
- in = in_ca_alpha;
- break;
- default:
- FatalError("Bad composite IN type");
- }
-
- XNFasprintf(&source, "%s%s%s%s%s%s", repeat_define, relocate_texture, rel_sampler,source_fetch, mask_fetch, in);
-
-
- prog = glamor_compile_glsl_prog(dispatch, GL_FRAGMENT_SHADER,
- source);
- free(source);
-
- return prog;
+ const char *repeat_define =
+ "#define RepeatNone 0\n"
+ "#define RepeatNormal 1\n"
+ "#define RepeatPad 2\n"
+ "#define RepeatReflect 3\n"
+ "#define RepeatFix 10\n"
+ "uniform int source_repeat_mode;\n"
+ "uniform int mask_repeat_mode;\n";
+ const char *relocate_texture =
+ GLAMOR_DEFAULT_PRECISION
+ "vec2 rel_tex_coord(vec2 texture, vec4 wh, int repeat) \n"
+ "{\n"
+ " vec2 rel_tex; \n"
+ " rel_tex = texture * wh.xy; \n"
+ " if (repeat == RepeatNone)\n"
+ " return rel_tex; \n"
+ " else if (repeat == RepeatNormal) \n"
+ " rel_tex = floor(rel_tex) + (fract(rel_tex) / wh.xy); \n"
+ " else if(repeat == RepeatPad) { \n"
+ " if (rel_tex.x >= 1.0) rel_tex.x = 1.0 - wh.z * wh.x / 2.; \n"
+ " else if(rel_tex.x < 0.0) rel_tex.x = 0.0; \n"
+ " if (rel_tex.y >= 1.0) rel_tex.y = 1.0 - wh.w * wh.y / 2.; \n"
+ " else if(rel_tex.y < 0.0) rel_tex.y = 0.0; \n"
+ " rel_tex = rel_tex / wh.xy; \n"
+ " } \n"
+ " else if(repeat == RepeatReflect) {\n"
+ " if ((1.0 - mod(abs(floor(rel_tex.x)), 2.0)) < 0.001)\n"
+ " rel_tex.x = 2.0 - (1.0 - fract(rel_tex.x))/wh.x;\n"
+ " else \n"
+ " rel_tex.x = fract(rel_tex.x)/wh.x;\n"
+ " if ((1.0 - mod(abs(floor(rel_tex.y)), 2.0)) < 0.001)\n"
+ " rel_tex.y = 2.0 - (1.0 - fract(rel_tex.y))/wh.y;\n"
+ " else \n"
+ " rel_tex.y = fract(rel_tex.y)/wh.y;\n"
+ " } \n"
+ " return rel_tex; \n"
+ "}\n";
+ /* The texture and the pixmap size is not match eaxctly, so can't sample it directly.
+ * rel_sampler will recalculate the texture coords.*/
+ const char *rel_sampler =
+ " vec4 rel_sampler(sampler2D tex_image, vec2 tex, vec4 wh, int repeat, int set_alpha)\n"
+ "{\n"
+ " tex = rel_tex_coord(tex, wh, repeat - RepeatFix);\n"
+ " if (repeat == RepeatFix) {\n"
+ " if (!(tex.x >= 0.0 && tex.x < 1.0 \n"
+ " && tex.y >= 0.0 && tex.y < 1.0))\n"
+ " return vec4(0.0, 0.0, 0.0, set_alpha);\n"
+ " tex = (fract(tex) / wh.xy);\n"
+ " }\n"
+ " if (set_alpha != 1)\n"
+ " return texture2D(tex_image, tex);\n"
+ " else\n"
+ " return vec4(texture2D(tex_image, tex).rgb, 1.0);\n"
+ "}\n";
+
+ const char *source_solid_fetch =
+ GLAMOR_DEFAULT_PRECISION
+ "uniform vec4 source;\n"
+ "vec4 get_source()\n"
+ "{\n"
+ " return source;\n"
+ "}\n";
+ const char *source_alpha_pixmap_fetch =
+ GLAMOR_DEFAULT_PRECISION
+ "varying vec2 source_texture;\n"
+ "uniform sampler2D source_sampler;\n"
+ "uniform vec4 source_wh;"
+ "vec4 get_source()\n"
+ "{\n"
+ " if (source_repeat_mode < RepeatFix)\n"
+ " return texture2D(source_sampler, source_texture);\n"
+ " else \n"
+ " return rel_sampler(source_sampler, source_texture,\n"
+ " source_wh, source_repeat_mode, 0);\n"
+ "}\n";
+ const char *source_pixmap_fetch =
+ GLAMOR_DEFAULT_PRECISION
+ "varying vec2 source_texture;\n"
+ "uniform sampler2D source_sampler;\n"
+ "uniform vec4 source_wh;\n"
+ "vec4 get_source()\n"
+ "{\n"
+ " if (source_repeat_mode < RepeatFix) \n"
+ " return vec4(texture2D(source_sampler, source_texture).rgb, 1);\n"
+ " else \n"
+ " return rel_sampler(source_sampler, source_texture,\n"
+ " source_wh, source_repeat_mode, 1);\n"
+ "}\n";
+ const char *mask_solid_fetch =
+ GLAMOR_DEFAULT_PRECISION
+ "uniform vec4 mask;\n"
+ "vec4 get_mask()\n"
+ "{\n"
+ " return mask;\n"
+ "}\n";
+ const char *mask_alpha_pixmap_fetch =
+ GLAMOR_DEFAULT_PRECISION
+ "varying vec2 mask_texture;\n"
+ "uniform sampler2D mask_sampler;\n"
+ "uniform vec4 mask_wh;\n"
+ "vec4 get_mask()\n"
+ "{\n"
+ " if (mask_repeat_mode < RepeatFix) \n"
+ " return texture2D(mask_sampler, mask_texture);\n"
+ " else \n"
+ " return rel_sampler(mask_sampler, mask_texture,\n"
+ " mask_wh, mask_repeat_mode, 0);\n"
+ "}\n";
+ const char *mask_pixmap_fetch =
+ GLAMOR_DEFAULT_PRECISION
+ "varying vec2 mask_texture;\n"
+ "uniform sampler2D mask_sampler;\n"
+ "uniform vec4 mask_wh;\n"
+ "vec4 get_mask()\n"
+ "{\n"
+ " if (mask_repeat_mode < RepeatFix) \n"
+ " return vec4(texture2D(mask_sampler, mask_texture).rgb, 1);\n"
+ " else \n"
+ " return rel_sampler(mask_sampler, mask_texture,\n"
+ " mask_wh, mask_repeat_mode, 1);\n"
+ "}\n";
+ const char *in_source_only =
+ GLAMOR_DEFAULT_PRECISION
+ "void main()\n"
+ "{\n"
+ " gl_FragColor = get_source();\n"
+ "}\n";
+ const char *in_normal =
+ GLAMOR_DEFAULT_PRECISION
+ "void main()\n"
+ "{\n"
+ " gl_FragColor = get_source() * get_mask().a;\n"
+ "}\n";
+ const char *in_ca_source =
+ GLAMOR_DEFAULT_PRECISION
+ "void main()\n"
+ "{\n"
+ " gl_FragColor = get_source() * get_mask();\n"
+ "}\n";
+ const char *in_ca_alpha =
+ GLAMOR_DEFAULT_PRECISION
+ "void main()\n"
+ "{\n"
+ " gl_FragColor = get_source().a * get_mask();\n"
+ "}\n";
+ char *source;
+ const char *source_fetch;
+ const char *mask_fetch = "";
+ const char *in;
+ GLuint prog;
+
+ switch (key->source) {
+ case SHADER_SOURCE_SOLID:
+ source_fetch = source_solid_fetch;
+ break;
+ case SHADER_SOURCE_TEXTURE_ALPHA:
+ source_fetch = source_alpha_pixmap_fetch;
+ break;
+ case SHADER_SOURCE_TEXTURE:
+ source_fetch = source_pixmap_fetch;
+ break;
+ default:
+ FatalError("Bad composite shader source");
+ }
+
+ switch (key->mask) {
+ case SHADER_MASK_NONE:
+ break;
+ case SHADER_MASK_SOLID:
+ mask_fetch = mask_solid_fetch;
+ break;
+ case SHADER_MASK_TEXTURE_ALPHA:
+ mask_fetch = mask_alpha_pixmap_fetch;
+ break;
+ case SHADER_MASK_TEXTURE:
+ mask_fetch = mask_pixmap_fetch;
+ break;
+ default:
+ FatalError("Bad composite shader mask");
+ }
+
+ switch (key->in) {
+ case SHADER_IN_SOURCE_ONLY:
+ in = in_source_only;
+ break;
+ case SHADER_IN_NORMAL:
+ in = in_normal;
+ break;
+ case SHADER_IN_CA_SOURCE:
+ in = in_ca_source;
+ break;
+ case SHADER_IN_CA_ALPHA:
+ in = in_ca_alpha;
+ break;
+ default:
+ FatalError("Bad composite IN type");
+ }
+
+ XNFasprintf(&source, "%s%s%s%s%s%s", repeat_define, relocate_texture,
+ rel_sampler, source_fetch, mask_fetch, in);
+
+ prog = glamor_compile_glsl_prog(dispatch, GL_FRAGMENT_SHADER, source);
+ free(source);
+
+ return prog;
}
static GLuint
-glamor_create_composite_vs(glamor_gl_dispatch * dispatch,
- struct shader_key *key)
+glamor_create_composite_vs(glamor_gl_dispatch *dispatch,
+ struct shader_key *key)
{
- const char *main_opening =
- "attribute vec4 v_position;\n"
- "attribute vec4 v_texcoord0;\n"
- "attribute vec4 v_texcoord1;\n"
- "varying vec2 source_texture;\n"
- "varying vec2 mask_texture;\n"
- "void main()\n" "{\n" " gl_Position = v_position;\n";
- const char *source_coords =
- " source_texture = v_texcoord0.xy;\n";
- const char *mask_coords = " mask_texture = v_texcoord1.xy;\n";
- const char *main_closing = "}\n";
- const char *source_coords_setup = "";
- const char *mask_coords_setup = "";
- char *source;
- GLuint prog;
-
- if (key->source != SHADER_SOURCE_SOLID)
- source_coords_setup = source_coords;
-
- if (key->mask != SHADER_MASK_NONE
- && key->mask != SHADER_MASK_SOLID)
- mask_coords_setup = mask_coords;
-
- XNFasprintf(&source,
- "%s%s%s%s",
- main_opening,
- source_coords_setup, mask_coords_setup, main_closing);
-
- prog =
- glamor_compile_glsl_prog(dispatch, GL_VERTEX_SHADER, source);
- free(source);
-
- return prog;
+ const char *main_opening =
+ "attribute vec4 v_position;\n"
+ "attribute vec4 v_texcoord0;\n"
+ "attribute vec4 v_texcoord1;\n"
+ "varying vec2 source_texture;\n"
+ "varying vec2 mask_texture;\n"
+ "void main()\n"
+ "{\n"
+ " gl_Position = v_position;\n";
+ const char *source_coords = " source_texture = v_texcoord0.xy;\n";
+ const char *mask_coords = " mask_texture = v_texcoord1.xy;\n";
+ const char *main_closing = "}\n";
+ const char *source_coords_setup = "";
+ const char *mask_coords_setup = "";
+ char *source;
+ GLuint prog;
+
+ if (key->source != SHADER_SOURCE_SOLID)
+ source_coords_setup = source_coords;
+
+ if (key->mask != SHADER_MASK_NONE && key->mask != SHADER_MASK_SOLID)
+ mask_coords_setup = mask_coords;
+
+ XNFasprintf(&source,
+ "%s%s%s%s",
+ main_opening,
+ source_coords_setup, mask_coords_setup, main_closing);
+
+ prog = glamor_compile_glsl_prog(dispatch, GL_VERTEX_SHADER, source);
+ free(source);
+
+ return prog;
}
static void
glamor_create_composite_shader(ScreenPtr screen, struct shader_key *key,
- glamor_composite_shader * shader)
+ glamor_composite_shader *shader)
{
- GLuint vs, fs, prog;
- GLint source_sampler_uniform_location,
- mask_sampler_uniform_location;
- glamor_screen_private *glamor_priv = glamor_get_screen_private(screen);
- glamor_gl_dispatch *dispatch;
-
- dispatch = glamor_get_dispatch(glamor_priv);
- vs = glamor_create_composite_vs(dispatch, key);
- if (vs == 0)
- goto out;
- fs = glamor_create_composite_fs(dispatch, key);
- if (fs == 0)
- goto out;
-
- prog = dispatch->glCreateProgram();
- dispatch->glAttachShader(prog, vs);
- dispatch->glAttachShader(prog, fs);
-
- dispatch->glBindAttribLocation(prog, GLAMOR_VERTEX_POS,
- "v_position");
- dispatch->glBindAttribLocation(prog, GLAMOR_VERTEX_SOURCE,
- "v_texcoord0");
- dispatch->glBindAttribLocation(prog, GLAMOR_VERTEX_MASK,
- "v_texcoord1");
-
- glamor_link_glsl_prog(dispatch, prog);
-
- shader->prog = prog;
-
- dispatch->glUseProgram(prog);
-
- if (key->source == SHADER_SOURCE_SOLID) {
- shader->source_uniform_location =
- dispatch->glGetUniformLocation(prog, "source");
- } else {
- source_sampler_uniform_location =
- dispatch->glGetUniformLocation(prog, "source_sampler");
- dispatch->glUniform1i(source_sampler_uniform_location, 0);
- shader->source_wh = dispatch->glGetUniformLocation(prog, "source_wh");
- shader->source_repeat_mode = dispatch->glGetUniformLocation(prog, "source_repeat_mode");
- }
-
- if (key->mask != SHADER_MASK_NONE) {
- if (key->mask == SHADER_MASK_SOLID) {
- shader->mask_uniform_location =
- dispatch->glGetUniformLocation(prog, "mask");
- } else {
- mask_sampler_uniform_location =
- dispatch->glGetUniformLocation(prog,
- "mask_sampler");
- dispatch->glUniform1i
- (mask_sampler_uniform_location, 1);
- shader->mask_wh = dispatch->glGetUniformLocation(prog, "mask_wh");
- shader->mask_repeat_mode = dispatch->glGetUniformLocation(prog, "mask_repeat_mode");
- }
- }
-
-out:
- glamor_put_dispatch(glamor_priv);
+ GLuint vs, fs, prog;
+ GLint source_sampler_uniform_location, mask_sampler_uniform_location;
+ glamor_screen_private *glamor_priv = glamor_get_screen_private(screen);
+ glamor_gl_dispatch *dispatch;
+
+ dispatch = glamor_get_dispatch(glamor_priv);
+ vs = glamor_create_composite_vs(dispatch, key);
+ if (vs == 0)
+ goto out;
+ fs = glamor_create_composite_fs(dispatch, key);
+ if (fs == 0)
+ goto out;
+
+ prog = dispatch->glCreateProgram();
+ dispatch->glAttachShader(prog, vs);
+ dispatch->glAttachShader(prog, fs);
+
+ dispatch->glBindAttribLocation(prog, GLAMOR_VERTEX_POS, "v_position");
+ dispatch->glBindAttribLocation(prog, GLAMOR_VERTEX_SOURCE, "v_texcoord0");
+ dispatch->glBindAttribLocation(prog, GLAMOR_VERTEX_MASK, "v_texcoord1");
+
+ glamor_link_glsl_prog(dispatch, prog);
+
+ shader->prog = prog;
+
+ dispatch->glUseProgram(prog);
+
+ if (key->source == SHADER_SOURCE_SOLID) {
+ shader->source_uniform_location =
+ dispatch->glGetUniformLocation(prog, "source");
+ }
+ else {
+ source_sampler_uniform_location =
+ dispatch->glGetUniformLocation(prog, "source_sampler");
+ dispatch->glUniform1i(source_sampler_uniform_location, 0);
+ shader->source_wh = dispatch->glGetUniformLocation(prog, "source_wh");
+ shader->source_repeat_mode =
+ dispatch->glGetUniformLocation(prog, "source_repeat_mode");
+ }
+
+ if (key->mask != SHADER_MASK_NONE) {
+ if (key->mask == SHADER_MASK_SOLID) {
+ shader->mask_uniform_location =
+ dispatch->glGetUniformLocation(prog, "mask");
+ }
+ else {
+ mask_sampler_uniform_location =
+ dispatch->glGetUniformLocation(prog, "mask_sampler");
+ dispatch->glUniform1i(mask_sampler_uniform_location, 1);
+ shader->mask_wh = dispatch->glGetUniformLocation(prog, "mask_wh");
+ shader->mask_repeat_mode =
+ dispatch->glGetUniformLocation(prog, "mask_repeat_mode");
+ }
+ }
+
+ out:
+ glamor_put_dispatch(glamor_priv);
}
static glamor_composite_shader *
glamor_lookup_composite_shader(ScreenPtr screen, struct
- shader_key
- *key)
+ shader_key
+ *key)
{
- glamor_screen_private *glamor_priv =
- glamor_get_screen_private(screen);
- glamor_composite_shader *shader;
+ glamor_screen_private *glamor_priv = glamor_get_screen_private(screen);
+ glamor_composite_shader *shader;
- shader =
- &glamor_priv->composite_shader[key->source][key->
- mask][key->in];
- if (shader->prog == 0)
- glamor_create_composite_shader(screen, key, shader);
+ shader = &glamor_priv->composite_shader[key->source][key->mask][key->in];
+ if (shader->prog == 0)
+ glamor_create_composite_shader(screen, key, shader);
- return shader;
+ return shader;
}
static void
glamor_init_eb(unsigned short *eb, int vert_cnt)
{
- int i, j;
- for(i = 0, j = 0; j < vert_cnt; i += 6, j += 4)
- {
- eb[i] = j;
- eb[i + 1] = j + 1;
- eb[i + 2] = j + 2;
- eb[i + 3] = j;
- eb[i + 4] = j + 2;
- eb[i + 5] = j + 3;
- }
+ int i, j;
+
+ for (i = 0, j = 0; j < vert_cnt; i += 6, j += 4) {
+ eb[i] = j;
+ eb[i + 1] = j + 1;
+ eb[i + 2] = j + 2;
+ eb[i + 3] = j;
+ eb[i + 4] = j + 2;
+ eb[i + 5] = j + 3;
+ }
}
void
glamor_init_composite_shaders(ScreenPtr screen)
{
- glamor_screen_private *glamor_priv;
- glamor_gl_dispatch *dispatch;
- unsigned short *eb;
- float *vb = NULL;
- int eb_size;
-
- glamor_priv = glamor_get_screen_private(screen);
- dispatch = glamor_get_dispatch(glamor_priv);
- dispatch->glGenBuffers(1, &glamor_priv->vbo);
- dispatch->glGenBuffers(1, &glamor_priv->ebo);
- dispatch->glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, glamor_priv->ebo);
-
- eb_size = GLAMOR_COMPOSITE_VBO_VERT_CNT * sizeof(short) * 2;
-
- if (glamor_priv->gl_flavor == GLAMOR_GL_DESKTOP) {
- dispatch->glBufferData(GL_ELEMENT_ARRAY_BUFFER,
- eb_size,
- NULL, GL_STATIC_DRAW);
- eb = dispatch->glMapBuffer(GL_ELEMENT_ARRAY_BUFFER, GL_WRITE_ONLY);
- }
- else {
- vb = malloc(GLAMOR_COMPOSITE_VBO_VERT_CNT * sizeof(float) * 2);
- if (vb == NULL)
- FatalError("Failed to allocate vb memory.\n");
- eb = malloc(eb_size);
- }
-
- if (eb == NULL)
- FatalError("fatal error, fail to get element buffer. GL context may be not created correctly.\n");
- glamor_init_eb(eb, GLAMOR_COMPOSITE_VBO_VERT_CNT);
-
- if (glamor_priv->gl_flavor == GLAMOR_GL_DESKTOP) {
- dispatch->glUnmapBuffer(GL_ELEMENT_ARRAY_BUFFER);
- dispatch->glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, 0);
- } else {
- dispatch->glBufferData(GL_ELEMENT_ARRAY_BUFFER,
- eb_size,
- eb, GL_STATIC_DRAW);
- dispatch->glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, 0);
-
- dispatch->glBindBuffer(GL_ARRAY_BUFFER, glamor_priv->vbo);
- dispatch->glBufferData(GL_ARRAY_BUFFER,
- GLAMOR_COMPOSITE_VBO_VERT_CNT * sizeof(float) * 2,
- NULL, GL_DYNAMIC_DRAW);
- dispatch->glBindBuffer(GL_ARRAY_BUFFER, 0);
-
- free(eb);
- glamor_priv->vb = (char*)vb;
- }
-
- glamor_put_dispatch(glamor_priv);
+ glamor_screen_private *glamor_priv;
+ glamor_gl_dispatch *dispatch;
+ unsigned short *eb;
+ float *vb = NULL;
+ int eb_size;
+
+ glamor_priv = glamor_get_screen_private(screen);
+ dispatch = glamor_get_dispatch(glamor_priv);
+ dispatch->glGenBuffers(1, &glamor_priv->vbo);
+ dispatch->glGenBuffers(1, &glamor_priv->ebo);
+ dispatch->glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, glamor_priv->ebo);
+
+ eb_size = GLAMOR_COMPOSITE_VBO_VERT_CNT * sizeof(short) * 2;
+
+ if (glamor_priv->gl_flavor == GLAMOR_GL_DESKTOP) {
+ dispatch->glBufferData(GL_ELEMENT_ARRAY_BUFFER,
+ eb_size, NULL, GL_STATIC_DRAW);
+ eb = dispatch->glMapBuffer(GL_ELEMENT_ARRAY_BUFFER, GL_WRITE_ONLY);
+ }
+ else {
+ vb = malloc(GLAMOR_COMPOSITE_VBO_VERT_CNT * sizeof(float) * 2);
+ if (vb == NULL)
+ FatalError("Failed to allocate vb memory.\n");
+ eb = malloc(eb_size);
+ }
+
+ if (eb == NULL)
+ FatalError
+ ("fatal error, fail to get element buffer. GL context may be not created correctly.\n");
+ glamor_init_eb(eb, GLAMOR_COMPOSITE_VBO_VERT_CNT);
+
+ if (glamor_priv->gl_flavor == GLAMOR_GL_DESKTOP) {
+ dispatch->glUnmapBuffer(GL_ELEMENT_ARRAY_BUFFER);
+ dispatch->glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, 0);
+ }
+ else {
+ dispatch->glBufferData(GL_ELEMENT_ARRAY_BUFFER,
+ eb_size, eb, GL_STATIC_DRAW);
+ dispatch->glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, 0);
+
+ dispatch->glBindBuffer(GL_ARRAY_BUFFER, glamor_priv->vbo);
+ dispatch->glBufferData(GL_ARRAY_BUFFER,
+ GLAMOR_COMPOSITE_VBO_VERT_CNT * sizeof(float) *
+ 2, NULL, GL_DYNAMIC_DRAW);
+ dispatch->glBindBuffer(GL_ARRAY_BUFFER, 0);
+
+ free(eb);
+ glamor_priv->vb = (char *) vb;
+ }
+
+ glamor_put_dispatch(glamor_priv);
}
void
glamor_fini_composite_shaders(ScreenPtr screen)
{
- glamor_screen_private *glamor_priv;
- glamor_gl_dispatch *dispatch;
- glamor_composite_shader *shader;
- int i,j,k;
-
- glamor_priv = glamor_get_screen_private(screen);
- dispatch = glamor_get_dispatch(glamor_priv);
- dispatch->glDeleteBuffers(1, &glamor_priv->vbo);
- dispatch->glDeleteBuffers(1, &glamor_priv->ebo);
-
- for(i = 0; i < SHADER_SOURCE_COUNT; i++)
- for(j = 0; j < SHADER_MASK_COUNT; j++)
- for(k = 0; k < SHADER_IN_COUNT; k++)
- {
- shader = &glamor_priv->composite_shader[i][j][k];
- if (shader->prog)
- dispatch->glDeleteProgram(shader->prog);
- }
- if (glamor_priv->gl_flavor != GLAMOR_GL_DESKTOP
- && glamor_priv->vb)
- free(glamor_priv->vb);
-
- glamor_put_dispatch(glamor_priv);
+ glamor_screen_private *glamor_priv;
+ glamor_gl_dispatch *dispatch;
+ glamor_composite_shader *shader;
+ int i, j, k;
+
+ glamor_priv = glamor_get_screen_private(screen);
+ dispatch = glamor_get_dispatch(glamor_priv);
+ dispatch->glDeleteBuffers(1, &glamor_priv->vbo);
+ dispatch->glDeleteBuffers(1, &glamor_priv->ebo);
+
+ for (i = 0; i < SHADER_SOURCE_COUNT; i++)
+ for (j = 0; j < SHADER_MASK_COUNT; j++)
+ for (k = 0; k < SHADER_IN_COUNT; k++) {
+ shader = &glamor_priv->composite_shader[i][j][k];
+ if (shader->prog)
+ dispatch->glDeleteProgram(shader->prog);
+ }
+ if (glamor_priv->gl_flavor != GLAMOR_GL_DESKTOP && glamor_priv->vb)
+ free(glamor_priv->vb);
+
+ glamor_put_dispatch(glamor_priv);
}
static Bool
glamor_set_composite_op(ScreenPtr screen,
- CARD8 op, struct blendinfo *op_info_result,
- PicturePtr dest, PicturePtr mask)
+ CARD8 op, struct blendinfo *op_info_result,
+ PicturePtr dest, PicturePtr mask)
{
- GLenum source_blend, dest_blend;
- struct blendinfo *op_info;
-
- if (op >= ARRAY_SIZE(composite_op_info)) {
- glamor_fallback("unsupported render op %d \n", op);
- return GL_FALSE;
- }
- op_info = &composite_op_info[op];
-
- source_blend = op_info->source_blend;
- dest_blend = op_info->dest_blend;
-
- /* If there's no dst alpha channel, adjust the blend op so that we'll treat
- * it as always 1.
- */
- if (PICT_FORMAT_A(dest->format) == 0 && op_info->dest_alpha) {
- if (source_blend == GL_DST_ALPHA)
- source_blend = GL_ONE;
- else if (source_blend == GL_ONE_MINUS_DST_ALPHA)
- source_blend = GL_ZERO;
- }
-
- /* Set up the source alpha value for blending in component alpha mode. */
- if (mask && mask->componentAlpha
- && PICT_FORMAT_RGB(mask->format) != 0 && op_info->source_alpha)
- {
- if (dest_blend == GL_SRC_ALPHA)
- dest_blend = GL_SRC_COLOR;
- else if (dest_blend == GL_ONE_MINUS_SRC_ALPHA)
- dest_blend = GL_ONE_MINUS_SRC_COLOR;
- }
-
- op_info_result->source_blend = source_blend;
- op_info_result->dest_blend = dest_blend;
- op_info_result->source_alpha = op_info->source_alpha;
- op_info_result->dest_alpha = op_info->dest_alpha;
-
- return TRUE;
+ GLenum source_blend, dest_blend;
+ struct blendinfo *op_info;
+
+ if (op >= ARRAY_SIZE(composite_op_info)) {
+ glamor_fallback("unsupported render op %d \n", op);
+ return GL_FALSE;
+ }
+ op_info = &composite_op_info[op];
+
+ source_blend = op_info->source_blend;
+ dest_blend = op_info->dest_blend;
+
+ /* If there's no dst alpha channel, adjust the blend op so that we'll treat
+ * it as always 1.
+ */
+ if (PICT_FORMAT_A(dest->format) == 0 && op_info->dest_alpha) {
+ if (source_blend == GL_DST_ALPHA)
+ source_blend = GL_ONE;
+ else if (source_blend == GL_ONE_MINUS_DST_ALPHA)
+ source_blend = GL_ZERO;
+ }
+
+ /* Set up the source alpha value for blending in component alpha mode. */
+ if (mask && mask->componentAlpha
+ && PICT_FORMAT_RGB(mask->format) != 0 && op_info->source_alpha) {
+ if (dest_blend == GL_SRC_ALPHA)
+ dest_blend = GL_SRC_COLOR;
+ else if (dest_blend == GL_ONE_MINUS_SRC_ALPHA)
+ dest_blend = GL_ONE_MINUS_SRC_COLOR;
+ }
+
+ op_info_result->source_blend = source_blend;
+ op_info_result->dest_blend = dest_blend;
+ op_info_result->source_alpha = op_info->source_alpha;
+ op_info_result->dest_alpha = op_info->dest_alpha;
+
+ return TRUE;
}
static void
glamor_set_composite_texture(glamor_screen_private *glamor_priv, int unit,
- PicturePtr picture,
- glamor_pixmap_private * pixmap_priv,
- GLuint wh_location, GLuint repeat_location)
+ PicturePtr picture,
+ glamor_pixmap_private *pixmap_priv,
+ GLuint wh_location, GLuint repeat_location)
{
- glamor_gl_dispatch *dispatch;
- float wh[4];
- int repeat_type;
-
- dispatch = glamor_get_dispatch(glamor_priv);
- dispatch->glActiveTexture(GL_TEXTURE0 + unit);
- dispatch->glBindTexture(GL_TEXTURE_2D, pixmap_priv->base.fbo->tex);
- repeat_type = picture->repeatType;
- switch (picture->repeatType) {
- case RepeatNone:
+ glamor_gl_dispatch *dispatch;
+ float wh[4];
+ int repeat_type;
+
+ dispatch = glamor_get_dispatch(glamor_priv);
+ dispatch->glActiveTexture(GL_TEXTURE0 + unit);
+ dispatch->glBindTexture(GL_TEXTURE_2D, pixmap_priv->base.fbo->tex);
+ repeat_type = picture->repeatType;
+ switch (picture->repeatType) {
+ case RepeatNone:
#ifndef GLAMOR_GLES2
- /* XXX GLES2 doesn't support GL_CLAMP_TO_BORDER. */
- dispatch->glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S,
- GL_CLAMP_TO_BORDER);
- dispatch->glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T,
- GL_CLAMP_TO_BORDER);
+ /* XXX GLES2 doesn't support GL_CLAMP_TO_BORDER. */
+ dispatch->glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S,
+ GL_CLAMP_TO_BORDER);
+ dispatch->glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T,
+ GL_CLAMP_TO_BORDER);
#else
- dispatch->glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S,
- GL_CLAMP_TO_EDGE);
- dispatch->glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T,
- GL_CLAMP_TO_EDGE);
+ dispatch->glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S,
+ GL_CLAMP_TO_EDGE);
+ dispatch->glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T,
+ GL_CLAMP_TO_EDGE);
#endif
- break;
- case RepeatNormal:
- dispatch->glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S,
- GL_REPEAT);
- dispatch->glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T,
- GL_REPEAT);
- break;
- case RepeatPad:
- dispatch->glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S,
- GL_CLAMP_TO_EDGE);
- dispatch->glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T,
- GL_CLAMP_TO_EDGE);
- break;
- case RepeatReflect:
- dispatch->glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S,
- GL_MIRRORED_REPEAT);
- dispatch->glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T,
- GL_MIRRORED_REPEAT);
- break;
- }
-
- switch (picture->filter) {
- default:
- case PictFilterFast:
- case PictFilterNearest:
- dispatch->glTexParameteri(GL_TEXTURE_2D,
- GL_TEXTURE_MIN_FILTER,
- GL_NEAREST);
- dispatch->glTexParameteri(GL_TEXTURE_2D,
- GL_TEXTURE_MAG_FILTER,
- GL_NEAREST);
- break;
- case PictFilterGood:
- case PictFilterBest:
- case PictFilterBilinear:
- dispatch->glTexParameteri(GL_TEXTURE_2D,
- GL_TEXTURE_MIN_FILTER,
- GL_LINEAR);
- dispatch->glTexParameteri(GL_TEXTURE_2D,
- GL_TEXTURE_MAG_FILTER,
- GL_LINEAR);
- break;
- }
+ break;
+ case RepeatNormal:
+ dispatch->glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_REPEAT);
+ dispatch->glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_REPEAT);
+ break;
+ case RepeatPad:
+ dispatch->glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S,
+ GL_CLAMP_TO_EDGE);
+ dispatch->glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T,
+ GL_CLAMP_TO_EDGE);
+ break;
+ case RepeatReflect:
+ dispatch->glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S,
+ GL_MIRRORED_REPEAT);
+ dispatch->glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T,
+ GL_MIRRORED_REPEAT);
+ break;
+ }
+
+ switch (picture->filter) {
+ default:
+ case PictFilterFast:
+ case PictFilterNearest:
+ dispatch->glTexParameteri(GL_TEXTURE_2D,
+ GL_TEXTURE_MIN_FILTER, GL_NEAREST);
+ dispatch->glTexParameteri(GL_TEXTURE_2D,
+ GL_TEXTURE_MAG_FILTER, GL_NEAREST);
+ break;
+ case PictFilterGood:
+ case PictFilterBest:
+ case PictFilterBilinear:
+ dispatch->glTexParameteri(GL_TEXTURE_2D,
+ GL_TEXTURE_MIN_FILTER, GL_LINEAR);
+ dispatch->glTexParameteri(GL_TEXTURE_2D,
+ GL_TEXTURE_MAG_FILTER, GL_LINEAR);
+ break;
+ }
#ifndef GLAMOR_GLES2
- dispatch->glEnable(GL_TEXTURE_2D);
+ dispatch->glEnable(GL_TEXTURE_2D);
#endif
- /*
- * GLES2 doesn't support RepeatNone. We need to fix it anyway.
- *
- **/
- if (repeat_type != RepeatNone)
- repeat_type += RepeatFix;
- else if (glamor_priv->gl_flavor == GLAMOR_GL_ES2
- || pixmap_priv->type == GLAMOR_TEXTURE_LARGE) {
- if (picture->transform
- || (GLAMOR_PIXMAP_FBO_NOT_EAXCT_SIZE(pixmap_priv)))
- repeat_type += RepeatFix;
- }
- if (repeat_type >= RepeatFix) {
- glamor_pixmap_fbo_fix_wh_ratio(wh, pixmap_priv);
- if ((wh[0] != 1.0 || wh[1] != 1.0 )
- || (glamor_priv->gl_flavor == GLAMOR_GL_ES2
- && repeat_type == RepeatFix))
- dispatch->glUniform4fv(wh_location, 1, wh);
- else
- repeat_type -= RepeatFix;
- }
- dispatch->glUniform1i(repeat_location, repeat_type);
- glamor_put_dispatch(glamor_priv);
+ /*
+ * GLES2 doesn't support RepeatNone. We need to fix it anyway.
+ *
+ **/
+ if (repeat_type != RepeatNone)
+ repeat_type += RepeatFix;
+ else if (glamor_priv->gl_flavor == GLAMOR_GL_ES2
+ || pixmap_priv->type == GLAMOR_TEXTURE_LARGE) {
+ if (picture->transform
+ || (GLAMOR_PIXMAP_FBO_NOT_EAXCT_SIZE(pixmap_priv)))
+ repeat_type += RepeatFix;
+ }
+ if (repeat_type >= RepeatFix) {
+ glamor_pixmap_fbo_fix_wh_ratio(wh, pixmap_priv);
+ if ((wh[0] != 1.0 || wh[1] != 1.0)
+ || (glamor_priv->gl_flavor == GLAMOR_GL_ES2
+ && repeat_type == RepeatFix))
+ dispatch->glUniform4fv(wh_location, 1, wh);
+ else
+ repeat_type -= RepeatFix;
+ }
+ dispatch->glUniform1i(repeat_location, repeat_type);
+ glamor_put_dispatch(glamor_priv);
}
static void
-glamor_set_composite_solid(glamor_gl_dispatch * dispatch, float *color,
- GLint uniform_location)
+glamor_set_composite_solid(glamor_gl_dispatch *dispatch, float *color,
+ GLint uniform_location)
{
- dispatch->glUniform4fv(uniform_location, 1, color);
+ dispatch->glUniform4fv(uniform_location, 1, color);
}
static int
compatible_formats(CARD8 op, PicturePtr dst, PicturePtr src)
{
- if (op == PictOpSrc) {
- if (src->format == dst->format)
- return 1;
-
- if (src->format == PICT_a8r8g8b8
- && dst->format == PICT_x8r8g8b8)
- return 1;
-
- if (src->format == PICT_a8b8g8r8
- && dst->format == PICT_x8b8g8r8)
- return 1;
- } else if (op == PictOpOver) {
- if (src->alphaMap || dst->alphaMap)
- return 0;
-
- if (src->format != dst->format)
- return 0;
-
- if (src->format == PICT_x8r8g8b8
- || src->format == PICT_x8b8g8r8)
- return 1;
- }
-
- return 0;
+ if (op == PictOpSrc) {
+ if (src->format == dst->format)
+ return 1;
+
+ if (src->format == PICT_a8r8g8b8 && dst->format == PICT_x8r8g8b8)
+ return 1;
+
+ if (src->format == PICT_a8b8g8r8 && dst->format == PICT_x8b8g8r8)
+ return 1;
+ }
+ else if (op == PictOpOver) {
+ if (src->alphaMap || dst->alphaMap)
+ return 0;
+
+ if (src->format != dst->format)
+ return 0;
+
+ if (src->format == PICT_x8r8g8b8 || src->format == PICT_x8b8g8r8)
+ return 1;
+ }
+
+ return 0;
}
static char
glamor_get_picture_location(PicturePtr picture)
{
- if (picture == NULL)
- return ' ';
-
- if (picture->pDrawable == NULL) {
- switch (picture->pSourcePict->type) {
- case SourcePictTypeSolidFill:
- return 'c';
- case SourcePictTypeLinear:
- return 'l';
- case SourcePictTypeRadial:
- return 'r';
- default:
- return '?';
- }
- }
- return glamor_get_drawable_location(picture->pDrawable);
+ if (picture == NULL)
+ return ' ';
+
+ if (picture->pDrawable == NULL) {
+ switch (picture->pSourcePict->type) {
+ case SourcePictTypeSolidFill:
+ return 'c';
+ case SourcePictTypeLinear:
+ return 'l';
+ case SourcePictTypeRadial:
+ return 'r';
+ default:
+ return '?';
+ }
+ }
+ return glamor_get_drawable_location(picture->pDrawable);
}
static Bool
glamor_composite_with_copy(CARD8 op,
- PicturePtr source,
- PicturePtr dest,
- INT16 x_source,
- INT16 y_source,
- INT16 x_dest,
- INT16 y_dest,
- RegionPtr region)
+ PicturePtr source,
+ PicturePtr dest,
+ INT16 x_source,
+ INT16 y_source,
+ INT16 x_dest, INT16 y_dest, RegionPtr region)
{
- int ret = FALSE;
- if (!source->pDrawable)
- return FALSE;
-
- if (!compatible_formats(op, dest, source))
- return FALSE;
-
- if (source->repeat || source->transform) {
- return FALSE;
- }
-
- x_dest += dest->pDrawable->x;
- y_dest += dest->pDrawable->y;
- x_source += source->pDrawable->x;
- y_source += source->pDrawable->y;
- if (PICT_FORMAT_A(source->format) == 0) {
- /* Fallback if we sample outside the source so that we
- * swizzle the correct clear color for out-of-bounds texels.
- */
- if (region->extents.x1 + x_source - x_dest < 0)
- goto cleanup_region;
- if (region->extents.x2 + x_source - x_dest > source->pDrawable->width)
- goto cleanup_region;
-
- if (region->extents.y1 + y_source - y_dest < 0)
- goto cleanup_region;
- if (region->extents.y2 + y_source - y_dest > source->pDrawable->height)
- goto cleanup_region;
- }
- ret = glamor_copy_n_to_n_nf(source->pDrawable,
- dest->pDrawable, NULL,
- RegionRects(region), RegionNumRects(region),
- x_source - x_dest, y_source - y_dest,
- FALSE, FALSE, 0, NULL);
-cleanup_region:
- return ret;
+ int ret = FALSE;
+
+ if (!source->pDrawable)
+ return FALSE;
+
+ if (!compatible_formats(op, dest, source))
+ return FALSE;
+
+ if (source->repeat || source->transform) {
+ return FALSE;
+ }
+
+ x_dest += dest->pDrawable->x;
+ y_dest += dest->pDrawable->y;
+ x_source += source->pDrawable->x;
+ y_source += source->pDrawable->y;
+ if (PICT_FORMAT_A(source->format) == 0) {
+ /* Fallback if we sample outside the source so that we
+ * swizzle the correct clear color for out-of-bounds texels.
+ */
+ if (region->extents.x1 + x_source - x_dest < 0)
+ goto cleanup_region;
+ if (region->extents.x2 + x_source - x_dest > source->pDrawable->width)
+ goto cleanup_region;
+
+ if (region->extents.y1 + y_source - y_dest < 0)
+ goto cleanup_region;
+ if (region->extents.y2 + y_source - y_dest > source->pDrawable->height)
+ goto cleanup_region;
+ }
+ ret = glamor_copy_n_to_n_nf(source->pDrawable,
+ dest->pDrawable, NULL,
+ RegionRects(region), RegionNumRects(region),
+ x_source - x_dest, y_source - y_dest,
+ FALSE, FALSE, 0, NULL);
+ cleanup_region:
+ return ret;
}
void
glamor_setup_composite_vbo(ScreenPtr screen, int n_verts)
{
- glamor_screen_private *glamor_priv =
- glamor_get_screen_private(screen);
- glamor_gl_dispatch *dispatch;
- int vert_size;
-
- glamor_priv->render_nr_verts = 0;
- glamor_priv->vb_stride = 2 * sizeof(float);
- if (glamor_priv->has_source_coords)
- glamor_priv->vb_stride += 2 * sizeof(float);
- if (glamor_priv->has_mask_coords)
- glamor_priv->vb_stride += 2 * sizeof(float);
-
- vert_size = n_verts * glamor_priv->vb_stride;
-
- dispatch = glamor_get_dispatch(glamor_priv);
- dispatch->glBindBuffer(GL_ARRAY_BUFFER, glamor_priv->vbo);
- if (glamor_priv->gl_flavor == GLAMOR_GL_DESKTOP) {
- if (glamor_priv->vbo_size < (glamor_priv->vbo_offset + vert_size)) {
- glamor_priv->vbo_size = GLAMOR_COMPOSITE_VBO_VERT_CNT *
- glamor_priv->vb_stride;
- glamor_priv->vbo_offset = 0;
- dispatch->glBufferData(GL_ARRAY_BUFFER,
- glamor_priv->vbo_size,
- NULL, GL_STREAM_DRAW);
- }
-
- glamor_priv->vb = dispatch->glMapBufferRange(GL_ARRAY_BUFFER,
- glamor_priv->vbo_offset,
- vert_size,
- GL_MAP_WRITE_BIT | GL_MAP_UNSYNCHRONIZED_BIT);
- assert(glamor_priv->vb != NULL);
- glamor_priv->vb -= glamor_priv->vbo_offset;
- } else
- glamor_priv->vbo_offset = 0;
-
- dispatch->glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, glamor_priv->ebo);
-
- dispatch->glVertexAttribPointer(GLAMOR_VERTEX_POS, 2, GL_FLOAT,
- GL_FALSE, glamor_priv->vb_stride,
- (void *) ((long)
- glamor_priv->vbo_offset));
- dispatch->glEnableVertexAttribArray(GLAMOR_VERTEX_POS);
-
- if (glamor_priv->has_source_coords) {
- dispatch->glVertexAttribPointer(GLAMOR_VERTEX_SOURCE, 2,
- GL_FLOAT, GL_FALSE,
- glamor_priv->vb_stride,
- (void *) ((long)
- glamor_priv->vbo_offset
- +
- 2 *
- sizeof(float)));
- dispatch->glEnableVertexAttribArray(GLAMOR_VERTEX_SOURCE);
- }
-
- if (glamor_priv->has_mask_coords) {
- dispatch->glVertexAttribPointer(GLAMOR_VERTEX_MASK, 2,
- GL_FLOAT, GL_FALSE,
- glamor_priv->vb_stride,
- (void *) ((long)
- glamor_priv->vbo_offset
- +
- (glamor_priv->has_source_coords
- ? 4 : 2) *
- sizeof(float)));
- dispatch->glEnableVertexAttribArray(GLAMOR_VERTEX_MASK);
- }
- glamor_put_dispatch(glamor_priv);
+ glamor_screen_private *glamor_priv = glamor_get_screen_private(screen);
+ glamor_gl_dispatch *dispatch;
+ int vert_size;
+
+ glamor_priv->render_nr_verts = 0;
+ glamor_priv->vb_stride = 2 * sizeof(float);
+ if (glamor_priv->has_source_coords)
+ glamor_priv->vb_stride += 2 * sizeof(float);
+ if (glamor_priv->has_mask_coords)
+ glamor_priv->vb_stride += 2 * sizeof(float);
+
+ vert_size = n_verts * glamor_priv->vb_stride;
+
+ dispatch = glamor_get_dispatch(glamor_priv);
+ dispatch->glBindBuffer(GL_ARRAY_BUFFER, glamor_priv->vbo);
+ if (glamor_priv->gl_flavor == GLAMOR_GL_DESKTOP) {
+ if (glamor_priv->vbo_size < (glamor_priv->vbo_offset + vert_size)) {
+ glamor_priv->vbo_size = GLAMOR_COMPOSITE_VBO_VERT_CNT *
+ glamor_priv->vb_stride;
+ glamor_priv->vbo_offset = 0;
+ dispatch->glBufferData(GL_ARRAY_BUFFER,
+ glamor_priv->vbo_size, NULL, GL_STREAM_DRAW);
+ }
+
+ glamor_priv->vb = dispatch->glMapBufferRange(GL_ARRAY_BUFFER,
+ glamor_priv->vbo_offset,
+ vert_size,
+ GL_MAP_WRITE_BIT |
+ GL_MAP_UNSYNCHRONIZED_BIT);
+ assert(glamor_priv->vb != NULL);
+ glamor_priv->vb -= glamor_priv->vbo_offset;
+ }
+ else
+ glamor_priv->vbo_offset = 0;
+
+ dispatch->glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, glamor_priv->ebo);
+
+ dispatch->glVertexAttribPointer(GLAMOR_VERTEX_POS, 2, GL_FLOAT,
+ GL_FALSE, glamor_priv->vb_stride,
+ (void *) ((long)
+ glamor_priv->vbo_offset));
+ dispatch->glEnableVertexAttribArray(GLAMOR_VERTEX_POS);
+
+ if (glamor_priv->has_source_coords) {
+ dispatch->glVertexAttribPointer(GLAMOR_VERTEX_SOURCE, 2,
+ GL_FLOAT, GL_FALSE,
+ glamor_priv->vb_stride, (void *) ((long)
+ glamor_priv->
+ vbo_offset
+ +
+ 2 *
+ sizeof
+ (float)));
+ dispatch->glEnableVertexAttribArray(GLAMOR_VERTEX_SOURCE);
+ }
+
+ if (glamor_priv->has_mask_coords) {
+ dispatch->glVertexAttribPointer(GLAMOR_VERTEX_MASK, 2,
+ GL_FLOAT, GL_FALSE,
+ glamor_priv->vb_stride, (void *) ((long)
+ glamor_priv->
+ vbo_offset
+ +
+ (glamor_priv->
+ has_source_coords
+ ? 4 :
+ 2) *
+ sizeof
+ (float)));
+ dispatch->glEnableVertexAttribArray(GLAMOR_VERTEX_MASK);
+ }
+ glamor_put_dispatch(glamor_priv);
}
void
glamor_emit_composite_vert(ScreenPtr screen,
- const float *src_coords,
- const float *mask_coords,
- const float *dst_coords, int i)
+ const float *src_coords,
+ const float *mask_coords,
+ const float *dst_coords, int i)
{
- glamor_screen_private *glamor_priv =
- glamor_get_screen_private(screen);
- float *vb = (float *) (glamor_priv->vb + glamor_priv->vbo_offset);
- int j = 0;
-
- vb[j++] = dst_coords[i * 2 + 0];
- vb[j++] = dst_coords[i * 2 + 1];
- if (glamor_priv->has_source_coords) {
- vb[j++] = src_coords[i * 2 + 0];
- vb[j++] = src_coords[i * 2 + 1];
- }
- if (glamor_priv->has_mask_coords) {
- vb[j++] = mask_coords[i * 2 + 0];
- vb[j++] = mask_coords[i * 2 + 1];
- }
-
- glamor_priv->render_nr_verts++;
- glamor_priv->vbo_offset += glamor_priv->vb_stride;
+ glamor_screen_private *glamor_priv = glamor_get_screen_private(screen);
+ float *vb = (float *) (glamor_priv->vb + glamor_priv->vbo_offset);
+ int j = 0;
+
+ vb[j++] = dst_coords[i * 2 + 0];
+ vb[j++] = dst_coords[i * 2 + 1];
+ if (glamor_priv->has_source_coords) {
+ vb[j++] = src_coords[i * 2 + 0];
+ vb[j++] = src_coords[i * 2 + 1];
+ }
+ if (glamor_priv->has_mask_coords) {
+ vb[j++] = mask_coords[i * 2 + 0];
+ vb[j++] = mask_coords[i * 2 + 1];
+ }
+
+ glamor_priv->render_nr_verts++;
+ glamor_priv->vbo_offset += glamor_priv->vb_stride;
}
-
-
static void
glamor_flush_composite_rects(ScreenPtr screen)
{
- glamor_screen_private *glamor_priv =
- glamor_get_screen_private(screen);
- glamor_gl_dispatch *dispatch;
+ glamor_screen_private *glamor_priv = glamor_get_screen_private(screen);
+ glamor_gl_dispatch *dispatch;
- dispatch = glamor_get_dispatch(glamor_priv);
- if (glamor_priv->gl_flavor == GLAMOR_GL_DESKTOP)
- dispatch->glUnmapBuffer(GL_ARRAY_BUFFER);
- else {
+ dispatch = glamor_get_dispatch(glamor_priv);
+ if (glamor_priv->gl_flavor == GLAMOR_GL_DESKTOP)
+ dispatch->glUnmapBuffer(GL_ARRAY_BUFFER);
+ else {
- dispatch->glBindBuffer(GL_ARRAY_BUFFER, glamor_priv->vbo);
- dispatch->glBufferData(GL_ARRAY_BUFFER,
- glamor_priv->vbo_offset,
- glamor_priv->vb, GL_DYNAMIC_DRAW);
- }
+ dispatch->glBindBuffer(GL_ARRAY_BUFFER, glamor_priv->vbo);
+ dispatch->glBufferData(GL_ARRAY_BUFFER,
+ glamor_priv->vbo_offset,
+ glamor_priv->vb, GL_DYNAMIC_DRAW);
+ }
- if (!glamor_priv->render_nr_verts)
- return;
+ if (!glamor_priv->render_nr_verts)
+ return;
#ifndef GLAMOR_GLES2
- dispatch->glDrawRangeElements(GL_TRIANGLES, 0, glamor_priv->render_nr_verts,
- (glamor_priv->render_nr_verts * 3) / 2,
- GL_UNSIGNED_SHORT, NULL);
+ dispatch->glDrawRangeElements(GL_TRIANGLES, 0, glamor_priv->render_nr_verts,
+ (glamor_priv->render_nr_verts * 3) / 2,
+ GL_UNSIGNED_SHORT, NULL);
#else
- dispatch->glDrawElements(GL_TRIANGLES, (glamor_priv->render_nr_verts * 3) / 2,
- GL_UNSIGNED_SHORT, NULL);
+ dispatch->glDrawElements(GL_TRIANGLES,
+ (glamor_priv->render_nr_verts * 3) / 2,
+ GL_UNSIGNED_SHORT, NULL);
#endif
- glamor_put_dispatch(glamor_priv);
+ glamor_put_dispatch(glamor_priv);
}
int pict_format_combine_tab[][3] = {
- {PICT_TYPE_ARGB, PICT_TYPE_A, PICT_TYPE_ARGB},
- {PICT_TYPE_ABGR, PICT_TYPE_A, PICT_TYPE_ABGR},
+ {PICT_TYPE_ARGB, PICT_TYPE_A, PICT_TYPE_ARGB},
+ {PICT_TYPE_ABGR, PICT_TYPE_A, PICT_TYPE_ABGR},
};
static Bool
combine_pict_format(PictFormatShort * des, const PictFormatShort src,
- const PictFormatShort mask, enum shader_in in_ca)
+ const PictFormatShort mask, enum shader_in in_ca)
{
- PictFormatShort new_vis;
- int src_type, mask_type, src_bpp, mask_bpp;
- int i;
- if (src == mask) {
- *des = src;
- return TRUE;
- }
- src_bpp = PICT_FORMAT_BPP(src);
- mask_bpp = PICT_FORMAT_BPP(mask);
-
- assert(src_bpp == mask_bpp);
-
- new_vis = PICT_FORMAT_VIS(src) | PICT_FORMAT_VIS(mask);
-
- switch (in_ca) {
- case SHADER_IN_SOURCE_ONLY:
- return TRUE;
- case SHADER_IN_NORMAL:
- src_type = PICT_FORMAT_TYPE(src);
- mask_type = PICT_TYPE_A;
- break;
- case SHADER_IN_CA_SOURCE:
- src_type = PICT_FORMAT_TYPE(src);
- mask_type = PICT_FORMAT_TYPE(mask);
- break;
- case SHADER_IN_CA_ALPHA:
- src_type = PICT_TYPE_A;
- mask_type = PICT_FORMAT_TYPE(mask);
- break;
- default:
- return FALSE;
- }
-
- if (src_type == mask_type) {
- *des = PICT_VISFORMAT(src_bpp, src_type, new_vis);
- return TRUE;
- }
-
- for (i = 0;
- i <
- sizeof(pict_format_combine_tab) /
- sizeof(pict_format_combine_tab[0]); i++) {
- if ((src_type == pict_format_combine_tab[i][0]
- && mask_type == pict_format_combine_tab[i][1])
- || (src_type == pict_format_combine_tab[i][1]
- && mask_type == pict_format_combine_tab[i][0])) {
- *des = PICT_VISFORMAT(src_bpp,
- pict_format_combine_tab[i]
- [2], new_vis);
- return TRUE;
- }
- }
- return FALSE;
+ PictFormatShort new_vis;
+ int src_type, mask_type, src_bpp;
+ int i;
+
+ if (src == mask) {
+ *des = src;
+ return TRUE;
+ }
+ src_bpp = PICT_FORMAT_BPP(src);
+
+ assert(src_bpp == PICT_FORMAT_BPP(mask));
+
+ new_vis = PICT_FORMAT_VIS(src) | PICT_FORMAT_VIS(mask);
+
+ switch (in_ca) {
+ case SHADER_IN_SOURCE_ONLY:
+ return TRUE;
+ case SHADER_IN_NORMAL:
+ src_type = PICT_FORMAT_TYPE(src);
+ mask_type = PICT_TYPE_A;
+ break;
+ case SHADER_IN_CA_SOURCE:
+ src_type = PICT_FORMAT_TYPE(src);
+ mask_type = PICT_FORMAT_TYPE(mask);
+ break;
+ case SHADER_IN_CA_ALPHA:
+ src_type = PICT_TYPE_A;
+ mask_type = PICT_FORMAT_TYPE(mask);
+ break;
+ default:
+ return FALSE;
+ }
+
+ if (src_type == mask_type) {
+ *des = PICT_VISFORMAT(src_bpp, src_type, new_vis);
+ return TRUE;
+ }
+
+ for (i = 0;
+ i <
+ sizeof(pict_format_combine_tab) /
+ sizeof(pict_format_combine_tab[0]); i++) {
+ if ((src_type == pict_format_combine_tab[i][0]
+ && mask_type == pict_format_combine_tab[i][1])
+ || (src_type == pict_format_combine_tab[i][1]
+ && mask_type == pict_format_combine_tab[i][0])) {
+ *des = PICT_VISFORMAT(src_bpp, pict_format_combine_tab[i]
+ [2], new_vis);
+ return TRUE;
+ }
+ }
+ return FALSE;
}
static void
glamor_set_normalize_tcoords_generic(glamor_pixmap_private *priv,
- int repeat_type,
- float *matrix,
- float xscale, float yscale,
- int x1, int y1, int x2, int y2,
- int yInverted, float *texcoords,
- int stride)
+ int repeat_type,
+ float *matrix,
+ float xscale, float yscale,
+ int x1, int y1, int x2, int y2,
+ int yInverted, float *texcoords,
+ int stride)
{
- if (!matrix && repeat_type == RepeatNone)
- glamor_set_normalize_tcoords_ext(priv, xscale, yscale,
- x1, y1,
- x2, y2,
- yInverted,
- texcoords, stride);
- else if (matrix && repeat_type == RepeatNone)
- glamor_set_transformed_normalize_tcoords_ext(priv, matrix, xscale,
- yscale, x1, y1,
- x2, y2,
- yInverted,
- texcoords, stride);
- else if (!matrix && repeat_type != RepeatNone)
- glamor_set_repeat_normalize_tcoords_ext(priv, repeat_type,
- xscale, yscale,
- x1, y1,
- x2, y2,
- yInverted,
- texcoords, stride);
- else if (matrix && repeat_type != RepeatNone)
- glamor_set_repeat_transformed_normalize_tcoords_ext(priv, repeat_type,
- matrix, xscale, yscale,
- x1, y1,
- x2, y2,
- yInverted,
- texcoords, stride);
+ if (!matrix && repeat_type == RepeatNone)
+ glamor_set_normalize_tcoords_ext(priv, xscale, yscale,
+ x1, y1,
+ x2, y2, yInverted, texcoords, stride);
+ else if (matrix && repeat_type == RepeatNone)
+ glamor_set_transformed_normalize_tcoords_ext(priv, matrix, xscale,
+ yscale, x1, y1,
+ x2, y2,
+ yInverted,
+ texcoords, stride);
+ else if (!matrix && repeat_type != RepeatNone)
+ glamor_set_repeat_normalize_tcoords_ext(priv, repeat_type,
+ xscale, yscale,
+ x1, y1,
+ x2, y2,
+ yInverted, texcoords, stride);
+ else if (matrix && repeat_type != RepeatNone)
+ glamor_set_repeat_transformed_normalize_tcoords_ext(priv, repeat_type,
+ matrix, xscale,
+ yscale, x1, y1, x2,
+ y2, yInverted,
+ texcoords, stride);
}
-Bool glamor_composite_choose_shader(CARD8 op,
- PicturePtr source,
- PicturePtr mask,
- PicturePtr dest,
- glamor_pixmap_private *source_pixmap_priv,
- glamor_pixmap_private *mask_pixmap_priv,
- glamor_pixmap_private *dest_pixmap_priv,
- struct shader_key *s_key,
- glamor_composite_shader **shader,
- struct blendinfo *op_info,
- PictFormatShort *psaved_source_format)
+Bool
+glamor_composite_choose_shader(CARD8 op,
+ PicturePtr source,
+ PicturePtr mask,
+ PicturePtr dest,
+ glamor_pixmap_private *source_pixmap_priv,
+ glamor_pixmap_private *mask_pixmap_priv,
+ glamor_pixmap_private *dest_pixmap_priv,
+ struct shader_key *s_key,
+ glamor_composite_shader ** shader,
+ struct blendinfo *op_info,
+ PictFormatShort *psaved_source_format)
{
- ScreenPtr screen = dest->pDrawable->pScreen;
- PixmapPtr dest_pixmap = dest_pixmap_priv->base.pixmap;
- PixmapPtr source_pixmap = NULL;
- PixmapPtr mask_pixmap = NULL;
- enum glamor_pixmap_status source_status = GLAMOR_NONE;
- enum glamor_pixmap_status mask_status = GLAMOR_NONE;
- PictFormatShort saved_source_format = 0;
- struct shader_key key;
- GLfloat source_solid_color[4];
- GLfloat mask_solid_color[4];
- Bool ret = FALSE;
-
- if (!GLAMOR_PIXMAP_PRIV_HAS_FBO(dest_pixmap_priv)) {
- glamor_fallback("dest has no fbo.\n");
- goto fail;
- }
-
- memset(&key, 0, sizeof(key));
- if (!source) {
- key.source = SHADER_SOURCE_SOLID;
- source_solid_color[0] = 0.0;
- source_solid_color[1] = 0.0;
- source_solid_color[2] = 0.0;
- source_solid_color[3] = 0.0;
- } else if (!source->pDrawable) {
- if (source->pSourcePict->type == SourcePictTypeSolidFill) {
- key.source = SHADER_SOURCE_SOLID;
- glamor_get_rgba_from_pixel(source->
- pSourcePict->solidFill.
- color,
- &source_solid_color[0],
- &source_solid_color[1],
- &source_solid_color[2],
- &source_solid_color[3],
- PICT_a8r8g8b8);
- } else
- goto fail;
- } else {
- key.source = SHADER_SOURCE_TEXTURE_ALPHA;
- }
-
- if (mask) {
- if (!mask->pDrawable) {
- if (mask->pSourcePict->type ==
- SourcePictTypeSolidFill) {
- key.mask = SHADER_MASK_SOLID;
- glamor_get_rgba_from_pixel
- (mask->pSourcePict->solidFill.color,
- &mask_solid_color[0],
- &mask_solid_color[1],
- &mask_solid_color[2],
- &mask_solid_color[3], PICT_a8r8g8b8);
- } else
- goto fail;
- } else {
- key.mask = SHADER_MASK_TEXTURE_ALPHA;
- }
-
- if (!mask->componentAlpha) {
- key.in = SHADER_IN_NORMAL;
- } else {
- if (op == PictOpClear)
- key.mask = SHADER_MASK_NONE;
- else if (op == PictOpSrc || op == PictOpAdd
- || op == PictOpIn || op == PictOpOut
- || op == PictOpOverReverse)
- key.in = SHADER_IN_CA_SOURCE;
- else if (op == PictOpOutReverse || op == PictOpInReverse) {
- key.in = SHADER_IN_CA_ALPHA;
- } else {
- glamor_fallback("Unsupported component alpha op: %d\n", op);
- goto fail;
- }
- }
- } else {
- key.mask = SHADER_MASK_NONE;
- key.in = SHADER_IN_SOURCE_ONLY;
- }
-
- if (source && source->alphaMap) {
- glamor_fallback("source alphaMap\n");
- goto fail;
- }
- if (mask && mask->alphaMap) {
- glamor_fallback("mask alphaMap\n");
- goto fail;
- }
-
- if (key.source == SHADER_SOURCE_TEXTURE ||
- key.source == SHADER_SOURCE_TEXTURE_ALPHA) {
- source_pixmap = source_pixmap_priv->base.pixmap;
- if (source_pixmap == dest_pixmap) {
- /* XXX source and the dest share the same texture.
- * Does it need special handle? */
- glamor_fallback("source == dest\n");
- }
- if (source_pixmap_priv->base.gl_fbo == 0) {
- /* XXX in Xephyr, we may have gl_fbo equal to 1 but gl_tex
- * equal to zero when the pixmap is screen pixmap. Then we may
- * refer the tex zero directly latter in the composition.
- * It seems that it works fine, but it may have potential problem*/
+ ScreenPtr screen = dest->pDrawable->pScreen;
+ PixmapPtr dest_pixmap = dest_pixmap_priv->base.pixmap;
+ PixmapPtr source_pixmap = NULL;
+ PixmapPtr mask_pixmap = NULL;
+ enum glamor_pixmap_status source_status = GLAMOR_NONE;
+ enum glamor_pixmap_status mask_status = GLAMOR_NONE;
+ PictFormatShort saved_source_format = 0;
+ struct shader_key key;
+ GLfloat source_solid_color[4];
+ GLfloat mask_solid_color[4];
+ Bool ret = FALSE;
+
+ if (!GLAMOR_PIXMAP_PRIV_HAS_FBO(dest_pixmap_priv)) {
+ glamor_fallback("dest has no fbo.\n");
+ goto fail;
+ }
+
+ memset(&key, 0, sizeof(key));
+ if (!source) {
+ key.source = SHADER_SOURCE_SOLID;
+ source_solid_color[0] = 0.0;
+ source_solid_color[1] = 0.0;
+ source_solid_color[2] = 0.0;
+ source_solid_color[3] = 0.0;
+ }
+ else if (!source->pDrawable) {
+ if (source->pSourcePict->type == SourcePictTypeSolidFill) {
+ key.source = SHADER_SOURCE_SOLID;
+ glamor_get_rgba_from_pixel(source->pSourcePict->solidFill.color,
+ &source_solid_color[0],
+ &source_solid_color[1],
+ &source_solid_color[2],
+ &source_solid_color[3], PICT_a8r8g8b8);
+ }
+ else
+ goto fail;
+ }
+ else {
+ key.source = SHADER_SOURCE_TEXTURE_ALPHA;
+ }
+
+ if (mask) {
+ if (!mask->pDrawable) {
+ if (mask->pSourcePict->type == SourcePictTypeSolidFill) {
+ key.mask = SHADER_MASK_SOLID;
+ glamor_get_rgba_from_pixel
+ (mask->pSourcePict->solidFill.color,
+ &mask_solid_color[0],
+ &mask_solid_color[1],
+ &mask_solid_color[2], &mask_solid_color[3], PICT_a8r8g8b8);
+ }
+ else
+ goto fail;
+ }
+ else {
+ key.mask = SHADER_MASK_TEXTURE_ALPHA;
+ }
+
+ if (!mask->componentAlpha) {
+ key.in = SHADER_IN_NORMAL;
+ }
+ else {
+ if (op == PictOpClear)
+ key.mask = SHADER_MASK_NONE;
+ else if (op == PictOpSrc || op == PictOpAdd
+ || op == PictOpIn || op == PictOpOut
+ || op == PictOpOverReverse)
+ key.in = SHADER_IN_CA_SOURCE;
+ else if (op == PictOpOutReverse || op == PictOpInReverse) {
+ key.in = SHADER_IN_CA_ALPHA;
+ }
+ else {
+ glamor_fallback("Unsupported component alpha op: %d\n", op);
+ goto fail;
+ }
+ }
+ }
+ else {
+ key.mask = SHADER_MASK_NONE;
+ key.in = SHADER_IN_SOURCE_ONLY;
+ }
+
+ if (source && source->alphaMap) {
+ glamor_fallback("source alphaMap\n");
+ goto fail;
+ }
+ if (mask && mask->alphaMap) {
+ glamor_fallback("mask alphaMap\n");
+ goto fail;
+ }
+
+ if (key.source == SHADER_SOURCE_TEXTURE ||
+ key.source == SHADER_SOURCE_TEXTURE_ALPHA) {
+ source_pixmap = source_pixmap_priv->base.pixmap;
+ if (source_pixmap == dest_pixmap) {
+ /* XXX source and the dest share the same texture.
+ * Does it need special handle? */
+ glamor_fallback("source == dest\n");
+ }
+ if (source_pixmap_priv->base.gl_fbo == 0) {
+ /* XXX in Xephyr, we may have gl_fbo equal to 1 but gl_tex
+ * equal to zero when the pixmap is screen pixmap. Then we may
+ * refer the tex zero directly latter in the composition.
+ * It seems that it works fine, but it may have potential problem*/
#ifdef GLAMOR_PIXMAP_DYNAMIC_UPLOAD
- source_status = GLAMOR_UPLOAD_PENDING;
+ source_status = GLAMOR_UPLOAD_PENDING;
#else
- glamor_fallback("no texture in source\n");
- goto fail;
+ glamor_fallback("no texture in source\n");
+ goto fail;
#endif
- }
- }
-
- if (key.mask == SHADER_MASK_TEXTURE ||
- key.mask == SHADER_MASK_TEXTURE_ALPHA) {
- mask_pixmap = mask_pixmap_priv->base.pixmap;
- if (mask_pixmap == dest_pixmap) {
- glamor_fallback("mask == dest\n");
- goto fail;
- }
- if (mask_pixmap_priv->base.gl_fbo == 0) {
+ }
+ }
+
+ if (key.mask == SHADER_MASK_TEXTURE ||
+ key.mask == SHADER_MASK_TEXTURE_ALPHA) {
+ mask_pixmap = mask_pixmap_priv->base.pixmap;
+ if (mask_pixmap == dest_pixmap) {
+ glamor_fallback("mask == dest\n");
+ goto fail;
+ }
+ if (mask_pixmap_priv->base.gl_fbo == 0) {
#ifdef GLAMOR_PIXMAP_DYNAMIC_UPLOAD
- mask_status = GLAMOR_UPLOAD_PENDING;
+ mask_status = GLAMOR_UPLOAD_PENDING;
#else
- glamor_fallback("no texture in mask\n");
- goto fail;
+ glamor_fallback("no texture in mask\n");
+ goto fail;
#endif
- }
- }
+ }
+ }
#ifdef GLAMOR_PIXMAP_DYNAMIC_UPLOAD
- if (source_status == GLAMOR_UPLOAD_PENDING
- && mask_status == GLAMOR_UPLOAD_PENDING
- && source_pixmap == mask_pixmap) {
-
- if (source->format != mask->format) {
- saved_source_format = source->format;
-
- if (!combine_pict_format(&source->format, source->format,
- mask->format, key.in)) {
- glamor_fallback("combine source %x mask %x failed.\n",
- source->format, mask->format);
- goto fail;
- }
-
- if (source->format != saved_source_format) {
- glamor_picture_format_fixup(source,
- source_pixmap_priv);
- }
- /* XXX
- * By default, glamor_upload_picture_to_texture will wire alpha to 1
- * if one picture doesn't have alpha. So we don't do that again in
- * rendering function. But here is a special case, as source and
- * mask share the same texture but may have different formats. For
- * example, source doesn't have alpha, but mask has alpha. Then the
- * texture will have the alpha value for the mask. And will not wire
- * to 1 for the source. In this case, we have to use different shader
- * to wire the source's alpha to 1.
- *
- * But this may cause a potential problem if the source's repeat mode
- * is REPEAT_NONE, and if the source is smaller than the dest, then
- * for the region not covered by the source may be painted incorrectly.
- * because we wire the alpha to 1.
- *
- **/
- if (!PICT_FORMAT_A(saved_source_format)
- && PICT_FORMAT_A(mask->format))
- key.source = SHADER_SOURCE_TEXTURE;
-
- if (!PICT_FORMAT_A(mask->format)
- && PICT_FORMAT_A(saved_source_format))
- key.mask = SHADER_MASK_TEXTURE;
-
- mask_status = GLAMOR_NONE;
- }
-
- source_status = glamor_upload_picture_to_texture(source);
- if (source_status != GLAMOR_UPLOAD_DONE) {
- glamor_fallback("Failed to upload source texture.\n");
- goto fail;
- }
- } else {
- if (source_status == GLAMOR_UPLOAD_PENDING) {
- source_status = glamor_upload_picture_to_texture(source);
- if (source_status != GLAMOR_UPLOAD_DONE) {
- glamor_fallback("Failed to upload source texture.\n");
- goto fail;
- }
- }
-
- if (mask_status == GLAMOR_UPLOAD_PENDING) {
- mask_status = glamor_upload_picture_to_texture(mask);
- if (mask_status != GLAMOR_UPLOAD_DONE) {
- glamor_fallback("Failed to upload mask texture.\n");
- goto fail;
- }
- }
- }
+ if (source_status == GLAMOR_UPLOAD_PENDING
+ && mask_status == GLAMOR_UPLOAD_PENDING
+ && source_pixmap == mask_pixmap) {
+
+ if (source->format != mask->format) {
+ saved_source_format = source->format;
+
+ if (!combine_pict_format(&source->format, source->format,
+ mask->format, key.in)) {
+ glamor_fallback("combine source %x mask %x failed.\n",
+ source->format, mask->format);
+ goto fail;
+ }
+
+ if (source->format != saved_source_format) {
+ glamor_picture_format_fixup(source, source_pixmap_priv);
+ }
+ /* XXX
+ * By default, glamor_upload_picture_to_texture will wire alpha to 1
+ * if one picture doesn't have alpha. So we don't do that again in
+ * rendering function. But here is a special case, as source and
+ * mask share the same texture but may have different formats. For
+ * example, source doesn't have alpha, but mask has alpha. Then the
+ * texture will have the alpha value for the mask. And will not wire
+ * to 1 for the source. In this case, we have to use different shader
+ * to wire the source's alpha to 1.
+ *
+ * But this may cause a potential problem if the source's repeat mode
+ * is REPEAT_NONE, and if the source is smaller than the dest, then
+ * for the region not covered by the source may be painted incorrectly.
+ * because we wire the alpha to 1.
+ *
+ **/
+ if (!PICT_FORMAT_A(saved_source_format)
+ && PICT_FORMAT_A(mask->format))
+ key.source = SHADER_SOURCE_TEXTURE;
+
+ if (!PICT_FORMAT_A(mask->format)
+ && PICT_FORMAT_A(saved_source_format))
+ key.mask = SHADER_MASK_TEXTURE;
+
+ mask_status = GLAMOR_NONE;
+ }
+
+ source_status = glamor_upload_picture_to_texture(source);
+ if (source_status != GLAMOR_UPLOAD_DONE) {
+ glamor_fallback("Failed to upload source texture.\n");
+ goto fail;
+ }
+ }
+ else {
+ if (source_status == GLAMOR_UPLOAD_PENDING) {
+ source_status = glamor_upload_picture_to_texture(source);
+ if (source_status != GLAMOR_UPLOAD_DONE) {
+ glamor_fallback("Failed to upload source texture.\n");
+ goto fail;
+ }
+ }
+
+ if (mask_status == GLAMOR_UPLOAD_PENDING) {
+ mask_status = glamor_upload_picture_to_texture(mask);
+ if (mask_status != GLAMOR_UPLOAD_DONE) {
+ glamor_fallback("Failed to upload mask texture.\n");
+ goto fail;
+ }
+ }
+ }
#endif
- /*Before enter the rendering stage, we need to fixup
- * transformed source and mask, if the transform is not int translate. */
- if (key.source != SHADER_SOURCE_SOLID
- && source->transform
- && !pixman_transform_is_int_translate(source->transform)
- && source_pixmap_priv->type != GLAMOR_TEXTURE_LARGE) {
- if (!glamor_fixup_pixmap_priv(screen, source_pixmap_priv))
- goto fail;
- }
- if (key.mask != SHADER_MASK_NONE && key.mask != SHADER_MASK_SOLID
- && mask->transform
- && !pixman_transform_is_int_translate(mask->transform)
- && mask_pixmap_priv->type != GLAMOR_TEXTURE_LARGE) {
- if (!glamor_fixup_pixmap_priv(screen, mask_pixmap_priv))
- goto fail;
- }
-
-
- if (!glamor_set_composite_op(screen, op, op_info, dest, mask))
- goto fail;
-
- *shader = glamor_lookup_composite_shader(screen, &key);
- if ((*shader)->prog == 0) {
- glamor_fallback("no shader program for this"
- "render acccel mode\n");
- goto fail;
- }
-
- if (key.source == SHADER_SOURCE_SOLID)
- memcpy(&(*shader)->source_solid_color[0],
- source_solid_color, 4*sizeof(float));
- else {
- (*shader)->source_priv = source_pixmap_priv;
- (*shader)->source = source;
- }
-
- if (key.mask == SHADER_MASK_SOLID)
- memcpy(&(*shader)->mask_solid_color[0],
- mask_solid_color, 4*sizeof(float));
- else {
- (*shader)->mask_priv = mask_pixmap_priv;
- (*shader)->mask = mask;
- }
-
- ret = TRUE;
- memcpy(s_key, &key, sizeof(key));
- *psaved_source_format = saved_source_format;
- goto done;
-
-fail:
- if (saved_source_format)
- source->format = saved_source_format;
-done:
- return ret;
+ /*Before enter the rendering stage, we need to fixup
+ * transformed source and mask, if the transform is not int translate. */
+ if (key.source != SHADER_SOURCE_SOLID
+ && source->transform
+ && !pixman_transform_is_int_translate(source->transform)
+ && source_pixmap_priv->type != GLAMOR_TEXTURE_LARGE) {
+ if (!glamor_fixup_pixmap_priv(screen, source_pixmap_priv))
+ goto fail;
+ }
+ if (key.mask != SHADER_MASK_NONE && key.mask != SHADER_MASK_SOLID
+ && mask->transform
+ && !pixman_transform_is_int_translate(mask->transform)
+ && mask_pixmap_priv->type != GLAMOR_TEXTURE_LARGE) {
+ if (!glamor_fixup_pixmap_priv(screen, mask_pixmap_priv))
+ goto fail;
+ }
+
+ if (!glamor_set_composite_op(screen, op, op_info, dest, mask))
+ goto fail;
+
+ *shader = glamor_lookup_composite_shader(screen, &key);
+ if ((*shader)->prog == 0) {
+ glamor_fallback("no shader program for this render acccel mode\n");
+ goto fail;
+ }
+
+ if (key.source == SHADER_SOURCE_SOLID)
+ memcpy(&(*shader)->source_solid_color[0],
+ source_solid_color, 4 * sizeof(float));
+ else {
+ (*shader)->source_priv = source_pixmap_priv;
+ (*shader)->source = source;
+ }
+
+ if (key.mask == SHADER_MASK_SOLID)
+ memcpy(&(*shader)->mask_solid_color[0],
+ mask_solid_color, 4 * sizeof(float));
+ else {
+ (*shader)->mask_priv = mask_pixmap_priv;
+ (*shader)->mask = mask;
+ }
+
+ ret = TRUE;
+ memcpy(s_key, &key, sizeof(key));
+ *psaved_source_format = saved_source_format;
+ goto done;
+
+ fail:
+ if (saved_source_format)
+ source->format = saved_source_format;
+ done:
+ return ret;
}
void
glamor_composite_set_shader_blend(glamor_pixmap_private *dest_priv,
- struct shader_key *key,
- glamor_composite_shader *shader,
- struct blendinfo *op_info)
+ struct shader_key *key,
+ glamor_composite_shader *shader,
+ struct blendinfo *op_info)
{
- glamor_gl_dispatch *dispatch;
- glamor_screen_private *glamor_priv;
-
- glamor_priv = dest_priv->base.glamor_priv;
-
- dispatch = glamor_get_dispatch(glamor_priv);
- dispatch->glUseProgram(shader->prog);
-
- if (key->source == SHADER_SOURCE_SOLID) {
- glamor_set_composite_solid(dispatch,
- shader->source_solid_color,
- shader->source_uniform_location);
- } else {
- glamor_set_composite_texture(glamor_priv, 0,
- shader->source,
- shader->source_priv, shader->source_wh,
- shader->source_repeat_mode);
- }
-
- if (key->mask != SHADER_MASK_NONE) {
- if (key->mask == SHADER_MASK_SOLID) {
- glamor_set_composite_solid(dispatch,
- shader->mask_solid_color,
- shader->mask_uniform_location);
- } else {
- glamor_set_composite_texture(glamor_priv, 1,
- shader->mask,
- shader->mask_priv, shader->mask_wh,
- shader->mask_repeat_mode);
- }
- }
-
- if (op_info->source_blend == GL_ONE
- && op_info->dest_blend == GL_ZERO) {
- dispatch->glDisable(GL_BLEND);
- } else {
- dispatch->glEnable(GL_BLEND);
- dispatch->glBlendFunc(op_info->source_blend,
- op_info->dest_blend);
- }
-
- glamor_put_dispatch(glamor_priv);
+ glamor_gl_dispatch *dispatch;
+ glamor_screen_private *glamor_priv;
+
+ glamor_priv = dest_priv->base.glamor_priv;
+
+ dispatch = glamor_get_dispatch(glamor_priv);
+ dispatch->glUseProgram(shader->prog);
+
+ if (key->source == SHADER_SOURCE_SOLID) {
+ glamor_set_composite_solid(dispatch,
+ shader->source_solid_color,
+ shader->source_uniform_location);
+ }
+ else {
+ glamor_set_composite_texture(glamor_priv, 0,
+ shader->source,
+ shader->source_priv, shader->source_wh,
+ shader->source_repeat_mode);
+ }
+
+ if (key->mask != SHADER_MASK_NONE) {
+ if (key->mask == SHADER_MASK_SOLID) {
+ glamor_set_composite_solid(dispatch,
+ shader->mask_solid_color,
+ shader->mask_uniform_location);
+ }
+ else {
+ glamor_set_composite_texture(glamor_priv, 1,
+ shader->mask,
+ shader->mask_priv, shader->mask_wh,
+ shader->mask_repeat_mode);
+ }
+ }
+
+ if (op_info->source_blend == GL_ONE && op_info->dest_blend == GL_ZERO) {
+ dispatch->glDisable(GL_BLEND);
+ }
+ else {
+ dispatch->glEnable(GL_BLEND);
+ dispatch->glBlendFunc(op_info->source_blend, op_info->dest_blend);
+ }
+
+ glamor_put_dispatch(glamor_priv);
}
static Bool
glamor_composite_with_shader(CARD8 op,
- PicturePtr source,
- PicturePtr mask,
- PicturePtr dest,
- glamor_pixmap_private *source_pixmap_priv,
- glamor_pixmap_private *mask_pixmap_priv,
- glamor_pixmap_private *dest_pixmap_priv,
- int nrect, glamor_composite_rect_t * rects,
- Bool two_pass_ca)
+ PicturePtr source,
+ PicturePtr mask,
+ PicturePtr dest,
+ glamor_pixmap_private *source_pixmap_priv,
+ glamor_pixmap_private *mask_pixmap_priv,
+ glamor_pixmap_private *dest_pixmap_priv,
+ int nrect, glamor_composite_rect_t *rects,
+ Bool two_pass_ca)
{
- ScreenPtr screen = dest->pDrawable->pScreen;
- glamor_screen_private *glamor_priv = dest_pixmap_priv->base.glamor_priv;
- PixmapPtr dest_pixmap = dest_pixmap_priv->base.pixmap;
- PixmapPtr source_pixmap = NULL;
- PixmapPtr mask_pixmap = NULL;
- glamor_gl_dispatch *dispatch = NULL;
- GLfloat dst_xscale, dst_yscale;
- GLfloat mask_xscale = 1, mask_yscale = 1,
- src_xscale = 1, src_yscale = 1;
- struct shader_key key, key_ca;
- float *vertices;
- int dest_x_off, dest_y_off;
- int source_x_off, source_y_off;
- int mask_x_off, mask_y_off;
- PictFormatShort saved_source_format = 0;
- float src_matrix[9], mask_matrix[9];
- float *psrc_matrix = NULL, *pmask_matrix = NULL;
- int vert_stride = 4;
- int nrect_max;
- Bool ret = FALSE;
- glamor_composite_shader *shader = NULL, *shader_ca = NULL;
- struct blendinfo op_info, op_info_ca;
-
- if(!glamor_composite_choose_shader(op, source, mask, dest,
- source_pixmap_priv, mask_pixmap_priv,
- dest_pixmap_priv,
- &key, &shader, &op_info,
- &saved_source_format)) {
- glamor_fallback("glamor_composite_choose_shader failed\n");
- return ret;
- }
- if (two_pass_ca) {
- if(!glamor_composite_choose_shader(PictOpAdd, source, mask, dest,
- source_pixmap_priv, mask_pixmap_priv,
- dest_pixmap_priv,
- &key_ca, &shader_ca, &op_info_ca,
- &saved_source_format)) {
- glamor_fallback("glamor_composite_choose_shader failed\n");
- return ret;
- }
- }
-
- glamor_set_destination_pixmap_priv_nc(dest_pixmap_priv);
- glamor_composite_set_shader_blend(dest_pixmap_priv, &key, shader, &op_info);
-
- dispatch = glamor_get_dispatch(glamor_priv);
-
- glamor_priv->has_source_coords = key.source != SHADER_SOURCE_SOLID;
- glamor_priv->has_mask_coords = (key.mask != SHADER_MASK_NONE &&
- key.mask != SHADER_MASK_SOLID);
-
- dest_pixmap = glamor_get_drawable_pixmap(dest->pDrawable);
- dest_pixmap_priv = glamor_get_pixmap_private(dest_pixmap);
- glamor_get_drawable_deltas(dest->pDrawable, dest_pixmap,
- &dest_x_off, &dest_y_off);
- pixmap_priv_get_dest_scale(dest_pixmap_priv, &dst_xscale, &dst_yscale);
-
- if (glamor_priv->has_source_coords) {
- source_pixmap = source_pixmap_priv->base.pixmap;
- glamor_get_drawable_deltas(source->pDrawable,
- source_pixmap, &source_x_off,
- &source_y_off);
- pixmap_priv_get_scale(source_pixmap_priv, &src_xscale,
- &src_yscale);
- if (source->transform) {
- psrc_matrix = src_matrix;
- glamor_picture_get_matrixf(source, psrc_matrix);
- }
- vert_stride += 4;
- }
-
- if (glamor_priv->has_mask_coords) {
- mask_pixmap = mask_pixmap_priv->base.pixmap;
- glamor_get_drawable_deltas(mask->pDrawable, mask_pixmap,
- &mask_x_off, &mask_y_off);
- pixmap_priv_get_scale(mask_pixmap_priv, &mask_xscale,
- &mask_yscale);
- if (mask->transform) {
- pmask_matrix = mask_matrix;
- glamor_picture_get_matrixf(mask, pmask_matrix);
- }
- vert_stride += 4;
- }
-
- nrect_max = (vert_stride * nrect) > GLAMOR_COMPOSITE_VBO_VERT_CNT ?
- (GLAMOR_COMPOSITE_VBO_VERT_CNT / vert_stride) : nrect;
-
- while(nrect) {
- int mrect, rect_processed;
- int vb_stride;
-
- mrect = nrect > nrect_max ? nrect_max : nrect ;
- glamor_setup_composite_vbo(screen, mrect * vert_stride);
- rect_processed = mrect;
- vb_stride = glamor_priv->vb_stride/sizeof(float);
- while (mrect--) {
- INT16 x_source;
- INT16 y_source;
- INT16 x_mask;
- INT16 y_mask;
- INT16 x_dest;
- INT16 y_dest;
- CARD16 width;
- CARD16 height;
-
- x_dest = rects->x_dst + dest_x_off;
- y_dest = rects->y_dst + dest_y_off;
- x_source = rects->x_src + source_x_off;
- y_source = rects->y_src + source_y_off;
- x_mask = rects->x_mask + mask_x_off;
- y_mask = rects->y_mask + mask_y_off;
- width = rects->width;
- height = rects->height;
-
- DEBUGF("dest(%d,%d) source(%d %d) mask (%d %d), width %d height %d \n",
- x_dest, y_dest, x_source, y_source,x_mask,y_mask,width,height);
- vertices = (float*)(glamor_priv->vb + glamor_priv->vbo_offset);
- assert(glamor_priv->vbo_offset < glamor_priv->vbo_size - glamor_priv->vb_stride);
- glamor_set_normalize_vcoords_ext(dest_pixmap_priv, dst_xscale,
- dst_yscale,
- x_dest, y_dest,
- x_dest + width, y_dest + height,
- glamor_priv->yInverted,
- vertices, vb_stride);
- vertices += 2;
- if (key.source != SHADER_SOURCE_SOLID) {
- glamor_set_normalize_tcoords_generic(
- source_pixmap_priv, source->repeatType, psrc_matrix,
- src_xscale, src_yscale, x_source, y_source,
- x_source + width, y_source + height,
- glamor_priv->yInverted, vertices, vb_stride);
- vertices += 2;
- }
-
- if (key.mask != SHADER_MASK_NONE
- && key.mask != SHADER_MASK_SOLID) {
- glamor_set_normalize_tcoords_generic(
- mask_pixmap_priv, mask->repeatType, pmask_matrix,
- mask_xscale, mask_yscale, x_mask, y_mask,
- x_mask + width, y_mask + height,
- glamor_priv->yInverted, vertices, vb_stride);
- }
- glamor_priv->render_nr_verts += 4;
- glamor_priv->vbo_offset += glamor_priv->vb_stride * 4;
- rects++;
- }
- glamor_flush_composite_rects(screen);
- nrect -= rect_processed;
- if (two_pass_ca) {
- glamor_composite_set_shader_blend(dest_pixmap_priv,
- &key_ca, shader_ca,
- &op_info_ca);
- glamor_flush_composite_rects(screen);
- if (nrect)
- glamor_composite_set_shader_blend(dest_pixmap_priv,
- &key, shader,
- &op_info);
- }
- }
-
- dispatch->glBindBuffer(GL_ARRAY_BUFFER, 0);
- dispatch->glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, 0);
- dispatch->glDisableVertexAttribArray(GLAMOR_VERTEX_POS);
- dispatch->glDisableVertexAttribArray(GLAMOR_VERTEX_SOURCE);
- dispatch->glDisableVertexAttribArray(GLAMOR_VERTEX_MASK);
- dispatch->glDisable(GL_BLEND);
+ ScreenPtr screen = dest->pDrawable->pScreen;
+ glamor_screen_private *glamor_priv = dest_pixmap_priv->base.glamor_priv;
+ PixmapPtr dest_pixmap = dest_pixmap_priv->base.pixmap;
+ PixmapPtr source_pixmap = NULL;
+ PixmapPtr mask_pixmap = NULL;
+ glamor_gl_dispatch *dispatch = NULL;
+ GLfloat dst_xscale, dst_yscale;
+ GLfloat mask_xscale = 1, mask_yscale = 1, src_xscale = 1, src_yscale = 1;
+ struct shader_key key, key_ca;
+ float *vertices;
+ int dest_x_off, dest_y_off;
+ int source_x_off, source_y_off;
+ int mask_x_off, mask_y_off;
+ PictFormatShort saved_source_format = 0;
+ float src_matrix[9], mask_matrix[9];
+ float *psrc_matrix = NULL, *pmask_matrix = NULL;
+ int vert_stride = 4;
+ int nrect_max;
+ Bool ret = FALSE;
+ glamor_composite_shader *shader = NULL, *shader_ca = NULL;
+ struct blendinfo op_info, op_info_ca;
+
+ if (!glamor_composite_choose_shader(op, source, mask, dest,
+ source_pixmap_priv, mask_pixmap_priv,
+ dest_pixmap_priv,
+ &key, &shader, &op_info,
+ &saved_source_format)) {
+ glamor_fallback("glamor_composite_choose_shader failed\n");
+ return ret;
+ }
+ if (two_pass_ca) {
+ if (!glamor_composite_choose_shader(PictOpAdd, source, mask, dest,
+ source_pixmap_priv,
+ mask_pixmap_priv, dest_pixmap_priv,
+ &key_ca, &shader_ca, &op_info_ca,
+ &saved_source_format)) {
+ glamor_fallback("glamor_composite_choose_shader failed\n");
+ return ret;
+ }
+ }
+
+ glamor_set_destination_pixmap_priv_nc(dest_pixmap_priv);
+ glamor_composite_set_shader_blend(dest_pixmap_priv, &key, shader, &op_info);
+
+ dispatch = glamor_get_dispatch(glamor_priv);
+
+ glamor_priv->has_source_coords = key.source != SHADER_SOURCE_SOLID;
+ glamor_priv->has_mask_coords = (key.mask != SHADER_MASK_NONE &&
+ key.mask != SHADER_MASK_SOLID);
+
+ dest_pixmap = glamor_get_drawable_pixmap(dest->pDrawable);
+ dest_pixmap_priv = glamor_get_pixmap_private(dest_pixmap);
+ glamor_get_drawable_deltas(dest->pDrawable, dest_pixmap,
+ &dest_x_off, &dest_y_off);
+ pixmap_priv_get_dest_scale(dest_pixmap_priv, &dst_xscale, &dst_yscale);
+
+ if (glamor_priv->has_source_coords) {
+ source_pixmap = source_pixmap_priv->base.pixmap;
+ glamor_get_drawable_deltas(source->pDrawable,
+ source_pixmap, &source_x_off, &source_y_off);
+ pixmap_priv_get_scale(source_pixmap_priv, &src_xscale, &src_yscale);
+ if (source->transform) {
+ psrc_matrix = src_matrix;
+ glamor_picture_get_matrixf(source, psrc_matrix);
+ }
+ vert_stride += 4;
+ }
+
+ if (glamor_priv->has_mask_coords) {
+ mask_pixmap = mask_pixmap_priv->base.pixmap;
+ glamor_get_drawable_deltas(mask->pDrawable, mask_pixmap,
+ &mask_x_off, &mask_y_off);
+ pixmap_priv_get_scale(mask_pixmap_priv, &mask_xscale, &mask_yscale);
+ if (mask->transform) {
+ pmask_matrix = mask_matrix;
+ glamor_picture_get_matrixf(mask, pmask_matrix);
+ }
+ vert_stride += 4;
+ }
+
+ nrect_max = (vert_stride * nrect) > GLAMOR_COMPOSITE_VBO_VERT_CNT ?
+ (GLAMOR_COMPOSITE_VBO_VERT_CNT / vert_stride) : nrect;
+
+ while (nrect) {
+ int mrect, rect_processed;
+ int vb_stride;
+
+ mrect = nrect > nrect_max ? nrect_max : nrect;
+ glamor_setup_composite_vbo(screen, mrect * vert_stride);
+ rect_processed = mrect;
+ vb_stride = glamor_priv->vb_stride / sizeof(float);
+ while (mrect--) {
+ INT16 x_source;
+ INT16 y_source;
+ INT16 x_mask;
+ INT16 y_mask;
+ INT16 x_dest;
+ INT16 y_dest;
+ CARD16 width;
+ CARD16 height;
+
+ x_dest = rects->x_dst + dest_x_off;
+ y_dest = rects->y_dst + dest_y_off;
+ x_source = rects->x_src + source_x_off;
+ y_source = rects->y_src + source_y_off;
+ x_mask = rects->x_mask + mask_x_off;
+ y_mask = rects->y_mask + mask_y_off;
+ width = rects->width;
+ height = rects->height;
+
+ DEBUGF
+ ("dest(%d,%d) source(%d %d) mask (%d %d), width %d height %d \n",
+ x_dest, y_dest, x_source, y_source, x_mask, y_mask, width,
+ height);
+ vertices = (float *) (glamor_priv->vb + glamor_priv->vbo_offset);
+ assert(glamor_priv->vbo_offset <
+ glamor_priv->vbo_size - glamor_priv->vb_stride);
+ glamor_set_normalize_vcoords_ext(dest_pixmap_priv, dst_xscale,
+ dst_yscale, x_dest, y_dest,
+ x_dest + width, y_dest + height,
+ glamor_priv->yInverted, vertices,
+ vb_stride);
+ vertices += 2;
+ if (key.source != SHADER_SOURCE_SOLID) {
+ glamor_set_normalize_tcoords_generic(source_pixmap_priv,
+ source->repeatType,
+ psrc_matrix, src_xscale,
+ src_yscale, x_source,
+ y_source, x_source + width,
+ y_source + height,
+ glamor_priv->yInverted,
+ vertices, vb_stride);
+ vertices += 2;
+ }
+
+ if (key.mask != SHADER_MASK_NONE && key.mask != SHADER_MASK_SOLID) {
+ glamor_set_normalize_tcoords_generic(mask_pixmap_priv,
+ mask->repeatType,
+ pmask_matrix, mask_xscale,
+ mask_yscale, x_mask,
+ y_mask, x_mask + width,
+ y_mask + height,
+ glamor_priv->yInverted,
+ vertices, vb_stride);
+ }
+ glamor_priv->render_nr_verts += 4;
+ glamor_priv->vbo_offset += glamor_priv->vb_stride * 4;
+ rects++;
+ }
+ glamor_flush_composite_rects(screen);
+ nrect -= rect_processed;
+ if (two_pass_ca) {
+ glamor_composite_set_shader_blend(dest_pixmap_priv,
+ &key_ca, shader_ca, &op_info_ca);
+ glamor_flush_composite_rects(screen);
+ if (nrect)
+ glamor_composite_set_shader_blend(dest_pixmap_priv,
+ &key, shader, &op_info);
+ }
+ }
+
+ dispatch->glBindBuffer(GL_ARRAY_BUFFER, 0);
+ dispatch->glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, 0);
+ dispatch->glDisableVertexAttribArray(GLAMOR_VERTEX_POS);
+ dispatch->glDisableVertexAttribArray(GLAMOR_VERTEX_SOURCE);
+ dispatch->glDisableVertexAttribArray(GLAMOR_VERTEX_MASK);
+ dispatch->glDisable(GL_BLEND);
#ifndef GLAMOR_GLES2
- dispatch->glActiveTexture(GL_TEXTURE0);
- dispatch->glDisable(GL_TEXTURE_2D);
- dispatch->glActiveTexture(GL_TEXTURE1);
- dispatch->glDisable(GL_TEXTURE_2D);
+ dispatch->glActiveTexture(GL_TEXTURE0);
+ dispatch->glDisable(GL_TEXTURE_2D);
+ dispatch->glActiveTexture(GL_TEXTURE1);
+ dispatch->glDisable(GL_TEXTURE_2D);
#endif
- DEBUGF("finish rendering.\n");
- dispatch->glUseProgram(0);
- glamor_priv->state = RENDER_STATE;
- glamor_priv->render_idle_cnt = 0;
- if (saved_source_format)
- source->format = saved_source_format;
- glamor_put_dispatch(glamor_priv);
-
- ret = TRUE;
- return ret;
+ DEBUGF("finish rendering.\n");
+ dispatch->glUseProgram(0);
+ glamor_priv->state = RENDER_STATE;
+ glamor_priv->render_idle_cnt = 0;
+ if (saved_source_format)
+ source->format = saved_source_format;
+ glamor_put_dispatch(glamor_priv);
+
+ ret = TRUE;
+ return ret;
}
PicturePtr
@@ -1472,411 +1475,412 @@ glamor_convert_gradient_picture(ScreenPtr screen,
int x_source,
int y_source, int width, int height)
{
- PixmapPtr pixmap;
- PicturePtr dst = NULL;
- int error;
- PictFormatShort format;
- if (!source->pDrawable)
- format = PICT_a8r8g8b8;
- else
- format = source->format;
+ PixmapPtr pixmap;
+ PicturePtr dst = NULL;
+ int error;
+ PictFormatShort format;
+
+ if (!source->pDrawable)
+ format = PICT_a8r8g8b8;
+ else
+ format = source->format;
#ifdef GLAMOR_GRADIENT_SHADER
- if (!source->pDrawable) {
- if (source->pSourcePict->type == SourcePictTypeLinear) {
- dst = glamor_generate_linear_gradient_picture(screen,
- source, x_source, y_source, width, height, format);
- } else if (source->pSourcePict->type == SourcePictTypeRadial) {
- dst = glamor_generate_radial_gradient_picture(screen,
- source, x_source, y_source, width, height, format);
- }
-
- if (dst) {
-#if 0 /* Debug to compare it to pixman, Enable it if needed. */
- glamor_compare_pictures(screen, source,
- dst, x_source, y_source, width, height,
- 0, 3);
+ if (!source->pDrawable) {
+ if (source->pSourcePict->type == SourcePictTypeLinear) {
+ dst = glamor_generate_linear_gradient_picture(screen,
+ source, x_source,
+ y_source, width,
+ height, format);
+ }
+ else if (source->pSourcePict->type == SourcePictTypeRadial) {
+ dst = glamor_generate_radial_gradient_picture(screen,
+ source, x_source,
+ y_source, width,
+ height, format);
+ }
+
+ if (dst) {
+#if 0 /* Debug to compare it to pixman, Enable it if needed. */
+ glamor_compare_pictures(screen, source,
+ dst, x_source, y_source, width, height,
+ 0, 3);
#endif
- return dst;
- }
- }
+ return dst;
+ }
+ }
#endif
- pixmap = glamor_create_pixmap(screen,
- width,
- height,
- PIXMAN_FORMAT_DEPTH(format),
- GLAMOR_CREATE_PIXMAP_CPU);
-
- if (!pixmap)
- return NULL;
-
- dst = CreatePicture(0,
- &pixmap->drawable,
- PictureMatchFormat(screen,
- PIXMAN_FORMAT_DEPTH(format),
- format),
- 0, 0, serverClient, &error);
- glamor_destroy_pixmap(pixmap);
- if (!dst)
- return NULL;
-
- ValidatePicture(dst);
-
- fbComposite(PictOpSrc, source, NULL, dst, x_source, y_source,
- 0, 0, 0, 0, width, height);
- return dst;
+ pixmap = glamor_create_pixmap(screen,
+ width,
+ height,
+ PIXMAN_FORMAT_DEPTH(format),
+ GLAMOR_CREATE_PIXMAP_CPU);
+
+ if (!pixmap)
+ return NULL;
+
+ dst = CreatePicture(0,
+ &pixmap->drawable,
+ PictureMatchFormat(screen,
+ PIXMAN_FORMAT_DEPTH(format),
+ format), 0, 0, serverClient, &error);
+ glamor_destroy_pixmap(pixmap);
+ if (!dst)
+ return NULL;
+
+ ValidatePicture(dst);
+
+ fbComposite(PictOpSrc, source, NULL, dst, x_source, y_source,
+ 0, 0, 0, 0, width, height);
+ return dst;
}
Bool
glamor_composite_clipped_region(CARD8 op,
- PicturePtr source,
- PicturePtr mask,
- PicturePtr dest,
- glamor_pixmap_private *source_pixmap_priv,
- glamor_pixmap_private *mask_pixmap_priv,
- glamor_pixmap_private *dest_pixmap_priv,
- RegionPtr region,
- int x_source,
- int y_source,
- int x_mask,
- int y_mask,
- int x_dest,
- int y_dest)
+ PicturePtr source,
+ PicturePtr mask,
+ PicturePtr dest,
+ glamor_pixmap_private *source_pixmap_priv,
+ glamor_pixmap_private *mask_pixmap_priv,
+ glamor_pixmap_private *dest_pixmap_priv,
+ RegionPtr region,
+ int x_source,
+ int y_source,
+ int x_mask, int y_mask, int x_dest, int y_dest)
{
- ScreenPtr screen = dest->pDrawable->pScreen;
- PixmapPtr source_pixmap = NULL, mask_pixmap = NULL;
- PicturePtr temp_src = source, temp_mask = mask;
- glamor_pixmap_private *temp_src_priv = source_pixmap_priv;
- glamor_pixmap_private *temp_mask_priv = mask_pixmap_priv;
- int x_temp_src, y_temp_src, x_temp_mask, y_temp_mask;
- BoxPtr extent;
- glamor_composite_rect_t rect[10];
- glamor_composite_rect_t *prect = rect;
- int prect_size = ARRAY_SIZE(rect);
- int ok = FALSE;
- int i;
- int width;
- int height;
- BoxPtr box;
- int nbox;
- Bool two_pass_ca = FALSE;
-
- extent = RegionExtents(region);
- box = RegionRects(region);
- nbox = RegionNumRects(region);
- width = extent->x2 - extent->x1;
- height = extent->y2 - extent->y1;
-
- x_temp_src = x_source;
- y_temp_src = y_source;
- x_temp_mask = x_mask;
- y_temp_mask = y_mask;
-
- DEBUGF("clipped (%d %d) (%d %d) (%d %d) width %d height %d \n",
- x_source, y_source, x_mask, y_mask, x_dest, y_dest, width, height);
-
- if (source_pixmap_priv)
- source_pixmap = source_pixmap_priv->base.pixmap;
-
- if (mask_pixmap_priv)
- mask_pixmap = mask_pixmap_priv->base.pixmap;
-
- /* XXX is it possible source mask have non-zero drawable.x/y? */
- if (source
- && ((!source->pDrawable
- && (source->pSourcePict->type != SourcePictTypeSolidFill))
- || (source->pDrawable
- && !GLAMOR_PIXMAP_PRIV_HAS_FBO(source_pixmap_priv)
- && (source_pixmap->drawable.width != width
- || source_pixmap->drawable.height != height)))) {
- temp_src =
- glamor_convert_gradient_picture(screen, source,
- extent->x1 + x_source - x_dest,
- extent->y1 + y_source - y_dest,
- width, height);
- if (!temp_src) {
- temp_src = source;
- goto out;
- }
- temp_src_priv = glamor_get_pixmap_private((PixmapPtr)(temp_src->pDrawable));
- x_temp_src = - extent->x1 + x_dest;
- y_temp_src = - extent->y1 + y_dest;
- }
-
- if (mask
- &&
- ((!mask->pDrawable
- && (mask->pSourcePict->type != SourcePictTypeSolidFill))
- || (mask->pDrawable
- && !GLAMOR_PIXMAP_PRIV_HAS_FBO(mask_pixmap_priv)
- && (mask_pixmap->drawable.width != width
- || mask_pixmap->drawable.height != height)))) {
- /* XXX if mask->pDrawable is the same as source->pDrawable, we have an opportunity
- * to do reduce one convertion. */
- temp_mask =
- glamor_convert_gradient_picture(screen, mask,
- extent->x1 + x_mask - x_dest,
- extent->y1 + y_mask - y_dest,
- width, height);
- if (!temp_mask) {
- temp_mask = mask;
- goto out;
- }
- temp_mask_priv = glamor_get_pixmap_private((PixmapPtr)(temp_mask->pDrawable));
- x_temp_mask = - extent->x1 + x_dest;
- y_temp_mask = - extent->y1 + y_dest;
- }
- /* Do two-pass PictOpOver componentAlpha, until we enable
- * dual source color blending.
- */
-
- if (mask && mask->componentAlpha) {
- if (op == PictOpOver) {
- two_pass_ca = TRUE;
- op = PictOpOutReverse;
- }
- }
-
- if (!mask && temp_src) {
- if (glamor_composite_with_copy(op, temp_src, dest,
- x_temp_src, y_temp_src,
- x_dest, y_dest, region)) {
- ok = TRUE;
- goto out;
- }
- }
-
- /*XXXXX, self copy?*/
-
- x_dest += dest->pDrawable->x;
- y_dest += dest->pDrawable->y;
- if (temp_src && temp_src->pDrawable) {
- x_temp_src += temp_src->pDrawable->x;
- y_temp_src += temp_src->pDrawable->y;
- }
- if (temp_mask && temp_mask->pDrawable) {
- x_temp_mask += temp_mask->pDrawable->x;
- y_temp_mask += temp_mask->pDrawable->y;
- }
-
- if (nbox > ARRAY_SIZE(rect)) {
- prect = calloc(nbox, sizeof(*prect));
- if (prect)
- prect_size = nbox;
- else {
- prect = rect;
- prect_size = ARRAY_SIZE(rect);
- }
- }
- while(nbox) {
- int box_cnt;
- box_cnt = nbox > prect_size ? prect_size : nbox;
- for (i = 0; i < box_cnt; i++) {
- prect[i].x_src = box[i].x1 + x_temp_src - x_dest;
- prect[i].y_src = box[i].y1 + y_temp_src - y_dest;
- prect[i].x_mask = box[i].x1 + x_temp_mask - x_dest;
- prect[i].y_mask = box[i].y1 + y_temp_mask - y_dest;
- prect[i].x_dst = box[i].x1;
- prect[i].y_dst = box[i].y1;
- prect[i].width = box[i].x2 - box[i].x1;
- prect[i].height = box[i].y2 - box[i].y1;
- DEBUGF("dest %d %d \n", prect[i].x_dst, prect[i].y_dst);
- }
- ok = glamor_composite_with_shader(op, temp_src, temp_mask, dest,
- temp_src_priv, temp_mask_priv,
- dest_pixmap_priv,
- box_cnt, prect, two_pass_ca);
- if (!ok)
- break;
- nbox -= box_cnt;
- box += box_cnt;
- }
-
- if (prect != rect)
- free(prect);
-out:
- if (temp_src != source)
- FreePicture(temp_src, 0);
- if (temp_mask != mask)
- FreePicture(temp_mask, 0);
-
- return ok;
+ ScreenPtr screen = dest->pDrawable->pScreen;
+ PixmapPtr source_pixmap = NULL, mask_pixmap = NULL;
+ PicturePtr temp_src = source, temp_mask = mask;
+ glamor_pixmap_private *temp_src_priv = source_pixmap_priv;
+ glamor_pixmap_private *temp_mask_priv = mask_pixmap_priv;
+ int x_temp_src, y_temp_src, x_temp_mask, y_temp_mask;
+ BoxPtr extent;
+ glamor_composite_rect_t rect[10];
+ glamor_composite_rect_t *prect = rect;
+ int prect_size = ARRAY_SIZE(rect);
+ int ok = FALSE;
+ int i;
+ int width;
+ int height;
+ BoxPtr box;
+ int nbox;
+ Bool two_pass_ca = FALSE;
+
+ extent = RegionExtents(region);
+ box = RegionRects(region);
+ nbox = RegionNumRects(region);
+ width = extent->x2 - extent->x1;
+ height = extent->y2 - extent->y1;
+
+ x_temp_src = x_source;
+ y_temp_src = y_source;
+ x_temp_mask = x_mask;
+ y_temp_mask = y_mask;
+
+ DEBUGF("clipped (%d %d) (%d %d) (%d %d) width %d height %d \n",
+ x_source, y_source, x_mask, y_mask, x_dest, y_dest, width, height);
+
+ if (source_pixmap_priv)
+ source_pixmap = source_pixmap_priv->base.pixmap;
+
+ if (mask_pixmap_priv)
+ mask_pixmap = mask_pixmap_priv->base.pixmap;
+
+ /* XXX is it possible source mask have non-zero drawable.x/y? */
+ if (source
+ && ((!source->pDrawable
+ && (source->pSourcePict->type != SourcePictTypeSolidFill))
+ || (source->pDrawable
+ && !GLAMOR_PIXMAP_PRIV_HAS_FBO(source_pixmap_priv)
+ && (source_pixmap->drawable.width != width
+ || source_pixmap->drawable.height != height)))) {
+ temp_src =
+ glamor_convert_gradient_picture(screen, source,
+ extent->x1 + x_source - x_dest,
+ extent->y1 + y_source - y_dest,
+ width, height);
+ if (!temp_src) {
+ temp_src = source;
+ goto out;
+ }
+ temp_src_priv =
+ glamor_get_pixmap_private((PixmapPtr) (temp_src->pDrawable));
+ x_temp_src = -extent->x1 + x_dest;
+ y_temp_src = -extent->y1 + y_dest;
+ }
+
+ if (mask
+ &&
+ ((!mask->pDrawable
+ && (mask->pSourcePict->type != SourcePictTypeSolidFill))
+ || (mask->pDrawable && !GLAMOR_PIXMAP_PRIV_HAS_FBO(mask_pixmap_priv)
+ && (mask_pixmap->drawable.width != width
+ || mask_pixmap->drawable.height != height)))) {
+ /* XXX if mask->pDrawable is the same as source->pDrawable, we have an opportunity
+ * to do reduce one convertion. */
+ temp_mask =
+ glamor_convert_gradient_picture(screen, mask,
+ extent->x1 + x_mask - x_dest,
+ extent->y1 + y_mask - y_dest,
+ width, height);
+ if (!temp_mask) {
+ temp_mask = mask;
+ goto out;
+ }
+ temp_mask_priv =
+ glamor_get_pixmap_private((PixmapPtr) (temp_mask->pDrawable));
+ x_temp_mask = -extent->x1 + x_dest;
+ y_temp_mask = -extent->y1 + y_dest;
+ }
+ /* Do two-pass PictOpOver componentAlpha, until we enable
+ * dual source color blending.
+ */
+
+ if (mask && mask->componentAlpha) {
+ if (op == PictOpOver) {
+ two_pass_ca = TRUE;
+ op = PictOpOutReverse;
+ }
+ }
+
+ if (!mask && temp_src) {
+ if (glamor_composite_with_copy(op, temp_src, dest,
+ x_temp_src, y_temp_src,
+ x_dest, y_dest, region)) {
+ ok = TRUE;
+ goto out;
+ }
+ }
+
+ /*XXXXX, self copy? */
+
+ x_dest += dest->pDrawable->x;
+ y_dest += dest->pDrawable->y;
+ if (temp_src && temp_src->pDrawable) {
+ x_temp_src += temp_src->pDrawable->x;
+ y_temp_src += temp_src->pDrawable->y;
+ }
+ if (temp_mask && temp_mask->pDrawable) {
+ x_temp_mask += temp_mask->pDrawable->x;
+ y_temp_mask += temp_mask->pDrawable->y;
+ }
+
+ if (nbox > ARRAY_SIZE(rect)) {
+ prect = calloc(nbox, sizeof(*prect));
+ if (prect)
+ prect_size = nbox;
+ else {
+ prect = rect;
+ prect_size = ARRAY_SIZE(rect);
+ }
+ }
+ while (nbox) {
+ int box_cnt;
+
+ box_cnt = nbox > prect_size ? prect_size : nbox;
+ for (i = 0; i < box_cnt; i++) {
+ prect[i].x_src = box[i].x1 + x_temp_src - x_dest;
+ prect[i].y_src = box[i].y1 + y_temp_src - y_dest;
+ prect[i].x_mask = box[i].x1 + x_temp_mask - x_dest;
+ prect[i].y_mask = box[i].y1 + y_temp_mask - y_dest;
+ prect[i].x_dst = box[i].x1;
+ prect[i].y_dst = box[i].y1;
+ prect[i].width = box[i].x2 - box[i].x1;
+ prect[i].height = box[i].y2 - box[i].y1;
+ DEBUGF("dest %d %d \n", prect[i].x_dst, prect[i].y_dst);
+ }
+ ok = glamor_composite_with_shader(op, temp_src, temp_mask, dest,
+ temp_src_priv, temp_mask_priv,
+ dest_pixmap_priv,
+ box_cnt, prect, two_pass_ca);
+ if (!ok)
+ break;
+ nbox -= box_cnt;
+ box += box_cnt;
+ }
+
+ if (prect != rect)
+ free(prect);
+ out:
+ if (temp_src != source)
+ FreePicture(temp_src, 0);
+ if (temp_mask != mask)
+ FreePicture(temp_mask, 0);
+
+ return ok;
}
static Bool
_glamor_composite(CARD8 op,
- PicturePtr source,
- PicturePtr mask,
- PicturePtr dest,
- INT16 x_source,
- INT16 y_source,
- INT16 x_mask,
- INT16 y_mask,
- INT16 x_dest, INT16 y_dest,
- CARD16 width, CARD16 height, Bool fallback)
+ PicturePtr source,
+ PicturePtr mask,
+ PicturePtr dest,
+ INT16 x_source,
+ INT16 y_source,
+ INT16 x_mask,
+ INT16 y_mask,
+ INT16 x_dest, INT16 y_dest,
+ CARD16 width, CARD16 height, Bool fallback)
{
- ScreenPtr screen = dest->pDrawable->pScreen;
- glamor_pixmap_private *dest_pixmap_priv;
- glamor_pixmap_private *source_pixmap_priv =
- NULL, *mask_pixmap_priv = NULL;
- PixmapPtr dest_pixmap =
- glamor_get_drawable_pixmap(dest->pDrawable);
- PixmapPtr source_pixmap = NULL, mask_pixmap = NULL;
- glamor_screen_private *glamor_priv =
- glamor_get_screen_private(screen);
- Bool ret = TRUE;
- RegionRec region;
- BoxPtr extent;
- int nbox, ok = FALSE;
- PixmapPtr sub_dest_pixmap = NULL;
- PixmapPtr sub_source_pixmap = NULL;
- PixmapPtr sub_mask_pixmap = NULL;
- int dest_x_off, dest_y_off, saved_dest_x, saved_dest_y;
- int source_x_off, source_y_off, saved_source_x, saved_source_y;
- int mask_x_off, mask_y_off, saved_mask_x, saved_mask_y;
- DrawablePtr saved_dest_drawable;
- DrawablePtr saved_source_drawable;
- DrawablePtr saved_mask_drawable;
- int force_clip = 0;
- dest_pixmap_priv = glamor_get_pixmap_private(dest_pixmap);
-
- if (source->pDrawable) {
- source_pixmap = glamor_get_drawable_pixmap(source->pDrawable);
- source_pixmap_priv = glamor_get_pixmap_private(source_pixmap);
- if (source_pixmap_priv && source_pixmap_priv->type == GLAMOR_DRM_ONLY)
- goto fail;
- }
-
- if (mask && mask->pDrawable) {
- mask_pixmap = glamor_get_drawable_pixmap(mask->pDrawable);
- mask_pixmap_priv = glamor_get_pixmap_private(mask_pixmap);
- if (mask_pixmap_priv && mask_pixmap_priv->type == GLAMOR_DRM_ONLY)
- goto fail;
- }
-
- DEBUGF("source pixmap %p (%d %d) mask(%d %d) dest(%d %d) width %d height %d \n",
- source_pixmap, x_source, y_source, x_mask, y_mask, x_dest, y_dest, width, height);
-
- if (!GLAMOR_PIXMAP_PRIV_HAS_FBO(dest_pixmap_priv)) {
- goto fail;
- }
-
- if (op >= ARRAY_SIZE(composite_op_info))
- goto fail;
-
- if (mask && mask->componentAlpha) {
- if (op == PictOpAtop
- || op == PictOpAtopReverse
- || op == PictOpXor
- || op >= PictOpSaturate) {
- glamor_fallback
- ("glamor_composite(): component alpha op %x\n", op);
- goto fail;
- }
- }
-
- if ((source && source->filter >= PictFilterConvolution)
- || (mask && mask->filter >= PictFilterConvolution)) {
- glamor_fallback("glamor_composite(): unsupported filter\n");
- goto fail;
- }
-
- if (!miComputeCompositeRegion(&region,
- source, mask, dest,
- x_source + (source_pixmap ? source->pDrawable->x : 0),
- y_source + (source_pixmap ? source->pDrawable->y : 0),
- x_mask + (mask_pixmap ? mask->pDrawable->x : 0),
- y_mask + (mask_pixmap ? mask->pDrawable->y : 0),
- x_dest + dest->pDrawable->x,
- y_dest + dest->pDrawable->y,
- width,
- height)) {
- ret = TRUE;
- goto done;
- }
-
- nbox = REGION_NUM_RECTS(&region);
- DEBUGF("first clipped when compositing.\n");
- DEBUGRegionPrint(&region);
- extent = RegionExtents(&region);
- if (nbox == 0) {
- ret = TRUE;
- goto done;
- }
- /* If destination is not a large pixmap, but the region is larger
- * than texture size limitation, and source or mask is memory pixmap,
- * then there may be need to load a large memory pixmap to a
- * texture, and this is not permitted. Then we force to clip the
- * destination and make sure latter will not upload a large memory
- * pixmap. */
- if (!glamor_check_fbo_size(glamor_priv,
- extent->x2 - extent->x1, extent->y2 - extent->y1)
- && (dest_pixmap_priv->type != GLAMOR_TEXTURE_LARGE)
- && ((source_pixmap_priv
- && (source_pixmap_priv->type == GLAMOR_MEMORY || source->repeatType == RepeatPad))
- || (mask_pixmap_priv
- && (mask_pixmap_priv->type == GLAMOR_MEMORY || mask->repeatType == RepeatPad))
- || (!source_pixmap_priv
- && (source->pSourcePict->type != SourcePictTypeSolidFill))
- || (!mask_pixmap_priv && mask
- && mask->pSourcePict->type != SourcePictTypeSolidFill)))
- force_clip = 1;
-
- if (force_clip || dest_pixmap_priv->type == GLAMOR_TEXTURE_LARGE
- || (source_pixmap_priv
- && source_pixmap_priv->type == GLAMOR_TEXTURE_LARGE)
- || (mask_pixmap_priv
- && mask_pixmap_priv->type == GLAMOR_TEXTURE_LARGE))
- ok = glamor_composite_largepixmap_region(op,
- source, mask, dest,
- source_pixmap_priv,
- mask_pixmap_priv,
- dest_pixmap_priv,
- &region, force_clip,
- x_source, y_source,
- x_mask, y_mask,
- x_dest, y_dest,
- width, height);
- else
- ok = glamor_composite_clipped_region(op, source,
- mask, dest,
- source_pixmap_priv,
- mask_pixmap_priv,
- dest_pixmap_priv,
- &region,
- x_source, y_source,
- x_mask, y_mask,
- x_dest, y_dest);
-
- REGION_UNINIT(dest->pDrawable->pScreen, &region);
-
- if (ok)
- goto done;
-fail:
-
- if (!fallback
- && glamor_ddx_fallback_check_pixmap(&dest_pixmap->drawable)
- && (!source_pixmap
- || glamor_ddx_fallback_check_pixmap(&source_pixmap->drawable))
- && (!mask_pixmap
- || glamor_ddx_fallback_check_pixmap(&mask_pixmap->drawable))) {
- ret = FALSE;
- goto done;
- }
-
- glamor_fallback
- ("from picts %p:%p %dx%d / %p:%p %d x %d (%c,%c) to pict %p:%p %dx%d (%c)\n",
- source, source->pDrawable,
- source->pDrawable ? source->pDrawable->width : 0,
- source->pDrawable ? source->pDrawable->height : 0, mask,
- (!mask) ? NULL : mask->pDrawable, (!mask
- || !mask->pDrawable) ? 0 :
- mask->pDrawable->width, (!mask
- || !mask->
- pDrawable) ? 0 : mask->pDrawable->
- height, glamor_get_picture_location(source),
- glamor_get_picture_location(mask), dest, dest->pDrawable,
- dest->pDrawable->width, dest->pDrawable->height,
- glamor_get_picture_location(dest));
+ ScreenPtr screen = dest->pDrawable->pScreen;
+ glamor_pixmap_private *dest_pixmap_priv;
+ glamor_pixmap_private *source_pixmap_priv = NULL, *mask_pixmap_priv = NULL;
+ PixmapPtr dest_pixmap = glamor_get_drawable_pixmap(dest->pDrawable);
+ PixmapPtr source_pixmap = NULL, mask_pixmap = NULL;
+ glamor_screen_private *glamor_priv = glamor_get_screen_private(screen);
+ Bool ret = TRUE;
+ RegionRec region;
+ BoxPtr extent;
+ int nbox, ok = FALSE;
+ PixmapPtr sub_dest_pixmap = NULL;
+ PixmapPtr sub_source_pixmap = NULL;
+ PixmapPtr sub_mask_pixmap = NULL;
+ int dest_x_off, dest_y_off, saved_dest_x, saved_dest_y;
+ int source_x_off, source_y_off, saved_source_x, saved_source_y;
+ int mask_x_off, mask_y_off, saved_mask_x, saved_mask_y;
+ DrawablePtr saved_dest_drawable;
+ DrawablePtr saved_source_drawable;
+ DrawablePtr saved_mask_drawable;
+ int force_clip = 0;
+
+ dest_pixmap_priv = glamor_get_pixmap_private(dest_pixmap);
+
+ if (source->pDrawable) {
+ source_pixmap = glamor_get_drawable_pixmap(source->pDrawable);
+ source_pixmap_priv = glamor_get_pixmap_private(source_pixmap);
+ if (source_pixmap_priv && source_pixmap_priv->type == GLAMOR_DRM_ONLY)
+ goto fail;
+ }
+
+ if (mask && mask->pDrawable) {
+ mask_pixmap = glamor_get_drawable_pixmap(mask->pDrawable);
+ mask_pixmap_priv = glamor_get_pixmap_private(mask_pixmap);
+ if (mask_pixmap_priv && mask_pixmap_priv->type == GLAMOR_DRM_ONLY)
+ goto fail;
+ }
+
+ DEBUGF
+ ("source pixmap %p (%d %d) mask(%d %d) dest(%d %d) width %d height %d \n",
+ source_pixmap, x_source, y_source, x_mask, y_mask, x_dest, y_dest,
+ width, height);
+
+ if (!GLAMOR_PIXMAP_PRIV_HAS_FBO(dest_pixmap_priv)) {
+ goto fail;
+ }
+
+ if (op >= ARRAY_SIZE(composite_op_info))
+ goto fail;
+
+ if (mask && mask->componentAlpha) {
+ if (op == PictOpAtop
+ || op == PictOpAtopReverse
+ || op == PictOpXor || op >= PictOpSaturate) {
+ glamor_fallback("glamor_composite(): component alpha op %x\n", op);
+ goto fail;
+ }
+ }
+
+ if ((source && source->filter >= PictFilterConvolution)
+ || (mask && mask->filter >= PictFilterConvolution)) {
+ glamor_fallback("glamor_composite(): unsupported filter\n");
+ goto fail;
+ }
+
+ if (!miComputeCompositeRegion(&region,
+ source, mask, dest,
+ x_source +
+ (source_pixmap ? source->pDrawable->x : 0),
+ y_source +
+ (source_pixmap ? source->pDrawable->y : 0),
+ x_mask +
+ (mask_pixmap ? mask->pDrawable->x : 0),
+ y_mask +
+ (mask_pixmap ? mask->pDrawable->y : 0),
+ x_dest + dest->pDrawable->x,
+ y_dest + dest->pDrawable->y, width, height)) {
+ ret = TRUE;
+ goto done;
+ }
+
+ nbox = REGION_NUM_RECTS(&region);
+ DEBUGF("first clipped when compositing.\n");
+ DEBUGRegionPrint(&region);
+ extent = RegionExtents(&region);
+ if (nbox == 0) {
+ ret = TRUE;
+ goto done;
+ }
+ /* If destination is not a large pixmap, but the region is larger
+ * than texture size limitation, and source or mask is memory pixmap,
+ * then there may be need to load a large memory pixmap to a
+ * texture, and this is not permitted. Then we force to clip the
+ * destination and make sure latter will not upload a large memory
+ * pixmap. */
+ if (!glamor_check_fbo_size(glamor_priv,
+ extent->x2 - extent->x1, extent->y2 - extent->y1)
+ && (dest_pixmap_priv->type != GLAMOR_TEXTURE_LARGE)
+ && ((source_pixmap_priv
+ && (source_pixmap_priv->type == GLAMOR_MEMORY ||
+ source->repeatType == RepeatPad))
+ || (mask_pixmap_priv &&
+ (mask_pixmap_priv->type == GLAMOR_MEMORY ||
+ mask->repeatType == RepeatPad))
+ || (!source_pixmap_priv &&
+ (source->pSourcePict->type != SourcePictTypeSolidFill))
+ || (!mask_pixmap_priv && mask &&
+ mask->pSourcePict->type != SourcePictTypeSolidFill)))
+ force_clip = 1;
+
+ if (force_clip || dest_pixmap_priv->type == GLAMOR_TEXTURE_LARGE
+ || (source_pixmap_priv
+ && source_pixmap_priv->type == GLAMOR_TEXTURE_LARGE)
+ || (mask_pixmap_priv && mask_pixmap_priv->type == GLAMOR_TEXTURE_LARGE))
+ ok = glamor_composite_largepixmap_region(op,
+ source, mask, dest,
+ source_pixmap_priv,
+ mask_pixmap_priv,
+ dest_pixmap_priv,
+ &region, force_clip,
+ x_source, y_source,
+ x_mask, y_mask,
+ x_dest, y_dest, width, height);
+ else
+ ok = glamor_composite_clipped_region(op, source,
+ mask, dest,
+ source_pixmap_priv,
+ mask_pixmap_priv,
+ dest_pixmap_priv,
+ &region,
+ x_source, y_source,
+ x_mask, y_mask, x_dest, y_dest);
+
+ REGION_UNINIT(dest->pDrawable->pScreen, &region);
+
+ if (ok)
+ goto done;
+ fail:
+
+ if (!fallback && glamor_ddx_fallback_check_pixmap(&dest_pixmap->drawable)
+ && (!source_pixmap
+ || glamor_ddx_fallback_check_pixmap(&source_pixmap->drawable))
+ && (!mask_pixmap
+ || glamor_ddx_fallback_check_pixmap(&mask_pixmap->drawable))) {
+ ret = FALSE;
+ goto done;
+ }
+
+ glamor_fallback
+ ("from picts %p:%p %dx%d / %p:%p %d x %d (%c,%c) to pict %p:%p %dx%d (%c)\n",
+ source, source->pDrawable,
+ source->pDrawable ? source->pDrawable->width : 0,
+ source->pDrawable ? source->pDrawable->height : 0, mask,
+ (!mask) ? NULL : mask->pDrawable, (!mask
+ || !mask->pDrawable) ? 0 :
+ mask->pDrawable->width, (!mask
+ || !mask->pDrawable) ? 0 : mask->
+ pDrawable->height, glamor_get_picture_location(source),
+ glamor_get_picture_location(mask), dest, dest->pDrawable,
+ dest->pDrawable->width, dest->pDrawable->height,
+ glamor_get_picture_location(dest));
#define GET_SUB_PICTURE(p, access) do { \
glamor_get_drawable_deltas(p->pDrawable, p ##_pixmap, \
@@ -1897,32 +1901,28 @@ fail:
x_ ##p = 0; \
y_ ##p = 0; \
} } while(0)
- GET_SUB_PICTURE(dest, GLAMOR_ACCESS_RW);
- if (source->pDrawable && !source->transform)
- GET_SUB_PICTURE(source, GLAMOR_ACCESS_RO);
- if (mask && mask->pDrawable && !mask->transform)
- GET_SUB_PICTURE(mask, GLAMOR_ACCESS_RO);
-
- if (glamor_prepare_access_picture(dest, GLAMOR_ACCESS_RW)) {
- if (source_pixmap == dest_pixmap || glamor_prepare_access_picture
- (source, GLAMOR_ACCESS_RO)) {
- if (!mask
- || glamor_prepare_access_picture(mask,
- GLAMOR_ACCESS_RO))
- {
- fbComposite(op,
- source, mask, dest,
- x_source, y_source,
- x_mask, y_mask, x_dest,
- y_dest, width, height);
- if (mask)
- glamor_finish_access_picture(mask, GLAMOR_ACCESS_RO);
- }
- if (source_pixmap != dest_pixmap)
- glamor_finish_access_picture(source, GLAMOR_ACCESS_RO);
- }
- glamor_finish_access_picture(dest, GLAMOR_ACCESS_RW);
- }
+ GET_SUB_PICTURE(dest, GLAMOR_ACCESS_RW);
+ if (source->pDrawable && !source->transform)
+ GET_SUB_PICTURE(source, GLAMOR_ACCESS_RO);
+ if (mask && mask->pDrawable && !mask->transform)
+ GET_SUB_PICTURE(mask, GLAMOR_ACCESS_RO);
+
+ if (glamor_prepare_access_picture(dest, GLAMOR_ACCESS_RW)) {
+ if (source_pixmap == dest_pixmap || glamor_prepare_access_picture
+ (source, GLAMOR_ACCESS_RO)) {
+ if (!mask || glamor_prepare_access_picture(mask, GLAMOR_ACCESS_RO)) {
+ fbComposite(op,
+ source, mask, dest,
+ x_source, y_source,
+ x_mask, y_mask, x_dest, y_dest, width, height);
+ if (mask)
+ glamor_finish_access_picture(mask, GLAMOR_ACCESS_RO);
+ }
+ if (source_pixmap != dest_pixmap)
+ glamor_finish_access_picture(source, GLAMOR_ACCESS_RO);
+ }
+ glamor_finish_access_picture(dest, GLAMOR_ACCESS_RW);
+ }
#define PUT_SUB_PICTURE(p, access) do { \
if (sub_ ##p ##_pixmap != NULL) { \
@@ -1938,198 +1938,196 @@ fail:
y_ ##p + p ##_y_off + p->pDrawable->y, \
width, height, access); \
}} while(0)
- if (mask && mask->pDrawable)
- PUT_SUB_PICTURE(mask, GLAMOR_ACCESS_RO);
- if (source->pDrawable)
- PUT_SUB_PICTURE(source, GLAMOR_ACCESS_RO);
- PUT_SUB_PICTURE(dest, GLAMOR_ACCESS_RW);
- done:
- return ret;
+ if (mask && mask->pDrawable)
+ PUT_SUB_PICTURE(mask, GLAMOR_ACCESS_RO);
+ if (source->pDrawable)
+ PUT_SUB_PICTURE(source, GLAMOR_ACCESS_RO);
+ PUT_SUB_PICTURE(dest, GLAMOR_ACCESS_RW);
+ done:
+ return ret;
}
void
glamor_composite(CARD8 op,
- PicturePtr source,
- PicturePtr mask,
- PicturePtr dest,
- INT16 x_source,
- INT16 y_source,
- INT16 x_mask,
- INT16 y_mask,
- INT16 x_dest, INT16 y_dest,
- CARD16 width, CARD16 height)
+ PicturePtr source,
+ PicturePtr mask,
+ PicturePtr dest,
+ INT16 x_source,
+ INT16 y_source,
+ INT16 x_mask,
+ INT16 y_mask,
+ INT16 x_dest, INT16 y_dest, CARD16 width, CARD16 height)
{
- _glamor_composite(op, source, mask, dest, x_source, y_source,
- x_mask, y_mask, x_dest, y_dest, width, height,
- TRUE);
+ _glamor_composite(op, source, mask, dest, x_source, y_source,
+ x_mask, y_mask, x_dest, y_dest, width, height, TRUE);
}
Bool
glamor_composite_nf(CARD8 op,
- PicturePtr source,
- PicturePtr mask,
- PicturePtr dest,
- INT16 x_source,
- INT16 y_source,
- INT16 x_mask,
- INT16 y_mask,
- INT16 x_dest, INT16 y_dest,
- CARD16 width, CARD16 height)
+ PicturePtr source,
+ PicturePtr mask,
+ PicturePtr dest,
+ INT16 x_source,
+ INT16 y_source,
+ INT16 x_mask,
+ INT16 y_mask,
+ INT16 x_dest, INT16 y_dest, CARD16 width, CARD16 height)
{
- return _glamor_composite(op, source, mask, dest, x_source, y_source,
- x_mask, y_mask, x_dest, y_dest, width, height,
- FALSE);
+ return _glamor_composite(op, source, mask, dest, x_source, y_source,
+ x_mask, y_mask, x_dest, y_dest, width, height,
+ FALSE);
}
static void
glamor_get_src_rect_extent(int nrect,
- glamor_composite_rect_t *rects,
- BoxPtr extent)
+ glamor_composite_rect_t *rects, BoxPtr extent)
{
- extent->x1 = MAXSHORT;
- extent->y1 = MAXSHORT;
- extent->x2 = MINSHORT;
- extent->y2 = MINSHORT;
-
- while(nrect--) {
- if (extent->x1 > rects->x_src)
- extent->x1 = rects->x_src;
- if (extent->y1 > rects->y_src)
- extent->y1 = rects->y_src;
- if (extent->x2 < rects->x_src + rects->width)
- extent->x2 = rects->x_src + rects->width;
- if (extent->y2 < rects->y_src + rects->height)
- extent->y2 = rects->y_src + rects->height;
- rects++;
- }
+ extent->x1 = MAXSHORT;
+ extent->y1 = MAXSHORT;
+ extent->x2 = MINSHORT;
+ extent->y2 = MINSHORT;
+
+ while (nrect--) {
+ if (extent->x1 > rects->x_src)
+ extent->x1 = rects->x_src;
+ if (extent->y1 > rects->y_src)
+ extent->y1 = rects->y_src;
+ if (extent->x2 < rects->x_src + rects->width)
+ extent->x2 = rects->x_src + rects->width;
+ if (extent->y2 < rects->y_src + rects->height)
+ extent->y2 = rects->y_src + rects->height;
+ rects++;
+ }
}
static void
glamor_composite_src_rect_translate(int nrect,
- glamor_composite_rect_t *rects,
- int x, int y)
+ glamor_composite_rect_t *rects,
+ int x, int y)
{
- while(nrect--) {
- rects->x_src += x;
- rects->y_src += y;
- rects++;
- }
+ while (nrect--) {
+ rects->x_src += x;
+ rects->y_src += y;
+ rects++;
+ }
}
void
glamor_composite_glyph_rects(CARD8 op,
- PicturePtr src, PicturePtr mask, PicturePtr dst,
- int nrect, glamor_composite_rect_t * rects)
+ PicturePtr src, PicturePtr mask, PicturePtr dst,
+ int nrect, glamor_composite_rect_t *rects)
{
- int n;
- PicturePtr temp_src = NULL;
- glamor_composite_rect_t *r;
-
- ValidatePicture(src);
- ValidatePicture(dst);
- if (!(glamor_is_large_picture(src)
- || (mask && glamor_is_large_picture(mask))
- || glamor_is_large_picture(dst))) {
- glamor_pixmap_private *src_pixmap_priv = NULL;
- glamor_pixmap_private *mask_pixmap_priv = NULL;
- glamor_pixmap_private *dst_pixmap_priv;
- glamor_pixmap_private *temp_src_priv = NULL;
- BoxRec src_extent;
-
- dst_pixmap_priv = glamor_get_pixmap_private
- (glamor_get_drawable_pixmap(dst->pDrawable));
-
- if (mask && mask->pDrawable)
- mask_pixmap_priv = glamor_get_pixmap_private
- (glamor_get_drawable_pixmap(mask->pDrawable));
- if (src->pDrawable)
- src_pixmap_priv = glamor_get_pixmap_private
- (glamor_get_drawable_pixmap(src->pDrawable));
-
- if (!src->pDrawable
- && (src->pSourcePict->type != SourcePictTypeSolidFill)) {
- glamor_get_src_rect_extent(nrect, rects, &src_extent);
- temp_src = glamor_convert_gradient_picture(dst->pDrawable->pScreen,
- src,
- src_extent.x1, src_extent.y1,
- src_extent.x2 - src_extent.x1,
- src_extent.y2 - src_extent.y1);
- if (!temp_src)
- goto fallback;
-
- temp_src_priv = glamor_get_pixmap_private
- ((PixmapPtr)(temp_src->pDrawable));
- glamor_composite_src_rect_translate(nrect, rects,
- -src_extent.x1, -src_extent.y1);
- } else {
- temp_src = src;
- temp_src_priv = src_pixmap_priv;
- }
-
- if (mask && mask->componentAlpha) {
- if (op == PictOpOver) {
- if (glamor_composite_with_shader(PictOpOutReverse,
- temp_src, mask, dst, temp_src_priv,
- mask_pixmap_priv, dst_pixmap_priv, nrect, rects,
- TRUE))
- goto done;
- }
- } else {
- if (glamor_composite_with_shader(op, temp_src, mask, dst, temp_src_priv,
- mask_pixmap_priv, dst_pixmap_priv, nrect, rects, FALSE))
- goto done;
- }
- }
-fallback:
- n = nrect;
- r = rects;
-
- while (n--) {
- CompositePicture(op,
- temp_src ? temp_src : src,
- mask,
- dst,
- r->x_src, r->y_src,
- r->x_mask, r->y_mask,
- r->x_dst, r->y_dst, r->width, r->height);
- r++;
- }
-
-done:
- if (temp_src && temp_src != src)
- FreePicture(temp_src, 0);
+ int n;
+ PicturePtr temp_src = NULL;
+ glamor_composite_rect_t *r;
+
+ ValidatePicture(src);
+ ValidatePicture(dst);
+ if (!(glamor_is_large_picture(src)
+ || (mask && glamor_is_large_picture(mask))
+ || glamor_is_large_picture(dst))) {
+ glamor_pixmap_private *src_pixmap_priv = NULL;
+ glamor_pixmap_private *mask_pixmap_priv = NULL;
+ glamor_pixmap_private *dst_pixmap_priv;
+ glamor_pixmap_private *temp_src_priv = NULL;
+ BoxRec src_extent;
+
+ dst_pixmap_priv = glamor_get_pixmap_private
+ (glamor_get_drawable_pixmap(dst->pDrawable));
+
+ if (mask && mask->pDrawable)
+ mask_pixmap_priv = glamor_get_pixmap_private
+ (glamor_get_drawable_pixmap(mask->pDrawable));
+ if (src->pDrawable)
+ src_pixmap_priv = glamor_get_pixmap_private
+ (glamor_get_drawable_pixmap(src->pDrawable));
+
+ if (!src->pDrawable
+ && (src->pSourcePict->type != SourcePictTypeSolidFill)) {
+ glamor_get_src_rect_extent(nrect, rects, &src_extent);
+ temp_src = glamor_convert_gradient_picture(dst->pDrawable->pScreen,
+ src,
+ src_extent.x1,
+ src_extent.y1,
+ src_extent.x2 -
+ src_extent.x1,
+ src_extent.y2 -
+ src_extent.y1);
+ if (!temp_src)
+ goto fallback;
+
+ temp_src_priv = glamor_get_pixmap_private
+ ((PixmapPtr) (temp_src->pDrawable));
+ glamor_composite_src_rect_translate(nrect, rects,
+ -src_extent.x1, -src_extent.y1);
+ }
+ else {
+ temp_src = src;
+ temp_src_priv = src_pixmap_priv;
+ }
+
+ if (mask && mask->componentAlpha) {
+ if (op == PictOpOver) {
+ if (glamor_composite_with_shader(PictOpOutReverse,
+ temp_src, mask, dst,
+ temp_src_priv,
+ mask_pixmap_priv,
+ dst_pixmap_priv, nrect, rects,
+ TRUE))
+ goto done;
+ }
+ }
+ else {
+ if (glamor_composite_with_shader
+ (op, temp_src, mask, dst, temp_src_priv, mask_pixmap_priv,
+ dst_pixmap_priv, nrect, rects, FALSE))
+ goto done;
+ }
+ }
+ fallback:
+ n = nrect;
+ r = rects;
+
+ while (n--) {
+ CompositePicture(op,
+ temp_src ? temp_src : src,
+ mask,
+ dst,
+ r->x_src, r->y_src,
+ r->x_mask, r->y_mask,
+ r->x_dst, r->y_dst, r->width, r->height);
+ r++;
+ }
+
+ done:
+ if (temp_src && temp_src != src)
+ FreePicture(temp_src, 0);
}
static Bool
-_glamor_composite_rects (CARD8 op,
- PicturePtr pDst,
- xRenderColor *color,
- int nRect,
- xRectangle *rects,
- Bool fallback)
+_glamor_composite_rects(CARD8 op,
+ PicturePtr pDst,
+ xRenderColor *color,
+ int nRect, xRectangle *rects, Bool fallback)
{
- miCompositeRects(op, pDst, color, nRect, rects);
- return TRUE;
+ miCompositeRects(op, pDst, color, nRect, rects);
+ return TRUE;
}
void
-glamor_composite_rects (CARD8 op,
- PicturePtr pDst,
- xRenderColor *color,
- int nRect,
- xRectangle *rects)
+glamor_composite_rects(CARD8 op,
+ PicturePtr pDst,
+ xRenderColor *color, int nRect, xRectangle *rects)
{
- _glamor_composite_rects(op, pDst, color, nRect, rects, TRUE);
+ _glamor_composite_rects(op, pDst, color, nRect, rects, TRUE);
}
Bool
-glamor_composite_rects_nf (CARD8 op,
- PicturePtr pDst,
- xRenderColor *color,
- int nRect,
- xRectangle *rects)
+glamor_composite_rects_nf(CARD8 op,
+ PicturePtr pDst,
+ xRenderColor *color, int nRect, xRectangle *rects)
{
- return _glamor_composite_rects(op, pDst, color, nRect, rects, FALSE);
+ return _glamor_composite_rects(op, pDst, color, nRect, rects, FALSE);
}
-#endif /* RENDER */
+#endif /* RENDER */
diff --git a/xorg-server/glamor/glamor_setspans.c b/xorg-server/glamor/glamor_setspans.c
index 3d447b606..22fe88ce5 100644
--- a/xorg-server/glamor/glamor_setspans.c
+++ b/xorg-server/glamor/glamor_setspans.c
@@ -30,82 +30,83 @@
static Bool
_glamor_set_spans(DrawablePtr drawable, GCPtr gc, char *src,
- DDXPointPtr points, int *widths, int numPoints, int sorted,
- Bool fallback)
+ DDXPointPtr points, int *widths, int numPoints, int sorted,
+ Bool fallback)
{
- PixmapPtr dest_pixmap = glamor_get_drawable_pixmap(drawable);
- glamor_pixmap_private *dest_pixmap_priv;
- int i;
- uint8_t *drawpixels_src = (uint8_t *) src;
- RegionPtr clip = fbGetCompositeClip(gc);
- BoxRec *pbox;
- int x_off, y_off;
- Bool ret = FALSE;
+ PixmapPtr dest_pixmap = glamor_get_drawable_pixmap(drawable);
+ glamor_pixmap_private *dest_pixmap_priv;
+ int i;
+ uint8_t *drawpixels_src = (uint8_t *) src;
+ RegionPtr clip = fbGetCompositeClip(gc);
+ BoxRec *pbox;
+ int x_off, y_off;
+ Bool ret = FALSE;
- dest_pixmap_priv = glamor_get_pixmap_private(dest_pixmap);
- if (!GLAMOR_PIXMAP_PRIV_HAS_FBO(dest_pixmap_priv)) {
- glamor_fallback("pixmap has no fbo.\n");
- goto fail;
- }
+ dest_pixmap_priv = glamor_get_pixmap_private(dest_pixmap);
+ if (!GLAMOR_PIXMAP_PRIV_HAS_FBO(dest_pixmap_priv)) {
+ glamor_fallback("pixmap has no fbo.\n");
+ goto fail;
+ }
- /* XXX Shall we set alu here? */
- if (!glamor_set_planemask(dest_pixmap, gc->planemask))
- goto fail;
+ /* XXX Shall we set alu here? */
+ if (!glamor_set_planemask(dest_pixmap, gc->planemask))
+ goto fail;
- glamor_get_drawable_deltas(drawable, dest_pixmap, &x_off, &y_off);
- for (i = 0; i < numPoints; i++) {
+ glamor_get_drawable_deltas(drawable, dest_pixmap, &x_off, &y_off);
+ for (i = 0; i < numPoints; i++) {
- int n = REGION_NUM_RECTS(clip);
- pbox = REGION_RECTS(clip);
- while (n--) {
- int x1 = points[i].x;
- int x2 = x1 + widths[i];
- int y1 = points[i].y;
+ int n = REGION_NUM_RECTS(clip);
- if (pbox->y1 > points[i].y || pbox->y2 < points[i].y)
- break;
- x1 = x1 > pbox->x1 ? x1 : pbox->x1;
- x2 = x2 < pbox->x2 ? x2 : pbox->x2;
- if (x1 >= x2)
- continue;
- glamor_upload_sub_pixmap_to_texture(dest_pixmap, x1 + x_off, y1 + y_off, x2 - x1, 1,
- PixmapBytePad(widths[i], drawable->depth),
- drawpixels_src, 0);
- }
- drawpixels_src += PixmapBytePad(widths[i], drawable->depth);
- }
- ret = TRUE;
- goto done;
+ pbox = REGION_RECTS(clip);
+ while (n--) {
+ int x1 = points[i].x;
+ int x2 = x1 + widths[i];
+ int y1 = points[i].y;
-fail:
- if (!fallback
- && glamor_ddx_fallback_check_pixmap(drawable))
- goto done;
+ if (pbox->y1 > points[i].y || pbox->y2 < points[i].y)
+ break;
+ x1 = x1 > pbox->x1 ? x1 : pbox->x1;
+ x2 = x2 < pbox->x2 ? x2 : pbox->x2;
+ if (x1 >= x2)
+ continue;
+ glamor_upload_sub_pixmap_to_texture(dest_pixmap, x1 + x_off,
+ y1 + y_off, x2 - x1, 1,
+ PixmapBytePad(widths[i],
+ drawable->depth),
+ drawpixels_src, 0);
+ }
+ drawpixels_src += PixmapBytePad(widths[i], drawable->depth);
+ }
+ ret = TRUE;
+ goto done;
- glamor_fallback("to %p (%c)\n",
- drawable, glamor_get_drawable_location(drawable));
- if (glamor_prepare_access(drawable, GLAMOR_ACCESS_RW)) {
- fbSetSpans(drawable, gc, src, points, widths, numPoints, sorted);
- glamor_finish_access(drawable, GLAMOR_ACCESS_RW);
- }
- ret = TRUE;
+ fail:
+ if (!fallback && glamor_ddx_fallback_check_pixmap(drawable))
+ goto done;
-done:
- return ret;
+ glamor_fallback("to %p (%c)\n",
+ drawable, glamor_get_drawable_location(drawable));
+ if (glamor_prepare_access(drawable, GLAMOR_ACCESS_RW)) {
+ fbSetSpans(drawable, gc, src, points, widths, numPoints, sorted);
+ glamor_finish_access(drawable, GLAMOR_ACCESS_RW);
+ }
+ ret = TRUE;
+
+ done:
+ return ret;
}
void
glamor_set_spans(DrawablePtr drawable, GCPtr gc, char *src,
- DDXPointPtr points, int *widths, int n, int sorted)
+ DDXPointPtr points, int *widths, int n, int sorted)
{
- _glamor_set_spans(drawable, gc, src, points,
- widths, n, sorted, TRUE);
+ _glamor_set_spans(drawable, gc, src, points, widths, n, sorted, TRUE);
}
Bool
glamor_set_spans_nf(DrawablePtr drawable, GCPtr gc, char *src,
- DDXPointPtr points, int *widths, int n, int sorted)
+ DDXPointPtr points, int *widths, int n, int sorted)
{
- return _glamor_set_spans(drawable, gc, src, points,
- widths, n, sorted, FALSE);
+ return _glamor_set_spans(drawable, gc, src, points,
+ widths, n, sorted, FALSE);
}
diff --git a/xorg-server/glamor/glamor_tile.c b/xorg-server/glamor/glamor_tile.c
index 60486cfc0..9c8e521b9 100644
--- a/xorg-server/glamor/glamor_tile.c
+++ b/xorg-server/glamor/glamor_tile.c
@@ -36,290 +36,276 @@
void
glamor_init_tile_shader(ScreenPtr screen)
{
- glamor_screen_private *glamor_priv;
- glamor_gl_dispatch *dispatch;
- const char *tile_vs =
- "attribute vec4 v_position;\n"
- "attribute vec4 v_texcoord0;\n"
- "varying vec2 tile_texture;\n"
- "void main()\n"
- "{\n"
- " gl_Position = v_position;\n"
- " tile_texture = v_texcoord0.xy;\n" "}\n";
- const char *tile_fs =
- GLAMOR_DEFAULT_PRECISION
- "varying vec2 tile_texture;\n"
- "uniform sampler2D sampler;\n"
- "uniform vec2 wh;"
- "void main()\n"
- "{\n"
- " vec2 rel_tex;"
- " rel_tex = tile_texture * wh; \n"
- " rel_tex = floor(rel_tex) + (fract(rel_tex) / wh); \n"
- " gl_FragColor = texture2D(sampler, rel_tex);\n"
- "}\n";
- GLint fs_prog, vs_prog;
- GLint sampler_uniform_location;
-
- glamor_priv = glamor_get_screen_private(screen);
- dispatch = glamor_get_dispatch(glamor_priv);
- glamor_priv->tile_prog = dispatch->glCreateProgram();
- vs_prog = glamor_compile_glsl_prog(dispatch, GL_VERTEX_SHADER, tile_vs);
- fs_prog = glamor_compile_glsl_prog(dispatch, GL_FRAGMENT_SHADER,
- tile_fs);
- dispatch->glAttachShader(glamor_priv->tile_prog, vs_prog);
- dispatch->glAttachShader(glamor_priv->tile_prog, fs_prog);
-
- dispatch->glBindAttribLocation(glamor_priv->tile_prog,
- GLAMOR_VERTEX_POS, "v_position");
- dispatch->glBindAttribLocation(glamor_priv->tile_prog,
- GLAMOR_VERTEX_SOURCE,
- "v_texcoord0");
- glamor_link_glsl_prog(dispatch, glamor_priv->tile_prog);
-
- sampler_uniform_location =
- dispatch->glGetUniformLocation(glamor_priv->tile_prog,
- "sampler");
- dispatch->glUseProgram(glamor_priv->tile_prog);
- dispatch->glUniform1i(sampler_uniform_location, 0);
-
- glamor_priv->tile_wh =
- dispatch->glGetUniformLocation(glamor_priv->tile_prog,
- "wh");
- dispatch->glUseProgram(0);
- glamor_put_dispatch(glamor_priv);
+ glamor_screen_private *glamor_priv;
+ glamor_gl_dispatch *dispatch;
+ const char *tile_vs =
+ "attribute vec4 v_position;\n"
+ "attribute vec4 v_texcoord0;\n"
+ "varying vec2 tile_texture;\n"
+ "void main()\n"
+ "{\n"
+ " gl_Position = v_position;\n"
+ " tile_texture = v_texcoord0.xy;\n"
+ "}\n";
+ const char *tile_fs =
+ GLAMOR_DEFAULT_PRECISION
+ "varying vec2 tile_texture;\n"
+ "uniform sampler2D sampler;\n"
+ "uniform vec2 wh;"
+ "void main()\n"
+ "{\n"
+ " vec2 rel_tex;"
+ " rel_tex = tile_texture * wh; \n"
+ " rel_tex = floor(rel_tex) + (fract(rel_tex) / wh); \n"
+ " gl_FragColor = texture2D(sampler, rel_tex);\n"
+ "}\n";
+ GLint fs_prog, vs_prog;
+ GLint sampler_uniform_location;
+
+ glamor_priv = glamor_get_screen_private(screen);
+ dispatch = glamor_get_dispatch(glamor_priv);
+ glamor_priv->tile_prog = dispatch->glCreateProgram();
+ vs_prog = glamor_compile_glsl_prog(dispatch, GL_VERTEX_SHADER, tile_vs);
+ fs_prog = glamor_compile_glsl_prog(dispatch, GL_FRAGMENT_SHADER, tile_fs);
+ dispatch->glAttachShader(glamor_priv->tile_prog, vs_prog);
+ dispatch->glAttachShader(glamor_priv->tile_prog, fs_prog);
+
+ dispatch->glBindAttribLocation(glamor_priv->tile_prog,
+ GLAMOR_VERTEX_POS, "v_position");
+ dispatch->glBindAttribLocation(glamor_priv->tile_prog,
+ GLAMOR_VERTEX_SOURCE, "v_texcoord0");
+ glamor_link_glsl_prog(dispatch, glamor_priv->tile_prog);
+
+ sampler_uniform_location =
+ dispatch->glGetUniformLocation(glamor_priv->tile_prog, "sampler");
+ dispatch->glUseProgram(glamor_priv->tile_prog);
+ dispatch->glUniform1i(sampler_uniform_location, 0);
+
+ glamor_priv->tile_wh =
+ dispatch->glGetUniformLocation(glamor_priv->tile_prog, "wh");
+ dispatch->glUseProgram(0);
+ glamor_put_dispatch(glamor_priv);
}
void
glamor_fini_tile_shader(ScreenPtr screen)
{
- glamor_screen_private *glamor_priv;
- glamor_gl_dispatch *dispatch;
+ glamor_screen_private *glamor_priv;
+ glamor_gl_dispatch *dispatch;
- glamor_priv = glamor_get_screen_private(screen);
- dispatch = glamor_get_dispatch(glamor_priv);
- dispatch->glDeleteProgram(glamor_priv->tile_prog);
- glamor_put_dispatch(glamor_priv);
+ glamor_priv = glamor_get_screen_private(screen);
+ dispatch = glamor_get_dispatch(glamor_priv);
+ dispatch->glDeleteProgram(glamor_priv->tile_prog);
+ glamor_put_dispatch(glamor_priv);
}
static void
_glamor_tile(PixmapPtr pixmap, PixmapPtr tile,
- int x, int y, int width, int height,
- int tile_x, int tile_y)
+ int x, int y, int width, int height, int tile_x, int tile_y)
{
- ScreenPtr screen = pixmap->drawable.pScreen;
- glamor_screen_private *glamor_priv =
- glamor_get_screen_private(screen);
- glamor_gl_dispatch *dispatch;
- int x1 = x;
- int x2 = x + width;
- int y1 = y;
- int y2 = y + height;
- int tile_x1 = tile_x;
- int tile_x2 = tile_x + width;
- int tile_y1 = tile_y;
- int tile_y2 = tile_y + height;
- float vertices[8];
- float source_texcoords[8];
- GLfloat dst_xscale, dst_yscale, src_xscale, src_yscale;
- glamor_pixmap_private *src_pixmap_priv;
- glamor_pixmap_private *dst_pixmap_priv;
- float wh[4];
- src_pixmap_priv = glamor_get_pixmap_private(tile);
- dst_pixmap_priv = glamor_get_pixmap_private(pixmap);
-
- glamor_set_destination_pixmap_priv_nc(dst_pixmap_priv);
- pixmap_priv_get_dest_scale(dst_pixmap_priv, &dst_xscale, &dst_yscale);
- pixmap_priv_get_scale(src_pixmap_priv, &src_xscale,
- &src_yscale);
- dispatch = glamor_get_dispatch(glamor_priv);
- dispatch->glUseProgram(glamor_priv->tile_prog);
-
- glamor_pixmap_fbo_fix_wh_ratio(wh, src_pixmap_priv);
- dispatch->glUniform2fv(glamor_priv->tile_wh, 1, wh);
- dispatch->glActiveTexture(GL_TEXTURE0);
- dispatch->glBindTexture(GL_TEXTURE_2D,
- src_pixmap_priv->base.fbo->tex);
- dispatch->glTexParameteri(GL_TEXTURE_2D,
- GL_TEXTURE_MIN_FILTER,
- GL_NEAREST);
- dispatch->glTexParameteri(GL_TEXTURE_2D,
- GL_TEXTURE_MAG_FILTER,
- GL_NEAREST);
- dispatch->glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T,
- GL_REPEAT);
- dispatch->glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S,
- GL_REPEAT);
+ ScreenPtr screen = pixmap->drawable.pScreen;
+ glamor_screen_private *glamor_priv = glamor_get_screen_private(screen);
+ glamor_gl_dispatch *dispatch;
+ int x1 = x;
+ int x2 = x + width;
+ int y1 = y;
+ int y2 = y + height;
+ int tile_x1 = tile_x;
+ int tile_x2 = tile_x + width;
+ int tile_y1 = tile_y;
+ int tile_y2 = tile_y + height;
+ float vertices[8];
+ float source_texcoords[8];
+ GLfloat dst_xscale, dst_yscale, src_xscale, src_yscale;
+ glamor_pixmap_private *src_pixmap_priv;
+ glamor_pixmap_private *dst_pixmap_priv;
+ float wh[4];
+
+ src_pixmap_priv = glamor_get_pixmap_private(tile);
+ dst_pixmap_priv = glamor_get_pixmap_private(pixmap);
+
+ glamor_set_destination_pixmap_priv_nc(dst_pixmap_priv);
+ pixmap_priv_get_dest_scale(dst_pixmap_priv, &dst_xscale, &dst_yscale);
+ pixmap_priv_get_scale(src_pixmap_priv, &src_xscale, &src_yscale);
+ dispatch = glamor_get_dispatch(glamor_priv);
+ dispatch->glUseProgram(glamor_priv->tile_prog);
+
+ glamor_pixmap_fbo_fix_wh_ratio(wh, src_pixmap_priv);
+ dispatch->glUniform2fv(glamor_priv->tile_wh, 1, wh);
+ dispatch->glActiveTexture(GL_TEXTURE0);
+ dispatch->glBindTexture(GL_TEXTURE_2D, src_pixmap_priv->base.fbo->tex);
+ dispatch->glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST);
+ dispatch->glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST);
+ dispatch->glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_REPEAT);
+ dispatch->glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_REPEAT);
#ifndef GLAMOR_GLES2
- dispatch->glEnable(GL_TEXTURE_2D);
+ dispatch->glEnable(GL_TEXTURE_2D);
#endif
- glamor_set_repeat_normalize_tcoords
- (src_pixmap_priv, RepeatNormal,
- src_xscale, src_yscale,
- tile_x1, tile_y1,
- tile_x2, tile_y2,
- glamor_priv->yInverted,
- source_texcoords);
-
- dispatch->glVertexAttribPointer(GLAMOR_VERTEX_SOURCE, 2,
- GL_FLOAT, GL_FALSE,
- 2 * sizeof(float),
- source_texcoords);
- dispatch->glEnableVertexAttribArray(GLAMOR_VERTEX_SOURCE);
-
- glamor_set_normalize_vcoords(dst_pixmap_priv, dst_xscale, dst_yscale,
- x1, y1,
- x2, y2,
- glamor_priv->yInverted, vertices);
-
- dispatch->glVertexAttribPointer(GLAMOR_VERTEX_POS, 2, GL_FLOAT,
- GL_FALSE, 2 * sizeof(float),
- vertices);
- dispatch->glEnableVertexAttribArray(GLAMOR_VERTEX_POS);
- dispatch->glDrawArrays(GL_TRIANGLE_FAN, 0, 4);
-
- dispatch->glDisableVertexAttribArray(GLAMOR_VERTEX_SOURCE);
+ glamor_set_repeat_normalize_tcoords
+ (src_pixmap_priv, RepeatNormal,
+ src_xscale, src_yscale,
+ tile_x1, tile_y1,
+ tile_x2, tile_y2, glamor_priv->yInverted, source_texcoords);
+
+ dispatch->glVertexAttribPointer(GLAMOR_VERTEX_SOURCE, 2,
+ GL_FLOAT, GL_FALSE,
+ 2 * sizeof(float), source_texcoords);
+ dispatch->glEnableVertexAttribArray(GLAMOR_VERTEX_SOURCE);
+
+ glamor_set_normalize_vcoords(dst_pixmap_priv, dst_xscale, dst_yscale,
+ x1, y1,
+ x2, y2, glamor_priv->yInverted, vertices);
+
+ dispatch->glVertexAttribPointer(GLAMOR_VERTEX_POS, 2, GL_FLOAT,
+ GL_FALSE, 2 * sizeof(float), vertices);
+ dispatch->glEnableVertexAttribArray(GLAMOR_VERTEX_POS);
+ dispatch->glDrawArrays(GL_TRIANGLE_FAN, 0, 4);
+
+ dispatch->glDisableVertexAttribArray(GLAMOR_VERTEX_SOURCE);
#ifndef GLAMOR_GLES2
- dispatch->glDisable(GL_TEXTURE_2D);
+ dispatch->glDisable(GL_TEXTURE_2D);
#endif
- dispatch->glDisableVertexAttribArray(GLAMOR_VERTEX_POS);
- dispatch->glUseProgram(0);
- glamor_put_dispatch(glamor_priv);
+ dispatch->glDisableVertexAttribArray(GLAMOR_VERTEX_POS);
+ dispatch->glUseProgram(0);
+ glamor_put_dispatch(glamor_priv);
- glamor_priv->state = RENDER_STATE;
- glamor_priv->render_idle_cnt = 0;
+ glamor_priv->state = RENDER_STATE;
+ glamor_priv->render_idle_cnt = 0;
}
Bool
glamor_tile(PixmapPtr pixmap, PixmapPtr tile,
- int x, int y, int width, int height,
- unsigned char alu, unsigned long planemask,
- int tile_x, int tile_y)
+ int x, int y, int width, int height,
+ unsigned char alu, unsigned long planemask, int tile_x, int tile_y)
{
- ScreenPtr screen = pixmap->drawable.pScreen;
- glamor_screen_private *glamor_priv =
- glamor_get_screen_private(screen);
- glamor_pixmap_private *dst_pixmap_priv;
- glamor_pixmap_private *src_pixmap_priv;
- glamor_gl_dispatch *dispatch;
-
- dst_pixmap_priv = glamor_get_pixmap_private(pixmap);
- src_pixmap_priv = glamor_get_pixmap_private(tile);
-
- if (!GLAMOR_PIXMAP_PRIV_HAS_FBO(dst_pixmap_priv))
- return FALSE;
-
- if (glamor_priv->tile_prog == 0) {
- glamor_fallback("Tiling unsupported\n");
- goto fail;
- }
-
- if (!GLAMOR_PIXMAP_PRIV_HAS_FBO(src_pixmap_priv)) {
- /* XXX dynamic uploading candidate. */
- glamor_fallback("Non-texture tile pixmap\n");
- goto fail;
- }
-
- if (!glamor_set_planemask(pixmap, planemask)) {
- glamor_fallback("unsupported planemask %lx\n", planemask);
- goto fail;
- }
-
- dispatch = glamor_get_dispatch(glamor_priv);
- if (!glamor_set_alu(dispatch, alu)) {
- glamor_fallback("unsupported alu %x\n", alu);
- glamor_put_dispatch(glamor_priv);
- goto fail;
- }
-
- if (dst_pixmap_priv->type == GLAMOR_TEXTURE_LARGE
- || src_pixmap_priv->type == GLAMOR_TEXTURE_LARGE) {
- glamor_pixmap_clipped_regions *clipped_dst_regions;
- int n_dst_region, i, j, k;
- BoxRec box;
- RegionRec region;
-
- box.x1 = x;
- box.y1 = y;
- box.x2 = x + width;
- box.y2 = y + height;
- RegionInitBoxes(&region, &box, 1);
- clipped_dst_regions = glamor_compute_clipped_regions(dst_pixmap_priv,
- &region, &n_dst_region, 0, 0, 0);
- for(i = 0; i < n_dst_region; i++)
- {
- int n_src_region;
- glamor_pixmap_clipped_regions *clipped_src_regions;
- BoxPtr current_boxes;
- int n_current_boxes;
-
- SET_PIXMAP_FBO_CURRENT(dst_pixmap_priv, clipped_dst_regions[i].block_idx);
-
- if (src_pixmap_priv->type == GLAMOR_TEXTURE_LARGE) {
- RegionTranslate(clipped_dst_regions[i].region,
- tile_x - x, tile_y - y);
- DEBUGF("tiled a large src pixmap. %dx%d \n", tile->drawable.width, tile->drawable.height);
- clipped_src_regions = glamor_compute_clipped_regions(src_pixmap_priv,
- clipped_dst_regions[i].region,
- &n_src_region, 1, 0, 0);
- DEBUGF("got %d src regions %d \n", n_src_region);
- for (j = 0; j < n_src_region; j++)
- {
-
- SET_PIXMAP_FBO_CURRENT(src_pixmap_priv, clipped_src_regions[j].block_idx);
-
- RegionTranslate(clipped_src_regions[j].region,
- x - tile_x,
- y - tile_y);
- current_boxes = RegionRects(clipped_src_regions[j].region);
- n_current_boxes = RegionNumRects(clipped_src_regions[j].region);
- for(k = 0; k < n_current_boxes; k++)
- {
- DEBUGF("Tile on %d %d %d %d dst block id %d tile block id %d tilex %d tiley %d\n",
- current_boxes[k].x1, current_boxes[k].y1,
- current_boxes[k].x2 - current_boxes[k].x1,
- current_boxes[k].y2 - current_boxes[k].y1,
- clipped_dst_regions[i].block_idx,
- clipped_src_regions[j].block_idx,
- (tile_x + (current_boxes[k].x1 - x)),
- tile_y + (current_boxes[k].y1 - y));
-
- _glamor_tile(pixmap, tile,
- current_boxes[k].x1, current_boxes[k].y1,
- current_boxes[k].x2 - current_boxes[k].x1,
- current_boxes[k].y2 - current_boxes[k].y1,
- (tile_x + (current_boxes[k].x1 - x)),
- (tile_y + (current_boxes[k].y1 - y)));
- }
-
- RegionDestroy(clipped_src_regions[j].region);
- }
- free(clipped_src_regions);
- } else {
- current_boxes = RegionRects(clipped_dst_regions[i].region);
- n_current_boxes = RegionNumRects(clipped_dst_regions[i].region);
- for(k = 0; k < n_current_boxes; k++)
- {
- _glamor_tile(pixmap, tile,
- current_boxes[k].x1, current_boxes[k].y1,
- current_boxes[k].x2 - current_boxes[k].x1,
- current_boxes[k].y2 - current_boxes[k].y1,
- (tile_x + (current_boxes[k].x1 - x)),
- (tile_y + (current_boxes[k].y1 - y)));
- }
- }
- RegionDestroy(clipped_dst_regions[i].region);
- }
- free(clipped_dst_regions);
- RegionUninit(&region);
- }
- else
- _glamor_tile(pixmap, tile, x, y, width, height, tile_x, tile_y);
-
- glamor_set_alu(dispatch, GXcopy);
- glamor_put_dispatch(glamor_priv);
- return TRUE;
-fail:
- return FALSE;
+ ScreenPtr screen = pixmap->drawable.pScreen;
+ glamor_screen_private *glamor_priv = glamor_get_screen_private(screen);
+ glamor_pixmap_private *dst_pixmap_priv;
+ glamor_pixmap_private *src_pixmap_priv;
+ glamor_gl_dispatch *dispatch;
+
+ dst_pixmap_priv = glamor_get_pixmap_private(pixmap);
+ src_pixmap_priv = glamor_get_pixmap_private(tile);
+
+ if (!GLAMOR_PIXMAP_PRIV_HAS_FBO(dst_pixmap_priv))
+ return FALSE;
+
+ if (glamor_priv->tile_prog == 0) {
+ glamor_fallback("Tiling unsupported\n");
+ goto fail;
+ }
+
+ if (!GLAMOR_PIXMAP_PRIV_HAS_FBO(src_pixmap_priv)) {
+ /* XXX dynamic uploading candidate. */
+ glamor_fallback("Non-texture tile pixmap\n");
+ goto fail;
+ }
+
+ if (!glamor_set_planemask(pixmap, planemask)) {
+ glamor_fallback("unsupported planemask %lx\n", planemask);
+ goto fail;
+ }
+
+ dispatch = glamor_get_dispatch(glamor_priv);
+ if (!glamor_set_alu(dispatch, alu)) {
+ glamor_fallback("unsupported alu %x\n", alu);
+ glamor_put_dispatch(glamor_priv);
+ goto fail;
+ }
+
+ if (dst_pixmap_priv->type == GLAMOR_TEXTURE_LARGE
+ || src_pixmap_priv->type == GLAMOR_TEXTURE_LARGE) {
+ glamor_pixmap_clipped_regions *clipped_dst_regions;
+ int n_dst_region, i, j, k;
+ BoxRec box;
+ RegionRec region;
+
+ box.x1 = x;
+ box.y1 = y;
+ box.x2 = x + width;
+ box.y2 = y + height;
+ RegionInitBoxes(&region, &box, 1);
+ clipped_dst_regions = glamor_compute_clipped_regions(dst_pixmap_priv,
+ &region,
+ &n_dst_region, 0,
+ 0, 0);
+ for (i = 0; i < n_dst_region; i++) {
+ int n_src_region;
+ glamor_pixmap_clipped_regions *clipped_src_regions;
+ BoxPtr current_boxes;
+ int n_current_boxes;
+
+ SET_PIXMAP_FBO_CURRENT(dst_pixmap_priv,
+ clipped_dst_regions[i].block_idx);
+
+ if (src_pixmap_priv->type == GLAMOR_TEXTURE_LARGE) {
+ RegionTranslate(clipped_dst_regions[i].region,
+ tile_x - x, tile_y - y);
+ DEBUGF("tiled a large src pixmap. %dx%d \n",
+ tile->drawable.width, tile->drawable.height);
+ clipped_src_regions =
+ glamor_compute_clipped_regions(src_pixmap_priv,
+ clipped_dst_regions[i].
+ region, &n_src_region, 1, 0,
+ 0);
+ DEBUGF("got %d src regions %d \n", n_src_region);
+ for (j = 0; j < n_src_region; j++) {
+
+ SET_PIXMAP_FBO_CURRENT(src_pixmap_priv,
+ clipped_src_regions[j].block_idx);
+
+ RegionTranslate(clipped_src_regions[j].region,
+ x - tile_x, y - tile_y);
+ current_boxes = RegionRects(clipped_src_regions[j].region);
+ n_current_boxes =
+ RegionNumRects(clipped_src_regions[j].region);
+ for (k = 0; k < n_current_boxes; k++) {
+ DEBUGF
+ ("Tile on %d %d %d %d dst block id %d tile block id %d tilex %d tiley %d\n",
+ current_boxes[k].x1, current_boxes[k].y1,
+ current_boxes[k].x2 - current_boxes[k].x1,
+ current_boxes[k].y2 - current_boxes[k].y1,
+ clipped_dst_regions[i].block_idx,
+ clipped_src_regions[j].block_idx,
+ (tile_x + (current_boxes[k].x1 - x)),
+ tile_y + (current_boxes[k].y1 - y));
+
+ _glamor_tile(pixmap, tile,
+ current_boxes[k].x1, current_boxes[k].y1,
+ current_boxes[k].x2 - current_boxes[k].x1,
+ current_boxes[k].y2 - current_boxes[k].y1,
+ (tile_x + (current_boxes[k].x1 - x)),
+ (tile_y + (current_boxes[k].y1 - y)));
+ }
+
+ RegionDestroy(clipped_src_regions[j].region);
+ }
+ free(clipped_src_regions);
+ }
+ else {
+ current_boxes = RegionRects(clipped_dst_regions[i].region);
+ n_current_boxes = RegionNumRects(clipped_dst_regions[i].region);
+ for (k = 0; k < n_current_boxes; k++) {
+ _glamor_tile(pixmap, tile,
+ current_boxes[k].x1, current_boxes[k].y1,
+ current_boxes[k].x2 - current_boxes[k].x1,
+ current_boxes[k].y2 - current_boxes[k].y1,
+ (tile_x + (current_boxes[k].x1 - x)),
+ (tile_y + (current_boxes[k].y1 - y)));
+ }
+ }
+ RegionDestroy(clipped_dst_regions[i].region);
+ }
+ free(clipped_dst_regions);
+ RegionUninit(&region);
+ }
+ else
+ _glamor_tile(pixmap, tile, x, y, width, height, tile_x, tile_y);
+
+ glamor_set_alu(dispatch, GXcopy);
+ glamor_put_dispatch(glamor_priv);
+ return TRUE;
+ fail:
+ return FALSE;
}
diff --git a/xorg-server/glamor/glamor_trapezoid.c b/xorg-server/glamor/glamor_trapezoid.c
index 76b3729cf..cd99a4782 100644
--- a/xorg-server/glamor/glamor_trapezoid.c
+++ b/xorg-server/glamor/glamor_trapezoid.c
@@ -37,25 +37,27 @@
#include "fbpict.h"
static xFixed
-_glamor_linefixedX (xLineFixed *l, xFixed y, Bool ceil)
+_glamor_linefixedX(xLineFixed *l, xFixed y, Bool ceil)
{
- xFixed dx = l->p2.x - l->p1.x;
- xFixed_32_32 ex = (xFixed_32_32) (y - l->p1.y) * dx;
- xFixed dy = l->p2.y - l->p1.y;
- if (ceil)
- ex += (dy - 1);
- return l->p1.x + (xFixed) (ex / dy);
+ xFixed dx = l->p2.x - l->p1.x;
+ xFixed_32_32 ex = (xFixed_32_32) (y - l->p1.y) * dx;
+ xFixed dy = l->p2.y - l->p1.y;
+
+ if (ceil)
+ ex += (dy - 1);
+ return l->p1.x + (xFixed) (ex / dy);
}
static xFixed
-_glamor_linefixedY (xLineFixed *l, xFixed x, Bool ceil)
+_glamor_linefixedY(xLineFixed *l, xFixed x, Bool ceil)
{
- xFixed dy = l->p2.y - l->p1.y;
- xFixed_32_32 ey = (xFixed_32_32) (x - l->p1.x) * dy;
- xFixed dx = l->p2.x - l->p1.x;
- if (ceil)
- ey += (dx - 1);
- return l->p1.y + (xFixed) (ey / dx);
+ xFixed dy = l->p2.y - l->p1.y;
+ xFixed_32_32 ey = (xFixed_32_32) (x - l->p1.x) * dy;
+ xFixed dx = l->p2.x - l->p1.x;
+
+ if (ceil)
+ ey += (dx - 1);
+ return l->p1.y + (xFixed) (ey / dx);
}
#ifdef GLAMOR_TRAPEZOID_SHADER
@@ -73,204 +75,206 @@ _glamor_linefixedY (xLineFixed *l, xFixed x, Bool ceil)
&& point[1] <= IntToxFixed(rect->y2))
static xFixed
-_glamor_lines_crossfixedY (xLineFixed *l, xLineFixed *r)
+_glamor_lines_crossfixedY(xLineFixed *l, xLineFixed *r)
{
- xFixed dx1 = l->p2.x - l->p1.x;
- xFixed dx2 = r->p2.x - r->p1.x;
- xFixed dy1 = l->p2.y - l->p1.y;
- xFixed dy2 = r->p2.y - r->p1.y;
- xFixed_32_32 tmp = (xFixed_32_32) dy2 * dy1;
- xFixed_32_32 dividend1 = (tmp >> 32) * (l->p1.x - r->p1.x);
- xFixed_32_32 dividend2;
- xFixed_32_32 dividend3;
- xFixed_32_32 divisor;
-
- tmp = (xFixed_32_32) dx1 * dy2;
- dividend2 = (tmp >> 32) * l->p1.y;
- tmp = (xFixed_32_32) dy1 * dx2;
- dividend3 = (tmp >> 32) * r->p1.y;
- divisor = ((xFixed_32_32) dx1 * (xFixed_32_32) dy2
- - (xFixed_32_32) dy1 * (xFixed_32_32) dx2) >> 32;
-
- if (divisor)
- return (xFixed)((dividend2 - dividend1 - dividend3) / divisor);
-
- return 0xFFFFFFFF;
-}
+ xFixed dx1 = l->p2.x - l->p1.x;
+ xFixed dx2 = r->p2.x - r->p1.x;
+ xFixed dy1 = l->p2.y - l->p1.y;
+ xFixed dy2 = r->p2.y - r->p1.y;
+ xFixed_32_32 tmp = (xFixed_32_32) dy2 * dy1;
+ xFixed_32_32 dividend1 = (tmp >> 32) * (l->p1.x - r->p1.x);
+ xFixed_32_32 dividend2;
+ xFixed_32_32 dividend3;
+ xFixed_32_32 divisor;
-static Bool
-point_inside_trapezoid(int point[2], xTrapezoid * trap, xFixed cut_y)
-{
- int ret = TRUE;
- int tmp;
- if (point[1] > trap->bottom) {
- ret = FALSE;
- if (DEBUG_CLIP_VTX) {
- ErrorF("Out of Trap bottom, point[1] = %d(0x%x)), "
- "bottom = %d(0x%x)\n",
- (unsigned int)xFixedToInt(point[1]), point[1],
- (unsigned int)xFixedToInt(trap->bottom),
- (unsigned int)trap->bottom);
- }
-
- return ret;
- }
+ tmp = (xFixed_32_32) dx1 *dy2;
- if (point[1] < trap->top) {
- ret = FALSE;
- if (DEBUG_CLIP_VTX) {
- ErrorF("Out of Trap top, point[1] = %d(0x%x)), "
- "top = %d(0x%x)\n",
- (unsigned int)xFixedToInt(point[1]), point[1],
- (unsigned int)xFixedToInt(trap->top),
- (unsigned int)trap->top);
- }
-
- return ret;
- }
+ dividend2 = (tmp >> 32) * l->p1.y;
+ tmp = (xFixed_32_32) dy1 *dx2;
- tmp = _glamor_linefixedX (&trap->left, point[1], FALSE);
- if (point[0] < tmp) {
- ret = FALSE;
-
- if (abs(cut_y - trap->top) < pixman_fixed_1_minus_e &&
- abs(point[1] - trap->top) < pixman_fixed_1_minus_e &&
- tmp - point[0] < pixman_fixed_1_minus_e) {
- ret = TRUE;
- } else if (abs(cut_y - trap->bottom) < pixman_fixed_1_minus_e &&
- point[1] - trap->bottom < pixman_fixed_1_minus_e &&
- tmp - point[0] < pixman_fixed_1_minus_e) {
- ret = TRUE;
- }
-
- if (DEBUG_CLIP_VTX && !ret) {
- ErrorF("Out of Trap left, point[0] = %d(0x%x)), "
- "left = %d(0x%x)\n",
- (unsigned int)xFixedToInt(point[0]), point[0],
- (unsigned int)xFixedToInt(tmp), (unsigned int)tmp);
- }
-
- if (!ret)
- return ret;
- }
+ dividend3 = (tmp >> 32) * r->p1.y;
+ divisor = ((xFixed_32_32) dx1 * (xFixed_32_32) dy2
+ - (xFixed_32_32) dy1 * (xFixed_32_32) dx2) >> 32;
- tmp = _glamor_linefixedX (&trap->right, point[1], TRUE);
- if (point[0] > tmp) {
- ret = FALSE;
-
- if (abs(cut_y - trap->top) < pixman_fixed_1_minus_e &&
- abs(point[1] - trap->top) < pixman_fixed_1_minus_e &&
- point[0] - tmp < pixman_fixed_1_minus_e) {
- ret = TRUE;
- } else if (abs(cut_y - trap->bottom) < pixman_fixed_1_minus_e &&
- abs(point[1] - trap->bottom) < pixman_fixed_1_minus_e &&
- point[0] - tmp < pixman_fixed_1_minus_e) {
- ret = TRUE;
- }
-
- if (DEBUG_CLIP_VTX && !ret) {
- ErrorF("Out of Trap right, point[0] = %d(0x%x)), "
- "right = %d(0x%x)\n",
- (unsigned int)xFixedToInt(point[0]), point[0],
- (unsigned int)xFixedToInt(tmp), (unsigned int)tmp);
- }
-
- if (!ret)
- return ret;
- }
+ if (divisor)
+ return (xFixed) ((dividend2 - dividend1 - dividend3) / divisor);
+
+ return 0xFFFFFFFF;
+}
- return ret;
+static Bool
+point_inside_trapezoid(int point[2], xTrapezoid *trap, xFixed cut_y)
+{
+ int ret = TRUE;
+ int tmp;
+
+ if (point[1] > trap->bottom) {
+ ret = FALSE;
+ if (DEBUG_CLIP_VTX) {
+ ErrorF("Out of Trap bottom, point[1] = %d(0x%x)), "
+ "bottom = %d(0x%x)\n",
+ (unsigned int) xFixedToInt(point[1]), point[1],
+ (unsigned int) xFixedToInt(trap->bottom),
+ (unsigned int) trap->bottom);
+ }
+
+ return ret;
+ }
+
+ if (point[1] < trap->top) {
+ ret = FALSE;
+ if (DEBUG_CLIP_VTX) {
+ ErrorF("Out of Trap top, point[1] = %d(0x%x)), "
+ "top = %d(0x%x)\n",
+ (unsigned int) xFixedToInt(point[1]), point[1],
+ (unsigned int) xFixedToInt(trap->top),
+ (unsigned int) trap->top);
+ }
+
+ return ret;
+ }
+
+ tmp = _glamor_linefixedX(&trap->left, point[1], FALSE);
+ if (point[0] < tmp) {
+ ret = FALSE;
+
+ if (abs(cut_y - trap->top) < pixman_fixed_1_minus_e &&
+ abs(point[1] - trap->top) < pixman_fixed_1_minus_e &&
+ tmp - point[0] < pixman_fixed_1_minus_e) {
+ ret = TRUE;
+ }
+ else if (abs(cut_y - trap->bottom) < pixman_fixed_1_minus_e &&
+ point[1] - trap->bottom < pixman_fixed_1_minus_e &&
+ tmp - point[0] < pixman_fixed_1_minus_e) {
+ ret = TRUE;
+ }
+
+ if (DEBUG_CLIP_VTX && !ret) {
+ ErrorF("Out of Trap left, point[0] = %d(0x%x)), "
+ "left = %d(0x%x)\n",
+ (unsigned int) xFixedToInt(point[0]), point[0],
+ (unsigned int) xFixedToInt(tmp), (unsigned int) tmp);
+ }
+
+ if (!ret)
+ return ret;
+ }
+
+ tmp = _glamor_linefixedX(&trap->right, point[1], TRUE);
+ if (point[0] > tmp) {
+ ret = FALSE;
+
+ if (abs(cut_y - trap->top) < pixman_fixed_1_minus_e &&
+ abs(point[1] - trap->top) < pixman_fixed_1_minus_e &&
+ point[0] - tmp < pixman_fixed_1_minus_e) {
+ ret = TRUE;
+ }
+ else if (abs(cut_y - trap->bottom) < pixman_fixed_1_minus_e &&
+ abs(point[1] - trap->bottom) < pixman_fixed_1_minus_e &&
+ point[0] - tmp < pixman_fixed_1_minus_e) {
+ ret = TRUE;
+ }
+
+ if (DEBUG_CLIP_VTX && !ret) {
+ ErrorF("Out of Trap right, point[0] = %d(0x%x)), "
+ "right = %d(0x%x)\n",
+ (unsigned int) xFixedToInt(point[0]), point[0],
+ (unsigned int) xFixedToInt(tmp), (unsigned int) tmp);
+ }
+
+ if (!ret)
+ return ret;
+ }
+
+ return ret;
}
static void
glamor_emit_composite_triangle(ScreenPtr screen,
- const float *src_coords,
- const float *mask_coords,
- const float *dst_coords)
+ const float *src_coords,
+ const float *mask_coords,
+ const float *dst_coords)
{
- glamor_emit_composite_vert(screen, src_coords, mask_coords,
- dst_coords, 0);
- glamor_emit_composite_vert(screen, src_coords, mask_coords,
- dst_coords, 1);
- glamor_emit_composite_vert(screen, src_coords, mask_coords,
- dst_coords, 2);
+ glamor_emit_composite_vert(screen, src_coords, mask_coords, dst_coords, 0);
+ glamor_emit_composite_vert(screen, src_coords, mask_coords, dst_coords, 1);
+ glamor_emit_composite_vert(screen, src_coords, mask_coords, dst_coords, 2);
}
static void
glamor_flush_composite_triangles(ScreenPtr screen)
{
- glamor_screen_private *glamor_priv =
- glamor_get_screen_private(screen);
- glamor_gl_dispatch *dispatch;
-
- dispatch = glamor_get_dispatch(glamor_priv);
- if (glamor_priv->gl_flavor == GLAMOR_GL_DESKTOP)
- dispatch->glUnmapBuffer(GL_ARRAY_BUFFER);
- else {
-
- dispatch->glBindBuffer(GL_ARRAY_BUFFER, glamor_priv->vbo);
- dispatch->glBufferData(GL_ARRAY_BUFFER,
- glamor_priv->vbo_offset,
- glamor_priv->vb, GL_DYNAMIC_DRAW);
- }
+ glamor_screen_private *glamor_priv = glamor_get_screen_private(screen);
+ glamor_gl_dispatch *dispatch;
+
+ dispatch = glamor_get_dispatch(glamor_priv);
+ if (glamor_priv->gl_flavor == GLAMOR_GL_DESKTOP)
+ dispatch->glUnmapBuffer(GL_ARRAY_BUFFER);
+ else {
- if (!glamor_priv->render_nr_verts)
- return;
+ dispatch->glBindBuffer(GL_ARRAY_BUFFER, glamor_priv->vbo);
+ dispatch->glBufferData(GL_ARRAY_BUFFER,
+ glamor_priv->vbo_offset,
+ glamor_priv->vb, GL_DYNAMIC_DRAW);
+ }
- dispatch->glDrawArrays(GL_TRIANGLES, 0, glamor_priv->render_nr_verts);
- glamor_put_dispatch(glamor_priv);
+ if (!glamor_priv->render_nr_verts)
+ return;
+
+ dispatch->glDrawArrays(GL_TRIANGLES, 0, glamor_priv->render_nr_verts);
+ glamor_put_dispatch(glamor_priv);
}
static Bool
-_glamor_clip_trapezoid_vertex(xTrapezoid * trap, BoxPtr pbox,
- int vertex[6], int *num)
+_glamor_clip_trapezoid_vertex(xTrapezoid *trap, BoxPtr pbox,
+ int vertex[6], int *num)
{
- xFixed edge_cross_y = 0xFFFFFFFF;
- int tl[2];
- int bl[2];
- int tr[2];
- int br[2];
- int left_cut_top[2];
- int left_cut_left[2];
- int left_cut_right[2];
- int left_cut_bottom[2];
- int right_cut_top[2];
- int right_cut_left[2];
- int right_cut_right[2];
- int right_cut_bottom[2];
- int tmp[2];
- int tmp_vtx[20*2];
- float tmp_vtx_slope[20];
- BoxRec trap_bound;
- int i = 0;
- int vertex_num = 0;
-
- if (DEBUG_CLIP_VTX) {
- ErrorF("The parameter of xTrapezoid is:\ntop: %d 0x%x\tbottom: %d 0x%x\n"
- "left: p1 (%d 0x%x, %d 0x%x)\tp2 (%d 0x%x, %d 0x%x)\n"
- "right: p1 (%d 0x%x, %d 0x%x)\tp2 (%d 0x%x, %d 0x%x)\n",
- xFixedToInt(trap->top), (unsigned int)trap->top,
- xFixedToInt(trap->bottom), (unsigned int)trap->bottom,
- xFixedToInt(trap->left.p1.x), (unsigned int)trap->left.p1.x,
- xFixedToInt(trap->left.p1.y), (unsigned int)trap->left.p1.y,
- xFixedToInt(trap->left.p2.x), (unsigned int)trap->left.p2.x,
- xFixedToInt(trap->left.p2.y), (unsigned int)trap->left.p2.y,
- xFixedToInt(trap->right.p1.x), (unsigned int)trap->right.p1.x,
- xFixedToInt(trap->right.p1.y), (unsigned int)trap->right.p1.y,
- xFixedToInt(trap->right.p2.x), (unsigned int)trap->right.p2.x,
- xFixedToInt(trap->right.p2.y), (unsigned int)trap->right.p2.y);
- }
-
- miTrapezoidBounds(1, trap, &trap_bound);
- if (DEBUG_CLIP_VTX)
- ErrorF("The bounds for this traps is: bounds.x1 = %d, bounds.x2 = %d, "
- "bounds.y1 = %d, bounds.y2 = %d\n", trap_bound.x1, trap_bound.x2,
- trap_bound.y1, trap_bound.y2);
-
- if (trap_bound.x1 > pbox->x2 || trap_bound.x2 < pbox->x1)
- return FALSE;
- if (trap_bound.y1 > pbox->y2 || trap_bound.y2 < pbox->y1)
- return FALSE;
+ xFixed edge_cross_y = 0xFFFFFFFF;
+ int tl[2];
+ int bl[2];
+ int tr[2];
+ int br[2];
+ int left_cut_top[2];
+ int left_cut_left[2];
+ int left_cut_right[2];
+ int left_cut_bottom[2];
+ int right_cut_top[2];
+ int right_cut_left[2];
+ int right_cut_right[2];
+ int right_cut_bottom[2];
+ int tmp[2];
+ int tmp_vtx[20 * 2];
+ float tmp_vtx_slope[20];
+ BoxRec trap_bound;
+ int i = 0;
+ int vertex_num = 0;
+
+ if (DEBUG_CLIP_VTX) {
+ ErrorF
+ ("The parameter of xTrapezoid is:\ntop: %d 0x%x\tbottom: %d 0x%x\n"
+ "left: p1 (%d 0x%x, %d 0x%x)\tp2 (%d 0x%x, %d 0x%x)\n"
+ "right: p1 (%d 0x%x, %d 0x%x)\tp2 (%d 0x%x, %d 0x%x)\n",
+ xFixedToInt(trap->top), (unsigned int) trap->top,
+ xFixedToInt(trap->bottom), (unsigned int) trap->bottom,
+ xFixedToInt(trap->left.p1.x), (unsigned int) trap->left.p1.x,
+ xFixedToInt(trap->left.p1.y), (unsigned int) trap->left.p1.y,
+ xFixedToInt(trap->left.p2.x), (unsigned int) trap->left.p2.x,
+ xFixedToInt(trap->left.p2.y), (unsigned int) trap->left.p2.y,
+ xFixedToInt(trap->right.p1.x), (unsigned int) trap->right.p1.x,
+ xFixedToInt(trap->right.p1.y), (unsigned int) trap->right.p1.y,
+ xFixedToInt(trap->right.p2.x), (unsigned int) trap->right.p2.x,
+ xFixedToInt(trap->right.p2.y), (unsigned int) trap->right.p2.y);
+ }
+
+ miTrapezoidBounds(1, trap, &trap_bound);
+ if (DEBUG_CLIP_VTX)
+ ErrorF("The bounds for this traps is: bounds.x1 = %d, bounds.x2 = %d, "
+ "bounds.y1 = %d, bounds.y2 = %d\n", trap_bound.x1, trap_bound.x2,
+ trap_bound.y1, trap_bound.y2);
+
+ if (trap_bound.x1 > pbox->x2 || trap_bound.x2 < pbox->x1)
+ return FALSE;
+ if (trap_bound.y1 > pbox->y2 || trap_bound.y2 < pbox->y1)
+ return FALSE;
#define IS_TRAP_EDGE_VERTICAL(edge) \
(edge->p1.x == edge->p2.x)
@@ -334,1319 +338,1352 @@ _glamor_clip_trapezoid_vertex(xTrapezoid * trap, BoxPtr pbox,
"the Rect\n"); \
}
- /*Trap's right edge cut right edge. */
- if((!IS_TRAP_EDGE_VERTICAL((&trap->left))) ||
- (!IS_TRAP_EDGE_VERTICAL((&trap->right)))) {
- edge_cross_y = _glamor_lines_crossfixedY((&trap->left), (&trap->right));
- if (DEBUG_CLIP_VTX) {
- ErrorF("Trap's left edge cut right edge at %d(0x%x), "
- "trap_top = %x, trap_bottom = %x\n",
- xFixedToInt(edge_cross_y), edge_cross_y,
- (unsigned int)trap->top, (unsigned int)trap->bottom);
- }
- }
-
- /*Trap's TopLeft, BottomLeft, TopRight and BottomRight. */
- CACULATE_CUT_VERTEX(tl, 1, FALSE, trap->top, (&trap->left));
- CACULATE_CUT_VERTEX(bl, 1, FALSE, trap->bottom, (&trap->left));
- CACULATE_CUT_VERTEX(tr, 1, TRUE, trap->top, (&trap->right));
- CACULATE_CUT_VERTEX(br, 1, TRUE, trap->bottom, (&trap->right));
-
- if (DEBUG_CLIP_VTX)
- ErrorF("Trap's TopLeft, BottomLeft, TopRight and BottomRight\n");
- if (DEBUG_CLIP_VTX)
- ErrorF("Caculate the vertex of trapezoid:\n"
- " (%3d, %3d)-------------------------(%3d, %3d)\n"
- " / \\ \n"
- " / \\ \n"
- " / \\ \n"
- " (%3d, %3d)---------------------------------(%3d, %3d)\n"
- "Clip with rect:\n"
- " (%3d, %3d)------------------------(%3d, %3d) \n"
- " | | \n"
- " | | \n"
- " | | \n"
- " (%3d, %3d)------------------------(%3d, %3d) \n",
- xFixedToInt(tl[0]), xFixedToInt(tl[1]), xFixedToInt(tr[0]),
- xFixedToInt(tr[1]), xFixedToInt(bl[0]), xFixedToInt(bl[1]),
- xFixedToInt(br[0]), xFixedToInt(br[1]),
- pbox->x1, pbox->y1, pbox->x2, pbox->y1, pbox->x1, pbox->y2,
- pbox->x2, pbox->y2);
-
- ADD_VERTEX_IF_INSIDE(tl);
- ADD_VERTEX_IF_INSIDE(bl);
- ADD_VERTEX_IF_INSIDE(tr);
- ADD_VERTEX_IF_INSIDE(br);
-
- /*Trap's left edge cut Rect. */
- if (DEBUG_CLIP_VTX)
- ErrorF("Trap's left edge cut Rect\n");
- CACULATE_CUT_VERTEX(left_cut_top, 1, FALSE, IntToxFixed(pbox->y1), (&trap->left));
- ADD_VERTEX_IF_INSIDE(left_cut_top);
- if (!IS_TRAP_EDGE_VERTICAL((&trap->left))) {
- CACULATE_CUT_VERTEX(left_cut_left, 0, FALSE, IntToxFixed(pbox->x1), (&trap->left));
- ADD_VERTEX_IF_INSIDE(left_cut_left);
- }
- CACULATE_CUT_VERTEX(left_cut_bottom, 1, FALSE, IntToxFixed(pbox->y2), (&trap->left));
- ADD_VERTEX_IF_INSIDE(left_cut_bottom);
- if (!IS_TRAP_EDGE_VERTICAL((&trap->left))) {
- CACULATE_CUT_VERTEX(left_cut_right, 0, FALSE, IntToxFixed(pbox->x2), (&trap->left));
- ADD_VERTEX_IF_INSIDE(left_cut_right);
- }
-
- /*Trap's right edge cut Rect. */
- if (DEBUG_CLIP_VTX)
- ErrorF("Trap's right edge cut Rect\n");
- CACULATE_CUT_VERTEX(right_cut_top, 1, TRUE, IntToxFixed(pbox->y1), (&trap->right));
- ADD_VERTEX_IF_INSIDE(right_cut_top);
- if (!IS_TRAP_EDGE_VERTICAL((&trap->right))) {
- CACULATE_CUT_VERTEX(right_cut_left, 0, TRUE, IntToxFixed(pbox->x1), (&trap->right));
- ADD_VERTEX_IF_INSIDE(right_cut_left);
- }
- CACULATE_CUT_VERTEX(right_cut_bottom, 1, TRUE, IntToxFixed(pbox->y2), (&trap->right));
- ADD_VERTEX_IF_INSIDE(right_cut_bottom);
- if (!IS_TRAP_EDGE_VERTICAL((&trap->right))) {
- CACULATE_CUT_VERTEX(right_cut_right, 0, TRUE, IntToxFixed(pbox->x2), (&trap->right));
- ADD_VERTEX_IF_INSIDE(right_cut_right);
- }
-
- /* Trap's top cut Left and Right of rect. */
- if (DEBUG_CLIP_VTX)
- ErrorF("Trap's top cut Left and Right of rect\n");
- tmp[0] = IntToxFixed(pbox->x1);
- tmp[1] = trap->top;
- ADD_VERTEX_IF_INSIDE(tmp);
- tmp[0] = IntToxFixed(pbox->x2);
- tmp[1] = trap->top;
- ADD_VERTEX_IF_INSIDE(tmp);
-
- /* Trap's bottom cut Left and Right of rect. */
- if (DEBUG_CLIP_VTX)
- ErrorF("Trap's bottom cut Left and Right of rect\n");
- tmp[0] = IntToxFixed(pbox->x1);
- tmp[1] = trap->bottom;
- ADD_VERTEX_IF_INSIDE(tmp);
- tmp[0] = IntToxFixed(pbox->x2);
- tmp[1] = trap->bottom;
- ADD_VERTEX_IF_INSIDE(tmp);
-
- /* The orginal 4 vertex of rect. */
- if (DEBUG_CLIP_VTX)
- ErrorF("The orginal 4 vertex of rect\n");
- tmp[0] = IntToxFixed(pbox->x1);
- tmp[1] = IntToxFixed(pbox->y1);
- ADD_VERTEX_IF_INSIDE(tmp);
- tmp[0] = IntToxFixed(pbox->x1);
- tmp[1] = IntToxFixed(pbox->y2);
- ADD_VERTEX_IF_INSIDE(tmp);
- tmp[0] = IntToxFixed(pbox->x2);
- tmp[1] = IntToxFixed(pbox->y2);
- ADD_VERTEX_IF_INSIDE(tmp);
- tmp[0] = IntToxFixed(pbox->x2);
- tmp[1] = IntToxFixed(pbox->y1);
- ADD_VERTEX_IF_INSIDE(tmp);
-
- if (DEBUG_CLIP_VTX) {
- ErrorF("\nThe candidate vertex number is %d\n", vertex_num / 2);
- for (i = 0; i < vertex_num / 2; i++) {
- ErrorF("(%d, %d) ", tmp_vtx[2*i], tmp_vtx[2*i + 1]);
- }
- ErrorF("\n");
- }
-
- /* Sort the vertex by X and then Y. */
- for (i = 0; i < vertex_num / 2; i++) {
- int j;
- for (j = 0; j < vertex_num / 2 - i - 1; j++) {
- if (tmp_vtx[2*j] > tmp_vtx[2*(j+1)]
- || (tmp_vtx[2*j] == tmp_vtx[2*(j+1)]
- && tmp_vtx[2*j + 1] > tmp_vtx[2*(j+1) + 1])) {
- tmp[0] = tmp_vtx[2*j];
- tmp[1] = tmp_vtx[2*j + 1];
- tmp_vtx[2*j] = tmp_vtx[2*(j+1)];
- tmp_vtx[2*j + 1] = tmp_vtx[2*(j+1) + 1];
- tmp_vtx[2*(j+1)] = tmp[0];
- tmp_vtx[2*(j+1) + 1] = tmp[1];
- }
- }
-
- }
-
- if (DEBUG_CLIP_VTX) {
- ErrorF("\nAfter sort vertex number is:\n");
- for (i = 0; i < vertex_num / 2; i++) {
- ErrorF("(%d, %d) ", tmp_vtx[2*i], tmp_vtx[2*i + 1]);
- }
- ErrorF("\n");
- }
-
- memset(vertex, -1, 2*6);
- *num = 0;
-
- for (i = 0; i < vertex_num / 2; i++) {
- if (*num > 0 && vertex[2*(*num - 1)] == tmp_vtx[2*i]
- && vertex[2*(*num - 1) + 1] == tmp_vtx[2*i + 1]) {
- /*same vertex.*/
- if (DEBUG_CLIP_VTX)
- ErrorF("X Point:(%d, %d) discard\n",
- tmp_vtx[2*i], tmp_vtx[2*i + 1]);
- continue;
- }
-
- (*num)++;
- if (*num > 6) {
- if (DEBUG_CLIP_VTX)
- FatalError("Trapezoid clip with Rect can never have vtx"
- "number bigger than 6\n");
- else {
- ErrorF("Trapezoid clip with Rect can never have vtx"
- "number bigger than 6\n");
- *num = 6;
- break;
- }
- }
-
- vertex[2*(*num - 1)] = tmp_vtx[2*i];
- vertex[2*(*num - 1) + 1] = tmp_vtx[2*i + 1];
- if (DEBUG_CLIP_VTX)
- ErrorF("@ Point:(%d, %d) select, num now is %d\n",
- tmp_vtx[2*i], tmp_vtx[2*i + 1], *num);
- }
-
- /* Now we need to arrange the vtx in the polygon's counter-clockwise
- order. We first select the left and top point as the start point and
- sort every vtx by the slope from vtx to the start vtx. */
- for (i = 1; i < *num; i++) {
- tmp_vtx_slope[i] = (vertex[2*i] != vertex[0] ?
- (float)(vertex[2*i + 1] - vertex[1]) / (float)(vertex[2*i] - vertex[0])
- : (float)INT_MAX);
- }
-
- if (DEBUG_CLIP_VTX) {
- ErrorF("\nvtx number: %d, VTX and slope:\n", *num);
- for (i = 0; i < *num; i++) {
- ErrorF("(%d, %d):%f ",
- vertex[2*i], vertex[2*i + 1],
- tmp_vtx_slope[i]);
- }
- ErrorF("\n");
- }
-
- /* Sort the vertex by slope. */
- for (i = 0; i < *num - 1; i++) {
- int j;
- float tmp_slope;
- for (j = 1; j < *num - i - 1; j++) {
- if (tmp_vtx_slope[j] < tmp_vtx_slope[j + 1]) {
- tmp_slope = tmp_vtx_slope[j];
- tmp_vtx_slope[j] = tmp_vtx_slope[j + 1];
- tmp_vtx_slope[j + 1] = tmp_slope;
- tmp[0] = vertex[2*j];
- tmp[1] = vertex[2*j + 1];
- vertex[2*j] = vertex[2*(j+1)];
- vertex[2*j + 1] = vertex[2*(j+1) + 1];
- vertex[2*(j+1)] = tmp[0];
- vertex[2*(j+1) + 1] = tmp[1];
- }
- }
- }
-
- if (DEBUG_CLIP_VTX) {
- ErrorF("\nBefore return, vtx number: %d, VTX and slope:\n", *num);
- for (i = 0; i < *num; i++) {
- ErrorF("(%d, %d):%f ",
- vertex[2*i], vertex[2*i + 1],
- tmp_vtx_slope[i]);
- }
- ErrorF("\n");
- }
-
- return TRUE;
+ /*Trap's right edge cut right edge. */
+ if ((!IS_TRAP_EDGE_VERTICAL((&trap->left))) ||
+ (!IS_TRAP_EDGE_VERTICAL((&trap->right)))) {
+ edge_cross_y = _glamor_lines_crossfixedY((&trap->left), (&trap->right));
+ if (DEBUG_CLIP_VTX) {
+ ErrorF("Trap's left edge cut right edge at %d(0x%x), "
+ "trap_top = %x, trap_bottom = %x\n",
+ xFixedToInt(edge_cross_y), edge_cross_y,
+ (unsigned int) trap->top, (unsigned int) trap->bottom);
+ }
+ }
+
+ /*Trap's TopLeft, BottomLeft, TopRight and BottomRight. */
+ CACULATE_CUT_VERTEX(tl, 1, FALSE, trap->top, (&trap->left));
+ CACULATE_CUT_VERTEX(bl, 1, FALSE, trap->bottom, (&trap->left));
+ CACULATE_CUT_VERTEX(tr, 1, TRUE, trap->top, (&trap->right));
+ CACULATE_CUT_VERTEX(br, 1, TRUE, trap->bottom, (&trap->right));
+
+ if (DEBUG_CLIP_VTX)
+ ErrorF("Trap's TopLeft, BottomLeft, TopRight and BottomRight\n");
+ if (DEBUG_CLIP_VTX)
+ ErrorF("Caculate the vertex of trapezoid:\n"
+ " (%3d, %3d)-------------------------(%3d, %3d)\n"
+ " / \\ \n"
+ " / \\ \n"
+ " / \\ \n"
+ " (%3d, %3d)---------------------------------(%3d, %3d)\n"
+ "Clip with rect:\n"
+ " (%3d, %3d)------------------------(%3d, %3d) \n"
+ " | | \n"
+ " | | \n"
+ " | | \n"
+ " (%3d, %3d)------------------------(%3d, %3d) \n",
+ xFixedToInt(tl[0]), xFixedToInt(tl[1]), xFixedToInt(tr[0]),
+ xFixedToInt(tr[1]), xFixedToInt(bl[0]), xFixedToInt(bl[1]),
+ xFixedToInt(br[0]), xFixedToInt(br[1]),
+ pbox->x1, pbox->y1, pbox->x2, pbox->y1, pbox->x1, pbox->y2,
+ pbox->x2, pbox->y2);
+
+ ADD_VERTEX_IF_INSIDE(tl);
+ ADD_VERTEX_IF_INSIDE(bl);
+ ADD_VERTEX_IF_INSIDE(tr);
+ ADD_VERTEX_IF_INSIDE(br);
+
+ /*Trap's left edge cut Rect. */
+ if (DEBUG_CLIP_VTX)
+ ErrorF("Trap's left edge cut Rect\n");
+ CACULATE_CUT_VERTEX(left_cut_top, 1, FALSE, IntToxFixed(pbox->y1),
+ (&trap->left));
+ ADD_VERTEX_IF_INSIDE(left_cut_top);
+ if (!IS_TRAP_EDGE_VERTICAL((&trap->left))) {
+ CACULATE_CUT_VERTEX(left_cut_left, 0, FALSE, IntToxFixed(pbox->x1),
+ (&trap->left));
+ ADD_VERTEX_IF_INSIDE(left_cut_left);
+ }
+ CACULATE_CUT_VERTEX(left_cut_bottom, 1, FALSE, IntToxFixed(pbox->y2),
+ (&trap->left));
+ ADD_VERTEX_IF_INSIDE(left_cut_bottom);
+ if (!IS_TRAP_EDGE_VERTICAL((&trap->left))) {
+ CACULATE_CUT_VERTEX(left_cut_right, 0, FALSE, IntToxFixed(pbox->x2),
+ (&trap->left));
+ ADD_VERTEX_IF_INSIDE(left_cut_right);
+ }
+
+ /*Trap's right edge cut Rect. */
+ if (DEBUG_CLIP_VTX)
+ ErrorF("Trap's right edge cut Rect\n");
+ CACULATE_CUT_VERTEX(right_cut_top, 1, TRUE, IntToxFixed(pbox->y1),
+ (&trap->right));
+ ADD_VERTEX_IF_INSIDE(right_cut_top);
+ if (!IS_TRAP_EDGE_VERTICAL((&trap->right))) {
+ CACULATE_CUT_VERTEX(right_cut_left, 0, TRUE, IntToxFixed(pbox->x1),
+ (&trap->right));
+ ADD_VERTEX_IF_INSIDE(right_cut_left);
+ }
+ CACULATE_CUT_VERTEX(right_cut_bottom, 1, TRUE, IntToxFixed(pbox->y2),
+ (&trap->right));
+ ADD_VERTEX_IF_INSIDE(right_cut_bottom);
+ if (!IS_TRAP_EDGE_VERTICAL((&trap->right))) {
+ CACULATE_CUT_VERTEX(right_cut_right, 0, TRUE, IntToxFixed(pbox->x2),
+ (&trap->right));
+ ADD_VERTEX_IF_INSIDE(right_cut_right);
+ }
+
+ /* Trap's top cut Left and Right of rect. */
+ if (DEBUG_CLIP_VTX)
+ ErrorF("Trap's top cut Left and Right of rect\n");
+ tmp[0] = IntToxFixed(pbox->x1);
+ tmp[1] = trap->top;
+ ADD_VERTEX_IF_INSIDE(tmp);
+ tmp[0] = IntToxFixed(pbox->x2);
+ tmp[1] = trap->top;
+ ADD_VERTEX_IF_INSIDE(tmp);
+
+ /* Trap's bottom cut Left and Right of rect. */
+ if (DEBUG_CLIP_VTX)
+ ErrorF("Trap's bottom cut Left and Right of rect\n");
+ tmp[0] = IntToxFixed(pbox->x1);
+ tmp[1] = trap->bottom;
+ ADD_VERTEX_IF_INSIDE(tmp);
+ tmp[0] = IntToxFixed(pbox->x2);
+ tmp[1] = trap->bottom;
+ ADD_VERTEX_IF_INSIDE(tmp);
+
+ /* The orginal 4 vertex of rect. */
+ if (DEBUG_CLIP_VTX)
+ ErrorF("The orginal 4 vertex of rect\n");
+ tmp[0] = IntToxFixed(pbox->x1);
+ tmp[1] = IntToxFixed(pbox->y1);
+ ADD_VERTEX_IF_INSIDE(tmp);
+ tmp[0] = IntToxFixed(pbox->x1);
+ tmp[1] = IntToxFixed(pbox->y2);
+ ADD_VERTEX_IF_INSIDE(tmp);
+ tmp[0] = IntToxFixed(pbox->x2);
+ tmp[1] = IntToxFixed(pbox->y2);
+ ADD_VERTEX_IF_INSIDE(tmp);
+ tmp[0] = IntToxFixed(pbox->x2);
+ tmp[1] = IntToxFixed(pbox->y1);
+ ADD_VERTEX_IF_INSIDE(tmp);
+
+ if (DEBUG_CLIP_VTX) {
+ ErrorF("\nThe candidate vertex number is %d\n", vertex_num / 2);
+ for (i = 0; i < vertex_num / 2; i++) {
+ ErrorF("(%d, %d) ", tmp_vtx[2 * i], tmp_vtx[2 * i + 1]);
+ }
+ ErrorF("\n");
+ }
+
+ /* Sort the vertex by X and then Y. */
+ for (i = 0; i < vertex_num / 2; i++) {
+ int j;
+
+ for (j = 0; j < vertex_num / 2 - i - 1; j++) {
+ if (tmp_vtx[2 * j] > tmp_vtx[2 * (j + 1)]
+ || (tmp_vtx[2 * j] == tmp_vtx[2 * (j + 1)]
+ && tmp_vtx[2 * j + 1] > tmp_vtx[2 * (j + 1) + 1])) {
+ tmp[0] = tmp_vtx[2 * j];
+ tmp[1] = tmp_vtx[2 * j + 1];
+ tmp_vtx[2 * j] = tmp_vtx[2 * (j + 1)];
+ tmp_vtx[2 * j + 1] = tmp_vtx[2 * (j + 1) + 1];
+ tmp_vtx[2 * (j + 1)] = tmp[0];
+ tmp_vtx[2 * (j + 1) + 1] = tmp[1];
+ }
+ }
+
+ }
+
+ if (DEBUG_CLIP_VTX) {
+ ErrorF("\nAfter sort vertex number is:\n");
+ for (i = 0; i < vertex_num / 2; i++) {
+ ErrorF("(%d, %d) ", tmp_vtx[2 * i], tmp_vtx[2 * i + 1]);
+ }
+ ErrorF("\n");
+ }
+
+ memset(vertex, -1, 2 * 6);
+ *num = 0;
+
+ for (i = 0; i < vertex_num / 2; i++) {
+ if (*num > 0 && vertex[2 * (*num - 1)] == tmp_vtx[2 * i]
+ && vertex[2 * (*num - 1) + 1] == tmp_vtx[2 * i + 1]) {
+ /*same vertex. */
+ if (DEBUG_CLIP_VTX)
+ ErrorF("X Point:(%d, %d) discard\n",
+ tmp_vtx[2 * i], tmp_vtx[2 * i + 1]);
+ continue;
+ }
+
+ (*num)++;
+ if (*num > 6) {
+ if (DEBUG_CLIP_VTX)
+ FatalError("Trapezoid clip with Rect can never have vtx"
+ "number bigger than 6\n");
+ else {
+ ErrorF("Trapezoid clip with Rect can never have vtx"
+ "number bigger than 6\n");
+ *num = 6;
+ break;
+ }
+ }
+
+ vertex[2 * (*num - 1)] = tmp_vtx[2 * i];
+ vertex[2 * (*num - 1) + 1] = tmp_vtx[2 * i + 1];
+ if (DEBUG_CLIP_VTX)
+ ErrorF("@ Point:(%d, %d) select, num now is %d\n",
+ tmp_vtx[2 * i], tmp_vtx[2 * i + 1], *num);
+ }
+
+ /* Now we need to arrange the vtx in the polygon's counter-clockwise
+ order. We first select the left and top point as the start point and
+ sort every vtx by the slope from vtx to the start vtx. */
+ for (i = 1; i < *num; i++) {
+ tmp_vtx_slope[i] = (vertex[2 * i] != vertex[0] ?
+ (float) (vertex[2 * i + 1] -
+ vertex[1]) / (float) (vertex[2 * i] -
+ vertex[0])
+ : (float) INT_MAX);
+ }
+
+ if (DEBUG_CLIP_VTX) {
+ ErrorF("\nvtx number: %d, VTX and slope:\n", *num);
+ for (i = 0; i < *num; i++) {
+ ErrorF("(%d, %d):%f ",
+ vertex[2 * i], vertex[2 * i + 1], tmp_vtx_slope[i]);
+ }
+ ErrorF("\n");
+ }
+
+ /* Sort the vertex by slope. */
+ for (i = 0; i < *num - 1; i++) {
+ int j;
+ float tmp_slope;
+
+ for (j = 1; j < *num - i - 1; j++) {
+ if (tmp_vtx_slope[j] < tmp_vtx_slope[j + 1]) {
+ tmp_slope = tmp_vtx_slope[j];
+ tmp_vtx_slope[j] = tmp_vtx_slope[j + 1];
+ tmp_vtx_slope[j + 1] = tmp_slope;
+ tmp[0] = vertex[2 * j];
+ tmp[1] = vertex[2 * j + 1];
+ vertex[2 * j] = vertex[2 * (j + 1)];
+ vertex[2 * j + 1] = vertex[2 * (j + 1) + 1];
+ vertex[2 * (j + 1)] = tmp[0];
+ vertex[2 * (j + 1) + 1] = tmp[1];
+ }
+ }
+ }
+
+ if (DEBUG_CLIP_VTX) {
+ ErrorF("\nBefore return, vtx number: %d, VTX and slope:\n", *num);
+ for (i = 0; i < *num; i++) {
+ ErrorF("(%d, %d):%f ",
+ vertex[2 * i], vertex[2 * i + 1], tmp_vtx_slope[i]);
+ }
+ ErrorF("\n");
+ }
+
+ return TRUE;
}
static void
glamor_setup_composite_vbo_for_trapezoid(ScreenPtr screen, int n_verts)
{
- glamor_screen_private *glamor_priv =
- glamor_get_screen_private(screen);
- glamor_gl_dispatch *dispatch;
- int stride;
- int vert_size;
-
- glamor_priv->render_nr_verts = 0;
-
- /* For GLAMOR_VERTEX_POS */
- glamor_priv->vb_stride = 2 * sizeof(float);
-
- /* For GLAMOR_GLAMOR_VERTEX_SOURCE */
- glamor_priv->vb_stride += 2 * sizeof(float);
-
- /* For GLAMOR_VERTEX_TOP_BOTTOM */
- glamor_priv->vb_stride += 2 * sizeof(float);
-
- /* For GLAMOR_VERTEX_LEFT_PARAM */
- glamor_priv->vb_stride += 4 * sizeof(float);
-
- /* For GLAMOR_VERTEX_RIGHT_PARAM */
- glamor_priv->vb_stride += 4 * sizeof(float);
-
- vert_size = n_verts * glamor_priv->vb_stride;
-
- dispatch = glamor_get_dispatch(glamor_priv);
-
- dispatch->glDisableVertexAttribArray(GLAMOR_VERTEX_POS);
- dispatch->glDisableVertexAttribArray(GLAMOR_VERTEX_SOURCE);
- dispatch->glDisableVertexAttribArray(GLAMOR_VERTEX_TOP_BOTTOM);
- dispatch->glDisableVertexAttribArray(GLAMOR_VERTEX_LEFT_PARAM);
- dispatch->glDisableVertexAttribArray(GLAMOR_VERTEX_RIGHT_PARAM);
-
- dispatch->glBindBuffer(GL_ARRAY_BUFFER, glamor_priv->vbo);
- if (glamor_priv->gl_flavor == GLAMOR_GL_DESKTOP) {
- if (glamor_priv->vbo_size < (glamor_priv->vbo_offset + vert_size)) {
- glamor_priv->vbo_size = GLAMOR_COMPOSITE_VBO_VERT_CNT *
- glamor_priv->vb_stride;
- glamor_priv->vbo_offset = 0;
- dispatch->glBufferData(GL_ARRAY_BUFFER,
- glamor_priv->vbo_size,
- NULL, GL_STREAM_DRAW);
- }
-
- glamor_priv->vb = dispatch->glMapBufferRange(GL_ARRAY_BUFFER,
- glamor_priv->vbo_offset,
- vert_size,
- GL_MAP_WRITE_BIT | GL_MAP_UNSYNCHRONIZED_BIT);
-
- assert(glamor_priv->vb != NULL);
- glamor_priv->vb -= glamor_priv->vbo_offset;
- } else {
- glamor_priv->vbo_offset = 0;
- }
-
- dispatch->glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, glamor_priv->ebo);
-
- /* Set the vertex pointer. */
- dispatch->glVertexAttribPointer(GLAMOR_VERTEX_POS, 2, GL_FLOAT,
- GL_FALSE, glamor_priv->vb_stride,
- (void *) ((long)glamor_priv->vbo_offset));
- dispatch->glEnableVertexAttribArray(GLAMOR_VERTEX_POS);
- stride = 2;
-
- dispatch->glVertexAttribPointer(GLAMOR_VERTEX_SOURCE, 2, GL_FLOAT,
- GL_FALSE, glamor_priv->vb_stride,
- (void *) ((long)glamor_priv->vbo_offset + stride * sizeof(float)));
- dispatch->glEnableVertexAttribArray(GLAMOR_VERTEX_SOURCE);
- stride += 2;
-
- dispatch->glVertexAttribPointer(GLAMOR_VERTEX_TOP_BOTTOM, 2, GL_FLOAT,
- GL_FALSE, glamor_priv->vb_stride,
- (void *) ((long)glamor_priv->vbo_offset + stride * sizeof(float)));
- dispatch->glEnableVertexAttribArray(GLAMOR_VERTEX_TOP_BOTTOM);
- stride += 2;
-
- dispatch->glVertexAttribPointer(GLAMOR_VERTEX_LEFT_PARAM, 4, GL_FLOAT,
- GL_FALSE, glamor_priv->vb_stride,
- (void *) ((long)glamor_priv->vbo_offset + stride * sizeof(float)));
- dispatch->glEnableVertexAttribArray(GLAMOR_VERTEX_LEFT_PARAM);
- stride += 4;
-
- dispatch->glVertexAttribPointer(GLAMOR_VERTEX_RIGHT_PARAM, 4, GL_FLOAT,
- GL_FALSE, glamor_priv->vb_stride,
- (void *) ((long)glamor_priv->vbo_offset + stride * sizeof(float)));
- dispatch->glEnableVertexAttribArray(GLAMOR_VERTEX_RIGHT_PARAM);
-
- glamor_put_dispatch(glamor_priv);
+ glamor_screen_private *glamor_priv = glamor_get_screen_private(screen);
+ glamor_gl_dispatch *dispatch;
+ int stride;
+ int vert_size;
+
+ glamor_priv->render_nr_verts = 0;
+
+ /* For GLAMOR_VERTEX_POS */
+ glamor_priv->vb_stride = 2 * sizeof(float);
+
+ /* For GLAMOR_GLAMOR_VERTEX_SOURCE */
+ glamor_priv->vb_stride += 2 * sizeof(float);
+
+ /* For GLAMOR_VERTEX_TOP_BOTTOM */
+ glamor_priv->vb_stride += 2 * sizeof(float);
+
+ /* For GLAMOR_VERTEX_LEFT_PARAM */
+ glamor_priv->vb_stride += 4 * sizeof(float);
+
+ /* For GLAMOR_VERTEX_RIGHT_PARAM */
+ glamor_priv->vb_stride += 4 * sizeof(float);
+
+ vert_size = n_verts * glamor_priv->vb_stride;
+
+ dispatch = glamor_get_dispatch(glamor_priv);
+
+ dispatch->glDisableVertexAttribArray(GLAMOR_VERTEX_POS);
+ dispatch->glDisableVertexAttribArray(GLAMOR_VERTEX_SOURCE);
+ dispatch->glDisableVertexAttribArray(GLAMOR_VERTEX_TOP_BOTTOM);
+ dispatch->glDisableVertexAttribArray(GLAMOR_VERTEX_LEFT_PARAM);
+ dispatch->glDisableVertexAttribArray(GLAMOR_VERTEX_RIGHT_PARAM);
+
+ dispatch->glBindBuffer(GL_ARRAY_BUFFER, glamor_priv->vbo);
+ if (glamor_priv->gl_flavor == GLAMOR_GL_DESKTOP) {
+ if (glamor_priv->vbo_size < (glamor_priv->vbo_offset + vert_size)) {
+ glamor_priv->vbo_size = GLAMOR_COMPOSITE_VBO_VERT_CNT *
+ glamor_priv->vb_stride;
+ glamor_priv->vbo_offset = 0;
+ dispatch->glBufferData(GL_ARRAY_BUFFER,
+ glamor_priv->vbo_size, NULL, GL_STREAM_DRAW);
+ }
+
+ glamor_priv->vb = dispatch->glMapBufferRange(GL_ARRAY_BUFFER,
+ glamor_priv->vbo_offset,
+ vert_size,
+ GL_MAP_WRITE_BIT |
+ GL_MAP_UNSYNCHRONIZED_BIT);
+
+ assert(glamor_priv->vb != NULL);
+ glamor_priv->vb -= glamor_priv->vbo_offset;
+ }
+ else {
+ glamor_priv->vbo_offset = 0;
+ }
+
+ dispatch->glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, glamor_priv->ebo);
+
+ /* Set the vertex pointer. */
+ dispatch->glVertexAttribPointer(GLAMOR_VERTEX_POS, 2, GL_FLOAT,
+ GL_FALSE, glamor_priv->vb_stride,
+ (void *) ((long) glamor_priv->vbo_offset));
+ dispatch->glEnableVertexAttribArray(GLAMOR_VERTEX_POS);
+ stride = 2;
+
+ dispatch->glVertexAttribPointer(GLAMOR_VERTEX_SOURCE, 2, GL_FLOAT,
+ GL_FALSE, glamor_priv->vb_stride,
+ (void *) ((long) glamor_priv->vbo_offset +
+ stride * sizeof(float)));
+ dispatch->glEnableVertexAttribArray(GLAMOR_VERTEX_SOURCE);
+ stride += 2;
+
+ dispatch->glVertexAttribPointer(GLAMOR_VERTEX_TOP_BOTTOM, 2, GL_FLOAT,
+ GL_FALSE, glamor_priv->vb_stride,
+ (void *) ((long) glamor_priv->vbo_offset +
+ stride * sizeof(float)));
+ dispatch->glEnableVertexAttribArray(GLAMOR_VERTEX_TOP_BOTTOM);
+ stride += 2;
+
+ dispatch->glVertexAttribPointer(GLAMOR_VERTEX_LEFT_PARAM, 4, GL_FLOAT,
+ GL_FALSE, glamor_priv->vb_stride,
+ (void *) ((long) glamor_priv->vbo_offset +
+ stride * sizeof(float)));
+ dispatch->glEnableVertexAttribArray(GLAMOR_VERTEX_LEFT_PARAM);
+ stride += 4;
+
+ dispatch->glVertexAttribPointer(GLAMOR_VERTEX_RIGHT_PARAM, 4, GL_FLOAT,
+ GL_FALSE, glamor_priv->vb_stride,
+ (void *) ((long) glamor_priv->vbo_offset +
+ stride * sizeof(float)));
+ dispatch->glEnableVertexAttribArray(GLAMOR_VERTEX_RIGHT_PARAM);
+
+ glamor_put_dispatch(glamor_priv);
}
static Bool
_glamor_trapezoids_with_shader(CARD8 op,
- PicturePtr src, PicturePtr dst,
- PictFormatPtr mask_format, INT16 x_src, INT16 y_src,
- int ntrap, xTrapezoid * traps)
+ PicturePtr src, PicturePtr dst,
+ PictFormatPtr mask_format, INT16 x_src,
+ INT16 y_src, int ntrap, xTrapezoid * traps)
{
- ScreenPtr screen = dst->pDrawable->pScreen;
- glamor_screen_private *glamor_priv = glamor_get_screen_private(screen);
- struct shader_key key;
- glamor_composite_shader *shader = NULL;
- struct blendinfo op_info;
- PictFormatShort saved_source_format = 0;
- PixmapPtr source_pixmap = NULL;
- PixmapPtr dest_pixmap = NULL;
- glamor_pixmap_private *source_pixmap_priv = NULL;
- glamor_pixmap_private *dest_pixmap_priv = NULL;
- glamor_pixmap_private *temp_src_priv = NULL;
- int x_temp_src, y_temp_src;
- int src_width, src_height;
- int source_x_off, source_y_off;
- GLfloat src_xscale = 1, src_yscale = 1;
- int x_dst, y_dst;
- int dest_x_off, dest_y_off;
- GLfloat dst_xscale, dst_yscale;
- BoxRec bounds;
- PicturePtr temp_src = src;
- glamor_gl_dispatch *dispatch = NULL;
- int vert_stride = 3;
- int ntriangle_per_loop;
- int nclip_rect;
- int mclip_rect;
- int clip_processed;
- int clipped_vtx[6*2];
- RegionRec region;
- BoxPtr box = NULL;
- BoxPtr pbox = NULL;
- int traps_count = 0;
- int traps_not_completed = 0;
- xTrapezoid * ptrap = NULL;
- int nbox;
- float src_matrix[9];
- Bool ret = FALSE;
-
- /* If a mask format wasn't provided, we get to choose, but behavior should
- * be as if there was no temporary mask the traps were accumulated into.
- */
- if (!mask_format) {
- if (dst->polyEdge == PolyEdgeSharp)
- mask_format = PictureMatchFormat(screen, 1, PICT_a1);
- else
- mask_format = PictureMatchFormat(screen, 8, PICT_a8);
- for (; ntrap; ntrap--, traps++)
- glamor_trapezoids(op, src, dst, mask_format, x_src,
- y_src, 1, traps);
- return TRUE;
- }
-
- miTrapezoidBounds(ntrap, traps, &bounds);
- DEBUGF("The bounds for all traps is: bounds.x1 = %d, bounds.x2 = %d, "
- "bounds.y1 = %d, bounds.y2 = %d\n", bounds.x1, bounds.x2,
- bounds.y1, bounds.y2);
-
- /* No area need to render. */
- if (bounds.y1 >= bounds.y2 || bounds.x1 >= bounds.x2)
- return TRUE;
-
- dest_pixmap = glamor_get_drawable_pixmap(dst->pDrawable);
- dest_pixmap_priv = glamor_get_pixmap_private(dest_pixmap);
-
- if (!GLAMOR_PIXMAP_PRIV_HAS_FBO(dest_pixmap_priv)
- || dest_pixmap_priv->type == GLAMOR_TEXTURE_LARGE) {
- /* Currently. Always fallback to cpu if destination is in CPU memory.*/
- ret = FALSE;
- DEBUGF("dst pixmap has no FBO.\n");
- goto TRAPEZOID_OUT;
- }
-
- if (src->pDrawable) {
- source_pixmap = glamor_get_drawable_pixmap(src->pDrawable);
- source_pixmap_priv = glamor_get_pixmap_private(source_pixmap);
- temp_src_priv = source_pixmap_priv;
- if (source_pixmap_priv
- && (source_pixmap_priv->type == GLAMOR_DRM_ONLY
- || source_pixmap_priv->type == GLAMOR_TEXTURE_LARGE)) {
- ret = FALSE;
- goto TRAPEZOID_OUT;
- }
- }
-
- x_dst = bounds.x1;
- y_dst = bounds.y1;
-
- src_width = bounds.x2 - bounds.x1;
- src_height = bounds.y2 - bounds.y1;
-
- x_temp_src = x_src + bounds.x1 - (traps[0].left.p1.x >> 16);
- y_temp_src = y_src + bounds.y1 - (traps[0].left.p1.y >> 16);
-
- if ((!src->pDrawable &&
- (src->pSourcePict->type != SourcePictTypeSolidFill)) //1. The Gradient case.
- /* 2. Has no fbo but can upload.*/
- || (src->pDrawable && !GLAMOR_PIXMAP_PRIV_HAS_FBO(source_pixmap_priv)
- && ((src_width * src_height * 4 <
- source_pixmap->drawable.width * source_pixmap->drawable.height)
- || !glamor_check_fbo_size(glamor_priv, source_pixmap->drawable.width,
- source_pixmap->drawable.height)))) {
-
- if (!glamor_check_fbo_size(glamor_priv, src_width, src_height)) {
- ret = FALSE;
- goto TRAPEZOID_OUT;
- }
- temp_src = glamor_convert_gradient_picture(screen, src,
- x_src, y_src,
- src_width, src_height);
- if (!temp_src) {
- temp_src = src;
- ret = FALSE;
- DEBUGF("Convert gradient picture failed\n");
- goto TRAPEZOID_OUT;
- }
- temp_src_priv = glamor_get_pixmap_private((PixmapPtr)temp_src->pDrawable);
- x_temp_src = y_temp_src = 0;
- }
-
- x_dst += dst->pDrawable->x;
- y_dst += dst->pDrawable->y;
- if (temp_src->pDrawable) {
- x_temp_src += temp_src->pDrawable->x;
- y_temp_src += temp_src->pDrawable->y;
- }
-
- if (!miComputeCompositeRegion(&region,
- temp_src, NULL, dst,
- x_temp_src, y_temp_src,
- 0, 0,
- x_dst, y_dst,
- src_width, src_height)) {
- DEBUGF("All the regions are clipped out, do nothing\n");
- goto TRAPEZOID_OUT;
- }
-
- box = REGION_RECTS(&region);
- nbox = REGION_NUM_RECTS(&region);
- pbox = box;
-
- ret = glamor_composite_choose_shader(op, temp_src, NULL, dst,
- temp_src_priv, NULL, dest_pixmap_priv,
- &key, &shader, &op_info, &saved_source_format);
- if (ret == FALSE) {
- DEBUGF("can not set the shader program for composite\n");
- goto TRAPEZOID_RESET_GL;
- }
- glamor_set_destination_pixmap_priv_nc(dest_pixmap_priv);
- glamor_composite_set_shader_blend(dest_pixmap_priv, &key, shader, &op_info);
- glamor_priv->has_source_coords = key.source != SHADER_SOURCE_SOLID;
- glamor_priv->has_mask_coords = (key.mask != SHADER_MASK_NONE &&
- key.mask != SHADER_MASK_SOLID);
-
- dispatch = glamor_get_dispatch(glamor_priv);
-
- glamor_get_drawable_deltas(dst->pDrawable, dest_pixmap,
- &dest_x_off, &dest_y_off);
-
- pixmap_priv_get_dest_scale(dest_pixmap_priv, &dst_xscale, &dst_yscale);
-
- if (glamor_priv->has_source_coords) {
- source_pixmap = glamor_get_drawable_pixmap(temp_src->pDrawable);
- source_pixmap_priv = glamor_get_pixmap_private(source_pixmap);
- glamor_get_drawable_deltas(temp_src->pDrawable,
- source_pixmap,
- &source_x_off, &source_y_off);
- pixmap_priv_get_scale(source_pixmap_priv,
- &src_xscale, &src_yscale);
- glamor_picture_get_matrixf(temp_src, src_matrix);
- vert_stride += 3;
- }
-
- if (glamor_priv->has_mask_coords) {
- DEBUGF("Should never have mask coords here!\n");
- ret = FALSE;
- goto TRAPEZOID_RESET_GL;
- }
-
- /* A trapezoid clip with a rectangle will at most generate a hexagon,
- which can be devided into 4 triangles to render. */
- ntriangle_per_loop = (vert_stride * nbox * ntrap * 4) > GLAMOR_COMPOSITE_VBO_VERT_CNT ?
- (GLAMOR_COMPOSITE_VBO_VERT_CNT / vert_stride) : nbox * ntrap * 4;
- ntriangle_per_loop = (ntriangle_per_loop / 4) * 4;
-
- nclip_rect = nbox;
- while (nclip_rect) {
- mclip_rect = (nclip_rect * ntrap * 4) > ntriangle_per_loop ?
- (ntriangle_per_loop / (4 * ntrap)) : nclip_rect;
-
- if (!mclip_rect) {/* Maybe too many traps. */
- mclip_rect = 1;
- ptrap = traps;
- traps_count = ntriangle_per_loop / 4;
- traps_not_completed = ntrap - traps_count;
- } else {
- traps_count = ntrap;
- ptrap = traps;
- traps_not_completed = 0;
- }
-
-NTRAPS_LOOP_AGAIN:
-
- glamor_setup_composite_vbo(screen, mclip_rect * traps_count * 4 * vert_stride);
- clip_processed = mclip_rect;
-
-
- while (mclip_rect--) {
- while (traps_count--) {
- int vtx_num;
- int i;
- float vertices[3*2], source_texcoords[3*2];
-
- DEBUGF("In loop of render trapezoid, nclip_rect = %d, mclip_rect = %d, "
- "clip_processed = %d, traps_count = %d, traps_not_completed = %d\n",
- nclip_rect, mclip_rect, clip_processed, traps_count, traps_not_completed);
-
- if (_glamor_clip_trapezoid_vertex(ptrap, pbox, clipped_vtx, &vtx_num)) {
- for (i = 0; i < vtx_num - 2; i++) {
- int clipped_vtx_tmp[3*2];
-
- clipped_vtx_tmp[0] = clipped_vtx[0];
- clipped_vtx_tmp[1] = clipped_vtx[1];
- clipped_vtx_tmp[2] = clipped_vtx[(i+1)*2];
- clipped_vtx_tmp[3] = clipped_vtx[(i+1)*2 + 1];
- clipped_vtx_tmp[4] = clipped_vtx[(i+2)*2];
- clipped_vtx_tmp[5] = clipped_vtx[(i+2)*2 + 1];
- glamor_set_normalize_tri_vcoords(
- dst_xscale, dst_yscale, clipped_vtx_tmp,
- glamor_priv->yInverted, vertices);
- DEBUGF("vertices of triangle: (%f X %f), (%f X %f), "
- "(%f X %f)\n", vertices[0], vertices[1],
- vertices[2], vertices[3], vertices[4], vertices[5]);
-
-
- if (key.source != SHADER_SOURCE_SOLID) {
- if (src->transform) {
- glamor_set_transformed_normalize_tri_tcoords(
- source_pixmap_priv,
- src_matrix, src_xscale, src_yscale,
- clipped_vtx_tmp,
- glamor_priv->yInverted,
- source_texcoords);
- } else {
- glamor_set_normalize_tri_tcoords(
- src_xscale, src_yscale,
- clipped_vtx_tmp,
- glamor_priv->yInverted,
- source_texcoords);
- }
-
- DEBUGF("source_texcoords of triangle: (%f X %f), "
- "(%f X %f), (%f X %f)\n",
- source_texcoords[0], source_texcoords[1],
- source_texcoords[2], source_texcoords[3],
- source_texcoords[4], source_texcoords[5]);
- }
-
- glamor_emit_composite_triangle(screen, source_texcoords,
- NULL, vertices);
- }
- }
-
- ptrap++;
- }
-
- if (traps_not_completed) { /* one loop of ntraps not completed */
- mclip_rect = 1;
- traps_count = traps_not_completed > (ntriangle_per_loop / 4) ?
- (ntriangle_per_loop / 4) : traps_not_completed;
- traps_not_completed -= traps_count;
- glamor_flush_composite_triangles(screen);
- goto NTRAPS_LOOP_AGAIN;
- } else {
- ptrap = traps;
- traps_count = ntrap;
- }
-
- pbox++;
- }
-
- glamor_flush_composite_triangles(screen);
-
- nclip_rect -= clip_processed;
- }
-
- ret = TRUE;
-
-TRAPEZOID_RESET_GL:
- dispatch->glBindBuffer(GL_ARRAY_BUFFER, 0);
- dispatch->glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, 0);
- dispatch->glDisableVertexAttribArray(GLAMOR_VERTEX_POS);
- dispatch->glDisableVertexAttribArray(GLAMOR_VERTEX_SOURCE);
- dispatch->glDisableVertexAttribArray(GLAMOR_VERTEX_MASK);
- dispatch->glDisable(GL_BLEND);
+ ScreenPtr screen = dst->pDrawable->pScreen;
+ glamor_screen_private *glamor_priv = glamor_get_screen_private(screen);
+ struct shader_key key;
+ glamor_composite_shader *shader = NULL;
+ struct blendinfo op_info;
+ PictFormatShort saved_source_format = 0;
+ PixmapPtr source_pixmap = NULL;
+ PixmapPtr dest_pixmap = NULL;
+ glamor_pixmap_private *source_pixmap_priv = NULL;
+ glamor_pixmap_private *dest_pixmap_priv = NULL;
+ glamor_pixmap_private *temp_src_priv = NULL;
+ int x_temp_src, y_temp_src;
+ int src_width, src_height;
+ int source_x_off, source_y_off;
+ GLfloat src_xscale = 1, src_yscale = 1;
+ int x_dst, y_dst;
+ int dest_x_off, dest_y_off;
+ GLfloat dst_xscale, dst_yscale;
+ BoxRec bounds;
+ PicturePtr temp_src = src;
+ glamor_gl_dispatch *dispatch = NULL;
+ int vert_stride = 3;
+ int ntriangle_per_loop;
+ int nclip_rect;
+ int mclip_rect;
+ int clip_processed;
+ int clipped_vtx[6 * 2];
+ RegionRec region;
+ BoxPtr box = NULL;
+ BoxPtr pbox = NULL;
+ int traps_count = 0;
+ int traps_not_completed = 0;
+ xTrapezoid *ptrap = NULL;
+ int nbox;
+ float src_matrix[9];
+ Bool ret = FALSE;
+
+ /* If a mask format wasn't provided, we get to choose, but behavior should
+ * be as if there was no temporary mask the traps were accumulated into.
+ */
+ if (!mask_format) {
+ if (dst->polyEdge == PolyEdgeSharp)
+ mask_format = PictureMatchFormat(screen, 1, PICT_a1);
+ else
+ mask_format = PictureMatchFormat(screen, 8, PICT_a8);
+ for (; ntrap; ntrap--, traps++)
+ glamor_trapezoids(op, src, dst, mask_format, x_src,
+ y_src, 1, traps);
+ return TRUE;
+ }
+
+ miTrapezoidBounds(ntrap, traps, &bounds);
+ DEBUGF("The bounds for all traps is: bounds.x1 = %d, bounds.x2 = %d, "
+ "bounds.y1 = %d, bounds.y2 = %d\n", bounds.x1, bounds.x2,
+ bounds.y1, bounds.y2);
+
+ /* No area need to render. */
+ if (bounds.y1 >= bounds.y2 || bounds.x1 >= bounds.x2)
+ return TRUE;
+
+ dest_pixmap = glamor_get_drawable_pixmap(dst->pDrawable);
+ dest_pixmap_priv = glamor_get_pixmap_private(dest_pixmap);
+
+ if (!GLAMOR_PIXMAP_PRIV_HAS_FBO(dest_pixmap_priv)
+ || dest_pixmap_priv->type == GLAMOR_TEXTURE_LARGE) {
+ /* Currently. Always fallback to cpu if destination is in CPU memory. */
+ ret = FALSE;
+ DEBUGF("dst pixmap has no FBO.\n");
+ goto TRAPEZOID_OUT;
+ }
+
+ if (src->pDrawable) {
+ source_pixmap = glamor_get_drawable_pixmap(src->pDrawable);
+ source_pixmap_priv = glamor_get_pixmap_private(source_pixmap);
+ temp_src_priv = source_pixmap_priv;
+ if (source_pixmap_priv
+ && (source_pixmap_priv->type == GLAMOR_DRM_ONLY
+ || source_pixmap_priv->type == GLAMOR_TEXTURE_LARGE)) {
+ ret = FALSE;
+ goto TRAPEZOID_OUT;
+ }
+ }
+
+ x_dst = bounds.x1;
+ y_dst = bounds.y1;
+
+ src_width = bounds.x2 - bounds.x1;
+ src_height = bounds.y2 - bounds.y1;
+
+ x_temp_src = x_src + bounds.x1 - (traps[0].left.p1.x >> 16);
+ y_temp_src = y_src + bounds.y1 - (traps[0].left.p1.y >> 16);
+
+ if ((!src->pDrawable && (src->pSourcePict->type != SourcePictTypeSolidFill)) //1. The Gradient case.
+ /* 2. Has no fbo but can upload. */
+ || (src->pDrawable && !GLAMOR_PIXMAP_PRIV_HAS_FBO(source_pixmap_priv)
+ && ((src_width * src_height * 4 <
+ source_pixmap->drawable.width * source_pixmap->drawable.height)
+ || !glamor_check_fbo_size(glamor_priv,
+ source_pixmap->drawable.width,
+ source_pixmap->drawable.height)))) {
+
+ if (!glamor_check_fbo_size(glamor_priv, src_width, src_height)) {
+ ret = FALSE;
+ goto TRAPEZOID_OUT;
+ }
+ temp_src = glamor_convert_gradient_picture(screen, src,
+ x_src, y_src,
+ src_width, src_height);
+ if (!temp_src) {
+ temp_src = src;
+ ret = FALSE;
+ DEBUGF("Convert gradient picture failed\n");
+ goto TRAPEZOID_OUT;
+ }
+ temp_src_priv =
+ glamor_get_pixmap_private((PixmapPtr) temp_src->pDrawable);
+ x_temp_src = y_temp_src = 0;
+ }
+
+ x_dst += dst->pDrawable->x;
+ y_dst += dst->pDrawable->y;
+ if (temp_src->pDrawable) {
+ x_temp_src += temp_src->pDrawable->x;
+ y_temp_src += temp_src->pDrawable->y;
+ }
+
+ if (!miComputeCompositeRegion(&region,
+ temp_src, NULL, dst,
+ x_temp_src, y_temp_src,
+ 0, 0, x_dst, y_dst, src_width, src_height)) {
+ DEBUGF("All the regions are clipped out, do nothing\n");
+ goto TRAPEZOID_OUT;
+ }
+
+ box = REGION_RECTS(&region);
+ nbox = REGION_NUM_RECTS(&region);
+ pbox = box;
+
+ ret = glamor_composite_choose_shader(op, temp_src, NULL, dst,
+ temp_src_priv, NULL, dest_pixmap_priv,
+ &key, &shader, &op_info,
+ &saved_source_format);
+ if (ret == FALSE) {
+ DEBUGF("can not set the shader program for composite\n");
+ goto TRAPEZOID_RESET_GL;
+ }
+ glamor_set_destination_pixmap_priv_nc(dest_pixmap_priv);
+ glamor_composite_set_shader_blend(dest_pixmap_priv, &key, shader, &op_info);
+ glamor_priv->has_source_coords = key.source != SHADER_SOURCE_SOLID;
+ glamor_priv->has_mask_coords = (key.mask != SHADER_MASK_NONE &&
+ key.mask != SHADER_MASK_SOLID);
+
+ dispatch = glamor_get_dispatch(glamor_priv);
+
+ glamor_get_drawable_deltas(dst->pDrawable, dest_pixmap,
+ &dest_x_off, &dest_y_off);
+
+ pixmap_priv_get_dest_scale(dest_pixmap_priv, &dst_xscale, &dst_yscale);
+
+ if (glamor_priv->has_source_coords) {
+ source_pixmap = glamor_get_drawable_pixmap(temp_src->pDrawable);
+ source_pixmap_priv = glamor_get_pixmap_private(source_pixmap);
+ glamor_get_drawable_deltas(temp_src->pDrawable,
+ source_pixmap, &source_x_off, &source_y_off);
+ pixmap_priv_get_scale(source_pixmap_priv, &src_xscale, &src_yscale);
+ glamor_picture_get_matrixf(temp_src, src_matrix);
+ vert_stride += 3;
+ }
+
+ if (glamor_priv->has_mask_coords) {
+ DEBUGF("Should never have mask coords here!\n");
+ ret = FALSE;
+ goto TRAPEZOID_RESET_GL;
+ }
+
+ /* A trapezoid clip with a rectangle will at most generate a hexagon,
+ which can be devided into 4 triangles to render. */
+ ntriangle_per_loop =
+ (vert_stride * nbox * ntrap * 4) >
+ GLAMOR_COMPOSITE_VBO_VERT_CNT ? (GLAMOR_COMPOSITE_VBO_VERT_CNT /
+ vert_stride) : nbox * ntrap * 4;
+ ntriangle_per_loop = (ntriangle_per_loop / 4) * 4;
+
+ nclip_rect = nbox;
+ while (nclip_rect) {
+ mclip_rect = (nclip_rect * ntrap * 4) > ntriangle_per_loop ?
+ (ntriangle_per_loop / (4 * ntrap)) : nclip_rect;
+
+ if (!mclip_rect) { /* Maybe too many traps. */
+ mclip_rect = 1;
+ ptrap = traps;
+ traps_count = ntriangle_per_loop / 4;
+ traps_not_completed = ntrap - traps_count;
+ }
+ else {
+ traps_count = ntrap;
+ ptrap = traps;
+ traps_not_completed = 0;
+ }
+
+ NTRAPS_LOOP_AGAIN:
+
+ glamor_setup_composite_vbo(screen,
+ mclip_rect * traps_count * 4 * vert_stride);
+ clip_processed = mclip_rect;
+
+ while (mclip_rect--) {
+ while (traps_count--) {
+ int vtx_num;
+ int i;
+ float vertices[3 * 2], source_texcoords[3 * 2];
+
+ DEBUGF
+ ("In loop of render trapezoid, nclip_rect = %d, mclip_rect = %d, "
+ "clip_processed = %d, traps_count = %d, traps_not_completed = %d\n",
+ nclip_rect, mclip_rect, clip_processed, traps_count,
+ traps_not_completed);
+
+ if (_glamor_clip_trapezoid_vertex
+ (ptrap, pbox, clipped_vtx, &vtx_num)) {
+ for (i = 0; i < vtx_num - 2; i++) {
+ int clipped_vtx_tmp[3 * 2];
+
+ clipped_vtx_tmp[0] = clipped_vtx[0];
+ clipped_vtx_tmp[1] = clipped_vtx[1];
+ clipped_vtx_tmp[2] = clipped_vtx[(i + 1) * 2];
+ clipped_vtx_tmp[3] = clipped_vtx[(i + 1) * 2 + 1];
+ clipped_vtx_tmp[4] = clipped_vtx[(i + 2) * 2];
+ clipped_vtx_tmp[5] = clipped_vtx[(i + 2) * 2 + 1];
+ glamor_set_normalize_tri_vcoords(dst_xscale, dst_yscale,
+ clipped_vtx_tmp,
+ glamor_priv->yInverted,
+ vertices);
+ DEBUGF("vertices of triangle: (%f X %f), (%f X %f), "
+ "(%f X %f)\n", vertices[0], vertices[1],
+ vertices[2], vertices[3], vertices[4],
+ vertices[5]);
+
+ if (key.source != SHADER_SOURCE_SOLID) {
+ if (src->transform) {
+ glamor_set_transformed_normalize_tri_tcoords
+ (source_pixmap_priv, src_matrix, src_xscale,
+ src_yscale, clipped_vtx_tmp,
+ glamor_priv->yInverted, source_texcoords);
+ }
+ else {
+ glamor_set_normalize_tri_tcoords(src_xscale,
+ src_yscale,
+ clipped_vtx_tmp,
+ glamor_priv->
+ yInverted,
+ source_texcoords);
+ }
+
+ DEBUGF("source_texcoords of triangle: (%f X %f), "
+ "(%f X %f), (%f X %f)\n",
+ source_texcoords[0], source_texcoords[1],
+ source_texcoords[2], source_texcoords[3],
+ source_texcoords[4], source_texcoords[5]);
+ }
+
+ glamor_emit_composite_triangle(screen, source_texcoords,
+ NULL, vertices);
+ }
+ }
+
+ ptrap++;
+ }
+
+ if (traps_not_completed) { /* one loop of ntraps not completed */
+ mclip_rect = 1;
+ traps_count = traps_not_completed > (ntriangle_per_loop / 4) ?
+ (ntriangle_per_loop / 4) : traps_not_completed;
+ traps_not_completed -= traps_count;
+ glamor_flush_composite_triangles(screen);
+ goto NTRAPS_LOOP_AGAIN;
+ }
+ else {
+ ptrap = traps;
+ traps_count = ntrap;
+ }
+
+ pbox++;
+ }
+
+ glamor_flush_composite_triangles(screen);
+
+ nclip_rect -= clip_processed;
+ }
+
+ ret = TRUE;
+
+ TRAPEZOID_RESET_GL:
+ dispatch->glBindBuffer(GL_ARRAY_BUFFER, 0);
+ dispatch->glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, 0);
+ dispatch->glDisableVertexAttribArray(GLAMOR_VERTEX_POS);
+ dispatch->glDisableVertexAttribArray(GLAMOR_VERTEX_SOURCE);
+ dispatch->glDisableVertexAttribArray(GLAMOR_VERTEX_MASK);
+ dispatch->glDisable(GL_BLEND);
#ifndef GLAMOR_GLES2
- dispatch->glActiveTexture(GL_TEXTURE0);
- dispatch->glDisable(GL_TEXTURE_2D);
- dispatch->glActiveTexture(GL_TEXTURE1);
- dispatch->glDisable(GL_TEXTURE_2D);
+ dispatch->glActiveTexture(GL_TEXTURE0);
+ dispatch->glDisable(GL_TEXTURE_2D);
+ dispatch->glActiveTexture(GL_TEXTURE1);
+ dispatch->glDisable(GL_TEXTURE_2D);
#endif
- dispatch->glUseProgram(0);
-
-TRAPEZOID_OUT:
- if (box) {
- REGION_UNINIT(dst->pDrawable->pScreen, &region);
- }
-
- if (temp_src != src) {
- FreePicture(temp_src, 0);
- } else {
- if (saved_source_format) {
- src->format = saved_source_format;
- }
- }
-
- if (dispatch) {
- glamor_put_dispatch(glamor_priv);
- }
-
- return ret;
+ dispatch->glUseProgram(0);
+
+ TRAPEZOID_OUT:
+ if (box) {
+ REGION_UNINIT(dst->pDrawable->pScreen, &region);
+ }
+
+ if (temp_src != src) {
+ FreePicture(temp_src, 0);
+ }
+ else {
+ if (saved_source_format) {
+ src->format = saved_source_format;
+ }
+ }
+
+ if (dispatch) {
+ glamor_put_dispatch(glamor_priv);
+ }
+
+ return ret;
}
void
glamor_init_trapezoid_shader(ScreenPtr screen)
{
- glamor_screen_private *glamor_priv;
- glamor_gl_dispatch *dispatch;
- GLint fs_prog, vs_prog;
-
- const char *trapezoid_vs =
- GLAMOR_DEFAULT_PRECISION
- "attribute vec4 v_position;\n"
- "attribute vec2 v_texcoord;\n"
- /* v_top_bottom, v_left_param and v_right_param contain the
- constant value for all the vertex of one rect. Using uniform
- is more suitable but we need to reset the uniform variables
- for every rect rendering and can not use the vbo, which causes
- performance loss. So we set these attributes to same value
- for every vertex of one rect and so it is also a constant in FS */
- "attribute vec2 v_top_bottom;\n"
- "attribute vec4 v_left_param;\n"
- "attribute vec4 v_right_param;\n"
- "\n"
- "varying vec2 source_texture;\n"
- "varying float trap_top;\n"
- "varying float trap_bottom;\n"
- "varying float trap_left_x;\n"
- "varying float trap_left_y;\n"
- "varying float trap_left_slope;\n"
- "varying float trap_left_vertical_f;\n"
- "varying float trap_right_x;\n"
- "varying float trap_right_y;\n"
- "varying float trap_right_slope;\n"
- "varying float trap_right_vertical_f;\n"
- "\n"
- "void main()\n"
- "{\n"
- " gl_Position = v_position;\n"
- " source_texture = v_texcoord.xy;\n"
- " trap_top = v_top_bottom.x;\n"
- " trap_bottom = v_top_bottom.y;\n"
- " \n"
- " trap_left_x = v_left_param.x;\n"
- " trap_left_y = v_left_param.y;\n"
- " trap_left_slope = v_left_param.z;\n"
- " trap_left_vertical_f = v_left_param.w;\n"
- " \n"
- " trap_right_x = v_right_param.x;\n"
- " trap_right_y = v_right_param.y;\n"
- " trap_right_slope = v_right_param.z;\n"
- " trap_right_vertical_f = v_right_param.w;\n"
- "}\n";
-
- /*
- * Because some GL fill function do not support the MultSample
- * anti-alias, we need to do the MSAA here. This manner like
- * pixman, will caculate the value of area in trapezoid dividing
- * the totol area for each pixel, as follow:
- |
- ----+------------------------------------------------------>
- |
- | -------------
- | / \
- | / \
- | / \
- | / +----------------+
- | / |.....\ |
- | / |......\ |
- | / |.......\ |
- | / |........\ |
- | /-------------------+---------\ |
- | | |
- | | |
- | +----------------+
- |
- \|/
-
- */
- const char *trapezoid_fs =
- GLAMOR_DEFAULT_PRECISION
- "varying vec2 source_texture; \n"
- "varying float trap_top; \n"
- "varying float trap_bottom; \n"
- "varying float trap_left_x; \n"
- "varying float trap_left_y; \n"
- "varying float trap_left_slope; \n"
- "varying float trap_left_vertical_f; \n"
- "varying float trap_right_x; \n"
- "varying float trap_right_y; \n"
- "varying float trap_right_slope; \n"
- "varying float trap_right_vertical_f; \n"
- "float x_per_pix = 1.0;"
- "float y_per_pix = 1.0;"
- "\n"
- "float get_alpha_val() \n"
- "{ \n"
- " float x_up_cut_left; \n"
- " float x_bottom_cut_left; \n"
- " float x_up_cut_right; \n"
- " float x_bottom_cut_right; \n"
- " bool trap_left_vertical;\n"
- " bool trap_right_vertical;\n"
- " if (abs(trap_left_vertical_f - 1.0) <= 0.0001)\n"
- " trap_left_vertical = true;\n"
- " else\n"
- " trap_left_vertical = false;\n"
- " if (abs(trap_right_vertical_f - 1.0) <= 0.0001)\n"
- " trap_right_vertical = true;\n"
- " else\n"
- " trap_right_vertical = false;\n"
- " \n"
- " if(trap_left_vertical == true) { \n"
- " x_up_cut_left = trap_left_x; \n"
- " x_bottom_cut_left = trap_left_x; \n"
- " } else { \n"
- " x_up_cut_left = trap_left_x \n"
- " + (source_texture.y - y_per_pix/2.0 - trap_left_y) \n"
- " / trap_left_slope; \n"
- " x_bottom_cut_left = trap_left_x \n"
- " + (source_texture.y + y_per_pix/2.0 - trap_left_y) \n"
- " / trap_left_slope; \n"
- " } \n"
- " \n"
- " if(trap_right_vertical == true) { \n"
- " x_up_cut_right = trap_right_x; \n"
- " x_bottom_cut_right = trap_right_x; \n"
- " } else { \n"
- " x_up_cut_right = trap_right_x \n"
- " + (source_texture.y - y_per_pix/2.0 - trap_right_y) \n"
- " / trap_right_slope; \n"
- " x_bottom_cut_right = trap_right_x \n"
- " + (source_texture.y + y_per_pix/2.0 - trap_right_y) \n"
- " / trap_right_slope; \n"
- " } \n"
- " \n"
- " if((x_up_cut_left <= source_texture.x - x_per_pix/2.0) && \n"
- " (x_bottom_cut_left <= source_texture.x - x_per_pix/2.0) && \n"
- " (x_up_cut_right >= source_texture.x + x_per_pix/2.0) && \n"
- " (x_bottom_cut_right >= source_texture.x + x_per_pix/2.0) && \n"
- " (trap_top <= source_texture.y - y_per_pix/2.0) && \n"
- " (trap_bottom >= source_texture.y + y_per_pix/2.0)) { \n"
- // The complete inside case.
- " return 1.0; \n"
- " } else if((trap_top > source_texture.y + y_per_pix/2.0) || \n"
- " (trap_bottom < source_texture.y - y_per_pix/2.0)) { \n"
- // The complete outside. Above the top or Below the bottom.
- " return 0.0; \n"
- " } else { \n"
- " if((x_up_cut_right < source_texture.x - x_per_pix/2.0 && \n"
- " x_bottom_cut_right < source_texture.x - x_per_pix/2.0) \n"
- " || (x_up_cut_left > source_texture.x + x_per_pix/2.0 && \n"
- " x_bottom_cut_left > source_texture.x + x_per_pix/2.0)) { \n"
- // The complete outside. At Left or Right of the trapezoide.
- " return 0.0; \n"
- " } \n"
- " } \n"
- // Get here, the pix is partly inside the trapezoid.
- " { \n"
- " float percent = 0.0; \n"
- " float up = (source_texture.y - y_per_pix/2.0) >= trap_top ? \n"
- " (source_texture.y - y_per_pix/2.0) : trap_top; \n"
- " float bottom = (source_texture.y + y_per_pix/2.0) <= trap_bottom ? \n"
- " (source_texture.y + y_per_pix/2.0) : trap_bottom; \n"
- " float left = source_texture.x - x_per_pix/2.0; \n"
- " float right = source_texture.x + x_per_pix/2.0; \n"
- " \n"
- " percent = (bottom - up) / y_per_pix; \n"
- " \n"
- " if(trap_left_vertical == true) { \n"
- " if(trap_left_x > source_texture.x - x_per_pix/2.0 && \n"
- " trap_left_x < source_texture.x + x_per_pix/2.0) \n"
- " left = trap_left_x; \n"
- " } \n"
- " if(trap_right_vertical == true) { \n"
- " if(trap_right_x > source_texture.x - x_per_pix/2.0 && \n"
- " trap_right_x < source_texture.x + x_per_pix/2.0) \n"
- " right = trap_right_x; \n"
- " } \n"
- " if((up >= bottom) || (left >= right)) \n"
- " return 0.0; \n"
- " \n"
- " percent = percent * ((right - left)/x_per_pix); \n"
- " if(trap_left_vertical == true && trap_right_vertical == true) \n"
- " return percent; \n"
- " \n"
- " if(trap_left_vertical != true) { \n"
- " float area; \n"
- // the slope should never be 0.0 here
- " float up_x = trap_left_x + (up - trap_left_y)/trap_left_slope; \n"
- " float bottom_x = trap_left_x + (bottom - trap_left_y)/trap_left_slope; \n"
- " if(trap_left_slope < 0.0 && up_x > left) { \n"
- /* case 1
- |
- ----+------------------------------------->
- | /
- | /
- | +---/--------+
- | | /.........|
- | | /..........|
- | |/...........|
- | /............|
- | /|............|
- | +------------+
- |
- \|/
- */
- " float left_y = trap_left_y + trap_left_slope*(left - trap_left_x); \n"
- " if((up_x > left) && (left_y > up)) { \n"
- " area = 0.5 * (up_x - left) * (left_y - up); \n"
- " if(up_x > right) { \n"
- " float right_y = trap_left_y \n"
- " + trap_left_slope*(right - trap_left_x); \n"
- " area = area - 0.5 * (up_x - right) * (right_y - up); \n"
- " } \n"
- " if(left_y > bottom) { \n"
- " area = area - 0.5 * (bottom_x - left) * (left_y - bottom); \n"
- " } \n"
- " } else { \n"
- " area = 0.0; \n"
- " } \n"
- " percent = percent * (1.0 - (area/((right-left)*(bottom-up)))); \n"
- " } else if(trap_left_slope > 0.0 && bottom_x > left) { \n"
- /* case 2
- |
- ----+------------------------------------->
- | \
- | \
- | +\-----------+
- | | \..........|
- | | \.........|
- | | \........|
- | | \.......|
- | | \......|
- | +------\-----+
- | \
- | \
- \|/
- */
- " float right_y = trap_left_y + trap_left_slope*(right - trap_left_x); \n"
- " if((up_x < right) && (right_y > up)) { \n"
- " area = 0.5 * (right - up_x) * (right_y - up); \n"
- " if(up_x < left) { \n"
- " float left_y = trap_left_y \n"
- " + trap_left_slope*(left - trap_left_x); \n"
- " area = area - 0.5 * (left - up_x) * (left_y - up); \n"
- " } \n"
- " if(right_y > bottom) { \n"
- " area = area - 0.5 * (right - bottom_x) * (right_y - bottom); \n"
- " } \n"
- " } else { \n"
- " area = 0.0; \n"
- " } \n"
- " percent = percent * (area/((right-left)*(bottom-up))); \n"
- " } \n"
- " } \n"
- " \n"
- " if(trap_right_vertical != true) { \n"
- " float area; \n"
- // the slope should never be 0.0 here
- " float up_x = trap_right_x + (up - trap_right_y)/trap_right_slope; \n"
- " float bottom_x = trap_right_x + (bottom - trap_right_y)/trap_right_slope; \n"
- " if(trap_right_slope < 0.0 && bottom_x < right) { \n"
- /* case 3
- |
- ----+------------------------------------->
- | /
- | +--------/---+
- | |......./ |
- | |....../ |
- | |...../ |
- | |..../ |
- | |.../ |
- | +--/---------+
- | /
- |
- \|/
- */
- " float left_y = trap_right_y + trap_right_slope*(left - trap_right_x); \n"
- " if((up_x > left) && (left_y > up)) { \n"
- " area = 0.5 * (up_x - left) * (left_y - up); \n"
- " if(up_x > right) { \n"
- " float right_y = trap_right_y \n"
- " + trap_right_slope*(right - trap_right_x); \n"
- " area = area - 0.5 * (up_x - right) * (right_y - up); \n"
- " } \n"
- " if(left_y > bottom) { \n"
- " area = area - 0.5 * (bottom_x - left) * (left_y - bottom); \n"
- " } \n"
- " } else { \n"
- " area = 0.0; \n"
- " } \n"
- " percent = percent * (area/((right-left)*(bottom-up))); \n"
- " } else if(trap_right_slope > 0.0 && up_x < right) { \n"
- /* case 4
- |
- ----+------------------------------------->
- | \
- | +--------\---+
- | |.........\ |
- | |..........\ |
- | |...........\|
- | |............\
- | |............|\
- | +------------+ \
- | \
- |
- \|/
- */
- " float right_y = trap_right_y + trap_right_slope*(right - trap_right_x); \n"
- " if((up_x < right) && (right_y > up)) { \n"
- " area = 0.5 * (right - up_x) * (right_y - up); \n"
- " if(up_x < left) { \n"
- " float left_y = trap_right_y \n"
- " + trap_right_slope*(left - trap_right_x); \n"
- " area = area - 0.5 * (left - up_x) * (left_y - up); \n"
- " } \n"
- " if(right_y > bottom) { \n"
- " area = area - 0.5 * (right - bottom_x) * (right_y - bottom); \n"
- " } \n"
- " } else { \n"
- " area = 0.0; \n"
- " } \n"
- " percent = percent * (1.0 - (area/((right-left)*(bottom-up)))); \n"
- " } \n"
- " } \n"
- " \n"
- " return percent; \n"
- " } \n"
- "} \n"
- "\n"
- "void main() \n"
- "{ \n"
- " float alpha_val = get_alpha_val(); \n"
- " gl_FragColor = vec4(0.0, 0.0, 0.0, alpha_val); \n"
- "}\n";
-
- glamor_priv = glamor_get_screen_private(screen);
- dispatch = glamor_get_dispatch(glamor_priv);
-
- glamor_priv->trapezoid_prog = dispatch->glCreateProgram();
-
- vs_prog = glamor_compile_glsl_prog(dispatch,
- GL_VERTEX_SHADER, trapezoid_vs);
- fs_prog = glamor_compile_glsl_prog(dispatch,
- GL_FRAGMENT_SHADER, trapezoid_fs);
-
- dispatch->glAttachShader(glamor_priv->trapezoid_prog, vs_prog);
- dispatch->glAttachShader(glamor_priv->trapezoid_prog, fs_prog);
-
- dispatch->glBindAttribLocation(glamor_priv->trapezoid_prog,
- GLAMOR_VERTEX_POS, "v_positionsition");
- dispatch->glBindAttribLocation(glamor_priv->trapezoid_prog,
- GLAMOR_VERTEX_SOURCE, "v_texcoord");
- dispatch->glBindAttribLocation(glamor_priv->trapezoid_prog,
- GLAMOR_VERTEX_TOP_BOTTOM, "v_top_bottom");
- dispatch->glBindAttribLocation(glamor_priv->trapezoid_prog,
- GLAMOR_VERTEX_LEFT_PARAM, "v_left_param");
- dispatch->glBindAttribLocation(glamor_priv->trapezoid_prog,
- GLAMOR_VERTEX_RIGHT_PARAM, "v_right_param");
-
- glamor_link_glsl_prog(dispatch, glamor_priv->trapezoid_prog);
-
- dispatch->glUseProgram(0);
-
- glamor_put_dispatch(glamor_priv);
+ glamor_screen_private *glamor_priv;
+ glamor_gl_dispatch *dispatch;
+ GLint fs_prog, vs_prog;
+
+ const char *trapezoid_vs =
+ GLAMOR_DEFAULT_PRECISION
+ "attribute vec4 v_position;\n"
+ "attribute vec2 v_texcoord;\n"
+ /* v_top_bottom, v_left_param and v_right_param contain the
+ constant value for all the vertex of one rect. Using uniform
+ is more suitable but we need to reset the uniform variables
+ for every rect rendering and can not use the vbo, which causes
+ performance loss. So we set these attributes to same value
+ for every vertex of one rect and so it is also a constant in FS */
+ "attribute vec2 v_top_bottom;\n"
+ "attribute vec4 v_left_param;\n"
+ "attribute vec4 v_right_param;\n"
+ "\n"
+ "varying vec2 source_texture;\n"
+ "varying float trap_top;\n"
+ "varying float trap_bottom;\n"
+ "varying float trap_left_x;\n"
+ "varying float trap_left_y;\n"
+ "varying float trap_left_slope;\n"
+ "varying float trap_left_vertical_f;\n"
+ "varying float trap_right_x;\n"
+ "varying float trap_right_y;\n"
+ "varying float trap_right_slope;\n"
+ "varying float trap_right_vertical_f;\n"
+ "\n"
+ "void main()\n"
+ "{\n"
+ " gl_Position = v_position;\n"
+ " source_texture = v_texcoord.xy;\n"
+ " trap_top = v_top_bottom.x;\n"
+ " trap_bottom = v_top_bottom.y;\n"
+ " \n"
+ " trap_left_x = v_left_param.x;\n"
+ " trap_left_y = v_left_param.y;\n"
+ " trap_left_slope = v_left_param.z;\n"
+ " trap_left_vertical_f = v_left_param.w;\n"
+ " \n"
+ " trap_right_x = v_right_param.x;\n"
+ " trap_right_y = v_right_param.y;\n"
+ " trap_right_slope = v_right_param.z;\n"
+ " trap_right_vertical_f = v_right_param.w;\n"
+ "}\n";
+
+ /*
+ * Because some GL fill function do not support the MultSample
+ * anti-alias, we need to do the MSAA here. This manner like
+ * pixman, will caculate the value of area in trapezoid dividing
+ * the totol area for each pixel, as follow:
+ |
+ ----+------------------------------------------------------>
+ |
+ | -------------
+ | / \
+ | / \
+ | / \
+ | / +----------------+
+ | / |.....\ |
+ | / |......\ |
+ | / |.......\ |
+ | / |........\ |
+ | /-------------------+---------\ |
+ | | |
+ | | |
+ | +----------------+
+ |
+ \|/
+
+ */
+ const char *trapezoid_fs =
+ GLAMOR_DEFAULT_PRECISION
+ "varying vec2 source_texture; \n"
+ "varying float trap_top; \n"
+ "varying float trap_bottom; \n"
+ "varying float trap_left_x; \n"
+ "varying float trap_left_y; \n"
+ "varying float trap_left_slope; \n"
+ "varying float trap_left_vertical_f; \n"
+ "varying float trap_right_x; \n"
+ "varying float trap_right_y; \n"
+ "varying float trap_right_slope; \n"
+ "varying float trap_right_vertical_f; \n"
+ "float x_per_pix = 1.0;"
+ "float y_per_pix = 1.0;"
+ "\n"
+ "float get_alpha_val() \n"
+ "{ \n"
+ " float x_up_cut_left; \n"
+ " float x_bottom_cut_left; \n"
+ " float x_up_cut_right; \n"
+ " float x_bottom_cut_right; \n"
+ " bool trap_left_vertical;\n"
+ " bool trap_right_vertical;\n"
+ " if (abs(trap_left_vertical_f - 1.0) <= 0.0001)\n"
+ " trap_left_vertical = true;\n"
+ " else\n"
+ " trap_left_vertical = false;\n"
+ " if (abs(trap_right_vertical_f - 1.0) <= 0.0001)\n"
+ " trap_right_vertical = true;\n"
+ " else\n"
+ " trap_right_vertical = false;\n"
+ " \n"
+ " if(trap_left_vertical == true) { \n"
+ " x_up_cut_left = trap_left_x; \n"
+ " x_bottom_cut_left = trap_left_x; \n"
+ " } else { \n"
+ " x_up_cut_left = trap_left_x \n"
+ " + (source_texture.y - y_per_pix/2.0 - trap_left_y) \n"
+ " / trap_left_slope; \n"
+ " x_bottom_cut_left = trap_left_x \n"
+ " + (source_texture.y + y_per_pix/2.0 - trap_left_y) \n"
+ " / trap_left_slope; \n"
+ " } \n"
+ " \n"
+ " if(trap_right_vertical == true) { \n"
+ " x_up_cut_right = trap_right_x; \n"
+ " x_bottom_cut_right = trap_right_x; \n"
+ " } else { \n"
+ " x_up_cut_right = trap_right_x \n"
+ " + (source_texture.y - y_per_pix/2.0 - trap_right_y) \n"
+ " / trap_right_slope; \n"
+ " x_bottom_cut_right = trap_right_x \n"
+ " + (source_texture.y + y_per_pix/2.0 - trap_right_y) \n"
+ " / trap_right_slope; \n"
+ " } \n"
+ " \n"
+ " if((x_up_cut_left <= source_texture.x - x_per_pix/2.0) && \n"
+ " (x_bottom_cut_left <= source_texture.x - x_per_pix/2.0) && \n"
+ " (x_up_cut_right >= source_texture.x + x_per_pix/2.0) && \n"
+ " (x_bottom_cut_right >= source_texture.x + x_per_pix/2.0) && \n"
+ " (trap_top <= source_texture.y - y_per_pix/2.0) && \n"
+ " (trap_bottom >= source_texture.y + y_per_pix/2.0)) { \n"
+ // The complete inside case.
+ " return 1.0; \n"
+ " } else if((trap_top > source_texture.y + y_per_pix/2.0) || \n"
+ " (trap_bottom < source_texture.y - y_per_pix/2.0)) { \n"
+ // The complete outside. Above the top or Below the bottom.
+ " return 0.0; \n"
+ " } else { \n"
+ " if((x_up_cut_right < source_texture.x - x_per_pix/2.0 && \n"
+ " x_bottom_cut_right < source_texture.x - x_per_pix/2.0) \n"
+ " || (x_up_cut_left > source_texture.x + x_per_pix/2.0 && \n"
+ " x_bottom_cut_left > source_texture.x + x_per_pix/2.0)) { \n"
+ // The complete outside. At Left or Right of the trapezoide.
+ " return 0.0; \n"
+ " } \n"
+ " } \n"
+ // Get here, the pix is partly inside the trapezoid.
+ " { \n"
+ " float percent = 0.0; \n"
+ " float up = (source_texture.y - y_per_pix/2.0) >= trap_top ? \n"
+ " (source_texture.y - y_per_pix/2.0) : trap_top; \n"
+ " float bottom = (source_texture.y + y_per_pix/2.0) <= trap_bottom ? \n"
+ " (source_texture.y + y_per_pix/2.0) : trap_bottom; \n"
+ " float left = source_texture.x - x_per_pix/2.0; \n"
+ " float right = source_texture.x + x_per_pix/2.0; \n"
+ " \n"
+ " percent = (bottom - up) / y_per_pix; \n"
+ " \n"
+ " if(trap_left_vertical == true) { \n"
+ " if(trap_left_x > source_texture.x - x_per_pix/2.0 && \n"
+ " trap_left_x < source_texture.x + x_per_pix/2.0) \n"
+ " left = trap_left_x; \n"
+ " } \n"
+ " if(trap_right_vertical == true) { \n"
+ " if(trap_right_x > source_texture.x - x_per_pix/2.0 && \n"
+ " trap_right_x < source_texture.x + x_per_pix/2.0) \n"
+ " right = trap_right_x; \n"
+ " } \n"
+ " if((up >= bottom) || (left >= right)) \n"
+ " return 0.0; \n"
+ " \n"
+ " percent = percent * ((right - left)/x_per_pix); \n"
+ " if(trap_left_vertical == true && trap_right_vertical == true) \n"
+ " return percent; \n"
+ " \n"
+ " if(trap_left_vertical != true) { \n"
+ " float area; \n"
+ // the slope should never be 0.0 here
+ " float up_x = trap_left_x + (up - trap_left_y)/trap_left_slope; \n"
+ " float bottom_x = trap_left_x + (bottom - trap_left_y)/trap_left_slope; \n"
+ " if(trap_left_slope < 0.0 && up_x > left) { \n"
+ /* case 1
+ |
+ ----+------------------------------------->
+ | /
+ | /
+ | +---/--------+
+ | | /.........|
+ | | /..........|
+ | |/...........|
+ | /............|
+ | /|............|
+ | +------------+
+ |
+ \|/
+ */
+ " float left_y = trap_left_y + trap_left_slope*(left - trap_left_x); \n"
+ " if((up_x > left) && (left_y > up)) { \n"
+ " area = 0.5 * (up_x - left) * (left_y - up); \n"
+ " if(up_x > right) { \n"
+ " float right_y = trap_left_y \n"
+ " + trap_left_slope*(right - trap_left_x); \n"
+ " area = area - 0.5 * (up_x - right) * (right_y - up); \n"
+ " } \n"
+ " if(left_y > bottom) { \n"
+ " area = area - 0.5 * (bottom_x - left) * (left_y - bottom); \n"
+ " } \n"
+ " } else { \n"
+ " area = 0.0; \n"
+ " } \n"
+ " percent = percent * (1.0 - (area/((right-left)*(bottom-up)))); \n"
+ " } else if(trap_left_slope > 0.0 && bottom_x > left) { \n"
+ /* case 2
+ |
+ ----+------------------------------------->
+ | \
+ | \
+ | +\-----------+
+ | | \..........|
+ | | \.........|
+ | | \........|
+ | | \.......|
+ | | \......|
+ | +------\-----+
+ | \
+ | \
+ \|/
+ */
+ " float right_y = trap_left_y + trap_left_slope*(right - trap_left_x); \n"
+ " if((up_x < right) && (right_y > up)) { \n"
+ " area = 0.5 * (right - up_x) * (right_y - up); \n"
+ " if(up_x < left) { \n"
+ " float left_y = trap_left_y \n"
+ " + trap_left_slope*(left - trap_left_x); \n"
+ " area = area - 0.5 * (left - up_x) * (left_y - up); \n"
+ " } \n"
+ " if(right_y > bottom) { \n"
+ " area = area - 0.5 * (right - bottom_x) * (right_y - bottom); \n"
+ " } \n"
+ " } else { \n"
+ " area = 0.0; \n"
+ " } \n"
+ " percent = percent * (area/((right-left)*(bottom-up))); \n"
+ " } \n"
+ " } \n"
+ " \n"
+ " if(trap_right_vertical != true) { \n"
+ " float area; \n"
+ // the slope should never be 0.0 here
+ " float up_x = trap_right_x + (up - trap_right_y)/trap_right_slope; \n"
+ " float bottom_x = trap_right_x + (bottom - trap_right_y)/trap_right_slope; \n"
+ " if(trap_right_slope < 0.0 && bottom_x < right) { \n"
+ /* case 3
+ |
+ ----+------------------------------------->
+ | /
+ | +--------/---+
+ | |......./ |
+ | |....../ |
+ | |...../ |
+ | |..../ |
+ | |.../ |
+ | +--/---------+
+ | /
+ |
+ \|/
+ */
+ " float left_y = trap_right_y + trap_right_slope*(left - trap_right_x); \n"
+ " if((up_x > left) && (left_y > up)) { \n"
+ " area = 0.5 * (up_x - left) * (left_y - up); \n"
+ " if(up_x > right) { \n"
+ " float right_y = trap_right_y \n"
+ " + trap_right_slope*(right - trap_right_x); \n"
+ " area = area - 0.5 * (up_x - right) * (right_y - up); \n"
+ " } \n"
+ " if(left_y > bottom) { \n"
+ " area = area - 0.5 * (bottom_x - left) * (left_y - bottom); \n"
+ " } \n"
+ " } else { \n"
+ " area = 0.0; \n"
+ " } \n"
+ " percent = percent * (area/((right-left)*(bottom-up))); \n"
+ " } else if(trap_right_slope > 0.0 && up_x < right) { \n"
+ /* case 4
+ |
+ ----+------------------------------------->
+ | \
+ | +--------\---+
+ | |.........\ |
+ | |..........\ |
+ | |...........\|
+ | |............\
+ | |............|\
+ | +------------+ \
+ | \
+ |
+ \|/
+ */
+ " float right_y = trap_right_y + trap_right_slope*(right - trap_right_x); \n"
+ " if((up_x < right) && (right_y > up)) { \n"
+ " area = 0.5 * (right - up_x) * (right_y - up); \n"
+ " if(up_x < left) { \n"
+ " float left_y = trap_right_y \n"
+ " + trap_right_slope*(left - trap_right_x); \n"
+ " area = area - 0.5 * (left - up_x) * (left_y - up); \n"
+ " } \n"
+ " if(right_y > bottom) { \n"
+ " area = area - 0.5 * (right - bottom_x) * (right_y - bottom); \n"
+ " } \n"
+ " } else { \n"
+ " area = 0.0; \n"
+ " } \n"
+ " percent = percent * (1.0 - (area/((right-left)*(bottom-up)))); \n"
+ " } \n"
+ " } \n"
+ " \n"
+ " return percent; \n"
+ " } \n"
+ "} \n"
+ "\n"
+ "void main() \n"
+ "{ \n"
+ " float alpha_val = get_alpha_val(); \n"
+ " gl_FragColor = vec4(0.0, 0.0, 0.0, alpha_val); \n"
+ "}\n";
+
+ glamor_priv = glamor_get_screen_private(screen);
+ dispatch = glamor_get_dispatch(glamor_priv);
+
+ glamor_priv->trapezoid_prog = dispatch->glCreateProgram();
+
+ vs_prog = glamor_compile_glsl_prog(dispatch,
+ GL_VERTEX_SHADER, trapezoid_vs);
+ fs_prog = glamor_compile_glsl_prog(dispatch,
+ GL_FRAGMENT_SHADER, trapezoid_fs);
+
+ dispatch->glAttachShader(glamor_priv->trapezoid_prog, vs_prog);
+ dispatch->glAttachShader(glamor_priv->trapezoid_prog, fs_prog);
+
+ dispatch->glBindAttribLocation(glamor_priv->trapezoid_prog,
+ GLAMOR_VERTEX_POS, "v_positionsition");
+ dispatch->glBindAttribLocation(glamor_priv->trapezoid_prog,
+ GLAMOR_VERTEX_SOURCE, "v_texcoord");
+ dispatch->glBindAttribLocation(glamor_priv->trapezoid_prog,
+ GLAMOR_VERTEX_TOP_BOTTOM, "v_top_bottom");
+ dispatch->glBindAttribLocation(glamor_priv->trapezoid_prog,
+ GLAMOR_VERTEX_LEFT_PARAM, "v_left_param");
+ dispatch->glBindAttribLocation(glamor_priv->trapezoid_prog,
+ GLAMOR_VERTEX_RIGHT_PARAM, "v_right_param");
+
+ glamor_link_glsl_prog(dispatch, glamor_priv->trapezoid_prog);
+
+ dispatch->glUseProgram(0);
+
+ glamor_put_dispatch(glamor_priv);
}
void
glamor_fini_trapezoid_shader(ScreenPtr screen)
{
- glamor_screen_private *glamor_priv;
- glamor_gl_dispatch *dispatch;
+ glamor_screen_private *glamor_priv;
+ glamor_gl_dispatch *dispatch;
- glamor_priv = glamor_get_screen_private(screen);
- dispatch = glamor_get_dispatch(glamor_priv);
- dispatch->glDeleteProgram(glamor_priv->trapezoid_prog);
- glamor_put_dispatch(glamor_priv);
+ glamor_priv = glamor_get_screen_private(screen);
+ dispatch = glamor_get_dispatch(glamor_priv);
+ dispatch->glDeleteProgram(glamor_priv->trapezoid_prog);
+ glamor_put_dispatch(glamor_priv);
}
static Bool
_glamor_generate_trapezoid_with_shader(ScreenPtr screen, PicturePtr picture,
- xTrapezoid * traps, int ntrap, BoxRec *bounds)
+ xTrapezoid *traps, int ntrap,
+ BoxRec *bounds)
{
- glamor_screen_private *glamor_priv;
- glamor_gl_dispatch *dispatch;
- glamor_pixmap_private *pixmap_priv;
- PixmapPtr pixmap = NULL;
- GLint trapezoid_prog;
- GLfloat xscale, yscale;
- float left_slope, right_slope;
- xTrapezoid *ptrap;
- BoxRec one_trap_bound;
- int nrect_max;
- int i, j;
- float *vertices;
- float params[4];
-
- glamor_priv = glamor_get_screen_private(screen);
- trapezoid_prog = glamor_priv->trapezoid_prog;
-
- pixmap = glamor_get_drawable_pixmap(picture->pDrawable);
- pixmap_priv = glamor_get_pixmap_private(pixmap);
-
- if (!GLAMOR_PIXMAP_PRIV_HAS_FBO(pixmap_priv)
- || pixmap_priv->type == GLAMOR_TEXTURE_LARGE) { /* should always have here. */
- DEBUGF("GLAMOR_PIXMAP_PRIV_HAS_FBO check failed, fallback\n");
- return FALSE;
- }
-
- /* First, clear all to zero */
- if (!glamor_solid(pixmap, 0, 0, pixmap_priv->base.pixmap->drawable.width,
- pixmap_priv->base.pixmap->drawable.height,
- GXclear, 0xFFFFFFFF, 0)) {
- DEBUGF("glamor_solid failed, fallback\n");
- return FALSE;
- }
-
- dispatch = glamor_get_dispatch(glamor_priv);
-
- glamor_set_destination_pixmap_priv_nc(pixmap_priv);
-
- pixmap_priv_get_dest_scale(pixmap_priv, (&xscale), (&yscale));
-
- dispatch->glBindBuffer(GL_ARRAY_BUFFER, 0);
- dispatch->glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, 0);
-
- /* Now draw the Trapezoid mask. */
- dispatch->glUseProgram(trapezoid_prog);
-
- dispatch->glEnable(GL_BLEND);
- dispatch->glBlendFunc(GL_ONE, GL_ONE);
-
- nrect_max = GLAMOR_COMPOSITE_VBO_VERT_CNT / (4 * GLAMOR_VERTEX_RIGHT_PARAM);
-
- for (i = 0; i < ntrap;) {
- int mrect;
- int stride;
-
- mrect = (ntrap - i) > nrect_max ? nrect_max : (ntrap - i);
- glamor_setup_composite_vbo_for_trapezoid(screen, 4 * mrect);
- stride = glamor_priv->vb_stride / sizeof(float);
-
- for (j = 0; j < mrect; j++) {
- ptrap = traps + i + j;
-
- DEBUGF("--- The parameter of xTrapezoid is:\ntop: %d 0x%x\tbottom: %d 0x%x\n"
- "left: p1 (%d 0x%x, %d 0x%x)\tp2 (%d 0x%x, %d 0x%x)\n"
- "right: p1 (%d 0x%x, %d 0x%x)\tp2 (%d 0x%x, %d 0x%x)\n",
- xFixedToInt(ptrap->top), ptrap->top,
- xFixedToInt(ptrap->bottom), ptrap->bottom,
- xFixedToInt(ptrap->left.p1.x), ptrap->left.p1.x,
- xFixedToInt(ptrap->left.p1.y), ptrap->left.p1.y,
- xFixedToInt(ptrap->left.p2.x), ptrap->left.p2.x,
- xFixedToInt(ptrap->left.p2.y), ptrap->left.p2.y,
- xFixedToInt(ptrap->right.p1.x), ptrap->right.p1.x,
- xFixedToInt(ptrap->right.p1.y), ptrap->right.p1.y,
- xFixedToInt(ptrap->right.p2.x), ptrap->right.p2.x,
- xFixedToInt(ptrap->right.p2.y), ptrap->right.p2.y);
-
- miTrapezoidBounds(1, ptrap, &one_trap_bound);
-
- vertices = (float*)(glamor_priv->vb + glamor_priv->vbo_offset) + 2;
- glamor_set_tcoords_ext((pixmap_priv->base.pixmap->drawable.width),
- (pixmap_priv->base.pixmap->drawable.height),
- (one_trap_bound.x1),
- (one_trap_bound.y1),
- (one_trap_bound.x2),
- (one_trap_bound.y2),
- glamor_priv->yInverted, vertices, stride);
- DEBUGF("tex_vertices --> leftup : %f X %f, rightup: %f X %f,"
- "rightbottom: %f X %f, leftbottom : %f X %f\n",
- vertices[0], vertices[1],
- vertices[1*stride], vertices[1*stride + 1],
- vertices[2*stride], vertices[2*stride + 1],
- vertices[3*stride], vertices[3*stride + 1]);
-
- /* Need to rebase. */
- one_trap_bound.x1 -= bounds->x1;
- one_trap_bound.x2 -= bounds->x1;
- one_trap_bound.y1 -= bounds->y1;
- one_trap_bound.y2 -= bounds->y1;
-
- vertices -= 2;
-
- glamor_set_normalize_vcoords_ext(pixmap_priv, xscale, yscale,
- one_trap_bound.x1, one_trap_bound.y1,
- one_trap_bound.x2, one_trap_bound.y2,
- glamor_priv->yInverted, vertices, stride);
- DEBUGF("vertices --> leftup : %f X %f, rightup: %f X %f,"
- "rightbottom: %f X %f, leftbottom : %f X %f\n",
- vertices[0], vertices[1],
- vertices[1*stride], vertices[1*stride + 1],
- vertices[2*stride], vertices[2*stride + 1],
- vertices[3*stride], vertices[3*stride + 1]);
- vertices += 4;
-
- /* Set the top and bottom. */
- params[0] = ((float)ptrap->top) / 65536;
- params[1] = ((float)ptrap->bottom) / 65536;
- glamor_set_const_ext(params, 2, vertices, 4, stride);
- vertices += 2;
-
- /* Set the left params. */
- params[0] = ((float)ptrap->left.p1.x) / 65536;
- params[1] = ((float)ptrap->left.p1.y) / 65536;
-
- if (ptrap->left.p1.x == ptrap->left.p2.x) {
- left_slope = 0.0;
- params[3] = 1.0;
- } else {
- left_slope = ((float)(ptrap->left.p1.y - ptrap->left.p2.y))
- / ((float)(ptrap->left.p1.x - ptrap->left.p2.x));
- params[3] = 0.0;
- }
- params[2] = left_slope;
- glamor_set_const_ext(params, 4, vertices, 4, stride);
- vertices += 4;
-
- /* Set the left params. */
- params[0] = ((float)ptrap->right.p1.x) / 65536;
- params[1] = ((float)ptrap->right.p1.y) / 65536;
-
- if (ptrap->right.p1.x == ptrap->right.p2.x) {
- right_slope = 0.0;
- params[3] = 1.0;
- } else {
- right_slope = ((float)(ptrap->right.p1.y - ptrap->right.p2.y))
- / ((float)(ptrap->right.p1.x - ptrap->right.p2.x));
- params[3] = 0.0;
- }
- params[2] = right_slope;
- glamor_set_const_ext(params, 4, vertices, 4, stride);
-
- DEBUGF("trap_top = %f, trap_bottom = %f, "
- "trap_left_x = %f, trap_left_y = %f, left_slope = %f, "
- "trap_right_x = %f, trap_right_y = %f, right_slope = %f\n",
- ((float)ptrap->top) / 65536, ((float)ptrap->bottom) / 65536,
- ((float)ptrap->left.p1.x) / 65536, ((float)ptrap->left.p1.y) / 65536,
- left_slope,
- ((float)ptrap->right.p1.x) / 65536, ((float)ptrap->right.p1.y) / 65536,
- right_slope);
-
- glamor_priv->render_nr_verts += 4;
- glamor_priv->vbo_offset += glamor_priv->vb_stride * 4;
- }
-
- i += mrect;
-
- /* Now rendering. */
- if (!glamor_priv->render_nr_verts)
- continue;
-
- if (glamor_priv->gl_flavor == GLAMOR_GL_DESKTOP)
- dispatch->glUnmapBuffer(GL_ARRAY_BUFFER);
- else {
- dispatch->glBindBuffer(GL_ARRAY_BUFFER, glamor_priv->vbo);
- dispatch->glBufferData(GL_ARRAY_BUFFER,
- glamor_priv->vbo_offset,
- glamor_priv->vb, GL_DYNAMIC_DRAW);
- }
+ glamor_screen_private *glamor_priv;
+ glamor_gl_dispatch *dispatch;
+ glamor_pixmap_private *pixmap_priv;
+ PixmapPtr pixmap = NULL;
+ GLint trapezoid_prog;
+ GLfloat xscale, yscale;
+ float left_slope, right_slope;
+ xTrapezoid *ptrap;
+ BoxRec one_trap_bound;
+ int nrect_max;
+ int i, j;
+ float *vertices;
+ float params[4];
+
+ glamor_priv = glamor_get_screen_private(screen);
+ trapezoid_prog = glamor_priv->trapezoid_prog;
+
+ pixmap = glamor_get_drawable_pixmap(picture->pDrawable);
+ pixmap_priv = glamor_get_pixmap_private(pixmap);
+
+ if (!GLAMOR_PIXMAP_PRIV_HAS_FBO(pixmap_priv)
+ || pixmap_priv->type == GLAMOR_TEXTURE_LARGE) { /* should always have here. */
+ DEBUGF("GLAMOR_PIXMAP_PRIV_HAS_FBO check failed, fallback\n");
+ return FALSE;
+ }
+
+ /* First, clear all to zero */
+ if (!glamor_solid(pixmap, 0, 0, pixmap_priv->base.pixmap->drawable.width,
+ pixmap_priv->base.pixmap->drawable.height,
+ GXclear, 0xFFFFFFFF, 0)) {
+ DEBUGF("glamor_solid failed, fallback\n");
+ return FALSE;
+ }
+
+ dispatch = glamor_get_dispatch(glamor_priv);
+
+ glamor_set_destination_pixmap_priv_nc(pixmap_priv);
+
+ pixmap_priv_get_dest_scale(pixmap_priv, (&xscale), (&yscale));
+
+ dispatch->glBindBuffer(GL_ARRAY_BUFFER, 0);
+ dispatch->glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, 0);
+
+ /* Now draw the Trapezoid mask. */
+ dispatch->glUseProgram(trapezoid_prog);
+
+ dispatch->glEnable(GL_BLEND);
+ dispatch->glBlendFunc(GL_ONE, GL_ONE);
+
+ nrect_max = GLAMOR_COMPOSITE_VBO_VERT_CNT / (4 * GLAMOR_VERTEX_RIGHT_PARAM);
+
+ for (i = 0; i < ntrap;) {
+ int mrect;
+ int stride;
+
+ mrect = (ntrap - i) > nrect_max ? nrect_max : (ntrap - i);
+ glamor_setup_composite_vbo_for_trapezoid(screen, 4 * mrect);
+ stride = glamor_priv->vb_stride / sizeof(float);
+
+ for (j = 0; j < mrect; j++) {
+ ptrap = traps + i + j;
+
+ DEBUGF
+ ("--- The parameter of xTrapezoid is:\ntop: %d 0x%x\tbottom: %d 0x%x\n"
+ "left: p1 (%d 0x%x, %d 0x%x)\tp2 (%d 0x%x, %d 0x%x)\n"
+ "right: p1 (%d 0x%x, %d 0x%x)\tp2 (%d 0x%x, %d 0x%x)\n",
+ xFixedToInt(ptrap->top), ptrap->top,
+ xFixedToInt(ptrap->bottom), ptrap->bottom,
+ xFixedToInt(ptrap->left.p1.x), ptrap->left.p1.x,
+ xFixedToInt(ptrap->left.p1.y), ptrap->left.p1.y,
+ xFixedToInt(ptrap->left.p2.x), ptrap->left.p2.x,
+ xFixedToInt(ptrap->left.p2.y), ptrap->left.p2.y,
+ xFixedToInt(ptrap->right.p1.x), ptrap->right.p1.x,
+ xFixedToInt(ptrap->right.p1.y), ptrap->right.p1.y,
+ xFixedToInt(ptrap->right.p2.x), ptrap->right.p2.x,
+ xFixedToInt(ptrap->right.p2.y), ptrap->right.p2.y);
+
+ miTrapezoidBounds(1, ptrap, &one_trap_bound);
+
+ vertices =
+ (float *) (glamor_priv->vb + glamor_priv->vbo_offset) + 2;
+ glamor_set_tcoords_ext((pixmap_priv->base.pixmap->drawable.width),
+ (pixmap_priv->base.pixmap->drawable.height),
+ (one_trap_bound.x1), (one_trap_bound.y1),
+ (one_trap_bound.x2), (one_trap_bound.y2),
+ glamor_priv->yInverted, vertices, stride);
+ DEBUGF("tex_vertices --> leftup : %f X %f, rightup: %f X %f,"
+ "rightbottom: %f X %f, leftbottom : %f X %f\n", vertices[0],
+ vertices[1], vertices[1 * stride], vertices[1 * stride + 1],
+ vertices[2 * stride], vertices[2 * stride + 1],
+ vertices[3 * stride], vertices[3 * stride + 1]);
+
+ /* Need to rebase. */
+ one_trap_bound.x1 -= bounds->x1;
+ one_trap_bound.x2 -= bounds->x1;
+ one_trap_bound.y1 -= bounds->y1;
+ one_trap_bound.y2 -= bounds->y1;
+
+ vertices -= 2;
+
+ glamor_set_normalize_vcoords_ext(pixmap_priv, xscale, yscale,
+ one_trap_bound.x1,
+ one_trap_bound.y1,
+ one_trap_bound.x2,
+ one_trap_bound.y2,
+ glamor_priv->yInverted, vertices,
+ stride);
+ DEBUGF("vertices --> leftup : %f X %f, rightup: %f X %f,"
+ "rightbottom: %f X %f, leftbottom : %f X %f\n", vertices[0],
+ vertices[1], vertices[1 * stride], vertices[1 * stride + 1],
+ vertices[2 * stride], vertices[2 * stride + 1],
+ vertices[3 * stride], vertices[3 * stride + 1]);
+ vertices += 4;
+
+ /* Set the top and bottom. */
+ params[0] = ((float) ptrap->top) / 65536;
+ params[1] = ((float) ptrap->bottom) / 65536;
+ glamor_set_const_ext(params, 2, vertices, 4, stride);
+ vertices += 2;
+
+ /* Set the left params. */
+ params[0] = ((float) ptrap->left.p1.x) / 65536;
+ params[1] = ((float) ptrap->left.p1.y) / 65536;
+
+ if (ptrap->left.p1.x == ptrap->left.p2.x) {
+ left_slope = 0.0;
+ params[3] = 1.0;
+ }
+ else {
+ left_slope = ((float) (ptrap->left.p1.y - ptrap->left.p2.y))
+ / ((float) (ptrap->left.p1.x - ptrap->left.p2.x));
+ params[3] = 0.0;
+ }
+ params[2] = left_slope;
+ glamor_set_const_ext(params, 4, vertices, 4, stride);
+ vertices += 4;
+
+ /* Set the left params. */
+ params[0] = ((float) ptrap->right.p1.x) / 65536;
+ params[1] = ((float) ptrap->right.p1.y) / 65536;
+
+ if (ptrap->right.p1.x == ptrap->right.p2.x) {
+ right_slope = 0.0;
+ params[3] = 1.0;
+ }
+ else {
+ right_slope = ((float) (ptrap->right.p1.y - ptrap->right.p2.y))
+ / ((float) (ptrap->right.p1.x - ptrap->right.p2.x));
+ params[3] = 0.0;
+ }
+ params[2] = right_slope;
+ glamor_set_const_ext(params, 4, vertices, 4, stride);
+
+ DEBUGF("trap_top = %f, trap_bottom = %f, "
+ "trap_left_x = %f, trap_left_y = %f, left_slope = %f, "
+ "trap_right_x = %f, trap_right_y = %f, right_slope = %f\n",
+ ((float) ptrap->top) / 65536,
+ ((float) ptrap->bottom) / 65536,
+ ((float) ptrap->left.p1.x) / 65536,
+ ((float) ptrap->left.p1.y) / 65536, left_slope,
+ ((float) ptrap->right.p1.x) / 65536,
+ ((float) ptrap->right.p1.y) / 65536, right_slope);
+
+ glamor_priv->render_nr_verts += 4;
+ glamor_priv->vbo_offset += glamor_priv->vb_stride * 4;
+ }
+
+ i += mrect;
+
+ /* Now rendering. */
+ if (!glamor_priv->render_nr_verts)
+ continue;
+
+ if (glamor_priv->gl_flavor == GLAMOR_GL_DESKTOP)
+ dispatch->glUnmapBuffer(GL_ARRAY_BUFFER);
+ else {
+ dispatch->glBindBuffer(GL_ARRAY_BUFFER, glamor_priv->vbo);
+ dispatch->glBufferData(GL_ARRAY_BUFFER,
+ glamor_priv->vbo_offset,
+ glamor_priv->vb, GL_DYNAMIC_DRAW);
+ }
#ifndef GLAMOR_GLES2
- dispatch->glDrawRangeElements(GL_TRIANGLES, 0, glamor_priv->render_nr_verts,
- (glamor_priv->render_nr_verts * 3) / 2,
- GL_UNSIGNED_SHORT, NULL);
+ dispatch->glDrawRangeElements(GL_TRIANGLES, 0,
+ glamor_priv->render_nr_verts,
+ (glamor_priv->render_nr_verts * 3) / 2,
+ GL_UNSIGNED_SHORT, NULL);
#else
- dispatch->glDrawElements(GL_TRIANGLES, (glamor_priv->render_nr_verts * 3) / 2,
- GL_UNSIGNED_SHORT, NULL);
+ dispatch->glDrawElements(GL_TRIANGLES,
+ (glamor_priv->render_nr_verts * 3) / 2,
+ GL_UNSIGNED_SHORT, NULL);
#endif
- }
-
- dispatch->glBindBuffer(GL_ARRAY_BUFFER, 0);
- dispatch->glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, 0);
- dispatch->glBlendFunc(GL_ONE, GL_ZERO);
- dispatch->glDisable(GL_BLEND);
- dispatch->glDisableVertexAttribArray(GLAMOR_VERTEX_POS);
- dispatch->glDisableVertexAttribArray(GLAMOR_VERTEX_SOURCE);
- dispatch->glDisableVertexAttribArray(GLAMOR_VERTEX_TOP_BOTTOM);
- dispatch->glDisableVertexAttribArray(GLAMOR_VERTEX_LEFT_PARAM);
- dispatch->glDisableVertexAttribArray(GLAMOR_VERTEX_RIGHT_PARAM);
- dispatch->glUseProgram(0);
- glamor_put_dispatch(glamor_priv);
- return TRUE;
+ }
+
+ dispatch->glBindBuffer(GL_ARRAY_BUFFER, 0);
+ dispatch->glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, 0);
+ dispatch->glBlendFunc(GL_ONE, GL_ZERO);
+ dispatch->glDisable(GL_BLEND);
+ dispatch->glDisableVertexAttribArray(GLAMOR_VERTEX_POS);
+ dispatch->glDisableVertexAttribArray(GLAMOR_VERTEX_SOURCE);
+ dispatch->glDisableVertexAttribArray(GLAMOR_VERTEX_TOP_BOTTOM);
+ dispatch->glDisableVertexAttribArray(GLAMOR_VERTEX_LEFT_PARAM);
+ dispatch->glDisableVertexAttribArray(GLAMOR_VERTEX_RIGHT_PARAM);
+ dispatch->glUseProgram(0);
+ glamor_put_dispatch(glamor_priv);
+ return TRUE;
}
-#endif /*GLAMOR_TRAPEZOID_SHADER */
+#endif /*GLAMOR_TRAPEZOID_SHADER */
/**
* Creates an appropriate picture for temp mask use.
*/
static PicturePtr
glamor_create_mask_picture(ScreenPtr screen,
- PicturePtr dst,
- PictFormatPtr pict_format,
- CARD16 width, CARD16 height, int gpu)
+ PicturePtr dst,
+ PictFormatPtr pict_format,
+ CARD16 width, CARD16 height, int gpu)
{
- PixmapPtr pixmap;
- PicturePtr picture;
- int error;
-
- if (!pict_format) {
- if (dst->polyEdge == PolyEdgeSharp)
- pict_format =
- PictureMatchFormat(screen, 1, PICT_a1);
- else
- pict_format =
- PictureMatchFormat(screen, 8, PICT_a8);
- if (!pict_format)
- return 0;
- }
-
- if (gpu) {
- pixmap = glamor_create_pixmap(screen, width, height,
- pict_format->depth, 0);
- } else {
- pixmap = glamor_create_pixmap(screen, 0, 0,
- pict_format->depth,
- GLAMOR_CREATE_PIXMAP_CPU);
- }
-
- if (!pixmap)
- return 0;
- picture = CreatePicture(0, &pixmap->drawable, pict_format,
- 0, 0, serverClient, &error);
- glamor_destroy_pixmap(pixmap);
- return picture;
+ PixmapPtr pixmap;
+ PicturePtr picture;
+ int error;
+
+ if (!pict_format) {
+ if (dst->polyEdge == PolyEdgeSharp)
+ pict_format = PictureMatchFormat(screen, 1, PICT_a1);
+ else
+ pict_format = PictureMatchFormat(screen, 8, PICT_a8);
+ if (!pict_format)
+ return 0;
+ }
+
+ if (gpu) {
+ pixmap = glamor_create_pixmap(screen, width, height,
+ pict_format->depth, 0);
+ }
+ else {
+ pixmap = glamor_create_pixmap(screen, 0, 0,
+ pict_format->depth,
+ GLAMOR_CREATE_PIXMAP_CPU);
+ }
+
+ if (!pixmap)
+ return 0;
+ picture = CreatePicture(0, &pixmap->drawable, pict_format,
+ 0, 0, serverClient, &error);
+ glamor_destroy_pixmap(pixmap);
+ return picture;
}
static int
-_glamor_trapezoid_bounds (int ntrap, xTrapezoid *traps, BoxPtr box)
+_glamor_trapezoid_bounds(int ntrap, xTrapezoid *traps, BoxPtr box)
{
- int has_large_trapezoid = 0;
- box->y1 = MAXSHORT;
- box->y2 = MINSHORT;
- box->x1 = MAXSHORT;
- box->x2 = MINSHORT;
-
- for (; ntrap; ntrap--, traps++) {
- INT16 x1, y1, x2, y2;
-
- if (!xTrapezoidValid(traps))
- continue;
- y1 = xFixedToInt (traps->top);
- if (y1 < box->y1)
- box->y1 = y1;
-
- y2 = xFixedToInt (xFixedCeil (traps->bottom));
- if (y2 > box->y2)
- box->y2 = y2;
-
- x1 = xFixedToInt (min (_glamor_linefixedX (&traps->left, traps->top, FALSE),
- _glamor_linefixedX (&traps->left, traps->bottom, FALSE)));
- if (x1 < box->x1)
- box->x1 = x1;
-
- x2 = xFixedToInt (xFixedCeil (max (_glamor_linefixedX (&traps->right, traps->top, TRUE),
- _glamor_linefixedX (&traps->right, traps->bottom, TRUE))));
- if (x2 > box->x2)
- box->x2 = x2;
-
- if (!has_large_trapezoid && (x2 - x1) > 256 && (y2 - y1) > 32)
- has_large_trapezoid = 1;
- }
-
- return has_large_trapezoid;
+ int has_large_trapezoid = 0;
+
+ box->y1 = MAXSHORT;
+ box->y2 = MINSHORT;
+ box->x1 = MAXSHORT;
+ box->x2 = MINSHORT;
+
+ for (; ntrap; ntrap--, traps++) {
+ INT16 x1, y1, x2, y2;
+
+ if (!xTrapezoidValid(traps))
+ continue;
+ y1 = xFixedToInt(traps->top);
+ if (y1 < box->y1)
+ box->y1 = y1;
+
+ y2 = xFixedToInt(xFixedCeil(traps->bottom));
+ if (y2 > box->y2)
+ box->y2 = y2;
+
+ x1 = xFixedToInt(min
+ (_glamor_linefixedX(&traps->left, traps->top, FALSE),
+ _glamor_linefixedX(&traps->left, traps->bottom,
+ FALSE)));
+ if (x1 < box->x1)
+ box->x1 = x1;
+
+ x2 = xFixedToInt(xFixedCeil
+ (max
+ (_glamor_linefixedX(&traps->right, traps->top, TRUE),
+ _glamor_linefixedX(&traps->right, traps->bottom,
+ TRUE))));
+ if (x2 > box->x2)
+ box->x2 = x2;
+
+ if (!has_large_trapezoid && (x2 - x1) > 256 && (y2 - y1) > 32)
+ has_large_trapezoid = 1;
+ }
+
+ return has_large_trapezoid;
}
/**
@@ -1658,162 +1695,163 @@ static Bool
_glamor_trapezoids(CARD8 op,
PicturePtr src, PicturePtr dst,
PictFormatPtr mask_format, INT16 x_src, INT16 y_src,
- int ntrap, xTrapezoid * traps, Bool fallback)
+ int ntrap, xTrapezoid *traps, Bool fallback)
{
- ScreenPtr screen = dst->pDrawable->pScreen;
- BoxRec bounds;
- PicturePtr picture;
- INT16 x_dst, y_dst;
- INT16 x_rel, y_rel;
- int width, height, stride;
- PixmapPtr pixmap;
- pixman_image_t *image = NULL;
- int ret = 0;
- int has_large_trapezoid;
-
- /* If a mask format wasn't provided, we get to choose, but behavior should
- * be as if there was no temporary mask the traps were accumulated into.
- */
- if (!mask_format) {
- if (dst->polyEdge == PolyEdgeSharp)
- mask_format =
- PictureMatchFormat(screen, 1, PICT_a1);
- else
- mask_format =
- PictureMatchFormat(screen, 8, PICT_a8);
- for (; ntrap; ntrap--, traps++)
- glamor_trapezoids(op, src, dst, mask_format, x_src,
- y_src, 1, traps);
- return TRUE;
- }
-
- has_large_trapezoid = _glamor_trapezoid_bounds(ntrap, traps, &bounds);
- DEBUGF("The bounds for all traps is: bounds.x1 = %d, bounds.x2 = %d, "
- "bounds.y1 = %d, bounds.y2 = %d, ---- ntrap = %d\n", bounds.x1,
- bounds.x2, bounds.y1, bounds.y2, ntrap);
-
- if (bounds.y1 >= bounds.y2 || bounds.x1 >= bounds.x2)
- return TRUE;
-
- x_dst = traps[0].left.p1.x >> 16;
- y_dst = traps[0].left.p1.y >> 16;
-
- width = bounds.x2 - bounds.x1;
- height = bounds.y2 - bounds.y1;
- stride = PixmapBytePad(width, mask_format->depth);
+ ScreenPtr screen = dst->pDrawable->pScreen;
+ BoxRec bounds;
+ PicturePtr picture;
+ INT16 x_dst, y_dst;
+ INT16 x_rel, y_rel;
+ int width, height, stride;
+ PixmapPtr pixmap;
+ pixman_image_t *image = NULL;
+ int ret = 0;
+ int has_large_trapezoid;
+
+ /* If a mask format wasn't provided, we get to choose, but behavior should
+ * be as if there was no temporary mask the traps were accumulated into.
+ */
+ if (!mask_format) {
+ if (dst->polyEdge == PolyEdgeSharp)
+ mask_format = PictureMatchFormat(screen, 1, PICT_a1);
+ else
+ mask_format = PictureMatchFormat(screen, 8, PICT_a8);
+ for (; ntrap; ntrap--, traps++)
+ glamor_trapezoids(op, src, dst, mask_format, x_src,
+ y_src, 1, traps);
+ return TRUE;
+ }
+
+ has_large_trapezoid = _glamor_trapezoid_bounds(ntrap, traps, &bounds);
+ DEBUGF("The bounds for all traps is: bounds.x1 = %d, bounds.x2 = %d, "
+ "bounds.y1 = %d, bounds.y2 = %d, ---- ntrap = %d\n", bounds.x1,
+ bounds.x2, bounds.y1, bounds.y2, ntrap);
+
+ if (bounds.y1 >= bounds.y2 || bounds.x1 >= bounds.x2)
+ return TRUE;
+
+ x_dst = traps[0].left.p1.x >> 16;
+ y_dst = traps[0].left.p1.y >> 16;
+
+ width = bounds.x2 - bounds.x1;
+ height = bounds.y2 - bounds.y1;
+ stride = PixmapBytePad(width, mask_format->depth);
#ifdef GLAMOR_TRAPEZOID_SHADER
- /* We seperate the render to two paths.
- Some GL implemetation do not implement the Anti-Alias for triangles
- and polygen's filling. So when the edge is not vertical or horizontal,
- sawtooth will be obvious. The trapezoid is widely used to render wide
- lines and circles. In these case, the line or circle will be divided
- into a large number of small trapezoids to approximate it, so the sawtooth
- at the edge will cause the result not be acceptable.
- When the depth of the mask is 1, there is no Anti-Alias needed, so we
- use the clip logic to generate the result directly(fast path).
- When the depth is not 1, AA is needed and we use a shader to generate
- a temp mask pixmap.
- */
- if (mask_format->depth == 1) {
- ret = _glamor_trapezoids_with_shader(op, src, dst, mask_format,
- x_src, y_src, ntrap, traps);
- if(ret)
- return TRUE;
- } else {
- if (has_large_trapezoid || ntrap > 256) {
- /* The shader speed is relative slower than pixman when generating big chunk
- trapezoid mask. We fallback to pixman to improve the performance. */
- ;
- } else if (dst->polyMode == PolyModeImprecise) {
- /* The precise mode is that we sample the trapezoid on the centre points of
- an (2*n+1)x(2*n-1) subpixel grid. It is computationally expensive in shader
- and we use inside area ratio to replace it if the polymode == Imprecise. */
- picture = glamor_create_mask_picture(screen, dst, mask_format,
- width, height, 1);
- if (!picture)
- return TRUE;
-
- ret = _glamor_generate_trapezoid_with_shader(screen, picture, traps, ntrap, &bounds);
-
- if (!ret)
- FreePicture(picture, 0);
- }
- }
+ /* We seperate the render to two paths.
+ Some GL implemetation do not implement the Anti-Alias for triangles
+ and polygen's filling. So when the edge is not vertical or horizontal,
+ sawtooth will be obvious. The trapezoid is widely used to render wide
+ lines and circles. In these case, the line or circle will be divided
+ into a large number of small trapezoids to approximate it, so the sawtooth
+ at the edge will cause the result not be acceptable.
+ When the depth of the mask is 1, there is no Anti-Alias needed, so we
+ use the clip logic to generate the result directly(fast path).
+ When the depth is not 1, AA is needed and we use a shader to generate
+ a temp mask pixmap.
+ */
+ if (mask_format->depth == 1) {
+ ret = _glamor_trapezoids_with_shader(op, src, dst, mask_format,
+ x_src, y_src, ntrap, traps);
+ if (ret)
+ return TRUE;
+ }
+ else {
+ if (has_large_trapezoid || ntrap > 256) {
+ /* The shader speed is relative slower than pixman when generating big chunk
+ trapezoid mask. We fallback to pixman to improve the performance. */
+ ;
+ }
+ else if (dst->polyMode == PolyModeImprecise) {
+ /* The precise mode is that we sample the trapezoid on the centre points of
+ an (2*n+1)x(2*n-1) subpixel grid. It is computationally expensive in shader
+ and we use inside area ratio to replace it if the polymode == Imprecise. */
+ picture = glamor_create_mask_picture(screen, dst, mask_format,
+ width, height, 1);
+ if (!picture)
+ return TRUE;
+
+ ret =
+ _glamor_generate_trapezoid_with_shader(screen, picture, traps,
+ ntrap, &bounds);
+
+ if (!ret)
+ FreePicture(picture, 0);
+ }
+ }
#endif
- if (!ret) {
- DEBUGF("Fallback to sw rasterize of trapezoid\n");
-
- picture = glamor_create_mask_picture(screen, dst, mask_format,
- width, height, 0);
- if (!picture)
- return TRUE;
-
- image = pixman_image_create_bits(picture->format,
- width, height, NULL, stride);
- if (!image) {
- FreePicture(picture, 0);
- return TRUE;
- }
-
- for (; ntrap; ntrap--, traps++)
- pixman_rasterize_trapezoid(image,
- (pixman_trapezoid_t *) traps,
- -bounds.x1, -bounds.y1);
-
- pixmap = glamor_get_drawable_pixmap(picture->pDrawable);
-
- screen->ModifyPixmapHeader(pixmap, width, height,
- mask_format->depth,
- BitsPerPixel(mask_format->depth),
- PixmapBytePad(width,
- mask_format->depth),
- pixman_image_get_data(image));
- }
-
- x_rel = bounds.x1 + x_src - x_dst;
- y_rel = bounds.y1 + y_src - y_dst;
- DEBUGF("x_src = %d, y_src = %d, x_dst = %d, y_dst = %d, "
- "x_rel = %d, y_rel = %d\n", x_src, y_src, x_dst,
- y_dst, x_rel, y_rel);
-
- CompositePicture(op, src, picture, dst,
- x_rel, y_rel,
- 0, 0,
- bounds.x1, bounds.y1,
- bounds.x2 - bounds.x1, bounds.y2 - bounds.y1);
-
- if (image)
- pixman_image_unref(image);
-
- FreePicture(picture, 0);
- return TRUE;
+ if (!ret) {
+ DEBUGF("Fallback to sw rasterize of trapezoid\n");
+
+ picture = glamor_create_mask_picture(screen, dst, mask_format,
+ width, height, 0);
+ if (!picture)
+ return TRUE;
+
+ image = pixman_image_create_bits(picture->format,
+ width, height, NULL, stride);
+ if (!image) {
+ FreePicture(picture, 0);
+ return TRUE;
+ }
+
+ for (; ntrap; ntrap--, traps++)
+ pixman_rasterize_trapezoid(image,
+ (pixman_trapezoid_t *) traps,
+ -bounds.x1, -bounds.y1);
+
+ pixmap = glamor_get_drawable_pixmap(picture->pDrawable);
+
+ screen->ModifyPixmapHeader(pixmap, width, height,
+ mask_format->depth,
+ BitsPerPixel(mask_format->depth),
+ PixmapBytePad(width,
+ mask_format->depth),
+ pixman_image_get_data(image));
+ }
+
+ x_rel = bounds.x1 + x_src - x_dst;
+ y_rel = bounds.y1 + y_src - y_dst;
+ DEBUGF("x_src = %d, y_src = %d, x_dst = %d, y_dst = %d, "
+ "x_rel = %d, y_rel = %d\n", x_src, y_src, x_dst,
+ y_dst, x_rel, y_rel);
+
+ CompositePicture(op, src, picture, dst,
+ x_rel, y_rel,
+ 0, 0,
+ bounds.x1, bounds.y1,
+ bounds.x2 - bounds.x1, bounds.y2 - bounds.y1);
+
+ if (image)
+ pixman_image_unref(image);
+
+ FreePicture(picture, 0);
+ return TRUE;
}
void
glamor_trapezoids(CARD8 op,
PicturePtr src, PicturePtr dst,
PictFormatPtr mask_format, INT16 x_src, INT16 y_src,
- int ntrap, xTrapezoid * traps)
+ int ntrap, xTrapezoid *traps)
{
- DEBUGF("x_src = %d, y_src = %d, ntrap = %d\n", x_src, y_src, ntrap);
+ DEBUGF("x_src = %d, y_src = %d, ntrap = %d\n", x_src, y_src, ntrap);
- _glamor_trapezoids(op, src, dst, mask_format, x_src,
- y_src, ntrap, traps, TRUE);
+ _glamor_trapezoids(op, src, dst, mask_format, x_src,
+ y_src, ntrap, traps, TRUE);
}
Bool
glamor_trapezoids_nf(CARD8 op,
- PicturePtr src, PicturePtr dst,
- PictFormatPtr mask_format, INT16 x_src, INT16 y_src,
- int ntrap, xTrapezoid * traps)
+ PicturePtr src, PicturePtr dst,
+ PictFormatPtr mask_format, INT16 x_src, INT16 y_src,
+ int ntrap, xTrapezoid *traps)
{
- DEBUGF("x_src = %d, y_src = %d, ntrap = %d\n", x_src, y_src, ntrap);
+ DEBUGF("x_src = %d, y_src = %d, ntrap = %d\n", x_src, y_src, ntrap);
- return _glamor_trapezoids(op, src, dst, mask_format, x_src,
- y_src, ntrap, traps, FALSE);
+ return _glamor_trapezoids(op, src, dst, mask_format, x_src,
+ y_src, ntrap, traps, FALSE);
}
-#endif /* RENDER */
-
+#endif /* RENDER */
diff --git a/xorg-server/glamor/glamor_triangles.c b/xorg-server/glamor/glamor_triangles.c
index e0f4a9708..693eef10f 100644
--- a/xorg-server/glamor/glamor_triangles.c
+++ b/xorg-server/glamor/glamor_triangles.c
@@ -30,51 +30,48 @@
static Bool
_glamor_triangles(CARD8 op,
- PicturePtr pSrc,
- PicturePtr pDst,
- PictFormatPtr maskFormat,
- INT16 xSrc, INT16 ySrc, int ntris, xTriangle * tris, Bool fallback)
+ PicturePtr pSrc,
+ PicturePtr pDst,
+ PictFormatPtr maskFormat,
+ INT16 xSrc, INT16 ySrc, int ntris, xTriangle * tris,
+ Bool fallback)
{
- if (!fallback
- && glamor_ddx_fallback_check_pixmap(pDst->pDrawable)
- && (!pSrc->pDrawable
- || glamor_ddx_fallback_check_pixmap(pSrc->pDrawable)))
- return FALSE;
+ if (!fallback && glamor_ddx_fallback_check_pixmap(pDst->pDrawable)
+ && (!pSrc->pDrawable
+ || glamor_ddx_fallback_check_pixmap(pSrc->pDrawable)))
+ return FALSE;
- if (glamor_prepare_access_picture(pDst, GLAMOR_ACCESS_RW)) {
- if (glamor_prepare_access_picture(pSrc,
- GLAMOR_ACCESS_RO)) {
+ if (glamor_prepare_access_picture(pDst, GLAMOR_ACCESS_RW)) {
+ if (glamor_prepare_access_picture(pSrc, GLAMOR_ACCESS_RO)) {
- fbTriangles(op, pSrc, pDst, maskFormat, xSrc,
- ySrc, ntris, tris);
+ fbTriangles(op, pSrc, pDst, maskFormat, xSrc, ySrc, ntris, tris);
- glamor_finish_access_picture(pSrc, GLAMOR_ACCESS_RO);
- }
+ glamor_finish_access_picture(pSrc, GLAMOR_ACCESS_RO);
+ }
- glamor_finish_access_picture(pDst, GLAMOR_ACCESS_RW);
- }
- return TRUE;
+ glamor_finish_access_picture(pDst, GLAMOR_ACCESS_RW);
+ }
+ return TRUE;
}
void
glamor_triangles(CARD8 op,
- PicturePtr pSrc,
- PicturePtr pDst,
- PictFormatPtr maskFormat,
- INT16 xSrc, INT16 ySrc, int ntris, xTriangle * tris)
+ PicturePtr pSrc,
+ PicturePtr pDst,
+ PictFormatPtr maskFormat,
+ INT16 xSrc, INT16 ySrc, int ntris, xTriangle * tris)
{
- _glamor_triangles(op, pSrc, pDst, maskFormat,
- xSrc, ySrc, ntris, tris, TRUE);
+ _glamor_triangles(op, pSrc, pDst, maskFormat,
+ xSrc, ySrc, ntris, tris, TRUE);
}
Bool
glamor_triangles_nf(CARD8 op,
- PicturePtr pSrc,
- PicturePtr pDst,
- PictFormatPtr maskFormat,
- INT16 xSrc, INT16 ySrc, int ntris, xTriangle * tris)
+ PicturePtr pSrc,
+ PicturePtr pDst,
+ PictFormatPtr maskFormat,
+ INT16 xSrc, INT16 ySrc, int ntris, xTriangle * tris)
{
- return _glamor_triangles(op, pSrc, pDst, maskFormat,
- xSrc, ySrc, ntris, tris, FALSE);
+ return _glamor_triangles(op, pSrc, pDst, maskFormat,
+ xSrc, ySrc, ntris, tris, FALSE);
}
-
diff --git a/xorg-server/glamor/glamor_utils.h b/xorg-server/glamor/glamor_utils.h
index d30783826..ea827df3b 100644
--- a/xorg-server/glamor/glamor_utils.h
+++ b/xorg-server/glamor/glamor_utils.h
@@ -59,7 +59,7 @@
#define PIXMAP_PRIV_GET_ACTUAL_SIZE(priv, w, h) \
do { \
- if (unlikely(priv->type == GLAMOR_TEXTURE_LARGE)) { \
+ if (_X_UNLIKELY(priv->type == GLAMOR_TEXTURE_LARGE)) { \
w = priv->large.box.x2 - priv->large.box.x1; \
h = priv->large.box.y2 - priv->large.box.y1; \
} else { \
@@ -80,7 +80,7 @@
#define pixmap_priv_get_fbo_off(_priv_, _xoff_, _yoff_) \
do { \
- if (unlikely(_priv_ && (_priv_)->type == GLAMOR_TEXTURE_LARGE)) { \
+ if (_X_UNLIKELY(_priv_ && (_priv_)->type == GLAMOR_TEXTURE_LARGE)) { \
*(_xoff_) = - (_priv_)->large.box.x1; \
*(_yoff_) = - (_priv_)->large.box.y1; \
} else { \
@@ -254,7 +254,6 @@
} \
} while(0)
-
/* _x1_ ... _y2_ may has fractional. */
#define glamor_get_repeat_transform_coords(priv, repeat_type, tx1, \
ty1, _x1_, _y1_) \
@@ -315,7 +314,7 @@
texcoord, yInverted) \
do { \
(texcoord)[0] = t_from_x_coord_x(xscale, _tx_); \
- if (likely(yInverted)) \
+ if (_X_LIKELY(yInverted)) \
(texcoord)[1] = t_from_x_coord_y_inverted(yscale, _ty_);\
else \
(texcoord)[1] = t_from_x_coord_y(yscale, _ty_); \
@@ -338,7 +337,7 @@
tx += fbo_x_off; \
ty += fbo_y_off; \
(texcoord)[0] = t_from_x_coord_x(xscale, tx); \
- if (likely(yInverted)) \
+ if (_X_LIKELY(yInverted)) \
(texcoord)[1] = t_from_x_coord_y_inverted(yscale, ty); \
else \
(texcoord)[1] = t_from_x_coord_y(yscale, ty); \
@@ -402,8 +401,6 @@
2); \
} while (0)
-
-
#define glamor_set_normalize_tri_tcoords(xscale, \
yscale, \
vtx, \
@@ -435,7 +432,7 @@
texcoords, \
stride) \
do { \
- if (likely(priv->type != GLAMOR_TEXTURE_LARGE)) { \
+ if (_X_LIKELY(priv->type != GLAMOR_TEXTURE_LARGE)) { \
glamor_set_transformed_normalize_tcoords_ext(priv, matrix, xscale, \
yscale, _x1_, _y1_, \
_x2_, _y2_, yInverted, \
@@ -475,7 +472,6 @@
} \
} while (0)
-
#define glamor_set_repeat_transformed_normalize_tcoords( priv, \
repeat_type, \
matrix, \
@@ -509,7 +505,7 @@
(vertices)[1 * stride] = _t2_ = t_from_x_coord_x(xscale, tx2); \
(vertices)[2 * stride] = _t2_; \
(vertices)[3 * stride] = _t0_; \
- if (likely(yInverted)) { \
+ if (_X_LIKELY(yInverted)) { \
(vertices)[1] = _t1_ = t_from_x_coord_y_inverted(yscale, ty1); \
(vertices)[2 * stride + 1] = _t5_ = t_from_x_coord_y_inverted(yscale, ty2);\
} \
@@ -525,7 +521,7 @@
x1, y1, x2, y2, \
yInverted, vertices, stride) \
do { \
- if (unlikely(priv->type == GLAMOR_TEXTURE_LARGE)) { \
+ if (_X_UNLIKELY(priv->type == GLAMOR_TEXTURE_LARGE)) { \
float tx1, tx2, ty1, ty2; \
int fbo_x_off, fbo_y_off; \
pixmap_priv_get_fbo_off(priv, &fbo_x_off, &fbo_y_off); \
@@ -541,7 +537,6 @@
x2, y2, yInverted, vertices, stride);\
} while(0)
-
#define glamor_set_normalize_tcoords(priv, xscale, yscale, \
x1, y1, x2, y2, \
yInverted, vertices) \
@@ -556,7 +551,7 @@
_x1_, _y1_, _x2_, _y2_, \
yInverted, vertices, stride)\
do { \
- if (unlikely(priv->type == GLAMOR_TEXTURE_LARGE)) { \
+ if (_X_UNLIKELY(priv->type == GLAMOR_TEXTURE_LARGE)) { \
float tx1, tx2, ty1, ty2; \
if (repeat_type == RepeatPad) { \
tx1 = _x1_ - priv->large.box.x1; \
@@ -577,7 +572,6 @@
stride); \
} while(0)
-
#define glamor_set_repeat_normalize_tcoords(priv, repeat_type, \
xscale, yscale, \
_x1_, _y1_, _x2_, _y2_, \
@@ -597,7 +591,7 @@
(vertices)[2] = t_from_x_coord_x(xscale, x2); \
(vertices)[6] = (vertices)[2]; \
(vertices)[4] = (vertices)[0]; \
- if (likely(yInverted)) { \
+ if (_X_LIKELY(yInverted)) { \
(vertices)[1] = t_from_x_coord_y_inverted(yscale, y1); \
(vertices)[7] = t_from_x_coord_y_inverted(yscale, y2); \
} \
@@ -616,7 +610,7 @@
(vertices)[2] = (x2); \
(vertices)[4] = (vertices)[2]; \
(vertices)[6] = (vertices)[0]; \
- if (likely(yInverted)) { \
+ if (_X_LIKELY(yInverted)) { \
(vertices)[1] = (y1); \
(vertices)[5] = (y2); \
} \
@@ -635,7 +629,7 @@
(vertices)[1*stride] = (x2); \
(vertices)[2*stride] = (vertices)[1*stride]; \
(vertices)[3*stride] = (vertices)[0]; \
- if (likely(yInverted)) { \
+ if (_X_LIKELY(yInverted)) { \
(vertices)[1] = (y1); \
(vertices)[2*stride + 1] = (y2); \
} \
@@ -651,7 +645,7 @@
yInverted, vertices) \
do { \
(vertices)[0] = v_from_x_coord_x(xscale, x); \
- if (likely(yInverted)) { \
+ if (_X_LIKELY(yInverted)) { \
(vertices)[1] = v_from_x_coord_y_inverted(yscale, y); \
} else { \
(vertices)[1] = v_from_x_coord_y(yscale, y); \
@@ -679,7 +673,7 @@
(vertices)[2] = (x2); \
(vertices)[6] = (vertices)[2]; \
(vertices)[4] = (vertices)[0]; \
- if (likely(yInverted)) { \
+ if (_X_LIKELY(yInverted)) { \
(vertices)[1] = (y1); \
(vertices)[7] = (y2); \
} \
@@ -705,7 +699,7 @@
x2 + fbo_x_off); \
(vertices)[2 * stride] = _t2_; \
(vertices)[3 * stride] = _t0_; \
- if (likely(yInverted)) { \
+ if (_X_LIKELY(yInverted)) { \
(vertices)[1] = _t1_ = v_from_x_coord_y_inverted(yscale, \
y1 + fbo_y_off); \
(vertices)[2 * stride + 1] = _t5_ = \
@@ -721,7 +715,6 @@
(vertices)[3 * stride + 1] = _t5_; \
} while(0)
-
#define glamor_set_normalize_vcoords(priv, xscale, yscale, \
x1, y1, x2, y2, \
yInverted, vertices) \
@@ -749,7 +742,7 @@
(vertices)[2] = v_from_x_coord_x(xscale, x2); \
(vertices)[6] = (vertices)[2]; \
(vertices)[4] = (vertices)[0]; \
- if (likely(yInverted)) { \
+ if (_X_LIKELY(yInverted)) { \
(vertices)[1] = v_from_x_coord_y_inverted(yscale, y1); \
(vertices)[7] = v_from_x_coord_y_inverted(yscale, y2); \
} \
@@ -765,7 +758,7 @@
yInverted, pt) \
do { \
(pt)[0] = t_from_x_coord_x(xscale, x); \
- if (likely(yInverted)) { \
+ if (_X_LIKELY(yInverted)) { \
(pt)[1] = t_from_x_coord_y_inverted(yscale, y); \
} else { \
(pt)[1] = t_from_x_coord_y(yscale, y); \
@@ -776,7 +769,7 @@
yInverted, c) \
do { \
(c)[0] = (float)x; \
- if (likely(yInverted)) { \
+ if (_X_LIKELY(yInverted)) { \
(c)[1] = (float)y; \
} else { \
(c)[1] = (float)height - (float)y; \
@@ -786,44 +779,40 @@
inline static void
glamor_calculate_boxes_bound(BoxPtr bound, BoxPtr boxes, int nbox)
{
- int x_min, y_min;
- int x_max, y_max;
- int i;
- x_min = y_min = MAXSHORT;
- x_max = y_max = MINSHORT;
- for (i = 0; i < nbox; i++) {
- if (x_min > boxes[i].x1)
- x_min = boxes[i].x1;
- if (y_min > boxes[i].y1)
- y_min = boxes[i].y1;
-
- if (x_max < boxes[i].x2)
- x_max = boxes[i].x2;
- if (y_max < boxes[i].y2)
- y_max = boxes[i].y2;
- }
- bound->x1 = x_min;
- bound->y1 = y_min;
- bound->x2 = x_max;
- bound->y2 = y_max;
+ int x_min, y_min;
+ int x_max, y_max;
+ int i;
+
+ x_min = y_min = MAXSHORT;
+ x_max = y_max = MINSHORT;
+ for (i = 0; i < nbox; i++) {
+ if (x_min > boxes[i].x1)
+ x_min = boxes[i].x1;
+ if (y_min > boxes[i].y1)
+ y_min = boxes[i].y1;
+
+ if (x_max < boxes[i].x2)
+ x_max = boxes[i].x2;
+ if (y_max < boxes[i].y2)
+ y_max = boxes[i].y2;
+ }
+ bound->x1 = x_min;
+ bound->y1 = y_min;
+ bound->x2 = x_max;
+ bound->y2 = y_max;
}
inline static void
glamor_translate_boxes(BoxPtr boxes, int nbox, int dx, int dy)
{
- int i;
- for (i = 0; i < nbox; i++) {
- boxes[i].x1 += dx;
- boxes[i].y1 += dy;
- boxes[i].x2 += dx;
- boxes[i].y2 += dy;
- }
-}
-
-static inline Bool
-region_is_empty(pixman_region16_t *region)
-{
- return region->data && region->data->numRects == 0;
+ int i;
+
+ for (i = 0; i < nbox; i++) {
+ boxes[i].x1 += dx;
+ boxes[i].y1 += dy;
+ boxes[i].x2 += dx;
+ boxes[i].y2 += dy;
+ }
}
#ifndef ARRAY_SIZE
@@ -857,58 +846,58 @@ region_is_empty(pixman_region16_t *region)
static inline CARD32
format_for_depth(int depth)
{
- switch (depth) {
- case 1:
- return PICT_a1;
- case 4:
- return PICT_a4;
- case 8:
- return PICT_a8;
- case 15:
- return PICT_x1r5g5b5;
- case 16:
- return PICT_r5g6b5;
- default:
- case 24:
- return PICT_x8r8g8b8;
+ switch (depth) {
+ case 1:
+ return PICT_a1;
+ case 4:
+ return PICT_a4;
+ case 8:
+ return PICT_a8;
+ case 15:
+ return PICT_x1r5g5b5;
+ case 16:
+ return PICT_r5g6b5;
+ default:
+ case 24:
+ return PICT_x8r8g8b8;
#if XORG_VERSION_CURRENT >= 10699900
- case 30:
- return PICT_x2r10g10b10;
+ case 30:
+ return PICT_x2r10g10b10;
#endif
- case 32:
- return PICT_a8r8g8b8;
- }
+ case 32:
+ return PICT_a8r8g8b8;
+ }
}
static inline void
gl_iformat_for_depth(int depth, GLenum * format)
{
- switch (depth) {
+ switch (depth) {
#ifndef GLAMOR_GLES2
- case 1:
- case 8:
- *format = GL_ALPHA;
- break;
+ case 1:
+ case 8:
+ *format = GL_ALPHA;
+ break;
#endif
- default:
- *format = GL_RGBA;
- break;
- }
+ default:
+ *format = GL_RGBA;
+ break;
+ }
}
static inline CARD32
format_for_pixmap(PixmapPtr pixmap)
{
- glamor_pixmap_private *pixmap_priv;
- PictFormatShort pict_format;
+ glamor_pixmap_private *pixmap_priv;
+ PictFormatShort pict_format;
- pixmap_priv = glamor_get_pixmap_private(pixmap);
- if (GLAMOR_PIXMAP_PRIV_IS_PICTURE(pixmap_priv))
- pict_format = pixmap_priv->base.picture->format;
- else
- pict_format = format_for_depth(pixmap->drawable.depth);
+ pixmap_priv = glamor_get_pixmap_private(pixmap);
+ if (GLAMOR_PIXMAP_PRIV_IS_PICTURE(pixmap_priv))
+ pict_format = pixmap_priv->base.picture->format;
+ else
+ pict_format = format_for_depth(pixmap->drawable.depth);
- return pict_format;
+ return pict_format;
}
#define REVERT_NONE 0
@@ -939,114 +928,112 @@ format_for_pixmap(PixmapPtr pixmap)
#ifndef GLAMOR_GLES2
static inline int
glamor_get_tex_format_type_from_pictformat(PictFormatShort format,
- GLenum * tex_format,
- GLenum * tex_type,
- int *no_alpha,
- int *revert,
- int *swap_rb,
- int is_upload)
-
+ GLenum * tex_format,
+ GLenum * tex_type,
+ int *no_alpha,
+ int *revert,
+ int *swap_rb, int is_upload)
{
- *no_alpha = 0;
- *revert = REVERT_NONE;
- *swap_rb = is_upload ? SWAP_NONE_UPLOADING : SWAP_NONE_DOWNLOADING;
- switch (format) {
- case PICT_a1:
- *tex_format = GL_ALPHA;
- *tex_type = GL_UNSIGNED_BYTE;
- *revert = is_upload ? REVERT_UPLOADING_A1 : REVERT_DOWNLOADING_A1;
- break;
- case PICT_b8g8r8x8:
- *no_alpha = 1;
- case PICT_b8g8r8a8:
- *tex_format = GL_BGRA;
- *tex_type = GL_UNSIGNED_INT_8_8_8_8;
- break;
-
- case PICT_x8r8g8b8:
- *no_alpha = 1;
- case PICT_a8r8g8b8:
- *tex_format = GL_BGRA;
- *tex_type = GL_UNSIGNED_INT_8_8_8_8_REV;
- break;
- case PICT_x8b8g8r8:
- *no_alpha = 1;
- case PICT_a8b8g8r8:
- *tex_format = GL_RGBA;
- *tex_type = GL_UNSIGNED_INT_8_8_8_8_REV;
- break;
- case PICT_x2r10g10b10:
- *no_alpha = 1;
- case PICT_a2r10g10b10:
- *tex_format = GL_BGRA;
- *tex_type = GL_UNSIGNED_INT_2_10_10_10_REV;
- break;
- case PICT_x2b10g10r10:
- *no_alpha = 1;
- case PICT_a2b10g10r10:
- *tex_format = GL_RGBA;
- *tex_type = GL_UNSIGNED_INT_2_10_10_10_REV;
- break;
-
- case PICT_r5g6b5:
- *tex_format = GL_RGB;
- *tex_type = GL_UNSIGNED_SHORT_5_6_5;
- break;
- case PICT_b5g6r5:
- *tex_format = GL_RGB;
- *tex_type = GL_UNSIGNED_SHORT_5_6_5_REV;
- break;
- case PICT_x1b5g5r5:
- *no_alpha = 1;
- case PICT_a1b5g5r5:
- *tex_format = GL_RGBA;
- *tex_type = GL_UNSIGNED_SHORT_1_5_5_5_REV;
- break;
-
- case PICT_x1r5g5b5:
- *no_alpha = 1;
- case PICT_a1r5g5b5:
- *tex_format = GL_BGRA;
- *tex_type = GL_UNSIGNED_SHORT_1_5_5_5_REV;
- break;
- case PICT_a8:
- *tex_format = GL_ALPHA;
- *tex_type = GL_UNSIGNED_BYTE;
- break;
- case PICT_x4r4g4b4:
- *no_alpha = 1;
- case PICT_a4r4g4b4:
- *tex_format = GL_BGRA;
- *tex_type = GL_UNSIGNED_SHORT_4_4_4_4_REV;
- break;
-
- case PICT_x4b4g4r4:
- *no_alpha = 1;
- case PICT_a4b4g4r4:
- *tex_format = GL_RGBA;
- *tex_type = GL_UNSIGNED_SHORT_4_4_4_4_REV;
- break;
-
- default:
- LogMessageVerb(X_INFO, 0,
- "fail to get matched format for %x \n",
- format);
- return -1;
- }
- return 0;
+ *no_alpha = 0;
+ *revert = REVERT_NONE;
+ *swap_rb = is_upload ? SWAP_NONE_UPLOADING : SWAP_NONE_DOWNLOADING;
+ switch (format) {
+ case PICT_a1:
+ *tex_format = GL_ALPHA;
+ *tex_type = GL_UNSIGNED_BYTE;
+ *revert = is_upload ? REVERT_UPLOADING_A1 : REVERT_DOWNLOADING_A1;
+ break;
+ case PICT_b8g8r8x8:
+ *no_alpha = 1;
+ case PICT_b8g8r8a8:
+ *tex_format = GL_BGRA;
+ *tex_type = GL_UNSIGNED_INT_8_8_8_8;
+ break;
+
+ case PICT_x8r8g8b8:
+ *no_alpha = 1;
+ case PICT_a8r8g8b8:
+ *tex_format = GL_BGRA;
+ *tex_type = GL_UNSIGNED_INT_8_8_8_8_REV;
+ break;
+ case PICT_x8b8g8r8:
+ *no_alpha = 1;
+ case PICT_a8b8g8r8:
+ *tex_format = GL_RGBA;
+ *tex_type = GL_UNSIGNED_INT_8_8_8_8_REV;
+ break;
+ case PICT_x2r10g10b10:
+ *no_alpha = 1;
+ case PICT_a2r10g10b10:
+ *tex_format = GL_BGRA;
+ *tex_type = GL_UNSIGNED_INT_2_10_10_10_REV;
+ break;
+ case PICT_x2b10g10r10:
+ *no_alpha = 1;
+ case PICT_a2b10g10r10:
+ *tex_format = GL_RGBA;
+ *tex_type = GL_UNSIGNED_INT_2_10_10_10_REV;
+ break;
+
+ case PICT_r5g6b5:
+ *tex_format = GL_RGB;
+ *tex_type = GL_UNSIGNED_SHORT_5_6_5;
+ break;
+ case PICT_b5g6r5:
+ *tex_format = GL_RGB;
+ *tex_type = GL_UNSIGNED_SHORT_5_6_5_REV;
+ break;
+ case PICT_x1b5g5r5:
+ *no_alpha = 1;
+ case PICT_a1b5g5r5:
+ *tex_format = GL_RGBA;
+ *tex_type = GL_UNSIGNED_SHORT_1_5_5_5_REV;
+ break;
+
+ case PICT_x1r5g5b5:
+ *no_alpha = 1;
+ case PICT_a1r5g5b5:
+ *tex_format = GL_BGRA;
+ *tex_type = GL_UNSIGNED_SHORT_1_5_5_5_REV;
+ break;
+ case PICT_a8:
+ *tex_format = GL_ALPHA;
+ *tex_type = GL_UNSIGNED_BYTE;
+ break;
+ case PICT_x4r4g4b4:
+ *no_alpha = 1;
+ case PICT_a4r4g4b4:
+ *tex_format = GL_BGRA;
+ *tex_type = GL_UNSIGNED_SHORT_4_4_4_4_REV;
+ break;
+
+ case PICT_x4b4g4r4:
+ *no_alpha = 1;
+ case PICT_a4b4g4r4:
+ *tex_format = GL_RGBA;
+ *tex_type = GL_UNSIGNED_SHORT_4_4_4_4_REV;
+ break;
+
+ default:
+ LogMessageVerb(X_INFO, 0,
+ "fail to get matched format for %x \n", format);
+ return -1;
+ }
+ return 0;
}
/* Currently, we use RGBA to represent all formats. */
-inline static int cache_format(GLenum format)
+inline static int
+cache_format(GLenum format)
{
- switch (format) {
- case GL_ALPHA:
- return 1;
- case GL_RGBA:
- return 0;
- default:
- return -1;
- }
+ switch (format) {
+ case GL_ALPHA:
+ return 1;
+ case GL_RGBA:
+ return 0;
+ default:
+ return -1;
+ }
}
#else
@@ -1054,782 +1041,807 @@ inline static int cache_format(GLenum format)
static inline int
glamor_get_tex_format_type_from_pictformat(PictFormatShort format,
- GLenum * tex_format,
- GLenum * tex_type,
- int *no_alpha,
- int *revert,
- int *swap_rb,
- int is_upload)
+ GLenum * tex_format,
+ GLenum * tex_type,
+ int *no_alpha,
+ int *revert,
+ int *swap_rb, int is_upload)
{
- int need_swap_rb = 0;
-
- *no_alpha = 0;
- *revert = IS_LITTLE_ENDIAN ? REVERT_NONE : REVERT_NORMAL;
-
- switch (format) {
- case PICT_b8g8r8x8:
- *no_alpha = 1;
- case PICT_b8g8r8a8:
- *tex_format = GL_RGBA;
- *tex_type = GL_UNSIGNED_BYTE;
- need_swap_rb = 1;
- *revert = IS_LITTLE_ENDIAN ? REVERT_NORMAL : REVERT_NONE;
- break;
-
- case PICT_x8r8g8b8:
- *no_alpha = 1;
- case PICT_a8r8g8b8:
- *tex_format = GL_RGBA;
- *tex_type = GL_UNSIGNED_BYTE;
- need_swap_rb = 1;
- break;
-
- case PICT_x8b8g8r8:
- *no_alpha = 1;
- case PICT_a8b8g8r8:
- *tex_format = GL_RGBA;
- *tex_type = GL_UNSIGNED_BYTE;
- break;
-
- case PICT_x2r10g10b10:
- *no_alpha = 1;
- case PICT_a2r10g10b10:
- *tex_format = GL_RGBA;
- /* glReadPixmap doesn't support GL_UNSIGNED_INT_10_10_10_2.
- * we have to use GL_UNSIGNED_BYTE and do the conversion in
- * shader latter.*/
- *tex_type = GL_UNSIGNED_BYTE;
- if (is_upload == 1) {
- if (!IS_LITTLE_ENDIAN)
- *revert = REVERT_UPLOADING_10_10_10_2;
- else
- *revert = REVERT_UPLOADING_2_10_10_10;
- }
- else {
- if (!IS_LITTLE_ENDIAN) {
- *revert = REVERT_DOWNLOADING_10_10_10_2;
- }
- else {
- *revert = REVERT_DOWNLOADING_2_10_10_10;
- }
- }
- need_swap_rb = 1;
-
- break;
-
- case PICT_x2b10g10r10:
- *no_alpha = 1;
- case PICT_a2b10g10r10:
- *tex_format = GL_RGBA;
- *tex_type = GL_UNSIGNED_BYTE;
- if (is_upload == 1) {
- if (!IS_LITTLE_ENDIAN)
- *revert = REVERT_UPLOADING_10_10_10_2;
- else
- *revert = REVERT_UPLOADING_2_10_10_10;
- }
- else {
- if (!IS_LITTLE_ENDIAN) {
- *revert = REVERT_DOWNLOADING_10_10_10_2;
- }
- else {
- *revert = REVERT_DOWNLOADING_2_10_10_10;
- }
- }
- break;
-
- case PICT_r5g6b5:
- *tex_format = GL_RGB;
- *tex_type = GL_UNSIGNED_SHORT_5_6_5;
- *revert = IS_LITTLE_ENDIAN ? REVERT_NONE : REVERT_NORMAL;
-
- break;
-
- case PICT_b5g6r5:
- *tex_format = GL_RGB;
- *tex_type = GL_UNSIGNED_SHORT_5_6_5;
- need_swap_rb = IS_LITTLE_ENDIAN ? 1 : 0;;
- break;
-
- case PICT_x1b5g5r5:
- *no_alpha = 1;
- case PICT_a1b5g5r5:
- *tex_format = GL_RGBA;
- *tex_type = GL_UNSIGNED_SHORT_5_5_5_1;
- if (IS_LITTLE_ENDIAN) {
- *revert = is_upload ? REVERT_UPLOADING_1_5_5_5 : REVERT_DOWNLOADING_1_5_5_5;
- } else
- *revert = REVERT_NONE;
- break;
-
- case PICT_x1r5g5b5:
- *no_alpha = 1;
- case PICT_a1r5g5b5:
- *tex_format = GL_RGBA;
- *tex_type = GL_UNSIGNED_SHORT_5_5_5_1;
- if (IS_LITTLE_ENDIAN) {
- *revert = is_upload ? REVERT_UPLOADING_1_5_5_5 : REVERT_DOWNLOADING_1_5_5_5;
- } else
- *revert = REVERT_NONE;
- need_swap_rb = 1;
- break;
-
- case PICT_a1:
- *tex_format = GL_ALPHA;
- *tex_type = GL_UNSIGNED_BYTE;
- *revert = is_upload ? REVERT_UPLOADING_A1 : REVERT_DOWNLOADING_A1;
- break;
-
- case PICT_a8:
- *tex_format = GL_ALPHA;
- *tex_type = GL_UNSIGNED_BYTE;
- *revert = REVERT_NONE;
- break;
-
- case PICT_x4r4g4b4:
- *no_alpha = 1;
- case PICT_a4r4g4b4:
- *tex_format = GL_RGBA;
- *tex_type = GL_UNSIGNED_SHORT_4_4_4_4;
- *revert = IS_LITTLE_ENDIAN ? REVERT_NORMAL : REVERT_NONE;
- need_swap_rb = 1;
- break;
-
- case PICT_x4b4g4r4:
- *no_alpha = 1;
- case PICT_a4b4g4r4:
- *tex_format = GL_RGBA;
- *tex_type = GL_UNSIGNED_SHORT_4_4_4_4;
- *revert = IS_LITTLE_ENDIAN ? REVERT_NORMAL : REVERT_NONE;
- break;
-
- default:
- LogMessageVerb(X_INFO, 0,
- "fail to get matched format for %x \n",
- format);
- return -1;
- }
-
- if (need_swap_rb)
- *swap_rb = is_upload ? SWAP_UPLOADING : SWAP_DOWNLOADING;
- else
- *swap_rb = is_upload ? SWAP_NONE_UPLOADING : SWAP_NONE_DOWNLOADING;
- return 0;
+ int need_swap_rb = 0;
+
+ *no_alpha = 0;
+ *revert = IS_LITTLE_ENDIAN ? REVERT_NONE : REVERT_NORMAL;
+
+ switch (format) {
+ case PICT_b8g8r8x8:
+ *no_alpha = 1;
+ case PICT_b8g8r8a8:
+ *tex_format = GL_RGBA;
+ *tex_type = GL_UNSIGNED_BYTE;
+ need_swap_rb = 1;
+ *revert = IS_LITTLE_ENDIAN ? REVERT_NORMAL : REVERT_NONE;
+ break;
+
+ case PICT_x8r8g8b8:
+ *no_alpha = 1;
+ case PICT_a8r8g8b8:
+ *tex_format = GL_RGBA;
+ *tex_type = GL_UNSIGNED_BYTE;
+ need_swap_rb = 1;
+ break;
+
+ case PICT_x8b8g8r8:
+ *no_alpha = 1;
+ case PICT_a8b8g8r8:
+ *tex_format = GL_RGBA;
+ *tex_type = GL_UNSIGNED_BYTE;
+ break;
+
+ case PICT_x2r10g10b10:
+ *no_alpha = 1;
+ case PICT_a2r10g10b10:
+ *tex_format = GL_RGBA;
+ /* glReadPixmap doesn't support GL_UNSIGNED_INT_10_10_10_2.
+ * we have to use GL_UNSIGNED_BYTE and do the conversion in
+ * shader latter.*/
+ *tex_type = GL_UNSIGNED_BYTE;
+ if (is_upload == 1) {
+ if (!IS_LITTLE_ENDIAN)
+ *revert = REVERT_UPLOADING_10_10_10_2;
+ else
+ *revert = REVERT_UPLOADING_2_10_10_10;
+ }
+ else {
+ if (!IS_LITTLE_ENDIAN) {
+ *revert = REVERT_DOWNLOADING_10_10_10_2;
+ }
+ else {
+ *revert = REVERT_DOWNLOADING_2_10_10_10;
+ }
+ }
+ need_swap_rb = 1;
+
+ break;
+
+ case PICT_x2b10g10r10:
+ *no_alpha = 1;
+ case PICT_a2b10g10r10:
+ *tex_format = GL_RGBA;
+ *tex_type = GL_UNSIGNED_BYTE;
+ if (is_upload == 1) {
+ if (!IS_LITTLE_ENDIAN)
+ *revert = REVERT_UPLOADING_10_10_10_2;
+ else
+ *revert = REVERT_UPLOADING_2_10_10_10;
+ }
+ else {
+ if (!IS_LITTLE_ENDIAN) {
+ *revert = REVERT_DOWNLOADING_10_10_10_2;
+ }
+ else {
+ *revert = REVERT_DOWNLOADING_2_10_10_10;
+ }
+ }
+ break;
+
+ case PICT_r5g6b5:
+ *tex_format = GL_RGB;
+ *tex_type = GL_UNSIGNED_SHORT_5_6_5;
+ *revert = IS_LITTLE_ENDIAN ? REVERT_NONE : REVERT_NORMAL;
+
+ break;
+
+ case PICT_b5g6r5:
+ *tex_format = GL_RGB;
+ *tex_type = GL_UNSIGNED_SHORT_5_6_5;
+ need_swap_rb = IS_LITTLE_ENDIAN ? 1 : 0;;
+ break;
+
+ case PICT_x1b5g5r5:
+ *no_alpha = 1;
+ case PICT_a1b5g5r5:
+ *tex_format = GL_RGBA;
+ *tex_type = GL_UNSIGNED_SHORT_5_5_5_1;
+ if (IS_LITTLE_ENDIAN) {
+ *revert =
+ is_upload ? REVERT_UPLOADING_1_5_5_5 :
+ REVERT_DOWNLOADING_1_5_5_5;
+ }
+ else
+ *revert = REVERT_NONE;
+ break;
+
+ case PICT_x1r5g5b5:
+ *no_alpha = 1;
+ case PICT_a1r5g5b5:
+ *tex_format = GL_RGBA;
+ *tex_type = GL_UNSIGNED_SHORT_5_5_5_1;
+ if (IS_LITTLE_ENDIAN) {
+ *revert =
+ is_upload ? REVERT_UPLOADING_1_5_5_5 :
+ REVERT_DOWNLOADING_1_5_5_5;
+ }
+ else
+ *revert = REVERT_NONE;
+ need_swap_rb = 1;
+ break;
+
+ case PICT_a1:
+ *tex_format = GL_ALPHA;
+ *tex_type = GL_UNSIGNED_BYTE;
+ *revert = is_upload ? REVERT_UPLOADING_A1 : REVERT_DOWNLOADING_A1;
+ break;
+
+ case PICT_a8:
+ *tex_format = GL_ALPHA;
+ *tex_type = GL_UNSIGNED_BYTE;
+ *revert = REVERT_NONE;
+ break;
+
+ case PICT_x4r4g4b4:
+ *no_alpha = 1;
+ case PICT_a4r4g4b4:
+ *tex_format = GL_RGBA;
+ *tex_type = GL_UNSIGNED_SHORT_4_4_4_4;
+ *revert = IS_LITTLE_ENDIAN ? REVERT_NORMAL : REVERT_NONE;
+ need_swap_rb = 1;
+ break;
+
+ case PICT_x4b4g4r4:
+ *no_alpha = 1;
+ case PICT_a4b4g4r4:
+ *tex_format = GL_RGBA;
+ *tex_type = GL_UNSIGNED_SHORT_4_4_4_4;
+ *revert = IS_LITTLE_ENDIAN ? REVERT_NORMAL : REVERT_NONE;
+ break;
+
+ default:
+ LogMessageVerb(X_INFO, 0,
+ "fail to get matched format for %x \n", format);
+ return -1;
+ }
+
+ if (need_swap_rb)
+ *swap_rb = is_upload ? SWAP_UPLOADING : SWAP_DOWNLOADING;
+ else
+ *swap_rb = is_upload ? SWAP_NONE_UPLOADING : SWAP_NONE_DOWNLOADING;
+ return 0;
}
-inline static int cache_format(GLenum format)
+inline static int
+cache_format(GLenum format)
{
- switch (format) {
- case GL_ALPHA:
- return 2;
- case GL_RGB:
- return 1;
- case GL_RGBA:
- return 0;
- default:
- return -1;
- }
+ switch (format) {
+ case GL_ALPHA:
+ return 2;
+ case GL_RGB:
+ return 1;
+ case GL_RGBA:
+ return 0;
+ default:
+ return -1;
+ }
}
#endif
-
static inline int
glamor_get_tex_format_type_from_pixmap(PixmapPtr pixmap,
- GLenum * format,
- GLenum * type,
- int *no_alpha,
- int *revert,
- int *swap_rb,
- int is_upload)
+ GLenum * format,
+ GLenum * type,
+ int *no_alpha,
+ int *revert, int *swap_rb, int is_upload)
{
- glamor_pixmap_private *pixmap_priv;
- PictFormatShort pict_format;
-
- pixmap_priv = glamor_get_pixmap_private(pixmap);
- if (GLAMOR_PIXMAP_PRIV_IS_PICTURE(pixmap_priv))
- pict_format = pixmap_priv->base.picture->format;
- else
- pict_format = format_for_depth(pixmap->drawable.depth);
-
- return glamor_get_tex_format_type_from_pictformat(pict_format,
- format, type,
- no_alpha,
- revert,
- swap_rb,
- is_upload);
+ glamor_pixmap_private *pixmap_priv;
+ PictFormatShort pict_format;
+
+ pixmap_priv = glamor_get_pixmap_private(pixmap);
+ if (GLAMOR_PIXMAP_PRIV_IS_PICTURE(pixmap_priv))
+ pict_format = pixmap_priv->base.picture->format;
+ else
+ pict_format = format_for_depth(pixmap->drawable.depth);
+
+ return glamor_get_tex_format_type_from_pictformat(pict_format,
+ format, type,
+ no_alpha,
+ revert,
+ swap_rb, is_upload);
}
-
/* borrowed from uxa */
static inline Bool
glamor_get_rgba_from_pixel(CARD32 pixel,
- float *red,
- float *green,
- float *blue, float *alpha, CARD32 format)
+ float *red,
+ float *green,
+ float *blue, float *alpha, CARD32 format)
{
- int rbits, bbits, gbits, abits;
- int rshift, bshift, gshift, ashift;
-
- rbits = PICT_FORMAT_R(format);
- gbits = PICT_FORMAT_G(format);
- bbits = PICT_FORMAT_B(format);
- abits = PICT_FORMAT_A(format);
-
- if (PICT_FORMAT_TYPE(format) == PICT_TYPE_A) {
- rshift = gshift = bshift = ashift = 0;
- } else if (PICT_FORMAT_TYPE(format) == PICT_TYPE_ARGB) {
- bshift = 0;
- gshift = bbits;
- rshift = gshift + gbits;
- ashift = rshift + rbits;
- } else if (PICT_FORMAT_TYPE(format) == PICT_TYPE_ABGR) {
- rshift = 0;
- gshift = rbits;
- bshift = gshift + gbits;
- ashift = bshift + bbits;
+ int rbits, bbits, gbits, abits;
+ int rshift, bshift, gshift, ashift;
+
+ rbits = PICT_FORMAT_R(format);
+ gbits = PICT_FORMAT_G(format);
+ bbits = PICT_FORMAT_B(format);
+ abits = PICT_FORMAT_A(format);
+
+ if (PICT_FORMAT_TYPE(format) == PICT_TYPE_A) {
+ rshift = gshift = bshift = ashift = 0;
+ }
+ else if (PICT_FORMAT_TYPE(format) == PICT_TYPE_ARGB) {
+ bshift = 0;
+ gshift = bbits;
+ rshift = gshift + gbits;
+ ashift = rshift + rbits;
+ }
+ else if (PICT_FORMAT_TYPE(format) == PICT_TYPE_ABGR) {
+ rshift = 0;
+ gshift = rbits;
+ bshift = gshift + gbits;
+ ashift = bshift + bbits;
#if XORG_VERSION_CURRENT >= 10699900
- } else if (PICT_FORMAT_TYPE(format) == PICT_TYPE_BGRA) {
- ashift = 0;
- rshift = abits;
- if (abits == 0)
- rshift = PICT_FORMAT_BPP(format) - (rbits + gbits +
- bbits);
- gshift = rshift + rbits;
- bshift = gshift + gbits;
+ }
+ else if (PICT_FORMAT_TYPE(format) == PICT_TYPE_BGRA) {
+ ashift = 0;
+ rshift = abits;
+ if (abits == 0)
+ rshift = PICT_FORMAT_BPP(format) - (rbits + gbits + bbits);
+ gshift = rshift + rbits;
+ bshift = gshift + gbits;
#endif
- } else {
- return FALSE;
- }
+ }
+ else {
+ return FALSE;
+ }
#define COLOR_INT_TO_FLOAT(_fc_, _p_, _s_, _bits_) \
*_fc_ = (((_p_) >> (_s_)) & (( 1 << (_bits_)) - 1)) \
/ (float)((1<<(_bits_)) - 1)
- if (rbits)
- COLOR_INT_TO_FLOAT(red, pixel, rshift, rbits);
- else
- *red = 0;
+ if (rbits)
+ COLOR_INT_TO_FLOAT(red, pixel, rshift, rbits);
+ else
+ *red = 0;
- if (gbits)
- COLOR_INT_TO_FLOAT(green, pixel, gshift, gbits);
- else
- *green = 0;
+ if (gbits)
+ COLOR_INT_TO_FLOAT(green, pixel, gshift, gbits);
+ else
+ *green = 0;
- if (bbits)
- COLOR_INT_TO_FLOAT(blue, pixel, bshift, bbits);
- else
- *blue = 0;
+ if (bbits)
+ COLOR_INT_TO_FLOAT(blue, pixel, bshift, bbits);
+ else
+ *blue = 0;
- if (abits)
- COLOR_INT_TO_FLOAT(alpha, pixel, ashift, abits);
- else
- *alpha = 1;
+ if (abits)
+ COLOR_INT_TO_FLOAT(alpha, pixel, ashift, abits);
+ else
+ *alpha = 1;
- return TRUE;
+ return TRUE;
}
-inline static Bool glamor_pict_format_is_compatible(PictFormatShort pict_format, int depth)
+inline static Bool
+glamor_pict_format_is_compatible(PictFormatShort pict_format, int depth)
{
- GLenum iformat;
-
- gl_iformat_for_depth(depth, &iformat);
- switch (iformat) {
- case GL_RGBA:
- return (pict_format == PICT_a8r8g8b8 || pict_format == PICT_x8r8g8b8);
- case GL_ALPHA:
- return (pict_format == PICT_a8);
- default:
- return FALSE;
- }
+ GLenum iformat;
+
+ gl_iformat_for_depth(depth, &iformat);
+ switch (iformat) {
+ case GL_RGBA:
+ return (pict_format == PICT_a8r8g8b8 || pict_format == PICT_x8r8g8b8);
+ case GL_ALPHA:
+ return (pict_format == PICT_a8);
+ default:
+ return FALSE;
+ }
}
/* return TRUE if we can access this pixmap at DDX driver. */
-inline static Bool glamor_ddx_fallback_check_pixmap(DrawablePtr drawable)
+inline static Bool
+glamor_ddx_fallback_check_pixmap(DrawablePtr drawable)
{
- PixmapPtr pixmap = glamor_get_drawable_pixmap(drawable);
- glamor_pixmap_private *pixmap_priv = glamor_get_pixmap_private(pixmap);
- return (!pixmap_priv
- || (pixmap_priv->type == GLAMOR_TEXTURE_DRM
- || pixmap_priv->type == GLAMOR_MEMORY
- || pixmap_priv->type == GLAMOR_DRM_ONLY));
+ PixmapPtr pixmap = glamor_get_drawable_pixmap(drawable);
+ glamor_pixmap_private *pixmap_priv = glamor_get_pixmap_private(pixmap);
+
+ return (!pixmap_priv
+ || (pixmap_priv->type == GLAMOR_TEXTURE_DRM
+ || pixmap_priv->type == GLAMOR_MEMORY
+ || pixmap_priv->type == GLAMOR_DRM_ONLY));
}
-inline static Bool glamor_ddx_fallback_check_gc(GCPtr gc)
+inline static Bool
+glamor_ddx_fallback_check_gc(GCPtr gc)
{
- PixmapPtr pixmap;
- if (!gc)
- return TRUE;
- switch (gc->fillStyle) {
- case FillStippled:
- case FillOpaqueStippled:
- pixmap = gc->stipple;
- break;
- case FillTiled:
- pixmap = gc->tile.pixmap;
- break;
- default:
- pixmap = NULL;
- }
- return (!pixmap || glamor_ddx_fallback_check_pixmap(&pixmap->drawable));
+ PixmapPtr pixmap;
+
+ if (!gc)
+ return TRUE;
+ switch (gc->fillStyle) {
+ case FillStippled:
+ case FillOpaqueStippled:
+ pixmap = gc->stipple;
+ break;
+ case FillTiled:
+ pixmap = gc->tile.pixmap;
+ break;
+ default:
+ pixmap = NULL;
+ }
+ return (!pixmap || glamor_ddx_fallback_check_pixmap(&pixmap->drawable));
}
-inline static Bool glamor_is_large_pixmap(PixmapPtr pixmap)
+
+inline static Bool
+glamor_is_large_pixmap(PixmapPtr pixmap)
{
- glamor_pixmap_private *priv;
+ glamor_pixmap_private *priv;
- priv = glamor_get_pixmap_private(pixmap);
- return (priv->type == GLAMOR_TEXTURE_LARGE);
+ priv = glamor_get_pixmap_private(pixmap);
+ return (priv->type == GLAMOR_TEXTURE_LARGE);
}
-inline static Bool glamor_is_large_picture(PicturePtr picture)
+inline static Bool
+glamor_is_large_picture(PicturePtr picture)
{
- PixmapPtr pixmap;
+ PixmapPtr pixmap;
- if (picture->pDrawable) {
- pixmap = glamor_get_drawable_pixmap(picture->pDrawable);
- return glamor_is_large_pixmap(pixmap);
- }
- return FALSE;
+ if (picture->pDrawable) {
+ pixmap = glamor_get_drawable_pixmap(picture->pDrawable);
+ return glamor_is_large_pixmap(pixmap);
+ }
+ return FALSE;
}
-inline static Bool glamor_tex_format_is_readable(GLenum format)
+inline static Bool
+glamor_tex_format_is_readable(GLenum format)
{
- return ((format == GL_RGBA || format == GL_RGB || format == GL_ALPHA));
+ return ((format == GL_RGBA || format == GL_RGB || format == GL_ALPHA));
}
-static inline void _glamor_dump_pixmap_bits(PixmapPtr pixmap, int x, int y, int w, int h)
+static inline void
+_glamor_dump_pixmap_bits(PixmapPtr pixmap, int x, int y, int w, int h)
{
- int i,j;
- unsigned char * p = pixmap->devPrivate.ptr;
- int stride = pixmap->devKind;
-
- p = p + y * stride + x;
-
- for (i = 0; i < h; i++)
- {
- ErrorF("line %3d: ", i);
- for(j = 0; j < w; j++)
- ErrorF("%2d ", (p[j/8] & (1 << (j%8)))>>(j%8));
- p += stride;
- ErrorF("\n");
- }
+ int i, j;
+ unsigned char *p = pixmap->devPrivate.ptr;
+ int stride = pixmap->devKind;
+
+ p = p + y * stride + x;
+
+ for (i = 0; i < h; i++) {
+ ErrorF("line %3d: ", i);
+ for (j = 0; j < w; j++)
+ ErrorF("%2d ", (p[j / 8] & (1 << (j % 8))) >> (j % 8));
+ p += stride;
+ ErrorF("\n");
+ }
}
-static inline void _glamor_dump_pixmap_byte(PixmapPtr pixmap, int x, int y, int w, int h)
+static inline void
+_glamor_dump_pixmap_byte(PixmapPtr pixmap, int x, int y, int w, int h)
{
- int i,j;
- unsigned char * p = pixmap->devPrivate.ptr;
- int stride = pixmap->devKind;
-
- p = p + y * stride + x;
-
- for (i = 0; i < h; i++)
- {
- ErrorF("line %3d: ", i);
- for(j = 0; j < w; j++)
- ErrorF("%2x ", p[j]);
- p += stride;
- ErrorF("\n");
- }
+ int i, j;
+ unsigned char *p = pixmap->devPrivate.ptr;
+ int stride = pixmap->devKind;
+
+ p = p + y * stride + x;
+
+ for (i = 0; i < h; i++) {
+ ErrorF("line %3d: ", i);
+ for (j = 0; j < w; j++)
+ ErrorF("%2x ", p[j]);
+ p += stride;
+ ErrorF("\n");
+ }
}
-static inline void _glamor_dump_pixmap_sword(PixmapPtr pixmap, int x, int y, int w, int h)
+static inline void
+_glamor_dump_pixmap_sword(PixmapPtr pixmap, int x, int y, int w, int h)
{
- int i,j;
- unsigned short * p = pixmap->devPrivate.ptr;
- int stride = pixmap->devKind / 2;
-
- p = p + y * stride + x;
-
- for (i = 0; i < h; i++)
- {
- ErrorF("line %3d: ", i);
- for(j = 0; j < w; j++)
- ErrorF("%2x ", p[j]);
- p += stride;
- ErrorF("\n");
- }
+ int i, j;
+ unsigned short *p = pixmap->devPrivate.ptr;
+ int stride = pixmap->devKind / 2;
+
+ p = p + y * stride + x;
+
+ for (i = 0; i < h; i++) {
+ ErrorF("line %3d: ", i);
+ for (j = 0; j < w; j++)
+ ErrorF("%2x ", p[j]);
+ p += stride;
+ ErrorF("\n");
+ }
}
-static inline void _glamor_dump_pixmap_word(PixmapPtr pixmap, int x, int y, int w, int h)
+static inline void
+_glamor_dump_pixmap_word(PixmapPtr pixmap, int x, int y, int w, int h)
{
- int i,j;
- unsigned int * p = pixmap->devPrivate.ptr;
- int stride = pixmap->devKind / 4;
-
- p = p + y * stride + x;
-
- for (i = 0; i < h; i++)
- {
- ErrorF("line %3d: ", i);
- for(j = 0; j < w; j++)
- ErrorF("%2x ", p[j]);
- p += stride;
- ErrorF("\n");
- }
+ int i, j;
+ unsigned int *p = pixmap->devPrivate.ptr;
+ int stride = pixmap->devKind / 4;
+
+ p = p + y * stride + x;
+
+ for (i = 0; i < h; i++) {
+ ErrorF("line %3d: ", i);
+ for (j = 0; j < w; j++)
+ ErrorF("%2x ", p[j]);
+ p += stride;
+ ErrorF("\n");
+ }
}
-static inline void glamor_dump_pixmap(PixmapPtr pixmap, int x, int y, int w, int h)
+static inline void
+glamor_dump_pixmap(PixmapPtr pixmap, int x, int y, int w, int h)
{
- w = ((x + w) > pixmap->drawable.width) ? (pixmap->drawable.width - x) : w;
- h = ((y + h) > pixmap->drawable.height) ? (pixmap->drawable.height - y) : h;
-
- glamor_prepare_access(&pixmap->drawable, GLAMOR_ACCESS_RO);
- switch (pixmap->drawable.depth) {
- case 8:
- _glamor_dump_pixmap_byte(pixmap, x, y, w, h);
- break;
- case 15:
- case 16:
- _glamor_dump_pixmap_sword(pixmap, x, y, w, h);
- break;
-
- case 24:
- case 32:
- _glamor_dump_pixmap_word(pixmap, x, y, w, h);
- break;
- case 1:
- _glamor_dump_pixmap_bits(pixmap, x, y, w, h);
- break;
- default:
- ErrorF("dump depth %d, not implemented.\n", pixmap->drawable.depth);
- }
- glamor_finish_access(&pixmap->drawable, GLAMOR_ACCESS_RO);
+ w = ((x + w) > pixmap->drawable.width) ? (pixmap->drawable.width - x) : w;
+ h = ((y + h) > pixmap->drawable.height) ? (pixmap->drawable.height - y) : h;
+
+ glamor_prepare_access(&pixmap->drawable, GLAMOR_ACCESS_RO);
+ switch (pixmap->drawable.depth) {
+ case 8:
+ _glamor_dump_pixmap_byte(pixmap, x, y, w, h);
+ break;
+ case 15:
+ case 16:
+ _glamor_dump_pixmap_sword(pixmap, x, y, w, h);
+ break;
+
+ case 24:
+ case 32:
+ _glamor_dump_pixmap_word(pixmap, x, y, w, h);
+ break;
+ case 1:
+ _glamor_dump_pixmap_bits(pixmap, x, y, w, h);
+ break;
+ default:
+ ErrorF("dump depth %d, not implemented.\n", pixmap->drawable.depth);
+ }
+ glamor_finish_access(&pixmap->drawable, GLAMOR_ACCESS_RO);
}
-static inline void _glamor_compare_pixmaps(PixmapPtr pixmap1, PixmapPtr pixmap2,
- int x, int y, int w, int h,
- PictFormatShort short_format,
- int all, int diffs)
+static inline void
+_glamor_compare_pixmaps(PixmapPtr pixmap1, PixmapPtr pixmap2,
+ int x, int y, int w, int h,
+ PictFormatShort short_format, int all, int diffs)
{
- int i, j;
- unsigned char * p1 = pixmap1->devPrivate.ptr;
- unsigned char * p2 = pixmap2->devPrivate.ptr;
- int line_need_printed = 0;
- int test_code = 0xAABBCCDD;
- int little_endian = 0;
- unsigned char *p_test;
- int bpp = pixmap1->drawable.depth == 8 ? 1 : 4;
- int stride = pixmap1->devKind;
-
- assert(pixmap1->devKind == pixmap2->devKind);
-
- ErrorF("stride:%d, width:%d, height:%d\n", stride, w, h);
-
- p1 = p1 + y * stride + x;
- p2 = p2 + y * stride + x;
-
- if (all) {
- for (i = 0; i < h; i++) {
- ErrorF("line %3d: ", i);
-
- for (j = 0; j < stride; j++) {
- if (j % bpp == 0)
- ErrorF("[%d]%2x:%2x ", j / bpp, p1[j], p2[j]);
- else
- ErrorF("%2x:%2x ", p1[j], p2[j]);
- }
-
- p1 += stride;
- p2 += stride;
- ErrorF("\n");
- }
- } else {
- if (short_format == PICT_a8r8g8b8) {
- p_test = (unsigned char *) & test_code;
- little_endian = (*p_test == 0xDD);
- bpp = 4;
-
- for (i = 0; i < h; i++) {
- line_need_printed = 0;
-
- for (j = 0; j < stride; j++) {
- if (p1[j] != p2[j] && (p1[j] - p2[j] > diffs || p2[j] - p1[j] > diffs)) {
- if (line_need_printed) {
- if (little_endian) {
- switch (j % 4) {
- case 2:
- ErrorF("[%d]RED:%2x:%2x ", j / bpp, p1[j], p2[j]);
- break;
- case 1:
- ErrorF("[%d]GREEN:%2x:%2x ", j / bpp, p1[j], p2[j]);
- break;
- case 0:
- ErrorF("[%d]BLUE:%2x:%2x ", j / bpp, p1[j], p2[j]);
- break;
- case 3:
- ErrorF("[%d]Alpha:%2x:%2x ", j / bpp, p1[j], p2[j]);
- break;
- }
- } else {
- switch (j % 4) {
- case 1:
- ErrorF("[%d]RED:%2x:%2x ", j / bpp, p1[j], p2[j]);
- break;
- case 2:
- ErrorF("[%d]GREEN:%2x:%2x ", j / bpp, p1[j], p2[j]);
- break;
- case 3:
- ErrorF("[%d]BLUE:%2x:%2x ", j / bpp, p1[j], p2[j]);
- break;
- case 0:
- ErrorF("[%d]Alpha:%2x:%2x ", j / bpp, p1[j], p2[j]);
- break;
- }
- }
- } else {
- line_need_printed = 1;
- j = -1;
- ErrorF("line %3d: ", i);
- continue;
- }
- }
- }
-
- p1 += stride;
- p2 += stride;
- ErrorF("\n");
- }
- } //more format can be added here.
- else { // the default format, just print.
- for (i = 0; i < h; i++) {
- line_need_printed = 0;
-
- for (j = 0; j < stride; j++) {
- if (p1[j] != p2[j]) {
- if (line_need_printed) {
- ErrorF("[%d]%2x:%2x ", j / bpp, p1[j], p2[j]);
- } else {
- line_need_printed = 1;
- j = -1;
- ErrorF("line %3d: ", i);
- continue;
- }
- }
- }
-
- p1 += stride;
- p2 += stride;
- ErrorF("\n");
- }
- }
- }
+ int i, j;
+ unsigned char *p1 = pixmap1->devPrivate.ptr;
+ unsigned char *p2 = pixmap2->devPrivate.ptr;
+ int line_need_printed = 0;
+ int test_code = 0xAABBCCDD;
+ int little_endian = 0;
+ unsigned char *p_test;
+ int bpp = pixmap1->drawable.depth == 8 ? 1 : 4;
+ int stride = pixmap1->devKind;
+
+ assert(pixmap1->devKind == pixmap2->devKind);
+
+ ErrorF("stride:%d, width:%d, height:%d\n", stride, w, h);
+
+ p1 = p1 + y * stride + x;
+ p2 = p2 + y * stride + x;
+
+ if (all) {
+ for (i = 0; i < h; i++) {
+ ErrorF("line %3d: ", i);
+
+ for (j = 0; j < stride; j++) {
+ if (j % bpp == 0)
+ ErrorF("[%d]%2x:%2x ", j / bpp, p1[j], p2[j]);
+ else
+ ErrorF("%2x:%2x ", p1[j], p2[j]);
+ }
+
+ p1 += stride;
+ p2 += stride;
+ ErrorF("\n");
+ }
+ }
+ else {
+ if (short_format == PICT_a8r8g8b8) {
+ p_test = (unsigned char *) &test_code;
+ little_endian = (*p_test == 0xDD);
+ bpp = 4;
+
+ for (i = 0; i < h; i++) {
+ line_need_printed = 0;
+
+ for (j = 0; j < stride; j++) {
+ if (p1[j] != p2[j] &&
+ (p1[j] - p2[j] > diffs || p2[j] - p1[j] > diffs)) {
+ if (line_need_printed) {
+ if (little_endian) {
+ switch (j % 4) {
+ case 2:
+ ErrorF("[%d]RED:%2x:%2x ", j / bpp, p1[j],
+ p2[j]);
+ break;
+ case 1:
+ ErrorF("[%d]GREEN:%2x:%2x ", j / bpp, p1[j],
+ p2[j]);
+ break;
+ case 0:
+ ErrorF("[%d]BLUE:%2x:%2x ", j / bpp, p1[j],
+ p2[j]);
+ break;
+ case 3:
+ ErrorF("[%d]Alpha:%2x:%2x ", j / bpp, p1[j],
+ p2[j]);
+ break;
+ }
+ }
+ else {
+ switch (j % 4) {
+ case 1:
+ ErrorF("[%d]RED:%2x:%2x ", j / bpp, p1[j],
+ p2[j]);
+ break;
+ case 2:
+ ErrorF("[%d]GREEN:%2x:%2x ", j / bpp, p1[j],
+ p2[j]);
+ break;
+ case 3:
+ ErrorF("[%d]BLUE:%2x:%2x ", j / bpp, p1[j],
+ p2[j]);
+ break;
+ case 0:
+ ErrorF("[%d]Alpha:%2x:%2x ", j / bpp, p1[j],
+ p2[j]);
+ break;
+ }
+ }
+ }
+ else {
+ line_need_printed = 1;
+ j = -1;
+ ErrorF("line %3d: ", i);
+ continue;
+ }
+ }
+ }
+
+ p1 += stride;
+ p2 += stride;
+ ErrorF("\n");
+ }
+ } //more format can be added here.
+ else { // the default format, just print.
+ for (i = 0; i < h; i++) {
+ line_need_printed = 0;
+
+ for (j = 0; j < stride; j++) {
+ if (p1[j] != p2[j]) {
+ if (line_need_printed) {
+ ErrorF("[%d]%2x:%2x ", j / bpp, p1[j], p2[j]);
+ }
+ else {
+ line_need_printed = 1;
+ j = -1;
+ ErrorF("line %3d: ", i);
+ continue;
+ }
+ }
+ }
+
+ p1 += stride;
+ p2 += stride;
+ ErrorF("\n");
+ }
+ }
+ }
}
-static inline void glamor_compare_pixmaps(PixmapPtr pixmap1, PixmapPtr pixmap2,
- int x, int y, int w, int h, int all, int diffs)
+static inline void
+glamor_compare_pixmaps(PixmapPtr pixmap1, PixmapPtr pixmap2,
+ int x, int y, int w, int h, int all, int diffs)
{
- assert(pixmap1->drawable.depth == pixmap2->drawable.depth);
+ assert(pixmap1->drawable.depth == pixmap2->drawable.depth);
- glamor_prepare_access(&pixmap1->drawable, GLAMOR_ACCESS_RO);
- glamor_prepare_access(&pixmap2->drawable, GLAMOR_ACCESS_RO);
+ glamor_prepare_access(&pixmap1->drawable, GLAMOR_ACCESS_RO);
+ glamor_prepare_access(&pixmap2->drawable, GLAMOR_ACCESS_RO);
- _glamor_compare_pixmaps(pixmap1, pixmap2, x, y, w, h, -1, all, diffs);
+ _glamor_compare_pixmaps(pixmap1, pixmap2, x, y, w, h, -1, all, diffs);
- glamor_finish_access(&pixmap1->drawable, GLAMOR_ACCESS_RO);
- glamor_finish_access(&pixmap2->drawable, GLAMOR_ACCESS_RO);
+ glamor_finish_access(&pixmap1->drawable, GLAMOR_ACCESS_RO);
+ glamor_finish_access(&pixmap2->drawable, GLAMOR_ACCESS_RO);
}
/* This function is used to compare two pictures.
If the picture has no drawable, we use fb functions to generate it. */
-static inline void glamor_compare_pictures( ScreenPtr screen,
- PicturePtr fst_picture,
- PicturePtr snd_picture,
- int x_source, int y_source,
- int width, int height,
- int all, int diffs)
+static inline void
+glamor_compare_pictures(ScreenPtr screen,
+ PicturePtr fst_picture,
+ PicturePtr snd_picture,
+ int x_source, int y_source,
+ int width, int height, int all, int diffs)
{
- PixmapPtr fst_pixmap;
- PixmapPtr snd_pixmap;
- int fst_generated, snd_generated;
- int error;
- int fst_type = -1;
- int snd_type = -1; // -1 represent has drawable.
-
- if (fst_picture->format != snd_picture->format) {
- ErrorF("Different picture format can not compare!\n");
- return;
- }
-
- if (!fst_picture->pDrawable) {
- fst_type = fst_picture->pSourcePict->type;
- }
-
- if (!snd_picture->pDrawable) {
- snd_type = snd_picture->pSourcePict->type;
- }
-
- if ((fst_type != -1) && (snd_type != -1) && (fst_type != snd_type)) {
- ErrorF("Different picture type will never be same!\n");
- return;
- }
-
- fst_generated = snd_generated = 0;
-
- if (!fst_picture->pDrawable) {
- PicturePtr pixman_pic;
- PixmapPtr pixmap = NULL;
- PictFormatShort format;
-
- format = fst_picture->format;
-
- pixmap = glamor_create_pixmap(screen,
- width, height,
- PIXMAN_FORMAT_DEPTH(format),
- GLAMOR_CREATE_PIXMAP_CPU);
-
- pixman_pic = CreatePicture(0,
- &pixmap->drawable,
- PictureMatchFormat(screen,
- PIXMAN_FORMAT_DEPTH(format), format),
- 0, 0, serverClient, &error);
-
- fbComposite(PictOpSrc, fst_picture, NULL, pixman_pic,
- x_source, y_source,
- 0, 0,
- 0, 0,
- width, height);
-
- glamor_destroy_pixmap(pixmap);
-
- fst_picture = pixman_pic;
- fst_generated = 1;
- }
-
- if (!snd_picture->pDrawable) {
- PicturePtr pixman_pic;
- PixmapPtr pixmap = NULL;
- PictFormatShort format;
-
- format = snd_picture->format;
-
- pixmap = glamor_create_pixmap(screen,
- width, height,
- PIXMAN_FORMAT_DEPTH(format),
- GLAMOR_CREATE_PIXMAP_CPU);
-
- pixman_pic = CreatePicture(0,
- &pixmap->drawable,
- PictureMatchFormat(screen,
- PIXMAN_FORMAT_DEPTH(format), format),
- 0, 0, serverClient, &error);
-
- fbComposite(PictOpSrc, snd_picture, NULL, pixman_pic,
- x_source, y_source,
- 0, 0,
- 0, 0,
- width, height);
-
- glamor_destroy_pixmap(pixmap);
-
- snd_picture = pixman_pic;
- snd_generated = 1;
- }
-
- fst_pixmap = glamor_get_drawable_pixmap(fst_picture->pDrawable);
- snd_pixmap = glamor_get_drawable_pixmap(snd_picture->pDrawable);
-
- if (fst_pixmap->drawable.depth != snd_pixmap->drawable.depth) {
- if (fst_generated)
- glamor_destroy_picture(fst_picture);
- if (snd_generated)
- glamor_destroy_picture(snd_picture);
-
- ErrorF("Different pixmap depth can not compare!\n");
- return;
- }
-
- glamor_prepare_access(&fst_pixmap->drawable, GLAMOR_ACCESS_RO);
- glamor_prepare_access(&snd_pixmap->drawable, GLAMOR_ACCESS_RO);
-
- if ((fst_type == SourcePictTypeLinear) ||
- (fst_type == SourcePictTypeRadial) ||
- (fst_type == SourcePictTypeConical) ||
- (snd_type == SourcePictTypeLinear) ||
- (snd_type == SourcePictTypeRadial) ||
- (snd_type == SourcePictTypeConical)) {
- x_source = y_source = 0;
- }
-
- _glamor_compare_pixmaps(fst_pixmap, snd_pixmap,
- x_source, y_source,
- width, height,
- fst_picture->format, all, diffs);
-
- glamor_finish_access(&fst_pixmap->drawable, GLAMOR_ACCESS_RO);
- glamor_finish_access(&snd_pixmap->drawable, GLAMOR_ACCESS_RO);
-
- if (fst_generated)
- glamor_destroy_picture(fst_picture);
- if (snd_generated)
- glamor_destroy_picture(snd_picture);
-
- return;
+ PixmapPtr fst_pixmap;
+ PixmapPtr snd_pixmap;
+ int fst_generated, snd_generated;
+ int error;
+ int fst_type = -1;
+ int snd_type = -1; // -1 represent has drawable.
+
+ if (fst_picture->format != snd_picture->format) {
+ ErrorF("Different picture format can not compare!\n");
+ return;
+ }
+
+ if (!fst_picture->pDrawable) {
+ fst_type = fst_picture->pSourcePict->type;
+ }
+
+ if (!snd_picture->pDrawable) {
+ snd_type = snd_picture->pSourcePict->type;
+ }
+
+ if ((fst_type != -1) && (snd_type != -1) && (fst_type != snd_type)) {
+ ErrorF("Different picture type will never be same!\n");
+ return;
+ }
+
+ fst_generated = snd_generated = 0;
+
+ if (!fst_picture->pDrawable) {
+ PicturePtr pixman_pic;
+ PixmapPtr pixmap = NULL;
+ PictFormatShort format;
+
+ format = fst_picture->format;
+
+ pixmap = glamor_create_pixmap(screen,
+ width, height,
+ PIXMAN_FORMAT_DEPTH(format),
+ GLAMOR_CREATE_PIXMAP_CPU);
+
+ pixman_pic = CreatePicture(0,
+ &pixmap->drawable,
+ PictureMatchFormat(screen,
+ PIXMAN_FORMAT_DEPTH
+ (format), format), 0, 0,
+ serverClient, &error);
+
+ fbComposite(PictOpSrc, fst_picture, NULL, pixman_pic,
+ x_source, y_source, 0, 0, 0, 0, width, height);
+
+ glamor_destroy_pixmap(pixmap);
+
+ fst_picture = pixman_pic;
+ fst_generated = 1;
+ }
+
+ if (!snd_picture->pDrawable) {
+ PicturePtr pixman_pic;
+ PixmapPtr pixmap = NULL;
+ PictFormatShort format;
+
+ format = snd_picture->format;
+
+ pixmap = glamor_create_pixmap(screen,
+ width, height,
+ PIXMAN_FORMAT_DEPTH(format),
+ GLAMOR_CREATE_PIXMAP_CPU);
+
+ pixman_pic = CreatePicture(0,
+ &pixmap->drawable,
+ PictureMatchFormat(screen,
+ PIXMAN_FORMAT_DEPTH
+ (format), format), 0, 0,
+ serverClient, &error);
+
+ fbComposite(PictOpSrc, snd_picture, NULL, pixman_pic,
+ x_source, y_source, 0, 0, 0, 0, width, height);
+
+ glamor_destroy_pixmap(pixmap);
+
+ snd_picture = pixman_pic;
+ snd_generated = 1;
+ }
+
+ fst_pixmap = glamor_get_drawable_pixmap(fst_picture->pDrawable);
+ snd_pixmap = glamor_get_drawable_pixmap(snd_picture->pDrawable);
+
+ if (fst_pixmap->drawable.depth != snd_pixmap->drawable.depth) {
+ if (fst_generated)
+ glamor_destroy_picture(fst_picture);
+ if (snd_generated)
+ glamor_destroy_picture(snd_picture);
+
+ ErrorF("Different pixmap depth can not compare!\n");
+ return;
+ }
+
+ glamor_prepare_access(&fst_pixmap->drawable, GLAMOR_ACCESS_RO);
+ glamor_prepare_access(&snd_pixmap->drawable, GLAMOR_ACCESS_RO);
+
+ if ((fst_type == SourcePictTypeLinear) ||
+ (fst_type == SourcePictTypeRadial) ||
+ (fst_type == SourcePictTypeConical) ||
+ (snd_type == SourcePictTypeLinear) ||
+ (snd_type == SourcePictTypeRadial) ||
+ (snd_type == SourcePictTypeConical)) {
+ x_source = y_source = 0;
+ }
+
+ _glamor_compare_pixmaps(fst_pixmap, snd_pixmap,
+ x_source, y_source,
+ width, height, fst_picture->format, all, diffs);
+
+ glamor_finish_access(&fst_pixmap->drawable, GLAMOR_ACCESS_RO);
+ glamor_finish_access(&snd_pixmap->drawable, GLAMOR_ACCESS_RO);
+
+ if (fst_generated)
+ glamor_destroy_picture(fst_picture);
+ if (snd_generated)
+ glamor_destroy_picture(snd_picture);
+
+ return;
}
#ifdef __i386__
-static inline unsigned long __fls(unsigned long x)
+static inline unsigned long
+__fls(unsigned long x)
{
- asm("bsr %1,%0"
- : "=r" (x)
- : "rm" (x));
- return x;
+ asm("bsr %1,%0":"=r"(x)
+ : "rm"(x));
+ return x;
}
#else
-static inline unsigned long __fls(unsigned long x)
+static inline unsigned long
+__fls(unsigned long x)
{
- int n;
-
- if (x == 0) return(0);
- n = 0;
- if (x <= 0x0000FFFF) {n = n +16; x = x <<16;}
- if (x <= 0x00FFFFFF) {n = n + 8; x = x << 8;}
- if (x <= 0x0FFFFFFF) {n = n + 4; x = x << 4;}
- if (x <= 0x3FFFFFFF) {n = n + 2; x = x << 2;}
- if (x <= 0x7FFFFFFF) {n = n + 1;}
- return 31 - n;
+ int n;
+
+ if (x == 0)
+ return (0);
+ n = 0;
+ if (x <= 0x0000FFFF) {
+ n = n + 16;
+ x = x << 16;
+ }
+ if (x <= 0x00FFFFFF) {
+ n = n + 8;
+ x = x << 8;
+ }
+ if (x <= 0x0FFFFFFF) {
+ n = n + 4;
+ x = x << 4;
+ }
+ if (x <= 0x3FFFFFFF) {
+ n = n + 2;
+ x = x << 2;
+ }
+ if (x <= 0x7FFFFFFF) {
+ n = n + 1;
+ }
+ return 31 - n;
}
#endif
-static inline void glamor_make_current(ScreenPtr screen)
+static inline void
+glamor_make_current(ScreenPtr screen)
{
- glamor_egl_make_current(screen);
+ glamor_egl_make_current(screen);
}
-static inline void glamor_restore_current(ScreenPtr screen)
+static inline void
+glamor_restore_current(ScreenPtr screen)
{
- glamor_egl_restore_context(screen);
+ glamor_egl_restore_context(screen);
}
-#ifdef GLX_USE_SHARED_DISPATCH
static inline glamor_gl_dispatch *
-glamor_get_dispatch(glamor_screen_private *glamor_priv)
+glamor_get_dispatch(glamor_screen_private * glamor_priv)
{
- if (glamor_priv->flags & GLAMOR_USE_EGL_SCREEN)
- glamor_make_current(glamor_priv->screen);
-
- return &glamor_priv->_dispatch;
-}
+ if (glamor_priv->flags & GLAMOR_USE_EGL_SCREEN)
+ glamor_make_current(glamor_priv->screen);
-static inline void
-glamor_put_dispatch(glamor_screen_private *glamor_priv)
-{
- if (glamor_priv->flags & GLAMOR_USE_EGL_SCREEN)
- glamor_restore_current(glamor_priv->screen);
-}
-#else
-#warning "Indirect GLX may be broken, need to implement context switch."
-static inline glamor_gl_dispatch *
-glamor_get_dispatch(glamor_screen_private *glamor_priv)
-{
- return &glamor_priv->_dispatch;
+ return &glamor_priv->_dispatch;
}
static inline void
-glamor_put_dispatch(glamor_screen_private *glamor_priv)
+glamor_put_dispatch(glamor_screen_private * glamor_priv)
{
+ if (glamor_priv->flags & GLAMOR_USE_EGL_SCREEN)
+ glamor_restore_current(glamor_priv->screen);
}
#endif
-
-#endif
diff --git a/xorg-server/glamor/glamor_window.c b/xorg-server/glamor/glamor_window.c
index b67c72880..60647bf80 100644
--- a/xorg-server/glamor/glamor_window.c
+++ b/xorg-server/glamor/glamor_window.c
@@ -28,76 +28,72 @@
* Screen Change Window Attribute implementation.
*/
-
static void
-glamor_fixup_window_pixmap(DrawablePtr pDrawable, PixmapPtr * ppPixmap)
+glamor_fixup_window_pixmap(DrawablePtr pDrawable, PixmapPtr *ppPixmap)
{
- PixmapPtr pPixmap = *ppPixmap;
- glamor_pixmap_private *pixmap_priv;
+ PixmapPtr pPixmap = *ppPixmap;
+ glamor_pixmap_private *pixmap_priv;
- if (pPixmap->drawable.bitsPerPixel != pDrawable->bitsPerPixel) {
- pixmap_priv = glamor_get_pixmap_private(pPixmap);
- if (!GLAMOR_PIXMAP_PRIV_HAS_FBO(pixmap_priv)) {
- glamor_fallback("pixmap %p has no fbo\n", pPixmap);
- goto fail;
- }
- glamor_debug_output(GLAMOR_DEBUG_UNIMPL,
- "To be implemented.\n");
- }
- return;
+ if (pPixmap->drawable.bitsPerPixel != pDrawable->bitsPerPixel) {
+ pixmap_priv = glamor_get_pixmap_private(pPixmap);
+ if (!GLAMOR_PIXMAP_PRIV_HAS_FBO(pixmap_priv)) {
+ glamor_fallback("pixmap %p has no fbo\n", pPixmap);
+ goto fail;
+ }
+ glamor_debug_output(GLAMOR_DEBUG_UNIMPL, "To be implemented.\n");
+ }
+ return;
- fail:
- GLAMOR_PANIC
- (" We can't fall back to fbFixupWindowPixmap, as the fb24_32ReformatTile"
- " is broken for glamor. \n");
+ fail:
+ GLAMOR_PANIC
+ (" We can't fall back to fbFixupWindowPixmap, as the fb24_32ReformatTile"
+ " is broken for glamor. \n");
}
Bool
glamor_change_window_attributes(WindowPtr pWin, unsigned long mask)
{
- if (mask & CWBackPixmap) {
- if (pWin->backgroundState == BackgroundPixmap)
- glamor_fixup_window_pixmap(&pWin->drawable,
- &pWin->
- background.pixmap);
- }
+ if (mask & CWBackPixmap) {
+ if (pWin->backgroundState == BackgroundPixmap)
+ glamor_fixup_window_pixmap(&pWin->drawable,
+ &pWin->background.pixmap);
+ }
- if (mask & CWBorderPixmap) {
- if (pWin->borderIsPixel == FALSE)
- glamor_fixup_window_pixmap(&pWin->drawable,
- &pWin->border.pixmap);
- }
- return TRUE;
+ if (mask & CWBorderPixmap) {
+ if (pWin->borderIsPixel == FALSE)
+ glamor_fixup_window_pixmap(&pWin->drawable, &pWin->border.pixmap);
+ }
+ return TRUE;
}
void
glamor_set_window_pixmap(WindowPtr win, PixmapPtr pPixmap)
{
- ScreenPtr screen = win->drawable.pScreen;
- glamor_screen_private *glamor_priv =
- glamor_get_screen_private(screen);
- PixmapPtr old = screen->GetWindowPixmap(win);
+ ScreenPtr screen = win->drawable.pScreen;
+ glamor_screen_private *glamor_priv = glamor_get_screen_private(screen);
+ PixmapPtr old = screen->GetWindowPixmap(win);
- if (pPixmap != old) {
- glamor_pixmap_private *pixmap_priv;
- PicturePtr pic = NULL;
+ if (pPixmap != old) {
+ glamor_pixmap_private *pixmap_priv;
+ PicturePtr pic = NULL;
- pixmap_priv = glamor_get_pixmap_private(old);
- if (GLAMOR_PIXMAP_PRIV_IS_PICTURE(pixmap_priv) && pixmap_priv->base.picture->pDrawable == (DrawablePtr)win) {
- pic = pixmap_priv->base.picture;
- pixmap_priv->base.is_picture = 0;
- pixmap_priv->base.picture = NULL;
- }
+ pixmap_priv = glamor_get_pixmap_private(old);
+ if (GLAMOR_PIXMAP_PRIV_IS_PICTURE(pixmap_priv) &&
+ pixmap_priv->base.picture->pDrawable == (DrawablePtr) win) {
+ pic = pixmap_priv->base.picture;
+ pixmap_priv->base.is_picture = 0;
+ pixmap_priv->base.picture = NULL;
+ }
- pixmap_priv = glamor_get_pixmap_private(pPixmap);
- if (pixmap_priv) {
- pixmap_priv->base.is_picture = !!pic;
- pixmap_priv->base.picture = pic;
- }
- }
+ pixmap_priv = glamor_get_pixmap_private(pPixmap);
+ if (pixmap_priv) {
+ pixmap_priv->base.is_picture = ! !pic;
+ pixmap_priv->base.picture = pic;
+ }
+ }
- screen->SetWindowPixmap = glamor_priv->saved_procs.set_window_pixmap;
- (screen->SetWindowPixmap)(win, pPixmap);
- glamor_priv->saved_procs.set_window_pixmap = screen->SetWindowPixmap;
- screen->SetWindowPixmap = glamor_set_window_pixmap;
+ screen->SetWindowPixmap = glamor_priv->saved_procs.set_window_pixmap;
+ (screen->SetWindowPixmap) (win, pPixmap);
+ glamor_priv->saved_procs.set_window_pixmap = screen->SetWindowPixmap;
+ screen->SetWindowPixmap = glamor_set_window_pixmap;
}
diff --git a/xorg-server/glamor/glamor_xv.c b/xorg-server/glamor/glamor_xv.c
index a89b4cd3f..cbe07c8b1 100644
--- a/xorg-server/glamor/glamor_xv.c
+++ b/xorg-server/glamor/glamor_xv.c
@@ -39,15 +39,14 @@
#include <X11/extensions/Xv.h>
#include "fourcc.h"
/* Reference color space transform data */
-typedef struct tagREF_TRANSFORM
-{
- float RefLuma;
- float RefRCb;
- float RefRCr;
- float RefGCb;
- float RefGCr;
- float RefBCb;
- float RefBCr;
+typedef struct tagREF_TRANSFORM {
+ float RefLuma;
+ float RefRCb;
+ float RefRCr;
+ float RefGCb;
+ float RefGCr;
+ float RefBCb;
+ float RefBCr;
} REF_TRANSFORM;
#define RTFSaturation(a) (1.0 + ((a)*1.0)/1000.0)
@@ -56,590 +55,583 @@ typedef struct tagREF_TRANSFORM
#define RTFContrast(a) (1.0 + ((a)*1.0)/1000.0)
#define RTFHue(a) (((a)*3.1416)/1000.0)
-static const char *xv_vs= "attribute vec4 v_position;\n"
- "attribute vec4 v_texcoord0;\n"
- "varying vec2 tcs;\n"
- "void main()\n" "{\n" " gl_Position = v_position;\n"
- "tcs = v_texcoord0.xy;\n"
- "}\n";
+static const char *xv_vs = "attribute vec4 v_position;\n"
+ "attribute vec4 v_texcoord0;\n"
+ "varying vec2 tcs;\n"
+ "void main()\n"
+ "{\n"
+ " gl_Position = v_position;\n"
+ "tcs = v_texcoord0.xy;\n"
+ "}\n";
static const char *xv_ps = GLAMOR_DEFAULT_PRECISION
- "uniform sampler2D y_sampler;\n"
- "uniform sampler2D u_sampler;\n"
- "uniform sampler2D v_sampler;\n"
- "uniform vec4 offsetyco;\n"
- "uniform vec4 ucogamma;\n"
- "uniform vec4 vco;\n"
- "varying vec2 tcs;\n"
- "float sample;\n"
- "vec4 temp1;\n"
- "void main()\n" "{\n"
- "sample = texture2D(y_sampler, tcs).w;\n"
- "temp1.xyz = offsetyco.www * vec3(sample) + offsetyco.xyz;\n"
- "sample = texture2D(u_sampler, tcs).w;\n"
- "temp1.xyz = ucogamma.xyz * vec3(sample) + temp1.xyz;\n"
- "sample = texture2D(v_sampler, tcs).w;\n"
- "temp1.xyz = clamp(vco.xyz * vec3(sample) + temp1.xyz, 0.0, 1.0);\n"
- "temp1.w = 1.0;\n"
- "gl_FragColor = temp1;\n"
- "}\n";
+ "uniform sampler2D y_sampler;\n"
+ "uniform sampler2D u_sampler;\n"
+ "uniform sampler2D v_sampler;\n"
+ "uniform vec4 offsetyco;\n"
+ "uniform vec4 ucogamma;\n"
+ "uniform vec4 vco;\n"
+ "varying vec2 tcs;\n"
+ "float sample;\n"
+ "vec4 temp1;\n"
+ "void main()\n"
+ "{\n"
+ "sample = texture2D(y_sampler, tcs).w;\n"
+ "temp1.xyz = offsetyco.www * vec3(sample) + offsetyco.xyz;\n"
+ "sample = texture2D(u_sampler, tcs).w;\n"
+ "temp1.xyz = ucogamma.xyz * vec3(sample) + temp1.xyz;\n"
+ "sample = texture2D(v_sampler, tcs).w;\n"
+ "temp1.xyz = clamp(vco.xyz * vec3(sample) + temp1.xyz, 0.0, 1.0);\n"
+ "temp1.w = 1.0;\n"
+ "gl_FragColor = temp1;\n"
+ "}\n";
void
glamor_init_xv_shader(ScreenPtr screen)
{
- glamor_screen_private *glamor_priv;
- glamor_gl_dispatch *dispatch;
- GLint fs_prog, vs_prog;
-
- glamor_priv = glamor_get_screen_private(screen);
- dispatch = glamor_get_dispatch(glamor_priv);
- glamor_priv->xv_prog = dispatch->glCreateProgram();
-
- vs_prog = glamor_compile_glsl_prog(dispatch, GL_VERTEX_SHADER, xv_vs);
- fs_prog = glamor_compile_glsl_prog(dispatch, GL_FRAGMENT_SHADER, xv_ps);
- dispatch->glAttachShader(glamor_priv->xv_prog, vs_prog);
- dispatch->glAttachShader(glamor_priv->xv_prog, fs_prog);
-
- dispatch->glBindAttribLocation(glamor_priv->xv_prog,
- GLAMOR_VERTEX_POS, "v_position");
- dispatch->glBindAttribLocation(glamor_priv->xv_prog,
- GLAMOR_VERTEX_SOURCE, "v_texcoord0");
- glamor_link_glsl_prog(dispatch, glamor_priv->xv_prog);
-
- glamor_put_dispatch(glamor_priv);
+ glamor_screen_private *glamor_priv;
+ glamor_gl_dispatch *dispatch;
+ GLint fs_prog, vs_prog;
+
+ glamor_priv = glamor_get_screen_private(screen);
+ dispatch = glamor_get_dispatch(glamor_priv);
+ glamor_priv->xv_prog = dispatch->glCreateProgram();
+
+ vs_prog = glamor_compile_glsl_prog(dispatch, GL_VERTEX_SHADER, xv_vs);
+ fs_prog = glamor_compile_glsl_prog(dispatch, GL_FRAGMENT_SHADER, xv_ps);
+ dispatch->glAttachShader(glamor_priv->xv_prog, vs_prog);
+ dispatch->glAttachShader(glamor_priv->xv_prog, fs_prog);
+
+ dispatch->glBindAttribLocation(glamor_priv->xv_prog,
+ GLAMOR_VERTEX_POS, "v_position");
+ dispatch->glBindAttribLocation(glamor_priv->xv_prog,
+ GLAMOR_VERTEX_SOURCE, "v_texcoord0");
+ glamor_link_glsl_prog(dispatch, glamor_priv->xv_prog);
+
+ glamor_put_dispatch(glamor_priv);
}
void
glamor_fini_xv_shader(ScreenPtr screen)
{
- glamor_screen_private *glamor_priv;
- glamor_gl_dispatch *dispatch;
+ glamor_screen_private *glamor_priv;
+ glamor_gl_dispatch *dispatch;
- glamor_priv = glamor_get_screen_private(screen);
- dispatch = glamor_get_dispatch(glamor_priv);
+ glamor_priv = glamor_get_screen_private(screen);
+ dispatch = glamor_get_dispatch(glamor_priv);
- dispatch->glDeleteProgram(glamor_priv->xv_prog);
- glamor_put_dispatch(glamor_priv);
+ dispatch->glDeleteProgram(glamor_priv->xv_prog);
+ glamor_put_dispatch(glamor_priv);
}
#define ClipValue(v,min,max) ((v) < (min) ? (min) : (v) > (max) ? (max) : (v))
#define MAKE_ATOM(a) MakeAtom(a, sizeof(a) - 1, TRUE)
-static Atom xvBrightness, xvContrast, xvSaturation, xvHue, xvColorspace, xvGamma;
+static Atom xvBrightness, xvContrast, xvSaturation, xvHue, xvColorspace,
+ xvGamma;
#define NUM_ATTRIBUTES 5
-static XF86AttributeRec Attributes_glamor[NUM_ATTRIBUTES+1] =
-{
+static XF86AttributeRec Attributes_glamor[NUM_ATTRIBUTES + 1] = {
{XvSettable | XvGettable, -1000, 1000, "XV_BRIGHTNESS"},
{XvSettable | XvGettable, -1000, 1000, "XV_CONTRAST"},
{XvSettable | XvGettable, -1000, 1000, "XV_SATURATION"},
{XvSettable | XvGettable, -1000, 1000, "XV_HUE"},
{XvSettable | XvGettable, 0, 1, "XV_COLORSPACE"},
{0, 0, 0, NULL}
- };
+};
#define NUM_FORMATS 3
-static XF86VideoFormatRec Formats[NUM_FORMATS] =
-{
+static XF86VideoFormatRec Formats[NUM_FORMATS] = {
{15, TrueColor}, {16, TrueColor}, {24, TrueColor}
- };
+};
#define NUM_IMAGES 2
-static XF86ImageRec Images[NUM_IMAGES] =
-{
-XVIMAGE_YV12,
- XVIMAGE_I420,
- };
+static XF86ImageRec Images[NUM_IMAGES] = {
+ XVIMAGE_YV12,
+ XVIMAGE_I420,
+};
static void
-glamor_xv_stop_video(ScrnInfoPtr pScrn, pointer data, Bool cleanup)
+glamor_xv_stop_video(ScrnInfoPtr pScrn, void *data, Bool cleanup)
{
-glamor_port_private *port_priv = (glamor_port_private *)data;
-int i;
-if (!cleanup)
- return;
-
-for (i = 0; i < 3; i++) {
-if (port_priv->src_pix[i]) {
-glamor_destroy_pixmap(port_priv->src_pix[i]);
-port_priv->src_pix[i] = NULL;
-}
-}
+ glamor_port_private *port_priv = (glamor_port_private *) data;
+ int i;
+
+ if (!cleanup)
+ return;
+
+ for (i = 0; i < 3; i++) {
+ if (port_priv->src_pix[i]) {
+ glamor_destroy_pixmap(port_priv->src_pix[i]);
+ port_priv->src_pix[i] = NULL;
+ }
+ }
}
static int
-glamor_xv_set_port_attribute(ScrnInfoPtr pScrn,
- Atom attribute,
- INT32 value,
- pointer data)
+glamor_xv_set_port_attribute(ScrnInfoPtr pScrn,
+ Atom attribute, INT32 value, void *data)
{
-glamor_port_private *port_priv = (glamor_port_private *)data;
-if (attribute == xvBrightness)
- port_priv->brightness = ClipValue(value, -1000, 1000);
-else if (attribute == xvHue)
- port_priv->hue = ClipValue(value, -1000, 1000);
-else if (attribute == xvContrast)
- port_priv->contrast = ClipValue(value, -1000, 1000);
-else if (attribute == xvSaturation)
- port_priv->saturation = ClipValue(value, -1000, 1000);
-else if (attribute == xvGamma)
- port_priv->gamma = ClipValue (value, 100, 10000);
-else if(attribute == xvColorspace)
- port_priv->transform_index = ClipValue (value, 0, 1);
-else
- return BadMatch;
-return Success;
+ glamor_port_private *port_priv = (glamor_port_private *) data;
+
+ if (attribute == xvBrightness)
+ port_priv->brightness = ClipValue(value, -1000, 1000);
+ else if (attribute == xvHue)
+ port_priv->hue = ClipValue(value, -1000, 1000);
+ else if (attribute == xvContrast)
+ port_priv->contrast = ClipValue(value, -1000, 1000);
+ else if (attribute == xvSaturation)
+ port_priv->saturation = ClipValue(value, -1000, 1000);
+ else if (attribute == xvGamma)
+ port_priv->gamma = ClipValue(value, 100, 10000);
+ else if (attribute == xvColorspace)
+ port_priv->transform_index = ClipValue(value, 0, 1);
+ else
+ return BadMatch;
+ return Success;
}
static int
-glamor_xv_get_port_attribute(ScrnInfoPtr pScrn,
- Atom attribute,
- INT32 *value,
- pointer data)
+glamor_xv_get_port_attribute(ScrnInfoPtr pScrn,
+ Atom attribute, INT32 *value, void *data)
{
-glamor_port_private *port_priv = (glamor_port_private *)data;
-if (attribute == xvBrightness)
- *value = port_priv->brightness;
-else if (attribute == xvHue)
- *value = port_priv->hue;
-else if (attribute == xvContrast)
- *value = port_priv->contrast;
-else if (attribute == xvSaturation)
- *value = port_priv->saturation;
-else if (attribute == xvGamma)
- *value = port_priv->gamma;
-else if(attribute == xvColorspace)
- *value = port_priv->transform_index;
-else
- return BadMatch;
-
-return Success;
+ glamor_port_private *port_priv = (glamor_port_private *) data;
+
+ if (attribute == xvBrightness)
+ *value = port_priv->brightness;
+ else if (attribute == xvHue)
+ *value = port_priv->hue;
+ else if (attribute == xvContrast)
+ *value = port_priv->contrast;
+ else if (attribute == xvSaturation)
+ *value = port_priv->saturation;
+ else if (attribute == xvGamma)
+ *value = port_priv->gamma;
+ else if (attribute == xvColorspace)
+ *value = port_priv->transform_index;
+ else
+ return BadMatch;
+
+ return Success;
}
static void
glamor_xv_query_best_size(ScrnInfoPtr pScrn,
- Bool motion,
- short vid_w, short vid_h,
- short drw_w, short drw_h,
- unsigned int *p_w, unsigned int *p_h,
- pointer data)
+ Bool motion,
+ short vid_w, short vid_h,
+ short drw_w, short drw_h,
+ unsigned int *p_w, unsigned int *p_h, void *data)
{
-*p_w = drw_w;
-*p_h = drw_h;
+ *p_w = drw_w;
+ *p_h = drw_h;
}
static int
glamor_xv_query_image_attributes(ScrnInfoPtr pScrn,
- int id,
- unsigned short *w, unsigned short *h,
- int *pitches, int *offsets)
+ int id,
+ unsigned short *w, unsigned short *h,
+ int *pitches, int *offsets)
{
-int size = 0, tmp;
-
-if (offsets) offsets[0] = 0;
-switch (id) {
-case FOURCC_YV12:
-case FOURCC_I420:
-*h = *h;
-*w = *w;
-size = *w;
-if (pitches) pitches[0] = size;
-size *= *h;
-if (offsets) offsets[1] = size;
-tmp = *w >> 1;
-if (pitches) pitches[1] = pitches[2] = tmp;
-tmp *= (*h >> 1);
-size += tmp;
-if (offsets) offsets[2] = size;
-size += tmp;
-break;
-}
-return size;
+ int size = 0, tmp;
+
+ if (offsets)
+ offsets[0] = 0;
+ switch (id) {
+ case FOURCC_YV12:
+ case FOURCC_I420:
+ *h = *h;
+ *w = *w;
+ size = *w;
+ if (pitches)
+ pitches[0] = size;
+ size *= *h;
+ if (offsets)
+ offsets[1] = size;
+ tmp = *w >> 1;
+ if (pitches)
+ pitches[1] = pitches[2] = tmp;
+ tmp *= (*h >> 1);
+ size += tmp;
+ if (offsets)
+ offsets[2] = size;
+ size += tmp;
+ break;
+ }
+ return size;
}
+
/* Parameters for ITU-R BT.601 and ITU-R BT.709 colour spaces
note the difference to the parameters used in overlay are due
to 10bit vs. float calcs */
-static REF_TRANSFORM trans[2] =
-{
- {1.1643, 0.0, 1.5960, -0.3918, -0.8129, 2.0172, 0.0}, /* BT.601 */
- {1.1643, 0.0, 1.7927, -0.2132, -0.5329, 2.1124, 0.0} /* BT.709 */
- };
+static REF_TRANSFORM trans[2] = {
+ {1.1643, 0.0, 1.5960, -0.3918, -0.8129, 2.0172, 0.0}, /* BT.601 */
+ {1.1643, 0.0, 1.7927, -0.2132, -0.5329, 2.1124, 0.0} /* BT.709 */
+};
static void
glamor_display_textured_video(glamor_port_private *port_priv)
{
-ScreenPtr screen = port_priv->pPixmap->drawable.pScreen;
-glamor_screen_private *glamor_priv =
- glamor_get_screen_private(screen);
-glamor_pixmap_private *pixmap_priv =
- glamor_get_pixmap_private(port_priv->pPixmap);
-glamor_pixmap_private *src_pixmap_priv[3];
-glamor_gl_dispatch *dispatch;
-float vertices[32], texcoords[8];
-BoxPtr box = REGION_RECTS(&port_priv->clip);
-int nBox = REGION_NUM_RECTS(&port_priv->clip);
-int dst_x_off, dst_y_off;
-GLfloat dst_xscale, dst_yscale;
-GLfloat src_xscale[3], src_yscale[3];
-int i;
-const float Loff = -0.0627;
-const float Coff = -0.502;
-float uvcosf, uvsinf;
-float yco;
-float uco[3], vco[3], off[3];
-float bright, cont, gamma;
-int ref = port_priv->transform_index;
-GLint uloc, sampler_loc;
-
-cont = RTFContrast(port_priv->contrast);
-bright = RTFBrightness(port_priv->brightness);
-gamma = (float)port_priv->gamma / 1000.0;
-uvcosf = RTFSaturation(port_priv->saturation) * cos(RTFHue(port_priv->hue));
-uvsinf = RTFSaturation(port_priv->saturation) * sin(RTFHue(port_priv->hue));
+ ScreenPtr screen = port_priv->pPixmap->drawable.pScreen;
+ glamor_screen_private *glamor_priv = glamor_get_screen_private(screen);
+ glamor_pixmap_private *pixmap_priv =
+ glamor_get_pixmap_private(port_priv->pPixmap);
+ glamor_pixmap_private *src_pixmap_priv[3];
+ glamor_gl_dispatch *dispatch;
+ float vertices[32], texcoords[8];
+ BoxPtr box = REGION_RECTS(&port_priv->clip);
+ int nBox = REGION_NUM_RECTS(&port_priv->clip);
+ int dst_x_off, dst_y_off;
+ GLfloat dst_xscale, dst_yscale;
+ GLfloat src_xscale[3], src_yscale[3];
+ int i;
+ const float Loff = -0.0627;
+ const float Coff = -0.502;
+ float uvcosf, uvsinf;
+ float yco;
+ float uco[3], vco[3], off[3];
+ float bright, cont, gamma;
+ int ref = port_priv->transform_index;
+ GLint uloc, sampler_loc;
+
+ cont = RTFContrast(port_priv->contrast);
+ bright = RTFBrightness(port_priv->brightness);
+ gamma = (float) port_priv->gamma / 1000.0;
+ uvcosf = RTFSaturation(port_priv->saturation) * cos(RTFHue(port_priv->hue));
+ uvsinf = RTFSaturation(port_priv->saturation) * sin(RTFHue(port_priv->hue));
/* overlay video also does pre-gamma contrast/sat adjust, should we? */
-yco = trans[ref].RefLuma * cont;
-uco[0] = -trans[ref].RefRCr * uvsinf;
-uco[1] = trans[ref].RefGCb * uvcosf - trans[ref].RefGCr * uvsinf;
-uco[2] = trans[ref].RefBCb * uvcosf;
-vco[0] = trans[ref].RefRCr * uvcosf;
-vco[1] = trans[ref].RefGCb * uvsinf + trans[ref].RefGCr * uvcosf;
-vco[2] = trans[ref].RefBCb * uvsinf;
-off[0] = Loff * yco + Coff * (uco[0] + vco[0]) + bright;
-off[1] = Loff * yco + Coff * (uco[1] + vco[1]) + bright;
-off[2] = Loff * yco + Coff * (uco[2] + vco[2]) + bright;
-gamma = 1.0;
-
-pixmap_priv_get_dest_scale(pixmap_priv, &dst_xscale, &dst_yscale);
-glamor_get_drawable_deltas(port_priv->pDraw, port_priv->pPixmap, &dst_x_off,
- &dst_y_off);
-glamor_set_destination_pixmap_priv_nc(pixmap_priv);
-
-for (i = 0; i < 3; i++) {
-if (port_priv->src_pix[i]) {
-src_pixmap_priv[i] = glamor_get_pixmap_private(port_priv->src_pix[i]);
-pixmap_priv_get_scale(src_pixmap_priv[i], &src_xscale[i], &src_yscale[i]);
-}
-}
-dispatch = glamor_get_dispatch(glamor_priv);
-dispatch->glUseProgram(glamor_priv->xv_prog);
-
-uloc = dispatch->glGetUniformLocation(glamor_priv->xv_prog, "offsetyco");
-dispatch->glUniform4f(uloc, off[0], off[1], off[2], yco);
-uloc = dispatch->glGetUniformLocation(glamor_priv->xv_prog, "ucogamma");
-dispatch->glUniform4f(uloc, uco[0], uco[1], uco[2], gamma);
-uloc = dispatch->glGetUniformLocation(glamor_priv->xv_prog, "vco");
-dispatch->glUniform4f(uloc, vco[0], vco[1], vco[2], 0);
-
-dispatch->glActiveTexture(GL_TEXTURE0);
-dispatch->glBindTexture(GL_TEXTURE_2D, src_pixmap_priv[0]->base.fbo->tex);
-dispatch->glTexParameteri(GL_TEXTURE_2D,
- GL_TEXTURE_MIN_FILTER,
- GL_LINEAR);
-dispatch->glTexParameteri(GL_TEXTURE_2D,
- GL_TEXTURE_MAG_FILTER,
- GL_LINEAR);
-dispatch->glTexParameteri(GL_TEXTURE_2D,
- GL_TEXTURE_WRAP_S,
- GL_CLAMP_TO_EDGE);
-dispatch->glTexParameteri(GL_TEXTURE_2D,
- GL_TEXTURE_WRAP_T,
- GL_CLAMP_TO_EDGE);
-
-dispatch->glActiveTexture(GL_TEXTURE1);
-dispatch->glBindTexture(GL_TEXTURE_2D, src_pixmap_priv[1]->base.fbo->tex);
-dispatch->glTexParameteri(GL_TEXTURE_2D,
- GL_TEXTURE_MIN_FILTER,
- GL_LINEAR);
-dispatch->glTexParameteri(GL_TEXTURE_2D,
- GL_TEXTURE_MAG_FILTER,
- GL_LINEAR);
-dispatch->glTexParameteri(GL_TEXTURE_2D,
- GL_TEXTURE_WRAP_S,
- GL_CLAMP_TO_EDGE);
-dispatch->glTexParameteri(GL_TEXTURE_2D,
- GL_TEXTURE_WRAP_T,
- GL_CLAMP_TO_EDGE);
-
-dispatch->glActiveTexture(GL_TEXTURE2);
-dispatch->glBindTexture(GL_TEXTURE_2D, src_pixmap_priv[2]->base.fbo->tex);
-dispatch->glTexParameteri(GL_TEXTURE_2D,
- GL_TEXTURE_MIN_FILTER,
- GL_LINEAR);
-dispatch->glTexParameteri(GL_TEXTURE_2D,
- GL_TEXTURE_MAG_FILTER,
- GL_LINEAR);
-dispatch->glTexParameteri(GL_TEXTURE_2D,
- GL_TEXTURE_WRAP_S,
- GL_CLAMP_TO_EDGE);
-dispatch->glTexParameteri(GL_TEXTURE_2D,
- GL_TEXTURE_WRAP_T,
- GL_CLAMP_TO_EDGE);
-
-sampler_loc = dispatch->glGetUniformLocation(glamor_priv->xv_prog, "y_sampler");
-dispatch->glUniform1i(sampler_loc, 0);
-sampler_loc = dispatch->glGetUniformLocation(glamor_priv->xv_prog, "u_sampler");
-dispatch->glUniform1i(sampler_loc, 1);
-sampler_loc = dispatch->glGetUniformLocation(glamor_priv->xv_prog, "v_sampler");
-dispatch->glUniform1i(sampler_loc, 2);
-
-dispatch->glVertexAttribPointer(GLAMOR_VERTEX_SOURCE, 2,
- GL_FLOAT, GL_FALSE,
- 2 * sizeof(float),
- texcoords);
-dispatch->glEnableVertexAttribArray(GLAMOR_VERTEX_SOURCE);
-
-dispatch->glVertexAttribPointer(GLAMOR_VERTEX_POS, 2, GL_FLOAT,
- GL_FALSE, 2 * sizeof(float),
- vertices);
-
-dispatch->glEnableVertexAttribArray(GLAMOR_VERTEX_POS);
-for (i = 0; i < nBox; i++) {
-float off_x = box[i].x1 - port_priv->drw_x;
-float off_y = box[i].y1 - port_priv->drw_y;
-float diff_x = (float)port_priv->src_w / (float)port_priv->dst_w;
-float diff_y = (float)port_priv->src_h / (float)port_priv->dst_h;
-float srcx, srcy, srcw, srch;
-int dstx, dsty, dstw, dsth;
-
-
-dstx = box[i].x1 + dst_x_off;
-dsty = box[i].y1 + dst_y_off;
-dstw = box[i].x2 - box[i].x1;
-dsth = box[i].y2 - box[i].y1;
-
-srcx = port_priv->src_x + off_x * diff_x;
-srcy = port_priv->src_y + off_y * diff_y;
-srcw = (port_priv->src_w * dstw) / (float)port_priv->dst_w;
-srch = (port_priv->src_h * dsth) / (float)port_priv->dst_h;
-
-glamor_set_normalize_vcoords(pixmap_priv,
- dst_xscale, dst_yscale,
- dstx,
- dsty,
- dstx + dstw,
- dsty + dsth,
- glamor_priv->yInverted,
- vertices);
-
-glamor_set_normalize_tcoords(src_pixmap_priv[0],
- src_xscale[0],
- src_yscale[0],
- srcx,
- srcy,
- srcx + srcw,
- srcy + srch,
- glamor_priv->yInverted,
- texcoords);
-
-dispatch->glDrawArrays(GL_TRIANGLE_FAN, 0, 4);
-}
-
-dispatch->glDisableVertexAttribArray(GLAMOR_VERTEX_POS);
-dispatch->glDisableVertexAttribArray(GLAMOR_VERTEX_SOURCE);
-
-dispatch->glUseProgram(0);
-glamor_put_dispatch(glamor_priv);
-DamageDamageRegion(port_priv->pDraw, &port_priv->clip);
+ yco = trans[ref].RefLuma * cont;
+ uco[0] = -trans[ref].RefRCr * uvsinf;
+ uco[1] = trans[ref].RefGCb * uvcosf - trans[ref].RefGCr * uvsinf;
+ uco[2] = trans[ref].RefBCb * uvcosf;
+ vco[0] = trans[ref].RefRCr * uvcosf;
+ vco[1] = trans[ref].RefGCb * uvsinf + trans[ref].RefGCr * uvcosf;
+ vco[2] = trans[ref].RefBCb * uvsinf;
+ off[0] = Loff * yco + Coff * (uco[0] + vco[0]) + bright;
+ off[1] = Loff * yco + Coff * (uco[1] + vco[1]) + bright;
+ off[2] = Loff * yco + Coff * (uco[2] + vco[2]) + bright;
+ gamma = 1.0;
+
+ pixmap_priv_get_dest_scale(pixmap_priv, &dst_xscale, &dst_yscale);
+ glamor_get_drawable_deltas(port_priv->pDraw, port_priv->pPixmap, &dst_x_off,
+ &dst_y_off);
+ glamor_set_destination_pixmap_priv_nc(pixmap_priv);
+
+ for (i = 0; i < 3; i++) {
+ if (port_priv->src_pix[i]) {
+ src_pixmap_priv[i] =
+ glamor_get_pixmap_private(port_priv->src_pix[i]);
+ pixmap_priv_get_scale(src_pixmap_priv[i], &src_xscale[i],
+ &src_yscale[i]);
+ }
+ }
+ dispatch = glamor_get_dispatch(glamor_priv);
+ dispatch->glUseProgram(glamor_priv->xv_prog);
+
+ uloc = dispatch->glGetUniformLocation(glamor_priv->xv_prog, "offsetyco");
+ dispatch->glUniform4f(uloc, off[0], off[1], off[2], yco);
+ uloc = dispatch->glGetUniformLocation(glamor_priv->xv_prog, "ucogamma");
+ dispatch->glUniform4f(uloc, uco[0], uco[1], uco[2], gamma);
+ uloc = dispatch->glGetUniformLocation(glamor_priv->xv_prog, "vco");
+ dispatch->glUniform4f(uloc, vco[0], vco[1], vco[2], 0);
+
+ dispatch->glActiveTexture(GL_TEXTURE0);
+ dispatch->glBindTexture(GL_TEXTURE_2D, src_pixmap_priv[0]->base.fbo->tex);
+ dispatch->glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
+ dispatch->glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
+ dispatch->glTexParameteri(GL_TEXTURE_2D,
+ GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE);
+ dispatch->glTexParameteri(GL_TEXTURE_2D,
+ GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE);
+
+ dispatch->glActiveTexture(GL_TEXTURE1);
+ dispatch->glBindTexture(GL_TEXTURE_2D, src_pixmap_priv[1]->base.fbo->tex);
+ dispatch->glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
+ dispatch->glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
+ dispatch->glTexParameteri(GL_TEXTURE_2D,
+ GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE);
+ dispatch->glTexParameteri(GL_TEXTURE_2D,
+ GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE);
+
+ dispatch->glActiveTexture(GL_TEXTURE2);
+ dispatch->glBindTexture(GL_TEXTURE_2D, src_pixmap_priv[2]->base.fbo->tex);
+ dispatch->glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
+ dispatch->glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
+ dispatch->glTexParameteri(GL_TEXTURE_2D,
+ GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE);
+ dispatch->glTexParameteri(GL_TEXTURE_2D,
+ GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE);
+
+ sampler_loc =
+ dispatch->glGetUniformLocation(glamor_priv->xv_prog, "y_sampler");
+ dispatch->glUniform1i(sampler_loc, 0);
+ sampler_loc =
+ dispatch->glGetUniformLocation(glamor_priv->xv_prog, "u_sampler");
+ dispatch->glUniform1i(sampler_loc, 1);
+ sampler_loc =
+ dispatch->glGetUniformLocation(glamor_priv->xv_prog, "v_sampler");
+ dispatch->glUniform1i(sampler_loc, 2);
+
+ dispatch->glVertexAttribPointer(GLAMOR_VERTEX_SOURCE, 2,
+ GL_FLOAT, GL_FALSE,
+ 2 * sizeof(float), texcoords);
+ dispatch->glEnableVertexAttribArray(GLAMOR_VERTEX_SOURCE);
+
+ dispatch->glVertexAttribPointer(GLAMOR_VERTEX_POS, 2, GL_FLOAT,
+ GL_FALSE, 2 * sizeof(float), vertices);
+
+ dispatch->glEnableVertexAttribArray(GLAMOR_VERTEX_POS);
+ for (i = 0; i < nBox; i++) {
+ float off_x = box[i].x1 - port_priv->drw_x;
+ float off_y = box[i].y1 - port_priv->drw_y;
+ float diff_x = (float) port_priv->src_w / (float) port_priv->dst_w;
+ float diff_y = (float) port_priv->src_h / (float) port_priv->dst_h;
+ float srcx, srcy, srcw, srch;
+ int dstx, dsty, dstw, dsth;
+
+ dstx = box[i].x1 + dst_x_off;
+ dsty = box[i].y1 + dst_y_off;
+ dstw = box[i].x2 - box[i].x1;
+ dsth = box[i].y2 - box[i].y1;
+
+ srcx = port_priv->src_x + off_x * diff_x;
+ srcy = port_priv->src_y + off_y * diff_y;
+ srcw = (port_priv->src_w * dstw) / (float) port_priv->dst_w;
+ srch = (port_priv->src_h * dsth) / (float) port_priv->dst_h;
+
+ glamor_set_normalize_vcoords(pixmap_priv,
+ dst_xscale, dst_yscale,
+ dstx,
+ dsty,
+ dstx + dstw,
+ dsty + dsth,
+ glamor_priv->yInverted, vertices);
+
+ glamor_set_normalize_tcoords(src_pixmap_priv[0],
+ src_xscale[0],
+ src_yscale[0],
+ srcx,
+ srcy,
+ srcx + srcw,
+ srcy + srch,
+ glamor_priv->yInverted, texcoords);
+
+ dispatch->glDrawArrays(GL_TRIANGLE_FAN, 0, 4);
+ }
+
+ dispatch->glDisableVertexAttribArray(GLAMOR_VERTEX_POS);
+ dispatch->glDisableVertexAttribArray(GLAMOR_VERTEX_SOURCE);
+
+ dispatch->glUseProgram(0);
+ glamor_put_dispatch(glamor_priv);
+ DamageDamageRegion(port_priv->pDraw, &port_priv->clip);
}
-static int glamor_xv_put_image(ScrnInfoPtr pScrn,
- short src_x, short src_y,
- short drw_x, short drw_y,
- short src_w, short src_h,
- short drw_w, short drw_h,
- int id,
- unsigned char *buf,
- short width,
- short height,
- Bool sync,
- RegionPtr clipBoxes,
- pointer data,
- DrawablePtr pDrawable)
+static int
+glamor_xv_put_image(ScrnInfoPtr pScrn,
+ short src_x, short src_y,
+ short drw_x, short drw_y,
+ short src_w, short src_h,
+ short drw_w, short drw_h,
+ int id,
+ unsigned char *buf,
+ short width,
+ short height,
+ Bool sync,
+ RegionPtr clipBoxes, void *data, DrawablePtr pDrawable)
{
- ScreenPtr screen = xf86ScrnToScreen(pScrn);
- glamor_port_private *port_priv = (glamor_port_private *)data;
- INT32 x1, x2, y1, y2;
- int srcPitch, srcPitch2;
- BoxRec dstBox;
- int top, nlines;
- int s2offset, s3offset, tmp;
-
- s2offset = s3offset = srcPitch2 = 0;
-
- /* Clip */
- x1 = src_x;
- x2 = src_x + src_w;
- y1 = src_y;
- y2 = src_y + src_h;
-
- dstBox.x1 = drw_x;
- dstBox.x2 = drw_x + drw_w;
- dstBox.y1 = drw_y;
- dstBox.y2 = drw_y + drw_h;
- if (!xf86XVClipVideoHelper(&dstBox, &x1, &x2, &y1, &y2, clipBoxes, width, height))
- return Success;
-
- if ((x1 >= x2) || (y1 >= y2))
- return Success;
-
- srcPitch = width;
- srcPitch2 = width >> 1;
-
- if (!port_priv->src_pix[0] || (width != port_priv->src_pix_w || height != port_priv->src_pix_h)) {
- int i;
- for (i = 0; i < 3; i++)
- if (port_priv->src_pix[i])
- glamor_destroy_pixmap(port_priv->src_pix[i]);
-
- port_priv->src_pix[0] = glamor_create_pixmap(screen, width, height, 8, 0);
- port_priv->src_pix[1] = glamor_create_pixmap(screen, width >> 1, height >> 1, 8, 0);
- port_priv->src_pix[2] = glamor_create_pixmap(screen, width >> 1, height >> 1, 8, 0);
- port_priv->src_pix_w = width;
- port_priv->src_pix_h = height;
-
- if (!port_priv->src_pix[0] || !port_priv->src_pix[1] || !port_priv->src_pix[2])
- return BadAlloc;
- }
-
- top = (y1 >> 16) & ~1;
- nlines = ((y2 + 0xffff) >> 16) - top;
-
- switch (id) {
- case FOURCC_YV12:
- case FOURCC_I420:
- s2offset = srcPitch * height;
- s3offset = s2offset + (srcPitch2 * ((height + 1) >> 1));
- s2offset += ((top >> 1) * srcPitch2);
- s3offset += ((top >> 1) * srcPitch2);
- if (id == FOURCC_YV12) {
- tmp = s2offset;
- s2offset = s3offset;
- s3offset = tmp;
- }
- glamor_upload_sub_pixmap_to_texture(port_priv->src_pix[0],
- 0, 0, srcPitch, nlines,
- port_priv->src_pix[0]->devKind,
- buf + (top * srcPitch), 0);
-
- glamor_upload_sub_pixmap_to_texture(port_priv->src_pix[1],
- 0, 0, srcPitch2, (nlines + 1) >> 1,
- port_priv->src_pix[1]->devKind,
- buf + s2offset, 0);
-
- glamor_upload_sub_pixmap_to_texture(port_priv->src_pix[2],
- 0, 0, srcPitch2, (nlines + 1) >> 1,
- port_priv->src_pix[2]->devKind,
- buf + s3offset, 0);
- break;
- default:
- return BadMatch;
- }
-
- if (pDrawable->type == DRAWABLE_WINDOW)
- port_priv->pPixmap = (*screen->GetWindowPixmap)((WindowPtr)pDrawable);
- else
- port_priv->pPixmap = (PixmapPtr)pDrawable;
-
- if (!RegionEqual(&port_priv->clip, clipBoxes)) {
- RegionCopy(&port_priv->clip, clipBoxes);
- }
-
- port_priv->src_x = src_x;
- port_priv->src_y = src_y;
- port_priv->src_w = src_w;
- port_priv->src_h = src_h;
- port_priv->dst_w = drw_w;
- port_priv->dst_h = drw_h;
- port_priv->drw_x = drw_x;
- port_priv->drw_y = drw_y;
- port_priv->w = width;
- port_priv->h = height;
- port_priv->pDraw = pDrawable;
- glamor_display_textured_video(port_priv);
- return Success;
+ ScreenPtr screen = xf86ScrnToScreen(pScrn);
+ glamor_port_private *port_priv = (glamor_port_private *) data;
+ INT32 x1, x2, y1, y2;
+ int srcPitch, srcPitch2;
+ BoxRec dstBox;
+ int top, nlines;
+ int s2offset, s3offset, tmp;
+
+ s2offset = s3offset = srcPitch2 = 0;
+
+ /* Clip */
+ x1 = src_x;
+ x2 = src_x + src_w;
+ y1 = src_y;
+ y2 = src_y + src_h;
+
+ dstBox.x1 = drw_x;
+ dstBox.x2 = drw_x + drw_w;
+ dstBox.y1 = drw_y;
+ dstBox.y2 = drw_y + drw_h;
+ if (!xf86XVClipVideoHelper
+ (&dstBox, &x1, &x2, &y1, &y2, clipBoxes, width, height))
+ return Success;
+
+ if ((x1 >= x2) || (y1 >= y2))
+ return Success;
+
+ srcPitch = width;
+ srcPitch2 = width >> 1;
+
+ if (!port_priv->src_pix[0] ||
+ (width != port_priv->src_pix_w || height != port_priv->src_pix_h)) {
+ int i;
+
+ for (i = 0; i < 3; i++)
+ if (port_priv->src_pix[i])
+ glamor_destroy_pixmap(port_priv->src_pix[i]);
+
+ port_priv->src_pix[0] =
+ glamor_create_pixmap(screen, width, height, 8, 0);
+ port_priv->src_pix[1] =
+ glamor_create_pixmap(screen, width >> 1, height >> 1, 8, 0);
+ port_priv->src_pix[2] =
+ glamor_create_pixmap(screen, width >> 1, height >> 1, 8, 0);
+ port_priv->src_pix_w = width;
+ port_priv->src_pix_h = height;
+
+ if (!port_priv->src_pix[0] || !port_priv->src_pix[1] ||
+ !port_priv->src_pix[2])
+ return BadAlloc;
+ }
+
+ top = (y1 >> 16) & ~1;
+ nlines = ((y2 + 0xffff) >> 16) - top;
+
+ switch (id) {
+ case FOURCC_YV12:
+ case FOURCC_I420:
+ s2offset = srcPitch * height;
+ s3offset = s2offset + (srcPitch2 * ((height + 1) >> 1));
+ s2offset += ((top >> 1) * srcPitch2);
+ s3offset += ((top >> 1) * srcPitch2);
+ if (id == FOURCC_YV12) {
+ tmp = s2offset;
+ s2offset = s3offset;
+ s3offset = tmp;
+ }
+ glamor_upload_sub_pixmap_to_texture(port_priv->src_pix[0],
+ 0, 0, srcPitch, nlines,
+ port_priv->src_pix[0]->devKind,
+ buf + (top * srcPitch), 0);
+
+ glamor_upload_sub_pixmap_to_texture(port_priv->src_pix[1],
+ 0, 0, srcPitch2, (nlines + 1) >> 1,
+ port_priv->src_pix[1]->devKind,
+ buf + s2offset, 0);
+
+ glamor_upload_sub_pixmap_to_texture(port_priv->src_pix[2],
+ 0, 0, srcPitch2, (nlines + 1) >> 1,
+ port_priv->src_pix[2]->devKind,
+ buf + s3offset, 0);
+ break;
+ default:
+ return BadMatch;
+ }
+
+ if (pDrawable->type == DRAWABLE_WINDOW)
+ port_priv->pPixmap = (*screen->GetWindowPixmap) ((WindowPtr) pDrawable);
+ else
+ port_priv->pPixmap = (PixmapPtr) pDrawable;
+
+ if (!RegionEqual(&port_priv->clip, clipBoxes)) {
+ RegionCopy(&port_priv->clip, clipBoxes);
+ }
+
+ port_priv->src_x = src_x;
+ port_priv->src_y = src_y;
+ port_priv->src_w = src_w;
+ port_priv->src_h = src_h;
+ port_priv->dst_w = drw_w;
+ port_priv->dst_h = drw_h;
+ port_priv->drw_x = drw_x;
+ port_priv->drw_y = drw_y;
+ port_priv->w = width;
+ port_priv->h = height;
+ port_priv->pDraw = pDrawable;
+ glamor_display_textured_video(port_priv);
+ return Success;
}
-static XF86VideoEncodingRec DummyEncodingGLAMOR[1] =
-{
- {
- 0,
- "XV_IMAGE",
- 8192, 8192,
- {1, 1}
- }
+static XF86VideoEncodingRec DummyEncodingGLAMOR[1] = {
+ {
+ 0,
+ "XV_IMAGE",
+ 8192, 8192,
+ {1, 1}
+ }
};
XF86VideoAdaptorPtr
glamor_xv_init(ScreenPtr screen, int num_texture_ports)
{
- glamor_port_private *port_priv;
- XF86VideoAdaptorPtr adapt;
- int i;
-
- adapt = calloc(1, sizeof(XF86VideoAdaptorRec) + num_texture_ports *
- (sizeof(glamor_port_private) + sizeof(DevUnion)));
- if (adapt == NULL)
- return NULL;
-
- xvBrightness = MAKE_ATOM("XV_BRIGHTNESS");
- xvContrast = MAKE_ATOM("XV_CONTRAST");
- xvSaturation = MAKE_ATOM("XV_SATURATION");
- xvHue = MAKE_ATOM("XV_HUE");
- xvGamma = MAKE_ATOM("XV_GAMMA");
- xvColorspace = MAKE_ATOM("XV_COLORSPACE");
-
- adapt->type = XvWindowMask | XvInputMask | XvImageMask;
- adapt->flags = 0;
- adapt->name = "GLAMOR Textured Video";
- adapt->nEncodings = 1;
- adapt->pEncodings = DummyEncodingGLAMOR;
-
- adapt->nFormats = NUM_FORMATS;
- adapt->pFormats = Formats;
- adapt->nPorts = num_texture_ports;
- adapt->pPortPrivates = (DevUnion*)(&adapt[1]);
-
- adapt->pAttributes = Attributes_glamor;
- adapt->nAttributes = NUM_ATTRIBUTES;
-
- port_priv = (glamor_port_private *)(&adapt->pPortPrivates[num_texture_ports]);
- adapt->pImages = Images;
- adapt->nImages = NUM_IMAGES;
- adapt->PutVideo = NULL;
- adapt->PutStill = NULL;
- adapt->GetVideo = NULL;
- adapt->GetStill = NULL;
- adapt->StopVideo = glamor_xv_stop_video;
- adapt->SetPortAttribute = glamor_xv_set_port_attribute;
- adapt->GetPortAttribute = glamor_xv_get_port_attribute;
- adapt->QueryBestSize = glamor_xv_query_best_size;
- adapt->PutImage = glamor_xv_put_image;
- adapt->ReputImage = NULL;
- adapt->QueryImageAttributes = glamor_xv_query_image_attributes;
-
- for (i = 0; i < num_texture_ports; i++) {
- glamor_port_private *pPriv = &port_priv[i];
-
- pPriv->brightness = 0;
- pPriv->contrast = 0;
- pPriv->saturation = 0;
- pPriv->hue = 0;
- pPriv->gamma = 1000;
- pPriv->transform_index = 0;
-
- REGION_NULL(pScreen, &pPriv->clip);
-
- adapt->pPortPrivates[i].ptr = (pointer)(pPriv);
- }
- return adapt;
+ glamor_port_private *port_priv;
+ XF86VideoAdaptorPtr adapt;
+ int i;
+
+ adapt = calloc(1, sizeof(XF86VideoAdaptorRec) + num_texture_ports *
+ (sizeof(glamor_port_private) + sizeof(DevUnion)));
+ if (adapt == NULL)
+ return NULL;
+
+ xvBrightness = MAKE_ATOM("XV_BRIGHTNESS");
+ xvContrast = MAKE_ATOM("XV_CONTRAST");
+ xvSaturation = MAKE_ATOM("XV_SATURATION");
+ xvHue = MAKE_ATOM("XV_HUE");
+ xvGamma = MAKE_ATOM("XV_GAMMA");
+ xvColorspace = MAKE_ATOM("XV_COLORSPACE");
+
+ adapt->type = XvWindowMask | XvInputMask | XvImageMask;
+ adapt->flags = 0;
+ adapt->name = "GLAMOR Textured Video";
+ adapt->nEncodings = 1;
+ adapt->pEncodings = DummyEncodingGLAMOR;
+
+ adapt->nFormats = NUM_FORMATS;
+ adapt->pFormats = Formats;
+ adapt->nPorts = num_texture_ports;
+ adapt->pPortPrivates = (DevUnion *) (&adapt[1]);
+
+ adapt->pAttributes = Attributes_glamor;
+ adapt->nAttributes = NUM_ATTRIBUTES;
+
+ port_priv =
+ (glamor_port_private *) (&adapt->pPortPrivates[num_texture_ports]);
+ adapt->pImages = Images;
+ adapt->nImages = NUM_IMAGES;
+ adapt->PutVideo = NULL;
+ adapt->PutStill = NULL;
+ adapt->GetVideo = NULL;
+ adapt->GetStill = NULL;
+ adapt->StopVideo = glamor_xv_stop_video;
+ adapt->SetPortAttribute = glamor_xv_set_port_attribute;
+ adapt->GetPortAttribute = glamor_xv_get_port_attribute;
+ adapt->QueryBestSize = glamor_xv_query_best_size;
+ adapt->PutImage = glamor_xv_put_image;
+ adapt->ReputImage = NULL;
+ adapt->QueryImageAttributes = glamor_xv_query_image_attributes;
+
+ for (i = 0; i < num_texture_ports; i++) {
+ glamor_port_private *pPriv = &port_priv[i];
+
+ pPriv->brightness = 0;
+ pPriv->contrast = 0;
+ pPriv->saturation = 0;
+ pPriv->hue = 0;
+ pPriv->gamma = 1000;
+ pPriv->transform_index = 0;
+
+ REGION_NULL(pScreen, &pPriv->clip);
+
+ adapt->pPortPrivates[i].ptr = (void *) (pPriv);
+ }
+ return adapt;
}
#else
+#if 0
XF86VideoAdaptorPtr
glamor_xv_init(ScreenPtr screen, int num_texture_ports)
{
- return NULL;
+ return NULL;
}
#endif
+#endif
diff --git a/xorg-server/glamor/glapi.h b/xorg-server/glamor/glapi.h
deleted file mode 100644
index d510dac1d..000000000
--- a/xorg-server/glamor/glapi.h
+++ /dev/null
@@ -1,121 +0,0 @@
-/*
- * Mesa 3-D graphics library
- * Version: 7.1
- *
- * Copyright (C) 1999-2008 Brian Paul All Rights Reserved.
- *
- * Permission is hereby granted, free of charge, to any person obtaining a
- * copy of this software and associated documentation files (the "Software"),
- * to deal in the Software without restriction, including without limitation
- * the rights to use, copy, modify, merge, publish, distribute, sublicense,
- * and/or sell copies of the Software, and to permit persons to whom the
- * Software is furnished to do so, subject to the following conditions:
- *
- * The above copyright notice and this permission notice shall be included
- * in all copies or substantial portions of the Software.
- *
- * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
- * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
- * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
- * BRIAN PAUL BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN
- * AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
- * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
- */
-
-
-/**
- * \mainpage Mesa GL API Module
- *
- * \section GLAPIIntroduction Introduction
- *
- * The Mesa GL API module is responsible for dispatching all the
- * gl*() functions. All GL functions are dispatched by jumping through
- * the current dispatch table (basically a struct full of function
- * pointers.)
- *
- * A per-thread current dispatch table and per-thread current context
- * pointer are managed by this module too.
- *
- * This module is intended to be non-Mesa-specific so it can be used
- * with the X/DRI libGL also.
- */
-
-#ifndef _GLAPI_H
-#define _GLAPI_H
-
-#define GL_GLEXT_PROTOTYPES
-
-#if GLAMOR_GLES2
-#include <GLES2/gl2.h>
-#include <GLES2/gl2ext.h>
-#else
-#include <GL/gl.h>
-#include "GL/glext.h"
-#endif
-
-/* Is this needed? It is incomplete anyway. */
-#ifdef USE_MGL_NAMESPACE
-#define _glapi_set_dispatch _mglapi_set_dispatch
-#define _glapi_get_dispatch _mglapi_get_dispatch
-#define _glapi_set_context _mglapi_set_context
-#define _glapi_get_context _mglapi_get_context
-#define _glapi_Dispatch _mglapi_Dispatch
-#define _glapi_Context _mglapi_Context
-#endif
-
-typedef void (*_glapi_proc)(void);
-struct _glapi_table;
-
-
-#if defined (GLX_USE_TLS)
-
-extern __thread struct _glapi_table * _glapi_tls_Dispatch
- __attribute__((tls_model("initial-exec")));
-
-extern __thread void * _glapi_tls_Context
- __attribute__((tls_model("initial-exec")));
-
-extern const struct _glapi_table *_glapi_Dispatch;
-extern const void *_glapi_Context;
-
-# define GET_DISPATCH() _glapi_tls_Dispatch
-# define GET_CURRENT_CONTEXT(C) C = (typeof(C)) _glapi_tls_Context
-# define SET_CURRENT_CONTEXT(C) _glapi_tls_Context = (void*)C
-
-#else
-
-extern struct _glapi_table *_glapi_Dispatch;
-extern void *_glapi_Context;
-
-# ifdef THREADS
-
-# define GET_DISPATCH() \
- (likely(_glapi_Dispatch) ? _glapi_Dispatch : _glapi_get_dispatch())
-
-# define GET_CURRENT_CONTEXT(C) C = (typeof(C)) \
- (likely(_glapi_Context) ? _glapi_Context : _glapi_get_context())
-
-
-# define SET_CURRENT_CONTEXT(C) do { if (likely(_glapi_Context)) \
- _glapi_Context = (void*)C; \
- else \
- _glapi_set_context(C); } while(0)
-
-# else
-
-# define GET_DISPATCH() _glapi_Dispatch
-# define GET_CURRENT_CONTEXT(C) C = (typeof(C)) _glapi_Context
-# define SET_CURRENT_CONTEXT(C) _glapi_Context = (void*)C
-
-# endif
-
-#endif /* defined (GLX_USE_TLS) */
-
-
-extern void
-_glapi_set_context(void *context);
-
-extern void *
-_glapi_get_context(void);
-
-#endif
diff --git a/xorg-server/glx/glxdri2.c b/xorg-server/glx/glxdri2.c
index 8c1058613..5d1a45bff 100644
--- a/xorg-server/glx/glxdri2.c
+++ b/xorg-server/glx/glxdri2.c
@@ -461,7 +461,7 @@ create_driver_context(__GLXDRIcontext * context,
unsigned dri_err = 0;
unsigned major_ver;
unsigned minor_ver;
- uint32_t flags;
+ uint32_t flags = 0;
int reset;
int api = __DRI_API_OPENGL;
diff --git a/xorg-server/glx/glxdricommon.c b/xorg-server/glx/glxdricommon.c
index fc902729d..69d4b297e 100644
--- a/xorg-server/glx/glxdricommon.c
+++ b/xorg-server/glx/glxdricommon.c
@@ -226,7 +226,7 @@ glxConvertConfigs(const __DRIcoreExtension * core,
}
for (i = 0; configs[i]; i++) {
- int renderType = 0;
+ unsigned int renderType = 0;
if (core->getConfigAttrib(configs[i], __DRI_ATTRIB_RENDER_TYPE,
&renderType)) {
if (render_type_is_pbuffer_only(renderType) &&
diff --git a/xorg-server/hw/xfree86/common/xf86.h b/xorg-server/hw/xfree86/common/xf86.h
index 89025fe11..cec31354e 100644
--- a/xorg-server/hw/xfree86/common/xf86.h
+++ b/xorg-server/hw/xfree86/common/xf86.h
@@ -215,6 +215,8 @@ extern _X_EXPORT xf86SetDGAModeProc xf86SetDGAMode;
/* xf86Events.c */
+typedef struct _InputInfoRec *InputInfoPtr;
+
extern _X_EXPORT void SetTimeSinceLastInputEvent(void);
extern _X_EXPORT void *xf86AddInputHandler(int fd, InputHandlerProc proc,
void *data);
@@ -234,6 +236,10 @@ extern _X_EXPORT Bool xf86EnableVTSwitch(Bool new);
extern _X_EXPORT void xf86ProcessActionEvent(ActionEvent action, void *arg);
extern _X_EXPORT void xf86PrintBacktrace(void);
extern _X_EXPORT Bool xf86VTOwner(void);
+extern _X_EXPORT void xf86VTLeave(void);
+extern _X_EXPORT void xf86VTEnter(void);
+extern _X_EXPORT void xf86EnableInputDeviceForVTSwitch(InputInfoPtr pInfo);
+extern _X_EXPORT void xf86DisableInputDeviceForVTSwitch(InputInfoPtr pInfo);
/* xf86Helper.c */
diff --git a/xorg-server/hw/xfree86/common/xf86Events.c b/xorg-server/hw/xfree86/common/xf86Events.c
index cae78732c..7b53949fa 100644
--- a/xorg-server/hw/xfree86/common/xf86Events.c
+++ b/xorg-server/hw/xfree86/common/xf86Events.c
@@ -407,178 +407,193 @@ xf86ReleaseKeys(DeviceIntPtr pDev)
}
}
-/*
- * xf86VTSwitch --
- * Handle requests for switching the vt.
- */
-static void
-xf86VTSwitch(void)
+void
+xf86DisableInputDeviceForVTSwitch(InputInfoPtr pInfo)
+{
+ if (!pInfo->dev)
+ return;
+
+ if (!pInfo->dev->enabled)
+ pInfo->flags |= XI86_DEVICE_DISABLED;
+
+ xf86ReleaseKeys(pInfo->dev);
+ ProcessInputEvents();
+ DisableDevice(pInfo->dev, TRUE);
+}
+
+void
+xf86EnableInputDeviceForVTSwitch(InputInfoPtr pInfo)
+{
+ if (pInfo->dev && (pInfo->flags & XI86_DEVICE_DISABLED) == 0)
+ EnableDevice(pInfo->dev, TRUE);
+ pInfo->flags &= ~XI86_DEVICE_DISABLED;
+}
+
+void
+xf86VTLeave(void)
{
int i;
InputInfoPtr pInfo;
IHPtr ih;
- DebugF("xf86VTSwitch()\n");
-
-#ifdef XFreeXDGA
- if (!DGAVTSwitch())
- return;
+ DebugF("xf86VTSwitch: Leaving, xf86Exiting is %s\n",
+ BOOLTOSTRING((dispatchException & DE_TERMINATE) ? TRUE : FALSE));
+#ifdef DPMSExtension
+ if (DPMSPowerLevel != DPMSModeOn)
+ DPMSSet(serverClient, DPMSModeOn);
#endif
+ for (i = 0; i < xf86NumScreens; i++) {
+ if (!(dispatchException & DE_TERMINATE))
+ if (xf86Screens[i]->EnableDisableFBAccess)
+ (*xf86Screens[i]->EnableDisableFBAccess) (xf86Screens[i], FALSE);
+ }
/*
- * Since all screens are currently all in the same state it is sufficient
- * check the first. This might change in future.
+ * Keep the order: Disable Device > LeaveVT
+ * EnterVT > EnableDevice
*/
- if (xf86VTOwner()) {
+ for (ih = InputHandlers; ih; ih = ih->next) {
+ if (ih->is_input)
+ xf86DisableInputHandler(ih);
+ else
+ xf86DisableGeneralHandler(ih);
+ }
+ for (pInfo = xf86InputDevs; pInfo; pInfo = pInfo->next)
+ xf86DisableInputDeviceForVTSwitch(pInfo);
- DebugF("xf86VTSwitch: Leaving, xf86Exiting is %s\n",
- BOOLTOSTRING((dispatchException & DE_TERMINATE) ? TRUE : FALSE));
-#ifdef DPMSExtension
- if (DPMSPowerLevel != DPMSModeOn)
- DPMSSet(serverClient, DPMSModeOn);
+ OsBlockSIGIO();
+ for (i = 0; i < xf86NumScreens; i++)
+ xf86Screens[i]->LeaveVT(xf86Screens[i]);
+ for (i = 0; i < xf86NumGPUScreens; i++)
+ xf86GPUScreens[i]->LeaveVT(xf86GPUScreens[i]);
+
+ xf86AccessLeave(); /* We need this here, otherwise */
+
+ if (!xf86VTSwitchAway())
+ goto switch_failed;
+
+#ifdef XF86PM
+ if (xf86OSPMClose)
+ xf86OSPMClose();
+ xf86OSPMClose = NULL;
#endif
- for (i = 0; i < xf86NumScreens; i++) {
- if (!(dispatchException & DE_TERMINATE))
- if (xf86Screens[i]->EnableDisableFBAccess)
- (*xf86Screens[i]->EnableDisableFBAccess) (xf86Screens[i], FALSE);
- }
+ for (i = 0; i < xf86NumScreens; i++) {
/*
- * Keep the order: Disable Device > LeaveVT
- * EnterVT > EnableDevice
+ * zero all access functions to
+ * trap calls when switched away.
*/
- for (ih = InputHandlers; ih; ih = ih->next) {
- if (ih->is_input)
- xf86DisableInputHandler(ih);
- else
- xf86DisableGeneralHandler(ih);
- }
- for (pInfo = xf86InputDevs; pInfo; pInfo = pInfo->next) {
- if (pInfo->dev) {
- if (!pInfo->dev->enabled)
- pInfo->flags |= XI86_DEVICE_DISABLED;
- xf86ReleaseKeys(pInfo->dev);
- ProcessInputEvents();
- DisableDevice(pInfo->dev, TRUE);
- }
- }
-
- OsBlockSIGIO();
- for (i = 0; i < xf86NumScreens; i++)
- xf86Screens[i]->LeaveVT(xf86Screens[i]);
- for (i = 0; i < xf86NumGPUScreens; i++)
- xf86GPUScreens[i]->LeaveVT(xf86GPUScreens[i]);
+ xf86Screens[i]->vtSema = FALSE;
+ }
+ if (xorgHWAccess)
+ xf86DisableIO();
- xf86AccessLeave(); /* We need this here, otherwise */
+ return;
- if (!xf86VTSwitchAway()) {
- /*
- * switch failed
- */
+switch_failed:
+ DebugF("xf86VTSwitch: Leave failed\n");
+ xf86AccessEnter();
+ for (i = 0; i < xf86NumScreens; i++) {
+ if (!xf86Screens[i]->EnterVT(xf86Screens[i]))
+ FatalError("EnterVT failed for screen %d\n", i);
+ }
+ for (i = 0; i < xf86NumGPUScreens; i++) {
+ if (!xf86GPUScreens[i]->EnterVT(xf86GPUScreens[i]))
+ FatalError("EnterVT failed for gpu screen %d\n", i);
+ }
+ if (!(dispatchException & DE_TERMINATE)) {
+ for (i = 0; i < xf86NumScreens; i++) {
+ if (xf86Screens[i]->EnableDisableFBAccess)
+ (*xf86Screens[i]->EnableDisableFBAccess) (xf86Screens[i], TRUE);
+ }
+ }
+ dixSaveScreens(serverClient, SCREEN_SAVER_FORCER, ScreenSaverReset);
+
+ for (pInfo = xf86InputDevs; pInfo; pInfo = pInfo->next)
+ xf86EnableInputDeviceForVTSwitch(pInfo);
+ for (ih = InputHandlers; ih; ih = ih->next) {
+ if (ih->is_input)
+ xf86EnableInputHandler(ih);
+ else
+ xf86EnableGeneralHandler(ih);
+ }
+ OsReleaseSIGIO();
+}
- DebugF("xf86VTSwitch: Leave failed\n");
- xf86AccessEnter();
- for (i = 0; i < xf86NumScreens; i++) {
- if (!xf86Screens[i]->EnterVT(xf86Screens[i]))
- FatalError("EnterVT failed for screen %d\n", i);
- }
- for (i = 0; i < xf86NumGPUScreens; i++) {
- if (!xf86GPUScreens[i]->EnterVT(xf86GPUScreens[i]))
- FatalError("EnterVT failed for gpu screen %d\n", i);
- }
- if (!(dispatchException & DE_TERMINATE)) {
- for (i = 0; i < xf86NumScreens; i++) {
- if (xf86Screens[i]->EnableDisableFBAccess)
- (*xf86Screens[i]->EnableDisableFBAccess) (xf86Screens[i], TRUE);
- }
- }
- dixSaveScreens(serverClient, SCREEN_SAVER_FORCER, ScreenSaverReset);
+void
+xf86VTEnter(void)
+{
+ int i;
+ InputInfoPtr pInfo;
+ IHPtr ih;
- pInfo = xf86InputDevs;
- while (pInfo) {
- if (pInfo->dev && (pInfo->flags & XI86_DEVICE_DISABLED) == 0)
- EnableDevice(pInfo->dev, TRUE);
- pInfo->flags &= ~XI86_DEVICE_DISABLED;
- pInfo = pInfo->next;
- }
- for (ih = InputHandlers; ih; ih = ih->next) {
- if (ih->is_input)
- xf86EnableInputHandler(ih);
- else
- xf86EnableGeneralHandler(ih);
- }
- OsReleaseSIGIO();
+ DebugF("xf86VTSwitch: Entering\n");
+ if (!xf86VTSwitchTo())
+ return;
- }
- else {
#ifdef XF86PM
- if (xf86OSPMClose)
- xf86OSPMClose();
- xf86OSPMClose = NULL;
+ xf86OSPMClose = xf86OSPMOpen();
#endif
- for (i = 0; i < xf86NumScreens; i++) {
- /*
- * zero all access functions to
- * trap calls when switched away.
- */
- xf86Screens[i]->vtSema = FALSE;
- }
- if (xorgHWAccess)
- xf86DisableIO();
- }
+ if (xorgHWAccess)
+ xf86EnableIO();
+ xf86AccessEnter();
+ for (i = 0; i < xf86NumScreens; i++) {
+ xf86Screens[i]->vtSema = TRUE;
+ if (!xf86Screens[i]->EnterVT(xf86Screens[i]))
+ FatalError("EnterVT failed for screen %d\n", i);
+ }
+ for (i = 0; i < xf86NumGPUScreens; i++) {
+ xf86GPUScreens[i]->vtSema = TRUE;
+ if (!xf86GPUScreens[i]->EnterVT(xf86GPUScreens[i]))
+ FatalError("EnterVT failed for gpu screen %d\n", i);
+ }
+ for (i = 0; i < xf86NumScreens; i++) {
+ if (xf86Screens[i]->EnableDisableFBAccess)
+ (*xf86Screens[i]->EnableDisableFBAccess) (xf86Screens[i], TRUE);
}
- else {
- DebugF("xf86VTSwitch: Entering\n");
- if (!xf86VTSwitchTo())
- return;
-#ifdef XF86PM
- xf86OSPMClose = xf86OSPMOpen();
-#endif
+ /* Turn screen saver off when switching back */
+ dixSaveScreens(serverClient, SCREEN_SAVER_FORCER, ScreenSaverReset);
- if (xorgHWAccess)
- xf86EnableIO();
- xf86AccessEnter();
- for (i = 0; i < xf86NumScreens; i++) {
- xf86Screens[i]->vtSema = TRUE;
- if (!xf86Screens[i]->EnterVT(xf86Screens[i]))
- FatalError("EnterVT failed for screen %d\n", i);
- }
- for (i = 0; i < xf86NumGPUScreens; i++) {
- xf86GPUScreens[i]->vtSema = TRUE;
- if (!xf86GPUScreens[i]->EnterVT(xf86GPUScreens[i]))
- FatalError("EnterVT failed for gpu screen %d\n", i);
- }
- for (i = 0; i < xf86NumScreens; i++) {
- if (xf86Screens[i]->EnableDisableFBAccess)
- (*xf86Screens[i]->EnableDisableFBAccess) (xf86Screens[i], TRUE);
- }
+ for (pInfo = xf86InputDevs; pInfo; pInfo = pInfo->next)
+ xf86EnableInputDeviceForVTSwitch(pInfo);
+ for (ih = InputHandlers; ih; ih = ih->next) {
+ if (ih->is_input)
+ xf86EnableInputHandler(ih);
+ else
+ xf86EnableGeneralHandler(ih);
+ }
+#ifdef XSERVER_PLATFORM_BUS
+ /* check for any new output devices */
+ xf86platformVTProbe();
+#endif
- /* Turn screen saver off when switching back */
- dixSaveScreens(serverClient, SCREEN_SAVER_FORCER, ScreenSaverReset);
+ OsReleaseSIGIO();
+}
- pInfo = xf86InputDevs;
- while (pInfo) {
- if (pInfo->dev && (pInfo->flags & XI86_DEVICE_DISABLED) == 0)
- EnableDevice(pInfo->dev, TRUE);
- pInfo->flags &= ~XI86_DEVICE_DISABLED;
- pInfo = pInfo->next;
- }
+/*
+ * xf86VTSwitch --
+ * Handle requests for switching the vt.
+ */
+static void
+xf86VTSwitch(void)
+{
+ DebugF("xf86VTSwitch()\n");
- for (ih = InputHandlers; ih; ih = ih->next) {
- if (ih->is_input)
- xf86EnableInputHandler(ih);
- else
- xf86EnableGeneralHandler(ih);
- }
-#ifdef XSERVER_PLATFORM_BUS
- /* check for any new output devices */
- xf86platformVTProbe();
+#ifdef XFreeXDGA
+ if (!DGAVTSwitch())
+ return;
#endif
- OsReleaseSIGIO();
- }
+ /*
+ * Since all screens are currently all in the same state it is sufficient
+ * check the first. This might change in future.
+ */
+ if (xf86VTOwner())
+ xf86VTLeave();
+ else
+ xf86VTEnter();
}
/* Input handler registration */
diff --git a/xorg-server/hw/xfree86/common/xf86Helper.c b/xorg-server/hw/xfree86/common/xf86Helper.c
index 2c0629d64..12a877159 100644
--- a/xorg-server/hw/xfree86/common/xf86Helper.c
+++ b/xorg-server/hw/xfree86/common/xf86Helper.c
@@ -217,6 +217,10 @@ xf86DeleteScreen(ScrnInfoPtr pScrn)
int i;
int scrnIndex;
Bool is_gpu = FALSE;
+
+ if (!pScrn)
+ return;
+
if (pScrn->is_gpu) {
/* First check if the screen is valid */
if (xf86NumGPUScreens == 0 || xf86GPUScreens == NULL)
@@ -228,9 +232,6 @@ xf86DeleteScreen(ScrnInfoPtr pScrn)
return;
}
- if (!pScrn)
- return;
-
scrnIndex = pScrn->scrnIndex;
/* If a FreeScreen function is defined, call it here */
if (pScrn->FreeScreen != NULL)
diff --git a/xorg-server/hw/xfree86/common/xf86Init.c b/xorg-server/hw/xfree86/common/xf86Init.c
index 9c8a86a39..ff4d38f28 100644
--- a/xorg-server/hw/xfree86/common/xf86Init.c
+++ b/xorg-server/hw/xfree86/common/xf86Init.c
@@ -53,6 +53,7 @@
#include "scrnintstr.h"
#include "site.h"
#include "mi.h"
+#include "dbus-core.h"
#include "compiler.h"
@@ -456,6 +457,8 @@ InitOutput(ScreenInfo * pScreenInfo, int argc, char **argv)
if (xf86DoShowOptions)
DoShowOptions();
+ dbus_core_init();
+
/* Do a general bus probe. This will be a PCI probe for x86 platforms */
xf86BusProbe();
@@ -544,7 +547,8 @@ InitOutput(ScreenInfo * pScreenInfo, int argc, char **argv)
if (NEED_IO_ENABLED(flags))
want_hw_access = TRUE;
- if (!(flags & HW_SKIP_CONSOLE))
+ /* Non-seat0 X servers should not open console */
+ if (!(flags & HW_SKIP_CONSOLE) && !ServerIsNotSeat0())
xorgHWOpenConsole = TRUE;
}
@@ -1058,6 +1062,8 @@ ddxGiveUp(enum ExitCode error)
if (xorgHWOpenConsole)
xf86CloseConsole();
+ dbus_core_fini();
+
xf86CloseLog(error);
/* If an unexpected signal was caught, dump a core for debugging */
diff --git a/xorg-server/hw/xfree86/modes/xf86EdidModes.c b/xorg-server/hw/xfree86/modes/xf86EdidModes.c
index a56f6ba23..6fb0f9b92 100644
--- a/xorg-server/hw/xfree86/modes/xf86EdidModes.c
+++ b/xorg-server/hw/xfree86/modes/xf86EdidModes.c
@@ -162,6 +162,11 @@ quirk_detailed_use_maximum_size(int scrnIndex, xf86MonPtr DDC)
DDC->vendor.prod_id == 0x7f01)
return TRUE;
+ /* Sony Vaio Pro 13 */
+ if (memcmp(DDC->vendor.name, "MEI", 4) == 0 &&
+ DDC->vendor.prod_id == 0x96a2)
+ return TRUE;
+
return FALSE;
}
diff --git a/xorg-server/hw/xfree86/vgahw/Makefile.am b/xorg-server/hw/xfree86/vgahw/Makefile.am
index f0b65740c..4b718b489 100644
--- a/xorg-server/hw/xfree86/vgahw/Makefile.am
+++ b/xorg-server/hw/xfree86/vgahw/Makefile.am
@@ -1,5 +1,6 @@
module_LTLIBRARIES = libvgahw.la
libvgahw_la_LDFLAGS = -avoid-version
+libvgahw_la_LIBADD = $(PCIACCESS_LIBS)
libvgahw_la_SOURCES = vgaHW.c vgaHWmodule.c
AM_CPPFLAGS = $(XORG_INCS) -I$(srcdir)/../ddc -I$(srcdir)/../i2c
AM_CFLAGS = $(DIX_CFLAGS) $(XORG_CFLAGS)
diff --git a/xorg-server/include/Makefile.am b/xorg-server/include/Makefile.am
index 93d8616f2..fa6da00ec 100644
--- a/xorg-server/include/Makefile.am
+++ b/xorg-server/include/Makefile.am
@@ -68,7 +68,7 @@ endif
AM_CFLAGS = $(DIX_CFLAGS)
EXTRA_DIST = \
- busfault.h \
+ busfault.h dbus-core.h \
dix-config-apple-verbatim.h \
dixfontstubs.h eventconvert.h eventstr.h inpututils.h \
protocol-versions.h \
diff --git a/xorg-server/glamor/compiler.h b/xorg-server/include/dbus-core.h
index fa2895976..b2d6d1b9e 100644
--- a/xorg-server/glamor/compiler.h
+++ b/xorg-server/include/dbus-core.h
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 2011 Intel Corporation
+ * Copyright © 2013 Red Hat, Inc.
*
* Permission is hereby granted, free of charge, to any person obtaining a
* copy of this software and associated documentation files (the "Software"),
@@ -16,44 +16,41 @@
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
* THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
- * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
- * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
- * SOFTWARE.
- *
- * Authors:
- * Chris Wilson <chris@chris-wilson.co.uk>
- *
- * Copied from sna
+ * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
+ * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
+ * DEALINGS IN THE SOFTWARE.
*
+ * Author: Hans de Goede <hdegoede@redhat.com>
*/
-#ifndef _GLAMOR_COMPILER_H_
-#define _GLAMOR_COMPILER_H_
+#ifndef DBUS_CORE_H
+#define DBUS_CORE_H
-#if defined(__GNUC__) && (__GNUC__ > 2) && defined(__OPTIMIZE__)
-#define likely(expr) (__builtin_expect (!!(expr), 1))
-#define unlikely(expr) (__builtin_expect (!!(expr), 0))
-#define noinline __attribute__((noinline))
-#define fastcall __attribute__((regparm(3)))
-#define must_check __attribute__((warn_unused_result))
-#define constant __attribute__((const))
-#else
-#define likely(expr) (expr)
-#define unlikely(expr) (expr)
-#define noinline
-#define fastcall
-#define must_check
-#define constant
-#endif
+#ifdef NEED_DBUS
+typedef struct DBusConnection DBusConnection;
+
+typedef void (*dbus_core_connect_hook) (DBusConnection * connection,
+ void *data);
+typedef void (*dbus_core_disconnect_hook) (void *data);
+
+struct dbus_core_hook {
+ dbus_core_connect_hook connect;
+ dbus_core_disconnect_hook disconnect;
+ void *data;
+
+ struct dbus_core_hook *next;
+};
+
+int dbus_core_init(void);
+void dbus_core_fini(void);
+int dbus_core_add_hook(struct dbus_core_hook *hook);
+void dbus_core_remove_hook(struct dbus_core_hook *hook);
-#ifdef HAVE_VALGRIND
-#define VG(x) x
#else
-#define VG(x)
-#endif
-#define VG_CLEAR(s) VG(memset(&s, 0, sizeof(s)))
+#define dbus_core_init()
+#define dbus_core_fini()
-#define COMPILE_TIME_ASSERT(E) ((void)sizeof(char[1 - 2*!(E)]))
+#endif
-#endif /* _SNA_COMPILER_H_ */
+#endif
diff --git a/xorg-server/include/dix-config.h.in b/xorg-server/include/dix-config.h.in
index 55cfe4710..7c77956b1 100644
--- a/xorg-server/include/dix-config.h.in
+++ b/xorg-server/include/dix-config.h.in
@@ -199,6 +199,9 @@
/* Define to 1 if you have the `strndup' function. */
#undef HAVE_STRNDUP
+/* Define to 1 if libsystemd-daemon is available */
+#undef HAVE_SYSTEMD_DAEMON
+
/* Define to 1 if SYSV IPC is available */
#undef HAVE_SYSV_IPC
@@ -411,11 +414,8 @@
/* Use udev_enumerate_add_match_tag() */
#undef HAVE_UDEV_ENUMERATE_ADD_MATCH_TAG
-/* Use D-Bus for input hotplug */
-#undef CONFIG_NEED_DBUS
-
-/* Support the D-Bus hotplug API */
-#undef CONFIG_DBUS_API
+/* Enable D-Bus core */
+#undef NEED_DBUS
/* Support HAL for hotplug */
#undef CONFIG_HAL
@@ -472,7 +472,13 @@
/* Don't let Xdefs.h define 'pointer' */
#define _XTYPEDEF_POINTER 1
+/* Don't let XIproto define 'Pointer' */
+#define _XITYPEDEF_POINTER 1
+
/* Ask fontsproto to make font path element names const */
#define FONT_PATH_ELEMENT_NAME_CONST 1
+/* Build GLAMOR */
+#undef GLAMOR
+
#endif /* _DIX_CONFIG_H_ */
diff --git a/xorg-server/pseudoramiX/pseudoramiX.c b/xorg-server/pseudoramiX/pseudoramiX.c
index 23dbc7328..f47c7836d 100644
--- a/xorg-server/pseudoramiX/pseudoramiX.c
+++ b/xorg-server/pseudoramiX/pseudoramiX.c
@@ -100,6 +100,10 @@ static unsigned long pseudoramiXGeneration = 0;
static void
PseudoramiXTrace(const char *format, ...)
+ _X_ATTRIBUTE_PRINTF(1, 2);
+
+static void
+PseudoramiXTrace(const char *format, ...)
{
va_list ap;
@@ -110,6 +114,10 @@ PseudoramiXTrace(const char *format, ...)
static void
PseudoramiXDebug(const char *format, ...)
+ _X_ATTRIBUTE_PRINTF(1, 2);
+
+static void
+PseudoramiXDebug(const char *format, ...)
{
va_list ap;
diff --git a/xorg-server/test/xi2/protocol-xipassivegrabdevice.c b/xorg-server/test/xi2/protocol-xipassivegrabdevice.c
index 1e2341eb7..c747ddf03 100644
--- a/xorg-server/test/xi2/protocol-xipassivegrabdevice.c
+++ b/xorg-server/test/xi2/protocol-xipassivegrabdevice.c
@@ -137,6 +137,7 @@ request_XIPassiveGrabDevice(ClientPtr client, xXIPassiveGrabDeviceReq * req,
{
int rc;
int local_modifiers;
+ int mask_len;
rc = ProcXIPassiveGrabDevice(&client_request);
assert(rc == error);
@@ -153,10 +154,11 @@ request_XIPassiveGrabDevice(ClientPtr client, xXIPassiveGrabDeviceReq * req,
swaps(&req->deviceid);
local_modifiers = req->num_modifiers;
swaps(&req->num_modifiers);
+ mask_len = req->mask_len;
swaps(&req->mask_len);
while (local_modifiers--) {
- CARD32 *mod = ((CARD32 *) (req + 1)) + local_modifiers;
+ CARD32 *mod = (CARD32 *) (req + 1) + mask_len + local_modifiers;
swapl(mod);
}
@@ -228,6 +230,11 @@ test_XIPassiveGrabDevice(void)
request->detail = XIAnyButton;
request_XIPassiveGrabDevice(&client_request, request, Success, 0);
+ /* Set a few random masks to make sure we handle modifiers correctly */
+ SetBit(mask, XI_ButtonPress);
+ SetBit(mask, XI_KeyPress);
+ SetBit(mask, XI_Enter);
+
/* some modifiers */
request->num_modifiers = N_MODS;
request->length += N_MODS;
diff --git a/xorg-server/xkeyboard-config/NEWS b/xorg-server/xkeyboard-config/NEWS
index c0db1c6d5..05c89d145 100644
--- a/xorg-server/xkeyboard-config/NEWS
+++ b/xorg-server/xkeyboard-config/NEWS
@@ -1,3 +1,6 @@
+2.11 11 bugs fixed
+ Continuing code formatting cleanup
+ Translations updated
2.10.1 Critical fix
2.10 10+ bugs fixed
37 cleanup commits by Benno Schulenberg
diff --git a/xorg-server/xkeyboard-config/configure.ac b/xorg-server/xkeyboard-config/configure.ac
index 51f070c68..a0886a645 100644
--- a/xorg-server/xkeyboard-config/configure.ac
+++ b/xorg-server/xkeyboard-config/configure.ac
@@ -1,4 +1,4 @@
-AC_INIT(xkeyboard-config, 2.10.1)
+AC_INIT(xkeyboard-config, 2.11)
AC_CONFIG_SRCDIR(rules/base.xml.in)
AM_INIT_AUTOMAKE([foreign dist-bzip2])
AM_MAINTAINER_MODE
diff --git a/xorg-server/xkeyboard-config/keycodes/xfree86 b/xorg-server/xkeyboard-config/keycodes/xfree86
index 0c910187f..47dc8934e 100644
--- a/xorg-server/xkeyboard-config/keycodes/xfree86
+++ b/xorg-server/xkeyboard-config/keycodes/xfree86
@@ -163,9 +163,7 @@ xkb_keycodes "basic" {
// The entries commented out are never generated because the raw codes
// in those positions are already used for well-defined keys.
- alias <I01> = <XFER>;
<I02> = 130;
- alias <I03> = <NFER>;
<I04> = 132;
alias <I05> = <AE13>;
<I06> = 134;
@@ -287,7 +285,9 @@ xkb_keycodes "basic" {
<I7A> = 250;
<I7B> = 251;
<I7C> = 252;
+ alias <IR7C> = <I7C>;
<I7D> = 253;
+ alias <IR7D> = <I7D>;
<I7E> = 254;
<I7F> = 255;
diff --git a/xorg-server/xkeyboard-config/po/bg.po b/xorg-server/xkeyboard-config/po/bg.po
index f2846c38f..bf785a69c 100644
--- a/xorg-server/xkeyboard-config/po/bg.po
+++ b/xorg-server/xkeyboard-config/po/bg.po
@@ -1,9 +1,11 @@
# Bulgarian translation of xkeyboard-config.
# Copyright (C) 2002, 2005, 2006, 2007, 2008 Free Software Foundation, Inc.
# Copyright (C) 2009, 2010, 2011, 2012, 2013 Free Software Foundation, Inc.
+# Copyright (C) 2014 Free Software Foundation, Inc.
# This file is distributed under the same license as the xkeyboard-config package.
# Alexander Shopov <ash@kambanaria.org>, 2002, 2005, 2006, 2007, 2008.
# Alexander Shopov <ash@kambanaria.org>, 2009, 2010, 2011, 2012, 2013.
+# Alexander Shopov <ash@kambanaria.org>, 2014.
# Damyan Ivanov <dam+gnome@ktnx.net>, 2010.
#
#
@@ -49,12 +51,12 @@
# Предпочита се дълго тире „—“ пред скоби „()“.
msgid ""
msgstr ""
-"Project-Id-Version: xkeyboard-config-2.9.91\n"
+"Project-Id-Version: xkeyboard-config-2.10.99\n"
"Report-Msgid-Bugs-To: svu@users.sourceforge.net\n"
-"POT-Creation-Date: 2013-09-14 14:41+0200\n"
-"PO-Revision-Date: 2013-09-14 21:36+0300\n"
+"POT-Creation-Date: 2014-01-15 01:12+0000\n"
+"PO-Revision-Date: 2014-01-17 19:19+0200\n"
"Last-Translator: Alexander Shopov <ash@kambanaria.org>\n"
-"Language-Team: Bulgarian <dict@fsa-bg.org>\n"
+"Language-Team: Bulgarian <dict@ludost.net>\n"
"Language: bg\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
@@ -861,7 +863,7 @@ msgid "English (programmer Dvorak)"
msgstr "английска — Дворак за програмисти"
#. Keyboard indicator for Russian layouts
-#: ../rules/base.xml.in.h:203 ../rules/base.extras.xml.in.h:54
+#: ../rules/base.xml.in.h:203 ../rules/base.extras.xml.in.h:55
msgid "ru"
msgstr "Рск"
@@ -933,11 +935,11 @@ msgid "Uzbek (Afghanistan, OLPC)"
msgstr "узбекска — афганистанска, OLPC"
#. Keyboard indicator for Arabic layouts
-#: ../rules/base.xml.in.h:224 ../rules/base.extras.xml.in.h:64
+#: ../rules/base.xml.in.h:224 ../rules/base.extras.xml.in.h:65
msgid "ar"
msgstr "Арб"
-#: ../rules/base.xml.in.h:225 ../rules/base.extras.xml.in.h:65
+#: ../rules/base.xml.in.h:225 ../rules/base.extras.xml.in.h:66
msgid "Arabic"
msgstr "арабска"
@@ -975,11 +977,11 @@ msgid "Albanian"
msgstr "албанска"
#. Keyboard indicator for Armenian layouts
-#: ../rules/base.xml.in.h:236 ../rules/base.extras.xml.in.h:58
+#: ../rules/base.xml.in.h:236 ../rules/base.extras.xml.in.h:59
msgid "hy"
msgstr "Арм"
-#: ../rules/base.xml.in.h:237 ../rules/base.extras.xml.in.h:59
+#: ../rules/base.xml.in.h:237 ../rules/base.extras.xml.in.h:60
msgid "Armenian"
msgstr "арменска"
@@ -1055,11 +1057,11 @@ msgid "Belarusian (Latin)"
msgstr "беларуска — латиница"
#. Keyboard indicator for Belgian layouts
-#: ../rules/base.xml.in.h:259 ../rules/base.extras.xml.in.h:67
+#: ../rules/base.xml.in.h:259 ../rules/base.extras.xml.in.h:68
msgid "be"
msgstr "Бел"
-#: ../rules/base.xml.in.h:260 ../rules/base.extras.xml.in.h:68
+#: ../rules/base.xml.in.h:260 ../rules/base.extras.xml.in.h:69
msgid "Belgian"
msgstr "белгийска"
@@ -1091,17 +1093,17 @@ msgstr "белгийска — с „мъртви“ клавиши на Sun"
msgid "Belgian (Wang model 724 azerty)"
msgstr "белгийска — Wang, модел 724, azerty"
-#. Keyboard indicator for Bengali layouts
+#. Keyboard indicator for Bangla layouts
#: ../rules/base.xml.in.h:269
msgid "bn"
msgstr "Бнг"
#: ../rules/base.xml.in.h:270
-msgid "Bengali"
+msgid "Bangla"
msgstr "бенгалска"
#: ../rules/base.xml.in.h:271
-msgid "Bengali (Probhat)"
+msgid "Bangla (Probhat)"
msgstr "бенгалска — пробхат"
#. Keyboard indicator for Indian layouts
@@ -1114,27 +1116,27 @@ msgid "Indian"
msgstr "индийска"
#: ../rules/base.xml.in.h:275
-msgid "Bengali (India)"
+msgid "Bangla (India)"
msgstr "бенгалска — индийска"
#: ../rules/base.xml.in.h:276
-msgid "Bengali (India, Probhat)"
+msgid "Bangla (India, Probhat)"
msgstr "бенгалска — индийска, пробхат"
#: ../rules/base.xml.in.h:277
-msgid "Bengali (India, Baishakhi)"
+msgid "Bangla (India, Baishakhi)"
msgstr "бенгалска — индийска, байшаки"
#: ../rules/base.xml.in.h:278
-msgid "Bengali (India, Bornona)"
+msgid "Bangla (India, Bornona)"
msgstr "бенгалска — индийска, борона"
#: ../rules/base.xml.in.h:279
-msgid "Bengali (India, Uni Gitanjali)"
+msgid "Bangla (India, Uni Gitanjali)"
msgstr "бенгалска — индийска, уни гитанжали"
#: ../rules/base.xml.in.h:280
-msgid "Bengali (India, Baishakhi Inscript)"
+msgid "Bangla (India, Baishakhi Inscript)"
msgstr "бенгалска — индийска, байшаки, инскрипт"
#. Keyboard indicator for Gujarati layouts
@@ -1318,11 +1320,11 @@ msgid "Bosnian (US keyboard with Bosnian letters)"
msgstr "босненска — американска с босненски букви"
#. Keyboard indicator for Portuguese layouts
-#: ../rules/base.xml.in.h:336 ../rules/base.extras.xml.in.h:70
+#: ../rules/base.xml.in.h:336 ../rules/base.extras.xml.in.h:71
msgid "pt"
msgstr "Прт"
-#: ../rules/base.xml.in.h:337 ../rules/base.extras.xml.in.h:71
+#: ../rules/base.xml.in.h:337 ../rules/base.extras.xml.in.h:72
msgid "Portuguese (Brazil)"
msgstr "португалска — бразилска"
@@ -1335,16 +1337,16 @@ msgid "Portuguese (Brazil, Dvorak)"
msgstr "португалска — бразилска, Дворак"
#: ../rules/base.xml.in.h:340
-msgid "Portuguese (Brazil, nativo)"
+msgid "Portuguese (Brazil, Nativo)"
msgstr "португалска — бразилска, нативна"
#: ../rules/base.xml.in.h:341
-msgid "Portuguese (Brazil, nativo for US keyboards)"
+msgid "Portuguese (Brazil, Nativo for US keyboards)"
msgstr "португалска — бразилска, нативна за САЩ"
#: ../rules/base.xml.in.h:342
-msgid "Portuguese (Brazil, nativo for Esperanto)"
-msgstr "португалска — бразилска, нативна за есперанто"
+msgid "Esperanto (Brazil, Nativo)"
+msgstr "есперантска — бразилска, нативна"
#. Keyboard indicator for Bulgarian layouts
#: ../rules/base.xml.in.h:344
@@ -1498,2464 +1500,2484 @@ msgid "Tibetan (with ASCII numerals)"
msgstr "тибетска — с цифри от ASCII"
#: ../rules/base.xml.in.h:386
+msgid "ug"
+msgstr "Угр"
+
+#: ../rules/base.xml.in.h:387
msgid "Uyghur"
msgstr "уйгурска"
#. Keyboard indicator for Croatian layouts
-#: ../rules/base.xml.in.h:388
+#: ../rules/base.xml.in.h:389
msgid "hr"
msgstr "Хрв"
-#: ../rules/base.xml.in.h:389
+#: ../rules/base.xml.in.h:390
msgid "Croatian"
msgstr "хърватска"
-#: ../rules/base.xml.in.h:390
+#: ../rules/base.xml.in.h:391
msgid "Croatian (use guillemets for quotes)"
msgstr "хърватска — с „«»“"
-#: ../rules/base.xml.in.h:391
+#: ../rules/base.xml.in.h:392
msgid "Croatian (use Croatian digraphs)"
msgstr "хърватска — с хърватски диграфи"
-#: ../rules/base.xml.in.h:392
+#: ../rules/base.xml.in.h:393
msgid "Croatian (US keyboard with Croatian digraphs)"
msgstr "хърватска — американска с хърватски диграфи"
-#: ../rules/base.xml.in.h:393
+#: ../rules/base.xml.in.h:394
msgid "Croatian (US keyboard with Croatian letters)"
msgstr "хърватска — американска с хърватски букви"
#. Keyboard indicator for Chech layouts
-#: ../rules/base.xml.in.h:395 ../rules/base.extras.xml.in.h:73
+#: ../rules/base.xml.in.h:396 ../rules/base.extras.xml.in.h:74
msgid "cs"
msgstr "Чшк"
-#: ../rules/base.xml.in.h:396 ../rules/base.extras.xml.in.h:74
+#: ../rules/base.xml.in.h:397 ../rules/base.extras.xml.in.h:75
msgid "Czech"
msgstr "чешка"
-#: ../rules/base.xml.in.h:397
+#: ../rules/base.xml.in.h:398
msgid "Czech (with &lt;\\|&gt; key)"
msgstr "чешка — с „\\|“"
-#: ../rules/base.xml.in.h:398
+#: ../rules/base.xml.in.h:399
msgid "Czech (qwerty)"
msgstr "чешка — qwerty"
-#: ../rules/base.xml.in.h:399
+#: ../rules/base.xml.in.h:400
msgid "Czech (qwerty, extended Backslash)"
msgstr "чешка — qwerty с „\\“"
-#: ../rules/base.xml.in.h:400
+#: ../rules/base.xml.in.h:401
msgid "Czech (UCW layout, accented letters only)"
msgstr "чешка — UCW, само букви с надредни знаци"
-#: ../rules/base.xml.in.h:401
+#: ../rules/base.xml.in.h:402
msgid "Czech (US Dvorak with CZ UCW support)"
msgstr "чешка — американски Дворак с поддръжка на UCW"
#. Keyboard indicator for Danish layouts
-#: ../rules/base.xml.in.h:403 ../rules/base.extras.xml.in.h:76
+#: ../rules/base.xml.in.h:404 ../rules/base.extras.xml.in.h:77
msgid "da"
msgstr "Дтс"
-#: ../rules/base.xml.in.h:404 ../rules/base.extras.xml.in.h:77
+#: ../rules/base.xml.in.h:405 ../rules/base.extras.xml.in.h:78
msgid "Danish"
msgstr "датска"
-#: ../rules/base.xml.in.h:405
+#: ../rules/base.xml.in.h:406
msgid "Danish (eliminate dead keys)"
msgstr "датска — без „мъртви“ клавиши"
-#: ../rules/base.xml.in.h:406
+#: ../rules/base.xml.in.h:407
msgid "Danish (Macintosh)"
msgstr "датска — за Макинтош"
-#: ../rules/base.xml.in.h:407
+#: ../rules/base.xml.in.h:408
msgid "Danish (Macintosh, eliminate dead keys)"
msgstr "датска — за Макинтош, без „мъртви“ клавиши"
-#: ../rules/base.xml.in.h:408
+#: ../rules/base.xml.in.h:409
msgid "Danish (Dvorak)"
msgstr "датска — Дворак"
#. Keyboard indicator for Dutch layouts
-#: ../rules/base.xml.in.h:410 ../rules/base.extras.xml.in.h:79
+#: ../rules/base.xml.in.h:411 ../rules/base.extras.xml.in.h:80
msgid "nl"
msgstr "Хлн"
-#: ../rules/base.xml.in.h:411 ../rules/base.extras.xml.in.h:80
+#: ../rules/base.xml.in.h:412 ../rules/base.extras.xml.in.h:81
msgid "Dutch"
msgstr "холандска"
-#: ../rules/base.xml.in.h:412
+#: ../rules/base.xml.in.h:413
msgid "Dutch (Sun dead keys)"
msgstr "холандска — с „мъртви“ клавиши на Sun"
-#: ../rules/base.xml.in.h:413
+#: ../rules/base.xml.in.h:414
msgid "Dutch (Macintosh)"
msgstr "холандска — за Макинтош"
-#: ../rules/base.xml.in.h:414
+#: ../rules/base.xml.in.h:415
msgid "Dutch (standard)"
msgstr "холандска — стандартна"
#. Keyboard indicator for Dzongkha layouts
-#: ../rules/base.xml.in.h:416
+#: ../rules/base.xml.in.h:417
msgid "dz"
msgstr "Дзн"
-#: ../rules/base.xml.in.h:417
+#: ../rules/base.xml.in.h:418
msgid "Dzongkha"
msgstr "дзонка"
#. Keyboard indicator for Estonian layouts
-#: ../rules/base.xml.in.h:419 ../rules/base.extras.xml.in.h:82
+#: ../rules/base.xml.in.h:420 ../rules/base.extras.xml.in.h:83
msgid "et"
msgstr "Ест"
-#: ../rules/base.xml.in.h:420 ../rules/base.extras.xml.in.h:83
+#: ../rules/base.xml.in.h:421 ../rules/base.extras.xml.in.h:84
msgid "Estonian"
msgstr "естонска"
-#: ../rules/base.xml.in.h:421
+#: ../rules/base.xml.in.h:422
msgid "Estonian (eliminate dead keys)"
msgstr "естонска — без „мъртви“ клавиши"
-#: ../rules/base.xml.in.h:422
+#: ../rules/base.xml.in.h:423
msgid "Estonian (Dvorak)"
msgstr "естонска — Дворак"
-#: ../rules/base.xml.in.h:423
+#: ../rules/base.xml.in.h:424
msgid "Estonian (US keyboard with Estonian letters)"
msgstr "естонска — американска с естонски букви"
-#: ../rules/base.xml.in.h:424 ../rules/base.extras.xml.in.h:16
+#: ../rules/base.xml.in.h:425 ../rules/base.extras.xml.in.h:16
msgid "Persian"
msgstr "персийска"
-#: ../rules/base.xml.in.h:425
+#: ../rules/base.xml.in.h:426
msgid "Persian (with Persian Keypad)"
msgstr "персийска — с персийска цифрова клавиатура"
#. Keyboard indicator for Kurdish layouts
-#: ../rules/base.xml.in.h:427
+#: ../rules/base.xml.in.h:428
msgid "ku"
msgstr "Крд"
-#: ../rules/base.xml.in.h:428
+#: ../rules/base.xml.in.h:429
msgid "Kurdish (Iran, Latin Q)"
msgstr "кюрдска — иранска, латиница, „Q“ горе-вляво"
-#: ../rules/base.xml.in.h:429
+#: ../rules/base.xml.in.h:430
msgid "Kurdish (Iran, F)"
msgstr "кюрдска — иранска, „F“ горе-вляво"
-#: ../rules/base.xml.in.h:430
+#: ../rules/base.xml.in.h:431
msgid "Kurdish (Iran, Latin Alt-Q)"
msgstr "кюрдска — иранска, латиница, „Q“ горе-вляво, алтернативна"
-#: ../rules/base.xml.in.h:431
+#: ../rules/base.xml.in.h:432
msgid "Kurdish (Iran, Arabic-Latin)"
msgstr "кюрдска — иранска, арабски и латински букви"
-#: ../rules/base.xml.in.h:432
+#: ../rules/base.xml.in.h:433
msgid "Iraqi"
msgstr "иракска"
-#: ../rules/base.xml.in.h:433
+#: ../rules/base.xml.in.h:434
msgid "Kurdish (Iraq, Latin Q)"
msgstr "кюрдска — иракска, латиница, „Q“ горе-вляво"
-#: ../rules/base.xml.in.h:434
+#: ../rules/base.xml.in.h:435
msgid "Kurdish (Iraq, F)"
msgstr "кюрдска — иракска, „F“ горе-вляво"
-#: ../rules/base.xml.in.h:435
+#: ../rules/base.xml.in.h:436
msgid "Kurdish (Iraq, Latin Alt-Q)"
msgstr "кюрдска — иракска, латиница, „Q“ горе-вляво, алтернативна"
-#: ../rules/base.xml.in.h:436
+#: ../rules/base.xml.in.h:437
msgid "Kurdish (Iraq, Arabic-Latin)"
msgstr "кюрдска — иракска, арабски и латински букви"
#. Keyboard indicator for Faroese layouts
-#: ../rules/base.xml.in.h:438
+#: ../rules/base.xml.in.h:439
msgid "fo"
msgstr "Фрр"
-#: ../rules/base.xml.in.h:439
+#: ../rules/base.xml.in.h:440
msgid "Faroese"
msgstr "фарьорска"
-#: ../rules/base.xml.in.h:440
+#: ../rules/base.xml.in.h:441
msgid "Faroese (eliminate dead keys)"
msgstr "фарьорска — без „мъртви“ клавиши"
#. Keyboard indicator for Finnish layouts
-#: ../rules/base.xml.in.h:442 ../rules/base.extras.xml.in.h:85
+#: ../rules/base.xml.in.h:443 ../rules/base.extras.xml.in.h:86
msgid "fi"
msgstr "Фнл"
-#: ../rules/base.xml.in.h:443 ../rules/base.extras.xml.in.h:86
+#: ../rules/base.xml.in.h:444 ../rules/base.extras.xml.in.h:87
msgid "Finnish"
msgstr "финландска"
-#: ../rules/base.xml.in.h:444
+#: ../rules/base.xml.in.h:445
msgid "Finnish (classic)"
msgstr "финландска — класическа"
-#: ../rules/base.xml.in.h:445
+#: ../rules/base.xml.in.h:446
msgid "Finnish (classic, eliminate dead keys)"
msgstr "финландска — класическа, без „мъртви“ клавиши"
-#: ../rules/base.xml.in.h:446
+#: ../rules/base.xml.in.h:447
msgid "Northern Saami (Finland)"
msgstr "северносамска — финландска"
-#: ../rules/base.xml.in.h:447
+#: ../rules/base.xml.in.h:448
msgid "Finnish (Macintosh)"
msgstr "финландска — за Макинтош"
-#: ../rules/base.xml.in.h:448 ../rules/base.extras.xml.in.h:88
+#: ../rules/base.xml.in.h:449 ../rules/base.extras.xml.in.h:89
msgid "French"
msgstr "френска"
-#: ../rules/base.xml.in.h:449
+#: ../rules/base.xml.in.h:450
msgid "French (eliminate dead keys)"
msgstr "френска — без „мъртви“ клавиши"
-#: ../rules/base.xml.in.h:450
+#: ../rules/base.xml.in.h:451
msgid "French (Sun dead keys)"
msgstr "френска — с „мъртви“ клавиши на Sun"
-#: ../rules/base.xml.in.h:451
+#: ../rules/base.xml.in.h:452
msgid "French (alternative)"
msgstr "френска — алтернативна"
-#: ../rules/base.xml.in.h:452
+#: ../rules/base.xml.in.h:453
msgid "French (alternative, Latin-9 only)"
msgstr "френска — алтернативна, само латиница по Latin-9"
-#: ../rules/base.xml.in.h:453
+#: ../rules/base.xml.in.h:454
msgid "French (alternative, eliminate dead keys)"
msgstr "френска — алтернативна, без „мъртви“ клавиши"
-#: ../rules/base.xml.in.h:454
+#: ../rules/base.xml.in.h:455
msgid "French (alternative, Sun dead keys)"
msgstr "френска — алтернативна, с „мъртви“ клавиши на Sun"
-#: ../rules/base.xml.in.h:455
+#: ../rules/base.xml.in.h:456
msgid "French (legacy, alternative)"
msgstr "френска — алтернативна, остаряла"
-#: ../rules/base.xml.in.h:456
+#: ../rules/base.xml.in.h:457
msgid "French (legacy, alternative, eliminate dead keys)"
msgstr "френска — алтернативна, остаряла, без „мъртви“ клавиши"
-#: ../rules/base.xml.in.h:457
+#: ../rules/base.xml.in.h:458
msgid "French (legacy, alternative, Sun dead keys)"
msgstr "френска — алтернативна, остаряла, с „мъртви“ клавиши на Sun"
-#: ../rules/base.xml.in.h:458
+#: ../rules/base.xml.in.h:459
msgid "French (Bepo, ergonomic, Dvorak way)"
msgstr "френска — Дворак, bépo, ергономична"
-#: ../rules/base.xml.in.h:459
+#: ../rules/base.xml.in.h:460
msgid "French (Bepo, ergonomic, Dvorak way, Latin-9 only)"
msgstr "френска — Дворак, bépo, ергономична, само латиница по Latin-9"
-#: ../rules/base.xml.in.h:460
+#: ../rules/base.xml.in.h:461
msgid "French (Dvorak)"
msgstr "френска — Дворак"
-#: ../rules/base.xml.in.h:461
+#: ../rules/base.xml.in.h:462
msgid "French (Macintosh)"
msgstr "френска — за Макинтош"
-#: ../rules/base.xml.in.h:462
+#: ../rules/base.xml.in.h:463
msgid "French (Breton)"
msgstr "френска — бретонска"
-#: ../rules/base.xml.in.h:463
+#: ../rules/base.xml.in.h:464
msgid "Occitan"
msgstr "провансалска"
-#: ../rules/base.xml.in.h:464
+#: ../rules/base.xml.in.h:465
msgid "Georgian (France, AZERTY Tskapo)"
msgstr "грузинска — azerty на Цкапо"
-#: ../rules/base.xml.in.h:465
+#: ../rules/base.xml.in.h:466
msgid "English (Ghana)"
msgstr "английска — ганайска"
-#: ../rules/base.xml.in.h:466
+#: ../rules/base.xml.in.h:467
msgid "English (Ghana, multilingual)"
msgstr "английска — ганайска, международна"
#. Keyboard indicator for Akan layouts
-#: ../rules/base.xml.in.h:468
+#: ../rules/base.xml.in.h:469
msgid "ak"
msgstr "Акн"
-#: ../rules/base.xml.in.h:469
+#: ../rules/base.xml.in.h:470
msgid "Akan"
msgstr "аканска"
#. Keyboard indicator for Ewe layouts
-#: ../rules/base.xml.in.h:471
+#: ../rules/base.xml.in.h:472
msgid "ee"
msgstr "Еве"
-#: ../rules/base.xml.in.h:472
+#: ../rules/base.xml.in.h:473
msgid "Ewe"
msgstr "еве"
#. Keyboard indicator for Fula layouts
-#: ../rules/base.xml.in.h:474
+#: ../rules/base.xml.in.h:475
msgid "ff"
msgstr "Фла"
-#: ../rules/base.xml.in.h:475
+#: ../rules/base.xml.in.h:476
msgid "Fula"
msgstr "фула"
#. Keyboard indicator for Ga layouts
-#: ../rules/base.xml.in.h:477
+#: ../rules/base.xml.in.h:478
msgid "gaa"
msgstr "Га "
-#: ../rules/base.xml.in.h:478
+#: ../rules/base.xml.in.h:479
msgid "Ga"
msgstr "га"
#. Keyboard indicator for Hausa layouts
-#: ../rules/base.xml.in.h:480
+#: ../rules/base.xml.in.h:481
msgid "ha"
msgstr "Хск"
-#: ../rules/base.xml.in.h:481
+#: ../rules/base.xml.in.h:482
msgid "Hausa"
msgstr "хауска"
#. Keyboard indicator for Avatime layouts
-#: ../rules/base.xml.in.h:483
+#: ../rules/base.xml.in.h:484
msgid "avn"
msgstr "Авт"
-#: ../rules/base.xml.in.h:484
+#: ../rules/base.xml.in.h:485
msgid "Avatime"
msgstr "аватимска"
-#: ../rules/base.xml.in.h:485
+#: ../rules/base.xml.in.h:486
msgid "English (Ghana, GILLBT)"
msgstr "английска — ганайска, GILLBT"
-#: ../rules/base.xml.in.h:486
+#: ../rules/base.xml.in.h:487
msgid "French (Guinea)"
msgstr "френска — гвинейска"
#. Keyboard indicator for Georgian layouts
-#: ../rules/base.xml.in.h:488
+#: ../rules/base.xml.in.h:489
msgid "ka"
msgstr "Грз"
-#: ../rules/base.xml.in.h:489
+#: ../rules/base.xml.in.h:490
msgid "Georgian"
msgstr "грузинска"
-#: ../rules/base.xml.in.h:490
+#: ../rules/base.xml.in.h:491
msgid "Georgian (ergonomic)"
msgstr "грузинска — ергономична"
-#: ../rules/base.xml.in.h:491
+#: ../rules/base.xml.in.h:492
msgid "Georgian (MESS)"
msgstr "грузинска — MESS"
-#: ../rules/base.xml.in.h:492
+#: ../rules/base.xml.in.h:493
msgid "Russian (Georgia)"
msgstr "руска — грузинска"
-#: ../rules/base.xml.in.h:493
+#: ../rules/base.xml.in.h:494
msgid "Ossetian (Georgia)"
msgstr "осетинска — грузинска"
-#: ../rules/base.xml.in.h:494 ../rules/base.extras.xml.in.h:11
+#: ../rules/base.xml.in.h:495 ../rules/base.extras.xml.in.h:11
msgid "German"
msgstr "немска"
-#: ../rules/base.xml.in.h:495
+#: ../rules/base.xml.in.h:496
msgid "German (dead acute)"
msgstr "немска — с „мъртво“ ударение"
-#: ../rules/base.xml.in.h:496
+#: ../rules/base.xml.in.h:497
msgid "German (dead grave acute)"
msgstr "немска — с „мъртво“ тежко ударение"
-#: ../rules/base.xml.in.h:497
+#: ../rules/base.xml.in.h:498
msgid "German (eliminate dead keys)"
msgstr "немска — без „мъртви“ клавиши"
-#: ../rules/base.xml.in.h:498
+#: ../rules/base.xml.in.h:499
msgid "German (T3)"
msgstr "немска — T3"
-#: ../rules/base.xml.in.h:499
+#: ../rules/base.xml.in.h:500
msgid "Romanian (Germany)"
msgstr "румънска — немска"
-#: ../rules/base.xml.in.h:500
+#: ../rules/base.xml.in.h:501
msgid "Romanian (Germany, eliminate dead keys)"
msgstr "немска — немска, без „мъртви“ клавиши"
-#: ../rules/base.xml.in.h:501
+#: ../rules/base.xml.in.h:502
msgid "German (Dvorak)"
msgstr "немска — Дворак"
-#: ../rules/base.xml.in.h:502
+#: ../rules/base.xml.in.h:503
msgid "German (Sun dead keys)"
msgstr "немска — с „мъртви“ клавиши на Sun"
-#: ../rules/base.xml.in.h:503
+#: ../rules/base.xml.in.h:504
msgid "German (Neo 2)"
msgstr "немска — Neo 2, добавени гръцки букви"
-#: ../rules/base.xml.in.h:504
+#: ../rules/base.xml.in.h:505
msgid "German (Macintosh)"
msgstr "немска — за Макинтош"
-#: ../rules/base.xml.in.h:505
+#: ../rules/base.xml.in.h:506
msgid "German (Macintosh, eliminate dead keys)"
msgstr "немска — за Макинтош, без „мъртви“ клавиши"
-#: ../rules/base.xml.in.h:506
+#: ../rules/base.xml.in.h:507
msgid "Lower Sorbian"
msgstr "долно сорбска"
-#: ../rules/base.xml.in.h:507
+#: ../rules/base.xml.in.h:508
msgid "Lower Sorbian (qwertz)"
msgstr "долно сорбска — qwertz"
-#: ../rules/base.xml.in.h:508
+#: ../rules/base.xml.in.h:509
msgid "German (qwerty)"
msgstr "немска — qwerty"
-#: ../rules/base.xml.in.h:509
+#: ../rules/base.xml.in.h:510
msgid "Russian (Germany, phonetic)"
msgstr "руска — германска, фонетична"
-#: ../rules/base.xml.in.h:510
+#: ../rules/base.xml.in.h:511
msgid "German (legacy)"
msgstr "немска — остаряла"
#. Keyboard indicator for Greek layouts
-#: ../rules/base.xml.in.h:512 ../rules/base.extras.xml.in.h:90
+#: ../rules/base.xml.in.h:513 ../rules/base.extras.xml.in.h:91
msgid "gr"
msgstr "Грц"
-#: ../rules/base.xml.in.h:513 ../rules/base.extras.xml.in.h:91
+#: ../rules/base.xml.in.h:514 ../rules/base.extras.xml.in.h:92
msgid "Greek"
msgstr "гръцка"
-#: ../rules/base.xml.in.h:514
+#: ../rules/base.xml.in.h:515
msgid "Greek (simple)"
msgstr "гръцка — опростена"
-#: ../rules/base.xml.in.h:515
+#: ../rules/base.xml.in.h:516
msgid "Greek (extended)"
msgstr "гръцка — разширена"
-#: ../rules/base.xml.in.h:516
+#: ../rules/base.xml.in.h:517
msgid "Greek (eliminate dead keys)"
msgstr "гръцка — без „мъртви“ клавиши"
-#: ../rules/base.xml.in.h:517
+#: ../rules/base.xml.in.h:518
msgid "Greek (polytonic)"
msgstr "гръцка — политонална"
#. Keyboard indicator for Hungarian layouts
-#: ../rules/base.xml.in.h:519
+#: ../rules/base.xml.in.h:520
msgid "hu"
msgstr "Унг"
-#: ../rules/base.xml.in.h:520
+#: ../rules/base.xml.in.h:521
msgid "Hungarian"
msgstr "унгарска"
-#: ../rules/base.xml.in.h:521
+#: ../rules/base.xml.in.h:522
msgid "Hungarian (standard)"
msgstr "унгарска — стандартна"
-#: ../rules/base.xml.in.h:522
+#: ../rules/base.xml.in.h:523
msgid "Hungarian (eliminate dead keys)"
msgstr "унгарска — без „мъртви“ клавиши"
-#: ../rules/base.xml.in.h:523
+#: ../rules/base.xml.in.h:524
msgid "Hungarian (qwerty)"
msgstr "унгарска — qwerty"
-#: ../rules/base.xml.in.h:524
+#: ../rules/base.xml.in.h:525
msgid "Hungarian (101/qwertz/comma/dead keys)"
msgstr "унгарска — 101 клавиша, qwertz, „,“, с „мъртви“ клавиши"
-#: ../rules/base.xml.in.h:525
+#: ../rules/base.xml.in.h:526
msgid "Hungarian (101/qwertz/comma/eliminate dead keys)"
msgstr "унгарска — 101 клавиша, qwertz, „,“, без „мъртви“ клавиши"
-#: ../rules/base.xml.in.h:526
+#: ../rules/base.xml.in.h:527
msgid "Hungarian (101/qwertz/dot/dead keys)"
msgstr "унгарска — 101 клавиша, qwertz, „.“, с „мъртви“ клавиши"
-#: ../rules/base.xml.in.h:527
+#: ../rules/base.xml.in.h:528
msgid "Hungarian (101/qwertz/dot/eliminate dead keys)"
msgstr "унгарска — 101 клавиша, qwertz, „.“, без „мъртви“ клавиши"
-#: ../rules/base.xml.in.h:528
+#: ../rules/base.xml.in.h:529
msgid "Hungarian (101/qwerty/comma/dead keys)"
msgstr "унгарска — 101 клавиша, qwerty, „,“, с „мъртви“ клавиши"
-#: ../rules/base.xml.in.h:529
+#: ../rules/base.xml.in.h:530
msgid "Hungarian (101/qwerty/comma/eliminate dead keys)"
msgstr "унгарска — 101 клавиша, qwerty, „,“, без „мъртви“ клавиши"
-#: ../rules/base.xml.in.h:530
+#: ../rules/base.xml.in.h:531
msgid "Hungarian (101/qwerty/dot/dead keys)"
msgstr "унгарска — 101 клавиша, qwerty, „.“, с „мъртви“ клавиши"
-#: ../rules/base.xml.in.h:531
+#: ../rules/base.xml.in.h:532
msgid "Hungarian (101/qwerty/dot/eliminate dead keys)"
msgstr "унгарска — 101 клавиша, qwerty, „.“, без „мъртви“ клавиши"
-#: ../rules/base.xml.in.h:532
+#: ../rules/base.xml.in.h:533
msgid "Hungarian (102/qwertz/comma/dead keys)"
msgstr "унгарска — 102 клавиша, qwertz, „,“, с „мъртви“ клавиши"
-#: ../rules/base.xml.in.h:533
+#: ../rules/base.xml.in.h:534
msgid "Hungarian (102/qwertz/comma/eliminate dead keys)"
msgstr "унгарска — 102 клавиша, qwertz, „,“, без „мъртви“ клавиши"
-#: ../rules/base.xml.in.h:534
+#: ../rules/base.xml.in.h:535
msgid "Hungarian (102/qwertz/dot/dead keys)"
msgstr "унгарска — 102 клавиша, qwertz, „.“, с „мъртви“ клавиши"
-#: ../rules/base.xml.in.h:535
+#: ../rules/base.xml.in.h:536
msgid "Hungarian (102/qwertz/dot/eliminate dead keys)"
msgstr "унгарска — 102 клавиша, qwertz, „.“, без „мъртви“ клавиши"
-#: ../rules/base.xml.in.h:536
+#: ../rules/base.xml.in.h:537
msgid "Hungarian (102/qwerty/comma/dead keys)"
msgstr "унгарска — 102 клавиша, qwerty, „,“, с „мъртви“ клавиши"
-#: ../rules/base.xml.in.h:537
+#: ../rules/base.xml.in.h:538
msgid "Hungarian (102/qwerty/comma/eliminate dead keys)"
msgstr "унгарска — 102 клавиша, qwerty, „,“, без „мъртви“ клавиши"
-#: ../rules/base.xml.in.h:538
+#: ../rules/base.xml.in.h:539
msgid "Hungarian (102/qwerty/dot/dead keys)"
msgstr "унгарска — 102 клавиша, qwerty, „.“, с „мъртви“ клавиши"
-#: ../rules/base.xml.in.h:539
+#: ../rules/base.xml.in.h:540
msgid "Hungarian (102/qwerty/dot/eliminate dead keys)"
msgstr "унгарска — 102 клавиша, qwerty, „.“, без „мъртви“ клавиши"
#. Keyboard indicator for Icelandic layouts
-#: ../rules/base.xml.in.h:541
+#: ../rules/base.xml.in.h:542
msgid "is"
msgstr "Еск"
-#: ../rules/base.xml.in.h:542
+#: ../rules/base.xml.in.h:543
msgid "Icelandic"
msgstr "исландска"
-#: ../rules/base.xml.in.h:543
+#: ../rules/base.xml.in.h:544
msgid "Icelandic (Sun dead keys)"
msgstr "исландска — с „мъртви“ клавиши на Sun"
-#: ../rules/base.xml.in.h:544
+#: ../rules/base.xml.in.h:545
msgid "Icelandic (eliminate dead keys)"
msgstr "исландска — без „мъртви“ клавиши"
-#: ../rules/base.xml.in.h:545
+#: ../rules/base.xml.in.h:546
msgid "Icelandic (Macintosh)"
msgstr "исландска — за Макинтош"
-#: ../rules/base.xml.in.h:546
+#: ../rules/base.xml.in.h:547
msgid "Icelandic (Dvorak)"
msgstr "исландска — Дворак"
#. Keyboard indicator for Hebrew layouts
-#: ../rules/base.xml.in.h:548 ../rules/base.extras.xml.in.h:61
+#: ../rules/base.xml.in.h:549 ../rules/base.extras.xml.in.h:62
msgid "he"
msgstr "Ивр"
-#: ../rules/base.xml.in.h:549 ../rules/base.extras.xml.in.h:62
+#: ../rules/base.xml.in.h:550 ../rules/base.extras.xml.in.h:63
msgid "Hebrew"
msgstr "иврит"
-#: ../rules/base.xml.in.h:550
+#: ../rules/base.xml.in.h:551
msgid "Hebrew (lyx)"
msgstr "иврит — LyX"
-#: ../rules/base.xml.in.h:551
+#: ../rules/base.xml.in.h:552
msgid "Hebrew (phonetic)"
msgstr "иврит — фонетична"
-#: ../rules/base.xml.in.h:552
+#: ../rules/base.xml.in.h:553
msgid "Hebrew (Biblical, Tiro)"
msgstr "иврит — библейска, Тиро"
#. Keyboard indicator for Italian layouts
-#: ../rules/base.xml.in.h:554 ../rules/base.extras.xml.in.h:93
+#: ../rules/base.xml.in.h:555 ../rules/base.extras.xml.in.h:94
msgid "it"
msgstr "Итл"
-#: ../rules/base.xml.in.h:555 ../rules/base.extras.xml.in.h:94
+#: ../rules/base.xml.in.h:556 ../rules/base.extras.xml.in.h:95
msgid "Italian"
msgstr "италианска"
-#: ../rules/base.xml.in.h:556
+#: ../rules/base.xml.in.h:557
msgid "Italian (eliminate dead keys)"
msgstr "италианска — без „мъртви“ клавиши"
-#: ../rules/base.xml.in.h:557
+#: ../rules/base.xml.in.h:558
msgid "Italian (Macintosh)"
msgstr "италианска — за Макинтош"
-#: ../rules/base.xml.in.h:558
+#: ../rules/base.xml.in.h:559
msgid "Italian (US keyboard with Italian letters)"
msgstr "италианска — американска с италиански букви"
-#: ../rules/base.xml.in.h:559
+#: ../rules/base.xml.in.h:560
msgid "Georgian (Italy)"
msgstr "грузинска — италианска"
-#: ../rules/base.xml.in.h:560
+#: ../rules/base.xml.in.h:561
msgid "Italian (IBM 142)"
msgstr "италианска — IBM 142"
#. Keyboard indicator for Japanese layouts
-#: ../rules/base.xml.in.h:562 ../rules/base.extras.xml.in.h:96
+#: ../rules/base.xml.in.h:563 ../rules/base.extras.xml.in.h:97
msgid "ja"
msgstr "Япн"
-#: ../rules/base.xml.in.h:563 ../rules/base.extras.xml.in.h:97
+#: ../rules/base.xml.in.h:564 ../rules/base.extras.xml.in.h:98
msgid "Japanese"
msgstr "японска"
-#: ../rules/base.xml.in.h:564
+#: ../rules/base.xml.in.h:565
msgid "Japanese (Kana)"
msgstr "японска — кана"
-#: ../rules/base.xml.in.h:565
+#: ../rules/base.xml.in.h:566
msgid "Japanese (Kana 86)"
msgstr "японска — кана 86"
-#: ../rules/base.xml.in.h:566
+#: ../rules/base.xml.in.h:567
msgid "Japanese (OADG 109A)"
msgstr "японска — OADG 109A"
-#: ../rules/base.xml.in.h:567
+#: ../rules/base.xml.in.h:568
msgid "Japanese (Macintosh)"
msgstr "японска — за Макинтош"
-#: ../rules/base.xml.in.h:568
+#: ../rules/base.xml.in.h:569
msgid "Japanese (Dvorak)"
msgstr "японска — Дворак"
#. Keyboard indicator for Kikuyu layouts
-#: ../rules/base.xml.in.h:570
+#: ../rules/base.xml.in.h:571
msgid "ki"
msgstr "Крг"
-#: ../rules/base.xml.in.h:571
+#: ../rules/base.xml.in.h:572
msgid "Kyrgyz"
msgstr "киргистанска"
-#: ../rules/base.xml.in.h:572
+#: ../rules/base.xml.in.h:573
msgid "Kyrgyz (phonetic)"
msgstr "киргистанска — фонетична"
#. Keyboard indicator for Khmer layouts
-#: ../rules/base.xml.in.h:574
+#: ../rules/base.xml.in.h:575
msgid "km"
msgstr "Кхм"
-#: ../rules/base.xml.in.h:575
+#: ../rules/base.xml.in.h:576
msgid "Khmer (Cambodia)"
msgstr "кхмерска — камбоджанска"
#. Keyboard indicator for Kazakh layouts
-#: ../rules/base.xml.in.h:577
+#: ../rules/base.xml.in.h:578
msgid "kk"
msgstr "Кзх"
-#: ../rules/base.xml.in.h:578
+#: ../rules/base.xml.in.h:579
msgid "Kazakh"
msgstr "казахска"
-#: ../rules/base.xml.in.h:579
+#: ../rules/base.xml.in.h:580
msgid "Russian (Kazakhstan, with Kazakh)"
msgstr "руска — казахстанска, за казахски"
-#: ../rules/base.xml.in.h:580
+#: ../rules/base.xml.in.h:581
msgid "Kazakh (with Russian)"
msgstr "казахска с руски букви"
#. Keyboard indicator for Lao layouts
-#: ../rules/base.xml.in.h:582
+#: ../rules/base.xml.in.h:583
msgid "lo"
msgstr "Лск"
-#: ../rules/base.xml.in.h:583
+#: ../rules/base.xml.in.h:584
msgid "Lao"
msgstr "лаоска"
-#: ../rules/base.xml.in.h:584
+#: ../rules/base.xml.in.h:585
msgid "Lao (STEA proposed standard layout)"
msgstr "лаоска — стандартна подредба по STEA"
#. Keyboard indicator for Spanish layouts
-#: ../rules/base.xml.in.h:586 ../rules/base.extras.xml.in.h:109
+#: ../rules/base.xml.in.h:587 ../rules/base.extras.xml.in.h:110
msgid "es"
msgstr "Исп"
-#: ../rules/base.xml.in.h:587
+#: ../rules/base.xml.in.h:588
msgid "Spanish (Latin American)"
msgstr "испанска — латиноамериканска"
-#: ../rules/base.xml.in.h:588
+#: ../rules/base.xml.in.h:589
msgid "Spanish (Latin American, eliminate dead keys)"
msgstr "испанска — латиноамериканска, без „мъртви“ клавиши"
-#: ../rules/base.xml.in.h:589
+#: ../rules/base.xml.in.h:590
msgid "Spanish (Latin American, include dead tilde)"
msgstr "испанска — латиноамериканска, с мъртва „~“"
-#: ../rules/base.xml.in.h:590
+#: ../rules/base.xml.in.h:591
msgid "Spanish (Latin American, Sun dead keys)"
msgstr "испанска — латиноамериканска, с „мъртви“ клавиши на Sun"
#. Keyboard indicator for Lithuanian layouts
-#: ../rules/base.xml.in.h:592 ../rules/base.extras.xml.in.h:18
+#: ../rules/base.xml.in.h:593 ../rules/base.extras.xml.in.h:18
msgid "lt"
msgstr "Лит"
-#: ../rules/base.xml.in.h:593 ../rules/base.extras.xml.in.h:19
+#: ../rules/base.xml.in.h:594 ../rules/base.extras.xml.in.h:19
msgid "Lithuanian"
msgstr "литовска"
-#: ../rules/base.xml.in.h:594
+#: ../rules/base.xml.in.h:595
msgid "Lithuanian (standard)"
msgstr "литовска — стандартна"
-#: ../rules/base.xml.in.h:595
+#: ../rules/base.xml.in.h:596
msgid "Lithuanian (US keyboard with Lithuanian letters)"
msgstr "литовска — американска с литовски букви"
-#: ../rules/base.xml.in.h:596
+#: ../rules/base.xml.in.h:597
msgid "Lithuanian (IBM LST 1205-92)"
msgstr "литовска — IBM LST 1205-92"
-#: ../rules/base.xml.in.h:597
+#: ../rules/base.xml.in.h:598
msgid "Lithuanian (LEKP)"
msgstr "литовска — LEKP"
-#: ../rules/base.xml.in.h:598
+#: ../rules/base.xml.in.h:599
msgid "Lithuanian (LEKPa)"
msgstr "литовска — LEKPa"
#. Keyboard indicator for Latvian layouts
-#: ../rules/base.xml.in.h:600 ../rules/base.extras.xml.in.h:22
+#: ../rules/base.xml.in.h:601 ../rules/base.extras.xml.in.h:22
msgid "lv"
msgstr "Лат"
-#: ../rules/base.xml.in.h:601 ../rules/base.extras.xml.in.h:23
+#: ../rules/base.xml.in.h:602 ../rules/base.extras.xml.in.h:23
msgid "Latvian"
msgstr "латвийска"
-#: ../rules/base.xml.in.h:602
+#: ../rules/base.xml.in.h:603
msgid "Latvian (apostrophe variant)"
msgstr "латвийска — с „'“"
-#: ../rules/base.xml.in.h:603
+#: ../rules/base.xml.in.h:604
msgid "Latvian (tilde variant)"
msgstr "латвийска — с „~“"
-#: ../rules/base.xml.in.h:604
+#: ../rules/base.xml.in.h:605
msgid "Latvian (F variant)"
msgstr "латвийска — с „F“"
-#: ../rules/base.xml.in.h:605
+#: ../rules/base.xml.in.h:606
msgid "Latvian (modern)"
msgstr "латвийска — модерна"
-#: ../rules/base.xml.in.h:606
+#: ../rules/base.xml.in.h:607
msgid "Latvian (ergonomic, ŪGJRMV)"
msgstr "латвийска — ергономична, ūgjrmv"
-#: ../rules/base.xml.in.h:607
+#: ../rules/base.xml.in.h:608
msgid "Latvian (adapted)"
msgstr "латвийска — адаптирана"
#. Keyboard indicator for Maori layouts
-#: ../rules/base.xml.in.h:609
+#: ../rules/base.xml.in.h:610
msgid "mi"
msgstr "Мрс"
-#: ../rules/base.xml.in.h:610
+#: ../rules/base.xml.in.h:611
msgid "Maori"
msgstr "маорска"
#. Keyboard indicator for Serbian layouts
-#: ../rules/base.xml.in.h:612 ../rules/base.extras.xml.in.h:51
+#: ../rules/base.xml.in.h:613 ../rules/base.extras.xml.in.h:52
msgid "sr"
msgstr "Срб"
-#: ../rules/base.xml.in.h:613
+#: ../rules/base.xml.in.h:614
msgid "Montenegrin"
msgstr "черногорска"
-#: ../rules/base.xml.in.h:614
+#: ../rules/base.xml.in.h:615
msgid "Montenegrin (Cyrillic)"
msgstr "черногорска — кирилица"
-#: ../rules/base.xml.in.h:615
+#: ../rules/base.xml.in.h:616
msgid "Montenegrin (Cyrillic, Z and ZHE swapped)"
msgstr "черногорска — кирилица с разменени „З“ и „Ж“"
-#: ../rules/base.xml.in.h:616
+#: ../rules/base.xml.in.h:617
msgid "Montenegrin (Latin Unicode)"
msgstr "черногорска — латиница за Уникод"
-#: ../rules/base.xml.in.h:617
+#: ../rules/base.xml.in.h:618
msgid "Montenegrin (Latin qwerty)"
msgstr "черногорска — латиница, qwerty"
-#: ../rules/base.xml.in.h:618
+#: ../rules/base.xml.in.h:619
msgid "Montenegrin (Latin Unicode qwerty)"
msgstr "черногорска — латиница за Уникод, qwerty"
-#: ../rules/base.xml.in.h:619
+#: ../rules/base.xml.in.h:620
msgid "Montenegrin (Cyrillic with guillemets)"
msgstr "черногорска — кирилица с „«»“"
-#: ../rules/base.xml.in.h:620
+#: ../rules/base.xml.in.h:621
msgid "Montenegrin (Latin with guillemets)"
msgstr "черногорска — латиница с „«»“"
#. Keyboard indicator for Macedonian layouts
-#: ../rules/base.xml.in.h:622
+#: ../rules/base.xml.in.h:623
msgid "mk"
msgstr "Мкд"
-#: ../rules/base.xml.in.h:623
+#: ../rules/base.xml.in.h:624
msgid "Macedonian"
msgstr "македонска"
-#: ../rules/base.xml.in.h:624
+#: ../rules/base.xml.in.h:625
msgid "Macedonian (eliminate dead keys)"
msgstr "македонска — без „мъртви“ клавиши"
#. Keyboard indicator for Maltese layouts
-#: ../rules/base.xml.in.h:626
+#: ../rules/base.xml.in.h:627
msgid "mt"
msgstr "Млт"
-#: ../rules/base.xml.in.h:627
+#: ../rules/base.xml.in.h:628
msgid "Maltese"
msgstr "малтийска"
-#: ../rules/base.xml.in.h:628
+#: ../rules/base.xml.in.h:629
msgid "Maltese (with US layout)"
msgstr "малтийска — американска подредба"
#. Keyboard indicator for Mongolian layouts
-#: ../rules/base.xml.in.h:630
+#: ../rules/base.xml.in.h:631
msgid "mn"
msgstr "Мнг"
-#: ../rules/base.xml.in.h:631
+#: ../rules/base.xml.in.h:632
msgid "Mongolian"
msgstr "монголска"
#. Keyboard indicator for Norwegian layouts
-#: ../rules/base.xml.in.h:633 ../rules/base.extras.xml.in.h:101
+#: ../rules/base.xml.in.h:634 ../rules/base.extras.xml.in.h:102
msgid "no"
msgstr "Нрв"
-#: ../rules/base.xml.in.h:634 ../rules/base.extras.xml.in.h:102
+#: ../rules/base.xml.in.h:635 ../rules/base.extras.xml.in.h:103
msgid "Norwegian"
msgstr "норвежка"
-#: ../rules/base.xml.in.h:635
+#: ../rules/base.xml.in.h:636
msgid "Norwegian (eliminate dead keys)"
msgstr "норвежка — без „мъртви“ клавиши"
-#: ../rules/base.xml.in.h:636
+#: ../rules/base.xml.in.h:637
msgid "Norwegian (Dvorak)"
msgstr "норвежка — Дворак"
-#: ../rules/base.xml.in.h:637
+#: ../rules/base.xml.in.h:638
msgid "Northern Saami (Norway)"
msgstr "северносамска — норвежка"
-#: ../rules/base.xml.in.h:638
+#: ../rules/base.xml.in.h:639
msgid "Northern Saami (Norway, eliminate dead keys)"
msgstr "северносамска — норвежка, без „мъртви“ клавиши"
-#: ../rules/base.xml.in.h:639
+#: ../rules/base.xml.in.h:640
msgid "Norwegian (Macintosh)"
msgstr "норвежка — за Макинтош"
-#: ../rules/base.xml.in.h:640
+#: ../rules/base.xml.in.h:641
msgid "Norwegian (Macintosh, eliminate dead keys)"
msgstr "норвежка — за Макинтош, без „мъртви“ клавиши"
-#: ../rules/base.xml.in.h:641
+#: ../rules/base.xml.in.h:642
msgid "Norwegian (Colemak)"
msgstr "норвежка — Коулмак"
#. Keyboard indicator for Polish layouts
-#: ../rules/base.xml.in.h:643 ../rules/base.extras.xml.in.h:40
+#: ../rules/base.xml.in.h:644 ../rules/base.extras.xml.in.h:41
msgid "pl"
msgstr "Плс"
-#: ../rules/base.xml.in.h:644 ../rules/base.extras.xml.in.h:41
+#: ../rules/base.xml.in.h:645 ../rules/base.extras.xml.in.h:42
msgid "Polish"
msgstr "палска"
-#: ../rules/base.xml.in.h:645
+#: ../rules/base.xml.in.h:646
msgid "Polish (legacy)"
msgstr "полска — остаряла"
-#: ../rules/base.xml.in.h:646
+#: ../rules/base.xml.in.h:647
msgid "Polish (qwertz)"
msgstr "полска — qwertz"
-#: ../rules/base.xml.in.h:647
+#: ../rules/base.xml.in.h:648
msgid "Polish (Dvorak)"
msgstr "полска — Дворак"
-#: ../rules/base.xml.in.h:648
+#: ../rules/base.xml.in.h:649
msgid "Polish (Dvorak, Polish quotes on quotemark key)"
msgstr "полска — Дворак, «„”» при «'\"»"
-#: ../rules/base.xml.in.h:649
+#: ../rules/base.xml.in.h:650
msgid "Polish (Dvorak, Polish quotes on key 1)"
msgstr "полска — Дворак, «„”» при «1»"
-#: ../rules/base.xml.in.h:650
+#: ../rules/base.xml.in.h:651
msgid "Kashubian"
msgstr "кашубска"
-#: ../rules/base.xml.in.h:651
+#: ../rules/base.xml.in.h:652
msgid "Russian (Poland, phonetic Dvorak)"
msgstr "руска — полска, фонетична, Дворак"
-#: ../rules/base.xml.in.h:652
+#: ../rules/base.xml.in.h:653
msgid "Polish (programmer Dvorak)"
msgstr "полска — Дворак за програмисти"
-#: ../rules/base.xml.in.h:653 ../rules/base.extras.xml.in.h:104
+#: ../rules/base.xml.in.h:654 ../rules/base.extras.xml.in.h:105
msgid "Portuguese"
msgstr "португалска"
-#: ../rules/base.xml.in.h:654
+#: ../rules/base.xml.in.h:655
msgid "Portuguese (eliminate dead keys)"
msgstr "португалска — без „мъртви“ клавиши"
-#: ../rules/base.xml.in.h:655
+#: ../rules/base.xml.in.h:656
msgid "Portuguese (Sun dead keys)"
msgstr "португалска — с „мъртви“ клавиши на Sun"
-#: ../rules/base.xml.in.h:656
+#: ../rules/base.xml.in.h:657
msgid "Portuguese (Macintosh)"
msgstr "португалска — за Макинтош"
-#: ../rules/base.xml.in.h:657
+#: ../rules/base.xml.in.h:658
msgid "Portuguese (Macintosh, eliminate dead keys)"
msgstr "португалска — за Макинтош, без „мъртви“ клавиши"
-#: ../rules/base.xml.in.h:658
+#: ../rules/base.xml.in.h:659
msgid "Portuguese (Macintosh, Sun dead keys)"
msgstr "португалска — за Макинтош, с „мъртви“ клавиши на Sun"
-#: ../rules/base.xml.in.h:659
+#: ../rules/base.xml.in.h:660
msgid "Portuguese (Nativo)"
msgstr "португалска — нативна"
-#: ../rules/base.xml.in.h:660
+#: ../rules/base.xml.in.h:661
msgid "Portuguese (Nativo for US keyboards)"
msgstr "португалска — нативна за САЩ"
-#: ../rules/base.xml.in.h:661
+#: ../rules/base.xml.in.h:662
msgid "Esperanto (Portugal, Nativo)"
msgstr "есперантска — португалска, нативна"
#. Keyboard indicator for Romanian layouts
-#: ../rules/base.xml.in.h:663 ../rules/base.extras.xml.in.h:45
+#: ../rules/base.xml.in.h:664 ../rules/base.extras.xml.in.h:46
msgid "ro"
msgstr "Рмн"
-#: ../rules/base.xml.in.h:664 ../rules/base.extras.xml.in.h:46
+#: ../rules/base.xml.in.h:665 ../rules/base.extras.xml.in.h:47
msgid "Romanian"
msgstr "румънска"
-#: ../rules/base.xml.in.h:665
+#: ../rules/base.xml.in.h:666
msgid "Romanian (cedilla)"
msgstr "румънска — букви с „¸“"
-#: ../rules/base.xml.in.h:666
+#: ../rules/base.xml.in.h:667
msgid "Romanian (standard)"
msgstr "румънска — стандартна"
-#: ../rules/base.xml.in.h:667
+#: ../rules/base.xml.in.h:668
msgid "Romanian (standard cedilla)"
msgstr "румънска — стандартна, букви с „¸“"
-#: ../rules/base.xml.in.h:668
+#: ../rules/base.xml.in.h:669
msgid "Romanian (WinKeys)"
msgstr "румънска — с клавиши на Windows"
-#: ../rules/base.xml.in.h:669 ../rules/base.extras.xml.in.h:55
+#: ../rules/base.xml.in.h:670 ../rules/base.extras.xml.in.h:56
msgid "Russian"
msgstr "руска"
-#: ../rules/base.xml.in.h:670
+#: ../rules/base.xml.in.h:671
msgid "Russian (phonetic)"
msgstr "руска — фонетична"
-#: ../rules/base.xml.in.h:671
+#: ../rules/base.xml.in.h:672
msgid "Russian (phonetic WinKeys)"
msgstr "руска — фонетична, с клавиши на Windows"
-#: ../rules/base.xml.in.h:672
+#: ../rules/base.xml.in.h:673
msgid "Russian (typewriter)"
msgstr "руска — за пишеща машина"
-#: ../rules/base.xml.in.h:673
+#: ../rules/base.xml.in.h:674
msgid "Russian (legacy)"
msgstr "руска — остаряла"
-#: ../rules/base.xml.in.h:674
+#: ../rules/base.xml.in.h:675
msgid "Russian (typewriter, legacy)"
msgstr "руска — за пишеща машина, остаряла"
-#: ../rules/base.xml.in.h:675
+#: ../rules/base.xml.in.h:676
msgid "Tatar"
msgstr "татарска"
-#: ../rules/base.xml.in.h:676
+#: ../rules/base.xml.in.h:677
msgid "Ossetian (legacy)"
msgstr "осетинска — остаряла"
-#: ../rules/base.xml.in.h:677
+#: ../rules/base.xml.in.h:678
msgid "Ossetian (WinKeys)"
msgstr "осетинска — с клавиши на Windows"
-#: ../rules/base.xml.in.h:678
+#: ../rules/base.xml.in.h:679
msgid "Chuvash"
msgstr "чувашка"
-#: ../rules/base.xml.in.h:679
+#: ../rules/base.xml.in.h:680
msgid "Chuvash (Latin)"
msgstr "чувашка — латиница"
-#: ../rules/base.xml.in.h:680
+#: ../rules/base.xml.in.h:681
msgid "Udmurt"
msgstr "удмуртска"
-#: ../rules/base.xml.in.h:681
+#: ../rules/base.xml.in.h:682
msgid "Komi"
msgstr "комска"
-#: ../rules/base.xml.in.h:682
+#: ../rules/base.xml.in.h:683
msgid "Yakut"
msgstr "якутска"
-#: ../rules/base.xml.in.h:683
+#: ../rules/base.xml.in.h:684
msgid "Kalmyk"
msgstr "калмикска"
-#: ../rules/base.xml.in.h:684
+#: ../rules/base.xml.in.h:685
msgid "Russian (DOS)"
msgstr "руска — DOS"
-#: ../rules/base.xml.in.h:685
+#: ../rules/base.xml.in.h:686
msgid "Russian (Macintosh)"
msgstr "руска — за Макинтош"
-#: ../rules/base.xml.in.h:686
+#: ../rules/base.xml.in.h:687
msgid "Serbian (Russia)"
msgstr "сръбска — руска"
-#: ../rules/base.xml.in.h:687
+#: ../rules/base.xml.in.h:688
msgid "Bashkirian"
msgstr "башкирска"
-#: ../rules/base.xml.in.h:688
+#: ../rules/base.xml.in.h:689
msgid "Mari"
msgstr "марийска"
-#: ../rules/base.xml.in.h:689 ../rules/base.extras.xml.in.h:52
+#: ../rules/base.xml.in.h:690 ../rules/base.extras.xml.in.h:53
msgid "Serbian"
msgstr "сръбска"
-#: ../rules/base.xml.in.h:690
+#: ../rules/base.xml.in.h:691
msgid "Serbian (Cyrillic, Z and ZHE swapped)"
msgstr "сръбска — кирилица с разменени „З“ и „Ж“"
-#: ../rules/base.xml.in.h:691
+#: ../rules/base.xml.in.h:692
msgid "Serbian (Latin)"
msgstr "сръбска — латиница"
-#: ../rules/base.xml.in.h:692
+#: ../rules/base.xml.in.h:693
msgid "Serbian (Latin Unicode)"
msgstr "сръбска — латиница за Уникод"
-#: ../rules/base.xml.in.h:693
+#: ../rules/base.xml.in.h:694
msgid "Serbian (Latin qwerty)"
msgstr "сръбска — латиница, qwerty"
-#: ../rules/base.xml.in.h:694
+#: ../rules/base.xml.in.h:695
msgid "Serbian (Latin Unicode qwerty)"
msgstr "сръбска — латиница за Уникод, qwerty"
-#: ../rules/base.xml.in.h:695
+#: ../rules/base.xml.in.h:696
msgid "Serbian (Cyrillic with guillemets)"
msgstr "сръбска — кирилица с „«»“"
-#: ../rules/base.xml.in.h:696
+#: ../rules/base.xml.in.h:697
msgid "Serbian (Latin with guillemets)"
msgstr "сръбска — латиница с „«»“"
-#: ../rules/base.xml.in.h:697
-msgid "Pannonian Rusyn (homophonic)"
-msgstr "панонска русинска — еднозвучна"
+#: ../rules/base.xml.in.h:698
+msgid "Pannonian Rusyn"
+msgstr "панонска русинска"
# словенска
#. Keyboard indicator for Slovenian layouts
-#: ../rules/base.xml.in.h:699
+#: ../rules/base.xml.in.h:700
msgid "sl"
msgstr "Слн"
-#: ../rules/base.xml.in.h:700
+#: ../rules/base.xml.in.h:701
msgid "Slovenian"
msgstr "словенска"
-#: ../rules/base.xml.in.h:701
+#: ../rules/base.xml.in.h:702
msgid "Slovenian (use guillemets for quotes)"
msgstr "словенска — с „«»“"
-#: ../rules/base.xml.in.h:702
+#: ../rules/base.xml.in.h:703
msgid "Slovenian (US keyboard with Slovenian letters)"
msgstr "словенска — американска със словенски букви"
# славашка
#. Keyboard indicator for Slovak layouts
-#: ../rules/base.xml.in.h:704 ../rules/base.extras.xml.in.h:106
+#: ../rules/base.xml.in.h:705 ../rules/base.extras.xml.in.h:107
msgid "sk"
msgstr "Слш"
-#: ../rules/base.xml.in.h:705 ../rules/base.extras.xml.in.h:107
+#: ../rules/base.xml.in.h:706 ../rules/base.extras.xml.in.h:108
msgid "Slovak"
msgstr "словашка"
-#: ../rules/base.xml.in.h:706
+#: ../rules/base.xml.in.h:707
msgid "Slovak (extended Backslash)"
msgstr "словашка — с „\\“"
-#: ../rules/base.xml.in.h:707
+#: ../rules/base.xml.in.h:708
msgid "Slovak (qwerty)"
msgstr "словашка — qwerty"
-#: ../rules/base.xml.in.h:708
+#: ../rules/base.xml.in.h:709
msgid "Slovak (qwerty, extended Backslash)"
msgstr "словашка — qwerty, с „\\“"
-#: ../rules/base.xml.in.h:709 ../rules/base.extras.xml.in.h:110
+#: ../rules/base.xml.in.h:710 ../rules/base.extras.xml.in.h:111
msgid "Spanish"
msgstr "испанска"
-#: ../rules/base.xml.in.h:710
+#: ../rules/base.xml.in.h:711
msgid "Spanish (eliminate dead keys)"
msgstr "испанска — без „мъртви“ клавиши"
-#: ../rules/base.xml.in.h:711
+#: ../rules/base.xml.in.h:712
msgid "Spanish (include dead tilde)"
msgstr "испанска — с „мъртва“ тилда"
-#: ../rules/base.xml.in.h:712
+#: ../rules/base.xml.in.h:713
msgid "Spanish (Sun dead keys)"
msgstr "испанска — с „мъртви“ клавиши на Sun"
-#: ../rules/base.xml.in.h:713
+#: ../rules/base.xml.in.h:714
msgid "Spanish (Dvorak)"
msgstr "испанска — Дворак"
-#: ../rules/base.xml.in.h:714
+#: ../rules/base.xml.in.h:715
msgid "Asturian (Spain, with bottom-dot H and bottom-dot L)"
msgstr "астурска — испанска с „Ḥ“ и „Ḷ“"
-#: ../rules/base.xml.in.h:715
+#: ../rules/base.xml.in.h:716
msgid "Catalan (Spain, with middle-dot L)"
msgstr "каталунска — испанска с „Ŀ“"
-#: ../rules/base.xml.in.h:716
+#: ../rules/base.xml.in.h:717
msgid "Spanish (Macintosh)"
msgstr "испанска — за Макинтош"
#. Keyboard indicator for Swedish layouts
-#: ../rules/base.xml.in.h:718 ../rules/base.extras.xml.in.h:112
+#: ../rules/base.xml.in.h:719 ../rules/base.extras.xml.in.h:113
msgid "sv"
msgstr "Швд"
-#: ../rules/base.xml.in.h:719 ../rules/base.extras.xml.in.h:113
+#: ../rules/base.xml.in.h:720 ../rules/base.extras.xml.in.h:114
msgid "Swedish"
msgstr "шведска"
-#: ../rules/base.xml.in.h:720
+#: ../rules/base.xml.in.h:721
msgid "Swedish (eliminate dead keys)"
msgstr "шведска — без „мъртви“ клавиши"
-#: ../rules/base.xml.in.h:721
+#: ../rules/base.xml.in.h:722
msgid "Swedish (Dvorak)"
msgstr "шведска — Дворак"
-#: ../rules/base.xml.in.h:722
+#: ../rules/base.xml.in.h:723
msgid "Russian (Sweden, phonetic)"
msgstr "руска — шведска, фонетична"
-#: ../rules/base.xml.in.h:723
+#: ../rules/base.xml.in.h:724
msgid "Russian (Sweden, phonetic, eliminate dead keys)"
msgstr "руска — шведска, фонетична, без „мъртви“ клавиши"
-#: ../rules/base.xml.in.h:724
+#: ../rules/base.xml.in.h:725
msgid "Northern Saami (Sweden)"
msgstr "северносамска — шведска"
-#: ../rules/base.xml.in.h:725
+#: ../rules/base.xml.in.h:726
msgid "Swedish (Macintosh)"
msgstr "шведска — за Макинтош"
-#: ../rules/base.xml.in.h:726
+#: ../rules/base.xml.in.h:727
msgid "Swedish (Svdvorak)"
msgstr "шведска — шведски Дворак"
-#: ../rules/base.xml.in.h:727
+#: ../rules/base.xml.in.h:728
msgid "Swedish Sign Language"
msgstr "шведска — жестомимична"
-#: ../rules/base.xml.in.h:728 ../rules/base.extras.xml.in.h:115
+#: ../rules/base.xml.in.h:729 ../rules/base.extras.xml.in.h:116
msgid "German (Switzerland)"
msgstr "немска — швейцарска"
-#: ../rules/base.xml.in.h:729
+#: ../rules/base.xml.in.h:730
msgid "German (Switzerland, legacy)"
msgstr "немска — швейцарска, остаряла"
-#: ../rules/base.xml.in.h:730
+#: ../rules/base.xml.in.h:731
msgid "German (Switzerland, eliminate dead keys)"
msgstr "немска — швейцарска, без „мъртви“ клавиши"
-#: ../rules/base.xml.in.h:731
+#: ../rules/base.xml.in.h:732
msgid "German (Switzerland, Sun dead keys)"
msgstr "немска — швейцарска, с „мъртви“ клавиши на Sun"
-#: ../rules/base.xml.in.h:732
+#: ../rules/base.xml.in.h:733
msgid "French (Switzerland)"
msgstr "френска — швейцарска"
-#: ../rules/base.xml.in.h:733
+#: ../rules/base.xml.in.h:734
msgid "French (Switzerland, eliminate dead keys)"
msgstr "френска — швейцарска, без „мъртви“ клавиши"
-#: ../rules/base.xml.in.h:734
+#: ../rules/base.xml.in.h:735
msgid "French (Switzerland, Sun dead keys)"
msgstr "френска — швейцарска, с „мъртви“ клавиши на Sun"
-#: ../rules/base.xml.in.h:735
+#: ../rules/base.xml.in.h:736
msgid "French (Switzerland, Macintosh)"
msgstr "френска — швейцарска, за Макинтош"
-#: ../rules/base.xml.in.h:736
+#: ../rules/base.xml.in.h:737
msgid "German (Switzerland, Macintosh)"
msgstr "немска — швейцарска, за Макинтош"
-#: ../rules/base.xml.in.h:737
+#: ../rules/base.xml.in.h:738
msgid "Arabic (Syria)"
msgstr "арабска — сирийска"
#. Keyboard indicator for Syriac layouts
-#: ../rules/base.xml.in.h:739
+#: ../rules/base.xml.in.h:740
msgid "syc"
msgstr "Срк"
-#: ../rules/base.xml.in.h:740
+#: ../rules/base.xml.in.h:741
msgid "Syriac"
msgstr "сириакска"
-#: ../rules/base.xml.in.h:741
+#: ../rules/base.xml.in.h:742
msgid "Syriac (phonetic)"
msgstr "сириакска — фонетична"
-#: ../rules/base.xml.in.h:742
+#: ../rules/base.xml.in.h:743
msgid "Kurdish (Syria, Latin Q)"
msgstr "кюрдска — сирийска, латиница, „Q“ горе-вляво"
-#: ../rules/base.xml.in.h:743
+#: ../rules/base.xml.in.h:744
msgid "Kurdish (Syria, F)"
msgstr "кюрдска — сирийска, „F“ горе-вляво"
-#: ../rules/base.xml.in.h:744
+#: ../rules/base.xml.in.h:745
msgid "Kurdish (Syria, Latin Alt-Q)"
msgstr "кюрдска — сирийска, латиница, „Q“ горе-вляво, алтернативна"
#. Keyboard indicator for Tajik layouts
-#: ../rules/base.xml.in.h:746
+#: ../rules/base.xml.in.h:747
msgid "tg"
msgstr "Тдж"
-#: ../rules/base.xml.in.h:747
+#: ../rules/base.xml.in.h:748
msgid "Tajik"
msgstr "таджикска"
-#: ../rules/base.xml.in.h:748
+#: ../rules/base.xml.in.h:749
msgid "Tajik (legacy)"
msgstr "таджикска — остаряла"
#. Keyboard indicator for Sinhala layouts
-#: ../rules/base.xml.in.h:750
+#: ../rules/base.xml.in.h:751
msgid "si"
msgstr "Снх"
-#: ../rules/base.xml.in.h:751
+#: ../rules/base.xml.in.h:752
msgid "Sinhala (phonetic)"
msgstr "синхала — фонетична"
-#: ../rules/base.xml.in.h:752
+#: ../rules/base.xml.in.h:753
msgid "Tamil (Sri Lanka, Unicode)"
msgstr "тамилска — шриланкска, Уникод"
-#: ../rules/base.xml.in.h:753
+#: ../rules/base.xml.in.h:754
msgid "Tamil (Sri Lanka, TAB Typewriter)"
msgstr "тамилска — шриланкска, за пишеща машина, кодиране TAB"
#. Keyboard indicator for Thai layouts
-#: ../rules/base.xml.in.h:755
+#: ../rules/base.xml.in.h:756
msgid "th"
msgstr "Тск"
-#: ../rules/base.xml.in.h:756
+#: ../rules/base.xml.in.h:757
msgid "Thai"
msgstr "тайландска"
-#: ../rules/base.xml.in.h:757
+#: ../rules/base.xml.in.h:758
msgid "Thai (TIS-820.2538)"
msgstr "тайландска — TIS-820.2538"
-#: ../rules/base.xml.in.h:758
+#: ../rules/base.xml.in.h:759
msgid "Thai (Pattachote)"
msgstr "тайландска — патачотска"
#. Keyboard indicator for Turkish layouts
-#: ../rules/base.xml.in.h:760 ../rules/base.extras.xml.in.h:118
+#: ../rules/base.xml.in.h:761 ../rules/base.extras.xml.in.h:119
msgid "tr"
msgstr "Трс"
-#: ../rules/base.xml.in.h:761 ../rules/base.extras.xml.in.h:119
+#: ../rules/base.xml.in.h:762 ../rules/base.extras.xml.in.h:120
msgid "Turkish"
msgstr "турска"
-#: ../rules/base.xml.in.h:762
+#: ../rules/base.xml.in.h:763
msgid "Turkish (F)"
msgstr "турска — „F“ горе-вляво"
-#: ../rules/base.xml.in.h:763
+#: ../rules/base.xml.in.h:764
msgid "Turkish (Alt-Q)"
msgstr "турска — „Q“ горе-вляво, алтернативна"
-#: ../rules/base.xml.in.h:764
+#: ../rules/base.xml.in.h:765
msgid "Turkish (Sun dead keys)"
msgstr "турска — с „мъртви“ клавиши на Sun"
-#: ../rules/base.xml.in.h:765
+#: ../rules/base.xml.in.h:766
msgid "Kurdish (Turkey, Latin Q)"
msgstr "кюрдска — турска, латиница, „Q“ горе-вляво"
-#: ../rules/base.xml.in.h:766
+#: ../rules/base.xml.in.h:767
msgid "Kurdish (Turkey, F)"
msgstr "кюрдска — турска, „F“ горе-вляво"
-#: ../rules/base.xml.in.h:767
+#: ../rules/base.xml.in.h:768
msgid "Kurdish (Turkey, Latin Alt-Q)"
msgstr "кюрдска — турска, латиница, „Q“ горе-вляво, алтернативна"
-#: ../rules/base.xml.in.h:768
+#: ../rules/base.xml.in.h:769
msgid "Turkish (international with dead keys)"
msgstr "турска — международна, с „мъртви“ клавиши"
#. Keyboard indicator for Crimean Tatar layouts
-#: ../rules/base.xml.in.h:770 ../rules/base.extras.xml.in.h:47
+#: ../rules/base.xml.in.h:771 ../rules/base.extras.xml.in.h:48
msgid "crh"
msgstr "Ттр"
-#: ../rules/base.xml.in.h:771
+#: ../rules/base.xml.in.h:772
msgid "Crimean Tatar (Turkish Q)"
msgstr "кримски татарски — турска, „Q“ горе-вляво"
-#: ../rules/base.xml.in.h:772
+#: ../rules/base.xml.in.h:773
msgid "Crimean Tatar (Turkish F)"
msgstr "кримски татарски — турска, „F“ горе-вляво"
-#: ../rules/base.xml.in.h:773
+#: ../rules/base.xml.in.h:774
msgid "Crimean Tatar (Turkish Alt-Q)"
msgstr "кримски татарски — турска, „Q“ горе-вляво, алтернативна"
-#: ../rules/base.xml.in.h:774
+#: ../rules/base.xml.in.h:775
msgid "Taiwanese"
msgstr "тайванска"
-#: ../rules/base.xml.in.h:775
+#: ../rules/base.xml.in.h:776
msgid "Taiwanese (indigenous)"
msgstr "тайванска — туземна"
#. Keyboard indicator for Saisiyat layouts
-#: ../rules/base.xml.in.h:777
+#: ../rules/base.xml.in.h:778
msgid "xsy"
msgstr "Сст"
-#: ../rules/base.xml.in.h:778
+#: ../rules/base.xml.in.h:779
msgid "Saisiyat (Taiwan)"
msgstr "сайсиятска — тайванска"
#. Keyboard indicator for Ukranian layouts
-#: ../rules/base.xml.in.h:780 ../rules/base.extras.xml.in.h:121
+#: ../rules/base.xml.in.h:781 ../rules/base.extras.xml.in.h:122
msgid "uk"
msgstr "Укр"
-#: ../rules/base.xml.in.h:781 ../rules/base.extras.xml.in.h:122
+#: ../rules/base.xml.in.h:782 ../rules/base.extras.xml.in.h:123
msgid "Ukrainian"
msgstr "украинска"
-#: ../rules/base.xml.in.h:782
+#: ../rules/base.xml.in.h:783
msgid "Ukrainian (phonetic)"
msgstr "украинска — фонетична"
-#: ../rules/base.xml.in.h:783
+#: ../rules/base.xml.in.h:784
msgid "Ukrainian (typewriter)"
msgstr "украинска — за пишеща машина"
-#: ../rules/base.xml.in.h:784
+#: ../rules/base.xml.in.h:785
msgid "Ukrainian (WinKeys)"
msgstr "украинска — с клавиши на Windows"
-#: ../rules/base.xml.in.h:785
+#: ../rules/base.xml.in.h:786
msgid "Ukrainian (legacy)"
msgstr "украинска — остаряла"
-#: ../rules/base.xml.in.h:786
+#: ../rules/base.xml.in.h:787
msgid "Ukrainian (standard RSTU)"
msgstr "украинска — републикански стандарт"
-#: ../rules/base.xml.in.h:787
+#: ../rules/base.xml.in.h:788
msgid "Russian (Ukraine, standard RSTU)"
msgstr "руска — украинска, републикански стандарт"
-#: ../rules/base.xml.in.h:788
+#: ../rules/base.xml.in.h:789
msgid "Ukrainian (homophonic)"
msgstr "украинска — еднозвучна, алтернативна"
-#: ../rules/base.xml.in.h:789 ../rules/base.extras.xml.in.h:124
+#: ../rules/base.xml.in.h:790 ../rules/base.extras.xml.in.h:125
msgid "English (UK)"
msgstr "английска — великобританска"
-#: ../rules/base.xml.in.h:790
+#: ../rules/base.xml.in.h:791
msgid "English (UK, extended WinKeys)"
msgstr "английска — великобританска, разширена, с клавиши на Windows"
-#: ../rules/base.xml.in.h:791
+#: ../rules/base.xml.in.h:792
msgid "English (UK, international with dead keys)"
msgstr "английска — великобританска, международна, с „мъртви“ клавиши"
-#: ../rules/base.xml.in.h:792
+#: ../rules/base.xml.in.h:793
msgid "English (UK, Dvorak)"
msgstr "английска — великобританска, Дворак"
-#: ../rules/base.xml.in.h:793
+#: ../rules/base.xml.in.h:794
msgid "English (UK, Dvorak with UK punctuation)"
msgstr "английска — великобританска, с пунктуация на Обединеното кралство, Дворак"
-#: ../rules/base.xml.in.h:794
+#: ../rules/base.xml.in.h:795
msgid "English (UK, Macintosh)"
msgstr "английска — великобританска, за Макинтош"
-#: ../rules/base.xml.in.h:795
+#: ../rules/base.xml.in.h:796
msgid "English (UK, Macintosh international)"
msgstr "английска — великобританска, за Макинтош, международна"
-#: ../rules/base.xml.in.h:796
+#: ../rules/base.xml.in.h:797
msgid "English (UK, Colemak)"
msgstr "английска — великобританска, Коулмак"
-#: ../rules/base.xml.in.h:797
+#: ../rules/base.xml.in.h:798
msgid "Uzbek"
msgstr "узбекска"
-#: ../rules/base.xml.in.h:798
+#: ../rules/base.xml.in.h:799
msgid "Uzbek (Latin)"
msgstr "узбекска — латиница"
#. Keyboard indicator for Vietnamese layouts
-#: ../rules/base.xml.in.h:800
+#: ../rules/base.xml.in.h:801
msgid "vi"
msgstr "Втн"
-#: ../rules/base.xml.in.h:801
+#: ../rules/base.xml.in.h:802
msgid "Vietnamese"
msgstr "виетнамска"
#. Keyboard indicator for Korean layouts
-#: ../rules/base.xml.in.h:803 ../rules/base.extras.xml.in.h:126
+#: ../rules/base.xml.in.h:804 ../rules/base.extras.xml.in.h:127
msgid "ko"
msgstr "Крс"
-#: ../rules/base.xml.in.h:804 ../rules/base.extras.xml.in.h:127
+#: ../rules/base.xml.in.h:805 ../rules/base.extras.xml.in.h:128
msgid "Korean"
msgstr "корейска"
-#: ../rules/base.xml.in.h:805
+#: ../rules/base.xml.in.h:806
msgid "Korean (101/104 key compatible)"
msgstr "корейска — съвместима със 101/104 клавиша"
-#: ../rules/base.xml.in.h:806
+#: ../rules/base.xml.in.h:807
msgid "Japanese (PC-98xx Series)"
msgstr "японска — серии PC-98xx"
#. Keyboard indicator for Irish layouts
-#: ../rules/base.xml.in.h:808
+#: ../rules/base.xml.in.h:809
msgid "ie"
msgstr "Ирл"
-#: ../rules/base.xml.in.h:809
+#: ../rules/base.xml.in.h:810
msgid "Irish"
msgstr "ирландска"
-#: ../rules/base.xml.in.h:810
+#: ../rules/base.xml.in.h:811
msgid "CloGaelach"
msgstr "келтска латиница"
-#: ../rules/base.xml.in.h:811
+#: ../rules/base.xml.in.h:812
msgid "Irish (UnicodeExpert)"
msgstr "ирландска — експертна за Уникод"
-#: ../rules/base.xml.in.h:812
+#: ../rules/base.xml.in.h:813
msgid "Ogham"
msgstr "огамска"
-#: ../rules/base.xml.in.h:813
+#: ../rules/base.xml.in.h:814
msgid "Ogham (IS434)"
msgstr "огамска — IS434"
-#: ../rules/base.xml.in.h:814
+#: ../rules/base.xml.in.h:815
msgid "Urdu (Pakistan)"
msgstr "урду — пакистанска"
-#: ../rules/base.xml.in.h:815
+#: ../rules/base.xml.in.h:816
msgid "Urdu (Pakistan, CRULP)"
msgstr "урду — пакистанска, CRULP"
-#: ../rules/base.xml.in.h:816
+#: ../rules/base.xml.in.h:817
msgid "Urdu (Pakistan, NLA)"
msgstr "урду — пакистанска, NLA"
-#: ../rules/base.xml.in.h:817
+#: ../rules/base.xml.in.h:818
msgid "Arabic (Pakistan)"
msgstr "арабска — пакистанска"
#. Keyboard indicator for Sindhi layouts
-#: ../rules/base.xml.in.h:819
+#: ../rules/base.xml.in.h:820
msgid "sd"
msgstr "Снд"
-#: ../rules/base.xml.in.h:820
+#: ../rules/base.xml.in.h:821
msgid "Sindhi"
msgstr "синдхи"
#. Keyboard indicator for Dhivehi layouts
-#: ../rules/base.xml.in.h:822
+#: ../rules/base.xml.in.h:823
msgid "dv"
msgstr "Две"
-#: ../rules/base.xml.in.h:823
+#: ../rules/base.xml.in.h:824
msgid "Dhivehi"
msgstr "дивеи"
-#: ../rules/base.xml.in.h:824
+#: ../rules/base.xml.in.h:825
msgid "English (South Africa)"
msgstr "английска — южноафриканска"
#. Keyboard indicator for Esperanto layouts
-#: ../rules/base.xml.in.h:826
+#: ../rules/base.xml.in.h:827
msgid "eo"
msgstr "Есп"
-#: ../rules/base.xml.in.h:827
+#: ../rules/base.xml.in.h:828
msgid "Esperanto"
msgstr "есперантска"
-#: ../rules/base.xml.in.h:828
+#: ../rules/base.xml.in.h:829
msgid "Esperanto (displaced semicolon and quote, obsolete)"
msgstr "есперантска — разменени „;“ и „\"“, остаряла"
#. Keyboard indicator for Nepali layouts
-#: ../rules/base.xml.in.h:830
+#: ../rules/base.xml.in.h:831
msgid "ne"
msgstr "Нпл"
-#: ../rules/base.xml.in.h:831
+#: ../rules/base.xml.in.h:832
msgid "Nepali"
msgstr "непалска"
-#: ../rules/base.xml.in.h:832
+#: ../rules/base.xml.in.h:833
msgid "English (Nigeria)"
msgstr "английска — нигерийска"
#. Keyboard indicator for Igbo layouts
-#: ../rules/base.xml.in.h:834
+#: ../rules/base.xml.in.h:835
msgid "ig"
msgstr "Игб"
-#: ../rules/base.xml.in.h:835
+#: ../rules/base.xml.in.h:836
msgid "Igbo"
msgstr "игбо"
#. Keyboard indicator for Yoruba layouts
-#: ../rules/base.xml.in.h:837
+#: ../rules/base.xml.in.h:838
msgid "yo"
msgstr "Йрб"
-#: ../rules/base.xml.in.h:838
+#: ../rules/base.xml.in.h:839
msgid "Yoruba"
msgstr "йоруба"
#. Keyboard indicator for Amharic layouts
-#: ../rules/base.xml.in.h:840
+#: ../rules/base.xml.in.h:841
msgid "am"
msgstr "Амх"
-#: ../rules/base.xml.in.h:841
+#: ../rules/base.xml.in.h:842
msgid "Amharic"
msgstr "амхарска"
#. Keyboard indicator for Wolof layouts
-#: ../rules/base.xml.in.h:843
+#: ../rules/base.xml.in.h:844
msgid "wo"
msgstr "Улф"
-#: ../rules/base.xml.in.h:844
+#: ../rules/base.xml.in.h:845
msgid "Wolof"
msgstr "Уолоф"
#. Keyboard indicator for Braille layouts
-#: ../rules/base.xml.in.h:846
+#: ../rules/base.xml.in.h:847
msgid "brl"
msgstr "Брл"
-#: ../rules/base.xml.in.h:847
+#: ../rules/base.xml.in.h:848
msgid "Braille"
msgstr "брайл"
-#: ../rules/base.xml.in.h:848
+#: ../rules/base.xml.in.h:849
msgid "Braille (left hand)"
msgstr "брайл за левичари"
-#: ../rules/base.xml.in.h:849
+#: ../rules/base.xml.in.h:850
msgid "Braille (right hand)"
msgstr "брайл за десничари"
#. Keyboard indicator for Turkmen layouts
-#: ../rules/base.xml.in.h:851
+#: ../rules/base.xml.in.h:852
msgid "tk"
msgstr "Трк"
-#: ../rules/base.xml.in.h:852
+#: ../rules/base.xml.in.h:853
msgid "Turkmen"
msgstr "тюркменска"
-#: ../rules/base.xml.in.h:853
+#: ../rules/base.xml.in.h:854
msgid "Turkmen (Alt-Q)"
msgstr "тюркменска — „Q“ горе-вляво, алтернативна"
#. Keyboard indicator for Bambara layouts
-#: ../rules/base.xml.in.h:855
+#: ../rules/base.xml.in.h:856
msgid "bm"
msgstr "Бмб"
-#: ../rules/base.xml.in.h:856
+#: ../rules/base.xml.in.h:857
msgid "Bambara"
msgstr "бамбарска"
-#: ../rules/base.xml.in.h:857
+#: ../rules/base.xml.in.h:858
msgid "French (Mali, alternative)"
msgstr "френска — малийска, алтернативна"
-#: ../rules/base.xml.in.h:858
+#: ../rules/base.xml.in.h:859
msgid "English (Mali, US Macintosh)"
msgstr "английска — малийска, американска за Макинтош"
-#: ../rules/base.xml.in.h:859
+#: ../rules/base.xml.in.h:860
msgid "English (Mali, US international)"
msgstr "английска — малийска, американска международна"
#. Keyboard indicator for Swahili layouts
-#: ../rules/base.xml.in.h:861
+#: ../rules/base.xml.in.h:862
msgid "sw"
msgstr "Схл"
-#: ../rules/base.xml.in.h:862
+#: ../rules/base.xml.in.h:863
msgid "Swahili (Tanzania)"
msgstr "суахили — танзанийска"
-#: ../rules/base.xml.in.h:863
+#: ../rules/base.xml.in.h:864
msgid "Swahili (Kenya)"
msgstr "суахили — кенийска"
-#: ../rules/base.xml.in.h:864
+#: ../rules/base.xml.in.h:865
msgid "Kikuyu"
msgstr "кикуйска"
#. Keyboard indicator for Tswana layouts
-#: ../rules/base.xml.in.h:866
+#: ../rules/base.xml.in.h:867
msgid "tn"
msgstr "Тсн"
-#: ../rules/base.xml.in.h:867
+#: ../rules/base.xml.in.h:868
msgid "Tswana"
msgstr "тсуанска"
#. Keyboard indicator for Filipino layouts
-#: ../rules/base.xml.in.h:869
+#: ../rules/base.xml.in.h:870
msgid "ph"
msgstr "Флп"
-#: ../rules/base.xml.in.h:870
+#: ../rules/base.xml.in.h:871
msgid "Filipino"
msgstr "филипинска"
-#: ../rules/base.xml.in.h:871
+#: ../rules/base.xml.in.h:872
msgid "Filipino (QWERTY Baybayin)"
msgstr "филипинска — QWERTY за байбаин"
-#: ../rules/base.xml.in.h:872
+#: ../rules/base.xml.in.h:873
msgid "Filipino (Capewell-Dvorak Latin)"
msgstr "филипинска — Дворак на Кейпуел за латиница"
-#: ../rules/base.xml.in.h:873
+#: ../rules/base.xml.in.h:874
msgid "Filipino (Capewell-Dvorak Baybayin)"
msgstr "филипинска — Дворак на Кейпуел за байбаин"
-#: ../rules/base.xml.in.h:874
+#: ../rules/base.xml.in.h:875
msgid "Filipino (Capewell-QWERF 2006 Latin)"
msgstr "филипинска — QWERF 2006 на Кейпуел за латиница"
-#: ../rules/base.xml.in.h:875
+#: ../rules/base.xml.in.h:876
msgid "Filipino (Capewell-QWERF 2006 Baybayin)"
msgstr "филипинска — QWERF 2006 на Кейпуел за байбаин"
-#: ../rules/base.xml.in.h:876
+#: ../rules/base.xml.in.h:877
msgid "Filipino (Colemak Latin)"
msgstr "филипинска — Коулмак за латиница"
-#: ../rules/base.xml.in.h:877
+#: ../rules/base.xml.in.h:878
msgid "Filipino (Colemak Baybayin)"
msgstr "филипинска — Коулмак за байбаин"
-#: ../rules/base.xml.in.h:878
+#: ../rules/base.xml.in.h:879
msgid "Filipino (Dvorak Latin)"
msgstr "филипинска — Дворак за латиница"
-#: ../rules/base.xml.in.h:879
+#: ../rules/base.xml.in.h:880
msgid "Filipino (Dvorak Baybayin)"
msgstr "филипинска — Дворак за байбаин"
-#: ../rules/base.xml.in.h:880
+#: ../rules/base.xml.in.h:881
msgid "md"
msgstr "Млд"
-#: ../rules/base.xml.in.h:881
+#: ../rules/base.xml.in.h:882
msgid "Moldavian"
msgstr "молдовска"
-#: ../rules/base.xml.in.h:882
+#: ../rules/base.xml.in.h:883
msgid "gag"
msgstr "Ггз"
-#: ../rules/base.xml.in.h:883
+#: ../rules/base.xml.in.h:884
msgid "Moldavian (Gagauz)"
msgstr "молдовска — гагаузка"
-#: ../rules/base.xml.in.h:884
+#: ../rules/base.xml.in.h:885
msgid "Switching to another layout"
msgstr "Клавиш(и) за смяна на подредбата"
-#: ../rules/base.xml.in.h:885
+#: ../rules/base.xml.in.h:886
msgid "Right Alt (while pressed)"
msgstr "Десният Alt (докато е натиснат)"
-#: ../rules/base.xml.in.h:886
+#: ../rules/base.xml.in.h:887
msgid "Left Alt (while pressed)"
msgstr "Левият Alt (докато е натиснат)"
-#: ../rules/base.xml.in.h:887
+#: ../rules/base.xml.in.h:888
msgid "Left Win (while pressed)"
msgstr "Левият Win (докато е натиснат)"
-#: ../rules/base.xml.in.h:888
+#: ../rules/base.xml.in.h:889
msgid "Right Win (while pressed)"
msgstr "Десният Win (докато е натиснат)"
-#: ../rules/base.xml.in.h:889
+#: ../rules/base.xml.in.h:890
msgid "Any Win key (while pressed)"
msgstr "Всеки Win (докато е натиснат)"
-#: ../rules/base.xml.in.h:890
+#: ../rules/base.xml.in.h:891
msgid "Caps Lock (while pressed), Alt+Caps Lock does the original capslock action"
msgstr "Caps Lock (докато е натиснат), Alt+Caps Lock замества Caps Lock"
-#: ../rules/base.xml.in.h:891
+#: ../rules/base.xml.in.h:892
msgid "Right Ctrl (while pressed)"
msgstr "Десният Ctrl (докато е натиснат)"
-#: ../rules/base.xml.in.h:892
+#: ../rules/base.xml.in.h:893
msgid "Right Alt"
msgstr "Десният Alt"
-#: ../rules/base.xml.in.h:893
+#: ../rules/base.xml.in.h:894
msgid "Left Alt"
msgstr "Левият Alt"
-#: ../rules/base.xml.in.h:894
+#: ../rules/base.xml.in.h:895
msgid "Caps Lock"
msgstr "Caps Lock"
-#: ../rules/base.xml.in.h:895
+#: ../rules/base.xml.in.h:896
msgid "Shift+Caps Lock"
msgstr "Shift+Caps Lock"
-#: ../rules/base.xml.in.h:896
+#: ../rules/base.xml.in.h:897
msgid "Caps Lock (to first layout), Shift+Caps Lock (to last layout)"
msgstr "Caps Lock (към първата подредба), Shift+Caps Lock (към последната)"
-#: ../rules/base.xml.in.h:897
+#: ../rules/base.xml.in.h:898
msgid "Left Win (to first layout), Right Win/Menu (to last layout)"
msgstr "Левият Win (към първата подредба), десният Win/Menu (към последната)"
-#: ../rules/base.xml.in.h:898
+#: ../rules/base.xml.in.h:899
msgid "Left Ctrl (to first layout), Right Ctrl (to last layout)"
msgstr "Левият Ctrl (към първата подредба), десният Ctrl (към последната)"
-#: ../rules/base.xml.in.h:899
+#: ../rules/base.xml.in.h:900
msgid "Alt+Caps Lock"
msgstr "Alt+Caps Lock"
-#: ../rules/base.xml.in.h:900
+#: ../rules/base.xml.in.h:901
msgid "Both Shift keys together"
msgstr "Двата Shift-а заедно"
-#: ../rules/base.xml.in.h:901
+#: ../rules/base.xml.in.h:902
msgid "Both Alt keys together"
msgstr "Двата Alt-а заедно"
-#: ../rules/base.xml.in.h:902
+#: ../rules/base.xml.in.h:903
msgid "Both Ctrl keys together"
msgstr "Двата Ctrl-а заедно"
-#: ../rules/base.xml.in.h:903
+#: ../rules/base.xml.in.h:904
msgid "Ctrl+Shift"
msgstr "Ctrl+Shift"
-#: ../rules/base.xml.in.h:904
+#: ../rules/base.xml.in.h:905
msgid "Left Ctrl+Left Shift"
msgstr "Левият Ctrl+левият Shift"
-#: ../rules/base.xml.in.h:905
+#: ../rules/base.xml.in.h:906
msgid "Right Ctrl+Right Shift"
msgstr "Десният Ctrl+десният Shift"
-#: ../rules/base.xml.in.h:906
+#: ../rules/base.xml.in.h:907
msgid "Alt+Ctrl"
msgstr "Alt+Ctrl"
-#: ../rules/base.xml.in.h:907
+#: ../rules/base.xml.in.h:908
msgid "Alt+Shift"
msgstr "Alt+Shift"
-#: ../rules/base.xml.in.h:908
+#: ../rules/base.xml.in.h:909
msgid "Left Alt+Left Shift"
msgstr "Левият Alt+левият Shift"
-#: ../rules/base.xml.in.h:909
+#: ../rules/base.xml.in.h:910
msgid "Alt+Space"
msgstr "Alt+Space"
-#: ../rules/base.xml.in.h:910
+#: ../rules/base.xml.in.h:911
msgid "Menu"
msgstr "Menu"
-#: ../rules/base.xml.in.h:911
+#: ../rules/base.xml.in.h:912
msgid "Left Win"
msgstr "Левият Win"
-#: ../rules/base.xml.in.h:912
+#: ../rules/base.xml.in.h:913
msgid "Right Win"
msgstr "Десният Win"
-#: ../rules/base.xml.in.h:913
+#: ../rules/base.xml.in.h:914
msgid "Left Shift"
msgstr "Левият Shift"
-#: ../rules/base.xml.in.h:914
+#: ../rules/base.xml.in.h:915
msgid "Right Shift"
msgstr "Десният Shift"
-#: ../rules/base.xml.in.h:915
+#: ../rules/base.xml.in.h:916
msgid "Left Ctrl"
msgstr "Левият Ctrl"
-#: ../rules/base.xml.in.h:916
+#: ../rules/base.xml.in.h:917
msgid "Right Ctrl"
msgstr "Десният Ctrl"
-#: ../rules/base.xml.in.h:917
+#: ../rules/base.xml.in.h:918
msgid "Scroll Lock"
msgstr "Scroll Lock"
-#: ../rules/base.xml.in.h:918
+#: ../rules/base.xml.in.h:919
msgid "LeftCtrl+LeftWin (to first layout), RightCtrl+Menu (to second layout)"
msgstr "Левият Ctrl+левият Win (към първата подредба), десният Ctrl+Menu (към последната)"
-#: ../rules/base.xml.in.h:919
+#: ../rules/base.xml.in.h:920
msgid "Key to choose 3rd level"
msgstr "Клавиш за избор третото ниво"
-#: ../rules/base.xml.in.h:920
+#: ../rules/base.xml.in.h:921
msgid "Any Win key"
msgstr "Всеки Win"
-#: ../rules/base.xml.in.h:921
+#: ../rules/base.xml.in.h:922
msgid "Any Alt key"
msgstr "Всеки Alt"
-#: ../rules/base.xml.in.h:922
+#: ../rules/base.xml.in.h:923
msgid "Right Alt, Shift+Right Alt key is Compose"
msgstr "Десният Alt, Shift+десният Alt са Compose"
-#: ../rules/base.xml.in.h:923
+#: ../rules/base.xml.in.h:924
msgid "Right Alt key never chooses 3rd level"
msgstr "Десният Alt никога не избира третото ниво"
-#: ../rules/base.xml.in.h:924
+#: ../rules/base.xml.in.h:925
msgid "Enter on keypad"
msgstr "Enter на цифровата клавиатура"
-#: ../rules/base.xml.in.h:925
+#: ../rules/base.xml.in.h:926
msgid "Backslash"
msgstr "Обратно наклонена черта"
-#: ../rules/base.xml.in.h:926
+#: ../rules/base.xml.in.h:927
msgid "&lt;Less/Greater&gt;"
msgstr "„&lt;&gt;“"
-#: ../rules/base.xml.in.h:927
+#: ../rules/base.xml.in.h:928
msgid "Caps Lock chooses 3rd level, acts as onetime lock when pressed together with another 3rd-level-chooser"
msgstr "Caps Lock избира третото ниво и еднократно го заключва заедно с друг клавиш за трето ниво"
-#: ../rules/base.xml.in.h:928
+#: ../rules/base.xml.in.h:929
msgid "Backslash chooses 3rd level, acts as onetime lock when pressed together with another 3rd-level-chooser"
msgstr "Обратно наклонената черта избира третото ниво и еднократно го заключва заедно с друг клавиш за трето ниво"
-#: ../rules/base.xml.in.h:929
+#: ../rules/base.xml.in.h:930
msgid "&lt;Less/Greater&gt; chooses 3rd level, acts as onetime lock when pressed together with another 3rd-level-chooser"
msgstr "„&lt;&gt;“ избира третото ниво и еднократно го заключва заедно с друг клавиш за трето ниво"
-#: ../rules/base.xml.in.h:930
+#: ../rules/base.xml.in.h:931
msgid "Ctrl key position"
msgstr "Положение на Ctrl"
-#: ../rules/base.xml.in.h:931
+#: ../rules/base.xml.in.h:932
msgid "Caps Lock as Ctrl"
msgstr "Caps Lock е Ctrl"
-#: ../rules/base.xml.in.h:932
+#: ../rules/base.xml.in.h:933
msgid "Left Ctrl as Meta"
msgstr "Левият Ctrl е Meta"
-#: ../rules/base.xml.in.h:933
+#: ../rules/base.xml.in.h:934
msgid "Swap Ctrl and Caps Lock"
msgstr "Размяна на Ctrl и Caps Lock"
-#: ../rules/base.xml.in.h:934
+#: ../rules/base.xml.in.h:935
msgid "At left of 'A'"
msgstr "Вляво от „A“"
-#: ../rules/base.xml.in.h:935
+#: ../rules/base.xml.in.h:936
msgid "At bottom left"
msgstr "Долу вляво"
-#: ../rules/base.xml.in.h:936
+#: ../rules/base.xml.in.h:937
msgid "Right Ctrl as Right Alt"
msgstr "Десният Ctrl е десен Alt"
-#: ../rules/base.xml.in.h:937
+#: ../rules/base.xml.in.h:938
msgid "Menu as Right Ctrl"
msgstr "Menu е десният Ctrl"
-#: ../rules/base.xml.in.h:938
+#: ../rules/base.xml.in.h:939
msgid "Right Alt as Right Ctrl"
msgstr "Десният Alt е десен Ctrl"
-#: ../rules/base.xml.in.h:939
+#: ../rules/base.xml.in.h:940
+msgid "Swap Left Alt key with Left Ctrl key"
+msgstr "Размяна на левия Alt с левия Ctrl"
+
+#: ../rules/base.xml.in.h:941
+msgid "Swap Left Win key with Left Ctrl key"
+msgstr "Размяна на левия Win с левия Ctrl"
+
+#: ../rules/base.xml.in.h:942
+msgid "Left Alt as Ctrl, Left Ctrl as Win, Left Win as Alt"
+msgstr "Левият Alt е Ctrl, левият Ctrl е Win, левият Win е Alt"
+
+#: ../rules/base.xml.in.h:943
msgid "Use keyboard LED to show alternative layout"
msgstr "Индикация чрез клавиатурен светодиод за смяна на подредбата"
-#: ../rules/base.xml.in.h:940
+#: ../rules/base.xml.in.h:944
msgid "Num Lock"
msgstr "Num Lock"
-#: ../rules/base.xml.in.h:941
+#: ../rules/base.xml.in.h:945
msgid "Layout of numeric keypad"
msgstr "Подредба на цифровата клавиатура"
-#: ../rules/base.xml.in.h:942
+#: ../rules/base.xml.in.h:946
msgid "Legacy"
msgstr "остаряла"
-#: ../rules/base.xml.in.h:943
+#: ../rules/base.xml.in.h:947
msgid "Unicode additions (arrows and math operators)"
msgstr "Допълненията от Уникод (стрелки и математически операции)"
-#: ../rules/base.xml.in.h:944
+#: ../rules/base.xml.in.h:948
msgid "Unicode additions (arrows and math operators; math operators on default level)"
msgstr "Допълненията от Уникод (стрелки и математически операции, операциите са на стандартното ниво)"
-#: ../rules/base.xml.in.h:945
+#: ../rules/base.xml.in.h:949
msgid "Legacy Wang 724"
msgstr "Остаряла Wang 724"
-#: ../rules/base.xml.in.h:946
+#: ../rules/base.xml.in.h:950
msgid "Wang 724 keypad with Unicode additions (arrows and math operators)"
msgstr "Цифрова клавиатура — Wang 724, с допълненията от Уникод (стрелки и математически операции)"
-#: ../rules/base.xml.in.h:947
+#: ../rules/base.xml.in.h:951
msgid "Wang 724 keypad with Unicode additions (arrows and math operators; math operators on default level)"
msgstr "Цифрова клавиатура Wang 724, с допълненията от Уникод (стрелки и математически операции, операциите са на стандартното ниво)"
-#: ../rules/base.xml.in.h:948
+#: ../rules/base.xml.in.h:952
msgid "Hexadecimal"
msgstr "шестнадесетична"
-#: ../rules/base.xml.in.h:949
+#: ../rules/base.xml.in.h:953
msgid "ATM/phone-style"
msgstr "Като банкомат/телефон"
-#: ../rules/base.xml.in.h:950
+#: ../rules/base.xml.in.h:954
msgid "Numeric keypad delete key behaviour"
msgstr "Поведение на клавиша за триене на цифровата клавиатура"
-#: ../rules/base.xml.in.h:951
+#: ../rules/base.xml.in.h:955
msgid "Legacy key with dot"
msgstr "Остарял клавиш с десетична точка"
#. Actually, with KP_SEPARATOR, as the old keypad(comma)
-#: ../rules/base.xml.in.h:953
+#: ../rules/base.xml.in.h:957
msgid "Legacy key with comma"
msgstr "Остарял клавиш с десетична запетая"
-#: ../rules/base.xml.in.h:954
+#: ../rules/base.xml.in.h:958
msgid "Four-level key with dot"
msgstr "Клавиш на четири нива с десетична точка"
-#: ../rules/base.xml.in.h:955
+#: ../rules/base.xml.in.h:959
msgid "Four-level key with dot, Latin-9 only"
msgstr "Клавиш на четири нива с десетична точка, само латиница по Latin-9"
-#: ../rules/base.xml.in.h:956
+#: ../rules/base.xml.in.h:960
msgid "Four-level key with comma"
msgstr "Клавиш на четири нива с десетична запетая"
-#: ../rules/base.xml.in.h:957
+#: ../rules/base.xml.in.h:961
msgid "Four-level key with momayyez"
msgstr "Клавиш на четири нива с арабска десетична запетая"
#. This assumes the KP_ abstract symbols are actually useful for some apps
#. The description needs to be rewritten
-#: ../rules/base.xml.in.h:960
+#: ../rules/base.xml.in.h:964
msgid "Four-level key with abstract separators"
msgstr "Клавиш на четири нива с абстрактни разделители"
-#: ../rules/base.xml.in.h:961
+#: ../rules/base.xml.in.h:965
msgid "Semicolon on third level"
msgstr "„;“ на третото ниво"
-#: ../rules/base.xml.in.h:962
+#: ../rules/base.xml.in.h:966
msgid "Caps Lock key behavior"
msgstr "Поведение на Caps Lock"
-#: ../rules/base.xml.in.h:963
+#: ../rules/base.xml.in.h:967
msgid "Caps Lock uses internal capitalization; Shift \"pauses\" Caps Lock"
msgstr "Caps Lock използва вътрешна промяна на регистъра. Shift временно спира Caps Lock"
-#: ../rules/base.xml.in.h:964
+#: ../rules/base.xml.in.h:968
msgid "Caps Lock uses internal capitalization; Shift doesn't affect Caps Lock"
msgstr "Caps Lock използва вътрешна промяна на регистъра. Shift не влияе на Caps Lock"
-#: ../rules/base.xml.in.h:965
+#: ../rules/base.xml.in.h:969
msgid "Caps Lock acts as Shift with locking; Shift \"pauses\" Caps Lock"
msgstr "Caps Lock работи като Shift със заключване. Shift временно спира Caps Lock"
-#: ../rules/base.xml.in.h:966
+#: ../rules/base.xml.in.h:970
msgid "Caps Lock acts as Shift with locking; Shift doesn't affect Caps Lock"
msgstr "Caps Lock работи като Shift със заключване. Shift не влияе на Caps Lock"
-#: ../rules/base.xml.in.h:967
+#: ../rules/base.xml.in.h:971
msgid "Caps Lock toggles normal capitalization of alphabetic characters"
msgstr "Caps Lock сменя състоянието Shift само на буквените клавиши"
-#: ../rules/base.xml.in.h:968
+#: ../rules/base.xml.in.h:972
msgid "Make Caps Lock an additional Num Lock"
msgstr "Caps Lock е допълнителен Num Lock"
-#: ../rules/base.xml.in.h:969
+#: ../rules/base.xml.in.h:973
msgid "Swap ESC and Caps Lock"
msgstr "Размяна на Esc и Caps Lock"
-#: ../rules/base.xml.in.h:970
+#: ../rules/base.xml.in.h:974
msgid "Make Caps Lock an additional ESC"
msgstr "Caps Lock е допълнителен Esc"
-#: ../rules/base.xml.in.h:971
+#: ../rules/base.xml.in.h:975
msgid "Make Caps Lock an additional Backspace"
msgstr "Caps Lock е допълнителен Backspace"
-#: ../rules/base.xml.in.h:972
+#: ../rules/base.xml.in.h:976
msgid "Make Caps Lock an additional Super"
msgstr "Caps Lock е допълнителен Super"
-#: ../rules/base.xml.in.h:973
+#: ../rules/base.xml.in.h:977
msgid "Make Caps Lock an additional Hyper"
msgstr "Caps Lock е допълнителен Hyper"
-#: ../rules/base.xml.in.h:974
+#: ../rules/base.xml.in.h:978
msgid "Caps Lock toggles ShiftLock (affects all keys)"
msgstr "Caps Lock сменя състоянието Shift (за всички клавиши)"
-#: ../rules/base.xml.in.h:975
+#: ../rules/base.xml.in.h:979
msgid "Caps Lock is disabled"
msgstr "Caps Lock е изключен"
-#: ../rules/base.xml.in.h:976
+#: ../rules/base.xml.in.h:980
msgid "Make Caps Lock an additional Ctrl"
msgstr "Caps Lock е допълнителен Ctrl"
-#: ../rules/base.xml.in.h:977
+#: ../rules/base.xml.in.h:981
msgid "Alt/Win key behavior"
msgstr "Поведение на Alt/Win"
-#: ../rules/base.xml.in.h:978
+#: ../rules/base.xml.in.h:982
msgid "Add the standard behavior to Menu key"
msgstr "Добавяне на стандартното поведение на Menu"
-#: ../rules/base.xml.in.h:979
+#: ../rules/base.xml.in.h:983
msgid "Alt and Meta are on Alt keys"
msgstr "Alt-овете отговарят на Meta и на Alt"
-#: ../rules/base.xml.in.h:980
+#: ../rules/base.xml.in.h:984
msgid "Alt is mapped to Win keys (and the usual Alt keys)"
msgstr "И двата Win-а са Alt (както и клавишите Alt)"
-#: ../rules/base.xml.in.h:981
+#: ../rules/base.xml.in.h:985
msgid "Ctrl is mapped to Win keys (and the usual Ctrl keys)"
msgstr "И двата Win-а са Control (както и клавишите Ctrl)"
-#: ../rules/base.xml.in.h:982
+#: ../rules/base.xml.in.h:986
msgid "Ctrl is mapped to Alt keys, Alt is mapped to Win keys"
msgstr "И двата Alt-а са Control, Win е Alt"
-#: ../rules/base.xml.in.h:983
+#: ../rules/base.xml.in.h:987
msgid "Meta is mapped to Win keys"
msgstr "И двата Win-а са Meta"
-#: ../rules/base.xml.in.h:984
+#: ../rules/base.xml.in.h:988
msgid "Meta is mapped to Left Win"
msgstr "Левият Win е Meta"
-#: ../rules/base.xml.in.h:985
+#: ../rules/base.xml.in.h:989
msgid "Hyper is mapped to Win-keys"
msgstr "И двата Win-а са Hyper"
-#: ../rules/base.xml.in.h:986
+#: ../rules/base.xml.in.h:990
msgid "Alt is mapped to Right Win, Super to Menu"
msgstr "Десният Win е Alt, а Menu — Super"
-#: ../rules/base.xml.in.h:987
+#: ../rules/base.xml.in.h:991
msgid "Alt is swapped with Win"
msgstr "Alt е разменен с Win"
-#: ../rules/base.xml.in.h:988
+#: ../rules/base.xml.in.h:992
msgid "Position of Compose key"
msgstr "Положение на Compose"
-#: ../rules/base.xml.in.h:989
+#: ../rules/base.xml.in.h:993
msgid "3rd level of Left Win"
msgstr "Левият Win на 3-то ниво"
-#: ../rules/base.xml.in.h:990
+#: ../rules/base.xml.in.h:994
msgid "3rd level of Right Win"
msgstr "Десният Win на 3-то ниво"
-#: ../rules/base.xml.in.h:991
+#: ../rules/base.xml.in.h:995
msgid "3rd level of Menu"
msgstr "Menu на 3-то ниво"
-#: ../rules/base.xml.in.h:992
+#: ../rules/base.xml.in.h:996
msgid "3rd level of Left Ctrl"
msgstr "Левият Ctrl на 3-то ниво"
-#: ../rules/base.xml.in.h:993
+#: ../rules/base.xml.in.h:997
msgid "3rd level of Right Ctrl"
msgstr "Десният Ctrl на 3-то ниво"
-#: ../rules/base.xml.in.h:994
+#: ../rules/base.xml.in.h:998
msgid "3rd level of Caps Lock"
msgstr "Caps Lock на 3-то ниво"
-#: ../rules/base.xml.in.h:995
+#: ../rules/base.xml.in.h:999
msgid "3rd level of &lt;Less/Greater&gt;"
msgstr "„&lt;&gt;“ на 3-то ниво"
-#: ../rules/base.xml.in.h:996
+#: ../rules/base.xml.in.h:1000
msgid "Pause"
msgstr "Pause"
-#: ../rules/base.xml.in.h:997
+#: ../rules/base.xml.in.h:1001
msgid "PrtSc"
msgstr "PrtSc"
-#: ../rules/base.xml.in.h:998
+#: ../rules/base.xml.in.h:1002
msgid "Miscellaneous compatibility options"
msgstr "Разни настройки за съвместимост"
-#: ../rules/base.xml.in.h:999
+#: ../rules/base.xml.in.h:1003
msgid "Default numeric keypad keys"
msgstr "Стандартни клавиши на цифровата клавиатура"
-#: ../rules/base.xml.in.h:1000
+#: ../rules/base.xml.in.h:1004
msgid "Numeric keypad keys always enter digits (as in Mac OS)"
msgstr "Цифровата клавиатура генерира само цифри (като в Mac OS)"
-#: ../rules/base.xml.in.h:1001
+#: ../rules/base.xml.in.h:1005
msgid "Shift with numeric keypad keys works as in MS Windows"
msgstr "Shift за цифровата клавиатура както в MS Windows"
-#: ../rules/base.xml.in.h:1002
+#: ../rules/base.xml.in.h:1006
msgid "Shift does not cancel Num Lock, chooses 3rd level instead"
msgstr "Shift не отменя Caps Lock, а избира третото ниво"
-#: ../rules/base.xml.in.h:1003
+#: ../rules/base.xml.in.h:1007
msgid "Special keys (Ctrl+Alt+&lt;key&gt;) handled in a server"
msgstr "Специалните комбинации (Ctrl+Alt+&lt;клавиш&gt;) се обработват от сървъра"
-#: ../rules/base.xml.in.h:1004
+#: ../rules/base.xml.in.h:1008
msgid "Apple Aluminium Keyboard: emulate PC keys (Print, Scroll Lock, Pause, Num Lock)"
msgstr "Apple Aluminium Keyboard — симулиране на клавиши за PC (Print, Scroll Lock, Pause, Num Lock)"
-#: ../rules/base.xml.in.h:1005
+#: ../rules/base.xml.in.h:1009
msgid "Shift cancels Caps Lock"
msgstr "Shift отменя Caps Lock"
-#: ../rules/base.xml.in.h:1006
+#: ../rules/base.xml.in.h:1010
msgid "Enable extra typographic characters"
msgstr "Допълнителни типографски знаци"
-#: ../rules/base.xml.in.h:1007
+#: ../rules/base.xml.in.h:1011
msgid "Both Shift keys together toggle Caps Lock"
msgstr "Двата Shift-а заедно превключват Caps Lock"
-#: ../rules/base.xml.in.h:1008
+#: ../rules/base.xml.in.h:1012
msgid "Both Shift keys together activate Caps Lock, one Shift key deactivates"
msgstr "Двата Shift-а заедно включват Caps Lock, самостоятелен Shift го изключва"
-#: ../rules/base.xml.in.h:1009
+#: ../rules/base.xml.in.h:1013
msgid "Both Shift keys together toggle ShiftLock"
msgstr "Двата Shift-а заедно превключват ShiftLock"
-#: ../rules/base.xml.in.h:1010
+#: ../rules/base.xml.in.h:1014
msgid "Shift + NumLock toggles PointerKeys"
msgstr "Shift+Num Lock превключват клавишите за придвижване"
-#: ../rules/base.xml.in.h:1011
+#: ../rules/base.xml.in.h:1015
msgid "Allow breaking grabs with keyboard actions (warning: security risk)"
msgstr "Позволяване на клавиатурно прекъсване на прихващането на устройствата (внимание: позволяването намалява сигурността)"
-#: ../rules/base.xml.in.h:1012
+#: ../rules/base.xml.in.h:1016
+msgid "Allow grab and window tree logging"
+msgstr "Журнални съобщения за дървото и прихващането на прозорците"
+
+#: ../rules/base.xml.in.h:1017
msgid "Adding currency signs to certain keys"
msgstr "Добавяне на знак за валута към някои клавиши"
-#: ../rules/base.xml.in.h:1013
+#: ../rules/base.xml.in.h:1018
msgid "Euro on E"
msgstr "„€“ при „E“"
-#: ../rules/base.xml.in.h:1014
+#: ../rules/base.xml.in.h:1019
msgid "Euro on 2"
msgstr "„€“ при „2“"
-#: ../rules/base.xml.in.h:1015
+#: ../rules/base.xml.in.h:1020
msgid "Euro on 4"
msgstr "„€“ при „4“"
-#: ../rules/base.xml.in.h:1016
+#: ../rules/base.xml.in.h:1021
msgid "Euro on 5"
msgstr "„€“ при „5“"
-#: ../rules/base.xml.in.h:1017
+#: ../rules/base.xml.in.h:1022
msgid "Rupee on 4"
msgstr "„₨“ при „4“"
-#: ../rules/base.xml.in.h:1018
+#: ../rules/base.xml.in.h:1023
msgid "Key to choose 5th level"
msgstr "Клавиш за избор петото ниво"
-#: ../rules/base.xml.in.h:1019
+#: ../rules/base.xml.in.h:1024
msgid "&lt;Less/Greater&gt; chooses 5th level, locks when pressed together with another 5th-level-chooser"
msgstr "„&lt;&gt;“ избира петото ниво и го заключва заедно с друг клавиш за пето ниво"
-#: ../rules/base.xml.in.h:1020
+#: ../rules/base.xml.in.h:1025
msgid "Right Alt chooses 5th level, locks when pressed together with another 5th-level-chooser"
msgstr "Десният Alt избира петото ниво и го заключва заедно с друг клавиш за пето ниво"
-#: ../rules/base.xml.in.h:1021
+#: ../rules/base.xml.in.h:1026
msgid "Left Win chooses 5th level, locks when pressed together with another 5th-level-chooser"
msgstr "Левият Win избира петото ниво и го заключва заедно с друг клавиш за пето ниво"
-#: ../rules/base.xml.in.h:1022
+#: ../rules/base.xml.in.h:1027
msgid "Right Win chooses 5th level, locks when pressed together with another 5th-level-chooser"
msgstr "Десният Win избира петото ниво и го заключва заедно с друг клавиш за пето ниво"
-#: ../rules/base.xml.in.h:1023
+#: ../rules/base.xml.in.h:1028
msgid "Using space key to input non-breakable space character"
msgstr "Генериране на интервал без разделяне с клавишa за интервал"
-#: ../rules/base.xml.in.h:1024
+#: ../rules/base.xml.in.h:1029
msgid "Usual space at any level"
msgstr "Нормален интервал на всички нива"
-#: ../rules/base.xml.in.h:1025
+#: ../rules/base.xml.in.h:1030
msgid "Non-breakable space character at second level"
msgstr "Интервал без разделяне на второ ниво"
-#: ../rules/base.xml.in.h:1026
+#: ../rules/base.xml.in.h:1031
msgid "Non-breakable space character at third level"
msgstr "Интервал без разделяне на трето ниво"
-#: ../rules/base.xml.in.h:1027
+#: ../rules/base.xml.in.h:1032
msgid "Non-breakable space character at third level, nothing at fourth level"
msgstr "Интервал без разделяне на трето ниво и нищо на четвърто ниво"
-#: ../rules/base.xml.in.h:1028
+#: ../rules/base.xml.in.h:1033
msgid "Non-breakable space character at third level, thin non-breakable space character at fourth level"
msgstr "Интервал без разделяне на трето ниво и тесен интервал без разделяне на четвърто ниво"
-#: ../rules/base.xml.in.h:1029
+#: ../rules/base.xml.in.h:1034
msgid "Non-breakable space character at fourth level"
msgstr "Интервал без разделяне на четвърто ниво"
-#: ../rules/base.xml.in.h:1030
+#: ../rules/base.xml.in.h:1035
msgid "Non-breakable space character at fourth level, thin non-breakable space character at sixth level"
msgstr "Интервал без разделяне на четвърто ниво и тесен интервал без разделяне на шесто ниво"
-#: ../rules/base.xml.in.h:1031
+#: ../rules/base.xml.in.h:1036
msgid "Non-breakable space character at fourth level, thin non-breakable space character at sixth level (via Ctrl+Shift)"
msgstr "Интервал без разделяне на четвърто ниво и тесен интервал без разделяне на шесто ниво (с Ctrl+Shift)"
-#: ../rules/base.xml.in.h:1032
+#: ../rules/base.xml.in.h:1037
msgid "Zero-width non-joiner character at second level"
msgstr "Разделител с нулева широчина на второ ниво"
-#: ../rules/base.xml.in.h:1033
+#: ../rules/base.xml.in.h:1038
msgid "Zero-width non-joiner character at second level, zero-width joiner character at third level"
msgstr "Разделител с нулева широчина на второ ниво и съединител с нулева широчина на трето ниво"
-#: ../rules/base.xml.in.h:1034
+#: ../rules/base.xml.in.h:1039
msgid "Zero-width non-joiner character at second level, zero-width joiner character at third level, non-breakable space character at fourth level"
msgstr "Разделител с нулева широчина на второ ниво, съединител с нулева широчина на трето ниво и интервал без разделяне на четвърто ниво"
-#: ../rules/base.xml.in.h:1035
+#: ../rules/base.xml.in.h:1040
msgid "Zero-width non-joiner character at second level, non-breakable space character at third level"
msgstr "Разделител с нулева широчина на второ ниво и интервал без разделяне на трето ниво"
-#: ../rules/base.xml.in.h:1036
+#: ../rules/base.xml.in.h:1041
msgid "Zero-width non-joiner character at second level, non-breakable space character at third level, nothing at fourth level"
msgstr "Разделител с нулева широчина на второ ниво, интервал без разделяне на трето ниво и нищо на четвърто ниво"
-#: ../rules/base.xml.in.h:1037
+#: ../rules/base.xml.in.h:1042
msgid "Zero-width non-joiner character at second level, non-breakable space character at third level, zero-width joiner at fourth level"
msgstr "Разделител с нулева широчина на второ ниво, интервал без разделяне на трето ниво и съединител с нулева широчина на четвърто ниво"
-#: ../rules/base.xml.in.h:1038
+#: ../rules/base.xml.in.h:1043
msgid "Zero-width non-joiner character at second level, non-breakable space character at third level, thin non-breakable space at fourth level"
msgstr "Разделител с нулева широчина на второ ниво, интервал без разделяне на трето ниво и тесен интервал без разделяне на четвърто ниво"
-#: ../rules/base.xml.in.h:1039
+#: ../rules/base.xml.in.h:1044
msgid "Zero-width non-joiner character at third level, zero-width joiner at fourth level"
msgstr "Разделител с нулева широчина на трето ниво и съединител с нулева широчина на четвърто ниво"
-#: ../rules/base.xml.in.h:1040
+#: ../rules/base.xml.in.h:1045
msgid "Japanese keyboard options"
msgstr "Настройки за японска клавиатура"
-#: ../rules/base.xml.in.h:1041
+#: ../rules/base.xml.in.h:1046
msgid "Kana Lock key is locking"
msgstr "Клавишът Lock на кана заключва"
-#: ../rules/base.xml.in.h:1042
+#: ../rules/base.xml.in.h:1047
msgid "NICOLA-F style Backspace"
msgstr "Backspace на мястото определено от подредбата NICOLA-F"
-#: ../rules/base.xml.in.h:1043
+#: ../rules/base.xml.in.h:1048
msgid "Make Zenkaku Hankaku an additional ESC"
msgstr "„全角/半角“ (Zenkaku Hankaku) е допълнителен Esc"
-#: ../rules/base.xml.in.h:1044
+#: ../rules/base.xml.in.h:1049
msgid "Adding Esperanto supersigned letters"
msgstr "Добавяне на ударенията на Esperanto"
-#: ../rules/base.xml.in.h:1045
+#: ../rules/base.xml.in.h:1050
msgid "To the corresponding key in a Qwerty layout"
msgstr "към съответния клавиш Qwerty"
-#: ../rules/base.xml.in.h:1046
+#: ../rules/base.xml.in.h:1051
msgid "To the corresponding key in a Dvorak layout"
msgstr "към съответния клавиш в Дворак"
-#: ../rules/base.xml.in.h:1047
+#: ../rules/base.xml.in.h:1052
msgid "To the corresponding key in a Colemak layout"
msgstr "към съответния клавиш в Коулмак"
-#: ../rules/base.xml.in.h:1048
+#: ../rules/base.xml.in.h:1053
msgid "Maintain key compatibility with old Solaris keycodes"
msgstr "Съвместимост със старите кодове на клавиши в Solaris"
-#: ../rules/base.xml.in.h:1049
+#: ../rules/base.xml.in.h:1054
msgid "Sun Key compatibility"
msgstr "Съвместимост с клавишите на Sun"
-#: ../rules/base.xml.in.h:1050
+#: ../rules/base.xml.in.h:1055
msgid "Key sequence to kill the X server"
msgstr "Клавишна комбинация за убиването на X сървъра"
-#: ../rules/base.xml.in.h:1051
+#: ../rules/base.xml.in.h:1056
msgid "Ctrl + Alt + Backspace"
msgstr "Control+Alt+Backspace"
@@ -4067,146 +4089,150 @@ msgstr "селиш на кор дален"
msgid "English (US, Sun Type 6/7)"
msgstr "английска — американска, на Sun, вид 6/7"
-#: ../rules/base.extras.xml.in.h:42
+#: ../rules/base.extras.xml.in.h:40
+msgid "English (Norman)"
+msgstr "английска — Норман"
+
+#: ../rules/base.extras.xml.in.h:43
msgid "Polish (international with dead keys)"
msgstr "полска — международна, с „мъртви“ клавиши"
-#: ../rules/base.extras.xml.in.h:43
+#: ../rules/base.extras.xml.in.h:44
msgid "Polish (Colemak)"
msgstr "полска — Коулмак"
-#: ../rules/base.extras.xml.in.h:44
+#: ../rules/base.extras.xml.in.h:45
msgid "Polish (Sun Type 6/7)"
msgstr "полска — на Sun, вид 6/7"
-#: ../rules/base.extras.xml.in.h:48
+#: ../rules/base.extras.xml.in.h:49
msgid "Crimean Tatar (Dobruja Q)"
msgstr "кримски татарски — „Q“ горе-вляво, Добруджа-Q"
-#: ../rules/base.extras.xml.in.h:49
+#: ../rules/base.extras.xml.in.h:50
msgid "Romanian (ergonomic Touchtype)"
msgstr "румънска — ергономична, десетопръстна"
-#: ../rules/base.extras.xml.in.h:50
+#: ../rules/base.extras.xml.in.h:51
msgid "Romanian (Sun Type 6/7)"
msgstr "румънска — на Sun, вид 6/7"
-#: ../rules/base.extras.xml.in.h:53
+#: ../rules/base.extras.xml.in.h:54
msgid "Serbian (combining accents instead of dead keys)"
msgstr "сръбска — комбиниращи ударения вместо „мъртви“ клавиши"
-#: ../rules/base.extras.xml.in.h:56
+#: ../rules/base.extras.xml.in.h:57
msgid "Russian (with Ukrainian-Belorussian layout)"
msgstr "руска — с украинско-белоруска подредба"
-#: ../rules/base.extras.xml.in.h:57
+#: ../rules/base.extras.xml.in.h:58
msgid "Russian (Sun Type 6/7)"
msgstr "руска — на Sun, вид 6/7"
-#: ../rules/base.extras.xml.in.h:60
+#: ../rules/base.extras.xml.in.h:61
msgid "Armenian (OLPC phonetic)"
msgstr "арменска — фонетична, OLPC"
-#: ../rules/base.extras.xml.in.h:63
+#: ../rules/base.extras.xml.in.h:64
msgid "Hebrew (Biblical, SIL phonetic)"
msgstr "иврит — библейска, Сил, фонетична"
-#: ../rules/base.extras.xml.in.h:66
+#: ../rules/base.extras.xml.in.h:67
msgid "Arabic (Sun Type 6/7)"
msgstr "арабска — на Sun, вид 6/7"
-#: ../rules/base.extras.xml.in.h:69
+#: ../rules/base.extras.xml.in.h:70
msgid "Belgian (Sun Type 6/7)"
msgstr "белгийска — на Sun, вид 6/7"
-#: ../rules/base.extras.xml.in.h:72
+#: ../rules/base.extras.xml.in.h:73
msgid "Portuguese (Brazil, Sun Type 6/7)"
msgstr "португалска — бразилска, на Sun, вид 6/7"
-#: ../rules/base.extras.xml.in.h:75
+#: ../rules/base.extras.xml.in.h:76
msgid "Czech (Sun Type 6/7)"
msgstr "чешка — на Sun, вид 6/7"
-#: ../rules/base.extras.xml.in.h:78
+#: ../rules/base.extras.xml.in.h:79
msgid "Danish (Sun Type 6/7)"
msgstr "датска — на Sun, вид 6/7"
-#: ../rules/base.extras.xml.in.h:81
+#: ../rules/base.extras.xml.in.h:82
msgid "Dutch (Sun Type 6/7)"
msgstr "холандска — на Sun, вид 6/7"
-#: ../rules/base.extras.xml.in.h:84
+#: ../rules/base.extras.xml.in.h:85
msgid "Estonian (Sun Type 6/7)"
msgstr "естонска — на Sun, вид 6/7"
-#: ../rules/base.extras.xml.in.h:87
+#: ../rules/base.extras.xml.in.h:88
msgid "Finnish (Sun Type 6/7)"
msgstr "финландска — на Sun, вид 6/7"
-#: ../rules/base.extras.xml.in.h:89
+#: ../rules/base.extras.xml.in.h:90
msgid "French (Sun Type 6/7)"
msgstr "френска — на Sun, вид 6/7"
-#: ../rules/base.extras.xml.in.h:92
+#: ../rules/base.extras.xml.in.h:93
msgid "Greek (Sun Type 6/7)"
msgstr "гръцка — на Sun, вид 6/7"
-#: ../rules/base.extras.xml.in.h:95
+#: ../rules/base.extras.xml.in.h:96
msgid "Italian (Sun Type 6/7)"
msgstr "италианска — на Sun, вид 6/7"
-#: ../rules/base.extras.xml.in.h:98
+#: ../rules/base.extras.xml.in.h:99
msgid "Japanese (Sun Type 6)"
msgstr "японска — на Sun, вид 6"
-#: ../rules/base.extras.xml.in.h:99
+#: ../rules/base.extras.xml.in.h:100
msgid "Japanese (Sun Type 7 - pc compatible)"
msgstr "японска — на Sun, вид 7, съвместима с PC"
-#: ../rules/base.extras.xml.in.h:100
+#: ../rules/base.extras.xml.in.h:101
msgid "Japanese (Sun Type 7 - sun compatible)"
msgstr "японска — на Sun, вид 7, съвместима със Sun"
-#: ../rules/base.extras.xml.in.h:103
+#: ../rules/base.extras.xml.in.h:104
msgid "Norwegian (Sun Type 6/7)"
msgstr "норвежка — на Sun, вид 6/7"
-#: ../rules/base.extras.xml.in.h:105
+#: ../rules/base.extras.xml.in.h:106
msgid "Portuguese (Sun Type 6/7)"
msgstr "португалска — на Sun, вид 6/7"
-#: ../rules/base.extras.xml.in.h:108
+#: ../rules/base.extras.xml.in.h:109
msgid "Slovak (Sun Type 6/7)"
msgstr "словашка — на Sun, вид 6/7"
-#: ../rules/base.extras.xml.in.h:111
+#: ../rules/base.extras.xml.in.h:112
msgid "Spanish (Sun Type 6/7)"
msgstr "испанска — с „мъртви“ клавиши на Sun"
-#: ../rules/base.extras.xml.in.h:114
+#: ../rules/base.extras.xml.in.h:115
msgid "Swedish (Sun Type 6/7)"
msgstr "шведска — на Sun, вид 6/7"
-#: ../rules/base.extras.xml.in.h:116
+#: ../rules/base.extras.xml.in.h:117
msgid "German (Switzerland, Sun Type 6/7)"
msgstr "немска — швейцарска, на Sun, вид 6/7"
-#: ../rules/base.extras.xml.in.h:117
+#: ../rules/base.extras.xml.in.h:118
msgid "French (Switzerland, Sun Type 6/7)"
msgstr "френска — швейцарска, на Sun, вид 6/7"
-#: ../rules/base.extras.xml.in.h:120
+#: ../rules/base.extras.xml.in.h:121
msgid "Turkish (Sun Type 6/7)"
msgstr "турска — на Sun, вид 6/7"
-#: ../rules/base.extras.xml.in.h:123
+#: ../rules/base.extras.xml.in.h:124
msgid "Ukrainian (Sun Type 6/7)"
msgstr "украинска — на Sun, вид 6/7"
-#: ../rules/base.extras.xml.in.h:125
+#: ../rules/base.extras.xml.in.h:126
msgid "English (UK, Sun Type 6/7)"
msgstr "английска — великобританска, на Sun, вид 6/7"
-#: ../rules/base.extras.xml.in.h:128
+#: ../rules/base.extras.xml.in.h:129
msgid "Korean (Sun Type 6/7)"
msgstr "корейска — на Sun, вид 6/7"
diff --git a/xorg-server/xkeyboard-config/po/ca.po b/xorg-server/xkeyboard-config/po/ca.po
index 81f4f84e2..c654458cd 100644
--- a/xorg-server/xkeyboard-config/po/ca.po
+++ b/xorg-server/xkeyboard-config/po/ca.po
@@ -2,13 +2,13 @@
# Copyright © 2007 Free Software Foundation, Inc.
# This file is distributed under the same license as the xkeyboard-config package.
#
-# Josep Ma. Ferrer <txemaq@gmail.com>, 2007, 2008, 2009, 2010, 2011, 2012, 2013.
+# Josep Ma. Ferrer <txemaq@gmail.com>, 2007, 2008, 2009, 2010, 2011, 2012, 2013, 2014.
msgid ""
msgstr ""
-"Project-Id-Version: xkeyboard-config-2.9.91\n"
+"Project-Id-Version: xkeyboard-config-2.10.99\n"
"Report-Msgid-Bugs-To: svu@users.sourceforge.net\n"
-"POT-Creation-Date: 2013-09-14 14:41+0200\n"
-"PO-Revision-Date: 2013-09-14 17:58+0200\n"
+"POT-Creation-Date: 2014-01-15 01:12+0000\n"
+"PO-Revision-Date: 2014-01-15 22:38+0100\n"
"Last-Translator: Josep Ma. Ferrer <txemaq@gmail.com>\n"
"Language-Team: Catalan <ca@dodds.net>\n"
"Language: ca\n"
@@ -817,7 +817,7 @@ msgid "English (programmer Dvorak)"
msgstr "Anglès (dvorak de programador)"
#. Keyboard indicator for Russian layouts
-#: ../rules/base.xml.in.h:203 ../rules/base.extras.xml.in.h:54
+#: ../rules/base.xml.in.h:203 ../rules/base.extras.xml.in.h:55
msgid "ru"
msgstr "ru"
@@ -889,11 +889,11 @@ msgid "Uzbek (Afghanistan, OLPC)"
msgstr "Usbec (Afganistan, OLPC)"
#. Keyboard indicator for Arabic layouts
-#: ../rules/base.xml.in.h:224 ../rules/base.extras.xml.in.h:64
+#: ../rules/base.xml.in.h:224 ../rules/base.extras.xml.in.h:65
msgid "ar"
msgstr "ar"
-#: ../rules/base.xml.in.h:225 ../rules/base.extras.xml.in.h:65
+#: ../rules/base.xml.in.h:225 ../rules/base.extras.xml.in.h:66
msgid "Arabic"
msgstr "Àrab"
@@ -931,11 +931,11 @@ msgid "Albanian"
msgstr "Albanès"
#. Keyboard indicator for Armenian layouts
-#: ../rules/base.xml.in.h:236 ../rules/base.extras.xml.in.h:58
+#: ../rules/base.xml.in.h:236 ../rules/base.extras.xml.in.h:59
msgid "hy"
msgstr "hy"
-#: ../rules/base.xml.in.h:237 ../rules/base.extras.xml.in.h:59
+#: ../rules/base.xml.in.h:237 ../rules/base.extras.xml.in.h:60
msgid "Armenian"
msgstr "Armeni"
@@ -1011,11 +1011,11 @@ msgid "Belarusian (Latin)"
msgstr "Bielorús (llatí)"
#. Keyboard indicator for Belgian layouts
-#: ../rules/base.xml.in.h:259 ../rules/base.extras.xml.in.h:67
+#: ../rules/base.xml.in.h:259 ../rules/base.extras.xml.in.h:68
msgid "be"
msgstr "be"
-#: ../rules/base.xml.in.h:260 ../rules/base.extras.xml.in.h:68
+#: ../rules/base.xml.in.h:260 ../rules/base.extras.xml.in.h:69
msgid "Belgian"
msgstr "Belga"
@@ -1047,17 +1047,17 @@ msgstr "Belga (tecles mortes de Sun)"
msgid "Belgian (Wang model 724 azerty)"
msgstr "Belga (Wang model 724 azerty)"
-#. Keyboard indicator for Bengali layouts
+#. Keyboard indicator for Bangla layouts
#: ../rules/base.xml.in.h:269
msgid "bn"
msgstr "bn"
#: ../rules/base.xml.in.h:270
-msgid "Bengali"
+msgid "Bangla"
msgstr "Bengalí"
#: ../rules/base.xml.in.h:271
-msgid "Bengali (Probhat)"
+msgid "Bangla (Probhat)"
msgstr "Bengalí (Probhat)"
#. Keyboard indicator for Indian layouts
@@ -1070,27 +1070,27 @@ msgid "Indian"
msgstr "Indi"
#: ../rules/base.xml.in.h:275
-msgid "Bengali (India)"
+msgid "Bangla (India)"
msgstr "Bengalí (Índia)"
#: ../rules/base.xml.in.h:276
-msgid "Bengali (India, Probhat)"
+msgid "Bangla (India, Probhat)"
msgstr "Bengalí (Índia, Probhat)"
#: ../rules/base.xml.in.h:277
-msgid "Bengali (India, Baishakhi)"
+msgid "Bangla (India, Baishakhi)"
msgstr "Bengalí (Índia, Baishakhi)"
#: ../rules/base.xml.in.h:278
-msgid "Bengali (India, Bornona)"
+msgid "Bangla (India, Bornona)"
msgstr "Bengalí (Índia, Bornona)"
#: ../rules/base.xml.in.h:279
-msgid "Bengali (India, Uni Gitanjali)"
+msgid "Bangla (India, Uni Gitanjali)"
msgstr "Bengalí (Índia, Uni Gitanjali)"
#: ../rules/base.xml.in.h:280
-msgid "Bengali (India, Baishakhi Inscript)"
+msgid "Bangla (India, Baishakhi Inscript)"
msgstr "Bengalí (Índia, Inscript Baishakhi)"
#. Keyboard indicator for Gujarati layouts
@@ -1274,11 +1274,11 @@ msgid "Bosnian (US keyboard with Bosnian letters)"
msgstr "Bosnià (teclat EUA amb lletres bosnianes)"
#. Keyboard indicator for Portuguese layouts
-#: ../rules/base.xml.in.h:336 ../rules/base.extras.xml.in.h:70
+#: ../rules/base.xml.in.h:336 ../rules/base.extras.xml.in.h:71
msgid "pt"
msgstr "pt"
-#: ../rules/base.xml.in.h:337 ../rules/base.extras.xml.in.h:71
+#: ../rules/base.xml.in.h:337 ../rules/base.extras.xml.in.h:72
msgid "Portuguese (Brazil)"
msgstr "Portuguès (Brasil)"
@@ -1291,16 +1291,16 @@ msgid "Portuguese (Brazil, Dvorak)"
msgstr "Portuguès (Brasil, dvorak)"
#: ../rules/base.xml.in.h:340
-msgid "Portuguese (Brazil, nativo)"
+msgid "Portuguese (Brazil, Nativo)"
msgstr "Portuguès (Brasil, natiu)"
#: ../rules/base.xml.in.h:341
-msgid "Portuguese (Brazil, nativo for US keyboards)"
+msgid "Portuguese (Brazil, Nativo for US keyboards)"
msgstr "Portuguès (Brasil, natiu per als teclats EUA)"
#: ../rules/base.xml.in.h:342
-msgid "Portuguese (Brazil, nativo for Esperanto)"
-msgstr "Portuguès (Brasil, natiu per a l'esperanto)"
+msgid "Esperanto (Brazil, Nativo)"
+msgstr "Esperanto (Portugal, natiu)"
#. Keyboard indicator for Bulgarian layouts
#: ../rules/base.xml.in.h:344
@@ -1454,2463 +1454,2483 @@ msgid "Tibetan (with ASCII numerals)"
msgstr "Tibetà (amb nombres ASCII)"
#: ../rules/base.xml.in.h:386
+msgid "ug"
+msgstr "ug"
+
+#: ../rules/base.xml.in.h:387
msgid "Uyghur"
msgstr "Uigur"
#. Keyboard indicator for Croatian layouts
-#: ../rules/base.xml.in.h:388
+#: ../rules/base.xml.in.h:389
msgid "hr"
msgstr "hr"
-#: ../rules/base.xml.in.h:389
+#: ../rules/base.xml.in.h:390
msgid "Croatian"
msgstr "Croat"
-#: ../rules/base.xml.in.h:390
+#: ../rules/base.xml.in.h:391
msgid "Croatian (use guillemets for quotes)"
msgstr "Croat (usa cometes angulars per les cometes)"
-#: ../rules/base.xml.in.h:391
+#: ../rules/base.xml.in.h:392
msgid "Croatian (use Croatian digraphs)"
msgstr "Croat (usa dígrafs croats)"
-#: ../rules/base.xml.in.h:392
+#: ../rules/base.xml.in.h:393
msgid "Croatian (US keyboard with Croatian digraphs)"
msgstr "Croat (teclat EUA amb dígrafs croats)"
-#: ../rules/base.xml.in.h:393
+#: ../rules/base.xml.in.h:394
msgid "Croatian (US keyboard with Croatian letters)"
msgstr "Croat (teclat EUA amb lletres croates)"
#. Keyboard indicator for Chech layouts
-#: ../rules/base.xml.in.h:395 ../rules/base.extras.xml.in.h:73
+#: ../rules/base.xml.in.h:396 ../rules/base.extras.xml.in.h:74
msgid "cs"
msgstr "cs"
-#: ../rules/base.xml.in.h:396 ../rules/base.extras.xml.in.h:74
+#: ../rules/base.xml.in.h:397 ../rules/base.extras.xml.in.h:75
msgid "Czech"
msgstr "Txec"
-#: ../rules/base.xml.in.h:397
+#: ../rules/base.xml.in.h:398
msgid "Czech (with &lt;\\|&gt; key)"
msgstr "Txec (amb la tecla &lt;\\|&gt;)"
-#: ../rules/base.xml.in.h:398
+#: ../rules/base.xml.in.h:399
msgid "Czech (qwerty)"
msgstr "Txec (qwerty)"
-#: ../rules/base.xml.in.h:399
+#: ../rules/base.xml.in.h:400
msgid "Czech (qwerty, extended Backslash)"
msgstr "Txec (qwerty, barra inversa ampliada)"
-#: ../rules/base.xml.in.h:400
+#: ../rules/base.xml.in.h:401
msgid "Czech (UCW layout, accented letters only)"
msgstr "Txec (disposició UCW, només lletres accentuades)"
-#: ../rules/base.xml.in.h:401
+#: ../rules/base.xml.in.h:402
msgid "Czech (US Dvorak with CZ UCW support)"
msgstr "Txec (dvorak EUA que permet UCW CZ)"
#. Keyboard indicator for Danish layouts
-#: ../rules/base.xml.in.h:403 ../rules/base.extras.xml.in.h:76
+#: ../rules/base.xml.in.h:404 ../rules/base.extras.xml.in.h:77
msgid "da"
msgstr "da"
-#: ../rules/base.xml.in.h:404 ../rules/base.extras.xml.in.h:77
+#: ../rules/base.xml.in.h:405 ../rules/base.extras.xml.in.h:78
msgid "Danish"
msgstr "Danès"
-#: ../rules/base.xml.in.h:405
+#: ../rules/base.xml.in.h:406
msgid "Danish (eliminate dead keys)"
msgstr "Danès (elimina les tecles mortes)"
-#: ../rules/base.xml.in.h:406
+#: ../rules/base.xml.in.h:407
msgid "Danish (Macintosh)"
msgstr "Danès (Macintosh)"
-#: ../rules/base.xml.in.h:407
+#: ../rules/base.xml.in.h:408
msgid "Danish (Macintosh, eliminate dead keys)"
msgstr "Danès (Macintosh, elimina les tecles mortes)"
-#: ../rules/base.xml.in.h:408
+#: ../rules/base.xml.in.h:409
msgid "Danish (Dvorak)"
msgstr "Danès (dvorak)"
#. Keyboard indicator for Dutch layouts
-#: ../rules/base.xml.in.h:410 ../rules/base.extras.xml.in.h:79
+#: ../rules/base.xml.in.h:411 ../rules/base.extras.xml.in.h:80
msgid "nl"
msgstr "nl"
-#: ../rules/base.xml.in.h:411 ../rules/base.extras.xml.in.h:80
+#: ../rules/base.xml.in.h:412 ../rules/base.extras.xml.in.h:81
msgid "Dutch"
msgstr "Holandès"
-#: ../rules/base.xml.in.h:412
+#: ../rules/base.xml.in.h:413
msgid "Dutch (Sun dead keys)"
msgstr "Holandès (tecles mortes de Sun)"
-#: ../rules/base.xml.in.h:413
+#: ../rules/base.xml.in.h:414
msgid "Dutch (Macintosh)"
msgstr "Holandès (Macintosh)"
-#: ../rules/base.xml.in.h:414
+#: ../rules/base.xml.in.h:415
msgid "Dutch (standard)"
msgstr "Holandès (estàndard)"
#. Keyboard indicator for Dzongkha layouts
-#: ../rules/base.xml.in.h:416
+#: ../rules/base.xml.in.h:417
msgid "dz"
msgstr "dz"
-#: ../rules/base.xml.in.h:417
+#: ../rules/base.xml.in.h:418
msgid "Dzongkha"
msgstr "Dzongkha"
#. Keyboard indicator for Estonian layouts
-#: ../rules/base.xml.in.h:419 ../rules/base.extras.xml.in.h:82
+#: ../rules/base.xml.in.h:420 ../rules/base.extras.xml.in.h:83
msgid "et"
msgstr "et"
-#: ../rules/base.xml.in.h:420 ../rules/base.extras.xml.in.h:83
+#: ../rules/base.xml.in.h:421 ../rules/base.extras.xml.in.h:84
msgid "Estonian"
msgstr "Estonià"
-#: ../rules/base.xml.in.h:421
+#: ../rules/base.xml.in.h:422
msgid "Estonian (eliminate dead keys)"
msgstr "Estonià (elimina les tecles mortes)"
-#: ../rules/base.xml.in.h:422
+#: ../rules/base.xml.in.h:423
msgid "Estonian (Dvorak)"
msgstr "Estonià (dvorak)"
-#: ../rules/base.xml.in.h:423
+#: ../rules/base.xml.in.h:424
msgid "Estonian (US keyboard with Estonian letters)"
msgstr "Estonià (teclat EUA amb lletres estonianes)"
-#: ../rules/base.xml.in.h:424 ../rules/base.extras.xml.in.h:16
+#: ../rules/base.xml.in.h:425 ../rules/base.extras.xml.in.h:16
msgid "Persian"
msgstr "Persa"
-#: ../rules/base.xml.in.h:425
+#: ../rules/base.xml.in.h:426
msgid "Persian (with Persian Keypad)"
msgstr "Persa (amb teclat persa)"
#. Keyboard indicator for Kurdish layouts
-#: ../rules/base.xml.in.h:427
+#: ../rules/base.xml.in.h:428
msgid "ku"
msgstr "ku"
-#: ../rules/base.xml.in.h:428
+#: ../rules/base.xml.in.h:429
msgid "Kurdish (Iran, Latin Q)"
msgstr "Kurd (Iran, llatí Q)"
-#: ../rules/base.xml.in.h:429
+#: ../rules/base.xml.in.h:430
msgid "Kurdish (Iran, F)"
msgstr "Kurd (Iran, F)"
-#: ../rules/base.xml.in.h:430
+#: ../rules/base.xml.in.h:431
msgid "Kurdish (Iran, Latin Alt-Q)"
msgstr "Kurd (Iran, llatí Alt-Q)"
-#: ../rules/base.xml.in.h:431
+#: ../rules/base.xml.in.h:432
msgid "Kurdish (Iran, Arabic-Latin)"
msgstr "Kurd (Iran, àrab-llatí)"
-#: ../rules/base.xml.in.h:432
+#: ../rules/base.xml.in.h:433
msgid "Iraqi"
msgstr "Iraquià"
-#: ../rules/base.xml.in.h:433
+#: ../rules/base.xml.in.h:434
msgid "Kurdish (Iraq, Latin Q)"
msgstr "Kurd (Iraq, llatí Q)"
-#: ../rules/base.xml.in.h:434
+#: ../rules/base.xml.in.h:435
msgid "Kurdish (Iraq, F)"
msgstr "Kurd (Iraq, F)"
-#: ../rules/base.xml.in.h:435
+#: ../rules/base.xml.in.h:436
msgid "Kurdish (Iraq, Latin Alt-Q)"
msgstr "Kurd (Iraq, llatí Alt-Q)"
-#: ../rules/base.xml.in.h:436
+#: ../rules/base.xml.in.h:437
msgid "Kurdish (Iraq, Arabic-Latin)"
msgstr "Kurd (Iraq, àrab-llatí)"
#. Keyboard indicator for Faroese layouts
-#: ../rules/base.xml.in.h:438
+#: ../rules/base.xml.in.h:439
msgid "fo"
msgstr "fo"
-#: ../rules/base.xml.in.h:439
+#: ../rules/base.xml.in.h:440
msgid "Faroese"
msgstr "Feroès"
-#: ../rules/base.xml.in.h:440
+#: ../rules/base.xml.in.h:441
msgid "Faroese (eliminate dead keys)"
msgstr "Feroès (elimina les tecles mortes)"
#. Keyboard indicator for Finnish layouts
-#: ../rules/base.xml.in.h:442 ../rules/base.extras.xml.in.h:85
+#: ../rules/base.xml.in.h:443 ../rules/base.extras.xml.in.h:86
msgid "fi"
msgstr "fi"
-#: ../rules/base.xml.in.h:443 ../rules/base.extras.xml.in.h:86
+#: ../rules/base.xml.in.h:444 ../rules/base.extras.xml.in.h:87
msgid "Finnish"
msgstr "Finès"
-#: ../rules/base.xml.in.h:444
+#: ../rules/base.xml.in.h:445
msgid "Finnish (classic)"
msgstr "Finès (clàssic)"
-#: ../rules/base.xml.in.h:445
+#: ../rules/base.xml.in.h:446
msgid "Finnish (classic, eliminate dead keys)"
msgstr "Finès (clàssic, elimina les tecles mortes)"
-#: ../rules/base.xml.in.h:446
+#: ../rules/base.xml.in.h:447
msgid "Northern Saami (Finland)"
msgstr "Sami Nord (Finlàndia)"
-#: ../rules/base.xml.in.h:447
+#: ../rules/base.xml.in.h:448
msgid "Finnish (Macintosh)"
msgstr "Finès (Macintosh)"
-#: ../rules/base.xml.in.h:448 ../rules/base.extras.xml.in.h:88
+#: ../rules/base.xml.in.h:449 ../rules/base.extras.xml.in.h:89
msgid "French"
msgstr "Francès"
-#: ../rules/base.xml.in.h:449
+#: ../rules/base.xml.in.h:450
msgid "French (eliminate dead keys)"
msgstr "Francès (elimina les tecles mortes)"
-#: ../rules/base.xml.in.h:450
+#: ../rules/base.xml.in.h:451
msgid "French (Sun dead keys)"
msgstr "Francès (tecles mortes de Sun)"
-#: ../rules/base.xml.in.h:451
+#: ../rules/base.xml.in.h:452
msgid "French (alternative)"
msgstr "Francès (alternatiu)"
-#: ../rules/base.xml.in.h:452
+#: ../rules/base.xml.in.h:453
msgid "French (alternative, Latin-9 only)"
msgstr "Francès (alternatiu, només llatí-9)"
-#: ../rules/base.xml.in.h:453
+#: ../rules/base.xml.in.h:454
msgid "French (alternative, eliminate dead keys)"
msgstr "Francès (alternatiu, elimina les tecles mortes)"
-#: ../rules/base.xml.in.h:454
+#: ../rules/base.xml.in.h:455
msgid "French (alternative, Sun dead keys)"
msgstr "Francès (alternatiu, tecles mortes de Sun)"
-#: ../rules/base.xml.in.h:455
+#: ../rules/base.xml.in.h:456
msgid "French (legacy, alternative)"
msgstr "Francès (antic, alternatiu)"
-#: ../rules/base.xml.in.h:456
+#: ../rules/base.xml.in.h:457
msgid "French (legacy, alternative, eliminate dead keys)"
msgstr "Francès (antic, alternatiu, elimina les tecles mortes)"
-#: ../rules/base.xml.in.h:457
+#: ../rules/base.xml.in.h:458
msgid "French (legacy, alternative, Sun dead keys)"
msgstr "Francès (antic, alternatiu, tecles mortes de Sun)"
-#: ../rules/base.xml.in.h:458
+#: ../rules/base.xml.in.h:459
msgid "French (Bepo, ergonomic, Dvorak way)"
msgstr "Francès (Bepo, ergonòmic, tipus dvorak)"
-#: ../rules/base.xml.in.h:459
+#: ../rules/base.xml.in.h:460
msgid "French (Bepo, ergonomic, Dvorak way, Latin-9 only)"
msgstr "Francès (Bepo, ergonòmic, tipus dvorak, només llatí-9)"
-#: ../rules/base.xml.in.h:460
+#: ../rules/base.xml.in.h:461
msgid "French (Dvorak)"
msgstr "Francès (dvorak)"
-#: ../rules/base.xml.in.h:461
+#: ../rules/base.xml.in.h:462
msgid "French (Macintosh)"
msgstr "Francès (Macintosh)"
-#: ../rules/base.xml.in.h:462
+#: ../rules/base.xml.in.h:463
msgid "French (Breton)"
msgstr "Francès (Bretó)"
-#: ../rules/base.xml.in.h:463
+#: ../rules/base.xml.in.h:464
msgid "Occitan"
msgstr "Occità"
-#: ../rules/base.xml.in.h:464
+#: ../rules/base.xml.in.h:465
msgid "Georgian (France, AZERTY Tskapo)"
msgstr "Georgià (França, AZERTY Tskapo)"
-#: ../rules/base.xml.in.h:465
+#: ../rules/base.xml.in.h:466
msgid "English (Ghana)"
msgstr "Anglès (Ghana)"
-#: ../rules/base.xml.in.h:466
+#: ../rules/base.xml.in.h:467
msgid "English (Ghana, multilingual)"
msgstr "Anglès (Ghana, multilingüe)"
#. Keyboard indicator for Akan layouts
-#: ../rules/base.xml.in.h:468
+#: ../rules/base.xml.in.h:469
msgid "ak"
msgstr "ak"
-#: ../rules/base.xml.in.h:469
+#: ../rules/base.xml.in.h:470
msgid "Akan"
msgstr "Akan"
#. Keyboard indicator for Ewe layouts
-#: ../rules/base.xml.in.h:471
+#: ../rules/base.xml.in.h:472
msgid "ee"
msgstr "ee"
-#: ../rules/base.xml.in.h:472
+#: ../rules/base.xml.in.h:473
msgid "Ewe"
msgstr "Ewe"
#. Keyboard indicator for Fula layouts
-#: ../rules/base.xml.in.h:474
+#: ../rules/base.xml.in.h:475
msgid "ff"
msgstr "ff"
-#: ../rules/base.xml.in.h:475
+#: ../rules/base.xml.in.h:476
msgid "Fula"
msgstr "Fula"
#. Keyboard indicator for Ga layouts
-#: ../rules/base.xml.in.h:477
+#: ../rules/base.xml.in.h:478
msgid "gaa"
msgstr "gaa"
-#: ../rules/base.xml.in.h:478
+#: ../rules/base.xml.in.h:479
msgid "Ga"
msgstr "Ga"
#. Keyboard indicator for Hausa layouts
-#: ../rules/base.xml.in.h:480
+#: ../rules/base.xml.in.h:481
msgid "ha"
msgstr "ha"
-#: ../rules/base.xml.in.h:481
+#: ../rules/base.xml.in.h:482
msgid "Hausa"
msgstr "Haussa"
#. Keyboard indicator for Avatime layouts
-#: ../rules/base.xml.in.h:483
+#: ../rules/base.xml.in.h:484
msgid "avn"
msgstr "avn"
-#: ../rules/base.xml.in.h:484
+#: ../rules/base.xml.in.h:485
msgid "Avatime"
msgstr "Avatime"
-#: ../rules/base.xml.in.h:485
+#: ../rules/base.xml.in.h:486
msgid "English (Ghana, GILLBT)"
msgstr "Anglès (Ghana, GILLBT)"
-#: ../rules/base.xml.in.h:486
+#: ../rules/base.xml.in.h:487
msgid "French (Guinea)"
msgstr "Francès (Guinea)"
#. Keyboard indicator for Georgian layouts
-#: ../rules/base.xml.in.h:488
+#: ../rules/base.xml.in.h:489
msgid "ka"
msgstr "ka"
-#: ../rules/base.xml.in.h:489
+#: ../rules/base.xml.in.h:490
msgid "Georgian"
msgstr "Georgià"
-#: ../rules/base.xml.in.h:490
+#: ../rules/base.xml.in.h:491
msgid "Georgian (ergonomic)"
msgstr "Georgià (ergonòmic)"
-#: ../rules/base.xml.in.h:491
+#: ../rules/base.xml.in.h:492
msgid "Georgian (MESS)"
msgstr "Georgià (MESS)"
-#: ../rules/base.xml.in.h:492
+#: ../rules/base.xml.in.h:493
msgid "Russian (Georgia)"
msgstr "Rus (Geòrgia)"
-#: ../rules/base.xml.in.h:493
+#: ../rules/base.xml.in.h:494
msgid "Ossetian (Georgia)"
msgstr "Osset (Geòrgia)"
-#: ../rules/base.xml.in.h:494 ../rules/base.extras.xml.in.h:11
+#: ../rules/base.xml.in.h:495 ../rules/base.extras.xml.in.h:11
msgid "German"
msgstr "Alemany"
-#: ../rules/base.xml.in.h:495
+#: ../rules/base.xml.in.h:496
msgid "German (dead acute)"
msgstr "Alemany (accent mort)"
-#: ../rules/base.xml.in.h:496
+#: ../rules/base.xml.in.h:497
msgid "German (dead grave acute)"
msgstr "Alemany (accent greu mort)"
-#: ../rules/base.xml.in.h:497
+#: ../rules/base.xml.in.h:498
msgid "German (eliminate dead keys)"
msgstr "Alemany (elimina les tecles mortes)"
-#: ../rules/base.xml.in.h:498
+#: ../rules/base.xml.in.h:499
msgid "German (T3)"
msgstr "Alemany (T3)"
-#: ../rules/base.xml.in.h:499
+#: ../rules/base.xml.in.h:500
msgid "Romanian (Germany)"
msgstr "Romanès (Alemanya)"
-#: ../rules/base.xml.in.h:500
+#: ../rules/base.xml.in.h:501
msgid "Romanian (Germany, eliminate dead keys)"
msgstr "Romanès (Alemanya, elimina les tecles mortes)"
-#: ../rules/base.xml.in.h:501
+#: ../rules/base.xml.in.h:502
msgid "German (Dvorak)"
msgstr "Alemany (dvorak)"
-#: ../rules/base.xml.in.h:502
+#: ../rules/base.xml.in.h:503
msgid "German (Sun dead keys)"
msgstr "Alemany (tecles mortes de Sun)"
-#: ../rules/base.xml.in.h:503
+#: ../rules/base.xml.in.h:504
msgid "German (Neo 2)"
msgstr "Alemany (Neo 2)"
-#: ../rules/base.xml.in.h:504
+#: ../rules/base.xml.in.h:505
msgid "German (Macintosh)"
msgstr "Alemany (Macintosh)"
-#: ../rules/base.xml.in.h:505
+#: ../rules/base.xml.in.h:506
msgid "German (Macintosh, eliminate dead keys)"
msgstr "Alemany (Macintosh, elimina les tecles mortes)"
-#: ../rules/base.xml.in.h:506
+#: ../rules/base.xml.in.h:507
msgid "Lower Sorbian"
msgstr "Baix sòrab"
-#: ../rules/base.xml.in.h:507
+#: ../rules/base.xml.in.h:508
msgid "Lower Sorbian (qwertz)"
msgstr "Baix sòrab (qwertz)"
-#: ../rules/base.xml.in.h:508
+#: ../rules/base.xml.in.h:509
msgid "German (qwerty)"
msgstr "Alemany (qwerty)"
-#: ../rules/base.xml.in.h:509
+#: ../rules/base.xml.in.h:510
msgid "Russian (Germany, phonetic)"
msgstr "Rus (alemany, fonètic)"
-#: ../rules/base.xml.in.h:510
+#: ../rules/base.xml.in.h:511
msgid "German (legacy)"
msgstr "Alemany (antic)"
#. Keyboard indicator for Greek layouts
-#: ../rules/base.xml.in.h:512 ../rules/base.extras.xml.in.h:90
+#: ../rules/base.xml.in.h:513 ../rules/base.extras.xml.in.h:91
msgid "gr"
msgstr "gr"
-#: ../rules/base.xml.in.h:513 ../rules/base.extras.xml.in.h:91
+#: ../rules/base.xml.in.h:514 ../rules/base.extras.xml.in.h:92
msgid "Greek"
msgstr "Grec"
-#: ../rules/base.xml.in.h:514
+#: ../rules/base.xml.in.h:515
msgid "Greek (simple)"
msgstr "Grec (senzill)"
-#: ../rules/base.xml.in.h:515
+#: ../rules/base.xml.in.h:516
msgid "Greek (extended)"
msgstr "Grec (ampliat)"
-#: ../rules/base.xml.in.h:516
+#: ../rules/base.xml.in.h:517
msgid "Greek (eliminate dead keys)"
msgstr "Grec (elimina les tecles mortes)"
-#: ../rules/base.xml.in.h:517
+#: ../rules/base.xml.in.h:518
msgid "Greek (polytonic)"
msgstr "Grec (politònic)"
#. Keyboard indicator for Hungarian layouts
-#: ../rules/base.xml.in.h:519
+#: ../rules/base.xml.in.h:520
msgid "hu"
msgstr "hu"
-#: ../rules/base.xml.in.h:520
+#: ../rules/base.xml.in.h:521
msgid "Hungarian"
msgstr "Hongarès"
-#: ../rules/base.xml.in.h:521
+#: ../rules/base.xml.in.h:522
msgid "Hungarian (standard)"
msgstr "Hongarès (estàndard)"
-#: ../rules/base.xml.in.h:522
+#: ../rules/base.xml.in.h:523
msgid "Hungarian (eliminate dead keys)"
msgstr "Hongarès (elimina les tecles mortes)"
-#: ../rules/base.xml.in.h:523
+#: ../rules/base.xml.in.h:524
msgid "Hungarian (qwerty)"
msgstr "Hongarès (qwerty)"
-#: ../rules/base.xml.in.h:524
+#: ../rules/base.xml.in.h:525
msgid "Hungarian (101/qwertz/comma/dead keys)"
msgstr "Hongarès (101/qwertz/coma/tecles mortes)"
-#: ../rules/base.xml.in.h:525
+#: ../rules/base.xml.in.h:526
msgid "Hungarian (101/qwertz/comma/eliminate dead keys)"
msgstr "Hongarès (101/qwertz/coma/elimina les tecles mortes)"
-#: ../rules/base.xml.in.h:526
+#: ../rules/base.xml.in.h:527
msgid "Hungarian (101/qwertz/dot/dead keys)"
msgstr "Hongarès (101/qwertz/punt/tecles mortes)"
-#: ../rules/base.xml.in.h:527
+#: ../rules/base.xml.in.h:528
msgid "Hungarian (101/qwertz/dot/eliminate dead keys)"
msgstr "Hongarès (101/qwertz/punt/elimina les tecles mortes)"
-#: ../rules/base.xml.in.h:528
+#: ../rules/base.xml.in.h:529
msgid "Hungarian (101/qwerty/comma/dead keys)"
msgstr "Hongarès (101/qwerty/coma/tecles mortes)"
-#: ../rules/base.xml.in.h:529
+#: ../rules/base.xml.in.h:530
msgid "Hungarian (101/qwerty/comma/eliminate dead keys)"
msgstr "Hongarès (101/qwerty/coma/elimina les tecles mortes)"
-#: ../rules/base.xml.in.h:530
+#: ../rules/base.xml.in.h:531
msgid "Hungarian (101/qwerty/dot/dead keys)"
msgstr "Hongarès (101/qwerty/punt/tecles mortes)"
-#: ../rules/base.xml.in.h:531
+#: ../rules/base.xml.in.h:532
msgid "Hungarian (101/qwerty/dot/eliminate dead keys)"
msgstr "Hongarès (101/qwerty/punt/elimina les tecles mortes)"
-#: ../rules/base.xml.in.h:532
+#: ../rules/base.xml.in.h:533
msgid "Hungarian (102/qwertz/comma/dead keys)"
msgstr "Hongarès (102/qwertz/coma/tecles mortes)"
-#: ../rules/base.xml.in.h:533
+#: ../rules/base.xml.in.h:534
msgid "Hungarian (102/qwertz/comma/eliminate dead keys)"
msgstr "Hongarès (102/qwertz/coma/elimina les tecles mortes)"
-#: ../rules/base.xml.in.h:534
+#: ../rules/base.xml.in.h:535
msgid "Hungarian (102/qwertz/dot/dead keys)"
msgstr "Hongarès (102/qwertz/punt/tecles mortes)"
-#: ../rules/base.xml.in.h:535
+#: ../rules/base.xml.in.h:536
msgid "Hungarian (102/qwertz/dot/eliminate dead keys)"
msgstr "Hongarès (102/qwertz/punt/elimina les tecles mortes)"
-#: ../rules/base.xml.in.h:536
+#: ../rules/base.xml.in.h:537
msgid "Hungarian (102/qwerty/comma/dead keys)"
msgstr "Hongarès (102/qwerty/coma/tecles mortes)"
-#: ../rules/base.xml.in.h:537
+#: ../rules/base.xml.in.h:538
msgid "Hungarian (102/qwerty/comma/eliminate dead keys)"
msgstr "Hongarès (102/qwerty/coma/elimina les tecles mortes)"
-#: ../rules/base.xml.in.h:538
+#: ../rules/base.xml.in.h:539
msgid "Hungarian (102/qwerty/dot/dead keys)"
msgstr "Hongarès (102/qwerty/punt/tecles mortes)"
-#: ../rules/base.xml.in.h:539
+#: ../rules/base.xml.in.h:540
msgid "Hungarian (102/qwerty/dot/eliminate dead keys)"
msgstr "Hongarès (102/qwerty/punt/elimina les tecles mortes)"
#. Keyboard indicator for Icelandic layouts
-#: ../rules/base.xml.in.h:541
+#: ../rules/base.xml.in.h:542
msgid "is"
msgstr "is"
-#: ../rules/base.xml.in.h:542
+#: ../rules/base.xml.in.h:543
msgid "Icelandic"
msgstr "Islandès"
-#: ../rules/base.xml.in.h:543
+#: ../rules/base.xml.in.h:544
msgid "Icelandic (Sun dead keys)"
msgstr "Islandès (tecles mortes de Sun)"
-#: ../rules/base.xml.in.h:544
+#: ../rules/base.xml.in.h:545
msgid "Icelandic (eliminate dead keys)"
msgstr "Islandès (elimina les tecles mortes)"
-#: ../rules/base.xml.in.h:545
+#: ../rules/base.xml.in.h:546
msgid "Icelandic (Macintosh)"
msgstr "Islandès (Macintosh)"
-#: ../rules/base.xml.in.h:546
+#: ../rules/base.xml.in.h:547
msgid "Icelandic (Dvorak)"
msgstr "Islandès (dvorak)"
#. Keyboard indicator for Hebrew layouts
-#: ../rules/base.xml.in.h:548 ../rules/base.extras.xml.in.h:61
+#: ../rules/base.xml.in.h:549 ../rules/base.extras.xml.in.h:62
msgid "he"
msgstr "he"
-#: ../rules/base.xml.in.h:549 ../rules/base.extras.xml.in.h:62
+#: ../rules/base.xml.in.h:550 ../rules/base.extras.xml.in.h:63
msgid "Hebrew"
msgstr "Hebreu"
-#: ../rules/base.xml.in.h:550
+#: ../rules/base.xml.in.h:551
msgid "Hebrew (lyx)"
msgstr "Hebreu (lyx)"
-#: ../rules/base.xml.in.h:551
+#: ../rules/base.xml.in.h:552
msgid "Hebrew (phonetic)"
msgstr "Hebreu (fonètic)"
-#: ../rules/base.xml.in.h:552
+#: ../rules/base.xml.in.h:553
msgid "Hebrew (Biblical, Tiro)"
msgstr "Hebreu (bíblic, Tiro)"
#. Keyboard indicator for Italian layouts
-#: ../rules/base.xml.in.h:554 ../rules/base.extras.xml.in.h:93
+#: ../rules/base.xml.in.h:555 ../rules/base.extras.xml.in.h:94
msgid "it"
msgstr "it"
-#: ../rules/base.xml.in.h:555 ../rules/base.extras.xml.in.h:94
+#: ../rules/base.xml.in.h:556 ../rules/base.extras.xml.in.h:95
msgid "Italian"
msgstr "Italià"
-#: ../rules/base.xml.in.h:556
+#: ../rules/base.xml.in.h:557
msgid "Italian (eliminate dead keys)"
msgstr "Italià (elimina les tecles mortes)"
-#: ../rules/base.xml.in.h:557
+#: ../rules/base.xml.in.h:558
msgid "Italian (Macintosh)"
msgstr "Italià (Macintosh)"
-#: ../rules/base.xml.in.h:558
+#: ../rules/base.xml.in.h:559
msgid "Italian (US keyboard with Italian letters)"
msgstr "Italià (teclat EUA amb lletres italianes)"
-#: ../rules/base.xml.in.h:559
+#: ../rules/base.xml.in.h:560
msgid "Georgian (Italy)"
msgstr "Georgià (Itàlia)"
-#: ../rules/base.xml.in.h:560
+#: ../rules/base.xml.in.h:561
msgid "Italian (IBM 142)"
msgstr "Italià (IBM 142)"
#. Keyboard indicator for Japanese layouts
-#: ../rules/base.xml.in.h:562 ../rules/base.extras.xml.in.h:96
+#: ../rules/base.xml.in.h:563 ../rules/base.extras.xml.in.h:97
msgid "ja"
msgstr "ja"
-#: ../rules/base.xml.in.h:563 ../rules/base.extras.xml.in.h:97
+#: ../rules/base.xml.in.h:564 ../rules/base.extras.xml.in.h:98
msgid "Japanese"
msgstr "Japonès"
-#: ../rules/base.xml.in.h:564
+#: ../rules/base.xml.in.h:565
msgid "Japanese (Kana)"
msgstr "Japonès (Kana)"
-#: ../rules/base.xml.in.h:565
+#: ../rules/base.xml.in.h:566
msgid "Japanese (Kana 86)"
msgstr "Japonès (Kana 86)"
-#: ../rules/base.xml.in.h:566
+#: ../rules/base.xml.in.h:567
msgid "Japanese (OADG 109A)"
msgstr "Japonès (OADG 109A)"
-#: ../rules/base.xml.in.h:567
+#: ../rules/base.xml.in.h:568
msgid "Japanese (Macintosh)"
msgstr "Japonès (Macintosh)"
-#: ../rules/base.xml.in.h:568
+#: ../rules/base.xml.in.h:569
msgid "Japanese (Dvorak)"
msgstr "Japonès (dvorak)"
#. Keyboard indicator for Kikuyu layouts
-#: ../rules/base.xml.in.h:570
+#: ../rules/base.xml.in.h:571
msgid "ki"
msgstr "ki"
-#: ../rules/base.xml.in.h:571
+#: ../rules/base.xml.in.h:572
msgid "Kyrgyz"
msgstr "Kirguís"
-#: ../rules/base.xml.in.h:572
+#: ../rules/base.xml.in.h:573
msgid "Kyrgyz (phonetic)"
msgstr "Kirguís (fonètic)"
#. Keyboard indicator for Khmer layouts
-#: ../rules/base.xml.in.h:574
+#: ../rules/base.xml.in.h:575
msgid "km"
msgstr "km"
-#: ../rules/base.xml.in.h:575
+#: ../rules/base.xml.in.h:576
msgid "Khmer (Cambodia)"
msgstr "Khmer (Cambotja)"
#. Keyboard indicator for Kazakh layouts
-#: ../rules/base.xml.in.h:577
+#: ../rules/base.xml.in.h:578
msgid "kk"
msgstr "kk"
-#: ../rules/base.xml.in.h:578
+#: ../rules/base.xml.in.h:579
msgid "Kazakh"
msgstr "Kazakh"
-#: ../rules/base.xml.in.h:579
+#: ../rules/base.xml.in.h:580
msgid "Russian (Kazakhstan, with Kazakh)"
msgstr "Rus (Kazakhstan amb Kazakh)"
-#: ../rules/base.xml.in.h:580
+#: ../rules/base.xml.in.h:581
msgid "Kazakh (with Russian)"
msgstr "Kazakh (amb rus)"
#. Keyboard indicator for Lao layouts
-#: ../rules/base.xml.in.h:582
+#: ../rules/base.xml.in.h:583
msgid "lo"
msgstr "lo"
-#: ../rules/base.xml.in.h:583
+#: ../rules/base.xml.in.h:584
msgid "Lao"
msgstr "Laosià"
-#: ../rules/base.xml.in.h:584
+#: ../rules/base.xml.in.h:585
msgid "Lao (STEA proposed standard layout)"
msgstr "Laosià (disposició estàndard proposada per STEA)"
#. Keyboard indicator for Spanish layouts
-#: ../rules/base.xml.in.h:586 ../rules/base.extras.xml.in.h:109
+#: ../rules/base.xml.in.h:587 ../rules/base.extras.xml.in.h:110
msgid "es"
msgstr "es"
-#: ../rules/base.xml.in.h:587
+#: ../rules/base.xml.in.h:588
msgid "Spanish (Latin American)"
msgstr "Espanyol (llatinoamericà)"
-#: ../rules/base.xml.in.h:588
+#: ../rules/base.xml.in.h:589
msgid "Spanish (Latin American, eliminate dead keys)"
msgstr "Espanyol (llatinoamericà, elimina les tecles mortes)"
-#: ../rules/base.xml.in.h:589
+#: ../rules/base.xml.in.h:590
msgid "Spanish (Latin American, include dead tilde)"
msgstr "Espanyol (llatinoamericà, inclou la titlla morta)"
-#: ../rules/base.xml.in.h:590
+#: ../rules/base.xml.in.h:591
msgid "Spanish (Latin American, Sun dead keys)"
msgstr "Espanyol (llatinoamericà, tecles mortes de Sun)"
#. Keyboard indicator for Lithuanian layouts
-#: ../rules/base.xml.in.h:592 ../rules/base.extras.xml.in.h:18
+#: ../rules/base.xml.in.h:593 ../rules/base.extras.xml.in.h:18
msgid "lt"
msgstr "lt"
-#: ../rules/base.xml.in.h:593 ../rules/base.extras.xml.in.h:19
+#: ../rules/base.xml.in.h:594 ../rules/base.extras.xml.in.h:19
msgid "Lithuanian"
msgstr "Lituà"
-#: ../rules/base.xml.in.h:594
+#: ../rules/base.xml.in.h:595
msgid "Lithuanian (standard)"
msgstr "Lituà (estàndard)"
-#: ../rules/base.xml.in.h:595
+#: ../rules/base.xml.in.h:596
msgid "Lithuanian (US keyboard with Lithuanian letters)"
msgstr "Lituà (teclat EUA amb lletres lituanes)"
-#: ../rules/base.xml.in.h:596
+#: ../rules/base.xml.in.h:597
msgid "Lithuanian (IBM LST 1205-92)"
msgstr "Lituà (IBM LST 1205-92)"
-#: ../rules/base.xml.in.h:597
+#: ../rules/base.xml.in.h:598
msgid "Lithuanian (LEKP)"
msgstr "Lituà (LEKP)"
-#: ../rules/base.xml.in.h:598
+#: ../rules/base.xml.in.h:599
msgid "Lithuanian (LEKPa)"
msgstr "Lituà (LEKPa)"
#. Keyboard indicator for Latvian layouts
-#: ../rules/base.xml.in.h:600 ../rules/base.extras.xml.in.h:22
+#: ../rules/base.xml.in.h:601 ../rules/base.extras.xml.in.h:22
msgid "lv"
msgstr "lv"
-#: ../rules/base.xml.in.h:601 ../rules/base.extras.xml.in.h:23
+#: ../rules/base.xml.in.h:602 ../rules/base.extras.xml.in.h:23
msgid "Latvian"
msgstr "Letó"
-#: ../rules/base.xml.in.h:602
+#: ../rules/base.xml.in.h:603
msgid "Latvian (apostrophe variant)"
msgstr "Letó (variant amb apòstrof)"
-#: ../rules/base.xml.in.h:603
+#: ../rules/base.xml.in.h:604
msgid "Latvian (tilde variant)"
msgstr "Letó (variant titlla)"
-#: ../rules/base.xml.in.h:604
+#: ../rules/base.xml.in.h:605
msgid "Latvian (F variant)"
msgstr "Letó (variant F)"
-#: ../rules/base.xml.in.h:605
+#: ../rules/base.xml.in.h:606
msgid "Latvian (modern)"
msgstr "Letó (modern)"
-#: ../rules/base.xml.in.h:606
+#: ../rules/base.xml.in.h:607
msgid "Latvian (ergonomic, ŪGJRMV)"
msgstr "Letó (ergonòmic, ŪGJRMV)"
-#: ../rules/base.xml.in.h:607
+#: ../rules/base.xml.in.h:608
msgid "Latvian (adapted)"
msgstr "Letó (adaptat)"
#. Keyboard indicator for Maori layouts
-#: ../rules/base.xml.in.h:609
+#: ../rules/base.xml.in.h:610
msgid "mi"
msgstr "mi"
-#: ../rules/base.xml.in.h:610
+#: ../rules/base.xml.in.h:611
msgid "Maori"
msgstr "Maori"
#. Keyboard indicator for Serbian layouts
-#: ../rules/base.xml.in.h:612 ../rules/base.extras.xml.in.h:51
+#: ../rules/base.xml.in.h:613 ../rules/base.extras.xml.in.h:52
msgid "sr"
msgstr "sr"
-#: ../rules/base.xml.in.h:613
+#: ../rules/base.xml.in.h:614
msgid "Montenegrin"
msgstr "Montenegrí"
-#: ../rules/base.xml.in.h:614
+#: ../rules/base.xml.in.h:615
msgid "Montenegrin (Cyrillic)"
msgstr "Montenegrí (ciríl·lic)"
-#: ../rules/base.xml.in.h:615
+#: ../rules/base.xml.in.h:616
msgid "Montenegrin (Cyrillic, Z and ZHE swapped)"
msgstr "Montenegrí (ciríl·lic, Z i ZHE intercanviades)"
-#: ../rules/base.xml.in.h:616
+#: ../rules/base.xml.in.h:617
msgid "Montenegrin (Latin Unicode)"
msgstr "Montenegrí (llatí Unicode)"
-#: ../rules/base.xml.in.h:617
+#: ../rules/base.xml.in.h:618
msgid "Montenegrin (Latin qwerty)"
msgstr "Montenegrí (llatí qwerty)"
-#: ../rules/base.xml.in.h:618
+#: ../rules/base.xml.in.h:619
msgid "Montenegrin (Latin Unicode qwerty)"
msgstr "Montenegrí (llatí Unicode qwerty)"
-#: ../rules/base.xml.in.h:619
+#: ../rules/base.xml.in.h:620
msgid "Montenegrin (Cyrillic with guillemets)"
msgstr "Montenegrí (ciríl·lic amb cometes angulars)"
-#: ../rules/base.xml.in.h:620
+#: ../rules/base.xml.in.h:621
msgid "Montenegrin (Latin with guillemets)"
msgstr "Montenegrí (llatí amb cometes angulars)"
#. Keyboard indicator for Macedonian layouts
-#: ../rules/base.xml.in.h:622
+#: ../rules/base.xml.in.h:623
msgid "mk"
msgstr "mk"
-#: ../rules/base.xml.in.h:623
+#: ../rules/base.xml.in.h:624
msgid "Macedonian"
msgstr "Macedoni"
-#: ../rules/base.xml.in.h:624
+#: ../rules/base.xml.in.h:625
msgid "Macedonian (eliminate dead keys)"
msgstr "Macedoni (elimina les tecles mortes)"
#. Keyboard indicator for Maltese layouts
-#: ../rules/base.xml.in.h:626
+#: ../rules/base.xml.in.h:627
msgid "mt"
msgstr "mt"
-#: ../rules/base.xml.in.h:627
+#: ../rules/base.xml.in.h:628
msgid "Maltese"
msgstr "Maltès"
-#: ../rules/base.xml.in.h:628
+#: ../rules/base.xml.in.h:629
msgid "Maltese (with US layout)"
msgstr "Maltès (amb disposició EUA)"
#. Keyboard indicator for Mongolian layouts
-#: ../rules/base.xml.in.h:630
+#: ../rules/base.xml.in.h:631
msgid "mn"
msgstr "mn"
-#: ../rules/base.xml.in.h:631
+#: ../rules/base.xml.in.h:632
msgid "Mongolian"
msgstr "Mongol"
#. Keyboard indicator for Norwegian layouts
-#: ../rules/base.xml.in.h:633 ../rules/base.extras.xml.in.h:101
+#: ../rules/base.xml.in.h:634 ../rules/base.extras.xml.in.h:102
msgid "no"
msgstr "no"
-#: ../rules/base.xml.in.h:634 ../rules/base.extras.xml.in.h:102
+#: ../rules/base.xml.in.h:635 ../rules/base.extras.xml.in.h:103
msgid "Norwegian"
msgstr "Noruec"
-#: ../rules/base.xml.in.h:635
+#: ../rules/base.xml.in.h:636
msgid "Norwegian (eliminate dead keys)"
msgstr "Noruec (elimina les tecles mortes)"
-#: ../rules/base.xml.in.h:636
+#: ../rules/base.xml.in.h:637
msgid "Norwegian (Dvorak)"
msgstr "Noruec (dvorak)"
-#: ../rules/base.xml.in.h:637
+#: ../rules/base.xml.in.h:638
msgid "Northern Saami (Norway)"
msgstr "Sami Nord (Noruega)"
-#: ../rules/base.xml.in.h:638
+#: ../rules/base.xml.in.h:639
msgid "Northern Saami (Norway, eliminate dead keys)"
msgstr "Sami Nord (Noruega, elimina les tecles mortes)"
-#: ../rules/base.xml.in.h:639
+#: ../rules/base.xml.in.h:640
msgid "Norwegian (Macintosh)"
msgstr "Noruec (Macintosh)"
-#: ../rules/base.xml.in.h:640
+#: ../rules/base.xml.in.h:641
msgid "Norwegian (Macintosh, eliminate dead keys)"
msgstr "Noruec (Macintosh, elimina les tecles mortes)"
-#: ../rules/base.xml.in.h:641
+#: ../rules/base.xml.in.h:642
msgid "Norwegian (Colemak)"
msgstr "Noruec (Colemak)"
#. Keyboard indicator for Polish layouts
-#: ../rules/base.xml.in.h:643 ../rules/base.extras.xml.in.h:40
+#: ../rules/base.xml.in.h:644 ../rules/base.extras.xml.in.h:41
msgid "pl"
msgstr "pl"
-#: ../rules/base.xml.in.h:644 ../rules/base.extras.xml.in.h:41
+#: ../rules/base.xml.in.h:645 ../rules/base.extras.xml.in.h:42
msgid "Polish"
msgstr "Polonès"
-#: ../rules/base.xml.in.h:645
+#: ../rules/base.xml.in.h:646
msgid "Polish (legacy)"
msgstr "Polonès (antic)"
-#: ../rules/base.xml.in.h:646
+#: ../rules/base.xml.in.h:647
msgid "Polish (qwertz)"
msgstr "Polonès (qwertz)"
-#: ../rules/base.xml.in.h:647
+#: ../rules/base.xml.in.h:648
msgid "Polish (Dvorak)"
msgstr "Polonès (dvorak)"
-#: ../rules/base.xml.in.h:648
+#: ../rules/base.xml.in.h:649
msgid "Polish (Dvorak, Polish quotes on quotemark key)"
msgstr "Polonès (dvorak, cometes poloneses a la tecla cometes)"
-#: ../rules/base.xml.in.h:649
+#: ../rules/base.xml.in.h:650
msgid "Polish (Dvorak, Polish quotes on key 1)"
msgstr "Polonès (dvorak, cometes poloneses a la tecla 1)"
-#: ../rules/base.xml.in.h:650
+#: ../rules/base.xml.in.h:651
msgid "Kashubian"
msgstr "Caixubi"
-#: ../rules/base.xml.in.h:651
+#: ../rules/base.xml.in.h:652
msgid "Russian (Poland, phonetic Dvorak)"
msgstr "Rus (Polònia, fonètic dvorak)"
-#: ../rules/base.xml.in.h:652
+#: ../rules/base.xml.in.h:653
msgid "Polish (programmer Dvorak)"
msgstr "Polonès (dvorak de programador)"
-#: ../rules/base.xml.in.h:653 ../rules/base.extras.xml.in.h:104
+#: ../rules/base.xml.in.h:654 ../rules/base.extras.xml.in.h:105
msgid "Portuguese"
msgstr "Portuguès"
-#: ../rules/base.xml.in.h:654
+#: ../rules/base.xml.in.h:655
msgid "Portuguese (eliminate dead keys)"
msgstr "Portuguès (elimina les tecles mortes)"
-#: ../rules/base.xml.in.h:655
+#: ../rules/base.xml.in.h:656
msgid "Portuguese (Sun dead keys)"
msgstr "Portuguès (tecles mortes de Sun)"
-#: ../rules/base.xml.in.h:656
+#: ../rules/base.xml.in.h:657
msgid "Portuguese (Macintosh)"
msgstr "Portuguès (Macintosh)"
-#: ../rules/base.xml.in.h:657
+#: ../rules/base.xml.in.h:658
msgid "Portuguese (Macintosh, eliminate dead keys)"
msgstr "Portuguès (Macintosh, elimina les tecles mortes)"
-#: ../rules/base.xml.in.h:658
+#: ../rules/base.xml.in.h:659
msgid "Portuguese (Macintosh, Sun dead keys)"
msgstr "Portuguès (Macintosh, tecles mortes de Sun)"
-#: ../rules/base.xml.in.h:659
+#: ../rules/base.xml.in.h:660
msgid "Portuguese (Nativo)"
msgstr "Portuguès (natiu)"
-#: ../rules/base.xml.in.h:660
+#: ../rules/base.xml.in.h:661
msgid "Portuguese (Nativo for US keyboards)"
msgstr "Portuguès (natiu per als teclats EUA)"
-#: ../rules/base.xml.in.h:661
+#: ../rules/base.xml.in.h:662
msgid "Esperanto (Portugal, Nativo)"
msgstr "Esperanto (Portugal, natiu)"
#. Keyboard indicator for Romanian layouts
-#: ../rules/base.xml.in.h:663 ../rules/base.extras.xml.in.h:45
+#: ../rules/base.xml.in.h:664 ../rules/base.extras.xml.in.h:46
msgid "ro"
msgstr "ro"
-#: ../rules/base.xml.in.h:664 ../rules/base.extras.xml.in.h:46
+#: ../rules/base.xml.in.h:665 ../rules/base.extras.xml.in.h:47
msgid "Romanian"
msgstr "Romanès"
-#: ../rules/base.xml.in.h:665
+#: ../rules/base.xml.in.h:666
msgid "Romanian (cedilla)"
msgstr "Romanès (ce trencada)"
-#: ../rules/base.xml.in.h:666
+#: ../rules/base.xml.in.h:667
msgid "Romanian (standard)"
msgstr "Romanès (estàndard)"
-#: ../rules/base.xml.in.h:667
+#: ../rules/base.xml.in.h:668
msgid "Romanian (standard cedilla)"
msgstr "Romanès (ce trencada estàndard)"
-#: ../rules/base.xml.in.h:668
+#: ../rules/base.xml.in.h:669
msgid "Romanian (WinKeys)"
msgstr "Romanès (tecles Win)"
-#: ../rules/base.xml.in.h:669 ../rules/base.extras.xml.in.h:55
+#: ../rules/base.xml.in.h:670 ../rules/base.extras.xml.in.h:56
msgid "Russian"
msgstr "Rus"
-#: ../rules/base.xml.in.h:670
+#: ../rules/base.xml.in.h:671
msgid "Russian (phonetic)"
msgstr "Rus (fonètic)"
-#: ../rules/base.xml.in.h:671
+#: ../rules/base.xml.in.h:672
msgid "Russian (phonetic WinKeys)"
msgstr "Rus (fonètic tecles Win)"
-#: ../rules/base.xml.in.h:672
+#: ../rules/base.xml.in.h:673
msgid "Russian (typewriter)"
msgstr "Rus (màquina d'escriure)"
-#: ../rules/base.xml.in.h:673
+#: ../rules/base.xml.in.h:674
msgid "Russian (legacy)"
msgstr "Rus (antic)"
-#: ../rules/base.xml.in.h:674
+#: ../rules/base.xml.in.h:675
msgid "Russian (typewriter, legacy)"
msgstr "Rus (màquina d'escriure, antic)"
-#: ../rules/base.xml.in.h:675
+#: ../rules/base.xml.in.h:676
msgid "Tatar"
msgstr "Tàtar"
-#: ../rules/base.xml.in.h:676
+#: ../rules/base.xml.in.h:677
msgid "Ossetian (legacy)"
msgstr "Osset (antic)"
-#: ../rules/base.xml.in.h:677
+#: ../rules/base.xml.in.h:678
msgid "Ossetian (WinKeys)"
msgstr "Osset (tecles Win)"
-#: ../rules/base.xml.in.h:678
+#: ../rules/base.xml.in.h:679
msgid "Chuvash"
msgstr "Chuvash"
-#: ../rules/base.xml.in.h:679
+#: ../rules/base.xml.in.h:680
msgid "Chuvash (Latin)"
msgstr "Chuvash (llatí)"
-#: ../rules/base.xml.in.h:680
+#: ../rules/base.xml.in.h:681
msgid "Udmurt"
msgstr "Udmurt"
-#: ../rules/base.xml.in.h:681
+#: ../rules/base.xml.in.h:682
msgid "Komi"
msgstr "Komi"
-#: ../rules/base.xml.in.h:682
+#: ../rules/base.xml.in.h:683
msgid "Yakut"
msgstr "Iacut"
-#: ../rules/base.xml.in.h:683
+#: ../rules/base.xml.in.h:684
msgid "Kalmyk"
msgstr "Calmuc"
-#: ../rules/base.xml.in.h:684
+#: ../rules/base.xml.in.h:685
msgid "Russian (DOS)"
msgstr "Rus (DOS)"
-#: ../rules/base.xml.in.h:685
+#: ../rules/base.xml.in.h:686
msgid "Russian (Macintosh)"
msgstr "Rus (Macintosh)"
-#: ../rules/base.xml.in.h:686
+#: ../rules/base.xml.in.h:687
msgid "Serbian (Russia)"
msgstr "Serbi (Rússia)"
-#: ../rules/base.xml.in.h:687
+#: ../rules/base.xml.in.h:688
msgid "Bashkirian"
msgstr "Baixkir"
-#: ../rules/base.xml.in.h:688
+#: ../rules/base.xml.in.h:689
msgid "Mari"
msgstr "Mari"
-#: ../rules/base.xml.in.h:689 ../rules/base.extras.xml.in.h:52
+#: ../rules/base.xml.in.h:690 ../rules/base.extras.xml.in.h:53
msgid "Serbian"
msgstr "Serbi"
-#: ../rules/base.xml.in.h:690
+#: ../rules/base.xml.in.h:691
msgid "Serbian (Cyrillic, Z and ZHE swapped)"
msgstr "Serbi (ciríl·lic, Z i ZHE intercanviades)"
-#: ../rules/base.xml.in.h:691
+#: ../rules/base.xml.in.h:692
msgid "Serbian (Latin)"
msgstr "Serbi (llatí)"
-#: ../rules/base.xml.in.h:692
+#: ../rules/base.xml.in.h:693
msgid "Serbian (Latin Unicode)"
msgstr "Serbi (llatí Unicode)"
-#: ../rules/base.xml.in.h:693
+#: ../rules/base.xml.in.h:694
msgid "Serbian (Latin qwerty)"
msgstr "Serbi (llatí qwerty)"
-#: ../rules/base.xml.in.h:694
+#: ../rules/base.xml.in.h:695
msgid "Serbian (Latin Unicode qwerty)"
msgstr "Serbi (llatí Unicode qwerty)"
-#: ../rules/base.xml.in.h:695
+#: ../rules/base.xml.in.h:696
msgid "Serbian (Cyrillic with guillemets)"
msgstr "Serbi (ciríl·lic amb cometes angulars)"
-#: ../rules/base.xml.in.h:696
+#: ../rules/base.xml.in.h:697
msgid "Serbian (Latin with guillemets)"
msgstr "Serbi (llatí amb cometes angulars)"
-#: ../rules/base.xml.in.h:697
-msgid "Pannonian Rusyn (homophonic)"
-msgstr "Rutè Pannònic (homofònic)"
+#: ../rules/base.xml.in.h:698
+msgid "Pannonian Rusyn"
+msgstr "Rutè Pannònic"
#. Keyboard indicator for Slovenian layouts
-#: ../rules/base.xml.in.h:699
+#: ../rules/base.xml.in.h:700
msgid "sl"
msgstr "sl"
-#: ../rules/base.xml.in.h:700
+#: ../rules/base.xml.in.h:701
msgid "Slovenian"
msgstr "Eslovè"
-#: ../rules/base.xml.in.h:701
+#: ../rules/base.xml.in.h:702
msgid "Slovenian (use guillemets for quotes)"
msgstr "Eslovè (usa cometes angulars per les cometes)"
-#: ../rules/base.xml.in.h:702
+#: ../rules/base.xml.in.h:703
msgid "Slovenian (US keyboard with Slovenian letters)"
msgstr "Eslovè (teclat EUA amb lletres eslovenes)"
#. Keyboard indicator for Slovak layouts
-#: ../rules/base.xml.in.h:704 ../rules/base.extras.xml.in.h:106
+#: ../rules/base.xml.in.h:705 ../rules/base.extras.xml.in.h:107
msgid "sk"
msgstr "sk"
-#: ../rules/base.xml.in.h:705 ../rules/base.extras.xml.in.h:107
+#: ../rules/base.xml.in.h:706 ../rules/base.extras.xml.in.h:108
msgid "Slovak"
msgstr "Eslovac"
-#: ../rules/base.xml.in.h:706
+#: ../rules/base.xml.in.h:707
msgid "Slovak (extended Backslash)"
msgstr "Eslovac (barra inversa ampliada)"
-#: ../rules/base.xml.in.h:707
+#: ../rules/base.xml.in.h:708
msgid "Slovak (qwerty)"
msgstr "Eslovac (qwerty)"
-#: ../rules/base.xml.in.h:708
+#: ../rules/base.xml.in.h:709
msgid "Slovak (qwerty, extended Backslash)"
msgstr "Eslovac (qwerty, barra inversa ampliada)"
-#: ../rules/base.xml.in.h:709 ../rules/base.extras.xml.in.h:110
+#: ../rules/base.xml.in.h:710 ../rules/base.extras.xml.in.h:111
msgid "Spanish"
msgstr "Espanyol"
-#: ../rules/base.xml.in.h:710
+#: ../rules/base.xml.in.h:711
msgid "Spanish (eliminate dead keys)"
msgstr "Espanyol (elimina les tecles mortes)"
-#: ../rules/base.xml.in.h:711
+#: ../rules/base.xml.in.h:712
msgid "Spanish (include dead tilde)"
msgstr "Espanyol (inclou la titlla morta)"
-#: ../rules/base.xml.in.h:712
+#: ../rules/base.xml.in.h:713
msgid "Spanish (Sun dead keys)"
msgstr "Espanyol (tecles mortes de Sun)"
-#: ../rules/base.xml.in.h:713
+#: ../rules/base.xml.in.h:714
msgid "Spanish (Dvorak)"
msgstr "Espanyol (dvorak)"
-#: ../rules/base.xml.in.h:714
+#: ../rules/base.xml.in.h:715
msgid "Asturian (Spain, with bottom-dot H and bottom-dot L)"
msgstr "Asturià (Espanya, amb H punt baix i L amb punt baix)"
-#: ../rules/base.xml.in.h:715
+#: ../rules/base.xml.in.h:716
msgid "Catalan (Spain, with middle-dot L)"
msgstr "Català (Espanya, L amb punt volat)"
-#: ../rules/base.xml.in.h:716
+#: ../rules/base.xml.in.h:717
msgid "Spanish (Macintosh)"
msgstr "Espanyol (Macintosh)"
#. Keyboard indicator for Swedish layouts
-#: ../rules/base.xml.in.h:718 ../rules/base.extras.xml.in.h:112
+#: ../rules/base.xml.in.h:719 ../rules/base.extras.xml.in.h:113
msgid "sv"
msgstr "sv"
-#: ../rules/base.xml.in.h:719 ../rules/base.extras.xml.in.h:113
+#: ../rules/base.xml.in.h:720 ../rules/base.extras.xml.in.h:114
msgid "Swedish"
msgstr "Suec"
-#: ../rules/base.xml.in.h:720
+#: ../rules/base.xml.in.h:721
msgid "Swedish (eliminate dead keys)"
msgstr "Suec (elimina les tecles mortes)"
-#: ../rules/base.xml.in.h:721
+#: ../rules/base.xml.in.h:722
msgid "Swedish (Dvorak)"
msgstr "Suec (dvorak)"
-#: ../rules/base.xml.in.h:722
+#: ../rules/base.xml.in.h:723
msgid "Russian (Sweden, phonetic)"
msgstr "Rus (Suècia, fonètic)"
-#: ../rules/base.xml.in.h:723
+#: ../rules/base.xml.in.h:724
msgid "Russian (Sweden, phonetic, eliminate dead keys)"
msgstr "Rus (Suècia, fonètic, elimina les tecles mortes)"
-#: ../rules/base.xml.in.h:724
+#: ../rules/base.xml.in.h:725
msgid "Northern Saami (Sweden)"
msgstr "Sami del nord (Suècia)"
-#: ../rules/base.xml.in.h:725
+#: ../rules/base.xml.in.h:726
msgid "Swedish (Macintosh)"
msgstr "Suec (Macintosh)"
-#: ../rules/base.xml.in.h:726
+#: ../rules/base.xml.in.h:727
msgid "Swedish (Svdvorak)"
msgstr "Suec (Svdvorak)"
-#: ../rules/base.xml.in.h:727
+#: ../rules/base.xml.in.h:728
msgid "Swedish Sign Language"
msgstr "Idioma de signes suec"
-#: ../rules/base.xml.in.h:728 ../rules/base.extras.xml.in.h:115
+#: ../rules/base.xml.in.h:729 ../rules/base.extras.xml.in.h:116
msgid "German (Switzerland)"
msgstr "Alemany (Suïssa)"
-#: ../rules/base.xml.in.h:729
+#: ../rules/base.xml.in.h:730
msgid "German (Switzerland, legacy)"
msgstr "Alemany (Suïssa, antic)"
-#: ../rules/base.xml.in.h:730
+#: ../rules/base.xml.in.h:731
msgid "German (Switzerland, eliminate dead keys)"
msgstr "Alemany (Suïssa, elimina les tecles mortes)"
-#: ../rules/base.xml.in.h:731
+#: ../rules/base.xml.in.h:732
msgid "German (Switzerland, Sun dead keys)"
msgstr "Alemany (Suïssa, tecles mortes de Sun)"
-#: ../rules/base.xml.in.h:732
+#: ../rules/base.xml.in.h:733
msgid "French (Switzerland)"
msgstr "Francès (Suïssa)"
-#: ../rules/base.xml.in.h:733
+#: ../rules/base.xml.in.h:734
msgid "French (Switzerland, eliminate dead keys)"
msgstr "Francès (Suïssa, elimina les tecles mortes)"
-#: ../rules/base.xml.in.h:734
+#: ../rules/base.xml.in.h:735
msgid "French (Switzerland, Sun dead keys)"
msgstr "Francès (Suïssa, tecles mortes de Sun)"
-#: ../rules/base.xml.in.h:735
+#: ../rules/base.xml.in.h:736
msgid "French (Switzerland, Macintosh)"
msgstr "Francès (Suïssa, Macintosh)"
-#: ../rules/base.xml.in.h:736
+#: ../rules/base.xml.in.h:737
msgid "German (Switzerland, Macintosh)"
msgstr "Alemany (Suïssa, Macintosh)"
-#: ../rules/base.xml.in.h:737
+#: ../rules/base.xml.in.h:738
msgid "Arabic (Syria)"
msgstr "Àrab (Síria)"
#. Keyboard indicator for Syriac layouts
-#: ../rules/base.xml.in.h:739
+#: ../rules/base.xml.in.h:740
msgid "syc"
msgstr "syc"
-#: ../rules/base.xml.in.h:740
+#: ../rules/base.xml.in.h:741
msgid "Syriac"
msgstr "Siri"
-#: ../rules/base.xml.in.h:741
+#: ../rules/base.xml.in.h:742
msgid "Syriac (phonetic)"
msgstr "Siríac (fonètic)"
-#: ../rules/base.xml.in.h:742
+#: ../rules/base.xml.in.h:743
msgid "Kurdish (Syria, Latin Q)"
msgstr "Kurd (Síria, llatí Q)"
-#: ../rules/base.xml.in.h:743
+#: ../rules/base.xml.in.h:744
msgid "Kurdish (Syria, F)"
msgstr "Kurd (Síria, F)"
-#: ../rules/base.xml.in.h:744
+#: ../rules/base.xml.in.h:745
msgid "Kurdish (Syria, Latin Alt-Q)"
msgstr "Kurd (Síria, llatí Alt-Q)"
#. Keyboard indicator for Tajik layouts
-#: ../rules/base.xml.in.h:746
+#: ../rules/base.xml.in.h:747
msgid "tg"
msgstr "tg"
-#: ../rules/base.xml.in.h:747
+#: ../rules/base.xml.in.h:748
msgid "Tajik"
msgstr "Tadjik"
-#: ../rules/base.xml.in.h:748
+#: ../rules/base.xml.in.h:749
msgid "Tajik (legacy)"
msgstr "Tadjik (antic)"
#. Keyboard indicator for Sinhala layouts
-#: ../rules/base.xml.in.h:750
+#: ../rules/base.xml.in.h:751
msgid "si"
msgstr "si"
-#: ../rules/base.xml.in.h:751
+#: ../rules/base.xml.in.h:752
msgid "Sinhala (phonetic)"
msgstr "Singalès (fonètic)"
-#: ../rules/base.xml.in.h:752
+#: ../rules/base.xml.in.h:753
msgid "Tamil (Sri Lanka, Unicode)"
msgstr "Tàmil (Sri Lanka, Unicode)"
-#: ../rules/base.xml.in.h:753
+#: ../rules/base.xml.in.h:754
msgid "Tamil (Sri Lanka, TAB Typewriter)"
msgstr "Tàmil (Sri Lanka, tipus d'escriptura TAB)"
#. Keyboard indicator for Thai layouts
-#: ../rules/base.xml.in.h:755
+#: ../rules/base.xml.in.h:756
msgid "th"
msgstr "th"
-#: ../rules/base.xml.in.h:756
+#: ../rules/base.xml.in.h:757
msgid "Thai"
msgstr "Tai"
-#: ../rules/base.xml.in.h:757
+#: ../rules/base.xml.in.h:758
msgid "Thai (TIS-820.2538)"
msgstr "Tai (TIS-820.2538)"
-#: ../rules/base.xml.in.h:758
+#: ../rules/base.xml.in.h:759
msgid "Thai (Pattachote)"
msgstr "Tai (Pattachote)"
#. Keyboard indicator for Turkish layouts
-#: ../rules/base.xml.in.h:760 ../rules/base.extras.xml.in.h:118
+#: ../rules/base.xml.in.h:761 ../rules/base.extras.xml.in.h:119
msgid "tr"
msgstr "tr"
-#: ../rules/base.xml.in.h:761 ../rules/base.extras.xml.in.h:119
+#: ../rules/base.xml.in.h:762 ../rules/base.extras.xml.in.h:120
msgid "Turkish"
msgstr "Turc"
-#: ../rules/base.xml.in.h:762
+#: ../rules/base.xml.in.h:763
msgid "Turkish (F)"
msgstr "Turc (F)"
-#: ../rules/base.xml.in.h:763
+#: ../rules/base.xml.in.h:764
msgid "Turkish (Alt-Q)"
msgstr "Turc (Alt-Q)"
-#: ../rules/base.xml.in.h:764
+#: ../rules/base.xml.in.h:765
msgid "Turkish (Sun dead keys)"
msgstr "Turc (tecles mortes de Sun)"
-#: ../rules/base.xml.in.h:765
+#: ../rules/base.xml.in.h:766
msgid "Kurdish (Turkey, Latin Q)"
msgstr "Kurd (Turquia, llatí Q)"
-#: ../rules/base.xml.in.h:766
+#: ../rules/base.xml.in.h:767
msgid "Kurdish (Turkey, F)"
msgstr "Kurd (Turquia, F)"
-#: ../rules/base.xml.in.h:767
+#: ../rules/base.xml.in.h:768
msgid "Kurdish (Turkey, Latin Alt-Q)"
msgstr "Kurd (Turquia, llatí Alt-Q)"
-#: ../rules/base.xml.in.h:768
+#: ../rules/base.xml.in.h:769
msgid "Turkish (international with dead keys)"
msgstr "Turc (internacional amb tecles mortes)"
#. Keyboard indicator for Crimean Tatar layouts
-#: ../rules/base.xml.in.h:770 ../rules/base.extras.xml.in.h:47
+#: ../rules/base.xml.in.h:771 ../rules/base.extras.xml.in.h:48
msgid "crh"
msgstr "crh"
-#: ../rules/base.xml.in.h:771
+#: ../rules/base.xml.in.h:772
msgid "Crimean Tatar (Turkish Q)"
msgstr "Tàtar de Crimea (Turc Q)"
-#: ../rules/base.xml.in.h:772
+#: ../rules/base.xml.in.h:773
msgid "Crimean Tatar (Turkish F)"
msgstr "Tàtar de Crimea (Turc F)"
-#: ../rules/base.xml.in.h:773
+#: ../rules/base.xml.in.h:774
msgid "Crimean Tatar (Turkish Alt-Q)"
msgstr "Tàtar de Crimea (Turc Alt-Q)"
-#: ../rules/base.xml.in.h:774
+#: ../rules/base.xml.in.h:775
msgid "Taiwanese"
msgstr "Taiwanès"
-#: ../rules/base.xml.in.h:775
+#: ../rules/base.xml.in.h:776
msgid "Taiwanese (indigenous)"
msgstr "Taiwanès (indígena)"
#. Keyboard indicator for Saisiyat layouts
-#: ../rules/base.xml.in.h:777
+#: ../rules/base.xml.in.h:778
msgid "xsy"
msgstr "xsy"
-#: ../rules/base.xml.in.h:778
+#: ../rules/base.xml.in.h:779
msgid "Saisiyat (Taiwan)"
msgstr "Saisiyat (Taiwan)"
#. Keyboard indicator for Ukranian layouts
-#: ../rules/base.xml.in.h:780 ../rules/base.extras.xml.in.h:121
+#: ../rules/base.xml.in.h:781 ../rules/base.extras.xml.in.h:122
msgid "uk"
msgstr "uk"
-#: ../rules/base.xml.in.h:781 ../rules/base.extras.xml.in.h:122
+#: ../rules/base.xml.in.h:782 ../rules/base.extras.xml.in.h:123
msgid "Ukrainian"
msgstr "Ucraïnès"
-#: ../rules/base.xml.in.h:782
+#: ../rules/base.xml.in.h:783
msgid "Ukrainian (phonetic)"
msgstr "Ucraïnès (fonètic)"
-#: ../rules/base.xml.in.h:783
+#: ../rules/base.xml.in.h:784
msgid "Ukrainian (typewriter)"
msgstr "Ucraïnès (màquina d'escriure)"
-#: ../rules/base.xml.in.h:784
+#: ../rules/base.xml.in.h:785
msgid "Ukrainian (WinKeys)"
msgstr "Ucraïnès (tecles Win)"
-#: ../rules/base.xml.in.h:785
+#: ../rules/base.xml.in.h:786
msgid "Ukrainian (legacy)"
msgstr "Ucraïnès (antic)"
-#: ../rules/base.xml.in.h:786
+#: ../rules/base.xml.in.h:787
msgid "Ukrainian (standard RSTU)"
msgstr "Ucraïnès (estàndard RSTU)"
-#: ../rules/base.xml.in.h:787
+#: ../rules/base.xml.in.h:788
msgid "Russian (Ukraine, standard RSTU)"
msgstr "Rus (Ucraïna, estàndard RSTU)"
-#: ../rules/base.xml.in.h:788
+#: ../rules/base.xml.in.h:789
msgid "Ukrainian (homophonic)"
msgstr "Ucraïnès (homofònic)"
-#: ../rules/base.xml.in.h:789 ../rules/base.extras.xml.in.h:124
+#: ../rules/base.xml.in.h:790 ../rules/base.extras.xml.in.h:125
msgid "English (UK)"
msgstr "Anglès (RU)"
-#: ../rules/base.xml.in.h:790
+#: ../rules/base.xml.in.h:791
msgid "English (UK, extended WinKeys)"
msgstr "Anglès (RU, tecles Win ampliades)"
-#: ../rules/base.xml.in.h:791
+#: ../rules/base.xml.in.h:792
msgid "English (UK, international with dead keys)"
msgstr "Anglès (RU, internacional amb tecles mortes)"
-#: ../rules/base.xml.in.h:792
+#: ../rules/base.xml.in.h:793
msgid "English (UK, Dvorak)"
msgstr "Anglès (RU, dvorak)"
-#: ../rules/base.xml.in.h:793
+#: ../rules/base.xml.in.h:794
msgid "English (UK, Dvorak with UK punctuation)"
msgstr "Anglès (RU, dvorak amb puntuació RU)"
-#: ../rules/base.xml.in.h:794
+#: ../rules/base.xml.in.h:795
msgid "English (UK, Macintosh)"
msgstr "Anglès (RU, Macintosh)"
-#: ../rules/base.xml.in.h:795
+#: ../rules/base.xml.in.h:796
msgid "English (UK, Macintosh international)"
msgstr "Anglès (RU, Macintosh internacional)"
-#: ../rules/base.xml.in.h:796
+#: ../rules/base.xml.in.h:797
msgid "English (UK, Colemak)"
msgstr "Anglès (RU, Colemak)"
-#: ../rules/base.xml.in.h:797
+#: ../rules/base.xml.in.h:798
msgid "Uzbek"
msgstr "Usbec"
-#: ../rules/base.xml.in.h:798
+#: ../rules/base.xml.in.h:799
msgid "Uzbek (Latin)"
msgstr "Usbec (llatí)"
#. Keyboard indicator for Vietnamese layouts
-#: ../rules/base.xml.in.h:800
+#: ../rules/base.xml.in.h:801
msgid "vi"
msgstr "vi"
-#: ../rules/base.xml.in.h:801
+#: ../rules/base.xml.in.h:802
msgid "Vietnamese"
msgstr "Vietnamita"
#. Keyboard indicator for Korean layouts
-#: ../rules/base.xml.in.h:803 ../rules/base.extras.xml.in.h:126
+#: ../rules/base.xml.in.h:804 ../rules/base.extras.xml.in.h:127
msgid "ko"
msgstr "ko"
-#: ../rules/base.xml.in.h:804 ../rules/base.extras.xml.in.h:127
+#: ../rules/base.xml.in.h:805 ../rules/base.extras.xml.in.h:128
msgid "Korean"
msgstr "Coreà"
-#: ../rules/base.xml.in.h:805
+#: ../rules/base.xml.in.h:806
msgid "Korean (101/104 key compatible)"
msgstr "Coreà (compatible de 101/104 tecles)"
-#: ../rules/base.xml.in.h:806
+#: ../rules/base.xml.in.h:807
msgid "Japanese (PC-98xx Series)"
msgstr "Japonès (sèries PC-98xx)"
#. Keyboard indicator for Irish layouts
-#: ../rules/base.xml.in.h:808
+#: ../rules/base.xml.in.h:809
msgid "ie"
msgstr "ie"
-#: ../rules/base.xml.in.h:809
+#: ../rules/base.xml.in.h:810
msgid "Irish"
msgstr "Irlandès"
-#: ../rules/base.xml.in.h:810
+#: ../rules/base.xml.in.h:811
msgid "CloGaelach"
msgstr "CloGaelach"
-#: ../rules/base.xml.in.h:811
+#: ../rules/base.xml.in.h:812
msgid "Irish (UnicodeExpert)"
msgstr "Irlandès (UnicodeExpert)"
-#: ../rules/base.xml.in.h:812
+#: ../rules/base.xml.in.h:813
msgid "Ogham"
msgstr "Ogham"
-#: ../rules/base.xml.in.h:813
+#: ../rules/base.xml.in.h:814
msgid "Ogham (IS434)"
msgstr "Ogham (IS434)"
-#: ../rules/base.xml.in.h:814
+#: ../rules/base.xml.in.h:815
msgid "Urdu (Pakistan)"
msgstr "Urdú (Pakistan)"
-#: ../rules/base.xml.in.h:815
+#: ../rules/base.xml.in.h:816
msgid "Urdu (Pakistan, CRULP)"
msgstr "Urdú (Pakistan, CRULP)"
-#: ../rules/base.xml.in.h:816
+#: ../rules/base.xml.in.h:817
msgid "Urdu (Pakistan, NLA)"
msgstr "Urdú (Pakistan, NLA)"
-#: ../rules/base.xml.in.h:817
+#: ../rules/base.xml.in.h:818
msgid "Arabic (Pakistan)"
msgstr "Àrab (Pakistan)"
#. Keyboard indicator for Sindhi layouts
-#: ../rules/base.xml.in.h:819
+#: ../rules/base.xml.in.h:820
msgid "sd"
msgstr "sd"
-#: ../rules/base.xml.in.h:820
+#: ../rules/base.xml.in.h:821
msgid "Sindhi"
msgstr "Sindhi"
#. Keyboard indicator for Dhivehi layouts
-#: ../rules/base.xml.in.h:822
+#: ../rules/base.xml.in.h:823
msgid "dv"
msgstr "dv"
-#: ../rules/base.xml.in.h:823
+#: ../rules/base.xml.in.h:824
msgid "Dhivehi"
msgstr "Diveí"
-#: ../rules/base.xml.in.h:824
+#: ../rules/base.xml.in.h:825
msgid "English (South Africa)"
msgstr "Anglès (Sud-àfrica)"
#. Keyboard indicator for Esperanto layouts
-#: ../rules/base.xml.in.h:826
+#: ../rules/base.xml.in.h:827
msgid "eo"
msgstr "eo"
-#: ../rules/base.xml.in.h:827
+#: ../rules/base.xml.in.h:828
msgid "Esperanto"
msgstr "Esperanto"
-#: ../rules/base.xml.in.h:828
+#: ../rules/base.xml.in.h:829
msgid "Esperanto (displaced semicolon and quote, obsolete)"
msgstr "Esperanto (punt i coma i cometa desplaçats, obsolet)"
#. Keyboard indicator for Nepali layouts
-#: ../rules/base.xml.in.h:830
+#: ../rules/base.xml.in.h:831
msgid "ne"
msgstr "ne"
-#: ../rules/base.xml.in.h:831
+#: ../rules/base.xml.in.h:832
msgid "Nepali"
msgstr "Nepalès"
-#: ../rules/base.xml.in.h:832
+#: ../rules/base.xml.in.h:833
msgid "English (Nigeria)"
msgstr "Anglès (Nigèria)"
#. Keyboard indicator for Igbo layouts
-#: ../rules/base.xml.in.h:834
+#: ../rules/base.xml.in.h:835
msgid "ig"
msgstr "ig"
-#: ../rules/base.xml.in.h:835
+#: ../rules/base.xml.in.h:836
msgid "Igbo"
msgstr "Igbo"
#. Keyboard indicator for Yoruba layouts
-#: ../rules/base.xml.in.h:837
+#: ../rules/base.xml.in.h:838
msgid "yo"
msgstr "yo"
-#: ../rules/base.xml.in.h:838
+#: ../rules/base.xml.in.h:839
msgid "Yoruba"
msgstr "Ioruba"
#. Keyboard indicator for Amharic layouts
-#: ../rules/base.xml.in.h:840
+#: ../rules/base.xml.in.h:841
msgid "am"
msgstr "am"
-#: ../rules/base.xml.in.h:841
+#: ../rules/base.xml.in.h:842
msgid "Amharic"
msgstr "Amhàric"
#. Keyboard indicator for Wolof layouts
-#: ../rules/base.xml.in.h:843
+#: ../rules/base.xml.in.h:844
msgid "wo"
msgstr "wo"
-#: ../rules/base.xml.in.h:844
+#: ../rules/base.xml.in.h:845
msgid "Wolof"
msgstr "Wolof"
#. Keyboard indicator for Braille layouts
-#: ../rules/base.xml.in.h:846
+#: ../rules/base.xml.in.h:847
msgid "brl"
msgstr "brl"
-#: ../rules/base.xml.in.h:847
+#: ../rules/base.xml.in.h:848
msgid "Braille"
msgstr "Braille"
-#: ../rules/base.xml.in.h:848
+#: ../rules/base.xml.in.h:849
msgid "Braille (left hand)"
msgstr "Braille (ma esquerra)"
-#: ../rules/base.xml.in.h:849
+#: ../rules/base.xml.in.h:850
msgid "Braille (right hand)"
msgstr "Braille (ma dretà)"
#. Keyboard indicator for Turkmen layouts
-#: ../rules/base.xml.in.h:851
+#: ../rules/base.xml.in.h:852
msgid "tk"
msgstr "tk"
-#: ../rules/base.xml.in.h:852
+#: ../rules/base.xml.in.h:853
msgid "Turkmen"
msgstr "Turcman"
-#: ../rules/base.xml.in.h:853
+#: ../rules/base.xml.in.h:854
msgid "Turkmen (Alt-Q)"
msgstr "Turcman (Alt-Q)"
#. Keyboard indicator for Bambara layouts
-#: ../rules/base.xml.in.h:855
+#: ../rules/base.xml.in.h:856
msgid "bm"
msgstr "bm"
-#: ../rules/base.xml.in.h:856
+#: ../rules/base.xml.in.h:857
msgid "Bambara"
msgstr "Bambara"
-#: ../rules/base.xml.in.h:857
+#: ../rules/base.xml.in.h:858
msgid "French (Mali, alternative)"
msgstr "Francès (Mali, alternatiu)"
-#: ../rules/base.xml.in.h:858
+#: ../rules/base.xml.in.h:859
msgid "English (Mali, US Macintosh)"
msgstr "Anglès (Mali, Macintosh EUA)"
-#: ../rules/base.xml.in.h:859
+#: ../rules/base.xml.in.h:860
msgid "English (Mali, US international)"
msgstr "Anglès (Mali, internacional EUA)"
#. Keyboard indicator for Swahili layouts
-#: ../rules/base.xml.in.h:861
+#: ../rules/base.xml.in.h:862
msgid "sw"
msgstr "sw"
-#: ../rules/base.xml.in.h:862
+#: ../rules/base.xml.in.h:863
msgid "Swahili (Tanzania)"
msgstr "Suahili (Tanzània)"
-#: ../rules/base.xml.in.h:863
+#: ../rules/base.xml.in.h:864
msgid "Swahili (Kenya)"
msgstr "Suahili (Kenya)"
-#: ../rules/base.xml.in.h:864
+#: ../rules/base.xml.in.h:865
msgid "Kikuyu"
msgstr "Kikuyu"
#. Keyboard indicator for Tswana layouts
-#: ../rules/base.xml.in.h:866
+#: ../rules/base.xml.in.h:867
msgid "tn"
msgstr "tn"
-#: ../rules/base.xml.in.h:867
+#: ../rules/base.xml.in.h:868
msgid "Tswana"
msgstr "Tswana"
#. Keyboard indicator for Filipino layouts
-#: ../rules/base.xml.in.h:869
+#: ../rules/base.xml.in.h:870
msgid "ph"
msgstr "ph"
-#: ../rules/base.xml.in.h:870
+#: ../rules/base.xml.in.h:871
msgid "Filipino"
msgstr "Filipí"
-#: ../rules/base.xml.in.h:871
+#: ../rules/base.xml.in.h:872
msgid "Filipino (QWERTY Baybayin)"
msgstr "Filipí (QWERTY Baybayin)"
-#: ../rules/base.xml.in.h:872
+#: ../rules/base.xml.in.h:873
msgid "Filipino (Capewell-Dvorak Latin)"
msgstr "Filipí (Capewell-dvorak llatí)"
-#: ../rules/base.xml.in.h:873
+#: ../rules/base.xml.in.h:874
msgid "Filipino (Capewell-Dvorak Baybayin)"
msgstr "Filipí (Capewell-dvorak Baybayin)"
-#: ../rules/base.xml.in.h:874
+#: ../rules/base.xml.in.h:875
msgid "Filipino (Capewell-QWERF 2006 Latin)"
msgstr "Filipí (Capewell-QWERF 2006 llatí)"
-#: ../rules/base.xml.in.h:875
+#: ../rules/base.xml.in.h:876
msgid "Filipino (Capewell-QWERF 2006 Baybayin)"
msgstr "Filipí (Capewell-QWERF 2006 Baybayin)"
-#: ../rules/base.xml.in.h:876
+#: ../rules/base.xml.in.h:877
msgid "Filipino (Colemak Latin)"
msgstr "Filipí (Colemak llatí)"
-#: ../rules/base.xml.in.h:877
+#: ../rules/base.xml.in.h:878
msgid "Filipino (Colemak Baybayin)"
msgstr "Filipí (Colemak Baybayin)"
-#: ../rules/base.xml.in.h:878
+#: ../rules/base.xml.in.h:879
msgid "Filipino (Dvorak Latin)"
msgstr "Filipí (dvorak llatí)"
-#: ../rules/base.xml.in.h:879
+#: ../rules/base.xml.in.h:880
msgid "Filipino (Dvorak Baybayin)"
msgstr "Filipí (dvorak Baybayin)"
-#: ../rules/base.xml.in.h:880
+#: ../rules/base.xml.in.h:881
msgid "md"
msgstr "md"
-#: ../rules/base.xml.in.h:881
+#: ../rules/base.xml.in.h:882
msgid "Moldavian"
msgstr "Moldau"
-#: ../rules/base.xml.in.h:882
+#: ../rules/base.xml.in.h:883
msgid "gag"
msgstr "gag"
-#: ../rules/base.xml.in.h:883
+#: ../rules/base.xml.in.h:884
msgid "Moldavian (Gagauz)"
msgstr "Moldau (Gagauz)"
-#: ../rules/base.xml.in.h:884
+#: ../rules/base.xml.in.h:885
msgid "Switching to another layout"
msgstr "Canvi a una altra disposició"
-#: ../rules/base.xml.in.h:885
+#: ../rules/base.xml.in.h:886
msgid "Right Alt (while pressed)"
msgstr "Alt dreta (mentre està premuda)"
-#: ../rules/base.xml.in.h:886
+#: ../rules/base.xml.in.h:887
msgid "Left Alt (while pressed)"
msgstr "Alt esquerra (mentre està premuda)"
-#: ../rules/base.xml.in.h:887
+#: ../rules/base.xml.in.h:888
msgid "Left Win (while pressed)"
msgstr "Win esquerra (mentre està premuda)"
-#: ../rules/base.xml.in.h:888
+#: ../rules/base.xml.in.h:889
msgid "Right Win (while pressed)"
msgstr "Win dreta (mentre està premuda)"
-#: ../rules/base.xml.in.h:889
+#: ../rules/base.xml.in.h:890
msgid "Any Win key (while pressed)"
msgstr "Qualsevol tecla Win (mentre estan premudes)"
-#: ../rules/base.xml.in.h:890
+#: ../rules/base.xml.in.h:891
msgid "Caps Lock (while pressed), Alt+Caps Lock does the original capslock action"
msgstr "Bloq Maj (mentre està premuda), Alt+Bloq Maj efectua l'acció de Bloq Maj original"
-#: ../rules/base.xml.in.h:891
+#: ../rules/base.xml.in.h:892
msgid "Right Ctrl (while pressed)"
msgstr "Ctrl dreta (mentre està premuda)"
-#: ../rules/base.xml.in.h:892
+#: ../rules/base.xml.in.h:893
msgid "Right Alt"
msgstr "Alt dreta"
-#: ../rules/base.xml.in.h:893
+#: ../rules/base.xml.in.h:894
msgid "Left Alt"
msgstr "Alt esquerra"
-#: ../rules/base.xml.in.h:894
+#: ../rules/base.xml.in.h:895
msgid "Caps Lock"
msgstr "Bloq Majús"
-#: ../rules/base.xml.in.h:895
+#: ../rules/base.xml.in.h:896
msgid "Shift+Caps Lock"
msgstr "Maj+Bloq Maj"
-#: ../rules/base.xml.in.h:896
+#: ../rules/base.xml.in.h:897
msgid "Caps Lock (to first layout), Shift+Caps Lock (to last layout)"
msgstr "Bloq Maj (a la primera disposició), Maj+Bloq Maj (a la darrera disposició)"
-#: ../rules/base.xml.in.h:897
+#: ../rules/base.xml.in.h:898
msgid "Left Win (to first layout), Right Win/Menu (to last layout)"
msgstr "Win esquerra (a la primera disposició), Win/Menú dreta (a la darrera disposició)"
-#: ../rules/base.xml.in.h:898
+#: ../rules/base.xml.in.h:899
msgid "Left Ctrl (to first layout), Right Ctrl (to last layout)"
msgstr "Ctrl esquerra (a la primera disposició), Ctrl dreta (a la darrera disposició)"
-#: ../rules/base.xml.in.h:899
+#: ../rules/base.xml.in.h:900
msgid "Alt+Caps Lock"
msgstr "Alt+Bloq Maj"
-#: ../rules/base.xml.in.h:900
+#: ../rules/base.xml.in.h:901
msgid "Both Shift keys together"
msgstr "Les dues tecles Maj juntes"
-#: ../rules/base.xml.in.h:901
+#: ../rules/base.xml.in.h:902
msgid "Both Alt keys together"
msgstr "Les dues tecles Alt juntes"
-#: ../rules/base.xml.in.h:902
+#: ../rules/base.xml.in.h:903
msgid "Both Ctrl keys together"
msgstr "Les dues tecles Ctrl juntes"
-#: ../rules/base.xml.in.h:903
+#: ../rules/base.xml.in.h:904
msgid "Ctrl+Shift"
msgstr "Ctrl+Maj"
-#: ../rules/base.xml.in.h:904
+#: ../rules/base.xml.in.h:905
msgid "Left Ctrl+Left Shift"
msgstr "Ctrl esquerra+Maj esquerra"
-#: ../rules/base.xml.in.h:905
+#: ../rules/base.xml.in.h:906
msgid "Right Ctrl+Right Shift"
msgstr "Ctrl dreta+Maj dreta"
-#: ../rules/base.xml.in.h:906
+#: ../rules/base.xml.in.h:907
msgid "Alt+Ctrl"
msgstr "Alt+Ctrl"
-#: ../rules/base.xml.in.h:907
+#: ../rules/base.xml.in.h:908
msgid "Alt+Shift"
msgstr "Alt+Maj"
-#: ../rules/base.xml.in.h:908
+#: ../rules/base.xml.in.h:909
msgid "Left Alt+Left Shift"
msgstr "Alt esquerra+Maj esquerra"
-#: ../rules/base.xml.in.h:909
+#: ../rules/base.xml.in.h:910
msgid "Alt+Space"
msgstr "Alt+Espai"
-#: ../rules/base.xml.in.h:910
+#: ../rules/base.xml.in.h:911
msgid "Menu"
msgstr "Menú"
-#: ../rules/base.xml.in.h:911
+#: ../rules/base.xml.in.h:912
msgid "Left Win"
msgstr "Win esquerra"
-#: ../rules/base.xml.in.h:912
+#: ../rules/base.xml.in.h:913
msgid "Right Win"
msgstr "Win dreta"
-#: ../rules/base.xml.in.h:913
+#: ../rules/base.xml.in.h:914
msgid "Left Shift"
msgstr "Maj esquerra"
-#: ../rules/base.xml.in.h:914
+#: ../rules/base.xml.in.h:915
msgid "Right Shift"
msgstr "Maj dreta"
-#: ../rules/base.xml.in.h:915
+#: ../rules/base.xml.in.h:916
msgid "Left Ctrl"
msgstr "Ctrl esquerra"
-#: ../rules/base.xml.in.h:916
+#: ../rules/base.xml.in.h:917
msgid "Right Ctrl"
msgstr "Ctrl dreta"
-#: ../rules/base.xml.in.h:917
+#: ../rules/base.xml.in.h:918
msgid "Scroll Lock"
msgstr "Bloq Despl"
-#: ../rules/base.xml.in.h:918
+#: ../rules/base.xml.in.h:919
msgid "LeftCtrl+LeftWin (to first layout), RightCtrl+Menu (to second layout)"
msgstr "Ctrl esquerra+Win esquerra (a la primera disposició), Ctrl dreta+Menú (a la segona disposició)"
-#: ../rules/base.xml.in.h:919
+#: ../rules/base.xml.in.h:920
msgid "Key to choose 3rd level"
msgstr "Tecla per a seleccionar el 3r nivell"
-#: ../rules/base.xml.in.h:920
+#: ../rules/base.xml.in.h:921
msgid "Any Win key"
msgstr "Qualsevol tecla Win"
-#: ../rules/base.xml.in.h:921
+#: ../rules/base.xml.in.h:922
msgid "Any Alt key"
msgstr "Qualsevol tecla Alt"
-#: ../rules/base.xml.in.h:922
+#: ../rules/base.xml.in.h:923
msgid "Right Alt, Shift+Right Alt key is Compose"
msgstr "Alt dreta, Maj+Alt dreta és la «Compose»"
-#: ../rules/base.xml.in.h:923
+#: ../rules/base.xml.in.h:924
msgid "Right Alt key never chooses 3rd level"
msgstr "La tecla Alt dreta mai selecciona el 3r nivell"
-#: ../rules/base.xml.in.h:924
+#: ../rules/base.xml.in.h:925
msgid "Enter on keypad"
msgstr "Retorn en el teclat numèric"
-#: ../rules/base.xml.in.h:925
+#: ../rules/base.xml.in.h:926
msgid "Backslash"
msgstr "Barra inversa"
-#: ../rules/base.xml.in.h:926
+#: ../rules/base.xml.in.h:927
msgid "&lt;Less/Greater&gt;"
msgstr "&lt;Més petit/Més gran&gt;"
-#: ../rules/base.xml.in.h:927
+#: ../rules/base.xml.in.h:928
msgid "Caps Lock chooses 3rd level, acts as onetime lock when pressed together with another 3rd-level-chooser"
msgstr "Bloq Maj selecciona el nivell 3r, bloqueja un cop en prémer conjuntament amb un altre selector de nivell 3r"
-#: ../rules/base.xml.in.h:928
+#: ../rules/base.xml.in.h:929
msgid "Backslash chooses 3rd level, acts as onetime lock when pressed together with another 3rd-level-chooser"
msgstr "Barra inversa selecciona el nivell 3r, bloqueja un cop en prémer conjuntament amb un altre selector de 3r nivell"
-#: ../rules/base.xml.in.h:929
+#: ../rules/base.xml.in.h:930
msgid "&lt;Less/Greater&gt; chooses 3rd level, acts as onetime lock when pressed together with another 3rd-level-chooser"
msgstr "&lt;Més petit/Més gran&gt; selecciona el nivell 3r, bloqueja un cop en prémer conjuntament amb un altre selector de nivell 3r"
-#: ../rules/base.xml.in.h:930
+#: ../rules/base.xml.in.h:931
msgid "Ctrl key position"
msgstr "Posició de la tecla Ctrl"
-#: ../rules/base.xml.in.h:931
+#: ../rules/base.xml.in.h:932
msgid "Caps Lock as Ctrl"
msgstr "Bloq Majús com a Ctrl"
-#: ../rules/base.xml.in.h:932
+#: ../rules/base.xml.in.h:933
msgid "Left Ctrl as Meta"
msgstr "Ctrl esquerra com a Meta"
-#: ../rules/base.xml.in.h:933
+#: ../rules/base.xml.in.h:934
msgid "Swap Ctrl and Caps Lock"
msgstr "Intercanvia Ctrl i Bloq Maj"
-#: ../rules/base.xml.in.h:934
+#: ../rules/base.xml.in.h:935
msgid "At left of 'A'"
msgstr "A l'esquerra d'«A»"
-#: ../rules/base.xml.in.h:935
+#: ../rules/base.xml.in.h:936
msgid "At bottom left"
msgstr "A baix esquerra"
-#: ../rules/base.xml.in.h:936
+#: ../rules/base.xml.in.h:937
msgid "Right Ctrl as Right Alt"
msgstr "Ctrl dreta com a Alt dreta"
-#: ../rules/base.xml.in.h:937
+#: ../rules/base.xml.in.h:938
msgid "Menu as Right Ctrl"
msgstr "Menú com a Ctrl dreta"
-#: ../rules/base.xml.in.h:938
+#: ../rules/base.xml.in.h:939
msgid "Right Alt as Right Ctrl"
msgstr "Alt dreta com a Ctrl dreta"
-#: ../rules/base.xml.in.h:939
+#: ../rules/base.xml.in.h:940
+msgid "Swap Left Alt key with Left Ctrl key"
+msgstr "Intercanvia la tecla Alt esquerra per la tecla Ctrl esquerra"
+
+#: ../rules/base.xml.in.h:941
+msgid "Swap Left Win key with Left Ctrl key"
+msgstr "Intercanvia la tecla Win esquerra per la tecla Ctrl esquerra"
+
+#: ../rules/base.xml.in.h:942
+msgid "Left Alt as Ctrl, Left Ctrl as Win, Left Win as Alt"
+msgstr "Alt esquerra com a Ctrl, Ctrl esquerra com a Win, Win esquerra com a Alt"
+
+#: ../rules/base.xml.in.h:943
msgid "Use keyboard LED to show alternative layout"
msgstr "Usa el LED del teclat per a mostrar la disposició alternativa"
-#: ../rules/base.xml.in.h:940
+#: ../rules/base.xml.in.h:944
msgid "Num Lock"
msgstr "Bloq Núm"
-#: ../rules/base.xml.in.h:941
+#: ../rules/base.xml.in.h:945
msgid "Layout of numeric keypad"
msgstr "Disposició del teclat numèric"
-#: ../rules/base.xml.in.h:942
+#: ../rules/base.xml.in.h:946
msgid "Legacy"
msgstr "Antic"
-#: ../rules/base.xml.in.h:943
+#: ../rules/base.xml.in.h:947
msgid "Unicode additions (arrows and math operators)"
msgstr "Addicions Unicode (fletxes i operadors matemàtics)"
-#: ../rules/base.xml.in.h:944
+#: ../rules/base.xml.in.h:948
msgid "Unicode additions (arrows and math operators; math operators on default level)"
msgstr "Addicions Unicode (fletxes i operadors matemàtics; els operadors matemàtics al nivell per defecte)"
-#: ../rules/base.xml.in.h:945
+#: ../rules/base.xml.in.h:949
msgid "Legacy Wang 724"
msgstr "Wang 724 antic"
-#: ../rules/base.xml.in.h:946
+#: ../rules/base.xml.in.h:950
msgid "Wang 724 keypad with Unicode additions (arrows and math operators)"
msgstr "Teclat numèric Wang 724 amb addicions Unicode (fletxes i operadors matemàtics)"
-#: ../rules/base.xml.in.h:947
+#: ../rules/base.xml.in.h:951
msgid "Wang 724 keypad with Unicode additions (arrows and math operators; math operators on default level)"
msgstr "Teclat numèric Wang 724 amb addicions Unicode (fletxes i operadors matemàtics; els operadors matemàtics en el nivell per defecte)"
-#: ../rules/base.xml.in.h:948
+#: ../rules/base.xml.in.h:952
msgid "Hexadecimal"
msgstr "Hexadecimal"
-#: ../rules/base.xml.in.h:949
+#: ../rules/base.xml.in.h:953
msgid "ATM/phone-style"
msgstr "Estil ATM/telèfon"
-#: ../rules/base.xml.in.h:950
+#: ../rules/base.xml.in.h:954
msgid "Numeric keypad delete key behaviour"
msgstr "Comportament de la tecla de supressió del teclat numèric"
-#: ../rules/base.xml.in.h:951
+#: ../rules/base.xml.in.h:955
msgid "Legacy key with dot"
msgstr "Tecla antiga amb punt"
#. Actually, with KP_SEPARATOR, as the old keypad(comma)
-#: ../rules/base.xml.in.h:953
+#: ../rules/base.xml.in.h:957
msgid "Legacy key with comma"
msgstr "Tecla antiga amb coma"
-#: ../rules/base.xml.in.h:954
+#: ../rules/base.xml.in.h:958
msgid "Four-level key with dot"
msgstr "Tecla de quatre nivells amb punt"
-#: ../rules/base.xml.in.h:955
+#: ../rules/base.xml.in.h:959
msgid "Four-level key with dot, Latin-9 only"
msgstr "Tecla de quatre nivells amb punt, només llatí-9"
-#: ../rules/base.xml.in.h:956
+#: ../rules/base.xml.in.h:960
msgid "Four-level key with comma"
msgstr "Tecla de quatre nivells amb coma"
# Què collons és momayyez? jm
-#: ../rules/base.xml.in.h:957
+#: ../rules/base.xml.in.h:961
msgid "Four-level key with momayyez"
msgstr "Tecla de quatre nivells amb momayyez"
#. This assumes the KP_ abstract symbols are actually useful for some apps
#. The description needs to be rewritten
-#: ../rules/base.xml.in.h:960
+#: ../rules/base.xml.in.h:964
msgid "Four-level key with abstract separators"
msgstr "Tecla de quatre nivells amb separadors abstractes"
-#: ../rules/base.xml.in.h:961
+#: ../rules/base.xml.in.h:965
msgid "Semicolon on third level"
msgstr "Punt i coma al tercer nivell"
-#: ../rules/base.xml.in.h:962
+#: ../rules/base.xml.in.h:966
msgid "Caps Lock key behavior"
msgstr "Comportament de la tecla Bloq Maj"
-#: ../rules/base.xml.in.h:963
+#: ../rules/base.xml.in.h:967
msgid "Caps Lock uses internal capitalization; Shift \"pauses\" Caps Lock"
msgstr "Bloq Maj usa internament les majúscules; Maj «pausa» Bloq Maj"
-#: ../rules/base.xml.in.h:964
+#: ../rules/base.xml.in.h:968
msgid "Caps Lock uses internal capitalization; Shift doesn't affect Caps Lock"
msgstr "Bloq Maj usa internament les majúscules; Maj no afecta a Bloq Maj"
-#: ../rules/base.xml.in.h:965
+#: ../rules/base.xml.in.h:969
msgid "Caps Lock acts as Shift with locking; Shift \"pauses\" Caps Lock"
msgstr "Bloq Maj actua com a Maj amb bloqueig; Maj «pausa» Bloq Maj"
-#: ../rules/base.xml.in.h:966
+#: ../rules/base.xml.in.h:970
msgid "Caps Lock acts as Shift with locking; Shift doesn't affect Caps Lock"
msgstr "Bloq Maj actua com a Maj amb bloqueig; Maj no afecta a Bloq Maj"
-#: ../rules/base.xml.in.h:967
+#: ../rules/base.xml.in.h:971
msgid "Caps Lock toggles normal capitalization of alphabetic characters"
msgstr "Bloq Maj commuta les majúscules normals dels caràcters alfabètics"
-#: ../rules/base.xml.in.h:968
+#: ../rules/base.xml.in.h:972
msgid "Make Caps Lock an additional Num Lock"
msgstr "Converteix Bloq Maj en un Bloq Núm addicional"
-#: ../rules/base.xml.in.h:969
+#: ../rules/base.xml.in.h:973
msgid "Swap ESC and Caps Lock"
msgstr "Intercanvia Esc i Bloq Maj"
-#: ../rules/base.xml.in.h:970
+#: ../rules/base.xml.in.h:974
msgid "Make Caps Lock an additional ESC"
msgstr "Converteix Bloq Maj en un Esc addicional"
-#: ../rules/base.xml.in.h:971
+#: ../rules/base.xml.in.h:975
msgid "Make Caps Lock an additional Backspace"
msgstr "Converteix Bloq Maj en un Retrocés addicional"
-#: ../rules/base.xml.in.h:972
+#: ../rules/base.xml.in.h:976
msgid "Make Caps Lock an additional Super"
msgstr "Converteix Bloq Maj en un Super addicional"
-#: ../rules/base.xml.in.h:973
+#: ../rules/base.xml.in.h:977
msgid "Make Caps Lock an additional Hyper"
msgstr "Converteix Bloq Maj en un Hyper addicional"
-#: ../rules/base.xml.in.h:974
+#: ../rules/base.xml.in.h:978
msgid "Caps Lock toggles ShiftLock (affects all keys)"
msgstr "Bloq Maj commuta Maj (afecta a totes les tecles)"
-#: ../rules/base.xml.in.h:975
+#: ../rules/base.xml.in.h:979
msgid "Caps Lock is disabled"
msgstr "Bloq Maj està deshabilitat"
-#: ../rules/base.xml.in.h:976
+#: ../rules/base.xml.in.h:980
msgid "Make Caps Lock an additional Ctrl"
msgstr "Converteix Bloq Maj en un Ctrl addicional"
-#: ../rules/base.xml.in.h:977
+#: ../rules/base.xml.in.h:981
msgid "Alt/Win key behavior"
msgstr "Comportament de la tecla Alt/Win"
-#: ../rules/base.xml.in.h:978
+#: ../rules/base.xml.in.h:982
msgid "Add the standard behavior to Menu key"
msgstr "Afegeix el comportament estàndard a la tecla Menú"
-#: ../rules/base.xml.in.h:979
+#: ../rules/base.xml.in.h:983
msgid "Alt and Meta are on Alt keys"
msgstr "Alt i Meta són a les tecles Alt"
-#: ../rules/base.xml.in.h:980
+#: ../rules/base.xml.in.h:984
msgid "Alt is mapped to Win keys (and the usual Alt keys)"
msgstr "Alt s'assigna a les tecles Win (i a les tecles Alt habituals)"
-#: ../rules/base.xml.in.h:981
+#: ../rules/base.xml.in.h:985
msgid "Ctrl is mapped to Win keys (and the usual Ctrl keys)"
msgstr "Ctrl s'assigna a les tecles Win (i a les tecles Ctrl habituals)"
-#: ../rules/base.xml.in.h:982
+#: ../rules/base.xml.in.h:986
msgid "Ctrl is mapped to Alt keys, Alt is mapped to Win keys"
msgstr "Ctrl s'assigna a les tecles Alt, Alt s'assigna a les tecles Win"
-#: ../rules/base.xml.in.h:983
+#: ../rules/base.xml.in.h:987
msgid "Meta is mapped to Win keys"
msgstr "Meta s'assigna a les tecles Win"
-#: ../rules/base.xml.in.h:984
+#: ../rules/base.xml.in.h:988
msgid "Meta is mapped to Left Win"
msgstr "Meta s'assigna a la tecla Win esquerra"
-#: ../rules/base.xml.in.h:985
+#: ../rules/base.xml.in.h:989
msgid "Hyper is mapped to Win-keys"
msgstr "Hyper s'assigna a les tecles Win"
-#: ../rules/base.xml.in.h:986
+#: ../rules/base.xml.in.h:990
msgid "Alt is mapped to Right Win, Super to Menu"
msgstr "Alt s'assigna a la tecla Win dreta i Super a Menú"
-#: ../rules/base.xml.in.h:987
+#: ../rules/base.xml.in.h:991
msgid "Alt is swapped with Win"
msgstr "Alt està intercanviada amb la tecla Win"
-#: ../rules/base.xml.in.h:988
+#: ../rules/base.xml.in.h:992
msgid "Position of Compose key"
msgstr "Posició de la tecla «Compose»"
-#: ../rules/base.xml.in.h:989
+#: ../rules/base.xml.in.h:993
msgid "3rd level of Left Win"
msgstr "3r nivell de Win esquerra"
-#: ../rules/base.xml.in.h:990
+#: ../rules/base.xml.in.h:994
msgid "3rd level of Right Win"
msgstr "3r nivell de Win dreta"
-#: ../rules/base.xml.in.h:991
+#: ../rules/base.xml.in.h:995
msgid "3rd level of Menu"
msgstr "3r nivell de Menú"
-#: ../rules/base.xml.in.h:992
+#: ../rules/base.xml.in.h:996
msgid "3rd level of Left Ctrl"
msgstr "3r nivell de Ctrl esquerra"
-#: ../rules/base.xml.in.h:993
+#: ../rules/base.xml.in.h:997
msgid "3rd level of Right Ctrl"
msgstr "3r nivell de Ctrl dreta"
-#: ../rules/base.xml.in.h:994
+#: ../rules/base.xml.in.h:998
msgid "3rd level of Caps Lock"
msgstr "3r nivell de Bloq Maj"
-#: ../rules/base.xml.in.h:995
+#: ../rules/base.xml.in.h:999
msgid "3rd level of &lt;Less/Greater&gt;"
msgstr "3r nivell de &lt;Més petit/Més gran&gt;"
-#: ../rules/base.xml.in.h:996
+#: ../rules/base.xml.in.h:1000
msgid "Pause"
msgstr "Pausa"
-#: ../rules/base.xml.in.h:997
+#: ../rules/base.xml.in.h:1001
msgid "PrtSc"
msgstr "ImprPant"
-#: ../rules/base.xml.in.h:998
+#: ../rules/base.xml.in.h:1002
msgid "Miscellaneous compatibility options"
msgstr "Opcions de compatibilitat diverses"
-#: ../rules/base.xml.in.h:999
+#: ../rules/base.xml.in.h:1003
msgid "Default numeric keypad keys"
msgstr "Tecles del teclat numèric per defecte"
-#: ../rules/base.xml.in.h:1000
+#: ../rules/base.xml.in.h:1004
msgid "Numeric keypad keys always enter digits (as in Mac OS)"
msgstr "Les tecles del teclat numèric sempre introdueixen dígits (com en el Mac OS)"
-#: ../rules/base.xml.in.h:1001
+#: ../rules/base.xml.in.h:1005
msgid "Shift with numeric keypad keys works as in MS Windows"
msgstr "Maj amb el teclat numèric funciona com al MS Windows"
-#: ../rules/base.xml.in.h:1002
+#: ../rules/base.xml.in.h:1006
msgid "Shift does not cancel Num Lock, chooses 3rd level instead"
msgstr "Maj no cancel·la Bloq Núm, en el seu lloc selecciona el 3r nivell"
-#: ../rules/base.xml.in.h:1003
+#: ../rules/base.xml.in.h:1007
msgid "Special keys (Ctrl+Alt+&lt;key&gt;) handled in a server"
msgstr "Tecles especials (Ctrl+Alt+&lt;tecla&gt;) gestionades en un servidor"
-#: ../rules/base.xml.in.h:1004
+#: ../rules/base.xml.in.h:1008
msgid "Apple Aluminium Keyboard: emulate PC keys (Print, Scroll Lock, Pause, Num Lock)"
msgstr "Teclat Apple Aluminium: emula les tecles del PC (Impr, Bloq Despl, Pausa, Bloq Núm)"
-#: ../rules/base.xml.in.h:1005
+#: ../rules/base.xml.in.h:1009
msgid "Shift cancels Caps Lock"
msgstr "Maj cancel·la Bloq Maj"
-#: ../rules/base.xml.in.h:1006
+#: ../rules/base.xml.in.h:1010
msgid "Enable extra typographic characters"
msgstr "Habilita els caràcters tipogràfics extres"
-#: ../rules/base.xml.in.h:1007
+#: ../rules/base.xml.in.h:1011
msgid "Both Shift keys together toggle Caps Lock"
msgstr "Les dues tecles Maj juntes commuten Bloq Maj"
-#: ../rules/base.xml.in.h:1008
+#: ../rules/base.xml.in.h:1012
msgid "Both Shift keys together activate Caps Lock, one Shift key deactivates"
msgstr "Les dues tecles Maj juntes commuten Bloq Maj, una tecla Maj ho desactiva"
-#: ../rules/base.xml.in.h:1009
+#: ../rules/base.xml.in.h:1013
msgid "Both Shift keys together toggle ShiftLock"
msgstr "Les dues tecles Maj juntes commuten Bloq Maj"
-#: ../rules/base.xml.in.h:1010
+#: ../rules/base.xml.in.h:1014
msgid "Shift + NumLock toggles PointerKeys"
msgstr "Maj + BloqNúm commuta les tecles de cursor"
-#: ../rules/base.xml.in.h:1011
+#: ../rules/base.xml.in.h:1015
msgid "Allow breaking grabs with keyboard actions (warning: security risk)"
msgstr "Permetre trencar la captura amb accions del teclat (avís: risc de seguretat)"
-#: ../rules/base.xml.in.h:1012
+#: ../rules/base.xml.in.h:1016
+msgid "Allow grab and window tree logging"
+msgstr "Permetre l'enregistrament de captura i de l'arbre de finestres"
+
+#: ../rules/base.xml.in.h:1017
msgid "Adding currency signs to certain keys"
msgstr "S'afegeix el signe de moneda a certes tecles"
-#: ../rules/base.xml.in.h:1013
+#: ../rules/base.xml.in.h:1018
msgid "Euro on E"
msgstr "Euro en la E "
-#: ../rules/base.xml.in.h:1014
+#: ../rules/base.xml.in.h:1019
msgid "Euro on 2"
msgstr "Euro en el 2"
-#: ../rules/base.xml.in.h:1015
+#: ../rules/base.xml.in.h:1020
msgid "Euro on 4"
msgstr "Euro en el 4"
-#: ../rules/base.xml.in.h:1016
+#: ../rules/base.xml.in.h:1021
msgid "Euro on 5"
msgstr "Euro en el 5"
-#: ../rules/base.xml.in.h:1017
+#: ../rules/base.xml.in.h:1022
msgid "Rupee on 4"
msgstr "Rupia en el 4"
-#: ../rules/base.xml.in.h:1018
+#: ../rules/base.xml.in.h:1023
msgid "Key to choose 5th level"
msgstr "Tecla per a seleccionar el 5è nivell"
-#: ../rules/base.xml.in.h:1019
+#: ../rules/base.xml.in.h:1024
msgid "&lt;Less/Greater&gt; chooses 5th level, locks when pressed together with another 5th-level-chooser"
msgstr "&lt;Més petit/Més gran&gt; selecciona el nivell 5è, bloqueja en prémer conjuntament amb un altre selector de nivell 5è"
-#: ../rules/base.xml.in.h:1020
+#: ../rules/base.xml.in.h:1025
msgid "Right Alt chooses 5th level, locks when pressed together with another 5th-level-chooser"
msgstr "Alt dreta selecciona el nivell 5è, bloqueja en prémer conjuntament amb un altre selector de nivell 5è"
-#: ../rules/base.xml.in.h:1021
+#: ../rules/base.xml.in.h:1026
msgid "Left Win chooses 5th level, locks when pressed together with another 5th-level-chooser"
msgstr "Win esquerra selecciona el nivell 5è, bloqueja en prémer conjuntament amb un altre selector de nivell 5è"
-#: ../rules/base.xml.in.h:1022
+#: ../rules/base.xml.in.h:1027
msgid "Right Win chooses 5th level, locks when pressed together with another 5th-level-chooser"
msgstr "Win dreta selecciona el nivell 5è, bloqueja en prémer conjuntament amb un altre selector de nivell 5è"
-#: ../rules/base.xml.in.h:1023
+#: ../rules/base.xml.in.h:1028
msgid "Using space key to input non-breakable space character"
msgstr "Usa la tecla d'espai per a introduir un caràcter d'espai sense salt"
-#: ../rules/base.xml.in.h:1024
+#: ../rules/base.xml.in.h:1029
msgid "Usual space at any level"
msgstr "Espai normal en qualsevol nivell"
-#: ../rules/base.xml.in.h:1025
+#: ../rules/base.xml.in.h:1030
msgid "Non-breakable space character at second level"
msgstr "La tecla d'espai produeix un caràcter d'espai sense salt al nivell segon"
-#: ../rules/base.xml.in.h:1026
+#: ../rules/base.xml.in.h:1031
msgid "Non-breakable space character at third level"
msgstr "La tecla d'espai produeix un caràcter d'espai sense salt al nivell tercer"
-#: ../rules/base.xml.in.h:1027
+#: ../rules/base.xml.in.h:1032
msgid "Non-breakable space character at third level, nothing at fourth level"
msgstr "La tecla d'espai produeix un caràcter d'espai sense salt al nivell tercer, i res al nivell quart"
-#: ../rules/base.xml.in.h:1028
+#: ../rules/base.xml.in.h:1033
msgid "Non-breakable space character at third level, thin non-breakable space character at fourth level"
msgstr "La tecla d'espai produeix un caràcter d'espai sense salt al nivell tercer, i un caràcter d'espai fi sense salt al nivell quart"
-#: ../rules/base.xml.in.h:1029
+#: ../rules/base.xml.in.h:1034
msgid "Non-breakable space character at fourth level"
msgstr "Caràcter d'espai sense salt al nivell quart"
-#: ../rules/base.xml.in.h:1030
+#: ../rules/base.xml.in.h:1035
msgid "Non-breakable space character at fourth level, thin non-breakable space character at sixth level"
msgstr "Caràcter d'espai sense salt al nivell quart, i un caràcter d'espai fi sense salt al nivell sisè"
-#: ../rules/base.xml.in.h:1031
+#: ../rules/base.xml.in.h:1036
msgid "Non-breakable space character at fourth level, thin non-breakable space character at sixth level (via Ctrl+Shift)"
msgstr "Caràcter d'espai sense salt al nivell quart, un caràcter d'espai fi sense salt al nivell sisè (via Ctrl+Maj)"
-#: ../rules/base.xml.in.h:1032
+#: ../rules/base.xml.in.h:1037
msgid "Zero-width non-joiner character at second level"
msgstr "Caràcter separador d'amplada zero al nivell segon"
-#: ../rules/base.xml.in.h:1033
+#: ../rules/base.xml.in.h:1038
msgid "Zero-width non-joiner character at second level, zero-width joiner character at third level"
msgstr "Caràcter separador d'amplada zero al nivell segon, un caràcter d'enllaç d'amplada zero al nivell tercer"
-#: ../rules/base.xml.in.h:1034
+#: ../rules/base.xml.in.h:1039
msgid "Zero-width non-joiner character at second level, zero-width joiner character at third level, non-breakable space character at fourth level"
msgstr "Caràcter separador d'amplada zero al nivell segon, un caràcter d'enllaç d'amplada zero al nivell tercer, i un caràcter d'espai sense salt al nivell quart"
-#: ../rules/base.xml.in.h:1035
+#: ../rules/base.xml.in.h:1040
msgid "Zero-width non-joiner character at second level, non-breakable space character at third level"
msgstr "Caràcter separador d'amplada zero al nivell segon, i un caràcter d'espai sense salt al nivell tercer"
-#: ../rules/base.xml.in.h:1036
+#: ../rules/base.xml.in.h:1041
msgid "Zero-width non-joiner character at second level, non-breakable space character at third level, nothing at fourth level"
msgstr "Caràcter separador d'amplada zero al nivell segon, un caràcter d'espai sense salt al nivell tercer, i res al nivell quart"
-#: ../rules/base.xml.in.h:1037
+#: ../rules/base.xml.in.h:1042
msgid "Zero-width non-joiner character at second level, non-breakable space character at third level, zero-width joiner at fourth level"
msgstr "Caràcter separador d'amplada zero al nivell segon, un caràcter d'espai sense salt al nivell tercer, i un enllaç d'amplada zero al nivell quart"
-#: ../rules/base.xml.in.h:1038
+#: ../rules/base.xml.in.h:1043
msgid "Zero-width non-joiner character at second level, non-breakable space character at third level, thin non-breakable space at fourth level"
msgstr "Caràcter separador d'amplada zero al nivell segon, un caràcter d'espai sense salt al nivell tercer, i un caràcter d'espai fi sense salt al nivell quart"
-#: ../rules/base.xml.in.h:1039
+#: ../rules/base.xml.in.h:1044
msgid "Zero-width non-joiner character at third level, zero-width joiner at fourth level"
msgstr "Caràcter separador d'amplada zero al nivell tercer, un enllaç d'amplada zero al nivell quart"
-#: ../rules/base.xml.in.h:1040
+#: ../rules/base.xml.in.h:1045
msgid "Japanese keyboard options"
msgstr "Opcions del teclat japonès"
-#: ../rules/base.xml.in.h:1041
+#: ../rules/base.xml.in.h:1046
msgid "Kana Lock key is locking"
msgstr "La tecla de bloqueig Kana està blocant"
-#: ../rules/base.xml.in.h:1042
+#: ../rules/base.xml.in.h:1047
msgid "NICOLA-F style Backspace"
msgstr "Retrocés estil NICOLA-F"
-#: ../rules/base.xml.in.h:1043
+#: ../rules/base.xml.in.h:1048
msgid "Make Zenkaku Hankaku an additional ESC"
msgstr "Converteix Zenkaku Hankaku en un Esc addicional"
-#: ../rules/base.xml.in.h:1044
+#: ../rules/base.xml.in.h:1049
msgid "Adding Esperanto supersigned letters"
msgstr "S'afegeix les lletres amb diacrític l'esperanto"
-#: ../rules/base.xml.in.h:1045
+#: ../rules/base.xml.in.h:1050
msgid "To the corresponding key in a Qwerty layout"
msgstr "A la tecla corresponent en una disposició qwerty"
-#: ../rules/base.xml.in.h:1046
+#: ../rules/base.xml.in.h:1051
msgid "To the corresponding key in a Dvorak layout"
msgstr "A la tecla corresponent en una disposició dvorak"
-#: ../rules/base.xml.in.h:1047
+#: ../rules/base.xml.in.h:1052
msgid "To the corresponding key in a Colemak layout"
msgstr "A la tecla corresponent en una disposició Coleman"
-#: ../rules/base.xml.in.h:1048
+#: ../rules/base.xml.in.h:1053
msgid "Maintain key compatibility with old Solaris keycodes"
msgstr "Manté la compatibilitat de tecles amb els codis de tecla antics de Solaris"
-#: ../rules/base.xml.in.h:1049
+#: ../rules/base.xml.in.h:1054
msgid "Sun Key compatibility"
msgstr "Compatibilitat amb les tecles Sun"
-#: ../rules/base.xml.in.h:1050
+#: ../rules/base.xml.in.h:1055
msgid "Key sequence to kill the X server"
msgstr "Seqüència de tecles per a matar el servidor X"
-#: ../rules/base.xml.in.h:1051
+#: ../rules/base.xml.in.h:1056
msgid "Ctrl + Alt + Backspace"
msgstr "Ctrl + Alt + Retrocés"
@@ -4022,150 +4042,160 @@ msgstr "Coeur d'Alene Salish"
msgid "English (US, Sun Type 6/7)"
msgstr "Anglès (EUA, Sun Type 6/7)"
-#: ../rules/base.extras.xml.in.h:42
+#: ../rules/base.extras.xml.in.h:40
+msgid "English (Norman)"
+msgstr "Anglès (Normand)"
+
+#: ../rules/base.extras.xml.in.h:43
msgid "Polish (international with dead keys)"
msgstr "Polonès (internacional amb tecles mortes)"
-#: ../rules/base.extras.xml.in.h:43
+#: ../rules/base.extras.xml.in.h:44
msgid "Polish (Colemak)"
msgstr "Polonès (Colemak)"
-#: ../rules/base.extras.xml.in.h:44
+#: ../rules/base.extras.xml.in.h:45
msgid "Polish (Sun Type 6/7)"
msgstr "Polonès (Sun Type 6/7)"
-#: ../rules/base.extras.xml.in.h:48
+#: ../rules/base.extras.xml.in.h:49
msgid "Crimean Tatar (Dobruja Q)"
msgstr "Tàtar de Crimea (Dobruja Q)"
-#: ../rules/base.extras.xml.in.h:49
+#: ../rules/base.extras.xml.in.h:50
msgid "Romanian (ergonomic Touchtype)"
msgstr "Romanès (ergonòmic Touchtype)"
-#: ../rules/base.extras.xml.in.h:50
+#: ../rules/base.extras.xml.in.h:51
msgid "Romanian (Sun Type 6/7)"
msgstr "Romanès (Sun Type 6/7)"
-#: ../rules/base.extras.xml.in.h:53
+#: ../rules/base.extras.xml.in.h:54
msgid "Serbian (combining accents instead of dead keys)"
msgstr "Serbi (combinació d'accents en lloc de tecles mortes)"
-#: ../rules/base.extras.xml.in.h:56
+#: ../rules/base.extras.xml.in.h:57
msgid "Russian (with Ukrainian-Belorussian layout)"
msgstr "Rus (amb disposició ucraïnesa-bielorussa)"
-#: ../rules/base.extras.xml.in.h:57
+#: ../rules/base.extras.xml.in.h:58
msgid "Russian (Sun Type 6/7)"
msgstr "Rus (Sun Type 6/7)"
-#: ../rules/base.extras.xml.in.h:60
+#: ../rules/base.extras.xml.in.h:61
msgid "Armenian (OLPC phonetic)"
msgstr "Armeni (fonètic OLPC)"
-#: ../rules/base.extras.xml.in.h:63
+#: ../rules/base.extras.xml.in.h:64
msgid "Hebrew (Biblical, SIL phonetic)"
msgstr "Hebreu (bíblic, SIL fonètic)"
-#: ../rules/base.extras.xml.in.h:66
+#: ../rules/base.extras.xml.in.h:67
msgid "Arabic (Sun Type 6/7)"
msgstr "Àrab (Sun Type 6/7)"
-#: ../rules/base.extras.xml.in.h:69
+#: ../rules/base.extras.xml.in.h:70
msgid "Belgian (Sun Type 6/7)"
msgstr "Belga (Sun Type 6/7)"
-#: ../rules/base.extras.xml.in.h:72
+#: ../rules/base.extras.xml.in.h:73
msgid "Portuguese (Brazil, Sun Type 6/7)"
msgstr "Portuguès (Brasil, Sun Type 6/7)"
-#: ../rules/base.extras.xml.in.h:75
+#: ../rules/base.extras.xml.in.h:76
msgid "Czech (Sun Type 6/7)"
msgstr "Txec (Sun Type 6/7)"
-#: ../rules/base.extras.xml.in.h:78
+#: ../rules/base.extras.xml.in.h:79
msgid "Danish (Sun Type 6/7)"
msgstr "Danès (Sun Type 6/7)"
-#: ../rules/base.extras.xml.in.h:81
+#: ../rules/base.extras.xml.in.h:82
msgid "Dutch (Sun Type 6/7)"
msgstr "Holandès (Sun Type 6/7)"
-#: ../rules/base.extras.xml.in.h:84
+#: ../rules/base.extras.xml.in.h:85
msgid "Estonian (Sun Type 6/7)"
msgstr "Estonià (Sun Type 6/7)"
-#: ../rules/base.extras.xml.in.h:87
+#: ../rules/base.extras.xml.in.h:88
msgid "Finnish (Sun Type 6/7)"
msgstr "Finès (Sun Type 6/7)"
-#: ../rules/base.extras.xml.in.h:89
+#: ../rules/base.extras.xml.in.h:90
msgid "French (Sun Type 6/7)"
msgstr "Francès (Sun Type 6/7)"
-#: ../rules/base.extras.xml.in.h:92
+#: ../rules/base.extras.xml.in.h:93
msgid "Greek (Sun Type 6/7)"
msgstr "Grec (Sun Type 6/7)"
-#: ../rules/base.extras.xml.in.h:95
+#: ../rules/base.extras.xml.in.h:96
msgid "Italian (Sun Type 6/7)"
msgstr "Italià (Sun Type 6/7)"
-#: ../rules/base.extras.xml.in.h:98
+#: ../rules/base.extras.xml.in.h:99
msgid "Japanese (Sun Type 6)"
msgstr "Japonès (Sun Type 6)"
-#: ../rules/base.extras.xml.in.h:99
+#: ../rules/base.extras.xml.in.h:100
msgid "Japanese (Sun Type 7 - pc compatible)"
msgstr "Japonès (Sun Type 7 - Compatible PC)"
-#: ../rules/base.extras.xml.in.h:100
+#: ../rules/base.extras.xml.in.h:101
msgid "Japanese (Sun Type 7 - sun compatible)"
msgstr "Japonès (Sun Type 7 - Compatible Sun)"
-#: ../rules/base.extras.xml.in.h:103
+#: ../rules/base.extras.xml.in.h:104
msgid "Norwegian (Sun Type 6/7)"
msgstr "Noruec (Sun Type 6/7)"
-#: ../rules/base.extras.xml.in.h:105
+#: ../rules/base.extras.xml.in.h:106
msgid "Portuguese (Sun Type 6/7)"
msgstr "Portuguès (Sun Type 6/7)"
-#: ../rules/base.extras.xml.in.h:108
+#: ../rules/base.extras.xml.in.h:109
msgid "Slovak (Sun Type 6/7)"
msgstr "Eslovac (Sun Type 6/7)"
-#: ../rules/base.extras.xml.in.h:111
+#: ../rules/base.extras.xml.in.h:112
msgid "Spanish (Sun Type 6/7)"
msgstr "Espanyol (Sun Type 6/7)"
-#: ../rules/base.extras.xml.in.h:114
+#: ../rules/base.extras.xml.in.h:115
msgid "Swedish (Sun Type 6/7)"
msgstr "Suec (Sun Type 6/7)"
-#: ../rules/base.extras.xml.in.h:116
+#: ../rules/base.extras.xml.in.h:117
msgid "German (Switzerland, Sun Type 6/7)"
msgstr "Alemany (Suïssa, Sun Type 6/7)"
-#: ../rules/base.extras.xml.in.h:117
+#: ../rules/base.extras.xml.in.h:118
msgid "French (Switzerland, Sun Type 6/7)"
msgstr "Francès (Suïssa, Sun Type 6/7)"
-#: ../rules/base.extras.xml.in.h:120
+#: ../rules/base.extras.xml.in.h:121
msgid "Turkish (Sun Type 6/7)"
msgstr "Turc (Sun Type 6/7)"
-#: ../rules/base.extras.xml.in.h:123
+#: ../rules/base.extras.xml.in.h:124
msgid "Ukrainian (Sun Type 6/7)"
msgstr "Ucraïnès (Sun Type 6/7)"
-#: ../rules/base.extras.xml.in.h:125
+#: ../rules/base.extras.xml.in.h:126
msgid "English (UK, Sun Type 6/7)"
msgstr "Anglès (RU, Sun Type 6/7)"
-#: ../rules/base.extras.xml.in.h:128
+#: ../rules/base.extras.xml.in.h:129
msgid "Korean (Sun Type 6/7)"
msgstr "Coreà (Sun Type 6/7)"
+#~ msgid "Bengali"
+#~ msgstr "Bengalí"
+
+#~ msgid "Portuguese (Brazil, nativo for Esperanto)"
+#~ msgstr "Portuguès (Brasil, natiu per a l'esperanto)"
+
#~ msgid "English (layout toggle on multiply/divide key)"
#~ msgstr "Anglès (commutació de disposició en la tecla de multiplicació/divisió)"
@@ -4436,9 +4466,6 @@ msgstr "Coreà (Sun Type 6/7)"
#~ msgid "Aze"
#~ msgstr "Aze"
-#~ msgid "Bangladesh"
-#~ msgstr "Bangladesh"
-
#~ msgid "Bel"
#~ msgstr "Bel"
diff --git a/xorg-server/xkeyboard-config/po/da.po b/xorg-server/xkeyboard-config/po/da.po
index 67053c6c9..ec2dbd4d5 100644
--- a/xorg-server/xkeyboard-config/po/da.po
+++ b/xorg-server/xkeyboard-config/po/da.po
@@ -31,10 +31,10 @@
#
msgid ""
msgstr ""
-"Project-Id-Version: xkeyboard-config-2.8.99\n"
+"Project-Id-Version: xkeyboard-config-2.10.99\n"
"Report-Msgid-Bugs-To: svu@users.sourceforge.net\n"
-"POT-Creation-Date: 2013-05-15 23:14+0100\n"
-"PO-Revision-Date: 2013-05-19 23:06+0100\n"
+"POT-Creation-Date: 2014-01-15 01:12+0000\n"
+"PO-Revision-Date: 2014-01-18 23:06+0100\n"
"Last-Translator: Joe Hansen <joedalton2@yahoo.dk>\n"
"Language-Team: Danish <dansk@dansk-gruppen.dk>\n"
"Language: da\n"
@@ -842,7 +842,7 @@ msgid "English (programmer Dvorak)"
msgstr "Engelsk (programmørdvorak)"
#. Keyboard indicator for Russian layouts
-#: ../rules/base.xml.in.h:203 ../rules/base.extras.xml.in.h:54
+#: ../rules/base.xml.in.h:203 ../rules/base.extras.xml.in.h:55
msgid "ru"
msgstr "ru"
@@ -859,8 +859,8 @@ msgid "English (international AltGr dead keys)"
msgstr "Engelsk (international AltGr døde taster)"
#: ../rules/base.xml.in.h:207
-msgid "English (layout toggle on multiply/divide key)"
-msgstr "Engelsk (skift layout på gange-/divideretast)"
+msgid "English (the divide/multiply keys toggle the layout)"
+msgstr "Engelsk (divison og gange-tasterne skifter layout)"
#: ../rules/base.xml.in.h:208
msgid "Serbo-Croatian (US)"
@@ -914,11 +914,11 @@ msgid "Uzbek (Afghanistan, OLPC)"
msgstr "Usbekisk (Afghanistan, OLPC)"
#. Keyboard indicator for Arabic layouts
-#: ../rules/base.xml.in.h:224 ../rules/base.extras.xml.in.h:64
+#: ../rules/base.xml.in.h:224 ../rules/base.extras.xml.in.h:65
msgid "ar"
msgstr "ar"
-#: ../rules/base.xml.in.h:225 ../rules/base.extras.xml.in.h:65
+#: ../rules/base.xml.in.h:225 ../rules/base.extras.xml.in.h:66
msgid "Arabic"
msgstr "Arabisk"
@@ -956,11 +956,11 @@ msgid "Albanian"
msgstr "Albansk"
#. Keyboard indicator for Armenian layouts
-#: ../rules/base.xml.in.h:236 ../rules/base.extras.xml.in.h:58
+#: ../rules/base.xml.in.h:236 ../rules/base.extras.xml.in.h:59
msgid "hy"
msgstr "hy"
-#: ../rules/base.xml.in.h:237 ../rules/base.extras.xml.in.h:59
+#: ../rules/base.xml.in.h:237 ../rules/base.extras.xml.in.h:60
msgid "Armenian"
msgstr "Armensk"
@@ -994,166 +994,166 @@ msgid "German (Austria)"
msgstr "Tysk (Østrig)"
#: ../rules/base.xml.in.h:246
-msgid "German (legacy)"
-msgstr "Tysk (forældet)"
-
-#: ../rules/base.xml.in.h:247
msgid "German (Austria, eliminate dead keys)"
msgstr "Tysk (Østrig, slå døde taster fra)"
-#: ../rules/base.xml.in.h:248
+#: ../rules/base.xml.in.h:247
msgid "German (Austria, Sun dead keys)"
msgstr "Tysk (Østrig, Sun døde taster)"
-#: ../rules/base.xml.in.h:249
+#: ../rules/base.xml.in.h:248
msgid "German (Austria, Macintosh)"
msgstr "Tysk (Østrig, Macintosh)"
#. Keyboard indicator for Azerbaijani layouts
-#: ../rules/base.xml.in.h:251
+#: ../rules/base.xml.in.h:250
msgid "az"
msgstr "az"
-#: ../rules/base.xml.in.h:252
+#: ../rules/base.xml.in.h:251
msgid "Azerbaijani"
msgstr "Aserbajdsjansk"
-#: ../rules/base.xml.in.h:253
+#: ../rules/base.xml.in.h:252
msgid "Azerbaijani (Cyrillic)"
msgstr "Aserbajdsjansk (kyrillisk)"
#. Keyboard indicator for Belarusian layouts
-#: ../rules/base.xml.in.h:255
+#: ../rules/base.xml.in.h:254
msgid "by"
msgstr "by"
-#: ../rules/base.xml.in.h:256
+#: ../rules/base.xml.in.h:255
msgid "Belarusian"
msgstr "Hviderussisk"
-#: ../rules/base.xml.in.h:257
+#: ../rules/base.xml.in.h:256
msgid "Belarusian (legacy)"
msgstr "Hviderussisk (forældet)"
-#: ../rules/base.xml.in.h:258
+#: ../rules/base.xml.in.h:257
msgid "Belarusian (Latin)"
msgstr "Hviderussisk (latin)"
#. Keyboard indicator for Belgian layouts
-#: ../rules/base.xml.in.h:260 ../rules/base.extras.xml.in.h:67
+#: ../rules/base.xml.in.h:259 ../rules/base.extras.xml.in.h:68
msgid "be"
msgstr "be"
-#: ../rules/base.xml.in.h:261 ../rules/base.extras.xml.in.h:68
+#: ../rules/base.xml.in.h:260 ../rules/base.extras.xml.in.h:69
msgid "Belgian"
msgstr "Belgisk"
-#: ../rules/base.xml.in.h:262
+#: ../rules/base.xml.in.h:261
msgid "Belgian (alternative)"
msgstr "Belgisk (alternativ)"
-#: ../rules/base.xml.in.h:263
-msgid "Belgian (alternative, latin-9 only)"
+#: ../rules/base.xml.in.h:262
+msgid "Belgian (alternative, Latin-9 only)"
msgstr "Belgisk (alternativ, kun latin-9)"
-#: ../rules/base.xml.in.h:264
+#: ../rules/base.xml.in.h:263
msgid "Belgian (alternative, Sun dead keys)"
msgstr "Belgisk (alternativ, Sun døde taster)"
-#: ../rules/base.xml.in.h:265
+#: ../rules/base.xml.in.h:264
msgid "Belgian (ISO alternate)"
msgstr "Belgisk (ISO-alternativ)"
-#: ../rules/base.xml.in.h:266
+#: ../rules/base.xml.in.h:265
msgid "Belgian (eliminate dead keys)"
msgstr "Belgisk (slå døde taster fra)"
-#: ../rules/base.xml.in.h:267
+#: ../rules/base.xml.in.h:266
msgid "Belgian (Sun dead keys)"
msgstr "Belgisk (Sun døde taster)"
-#: ../rules/base.xml.in.h:268
+#: ../rules/base.xml.in.h:267
msgid "Belgian (Wang model 724 azerty)"
msgstr "Belgisk (Wang model 724 azerty)"
-#. Keyboard indicator for Bengali layouts
-#: ../rules/base.xml.in.h:270
+#. Keyboard indicator for Bangla layouts
+#: ../rules/base.xml.in.h:269
msgid "bn"
msgstr "bn"
-#: ../rules/base.xml.in.h:271
-msgid "Bengali"
+#: ../rules/base.xml.in.h:270
+msgid "Bangla"
msgstr "Bengali"
-#: ../rules/base.xml.in.h:272
-msgid "Bengali (Probhat)"
+#: ../rules/base.xml.in.h:271
+msgid "Bangla (Probhat)"
msgstr "Bengali (probhat)"
#. Keyboard indicator for Indian layouts
-#: ../rules/base.xml.in.h:274
+#: ../rules/base.xml.in.h:273
msgid "in"
msgstr "in"
-#: ../rules/base.xml.in.h:275
+#: ../rules/base.xml.in.h:274
msgid "Indian"
msgstr "Indisk"
-#: ../rules/base.xml.in.h:276
-msgid "Bengali (India)"
+#: ../rules/base.xml.in.h:275
+msgid "Bangla (India)"
msgstr "Bengali (Indien)"
-#: ../rules/base.xml.in.h:277
-msgid "Bengali (India, Probhat)"
+#: ../rules/base.xml.in.h:276
+msgid "Bangla (India, Probhat)"
msgstr "Bengali (Indien, probhat)"
-#: ../rules/base.xml.in.h:278
-msgid "Bengali (India, Baishakhi)"
+#: ../rules/base.xml.in.h:277
+msgid "Bangla (India, Baishakhi)"
msgstr "Bengali (Indien, baishakhi)"
-#: ../rules/base.xml.in.h:279
-msgid "Bengali (India, Bornona)"
+#: ../rules/base.xml.in.h:278
+msgid "Bangla (India, Bornona)"
msgstr "Bengali (Indien, bornona)"
-#: ../rules/base.xml.in.h:280
-msgid "Bengali (India, Uni Gitanjali)"
+#: ../rules/base.xml.in.h:279
+msgid "Bangla (India, Uni Gitanjali)"
msgstr "Bengali (Indien, uni gitanjali)"
# http://en.wikipedia.org/wiki/InScript_keyboard
-#: ../rules/base.xml.in.h:281
-msgid "Bengali (India, Baishakhi Inscript)"
+#: ../rules/base.xml.in.h:280
+msgid "Bangla (India, Baishakhi Inscript)"
msgstr "Bengali (Indien, baishakhi inscript)"
#. Keyboard indicator for Gujarati layouts
-#: ../rules/base.xml.in.h:283
+#: ../rules/base.xml.in.h:282
msgid "gu"
msgstr "gu"
-#: ../rules/base.xml.in.h:284
+#: ../rules/base.xml.in.h:283
msgid "Gujarati"
msgstr "Gujarati"
#. Keyboard indicator for Punjabi layouts
-#: ../rules/base.xml.in.h:286
+#: ../rules/base.xml.in.h:285
msgid "pa"
msgstr "pa"
-#: ../rules/base.xml.in.h:287
+#: ../rules/base.xml.in.h:286
msgid "Punjabi (Gurmukhi)"
msgstr "Punjabi (Gurmukhi)"
-#: ../rules/base.xml.in.h:288
+#: ../rules/base.xml.in.h:287
msgid "Punjabi (Gurmukhi Jhelum)"
msgstr "Punjabi (Gurmukhi Jhelum)"
#. Keyboard indicator for Kannada layouts
-#: ../rules/base.xml.in.h:290
+#: ../rules/base.xml.in.h:289
msgid "kn"
msgstr "kn"
-#: ../rules/base.xml.in.h:291
+#: ../rules/base.xml.in.h:290
msgid "Kannada"
msgstr "Kannada"
+#: ../rules/base.xml.in.h:291
+msgid "Kannada (KaGaPa phonetic)"
+msgstr "Kannada (KaGaPa fonetisk)"
+
#. Keyboard indicator for Malayalam layouts
#: ../rules/base.xml.in.h:293
msgid "ml"
@@ -1214,1445 +1214,1479 @@ msgstr "te"
msgid "Telugu"
msgstr "Telugu"
+#: ../rules/base.xml.in.h:310
+msgid "Telugu (KaGaPa phonetic)"
+msgstr "Telugu (KaGaPa fonetisk)"
+
#. Keyboard indicator for Urdu layouts
-#: ../rules/base.xml.in.h:311
+#: ../rules/base.xml.in.h:312
msgid "ur"
msgstr "ur"
-#: ../rules/base.xml.in.h:312
+#: ../rules/base.xml.in.h:313
msgid "Urdu (phonetic)"
msgstr "Urdu (fonetisk)"
-#: ../rules/base.xml.in.h:313
+#: ../rules/base.xml.in.h:314
msgid "Urdu (alternative phonetic)"
msgstr "Urdu (alternativ fonetisk)"
-#: ../rules/base.xml.in.h:314
+#: ../rules/base.xml.in.h:315
msgid "Urdu (WinKeys)"
msgstr "Urdu (Win-taster)"
#. Keyboard indicator for Hindi layouts
-#: ../rules/base.xml.in.h:316
+#: ../rules/base.xml.in.h:317
msgid "hi"
msgstr "hi"
-#: ../rules/base.xml.in.h:317
+#: ../rules/base.xml.in.h:318
msgid "Hindi (Bolnagri)"
msgstr "Hindi (bolnagri)"
-#: ../rules/base.xml.in.h:318
+#: ../rules/base.xml.in.h:319
msgid "Hindi (Wx)"
msgstr "Hindi (wx)"
-#: ../rules/base.xml.in.h:319
+#: ../rules/base.xml.in.h:320
+msgid "Hindi (KaGaPa phonetic)"
+msgstr "Hindi (KaGaPa fonetisk)"
+
+#. Keyboard indicator for Sanskrit layouts
+#: ../rules/base.xml.in.h:322
+msgid "sa"
+msgstr "sa"
+
+#: ../rules/base.xml.in.h:323
+msgid "Sanskrit (KaGaPa phonetic)"
+msgstr "Sanskrit (KaGaPa fonetisk)"
+
+#. Keyboard indicator for Marathi layouts
+#: ../rules/base.xml.in.h:325
+msgid "mr"
+msgstr "mr"
+
+#: ../rules/base.xml.in.h:326
+msgid "Marathi (KaGaPa phonetic)"
+msgstr "Marathi (KaGaPa fonetisk)"
+
+#: ../rules/base.xml.in.h:327
msgid "English (India, with RupeeSign)"
msgstr "Engelsk (Indien, med rupeetegn)"
#. Keyboard indicator for Bosnian layouts
-#: ../rules/base.xml.in.h:321
+#: ../rules/base.xml.in.h:329
msgid "bs"
msgstr "bs"
-#: ../rules/base.xml.in.h:322
+#: ../rules/base.xml.in.h:330
msgid "Bosnian"
msgstr "Bosnisk"
-#: ../rules/base.xml.in.h:323
+#: ../rules/base.xml.in.h:331
msgid "Bosnian (use guillemets for quotes)"
msgstr "Bosnisk (anvend »« som anførelsestegn)"
-#: ../rules/base.xml.in.h:324
+#: ../rules/base.xml.in.h:332
msgid "Bosnian (use Bosnian digraphs)"
msgstr "Bosnisk (anvend bosniske digrafer)"
-#: ../rules/base.xml.in.h:325
+#: ../rules/base.xml.in.h:333
msgid "Bosnian (US keyboard with Bosnian digraphs)"
msgstr "Bosnisk (US-tastatur med bosniske digrafer)"
-#: ../rules/base.xml.in.h:326
+#: ../rules/base.xml.in.h:334
msgid "Bosnian (US keyboard with Bosnian letters)"
msgstr "Bosnisk (US-tastatur med bosniske bogstaver)"
#. Keyboard indicator for Portuguese layouts
-#: ../rules/base.xml.in.h:328 ../rules/base.extras.xml.in.h:70
+#: ../rules/base.xml.in.h:336 ../rules/base.extras.xml.in.h:71
msgid "pt"
msgstr "pt"
-#: ../rules/base.xml.in.h:329 ../rules/base.extras.xml.in.h:71
+#: ../rules/base.xml.in.h:337 ../rules/base.extras.xml.in.h:72
msgid "Portuguese (Brazil)"
msgstr "Portugisisk (brasiliansk)"
-#: ../rules/base.xml.in.h:330
+#: ../rules/base.xml.in.h:338
msgid "Portuguese (Brazil, eliminate dead keys)"
msgstr "Portugisisk (brasiliansk, slå døde taster fra)"
-#: ../rules/base.xml.in.h:331
+#: ../rules/base.xml.in.h:339
msgid "Portuguese (Brazil, Dvorak)"
msgstr "Portugisisk (brasiliansk, dvorak)"
-#: ../rules/base.xml.in.h:332
-msgid "Portuguese (Brazil, nativo)"
+#: ../rules/base.xml.in.h:340
+msgid "Portuguese (Brazil, Nativo)"
msgstr "Portugisisk (brasiliansk, nativo)"
-#: ../rules/base.xml.in.h:333
-msgid "Portuguese (Brazil, nativo for USA keyboards)"
+#: ../rules/base.xml.in.h:341
+msgid "Portuguese (Brazil, Nativo for US keyboards)"
msgstr "Portugisisk (brasiliansk, nativo for USA-tastaturer)"
-#: ../rules/base.xml.in.h:334
-msgid "Portuguese (Brazil, nativo for Esperanto)"
-msgstr "Portugisisk (brasiliansk, nativo for esperanto)"
+#: ../rules/base.xml.in.h:342
+msgid "Esperanto (Brazil, Nativo)"
+msgstr "Esperanto (brasiliansk, nativo)"
#. Keyboard indicator for Bulgarian layouts
-#: ../rules/base.xml.in.h:336
+#: ../rules/base.xml.in.h:344
msgid "bg"
msgstr "bg"
-#: ../rules/base.xml.in.h:337
+#: ../rules/base.xml.in.h:345
msgid "Bulgarian"
msgstr "Bulgarsk"
-#: ../rules/base.xml.in.h:338
+#: ../rules/base.xml.in.h:346
msgid "Bulgarian (traditional phonetic)"
msgstr "Bulgarsk (traditionel fonetisk)"
-#: ../rules/base.xml.in.h:339
+#: ../rules/base.xml.in.h:347
msgid "Bulgarian (new phonetic)"
msgstr "Bulgarsk (ny fonetisk)"
-#: ../rules/base.xml.in.h:340
+#: ../rules/base.xml.in.h:348
msgid "Arabic (Morocco)"
msgstr "Arabisk (Marokko)"
#. Keyboard indicator for French layouts
-#: ../rules/base.xml.in.h:342 ../rules/base.extras.xml.in.h:3
+#: ../rules/base.xml.in.h:350 ../rules/base.extras.xml.in.h:3
msgid "fr"
msgstr "fr"
-#: ../rules/base.xml.in.h:343
+#: ../rules/base.xml.in.h:351
msgid "French (Morocco)"
msgstr "Fransk (Marokko)"
#. Keyboard indicator for Berber layouts
-#: ../rules/base.xml.in.h:345
+#: ../rules/base.xml.in.h:353
msgid "ber"
msgstr "ber"
-#: ../rules/base.xml.in.h:346
+#: ../rules/base.xml.in.h:354
msgid "Berber (Morocco, Tifinagh)"
msgstr "Berbisk (Marokko, Tifinagh)"
-#: ../rules/base.xml.in.h:347
+#: ../rules/base.xml.in.h:355
msgid "Berber (Morocco, Tifinagh alternative)"
msgstr "Berbisk (Marokko, Tifinagh alternativ)"
# http://retskrivningsordbogen.dk/ro/ro.htm?q=berb
-#: ../rules/base.xml.in.h:348
+#: ../rules/base.xml.in.h:356
msgid "Berber (Morocco, Tifinagh alternative phonetic)"
msgstr "Berbisk (Marokko, tifinagh alternativ fonetisk)"
-#: ../rules/base.xml.in.h:349
+#: ../rules/base.xml.in.h:357
msgid "Berber (Morocco, Tifinagh extended)"
msgstr "Berbisk (Marokko, Tifinagh udvidet)"
-#: ../rules/base.xml.in.h:350
+#: ../rules/base.xml.in.h:358
msgid "Berber (Morocco, Tifinagh phonetic)"
msgstr "Berbisk (Marokko, Tifinagh fonetisk)"
-#: ../rules/base.xml.in.h:351
+#: ../rules/base.xml.in.h:359
msgid "Berber (Morocco, Tifinagh extended phonetic)"
msgstr "Berbisk (Marokko, Tifinagh udvidet fonetisk)"
#. Keyboard indicator for Cameroon layouts
-#: ../rules/base.xml.in.h:353
+#: ../rules/base.xml.in.h:361
msgid "cm"
msgstr "cm"
-#: ../rules/base.xml.in.h:354
+#: ../rules/base.xml.in.h:362
msgid "English (Cameroon)"
msgstr "Engelsk (camerounsk)"
-#: ../rules/base.xml.in.h:355
+#: ../rules/base.xml.in.h:363
msgid "French (Cameroon)"
msgstr "Fransk (camerounsk)"
-#: ../rules/base.xml.in.h:356
+#: ../rules/base.xml.in.h:364
msgid "Cameroon Multilingual (qwerty)"
msgstr "Camerounsk flersproget (qwerty)"
-#: ../rules/base.xml.in.h:357
+#: ../rules/base.xml.in.h:365
msgid "Cameroon Multilingual (azerty)"
msgstr "Camerounsk flersproget (azerty)"
-#: ../rules/base.xml.in.h:358
+#: ../rules/base.xml.in.h:366
msgid "Cameroon Multilingual (Dvorak)"
msgstr "Camerounsk flersproget (dvorak)"
#. Keyboard indicator for Burmese layouts
-#: ../rules/base.xml.in.h:360
+#: ../rules/base.xml.in.h:368
msgid "my"
msgstr "my"
-#: ../rules/base.xml.in.h:361
+#: ../rules/base.xml.in.h:369
msgid "Burmese"
msgstr "Burmesisk"
-#: ../rules/base.xml.in.h:362 ../rules/base.extras.xml.in.h:4
+#: ../rules/base.xml.in.h:370 ../rules/base.extras.xml.in.h:4
msgid "French (Canada)"
msgstr "Fransk (Canada)"
-#: ../rules/base.xml.in.h:363
+#: ../rules/base.xml.in.h:371
msgid "French (Canada, Dvorak)"
msgstr "Fransk (Canada, dvorak)"
-#: ../rules/base.xml.in.h:364
+#: ../rules/base.xml.in.h:372
msgid "French (Canada, legacy)"
msgstr "Fransk (Canada, forældet)"
-#: ../rules/base.xml.in.h:365
+#: ../rules/base.xml.in.h:373
msgid "Canadian Multilingual"
msgstr "Canadisk flersproget"
-#: ../rules/base.xml.in.h:366
+#: ../rules/base.xml.in.h:374
msgid "Canadian Multilingual (first part)"
msgstr "Canadisk flersproget (første del)"
-#: ../rules/base.xml.in.h:367
+#: ../rules/base.xml.in.h:375
msgid "Canadian Multilingual (second part)"
msgstr "Canadisk flersproget (anden del)"
#. Keyboard indicator for Inuktikut layouts
-#: ../rules/base.xml.in.h:369
+#: ../rules/base.xml.in.h:377
msgid "ike"
msgstr "ike"
-#: ../rules/base.xml.in.h:370
+#: ../rules/base.xml.in.h:378
msgid "Inuktitut"
msgstr "Inuktitut"
-#: ../rules/base.xml.in.h:371
+#: ../rules/base.xml.in.h:379
msgid "English (Canada)"
msgstr "Engelsk (Canada)"
-#: ../rules/base.xml.in.h:372
+#: ../rules/base.xml.in.h:380
msgid "French (Democratic Republic of the Congo)"
msgstr "Fransk (Congo, Den Demokratiske Republik)"
#. Keyboard indicator for Taiwanese layouts
-#: ../rules/base.xml.in.h:374
+#: ../rules/base.xml.in.h:382
msgid "zh"
msgstr "zh"
-#: ../rules/base.xml.in.h:375
+#: ../rules/base.xml.in.h:383
msgid "Chinese"
msgstr "Kinesisk"
-#: ../rules/base.xml.in.h:376
+#: ../rules/base.xml.in.h:384
msgid "Tibetan"
msgstr "Tibetansk"
-#: ../rules/base.xml.in.h:377
+#: ../rules/base.xml.in.h:385
msgid "Tibetan (with ASCII numerals)"
msgstr "Tibetansk (med ASCII-numre)"
-#: ../rules/base.xml.in.h:378
+#: ../rules/base.xml.in.h:386
+msgid "ug"
+msgstr "ug"
+
+#: ../rules/base.xml.in.h:387
msgid "Uyghur"
msgstr "Uyghur"
#. Keyboard indicator for Croatian layouts
-#: ../rules/base.xml.in.h:380
+#: ../rules/base.xml.in.h:389
msgid "hr"
msgstr "hr"
-#: ../rules/base.xml.in.h:381
+#: ../rules/base.xml.in.h:390
msgid "Croatian"
msgstr "Kroatisk"
-#: ../rules/base.xml.in.h:382
+#: ../rules/base.xml.in.h:391
msgid "Croatian (use guillemets for quotes)"
msgstr "Kroatisk (anvend »« som anførelsestegn)"
-#: ../rules/base.xml.in.h:383
+#: ../rules/base.xml.in.h:392
msgid "Croatian (use Croatian digraphs)"
msgstr "Kroatisk (anvend kroatiske digrafer)"
-#: ../rules/base.xml.in.h:384
+#: ../rules/base.xml.in.h:393
msgid "Croatian (US keyboard with Croatian digraphs)"
msgstr "Kroatisk (US-tastatur med kroatiske digrafer)"
-#: ../rules/base.xml.in.h:385
+#: ../rules/base.xml.in.h:394
msgid "Croatian (US keyboard with Croatian letters)"
msgstr "Kroatisk (US-tastatur med kroatiske bogstaver)"
#. Keyboard indicator for Chech layouts
-#: ../rules/base.xml.in.h:387 ../rules/base.extras.xml.in.h:73
+#: ../rules/base.xml.in.h:396 ../rules/base.extras.xml.in.h:74
msgid "cs"
msgstr "cs"
-#: ../rules/base.xml.in.h:388 ../rules/base.extras.xml.in.h:74
+#: ../rules/base.xml.in.h:397 ../rules/base.extras.xml.in.h:75
msgid "Czech"
msgstr "Tjekkisk"
-#: ../rules/base.xml.in.h:389
+#: ../rules/base.xml.in.h:398
msgid "Czech (with &lt;\\|&gt; key)"
msgstr "Tjekkisk (med &lt;\\|&gt;-tast)"
-#: ../rules/base.xml.in.h:390
+#: ../rules/base.xml.in.h:399
msgid "Czech (qwerty)"
msgstr "Tjekkisk (qwerty)"
-#: ../rules/base.xml.in.h:391
+#: ../rules/base.xml.in.h:400
msgid "Czech (qwerty, extended Backslash)"
msgstr "Tjekkisk (qwerty, udvidet omvendt skråstreg)"
-#: ../rules/base.xml.in.h:392
+#: ../rules/base.xml.in.h:401
msgid "Czech (UCW layout, accented letters only)"
msgstr "Tjekkisk (UCW-layout, kun bogstaver med accent)"
-#: ../rules/base.xml.in.h:393
+#: ../rules/base.xml.in.h:402
msgid "Czech (US Dvorak with CZ UCW support)"
msgstr "Tjekkisk (US Dvorak med CZ UCW-understøttelse)"
#. Keyboard indicator for Danish layouts
-#: ../rules/base.xml.in.h:395 ../rules/base.extras.xml.in.h:76
+#: ../rules/base.xml.in.h:404 ../rules/base.extras.xml.in.h:77
msgid "da"
msgstr "da"
-#: ../rules/base.xml.in.h:396 ../rules/base.extras.xml.in.h:77
+#: ../rules/base.xml.in.h:405 ../rules/base.extras.xml.in.h:78
msgid "Danish"
msgstr "Dansk"
-#: ../rules/base.xml.in.h:397
+#: ../rules/base.xml.in.h:406
msgid "Danish (eliminate dead keys)"
msgstr "Dansk (slå døde taster fra)"
-#: ../rules/base.xml.in.h:398
+#: ../rules/base.xml.in.h:407
msgid "Danish (Macintosh)"
msgstr "Dansk (Macintosh)"
-#: ../rules/base.xml.in.h:399
+#: ../rules/base.xml.in.h:408
msgid "Danish (Macintosh, eliminate dead keys)"
msgstr "Dansk (Macintosh, slå døde taster fra)"
-#: ../rules/base.xml.in.h:400
+#: ../rules/base.xml.in.h:409
msgid "Danish (Dvorak)"
msgstr "Dansk (dvorak)"
#. Keyboard indicator for Dutch layouts
-#: ../rules/base.xml.in.h:402 ../rules/base.extras.xml.in.h:79
+#: ../rules/base.xml.in.h:411 ../rules/base.extras.xml.in.h:80
msgid "nl"
msgstr "nl"
-#: ../rules/base.xml.in.h:403 ../rules/base.extras.xml.in.h:80
+#: ../rules/base.xml.in.h:412 ../rules/base.extras.xml.in.h:81
msgid "Dutch"
msgstr "Hollandsk"
-#: ../rules/base.xml.in.h:404
+#: ../rules/base.xml.in.h:413
msgid "Dutch (Sun dead keys)"
msgstr "Hollandsk (Sun døde taster)"
-#: ../rules/base.xml.in.h:405
+#: ../rules/base.xml.in.h:414
msgid "Dutch (Macintosh)"
msgstr "Hollandsk (Macintosh)"
-#: ../rules/base.xml.in.h:406
+#: ../rules/base.xml.in.h:415
msgid "Dutch (standard)"
msgstr "Hollandsk (standard)"
#. Keyboard indicator for Dzongkha layouts
-#: ../rules/base.xml.in.h:408
+#: ../rules/base.xml.in.h:417
msgid "dz"
msgstr "dz"
-#: ../rules/base.xml.in.h:409
+#: ../rules/base.xml.in.h:418
msgid "Dzongkha"
msgstr "Dzongkha"
#. Keyboard indicator for Estonian layouts
-#: ../rules/base.xml.in.h:411 ../rules/base.extras.xml.in.h:82
+#: ../rules/base.xml.in.h:420 ../rules/base.extras.xml.in.h:83
msgid "et"
msgstr "et"
-#: ../rules/base.xml.in.h:412 ../rules/base.extras.xml.in.h:83
+#: ../rules/base.xml.in.h:421 ../rules/base.extras.xml.in.h:84
msgid "Estonian"
msgstr "Estisk"
-#: ../rules/base.xml.in.h:413
+#: ../rules/base.xml.in.h:422
msgid "Estonian (eliminate dead keys)"
msgstr "Estisk (slå døde taster fra)"
-#: ../rules/base.xml.in.h:414
+#: ../rules/base.xml.in.h:423
msgid "Estonian (Dvorak)"
msgstr "Estisk (dvorak)"
-#: ../rules/base.xml.in.h:415
+#: ../rules/base.xml.in.h:424
msgid "Estonian (US keyboard with Estonian letters)"
msgstr "Estisk (US-tastatur med estiske bogstaver)"
-#: ../rules/base.xml.in.h:416 ../rules/base.extras.xml.in.h:16
+#: ../rules/base.xml.in.h:425 ../rules/base.extras.xml.in.h:16
msgid "Persian"
msgstr "Persisk"
-#: ../rules/base.xml.in.h:417
+#: ../rules/base.xml.in.h:426
msgid "Persian (with Persian Keypad)"
msgstr "Persisk (med persisk numerisk tastatur)"
#. Keyboard indicator for Kurdish layouts
-#: ../rules/base.xml.in.h:419
+#: ../rules/base.xml.in.h:428
msgid "ku"
msgstr "ku"
-#: ../rules/base.xml.in.h:420
+#: ../rules/base.xml.in.h:429
msgid "Kurdish (Iran, Latin Q)"
msgstr "Kurdisk (Iran, latin Q)"
-#: ../rules/base.xml.in.h:421
+#: ../rules/base.xml.in.h:430
msgid "Kurdish (Iran, F)"
msgstr "Kurdisk (Iran, F)"
-#: ../rules/base.xml.in.h:422
+#: ../rules/base.xml.in.h:431
msgid "Kurdish (Iran, Latin Alt-Q)"
msgstr "Kurdisk (Iran, latin Alt-Q)"
-#: ../rules/base.xml.in.h:423
+#: ../rules/base.xml.in.h:432
msgid "Kurdish (Iran, Arabic-Latin)"
msgstr "Kurdisk (Iran, arabisk-latin)"
-#: ../rules/base.xml.in.h:424
+#: ../rules/base.xml.in.h:433
msgid "Iraqi"
msgstr "Irakisk"
-#: ../rules/base.xml.in.h:425
+#: ../rules/base.xml.in.h:434
msgid "Kurdish (Iraq, Latin Q)"
msgstr "Kurdisk (Irak, latin Q)"
-#: ../rules/base.xml.in.h:426
+#: ../rules/base.xml.in.h:435
msgid "Kurdish (Iraq, F)"
msgstr "Kurdisk (Irak, F)"
-#: ../rules/base.xml.in.h:427
+#: ../rules/base.xml.in.h:436
msgid "Kurdish (Iraq, Latin Alt-Q)"
msgstr "Kurdisk (Irak, latin Alt-Q)"
-#: ../rules/base.xml.in.h:428
+#: ../rules/base.xml.in.h:437
msgid "Kurdish (Iraq, Arabic-Latin)"
msgstr "Kurdisk (Irak, arabisk-latin)"
#. Keyboard indicator for Faroese layouts
-#: ../rules/base.xml.in.h:430
+#: ../rules/base.xml.in.h:439
msgid "fo"
msgstr "fo"
-#: ../rules/base.xml.in.h:431
+#: ../rules/base.xml.in.h:440
msgid "Faroese"
msgstr "Færøsk"
-#: ../rules/base.xml.in.h:432
+#: ../rules/base.xml.in.h:441
msgid "Faroese (eliminate dead keys)"
msgstr "Færøsk (slå døde taster fra)"
#. Keyboard indicator for Finnish layouts
-#: ../rules/base.xml.in.h:434 ../rules/base.extras.xml.in.h:85
+#: ../rules/base.xml.in.h:443 ../rules/base.extras.xml.in.h:86
msgid "fi"
msgstr "fi"
-#: ../rules/base.xml.in.h:435 ../rules/base.extras.xml.in.h:86
+#: ../rules/base.xml.in.h:444 ../rules/base.extras.xml.in.h:87
msgid "Finnish"
msgstr "Finsk"
-#: ../rules/base.xml.in.h:436
+#: ../rules/base.xml.in.h:445
msgid "Finnish (classic)"
msgstr "Finsk (klassisk)"
-#: ../rules/base.xml.in.h:437
+#: ../rules/base.xml.in.h:446
msgid "Finnish (classic, eliminate dead keys)"
msgstr "Finsk (klassisk, slå døde taster fra)"
-#: ../rules/base.xml.in.h:438
+#: ../rules/base.xml.in.h:447
msgid "Northern Saami (Finland)"
msgstr "Nordligt samisk (Finland)"
-#: ../rules/base.xml.in.h:439
+#: ../rules/base.xml.in.h:448
msgid "Finnish (Macintosh)"
msgstr "Finsk (Macintosh)"
-#: ../rules/base.xml.in.h:440 ../rules/base.extras.xml.in.h:88
+#: ../rules/base.xml.in.h:449 ../rules/base.extras.xml.in.h:89
msgid "French"
msgstr "Fransk"
-#: ../rules/base.xml.in.h:441
+#: ../rules/base.xml.in.h:450
msgid "French (eliminate dead keys)"
msgstr "Fransk (slå døde taster fra)"
-#: ../rules/base.xml.in.h:442
+#: ../rules/base.xml.in.h:451
msgid "French (Sun dead keys)"
msgstr "Fransk (Sun døde taster)"
-#: ../rules/base.xml.in.h:443
+#: ../rules/base.xml.in.h:452
msgid "French (alternative)"
msgstr "Fransk (alternativ)"
-#: ../rules/base.xml.in.h:444
-msgid "French (alternative, latin-9 only)"
+#: ../rules/base.xml.in.h:453
+msgid "French (alternative, Latin-9 only)"
msgstr "Fransk (alternativ, kun latin-9)"
-#: ../rules/base.xml.in.h:445
+#: ../rules/base.xml.in.h:454
msgid "French (alternative, eliminate dead keys)"
msgstr "Fransk (alternativ, slå døde taster fra)"
-#: ../rules/base.xml.in.h:446
+#: ../rules/base.xml.in.h:455
msgid "French (alternative, Sun dead keys)"
msgstr "Fransk (alternativ, Sun døde taster)"
-#: ../rules/base.xml.in.h:447
+#: ../rules/base.xml.in.h:456
msgid "French (legacy, alternative)"
msgstr "Fransk (forældet, alternativ)"
-#: ../rules/base.xml.in.h:448
+#: ../rules/base.xml.in.h:457
msgid "French (legacy, alternative, eliminate dead keys)"
msgstr "Fransk (forældet, alternativ, slå døde taster fra)"
-#: ../rules/base.xml.in.h:449
+#: ../rules/base.xml.in.h:458
msgid "French (legacy, alternative, Sun dead keys)"
msgstr "Fransk (forældet, alternativ, Sun døde taster)"
-#: ../rules/base.xml.in.h:450
+#: ../rules/base.xml.in.h:459
msgid "French (Bepo, ergonomic, Dvorak way)"
msgstr "Fransk (Bepo, ergonomisk, dvorakmåde)"
-#: ../rules/base.xml.in.h:451
-msgid "French (Bepo, ergonomic, Dvorak way, latin-9 only)"
+#: ../rules/base.xml.in.h:460
+msgid "French (Bepo, ergonomic, Dvorak way, Latin-9 only)"
msgstr "Fransk (Bepo, ergonomisk, dvorakmåde, kun latin-9)"
-#: ../rules/base.xml.in.h:452
+#: ../rules/base.xml.in.h:461
msgid "French (Dvorak)"
msgstr "Fransk (dvorak)"
-#: ../rules/base.xml.in.h:453
+#: ../rules/base.xml.in.h:462
msgid "French (Macintosh)"
msgstr "Fransk (Macintosh)"
-#: ../rules/base.xml.in.h:454
+#: ../rules/base.xml.in.h:463
msgid "French (Breton)"
msgstr "Fransk (bretonsk)"
-#: ../rules/base.xml.in.h:455
+#: ../rules/base.xml.in.h:464
msgid "Occitan"
msgstr "Occitansk"
-#: ../rules/base.xml.in.h:456
+#: ../rules/base.xml.in.h:465
msgid "Georgian (France, AZERTY Tskapo)"
msgstr "Geogrisk (Frankrig, AZERTY Tskapo)"
-#: ../rules/base.xml.in.h:457
+#: ../rules/base.xml.in.h:466
msgid "English (Ghana)"
msgstr "Engelsk (Ghana)"
-#: ../rules/base.xml.in.h:458
+#: ../rules/base.xml.in.h:467
msgid "English (Ghana, multilingual)"
msgstr "Engelsk (Ghana, flersproget)"
#. Keyboard indicator for Akan layouts
-#: ../rules/base.xml.in.h:460
+#: ../rules/base.xml.in.h:469
msgid "ak"
msgstr "ak"
-#: ../rules/base.xml.in.h:461
+#: ../rules/base.xml.in.h:470
msgid "Akan"
msgstr "Akan"
#. Keyboard indicator for Ewe layouts
-#: ../rules/base.xml.in.h:463
+#: ../rules/base.xml.in.h:472
msgid "ee"
msgstr "ee"
-#: ../rules/base.xml.in.h:464
+#: ../rules/base.xml.in.h:473
msgid "Ewe"
msgstr "Ewe"
#. Keyboard indicator for Fula layouts
-#: ../rules/base.xml.in.h:466
+#: ../rules/base.xml.in.h:475
msgid "ff"
msgstr "ff"
-#: ../rules/base.xml.in.h:467
+#: ../rules/base.xml.in.h:476
msgid "Fula"
msgstr "Fula"
#. Keyboard indicator for Ga layouts
-#: ../rules/base.xml.in.h:469
+#: ../rules/base.xml.in.h:478
msgid "gaa"
msgstr "gaa"
-#: ../rules/base.xml.in.h:470
+#: ../rules/base.xml.in.h:479
msgid "Ga"
msgstr "Ga"
#. Keyboard indicator for Hausa layouts
-#: ../rules/base.xml.in.h:472
+#: ../rules/base.xml.in.h:481
msgid "ha"
msgstr "ha"
-#: ../rules/base.xml.in.h:473
+#: ../rules/base.xml.in.h:482
msgid "Hausa"
msgstr "Hausa"
#. Keyboard indicator for Avatime layouts
-#: ../rules/base.xml.in.h:475
+#: ../rules/base.xml.in.h:484
msgid "avn"
msgstr "avn"
# The Avatime are an Akan people who live in Volta region of Ghana. History has it
# that they are Ahanta people who migrated to the Volta region.
-#: ../rules/base.xml.in.h:476
+#: ../rules/base.xml.in.h:485
msgid "Avatime"
msgstr "Avatime"
-#: ../rules/base.xml.in.h:477
+#: ../rules/base.xml.in.h:486
msgid "English (Ghana, GILLBT)"
msgstr "Engelsk (Ghana, GILLBT)"
-#: ../rules/base.xml.in.h:478
+#: ../rules/base.xml.in.h:487
msgid "French (Guinea)"
msgstr "Fransk (Guinea)"
#. Keyboard indicator for Georgian layouts
-#: ../rules/base.xml.in.h:480
+#: ../rules/base.xml.in.h:489
msgid "ka"
msgstr "ka"
-#: ../rules/base.xml.in.h:481
+#: ../rules/base.xml.in.h:490
msgid "Georgian"
msgstr "Georgisk"
-#: ../rules/base.xml.in.h:482
+#: ../rules/base.xml.in.h:491
msgid "Georgian (ergonomic)"
msgstr "Georgisk (ergonomisk)"
-#: ../rules/base.xml.in.h:483
+#: ../rules/base.xml.in.h:492
msgid "Georgian (MESS)"
msgstr "Georgisk (MESS)"
-#: ../rules/base.xml.in.h:484
+#: ../rules/base.xml.in.h:493
msgid "Russian (Georgia)"
msgstr "Russisk (georgisk)"
-#: ../rules/base.xml.in.h:485
+#: ../rules/base.xml.in.h:494
msgid "Ossetian (Georgia)"
msgstr "Occitansk (Georgien)"
-#: ../rules/base.xml.in.h:486 ../rules/base.extras.xml.in.h:11
+#: ../rules/base.xml.in.h:495 ../rules/base.extras.xml.in.h:11
msgid "German"
msgstr "Tysk"
-#: ../rules/base.xml.in.h:487
+#: ../rules/base.xml.in.h:496
msgid "German (dead acute)"
msgstr "Tysk (død accent)"
-#: ../rules/base.xml.in.h:488
+#: ../rules/base.xml.in.h:497
msgid "German (dead grave acute)"
msgstr "Tysk (død accent grave)"
-#: ../rules/base.xml.in.h:489
+#: ../rules/base.xml.in.h:498
msgid "German (eliminate dead keys)"
msgstr "Tysk (slå døde taster fra)"
-#: ../rules/base.xml.in.h:490
+#: ../rules/base.xml.in.h:499
msgid "German (T3)"
msgstr "Tysk (T3)"
-#: ../rules/base.xml.in.h:491
+#: ../rules/base.xml.in.h:500
msgid "Romanian (Germany)"
msgstr "Rumænsk (Tyskland)"
-#: ../rules/base.xml.in.h:492
+#: ../rules/base.xml.in.h:501
msgid "Romanian (Germany, eliminate dead keys)"
msgstr "Rumænsk (Tyskland, slå døde taster fra)"
-#: ../rules/base.xml.in.h:493
+#: ../rules/base.xml.in.h:502
msgid "German (Dvorak)"
msgstr "Tysk (dvorak)"
-#: ../rules/base.xml.in.h:494
+#: ../rules/base.xml.in.h:503
msgid "German (Sun dead keys)"
msgstr "Tysk (Sun døde taster)"
-#: ../rules/base.xml.in.h:495
+#: ../rules/base.xml.in.h:504
msgid "German (Neo 2)"
msgstr "Tysk (Neo 2)"
-#: ../rules/base.xml.in.h:496
+#: ../rules/base.xml.in.h:505
msgid "German (Macintosh)"
msgstr "Tysk (Macintosh)"
-#: ../rules/base.xml.in.h:497
+#: ../rules/base.xml.in.h:506
msgid "German (Macintosh, eliminate dead keys)"
msgstr "Tysk (Macintosh, slå døde taster fra)"
-#: ../rules/base.xml.in.h:498
+#: ../rules/base.xml.in.h:507
msgid "Lower Sorbian"
msgstr "Nedersorbisk"
# nedersorbisk, tror jeg
# (el. nedre Lausitz)
-#: ../rules/base.xml.in.h:499
+#: ../rules/base.xml.in.h:508
msgid "Lower Sorbian (qwertz)"
msgstr "Nedersorbisk (qwertz)"
-#: ../rules/base.xml.in.h:500
+#: ../rules/base.xml.in.h:509
msgid "German (qwerty)"
msgstr "Tysk (qwerty)"
-#: ../rules/base.xml.in.h:501
+#: ../rules/base.xml.in.h:510
msgid "Russian (Germany, phonetic)"
msgstr "Russisk (Tyskland, fonetisk)"
+#: ../rules/base.xml.in.h:511
+msgid "German (legacy)"
+msgstr "Tysk (forældet)"
+
#. Keyboard indicator for Greek layouts
-#: ../rules/base.xml.in.h:503 ../rules/base.extras.xml.in.h:90
+#: ../rules/base.xml.in.h:513 ../rules/base.extras.xml.in.h:91
msgid "gr"
msgstr "gr"
-#: ../rules/base.xml.in.h:504 ../rules/base.extras.xml.in.h:91
+#: ../rules/base.xml.in.h:514 ../rules/base.extras.xml.in.h:92
msgid "Greek"
msgstr "Græsk"
-#: ../rules/base.xml.in.h:505
+#: ../rules/base.xml.in.h:515
msgid "Greek (simple)"
msgstr "Græsk (simpel)"
-#: ../rules/base.xml.in.h:506
+#: ../rules/base.xml.in.h:516
msgid "Greek (extended)"
msgstr "Græsk (udvidet)"
-#: ../rules/base.xml.in.h:507
+#: ../rules/base.xml.in.h:517
msgid "Greek (eliminate dead keys)"
msgstr "Græsk (slå døde taster fra)"
-#: ../rules/base.xml.in.h:508
+#: ../rules/base.xml.in.h:518
msgid "Greek (polytonic)"
msgstr "Græsk (polytonisk)"
#. Keyboard indicator for Hungarian layouts
-#: ../rules/base.xml.in.h:510
+#: ../rules/base.xml.in.h:520
msgid "hu"
msgstr "hu"
-#: ../rules/base.xml.in.h:511
+#: ../rules/base.xml.in.h:521
msgid "Hungarian"
msgstr "Ungarsk"
-#: ../rules/base.xml.in.h:512
+#: ../rules/base.xml.in.h:522
msgid "Hungarian (standard)"
msgstr "Ungarsk (standard)"
-#: ../rules/base.xml.in.h:513
+#: ../rules/base.xml.in.h:523
msgid "Hungarian (eliminate dead keys)"
msgstr "Ungarsk (slå døde taster fra)"
-#: ../rules/base.xml.in.h:514
+#: ../rules/base.xml.in.h:524
msgid "Hungarian (qwerty)"
msgstr "Ungarsk (qwerty)"
-#: ../rules/base.xml.in.h:515
+#: ../rules/base.xml.in.h:525
msgid "Hungarian (101/qwertz/comma/dead keys)"
msgstr "Ungarsk (101/qwertz/komma/døde taster)"
-#: ../rules/base.xml.in.h:516
+#: ../rules/base.xml.in.h:526
msgid "Hungarian (101/qwertz/comma/eliminate dead keys)"
msgstr "Ungarsk (101/qwertz/komma/slå døde taster fra)"
-#: ../rules/base.xml.in.h:517
+#: ../rules/base.xml.in.h:527
msgid "Hungarian (101/qwertz/dot/dead keys)"
msgstr "Ungarsk (101/qwertz/punktum/døde taster)"
-#: ../rules/base.xml.in.h:518
+#: ../rules/base.xml.in.h:528
msgid "Hungarian (101/qwertz/dot/eliminate dead keys)"
msgstr "Ungarsk (101/qwertz/punktum/slå døde taster fra)"
-#: ../rules/base.xml.in.h:519
+#: ../rules/base.xml.in.h:529
msgid "Hungarian (101/qwerty/comma/dead keys)"
msgstr "Ungarsk (101/qwerty/komma/døde taster)"
-#: ../rules/base.xml.in.h:520
+#: ../rules/base.xml.in.h:530
msgid "Hungarian (101/qwerty/comma/eliminate dead keys)"
msgstr "Ungarsk (101/qwerty/komma/slå døde taster fra)"
-#: ../rules/base.xml.in.h:521
+#: ../rules/base.xml.in.h:531
msgid "Hungarian (101/qwerty/dot/dead keys)"
msgstr "Ungarsk (101/qwerty/punktum/døde taster)"
-#: ../rules/base.xml.in.h:522
+#: ../rules/base.xml.in.h:532
msgid "Hungarian (101/qwerty/dot/eliminate dead keys)"
msgstr "Ungarsk (101/qwerty/punktum/slå døde taster fra)"
-#: ../rules/base.xml.in.h:523
+#: ../rules/base.xml.in.h:533
msgid "Hungarian (102/qwertz/comma/dead keys)"
msgstr "Ungarsk (102/qwertz/komma/døde taster)"
-#: ../rules/base.xml.in.h:524
+#: ../rules/base.xml.in.h:534
msgid "Hungarian (102/qwertz/comma/eliminate dead keys)"
msgstr "Ungarsk (102/qwertz/komma/slå døde taster fra)"
-#: ../rules/base.xml.in.h:525
+#: ../rules/base.xml.in.h:535
msgid "Hungarian (102/qwertz/dot/dead keys)"
msgstr "Ungarsk (102/qwertz/punktum/døde taster)"
-#: ../rules/base.xml.in.h:526
+#: ../rules/base.xml.in.h:536
msgid "Hungarian (102/qwertz/dot/eliminate dead keys)"
msgstr "Ungarsk (102/qwertz/punktum/slå døde taster fra)"
-#: ../rules/base.xml.in.h:527
+#: ../rules/base.xml.in.h:537
msgid "Hungarian (102/qwerty/comma/dead keys)"
msgstr "Ungarsk (102/qwerty/komma/døde taster)"
-#: ../rules/base.xml.in.h:528
+#: ../rules/base.xml.in.h:538
msgid "Hungarian (102/qwerty/comma/eliminate dead keys)"
msgstr "Ungarsk (102/qwerty/komma/slå døde taster fra)"
-#: ../rules/base.xml.in.h:529
+#: ../rules/base.xml.in.h:539
msgid "Hungarian (102/qwerty/dot/dead keys)"
msgstr "Ungarsk (102/qwerty/punktum/døde taster)"
-#: ../rules/base.xml.in.h:530
+#: ../rules/base.xml.in.h:540
msgid "Hungarian (102/qwerty/dot/eliminate dead keys)"
msgstr "Ungarsk (102/qwerty/punktum/slå døde taster fra)"
#. Keyboard indicator for Icelandic layouts
-#: ../rules/base.xml.in.h:532
+#: ../rules/base.xml.in.h:542
msgid "is"
msgstr "is"
-#: ../rules/base.xml.in.h:533
+#: ../rules/base.xml.in.h:543
msgid "Icelandic"
msgstr "Islandsk"
-#: ../rules/base.xml.in.h:534
+#: ../rules/base.xml.in.h:544
msgid "Icelandic (Sun dead keys)"
msgstr "Islandsk (Sun døde taster)"
-#: ../rules/base.xml.in.h:535
+#: ../rules/base.xml.in.h:545
msgid "Icelandic (eliminate dead keys)"
msgstr "Islandsk (slå døde taster fra)"
-#: ../rules/base.xml.in.h:536
+#: ../rules/base.xml.in.h:546
msgid "Icelandic (Macintosh)"
msgstr "Islandsk (Macintosh)"
-#: ../rules/base.xml.in.h:537
+#: ../rules/base.xml.in.h:547
msgid "Icelandic (Dvorak)"
msgstr "Islandsk (Dvorak)"
#. Keyboard indicator for Hebrew layouts
-#: ../rules/base.xml.in.h:539 ../rules/base.extras.xml.in.h:61
+#: ../rules/base.xml.in.h:549 ../rules/base.extras.xml.in.h:62
msgid "he"
msgstr "he"
-#: ../rules/base.xml.in.h:540 ../rules/base.extras.xml.in.h:62
+#: ../rules/base.xml.in.h:550 ../rules/base.extras.xml.in.h:63
msgid "Hebrew"
msgstr "Hebraisk"
-#: ../rules/base.xml.in.h:541
+#: ../rules/base.xml.in.h:551
msgid "Hebrew (lyx)"
msgstr "Hebraisk (lyx)"
-#: ../rules/base.xml.in.h:542
+#: ../rules/base.xml.in.h:552
msgid "Hebrew (phonetic)"
msgstr "Hebraisk (fonetisk)"
-#: ../rules/base.xml.in.h:543
+#: ../rules/base.xml.in.h:553
msgid "Hebrew (Biblical, Tiro)"
msgstr "Hebraisk (bibelsk, Tiro)"
#. Keyboard indicator for Italian layouts
-#: ../rules/base.xml.in.h:545 ../rules/base.extras.xml.in.h:93
+#: ../rules/base.xml.in.h:555 ../rules/base.extras.xml.in.h:94
msgid "it"
msgstr "it"
-#: ../rules/base.xml.in.h:546 ../rules/base.extras.xml.in.h:94
+#: ../rules/base.xml.in.h:556 ../rules/base.extras.xml.in.h:95
msgid "Italian"
msgstr "Italiensk"
-#: ../rules/base.xml.in.h:547
+#: ../rules/base.xml.in.h:557
msgid "Italian (eliminate dead keys)"
msgstr "Italiensk (slå døde taster fra)"
-#: ../rules/base.xml.in.h:548
+#: ../rules/base.xml.in.h:558
msgid "Italian (Macintosh)"
msgstr "Italiensk (Macintosh)"
-#: ../rules/base.xml.in.h:549
+#: ../rules/base.xml.in.h:559
msgid "Italian (US keyboard with Italian letters)"
msgstr "Italiensk (US-tastatur med italienske bogstaver)"
-#: ../rules/base.xml.in.h:550
+#: ../rules/base.xml.in.h:560
msgid "Georgian (Italy)"
msgstr "Georgisk (Italien)"
-#: ../rules/base.xml.in.h:551
+#: ../rules/base.xml.in.h:561
msgid "Italian (IBM 142)"
msgstr "Italiensk (IBM 142)"
#. Keyboard indicator for Japanese layouts
-#: ../rules/base.xml.in.h:553 ../rules/base.extras.xml.in.h:96
+#: ../rules/base.xml.in.h:563 ../rules/base.extras.xml.in.h:97
msgid "ja"
msgstr "ja"
-#: ../rules/base.xml.in.h:554 ../rules/base.extras.xml.in.h:97
+#: ../rules/base.xml.in.h:564 ../rules/base.extras.xml.in.h:98
msgid "Japanese"
msgstr "Japansk"
-#: ../rules/base.xml.in.h:555
+#: ../rules/base.xml.in.h:565
msgid "Japanese (Kana)"
msgstr "Japansk (Kana)"
-#: ../rules/base.xml.in.h:556
+#: ../rules/base.xml.in.h:566
msgid "Japanese (Kana 86)"
msgstr "Japansk (Kana 86)"
-#: ../rules/base.xml.in.h:557
+#: ../rules/base.xml.in.h:567
msgid "Japanese (OADG 109A)"
msgstr "Japansk (OADG 109A)"
-#: ../rules/base.xml.in.h:558
+#: ../rules/base.xml.in.h:568
msgid "Japanese (Macintosh)"
msgstr "Japansk (Macintosh)"
-#: ../rules/base.xml.in.h:559
+#: ../rules/base.xml.in.h:569
msgid "Japanese (Dvorak)"
msgstr "Japansk (dvorak)"
#. Keyboard indicator for Kikuyu layouts
-#: ../rules/base.xml.in.h:561
+#: ../rules/base.xml.in.h:571
msgid "ki"
msgstr "ki"
-#: ../rules/base.xml.in.h:562
+#: ../rules/base.xml.in.h:572
msgid "Kyrgyz"
msgstr "Kirgisisk"
-#: ../rules/base.xml.in.h:563
+#: ../rules/base.xml.in.h:573
msgid "Kyrgyz (phonetic)"
msgstr "Kirgisisk (fonetisk)"
#. Keyboard indicator for Khmer layouts
-#: ../rules/base.xml.in.h:565
+#: ../rules/base.xml.in.h:575
msgid "km"
msgstr "km"
-#: ../rules/base.xml.in.h:566
+#: ../rules/base.xml.in.h:576
msgid "Khmer (Cambodia)"
msgstr "Khmerisk (Cambodja)"
#. Keyboard indicator for Kazakh layouts
-#: ../rules/base.xml.in.h:568
+#: ../rules/base.xml.in.h:578
msgid "kk"
msgstr "kk"
-#: ../rules/base.xml.in.h:569
+#: ../rules/base.xml.in.h:579
msgid "Kazakh"
msgstr "Kasakhisk"
-#: ../rules/base.xml.in.h:570
+#: ../rules/base.xml.in.h:580
msgid "Russian (Kazakhstan, with Kazakh)"
msgstr "Russisk (Kasakhstan, med kazakhisk)"
-#: ../rules/base.xml.in.h:571
+#: ../rules/base.xml.in.h:581
msgid "Kazakh (with Russian)"
msgstr "Kasakhisk (med russisk)"
#. Keyboard indicator for Lao layouts
-#: ../rules/base.xml.in.h:573
+#: ../rules/base.xml.in.h:583
msgid "lo"
msgstr "lo"
-#: ../rules/base.xml.in.h:574
+#: ../rules/base.xml.in.h:584
msgid "Lao"
msgstr "Lao"
-#: ../rules/base.xml.in.h:575
+#: ../rules/base.xml.in.h:585
msgid "Lao (STEA proposed standard layout)"
msgstr "Lao (STEA-foreslået standardlayout)"
#. Keyboard indicator for Spanish layouts
-#: ../rules/base.xml.in.h:577 ../rules/base.extras.xml.in.h:109
+#: ../rules/base.xml.in.h:587 ../rules/base.extras.xml.in.h:110
msgid "es"
msgstr "es"
-#: ../rules/base.xml.in.h:578
+#: ../rules/base.xml.in.h:588
msgid "Spanish (Latin American)"
msgstr "Spansk (latinamerikansk)"
-#: ../rules/base.xml.in.h:579
+#: ../rules/base.xml.in.h:589
msgid "Spanish (Latin American, eliminate dead keys)"
msgstr "Spansk (latinamerikansk, slå døde taster fra)"
-#: ../rules/base.xml.in.h:580
+#: ../rules/base.xml.in.h:590
msgid "Spanish (Latin American, include dead tilde)"
msgstr "Spansk (latinamerikansk, inkluder død tilde)"
-#: ../rules/base.xml.in.h:581
+#: ../rules/base.xml.in.h:591
msgid "Spanish (Latin American, Sun dead keys)"
msgstr "Spansk (latinamerikansk, Sun døde taster)"
#. Keyboard indicator for Lithuanian layouts
-#: ../rules/base.xml.in.h:583 ../rules/base.extras.xml.in.h:18
+#: ../rules/base.xml.in.h:593 ../rules/base.extras.xml.in.h:18
msgid "lt"
msgstr "lt"
-#: ../rules/base.xml.in.h:584 ../rules/base.extras.xml.in.h:19
+#: ../rules/base.xml.in.h:594 ../rules/base.extras.xml.in.h:19
msgid "Lithuanian"
msgstr "Litauisk"
-#: ../rules/base.xml.in.h:585
+#: ../rules/base.xml.in.h:595
msgid "Lithuanian (standard)"
msgstr "Litauisk (standard)"
-#: ../rules/base.xml.in.h:586
+#: ../rules/base.xml.in.h:596
msgid "Lithuanian (US keyboard with Lithuanian letters)"
msgstr "Litauisk (US-tastatur med litauiske bogstaver)"
-#: ../rules/base.xml.in.h:587
+#: ../rules/base.xml.in.h:597
msgid "Lithuanian (IBM LST 1205-92)"
msgstr "Litauisk (IBM LST 1205-92)"
-#: ../rules/base.xml.in.h:588
+#: ../rules/base.xml.in.h:598
msgid "Lithuanian (LEKP)"
msgstr "Litauisk (LEKP)"
-#: ../rules/base.xml.in.h:589
+#: ../rules/base.xml.in.h:599
msgid "Lithuanian (LEKPa)"
msgstr "Litauisk (LEKPa)"
#. Keyboard indicator for Latvian layouts
-#: ../rules/base.xml.in.h:591 ../rules/base.extras.xml.in.h:22
+#: ../rules/base.xml.in.h:601 ../rules/base.extras.xml.in.h:22
msgid "lv"
msgstr "lv"
-#: ../rules/base.xml.in.h:592 ../rules/base.extras.xml.in.h:23
+#: ../rules/base.xml.in.h:602 ../rules/base.extras.xml.in.h:23
msgid "Latvian"
msgstr "Lettisk"
-#: ../rules/base.xml.in.h:593
+#: ../rules/base.xml.in.h:603
msgid "Latvian (apostrophe variant)"
msgstr "Lettisk (apostrofvariant)"
-#: ../rules/base.xml.in.h:594
+#: ../rules/base.xml.in.h:604
msgid "Latvian (tilde variant)"
msgstr "Lettisk (tildevariant)"
-#: ../rules/base.xml.in.h:595
+#: ../rules/base.xml.in.h:605
msgid "Latvian (F variant)"
msgstr "Lettisk (F-variant)"
-#: ../rules/base.xml.in.h:596
+#: ../rules/base.xml.in.h:606
msgid "Latvian (modern)"
msgstr "Lettisk (moderne)"
-#: ../rules/base.xml.in.h:597
+#: ../rules/base.xml.in.h:607
msgid "Latvian (ergonomic, ŪGJRMV)"
msgstr "Lettisk (ergonomisk, ŪGJRMV)"
-#: ../rules/base.xml.in.h:598
+#: ../rules/base.xml.in.h:608
msgid "Latvian (adapted)"
msgstr "Lettisk (adapteret)"
#. Keyboard indicator for Maori layouts
-#: ../rules/base.xml.in.h:600
+#: ../rules/base.xml.in.h:610
msgid "mi"
msgstr "mi"
-#: ../rules/base.xml.in.h:601
+#: ../rules/base.xml.in.h:611
msgid "Maori"
msgstr "Maori"
#. Keyboard indicator for Serbian layouts
-#: ../rules/base.xml.in.h:603 ../rules/base.extras.xml.in.h:51
+#: ../rules/base.xml.in.h:613 ../rules/base.extras.xml.in.h:52
msgid "sr"
msgstr "sr"
-#: ../rules/base.xml.in.h:604
+#: ../rules/base.xml.in.h:614
msgid "Montenegrin"
msgstr "Montenegrinsk"
-#: ../rules/base.xml.in.h:605
+#: ../rules/base.xml.in.h:615
msgid "Montenegrin (Cyrillic)"
msgstr "Montenegrinsk (kyrillisk)"
-#: ../rules/base.xml.in.h:606
+#: ../rules/base.xml.in.h:616
msgid "Montenegrin (Cyrillic, Z and ZHE swapped)"
msgstr "Montenegrinsk (kyrillisk, Z og ZHE ombyttet)"
-#: ../rules/base.xml.in.h:607
+#: ../rules/base.xml.in.h:617
msgid "Montenegrin (Latin Unicode)"
msgstr "Montenegrinsk (latin Unicode)"
-#: ../rules/base.xml.in.h:608
+#: ../rules/base.xml.in.h:618
msgid "Montenegrin (Latin qwerty)"
msgstr "Montenegrinsk (latin qwerty)"
-#: ../rules/base.xml.in.h:609
+#: ../rules/base.xml.in.h:619
msgid "Montenegrin (Latin Unicode qwerty)"
msgstr "Montenegrinsk (latin Unicode qwerty)"
# guillemets er dem her: »«
-#: ../rules/base.xml.in.h:610
+#: ../rules/base.xml.in.h:620
msgid "Montenegrin (Cyrillic with guillemets)"
msgstr "Montenegrinsk (kyrillisk med anførelsestegnene »«)"
# guillemets er dem her: »«
-#: ../rules/base.xml.in.h:611
+#: ../rules/base.xml.in.h:621
msgid "Montenegrin (Latin with guillemets)"
msgstr "Montenegrinsk (latin med anførelsestegnene »«)"
#. Keyboard indicator for Macedonian layouts
-#: ../rules/base.xml.in.h:613
+#: ../rules/base.xml.in.h:623
msgid "mk"
msgstr "mk"
-#: ../rules/base.xml.in.h:614
+#: ../rules/base.xml.in.h:624
msgid "Macedonian"
msgstr "Makedonsk"
-#: ../rules/base.xml.in.h:615
+#: ../rules/base.xml.in.h:625
msgid "Macedonian (eliminate dead keys)"
msgstr "Makedonsk (slå døde taster fra)"
#. Keyboard indicator for Maltese layouts
-#: ../rules/base.xml.in.h:617
+#: ../rules/base.xml.in.h:627
msgid "mt"
msgstr "mt"
-#: ../rules/base.xml.in.h:618
+#: ../rules/base.xml.in.h:628
msgid "Maltese"
msgstr "Maltesisk"
-#: ../rules/base.xml.in.h:619
+#: ../rules/base.xml.in.h:629
msgid "Maltese (with US layout)"
msgstr "Maltesisk (med US-layout)"
#. Keyboard indicator for Mongolian layouts
-#: ../rules/base.xml.in.h:621
+#: ../rules/base.xml.in.h:631
msgid "mn"
msgstr "mn"
-#: ../rules/base.xml.in.h:622
+#: ../rules/base.xml.in.h:632
msgid "Mongolian"
msgstr "Mongolsk"
#. Keyboard indicator for Norwegian layouts
-#: ../rules/base.xml.in.h:624 ../rules/base.extras.xml.in.h:101
+#: ../rules/base.xml.in.h:634 ../rules/base.extras.xml.in.h:102
msgid "no"
msgstr "no"
-#: ../rules/base.xml.in.h:625 ../rules/base.extras.xml.in.h:102
+#: ../rules/base.xml.in.h:635 ../rules/base.extras.xml.in.h:103
msgid "Norwegian"
msgstr "Norsk"
-#: ../rules/base.xml.in.h:626
+#: ../rules/base.xml.in.h:636
msgid "Norwegian (eliminate dead keys)"
msgstr "Norsk (slå døde taster fra)"
-#: ../rules/base.xml.in.h:627
+#: ../rules/base.xml.in.h:637
msgid "Norwegian (Dvorak)"
msgstr "Norsk (dvorak)"
-#: ../rules/base.xml.in.h:628
+#: ../rules/base.xml.in.h:638
msgid "Northern Saami (Norway)"
msgstr "Nordligt samisk (Norge)"
-#: ../rules/base.xml.in.h:629
+#: ../rules/base.xml.in.h:639
msgid "Northern Saami (Norway, eliminate dead keys)"
msgstr "Nordligt samisk (Norge, slå døde taster fra)"
-#: ../rules/base.xml.in.h:630
+#: ../rules/base.xml.in.h:640
msgid "Norwegian (Macintosh)"
msgstr "Norsk (Macintosh)"
-#: ../rules/base.xml.in.h:631
+#: ../rules/base.xml.in.h:641
msgid "Norwegian (Macintosh, eliminate dead keys)"
msgstr "Norsk (Macintosh, slå døde taster fra)"
-#: ../rules/base.xml.in.h:632
+#: ../rules/base.xml.in.h:642
msgid "Norwegian (Colemak)"
msgstr "Norsk (Colemak)"
#. Keyboard indicator for Polish layouts
-#: ../rules/base.xml.in.h:634 ../rules/base.extras.xml.in.h:40
+#: ../rules/base.xml.in.h:644 ../rules/base.extras.xml.in.h:41
msgid "pl"
msgstr "pl"
-#: ../rules/base.xml.in.h:635 ../rules/base.extras.xml.in.h:41
+#: ../rules/base.xml.in.h:645 ../rules/base.extras.xml.in.h:42
msgid "Polish"
msgstr "Polsk"
-#: ../rules/base.xml.in.h:636
+#: ../rules/base.xml.in.h:646
msgid "Polish (legacy)"
msgstr "Polsk (forældet)"
-#: ../rules/base.xml.in.h:637
+#: ../rules/base.xml.in.h:647
msgid "Polish (qwertz)"
msgstr "Polsk (qwertz)"
-#: ../rules/base.xml.in.h:638
+#: ../rules/base.xml.in.h:648
msgid "Polish (Dvorak)"
msgstr "Polsk (dvorak)"
-#: ../rules/base.xml.in.h:639
+#: ../rules/base.xml.in.h:649
msgid "Polish (Dvorak, Polish quotes on quotemark key)"
msgstr "Polsk (dvorak, polske anførelsestegn på anførelsestast)"
-#: ../rules/base.xml.in.h:640
+#: ../rules/base.xml.in.h:650
msgid "Polish (Dvorak, Polish quotes on key 1)"
msgstr "Polsk (dvorak, polske anførelsestegn på tast 1)"
-#: ../rules/base.xml.in.h:641
+#: ../rules/base.xml.in.h:651
msgid "Kashubian"
msgstr "Kashubian"
-#: ../rules/base.xml.in.h:642
+#: ../rules/base.xml.in.h:652
msgid "Russian (Poland, phonetic Dvorak)"
msgstr "Russisk (Polen, fonetisk dvorak)"
-#: ../rules/base.xml.in.h:643
+#: ../rules/base.xml.in.h:653
msgid "Polish (programmer Dvorak)"
msgstr "Polsk (programmørdvorak)"
-#: ../rules/base.xml.in.h:644 ../rules/base.extras.xml.in.h:104
+#: ../rules/base.xml.in.h:654 ../rules/base.extras.xml.in.h:105
msgid "Portuguese"
msgstr "Portugisisk"
-#: ../rules/base.xml.in.h:645
+#: ../rules/base.xml.in.h:655
msgid "Portuguese (eliminate dead keys)"
msgstr "Portugisisk (slå døde taster fra)"
-#: ../rules/base.xml.in.h:646
+#: ../rules/base.xml.in.h:656
msgid "Portuguese (Sun dead keys)"
msgstr "Portugisisk (Sun døde taster)"
-#: ../rules/base.xml.in.h:647
+#: ../rules/base.xml.in.h:657
msgid "Portuguese (Macintosh)"
msgstr "Portugisisk (Macintosh)"
-#: ../rules/base.xml.in.h:648
+#: ../rules/base.xml.in.h:658
msgid "Portuguese (Macintosh, eliminate dead keys)"
msgstr "Portugisisk (Macintosh, slå døde taster fra)"
-#: ../rules/base.xml.in.h:649
+#: ../rules/base.xml.in.h:659
msgid "Portuguese (Macintosh, Sun dead keys)"
msgstr "Portugisisk (Macintosh, Sun døde taster)"
-#: ../rules/base.xml.in.h:650
+#: ../rules/base.xml.in.h:660
msgid "Portuguese (Nativo)"
msgstr "Portugisisk (nativo)"
-#: ../rules/base.xml.in.h:651
-msgid "Portuguese (Nativo for USA keyboards)"
+#: ../rules/base.xml.in.h:661
+msgid "Portuguese (Nativo for US keyboards)"
msgstr "Portugisisk (nativo for USA-tastaturer)"
-#: ../rules/base.xml.in.h:652
+#: ../rules/base.xml.in.h:662
msgid "Esperanto (Portugal, Nativo)"
msgstr "Esperanto (Portugal, Nativo)"
#. Keyboard indicator for Romanian layouts
-#: ../rules/base.xml.in.h:654 ../rules/base.extras.xml.in.h:45
+#: ../rules/base.xml.in.h:664 ../rules/base.extras.xml.in.h:46
msgid "ro"
msgstr "ro"
-#: ../rules/base.xml.in.h:655 ../rules/base.extras.xml.in.h:46
+#: ../rules/base.xml.in.h:665 ../rules/base.extras.xml.in.h:47
msgid "Romanian"
msgstr "Rumænsk"
# http://da.wikipedia.org/wiki/%C3%87
-#: ../rules/base.xml.in.h:656
+#: ../rules/base.xml.in.h:666
msgid "Romanian (cedilla)"
msgstr "Rumænsk (cedille)"
-#: ../rules/base.xml.in.h:657
+#: ../rules/base.xml.in.h:667
msgid "Romanian (standard)"
msgstr "Rumænsk (standard)"
-#: ../rules/base.xml.in.h:658
+#: ../rules/base.xml.in.h:668
msgid "Romanian (standard cedilla)"
msgstr "Rumænsk (standardcedille)"
-#: ../rules/base.xml.in.h:659
+#: ../rules/base.xml.in.h:669
msgid "Romanian (WinKeys)"
msgstr "Rumænsk (Wintaster)"
-#: ../rules/base.xml.in.h:660 ../rules/base.extras.xml.in.h:55
+#: ../rules/base.xml.in.h:670 ../rules/base.extras.xml.in.h:56
msgid "Russian"
msgstr "Russisk"
-#: ../rules/base.xml.in.h:661
+#: ../rules/base.xml.in.h:671
msgid "Russian (phonetic)"
msgstr "Russisk (fonetisk)"
-#: ../rules/base.xml.in.h:662
+#: ../rules/base.xml.in.h:672
msgid "Russian (phonetic WinKeys)"
msgstr "Russisk (fonetisk Wintaster)"
-#: ../rules/base.xml.in.h:663
+#: ../rules/base.xml.in.h:673
msgid "Russian (typewriter)"
msgstr "Russisk (skrivemaskine)"
-#: ../rules/base.xml.in.h:664
+#: ../rules/base.xml.in.h:674
msgid "Russian (legacy)"
msgstr "Russisk (forældet)"
-#: ../rules/base.xml.in.h:665
+#: ../rules/base.xml.in.h:675
msgid "Russian (typewriter, legacy)"
msgstr "Russisk (skrivemaskine, forældet)"
-#: ../rules/base.xml.in.h:666
+#: ../rules/base.xml.in.h:676
msgid "Tatar"
msgstr "Tatar"
-#: ../rules/base.xml.in.h:667
+#: ../rules/base.xml.in.h:677
msgid "Ossetian (legacy)"
msgstr "Occitansk (forældet)"
-#: ../rules/base.xml.in.h:668
+#: ../rules/base.xml.in.h:678
msgid "Ossetian (WinKeys)"
msgstr "Occitansk (Wintaster)"
-#: ../rules/base.xml.in.h:669
+#: ../rules/base.xml.in.h:679
msgid "Chuvash"
msgstr "Chuvash"
-#: ../rules/base.xml.in.h:670
+#: ../rules/base.xml.in.h:680
msgid "Chuvash (Latin)"
msgstr "Chuvash (latin)"
-#: ../rules/base.xml.in.h:671
+#: ../rules/base.xml.in.h:681
msgid "Udmurt"
msgstr "Udmurt"
-#: ../rules/base.xml.in.h:672
+#: ../rules/base.xml.in.h:682
msgid "Komi"
msgstr "Komi"
-#: ../rules/base.xml.in.h:673
+#: ../rules/base.xml.in.h:683
msgid "Yakut"
msgstr "Yakut"
-#: ../rules/base.xml.in.h:674
+#: ../rules/base.xml.in.h:684
msgid "Kalmyk"
msgstr "Kalmyk"
-#: ../rules/base.xml.in.h:675
+#: ../rules/base.xml.in.h:685
msgid "Russian (DOS)"
msgstr "Russisk (DOS)"
-#: ../rules/base.xml.in.h:676
+#: ../rules/base.xml.in.h:686
msgid "Russian (Macintosh)"
msgstr "Russisk (Macintosh)"
-#: ../rules/base.xml.in.h:677
+#: ../rules/base.xml.in.h:687
msgid "Serbian (Russia)"
msgstr "Serbisk (Rusland)"
-#: ../rules/base.xml.in.h:678
+#: ../rules/base.xml.in.h:688
msgid "Bashkirian"
msgstr "Bashkirisk"
-#: ../rules/base.xml.in.h:679
+#: ../rules/base.xml.in.h:689
msgid "Mari"
msgstr "Mari"
-#: ../rules/base.xml.in.h:680 ../rules/base.extras.xml.in.h:52
+#: ../rules/base.xml.in.h:690 ../rules/base.extras.xml.in.h:53
msgid "Serbian"
msgstr "Serbisk"
-#: ../rules/base.xml.in.h:681
+#: ../rules/base.xml.in.h:691
msgid "Serbian (Cyrillic, Z and ZHE swapped)"
msgstr "Serbisk (kyrillisk, Z og ZHE ombyttet)"
-#: ../rules/base.xml.in.h:682
+#: ../rules/base.xml.in.h:692
msgid "Serbian (Latin)"
msgstr "Serbisk (latin)"
-#: ../rules/base.xml.in.h:683
+#: ../rules/base.xml.in.h:693
msgid "Serbian (Latin Unicode)"
msgstr "Serbisk (latin unicode)"
-#: ../rules/base.xml.in.h:684
+#: ../rules/base.xml.in.h:694
msgid "Serbian (Latin qwerty)"
msgstr "Serbisk (latin qwerty)"
-#: ../rules/base.xml.in.h:685
+#: ../rules/base.xml.in.h:695
msgid "Serbian (Latin Unicode qwerty)"
msgstr "Serbisk (latin unicode qwerty)"
# guillemets er dem her: »«
-#: ../rules/base.xml.in.h:686
+#: ../rules/base.xml.in.h:696
msgid "Serbian (Cyrillic with guillemets)"
msgstr "Serbisk (kyrillisk med anførelsestegnene »«)"
# guillemets er dem her: »«
-#: ../rules/base.xml.in.h:687
+#: ../rules/base.xml.in.h:697
msgid "Serbian (Latin with guillemets)"
msgstr "Serbisk (latin med anførelsestegnene »«)"
# Pannonian Rusyn or simply Rusyn (Ruthenian) is a Slavic language or dialect spoken
# in north-western Serbia and eastern Croatia
-#: ../rules/base.xml.in.h:688
-msgid "Pannonian Rusyn (homophonic)"
-msgstr "Pannonisk rusyn (homofonisk)"
+#: ../rules/base.xml.in.h:698
+msgid "Pannonian Rusyn"
+msgstr "Pannonisk rusyn"
#. Keyboard indicator for Slovenian layouts
-#: ../rules/base.xml.in.h:690
+#: ../rules/base.xml.in.h:700
msgid "sl"
msgstr "sl"
-#: ../rules/base.xml.in.h:691
+#: ../rules/base.xml.in.h:701
msgid "Slovenian"
msgstr "Slovensk"
-#: ../rules/base.xml.in.h:692
+#: ../rules/base.xml.in.h:702
msgid "Slovenian (use guillemets for quotes)"
msgstr "Slovensk (anvend »« som anførelsestegn)"
-#: ../rules/base.xml.in.h:693
+#: ../rules/base.xml.in.h:703
msgid "Slovenian (US keyboard with Slovenian letters)"
msgstr "Slovensk (US-tastatur med slovenske bogstaver)"
#. Keyboard indicator for Slovak layouts
-#: ../rules/base.xml.in.h:695 ../rules/base.extras.xml.in.h:106
+#: ../rules/base.xml.in.h:705 ../rules/base.extras.xml.in.h:107
msgid "sk"
msgstr "sk"
-#: ../rules/base.xml.in.h:696 ../rules/base.extras.xml.in.h:107
+#: ../rules/base.xml.in.h:706 ../rules/base.extras.xml.in.h:108
msgid "Slovak"
msgstr "Slovakisk"
-#: ../rules/base.xml.in.h:697
+#: ../rules/base.xml.in.h:707
msgid "Slovak (extended Backslash)"
msgstr "Slovakisk (udvidet omvendt skråstreg)"
-#: ../rules/base.xml.in.h:698
+#: ../rules/base.xml.in.h:708
msgid "Slovak (qwerty)"
msgstr "Slovakisk (qwerty)"
-#: ../rules/base.xml.in.h:699
+#: ../rules/base.xml.in.h:709
msgid "Slovak (qwerty, extended Backslash)"
msgstr "Slovakisk (qwerty, udvidet omvendt skråstreg)"
-#: ../rules/base.xml.in.h:700 ../rules/base.extras.xml.in.h:110
+#: ../rules/base.xml.in.h:710 ../rules/base.extras.xml.in.h:111
msgid "Spanish"
msgstr "Spansk"
-#: ../rules/base.xml.in.h:701
+#: ../rules/base.xml.in.h:711
msgid "Spanish (eliminate dead keys)"
msgstr "Spansk (slå døde taster fra)"
-#: ../rules/base.xml.in.h:702
+#: ../rules/base.xml.in.h:712
msgid "Spanish (include dead tilde)"
msgstr "Spansk (inkluder død tilde)"
-#: ../rules/base.xml.in.h:703
+#: ../rules/base.xml.in.h:713
msgid "Spanish (Sun dead keys)"
msgstr "Spansk (Sun døde taster)"
-#: ../rules/base.xml.in.h:704
+#: ../rules/base.xml.in.h:714
msgid "Spanish (Dvorak)"
msgstr "Spansk (dvorak)"
@@ -2660,1123 +2694,1139 @@ msgstr "Spansk (dvorak)"
# language of the West Iberian group, Astur-Leonese
# Subgroup, spoken in the Spanish province of Asturias
# by the Asturian people.
-#: ../rules/base.xml.in.h:705
+#: ../rules/base.xml.in.h:715
msgid "Asturian (Spain, with bottom-dot H and bottom-dot L)"
msgstr "Asturisk (Spanien, med bundpunktum H og bundpunktum L)"
-#: ../rules/base.xml.in.h:706
+#: ../rules/base.xml.in.h:716
msgid "Catalan (Spain, with middle-dot L)"
msgstr "Catalansk (Spanien, med midterpunktum L)"
-#: ../rules/base.xml.in.h:707
+#: ../rules/base.xml.in.h:717
msgid "Spanish (Macintosh)"
msgstr "Spansk (Macintosh)"
#. Keyboard indicator for Swedish layouts
-#: ../rules/base.xml.in.h:709 ../rules/base.extras.xml.in.h:112
+#: ../rules/base.xml.in.h:719 ../rules/base.extras.xml.in.h:113
msgid "sv"
msgstr "sv"
-#: ../rules/base.xml.in.h:710 ../rules/base.extras.xml.in.h:113
+#: ../rules/base.xml.in.h:720 ../rules/base.extras.xml.in.h:114
msgid "Swedish"
msgstr "Svensk"
-#: ../rules/base.xml.in.h:711
+#: ../rules/base.xml.in.h:721
msgid "Swedish (eliminate dead keys)"
msgstr "Svensk (slå døde taster fra)"
-#: ../rules/base.xml.in.h:712
+#: ../rules/base.xml.in.h:722
msgid "Swedish (Dvorak)"
msgstr "Svensk (dvorak)"
-#: ../rules/base.xml.in.h:713
+#: ../rules/base.xml.in.h:723
msgid "Russian (Sweden, phonetic)"
msgstr "Russisk (Sverige, fonetisk)"
-#: ../rules/base.xml.in.h:714
+#: ../rules/base.xml.in.h:724
msgid "Russian (Sweden, phonetic, eliminate dead keys)"
msgstr "Russisk (Sverige, fonetisk, slå døde taster fra)"
-#: ../rules/base.xml.in.h:715
+#: ../rules/base.xml.in.h:725
msgid "Northern Saami (Sweden)"
msgstr "Nordligt samisk (Sverige)"
-#: ../rules/base.xml.in.h:716
+#: ../rules/base.xml.in.h:726
msgid "Swedish (Macintosh)"
msgstr "Svensk (Macintosh)"
-#: ../rules/base.xml.in.h:717
+#: ../rules/base.xml.in.h:727
msgid "Swedish (Svdvorak)"
msgstr "Svensk (svdvorak)"
-#: ../rules/base.xml.in.h:718
+#: ../rules/base.xml.in.h:728
msgid "Swedish Sign Language"
msgstr "Svensk tegnsprog"
-#: ../rules/base.xml.in.h:719 ../rules/base.extras.xml.in.h:115
+#: ../rules/base.xml.in.h:729 ../rules/base.extras.xml.in.h:116
msgid "German (Switzerland)"
msgstr "Tysk (Schweiz)"
-#: ../rules/base.xml.in.h:720
+#: ../rules/base.xml.in.h:730
msgid "German (Switzerland, legacy)"
msgstr "Tysk (Schweiz, forældet)"
-#: ../rules/base.xml.in.h:721
+#: ../rules/base.xml.in.h:731
msgid "German (Switzerland, eliminate dead keys)"
msgstr "Tysk (Schweiz, slå døde taster fra)"
-#: ../rules/base.xml.in.h:722
+#: ../rules/base.xml.in.h:732
msgid "German (Switzerland, Sun dead keys)"
msgstr "Tysk (Schweiz, Sun døde taster)"
-#: ../rules/base.xml.in.h:723
+#: ../rules/base.xml.in.h:733
msgid "French (Switzerland)"
msgstr "Fransk (Schweiz)"
-#: ../rules/base.xml.in.h:724
+#: ../rules/base.xml.in.h:734
msgid "French (Switzerland, eliminate dead keys)"
msgstr "Fransk (Schweiz, slå døde taster fra)"
-#: ../rules/base.xml.in.h:725
+#: ../rules/base.xml.in.h:735
msgid "French (Switzerland, Sun dead keys)"
msgstr "Fransk (Schweiz, Sun døde taster)"
-#: ../rules/base.xml.in.h:726
+#: ../rules/base.xml.in.h:736
msgid "French (Switzerland, Macintosh)"
msgstr "Fransk (Schweiz, Macintosh)"
-#: ../rules/base.xml.in.h:727
+#: ../rules/base.xml.in.h:737
msgid "German (Switzerland, Macintosh)"
msgstr "Tysk (Schweiz, Macintosh)"
-#: ../rules/base.xml.in.h:728
+#: ../rules/base.xml.in.h:738
msgid "Arabic (Syria)"
msgstr "Arabisk (Syrien)"
#. Keyboard indicator for Syriac layouts
-#: ../rules/base.xml.in.h:730
+#: ../rules/base.xml.in.h:740
msgid "syc"
msgstr "syc"
-#: ../rules/base.xml.in.h:731
+#: ../rules/base.xml.in.h:741
msgid "Syriac"
msgstr "Syrisk"
-#: ../rules/base.xml.in.h:732
+#: ../rules/base.xml.in.h:742
msgid "Syriac (phonetic)"
msgstr "Syrisk (fonetisk)"
-#: ../rules/base.xml.in.h:733
+#: ../rules/base.xml.in.h:743
msgid "Kurdish (Syria, Latin Q)"
msgstr "Kurdisk (Syrien, latin Q)"
-#: ../rules/base.xml.in.h:734
+#: ../rules/base.xml.in.h:744
msgid "Kurdish (Syria, F)"
msgstr "Kurdisk (Syrien, F)"
-#: ../rules/base.xml.in.h:735
+#: ../rules/base.xml.in.h:745
msgid "Kurdish (Syria, Latin Alt-Q)"
msgstr "Kurdisk (Syrien, latin Alt-Q)"
#. Keyboard indicator for Tajik layouts
-#: ../rules/base.xml.in.h:737
+#: ../rules/base.xml.in.h:747
msgid "tg"
msgstr "tg"
-#: ../rules/base.xml.in.h:738
+#: ../rules/base.xml.in.h:748
msgid "Tajik"
msgstr "Tadsjikisk"
-#: ../rules/base.xml.in.h:739
+#: ../rules/base.xml.in.h:749
msgid "Tajik (legacy)"
msgstr "Tadsjikisk (forældet)"
#. Keyboard indicator for Sinhala layouts
-#: ../rules/base.xml.in.h:741
+#: ../rules/base.xml.in.h:751
msgid "si"
msgstr "si"
-#: ../rules/base.xml.in.h:742
+#: ../rules/base.xml.in.h:752
msgid "Sinhala (phonetic)"
msgstr "Singalesisk (fonetisk)"
-#: ../rules/base.xml.in.h:743
+#: ../rules/base.xml.in.h:753
msgid "Tamil (Sri Lanka, Unicode)"
msgstr "Tamilsk (Sri Lanka, unicode)"
-#: ../rules/base.xml.in.h:744
+#: ../rules/base.xml.in.h:754
msgid "Tamil (Sri Lanka, TAB Typewriter)"
msgstr "Tamilsk (Sri Lanka, TAB-skrivemaskine)"
#. Keyboard indicator for Thai layouts
-#: ../rules/base.xml.in.h:746
+#: ../rules/base.xml.in.h:756
msgid "th"
msgstr "th"
-#: ../rules/base.xml.in.h:747
+#: ../rules/base.xml.in.h:757
msgid "Thai"
msgstr "Thai"
-#: ../rules/base.xml.in.h:748
+#: ../rules/base.xml.in.h:758
msgid "Thai (TIS-820.2538)"
msgstr "Thai (TIS-820.2538)"
-#: ../rules/base.xml.in.h:749
+#: ../rules/base.xml.in.h:759
msgid "Thai (Pattachote)"
msgstr "Thai (pattachote)"
#. Keyboard indicator for Turkish layouts
-#: ../rules/base.xml.in.h:751 ../rules/base.extras.xml.in.h:118
+#: ../rules/base.xml.in.h:761 ../rules/base.extras.xml.in.h:119
msgid "tr"
msgstr "tr"
-#: ../rules/base.xml.in.h:752 ../rules/base.extras.xml.in.h:119
+#: ../rules/base.xml.in.h:762 ../rules/base.extras.xml.in.h:120
msgid "Turkish"
msgstr "Tyrkisk"
-#: ../rules/base.xml.in.h:753
+#: ../rules/base.xml.in.h:763
msgid "Turkish (F)"
msgstr "Tyrkisk (F)"
-#: ../rules/base.xml.in.h:754
+#: ../rules/base.xml.in.h:764
msgid "Turkish (Alt-Q)"
msgstr "Tyrkisk (Alt-Q)"
-#: ../rules/base.xml.in.h:755
+#: ../rules/base.xml.in.h:765
msgid "Turkish (Sun dead keys)"
msgstr "Tyrkisk (Sun døde taster)"
-#: ../rules/base.xml.in.h:756
+#: ../rules/base.xml.in.h:766
msgid "Kurdish (Turkey, Latin Q)"
msgstr "Kurdisk (Tyrkiet, latin Q)"
-#: ../rules/base.xml.in.h:757
+#: ../rules/base.xml.in.h:767
msgid "Kurdish (Turkey, F)"
msgstr "Kurdisk (Tyrkiet, F)"
-#: ../rules/base.xml.in.h:758
+#: ../rules/base.xml.in.h:768
msgid "Kurdish (Turkey, Latin Alt-Q)"
msgstr "Kurdisk (Tyrkiet, latin Alt-Q)"
-#: ../rules/base.xml.in.h:759
+#: ../rules/base.xml.in.h:769
msgid "Turkish (international with dead keys)"
msgstr "Tyrkisk (international med døde taster)"
#. Keyboard indicator for Crimean Tatar layouts
-#: ../rules/base.xml.in.h:761 ../rules/base.extras.xml.in.h:47
+#: ../rules/base.xml.in.h:771 ../rules/base.extras.xml.in.h:48
msgid "crh"
msgstr "crh"
-#: ../rules/base.xml.in.h:762
+#: ../rules/base.xml.in.h:772
msgid "Crimean Tatar (Turkish Q)"
msgstr "Krimtatarsk (tyrkisk Q)"
-#: ../rules/base.xml.in.h:763
+#: ../rules/base.xml.in.h:773
msgid "Crimean Tatar (Turkish F)"
msgstr "Krimtatarsk (tyrkisk F)"
-#: ../rules/base.xml.in.h:764
+#: ../rules/base.xml.in.h:774
msgid "Crimean Tatar (Turkish Alt-Q)"
msgstr "Krimtatarsk (tyrkisk Alt-Q)"
-#: ../rules/base.xml.in.h:765
+#: ../rules/base.xml.in.h:775
msgid "Taiwanese"
msgstr "Taiwanesisk"
-#: ../rules/base.xml.in.h:766
+#: ../rules/base.xml.in.h:776
msgid "Taiwanese (indigenous)"
msgstr "Taiwanesisk (indfødte)"
#. Keyboard indicator for Saisiyat layouts
-#: ../rules/base.xml.in.h:768
+#: ../rules/base.xml.in.h:778
msgid "xsy"
msgstr "xsy"
-#: ../rules/base.xml.in.h:769
+#: ../rules/base.xml.in.h:779
msgid "Saisiyat (Taiwan)"
msgstr "Saisiyat (Taiwan)"
#. Keyboard indicator for Ukranian layouts
-#: ../rules/base.xml.in.h:771 ../rules/base.extras.xml.in.h:121
+#: ../rules/base.xml.in.h:781 ../rules/base.extras.xml.in.h:122
msgid "uk"
msgstr "uk"
-#: ../rules/base.xml.in.h:772 ../rules/base.extras.xml.in.h:122
+#: ../rules/base.xml.in.h:782 ../rules/base.extras.xml.in.h:123
msgid "Ukrainian"
msgstr "Ukrainsk"
-#: ../rules/base.xml.in.h:773
+#: ../rules/base.xml.in.h:783
msgid "Ukrainian (phonetic)"
msgstr "Ukrainsk (fonetisk)"
-#: ../rules/base.xml.in.h:774
+#: ../rules/base.xml.in.h:784
msgid "Ukrainian (typewriter)"
msgstr "Ukrainsk (skrivemaskine)"
-#: ../rules/base.xml.in.h:775
+#: ../rules/base.xml.in.h:785
msgid "Ukrainian (WinKeys)"
msgstr "Ukrainsk (Wintaster)"
-#: ../rules/base.xml.in.h:776
+#: ../rules/base.xml.in.h:786
msgid "Ukrainian (legacy)"
msgstr "Ukrainsk (forældet)"
-#: ../rules/base.xml.in.h:777
+#: ../rules/base.xml.in.h:787
msgid "Ukrainian (standard RSTU)"
msgstr "Ukrainsk (standard RSTU)"
-#: ../rules/base.xml.in.h:778
+#: ../rules/base.xml.in.h:788
msgid "Russian (Ukraine, standard RSTU)"
msgstr "Russisk (Ukraine, standard RSTU)"
# Pannonian Rusyn or simply Rusyn (Ruthenian) is a Slavic language or dialect spoken
# in north-western Serbia and eastern Croatia
-#: ../rules/base.xml.in.h:779
+#: ../rules/base.xml.in.h:789
msgid "Ukrainian (homophonic)"
msgstr "Ukrainsk (homofonisk)"
-#: ../rules/base.xml.in.h:780 ../rules/base.extras.xml.in.h:124
+#: ../rules/base.xml.in.h:790 ../rules/base.extras.xml.in.h:125
msgid "English (UK)"
msgstr "Engelsk (UK)"
-#: ../rules/base.xml.in.h:781
+#: ../rules/base.xml.in.h:791
msgid "English (UK, extended WinKeys)"
msgstr "Engelsk (UK, udvidede Wintaster)"
-#: ../rules/base.xml.in.h:782
+#: ../rules/base.xml.in.h:792
msgid "English (UK, international with dead keys)"
msgstr "Engelsk (UK, international med døde taster)"
-#: ../rules/base.xml.in.h:783
+#: ../rules/base.xml.in.h:793
msgid "English (UK, Dvorak)"
msgstr "Engelsk (UK, Dvorak)"
-#: ../rules/base.xml.in.h:784
+#: ../rules/base.xml.in.h:794
msgid "English (UK, Dvorak with UK punctuation)"
msgstr "Engelsk (UK, Dvorak med UK-tegnsætning)"
-#: ../rules/base.xml.in.h:785
+#: ../rules/base.xml.in.h:795
msgid "English (UK, Macintosh)"
msgstr "Engelsk (UK, Macintosh)"
-#: ../rules/base.xml.in.h:786
+#: ../rules/base.xml.in.h:796
msgid "English (UK, Macintosh international)"
msgstr "Engelsk (UK, Macintosh international)"
-#: ../rules/base.xml.in.h:787
+#: ../rules/base.xml.in.h:797
msgid "English (UK, Colemak)"
msgstr "Engelsk (UK, Colemak)"
-#: ../rules/base.xml.in.h:788
+#: ../rules/base.xml.in.h:798
msgid "Uzbek"
msgstr "Usbekisk"
-#: ../rules/base.xml.in.h:789
+#: ../rules/base.xml.in.h:799
msgid "Uzbek (Latin)"
msgstr "Usbekisk (latin)"
#. Keyboard indicator for Vietnamese layouts
-#: ../rules/base.xml.in.h:791
+#: ../rules/base.xml.in.h:801
msgid "vi"
msgstr "vi"
-#: ../rules/base.xml.in.h:792
+#: ../rules/base.xml.in.h:802
msgid "Vietnamese"
msgstr "Vietnamesisk"
#. Keyboard indicator for Korean layouts
-#: ../rules/base.xml.in.h:794 ../rules/base.extras.xml.in.h:126
+#: ../rules/base.xml.in.h:804 ../rules/base.extras.xml.in.h:127
msgid "ko"
msgstr "ko"
-#: ../rules/base.xml.in.h:795 ../rules/base.extras.xml.in.h:127
+#: ../rules/base.xml.in.h:805 ../rules/base.extras.xml.in.h:128
msgid "Korean"
msgstr "Koreansk"
-#: ../rules/base.xml.in.h:796
+#: ../rules/base.xml.in.h:806
msgid "Korean (101/104 key compatible)"
msgstr "Koreansk (101/104 tastkompatibel)"
-#: ../rules/base.xml.in.h:797
+#: ../rules/base.xml.in.h:807
msgid "Japanese (PC-98xx Series)"
msgstr "Japansk (pc-98xx-serie)"
#. Keyboard indicator for Irish layouts
-#: ../rules/base.xml.in.h:799
+#: ../rules/base.xml.in.h:809
msgid "ie"
msgstr "ie"
-#: ../rules/base.xml.in.h:800
+#: ../rules/base.xml.in.h:810
msgid "Irish"
msgstr "Irsk"
-#: ../rules/base.xml.in.h:801
+#: ../rules/base.xml.in.h:811
msgid "CloGaelach"
msgstr "CloGaelach"
-#: ../rules/base.xml.in.h:802
+#: ../rules/base.xml.in.h:812
msgid "Irish (UnicodeExpert)"
msgstr "Irsk (UnicodeExpert)"
-#: ../rules/base.xml.in.h:803
+#: ../rules/base.xml.in.h:813
msgid "Ogham"
msgstr "Ogham"
-#: ../rules/base.xml.in.h:804
+#: ../rules/base.xml.in.h:814
msgid "Ogham (IS434)"
msgstr "Ogham (IS434)"
-#: ../rules/base.xml.in.h:805
+#: ../rules/base.xml.in.h:815
msgid "Urdu (Pakistan)"
msgstr "Urdu (Pakistan)"
-#: ../rules/base.xml.in.h:806
+#: ../rules/base.xml.in.h:816
msgid "Urdu (Pakistan, CRULP)"
msgstr "Urdu (Pakistan, CRULP)"
-#: ../rules/base.xml.in.h:807
+#: ../rules/base.xml.in.h:817
msgid "Urdu (Pakistan, NLA)"
msgstr "Urdu (Pakistan, NLA)"
-#: ../rules/base.xml.in.h:808
+#: ../rules/base.xml.in.h:818
msgid "Arabic (Pakistan)"
msgstr "Arabisk (Pakistan)"
#. Keyboard indicator for Sindhi layouts
-#: ../rules/base.xml.in.h:810
+#: ../rules/base.xml.in.h:820
msgid "sd"
msgstr "sd"
-#: ../rules/base.xml.in.h:811
+#: ../rules/base.xml.in.h:821
msgid "Sindhi"
msgstr "Sindhi"
#. Keyboard indicator for Dhivehi layouts
-#: ../rules/base.xml.in.h:813
+#: ../rules/base.xml.in.h:823
msgid "dv"
msgstr "dv"
-#: ../rules/base.xml.in.h:814
+#: ../rules/base.xml.in.h:824
msgid "Dhivehi"
msgstr "Dhivehi"
-#: ../rules/base.xml.in.h:815
+#: ../rules/base.xml.in.h:825
msgid "English (South Africa)"
msgstr "Engelsk (Sydafrika)"
#. Keyboard indicator for Esperanto layouts
-#: ../rules/base.xml.in.h:817
+#: ../rules/base.xml.in.h:827
msgid "eo"
msgstr "eo"
-#: ../rules/base.xml.in.h:818
+#: ../rules/base.xml.in.h:828
msgid "Esperanto"
msgstr "Esperanto"
-#: ../rules/base.xml.in.h:819
+#: ../rules/base.xml.in.h:829
msgid "Esperanto (displaced semicolon and quote, obsolete)"
msgstr "Esperanto (forkert placeret semikolon og anførelsestegn, forældet)"
#. Keyboard indicator for Nepali layouts
-#: ../rules/base.xml.in.h:821
+#: ../rules/base.xml.in.h:831
msgid "ne"
msgstr "ne"
-#: ../rules/base.xml.in.h:822
+#: ../rules/base.xml.in.h:832
msgid "Nepali"
msgstr "Nepalesisk"
-#: ../rules/base.xml.in.h:823
+#: ../rules/base.xml.in.h:833
msgid "English (Nigeria)"
msgstr "Engelsk (Nigeria)"
#. Keyboard indicator for Igbo layouts
-#: ../rules/base.xml.in.h:825
+#: ../rules/base.xml.in.h:835
msgid "ig"
msgstr "ig"
-#: ../rules/base.xml.in.h:826
+#: ../rules/base.xml.in.h:836
msgid "Igbo"
msgstr "Igbo"
#. Keyboard indicator for Yoruba layouts
-#: ../rules/base.xml.in.h:828
+#: ../rules/base.xml.in.h:838
msgid "yo"
msgstr "yo"
-#: ../rules/base.xml.in.h:829
+#: ../rules/base.xml.in.h:839
msgid "Yoruba"
msgstr "Yoruba"
#. Keyboard indicator for Amharic layouts
-#: ../rules/base.xml.in.h:831
+#: ../rules/base.xml.in.h:841
msgid "am"
msgstr "am"
# http://da.wikipedia.org/wiki/Amharisk
-#: ../rules/base.xml.in.h:832
+#: ../rules/base.xml.in.h:842
msgid "Amharic"
msgstr "Amharisk"
#. Keyboard indicator for Wolof layouts
-#: ../rules/base.xml.in.h:834
+#: ../rules/base.xml.in.h:844
msgid "wo"
msgstr "wo"
-#: ../rules/base.xml.in.h:835
+#: ../rules/base.xml.in.h:845
msgid "Wolof"
msgstr "Wolof"
#. Keyboard indicator for Braille layouts
-#: ../rules/base.xml.in.h:837
+#: ../rules/base.xml.in.h:847
msgid "brl"
msgstr "brl"
-#: ../rules/base.xml.in.h:838
+#: ../rules/base.xml.in.h:848
msgid "Braille"
msgstr "Blindeskrift"
-#: ../rules/base.xml.in.h:839
+#: ../rules/base.xml.in.h:849
msgid "Braille (left hand)"
msgstr "Blindeskrift (venstre hånd)"
-#: ../rules/base.xml.in.h:840
+#: ../rules/base.xml.in.h:850
msgid "Braille (right hand)"
msgstr "Blindeskrift (højre hånd)"
#. Keyboard indicator for Turkmen layouts
-#: ../rules/base.xml.in.h:842
+#: ../rules/base.xml.in.h:852
msgid "tk"
msgstr "tk"
-#: ../rules/base.xml.in.h:843
+#: ../rules/base.xml.in.h:853
msgid "Turkmen"
msgstr "Turkmensk"
-#: ../rules/base.xml.in.h:844
+#: ../rules/base.xml.in.h:854
msgid "Turkmen (Alt-Q)"
msgstr "Turkmensk (Alt-Q)"
#. Keyboard indicator for Bambara layouts
-#: ../rules/base.xml.in.h:846
+#: ../rules/base.xml.in.h:856
msgid "bm"
msgstr "bm"
-#: ../rules/base.xml.in.h:847
+#: ../rules/base.xml.in.h:857
msgid "Bambara"
msgstr "Bambara"
-#: ../rules/base.xml.in.h:848
+#: ../rules/base.xml.in.h:858
msgid "French (Mali, alternative)"
msgstr "Fransk (Mali, alternativ)"
-#: ../rules/base.xml.in.h:849
+#: ../rules/base.xml.in.h:859
msgid "English (Mali, US Macintosh)"
msgstr "Engelsk (Mali, US Macintosh)"
-#: ../rules/base.xml.in.h:850
+#: ../rules/base.xml.in.h:860
msgid "English (Mali, US international)"
msgstr "Engelsk (Mali, US international)"
#. Keyboard indicator for Swahili layouts
-#: ../rules/base.xml.in.h:852
+#: ../rules/base.xml.in.h:862
msgid "sw"
msgstr "sw"
-#: ../rules/base.xml.in.h:853
+#: ../rules/base.xml.in.h:863
msgid "Swahili (Tanzania)"
msgstr "Swahili (Tanzania)"
-#: ../rules/base.xml.in.h:854
+#: ../rules/base.xml.in.h:864
msgid "Swahili (Kenya)"
msgstr "Swahili (Kenya)"
-#: ../rules/base.xml.in.h:855
+#: ../rules/base.xml.in.h:865
msgid "Kikuyu"
msgstr "Kikuyu"
#. Keyboard indicator for Tswana layouts
-#: ../rules/base.xml.in.h:857
+#: ../rules/base.xml.in.h:867
msgid "tn"
msgstr "tn"
-#: ../rules/base.xml.in.h:858
+#: ../rules/base.xml.in.h:868
msgid "Tswana"
msgstr "Tswana"
#. Keyboard indicator for Filipino layouts
-#: ../rules/base.xml.in.h:860
+#: ../rules/base.xml.in.h:870
msgid "ph"
msgstr "ph"
-#: ../rules/base.xml.in.h:861
+#: ../rules/base.xml.in.h:871
msgid "Filipino"
msgstr "Filippinsk"
-#: ../rules/base.xml.in.h:862
+#: ../rules/base.xml.in.h:872
msgid "Filipino (QWERTY Baybayin)"
msgstr "Filippinsk (QWERTY baybayin)"
-#: ../rules/base.xml.in.h:863
+#: ../rules/base.xml.in.h:873
msgid "Filipino (Capewell-Dvorak Latin)"
msgstr "Filippinsk (Capewell-dvorak latin)"
-#: ../rules/base.xml.in.h:864
+#: ../rules/base.xml.in.h:874
msgid "Filipino (Capewell-Dvorak Baybayin)"
msgstr "Filippinsk (Capewell-dvorak baybayin)"
-#: ../rules/base.xml.in.h:865
+#: ../rules/base.xml.in.h:875
msgid "Filipino (Capewell-QWERF 2006 Latin)"
msgstr "Filippinsk (Capewell-QWERF 2006 latin)"
-#: ../rules/base.xml.in.h:866
+#: ../rules/base.xml.in.h:876
msgid "Filipino (Capewell-QWERF 2006 Baybayin)"
msgstr "Filippinsk (Capewell-QWERF 2006 baybayin)"
-#: ../rules/base.xml.in.h:867
+#: ../rules/base.xml.in.h:877
msgid "Filipino (Colemak Latin)"
msgstr "Filippinsk (Colemak latin)"
# http://en.wikipedia.org/wiki/Baybayin
-#: ../rules/base.xml.in.h:868
+#: ../rules/base.xml.in.h:878
msgid "Filipino (Colemak Baybayin)"
msgstr "Filippinsk (Colemak baybayin)"
-#: ../rules/base.xml.in.h:869
+#: ../rules/base.xml.in.h:879
msgid "Filipino (Dvorak Latin)"
msgstr "Filippinsk (Dvorak latin)"
# http://en.wikipedia.org/wiki/Baybayin
-#: ../rules/base.xml.in.h:870
+#: ../rules/base.xml.in.h:880
msgid "Filipino (Dvorak Baybayin)"
msgstr "Filippinsk (Dvorak baybayin)"
-#: ../rules/base.xml.in.h:871
+#: ../rules/base.xml.in.h:881
msgid "md"
msgstr "md"
-#: ../rules/base.xml.in.h:872
+#: ../rules/base.xml.in.h:882
msgid "Moldavian"
msgstr "Moldavisk"
-#: ../rules/base.xml.in.h:873
+#: ../rules/base.xml.in.h:883
msgid "gag"
msgstr "gag"
# http://www.denstoredanske.dk/Sprog,_religion_og_filosofi/Sprog/Alle_lande_-_sprogoversigt/Altaiske_sprog/gagausisk
-#: ../rules/base.xml.in.h:874
+#: ../rules/base.xml.in.h:884
msgid "Moldavian (Gagauz)"
msgstr "Moldavisk (gagausisk)"
-#: ../rules/base.xml.in.h:875
-msgid "Key(s) to change layout"
-msgstr "Tast(er) for at skifte layout"
+#: ../rules/base.xml.in.h:885
+msgid "Switching to another layout"
+msgstr "Skifter til et andet layout"
-#: ../rules/base.xml.in.h:876
+#: ../rules/base.xml.in.h:886
msgid "Right Alt (while pressed)"
msgstr "Højre Alt (mens trykket ned)"
-#: ../rules/base.xml.in.h:877
+#: ../rules/base.xml.in.h:887
msgid "Left Alt (while pressed)"
msgstr "Venstre Alt (mens trykket ned)"
-#: ../rules/base.xml.in.h:878
+#: ../rules/base.xml.in.h:888
msgid "Left Win (while pressed)"
msgstr "Venstre Win-tast (mens trykket ned)"
-#: ../rules/base.xml.in.h:879
+#: ../rules/base.xml.in.h:889
msgid "Right Win (while pressed)"
msgstr "Højre Win-tast (mens trykket ned)"
-#: ../rules/base.xml.in.h:880
+#: ../rules/base.xml.in.h:890
msgid "Any Win key (while pressed)"
msgstr "Enhver Win-tast (mens trykket ned)"
-#: ../rules/base.xml.in.h:881
+#: ../rules/base.xml.in.h:891
msgid "Caps Lock (while pressed), Alt+Caps Lock does the original capslock action"
msgstr "Caps Lock (mens presset ned), Alt+Caps Lock udfører den oprindleige capslockhandling"
-#: ../rules/base.xml.in.h:882
+#: ../rules/base.xml.in.h:892
msgid "Right Ctrl (while pressed)"
msgstr "Højre Ctrl-tast (mens trykket ned)"
-#: ../rules/base.xml.in.h:883
+#: ../rules/base.xml.in.h:893
msgid "Right Alt"
msgstr "Højre Alt"
-#: ../rules/base.xml.in.h:884
+#: ../rules/base.xml.in.h:894
msgid "Left Alt"
msgstr "Venstre Alt"
-#: ../rules/base.xml.in.h:885
+#: ../rules/base.xml.in.h:895
msgid "Caps Lock"
msgstr "Caps Lock"
-#: ../rules/base.xml.in.h:886
+#: ../rules/base.xml.in.h:896
msgid "Shift+Caps Lock"
msgstr "Skift+Caps Lock"
-#: ../rules/base.xml.in.h:887
+#: ../rules/base.xml.in.h:897
msgid "Caps Lock (to first layout), Shift+Caps Lock (to last layout)"
msgstr "Caps Lock (skifter til første layout), Skift+Caps Lock (skifter til sidste layout)"
-#: ../rules/base.xml.in.h:888
+#: ../rules/base.xml.in.h:898
msgid "Left Win (to first layout), Right Win/Menu (to last layout)"
msgstr "Venstre Win (skifter til første layout), Højre Win/Menu (skifter til sidste layout)"
-#: ../rules/base.xml.in.h:889
+#: ../rules/base.xml.in.h:899
msgid "Left Ctrl (to first layout), Right Ctrl (to last layout)"
msgstr "Venstre Ctrl (skifter til første layout), Højre Ctrl (skifter til sidste layout)"
-#: ../rules/base.xml.in.h:890
+#: ../rules/base.xml.in.h:900
msgid "Alt+Caps Lock"
msgstr "Alt+Caps Lock"
-#: ../rules/base.xml.in.h:891
+#: ../rules/base.xml.in.h:901
msgid "Both Shift keys together"
msgstr "Begge skift-taster sammen"
-#: ../rules/base.xml.in.h:892
+#: ../rules/base.xml.in.h:902
msgid "Both Alt keys together"
msgstr "Begge Alt-taster sammen"
-#: ../rules/base.xml.in.h:893
+#: ../rules/base.xml.in.h:903
msgid "Both Ctrl keys together"
msgstr "Begge Ctrl-taster sammen"
-#: ../rules/base.xml.in.h:894
+#: ../rules/base.xml.in.h:904
msgid "Ctrl+Shift"
msgstr "Ctrl+Skift"
-#: ../rules/base.xml.in.h:895
+#: ../rules/base.xml.in.h:905
msgid "Left Ctrl+Left Shift"
msgstr "Venstre Ctrl+Venstre Skift"
-#: ../rules/base.xml.in.h:896
+#: ../rules/base.xml.in.h:906
msgid "Right Ctrl+Right Shift"
msgstr "Højre Ctrl+Højre Skift"
-#: ../rules/base.xml.in.h:897
+#: ../rules/base.xml.in.h:907
msgid "Alt+Ctrl"
msgstr "Alt+Ctrl"
-#: ../rules/base.xml.in.h:898
+#: ../rules/base.xml.in.h:908
msgid "Alt+Shift"
msgstr "Alt+Skift"
-#: ../rules/base.xml.in.h:899
+#: ../rules/base.xml.in.h:909
msgid "Left Alt+Left Shift"
msgstr "Venstre Alt+Venstre Skift"
-#: ../rules/base.xml.in.h:900
+#: ../rules/base.xml.in.h:910
msgid "Alt+Space"
msgstr "Alt+Mellemrum"
-#: ../rules/base.xml.in.h:901
+#: ../rules/base.xml.in.h:911
msgid "Menu"
msgstr "Menu"
-#: ../rules/base.xml.in.h:902
+#: ../rules/base.xml.in.h:912
msgid "Left Win"
msgstr "Venstre Win"
-#: ../rules/base.xml.in.h:903
+#: ../rules/base.xml.in.h:913
msgid "Right Win"
msgstr "Højre Win"
-#: ../rules/base.xml.in.h:904
+#: ../rules/base.xml.in.h:914
msgid "Left Shift"
msgstr "Venstre Skift"
-#: ../rules/base.xml.in.h:905
+#: ../rules/base.xml.in.h:915
msgid "Right Shift"
msgstr "Højre Skift"
-#: ../rules/base.xml.in.h:906
+#: ../rules/base.xml.in.h:916
msgid "Left Ctrl"
msgstr "Venstre Ctrl"
-#: ../rules/base.xml.in.h:907
+#: ../rules/base.xml.in.h:917
msgid "Right Ctrl"
msgstr "Højre Ctrl"
-#: ../rules/base.xml.in.h:908
+#: ../rules/base.xml.in.h:918
msgid "Scroll Lock"
msgstr "Scroll Lock"
-#: ../rules/base.xml.in.h:909
+#: ../rules/base.xml.in.h:919
msgid "LeftCtrl+LeftWin (to first layout), RightCtrl+Menu (to second layout)"
msgstr "Venstre Ctrl+Venstre Win (til første layout), Højre Ctrl+Menu (til andet layout)"
-#: ../rules/base.xml.in.h:910
+#: ../rules/base.xml.in.h:920
msgid "Key to choose 3rd level"
msgstr "Tast for at vælge tredje niveau"
-#: ../rules/base.xml.in.h:911
+#: ../rules/base.xml.in.h:921
msgid "Any Win key"
msgstr "Enhver Win-tast"
-#: ../rules/base.xml.in.h:912
+#: ../rules/base.xml.in.h:922
msgid "Any Alt key"
msgstr "Enhver Alt-tast"
-#: ../rules/base.xml.in.h:913
-msgid "Right Alt, Shift+Right Alt key is Multi_Key"
-msgstr "Højre Alt-tast, Skift+højre Alt-tast er fler_tast"
+#: ../rules/base.xml.in.h:923
+msgid "Right Alt, Shift+Right Alt key is Compose"
+msgstr "Højre Alt-tast, Skift+højre Alt-tast er sammensat (compose)"
-#: ../rules/base.xml.in.h:914
+#: ../rules/base.xml.in.h:924
msgid "Right Alt key never chooses 3rd level"
msgstr "Højre Alt-tast vælger aldrig tredje niveau"
-#: ../rules/base.xml.in.h:915
+#: ../rules/base.xml.in.h:925
msgid "Enter on keypad"
msgstr "Retur på numerisk tastatur"
-#: ../rules/base.xml.in.h:916
+#: ../rules/base.xml.in.h:926
msgid "Backslash"
msgstr "Omvendt skråstreg"
-#: ../rules/base.xml.in.h:917
+#: ../rules/base.xml.in.h:927
msgid "&lt;Less/Greater&gt;"
msgstr "&lt;Mindre end/Større end&gt;"
-#: ../rules/base.xml.in.h:918
+#: ../rules/base.xml.in.h:928
msgid "Caps Lock chooses 3rd level, acts as onetime lock when pressed together with another 3rd-level-chooser"
msgstr "Caps Lock vælger tredje niveau, låser når trykket ned sammen med en anden tredje niveauvælger"
-#: ../rules/base.xml.in.h:919
+#: ../rules/base.xml.in.h:929
msgid "Backslash chooses 3rd level, acts as onetime lock when pressed together with another 3rd-level-chooser"
msgstr "Omvendt skråstreg vælger tredje niveau, låser når trykket ned sammen med en anden tredje niveauvælger"
-#: ../rules/base.xml.in.h:920
+#: ../rules/base.xml.in.h:930
msgid "&lt;Less/Greater&gt; chooses 3rd level, acts as onetime lock when pressed together with another 3rd-level-chooser"
msgstr "&lt;Mindre end/Større end&gt; (vælger tredje niveau, låser når trykket ned sammen med en anden tredje niveauvælger"
-#: ../rules/base.xml.in.h:921
+#: ../rules/base.xml.in.h:931
msgid "Ctrl key position"
msgstr "Ctrl-tast placering"
-#: ../rules/base.xml.in.h:922
+#: ../rules/base.xml.in.h:932
msgid "Caps Lock as Ctrl"
msgstr "Caps Lock som Ctrl"
-#: ../rules/base.xml.in.h:923
+#: ../rules/base.xml.in.h:933
msgid "Left Ctrl as Meta"
msgstr "Venstre Ctrl som Meta"
-#: ../rules/base.xml.in.h:924
+#: ../rules/base.xml.in.h:934
msgid "Swap Ctrl and Caps Lock"
msgstr "Ombyt Ctrl og Caps Lock"
-#: ../rules/base.xml.in.h:925
+#: ../rules/base.xml.in.h:935
msgid "At left of 'A'"
msgstr "Til venstre for 'A'"
-#: ../rules/base.xml.in.h:926
+#: ../rules/base.xml.in.h:936
msgid "At bottom left"
msgstr "Nederst til venstre"
-#: ../rules/base.xml.in.h:927
+#: ../rules/base.xml.in.h:937
msgid "Right Ctrl as Right Alt"
msgstr "Højre Ctrl-tast virker som højre Alt"
-#: ../rules/base.xml.in.h:928
+#: ../rules/base.xml.in.h:938
msgid "Menu as Right Ctrl"
msgstr "Menu som højre Ctrl"
-#: ../rules/base.xml.in.h:929
+#: ../rules/base.xml.in.h:939
msgid "Right Alt as Right Ctrl"
msgstr "Højre Alt-tast virker som højre Ctrl"
-#: ../rules/base.xml.in.h:930
+#: ../rules/base.xml.in.h:940
+msgid "Swap Left Alt key with Left Ctrl key"
+msgstr "Byt venstre Alt-tast om med venstre Ctrl-tast"
+
+#: ../rules/base.xml.in.h:941
+msgid "Swap Left Win key with Left Ctrl key"
+msgstr "Byt venstre Win-tast om med venstre Ctrl-tast"
+
+#: ../rules/base.xml.in.h:942
+msgid "Left Alt as Ctrl, Left Ctrl as Win, Left Win as Alt"
+msgstr "Venstre Alt som Ctrl, venstre Ctrl som Win, venstre Win som Alt"
+
+#: ../rules/base.xml.in.h:943
msgid "Use keyboard LED to show alternative layout"
msgstr "Brug tastatur-LED til at vise alternativ layout"
-#: ../rules/base.xml.in.h:931
+#: ../rules/base.xml.in.h:944
msgid "Num Lock"
msgstr "Num Lock"
-#: ../rules/base.xml.in.h:932
-msgid "Numeric keypad layout selection"
-msgstr "Numerisk tastatur layout udvælgelse"
+#: ../rules/base.xml.in.h:945
+msgid "Layout of numeric keypad"
+msgstr "Layout for numerisk tastatur"
-#: ../rules/base.xml.in.h:933
+#: ../rules/base.xml.in.h:946
msgid "Legacy"
msgstr "Forældet"
-#: ../rules/base.xml.in.h:934
+#: ../rules/base.xml.in.h:947
msgid "Unicode additions (arrows and math operators)"
msgstr "Unicode tilføjelser (pile og matematiske tegn)"
-#: ../rules/base.xml.in.h:935
-msgid "Unicode additions (arrows and math operators). Math operators on default level"
-msgstr "Unicode tilføjelser (pile og matematiske tegn). Matematiske tegn på standardniveau"
+#: ../rules/base.xml.in.h:948
+msgid "Unicode additions (arrows and math operators; math operators on default level)"
+msgstr "Unicode-tilføjelser (pile og matematiske tegn; matematiske tegn på standardniveau)"
-#: ../rules/base.xml.in.h:936
+#: ../rules/base.xml.in.h:949
msgid "Legacy Wang 724"
msgstr "Forældet Wang 724"
-#: ../rules/base.xml.in.h:937
+#: ../rules/base.xml.in.h:950
msgid "Wang 724 keypad with Unicode additions (arrows and math operators)"
msgstr "Wang 724 numerisk tastatur med Unicode-tilføjelser (pile og matematiske tegn)"
-#: ../rules/base.xml.in.h:938
-msgid "Wang 724 keypad with Unicode additions (arrows and math operators). Math operators on default level"
-msgstr "Wang 724 numerisk tastatur med Unicode-tilføjelser (pile og matematiske tegn). Matematiske tegn på standardniveau"
+#: ../rules/base.xml.in.h:951
+msgid "Wang 724 keypad with Unicode additions (arrows and math operators; math operators on default level)"
+msgstr "Wang 724 numerisk tastatur med Unicode-tilføjelser (pile og matematiske tegn; matematiske tegn på standardniveau)"
-#: ../rules/base.xml.in.h:939
+#: ../rules/base.xml.in.h:952
msgid "Hexadecimal"
msgstr "Sekstentals"
# ATM = hæveautomat, måske skal det oversættes.
-#: ../rules/base.xml.in.h:940
+#: ../rules/base.xml.in.h:953
msgid "ATM/phone-style"
msgstr "ATM/telefonstil"
-#: ../rules/base.xml.in.h:941
+#: ../rules/base.xml.in.h:954
msgid "Numeric keypad delete key behaviour"
msgstr "Numerisk tastatur slettetast opførsel"
-#: ../rules/base.xml.in.h:942
+#: ../rules/base.xml.in.h:955
msgid "Legacy key with dot"
msgstr "Forældet tast med punktum"
#. Actually, with KP_SEPARATOR, as the old keypad(comma)
-#: ../rules/base.xml.in.h:944
+#: ../rules/base.xml.in.h:957
msgid "Legacy key with comma"
msgstr "Forældet tast med komma"
-#: ../rules/base.xml.in.h:945
+#: ../rules/base.xml.in.h:958
msgid "Four-level key with dot"
msgstr "Niveau fire tast med punktum"
-#: ../rules/base.xml.in.h:946
-msgid "Four-level key with dot, latin-9 restriction"
+#: ../rules/base.xml.in.h:959
+msgid "Four-level key with dot, Latin-9 only"
msgstr "Niveau fire tast med punktum, latin-9 begrænsning"
-#: ../rules/base.xml.in.h:947
+#: ../rules/base.xml.in.h:960
msgid "Four-level key with comma"
msgstr "Niveau fire tast med komma"
-#: ../rules/base.xml.in.h:948
+#: ../rules/base.xml.in.h:961
msgid "Four-level key with momayyez"
msgstr "Niveau fire tast med momayyez"
#. This assumes the KP_ abstract symbols are actually useful for some apps
#. The description needs to be rewritten
-#: ../rules/base.xml.in.h:951
+#: ../rules/base.xml.in.h:964
msgid "Four-level key with abstract separators"
msgstr "Niveau fire tast med abstrakt adskillelser"
-#: ../rules/base.xml.in.h:952
-msgid "Semi-colon on third level"
+#: ../rules/base.xml.in.h:965
+msgid "Semicolon on third level"
msgstr "Semikolon på tredje niveau"
-#: ../rules/base.xml.in.h:953
+#: ../rules/base.xml.in.h:966
msgid "Caps Lock key behavior"
msgstr "Opførsel for Caps Lock-tast"
-#: ../rules/base.xml.in.h:954
-msgid "Caps Lock uses internal capitalization. Shift \"pauses\" Caps Lock"
+#: ../rules/base.xml.in.h:967
+msgid "Caps Lock uses internal capitalization; Shift \"pauses\" Caps Lock"
msgstr "Caps Lock bruger intern forstørrelse af bogstaver. Skift sætter Caps Lock »på hold«"
-#: ../rules/base.xml.in.h:955
-msgid "Caps Lock uses internal capitalization. Shift doesn't affect Caps Lock"
+#: ../rules/base.xml.in.h:968
+msgid "Caps Lock uses internal capitalization; Shift doesn't affect Caps Lock"
msgstr "Caps Lock bruger intern forstørrelse af bogstaver. Skift påvirker ikke Caps Lock"
-#: ../rules/base.xml.in.h:956
-msgid "Caps Lock acts as Shift with locking. Shift \"pauses\" Caps Lock"
+#: ../rules/base.xml.in.h:969
+msgid "Caps Lock acts as Shift with locking; Shift \"pauses\" Caps Lock"
msgstr "Caps Lock agerer som skiftetasten med lås. Skift »pauser« Caps Lock"
-#: ../rules/base.xml.in.h:957
-msgid "Caps Lock acts as Shift with locking. Shift doesn't affect Caps Lock"
+#: ../rules/base.xml.in.h:970
+msgid "Caps Lock acts as Shift with locking; Shift doesn't affect Caps Lock"
msgstr "Caps Lock agerer som skiftetasten med lås. Skift påvirker ikke Caps Lock"
-#: ../rules/base.xml.in.h:958
+#: ../rules/base.xml.in.h:971
msgid "Caps Lock toggles normal capitalization of alphabetic characters"
msgstr "Caps Lock slår små/store bogstaver til/fra"
-#: ../rules/base.xml.in.h:959
+#: ../rules/base.xml.in.h:972
msgid "Make Caps Lock an additional Num Lock"
msgstr "Gør Caps Lock til en ekstra NumLock"
-#: ../rules/base.xml.in.h:960
+#: ../rules/base.xml.in.h:973
msgid "Swap ESC and Caps Lock"
msgstr "Ombyt ESC og Caps Lock"
-#: ../rules/base.xml.in.h:961
+#: ../rules/base.xml.in.h:974
msgid "Make Caps Lock an additional ESC"
msgstr "Gør Caps Lock til en ekstra Esc"
-#: ../rules/base.xml.in.h:962
+#: ../rules/base.xml.in.h:975
msgid "Make Caps Lock an additional Backspace"
msgstr "Gør Caps Lock til en ekstra rettelsestast"
-#: ../rules/base.xml.in.h:963
+#: ../rules/base.xml.in.h:976
msgid "Make Caps Lock an additional Super"
msgstr "Gør Caps Lock til en ekstra Super"
-#: ../rules/base.xml.in.h:964
+#: ../rules/base.xml.in.h:977
msgid "Make Caps Lock an additional Hyper"
msgstr "Gør Caps Lock til en ekstra Hyper"
-#: ../rules/base.xml.in.h:965
-msgid "Caps Lock toggles Shift so all keys are affected"
-msgstr "Caps Lock ændrer Skift så alle taster bliver påvirket"
+#: ../rules/base.xml.in.h:978
+msgid "Caps Lock toggles ShiftLock (affects all keys)"
+msgstr "Caps Lock ændrer SkiftLock (påvirker alle taster)"
-#: ../rules/base.xml.in.h:966
+#: ../rules/base.xml.in.h:979
msgid "Caps Lock is disabled"
msgstr "Caps Lock er slået fra"
-#: ../rules/base.xml.in.h:967
-msgid "Make Caps Lock an additional Control but keep the Caps_Lock keysym"
-msgstr "Gør Caps Lock til en ekstra Control men behold Caps_Lock keysym"
+#: ../rules/base.xml.in.h:980
+msgid "Make Caps Lock an additional Ctrl"
+msgstr "Gør Caps Lock til en ekstra Ctrl"
-#: ../rules/base.xml.in.h:968
+#: ../rules/base.xml.in.h:981
msgid "Alt/Win key behavior"
msgstr "Alt/Win-tasteopførsel"
-#: ../rules/base.xml.in.h:969
+#: ../rules/base.xml.in.h:982
msgid "Add the standard behavior to Menu key"
msgstr "Tilføj standardopførslen til menutasten"
-#: ../rules/base.xml.in.h:970
+#: ../rules/base.xml.in.h:983
msgid "Alt and Meta are on Alt keys"
msgstr "Alt og Meta er på Alt-tasterne"
-#: ../rules/base.xml.in.h:971
+#: ../rules/base.xml.in.h:984
msgid "Alt is mapped to Win keys (and the usual Alt keys)"
msgstr "Alt ligger på Win-tasterne (og de normale Alt-taster)"
-#: ../rules/base.xml.in.h:972
-msgid "Control is mapped to Win keys (and the usual Ctrl keys)"
-msgstr "Kontrol ligger på Win-tasterne (og de normale Ctrl-taster)"
+#: ../rules/base.xml.in.h:985
+msgid "Ctrl is mapped to Win keys (and the usual Ctrl keys)"
+msgstr "Ctrl ligger på Win-tasterne (og de normale Ctrl-taster)"
-#: ../rules/base.xml.in.h:973
-msgid "Control is mapped to Alt keys, Alt is mapped to Win keys"
-msgstr "Kontrol ligger på Alt-tasterne, Alt ligger på Win-tasterne"
+#: ../rules/base.xml.in.h:986
+msgid "Ctrl is mapped to Alt keys, Alt is mapped to Win keys"
+msgstr "Ctrl ligger på Alt-tasterne, Alt ligger på Win-tasterne"
-#: ../rules/base.xml.in.h:974
+#: ../rules/base.xml.in.h:987
msgid "Meta is mapped to Win keys"
msgstr "Meta ligger på Win-tasterne"
-#: ../rules/base.xml.in.h:975
+#: ../rules/base.xml.in.h:988
msgid "Meta is mapped to Left Win"
msgstr "Meta ligger på venstre Win-tast"
-#: ../rules/base.xml.in.h:976
+#: ../rules/base.xml.in.h:989
msgid "Hyper is mapped to Win-keys"
msgstr "Hyper ligger på Win-tasterne"
-#: ../rules/base.xml.in.h:977
+#: ../rules/base.xml.in.h:990
msgid "Alt is mapped to Right Win, Super to Menu"
msgstr "Alt ligger på den højre Win-tast og Super på Menu"
-#: ../rules/base.xml.in.h:978
+#: ../rules/base.xml.in.h:991
msgid "Alt is swapped with Win"
msgstr "Alt-tast ombyttes med Win-tast"
-#: ../rules/base.xml.in.h:979
-msgid "Compose key position"
-msgstr "Placering af Composetast"
+#: ../rules/base.xml.in.h:992
+msgid "Position of Compose key"
+msgstr "Position for sammensat (compose) tast"
-#: ../rules/base.xml.in.h:980
+#: ../rules/base.xml.in.h:993
msgid "3rd level of Left Win"
msgstr "Tredje niveau for venstre Win"
-#: ../rules/base.xml.in.h:981
+#: ../rules/base.xml.in.h:994
msgid "3rd level of Right Win"
msgstr "Tredje niveau for højre Win"
-#: ../rules/base.xml.in.h:982
+#: ../rules/base.xml.in.h:995
msgid "3rd level of Menu"
msgstr "Tredje niveau for Menu"
-#: ../rules/base.xml.in.h:983
+#: ../rules/base.xml.in.h:996
msgid "3rd level of Left Ctrl"
msgstr "Tredje niveau for venstre Ctrl"
-#: ../rules/base.xml.in.h:984
+#: ../rules/base.xml.in.h:997
msgid "3rd level of Right Ctrl"
msgstr "Tredje niveau for højre Ctrl"
-#: ../rules/base.xml.in.h:985
+#: ../rules/base.xml.in.h:998
msgid "3rd level of Caps Lock"
msgstr "Tredje niveau for Caps Lock (lås skift)"
-#: ../rules/base.xml.in.h:986
+#: ../rules/base.xml.in.h:999
msgid "3rd level of &lt;Less/Greater&gt;"
msgstr "Tredje niveau for &lt;Mindre end/Større end&gt;"
-#: ../rules/base.xml.in.h:987
+#: ../rules/base.xml.in.h:1000
msgid "Pause"
msgstr "Pause"
-#: ../rules/base.xml.in.h:988
+#: ../rules/base.xml.in.h:1001
msgid "PrtSc"
msgstr "Prtsc"
-#: ../rules/base.xml.in.h:989
+#: ../rules/base.xml.in.h:1002
msgid "Miscellaneous compatibility options"
msgstr "Diverse kompatibilitetsvalg"
-#: ../rules/base.xml.in.h:990
+#: ../rules/base.xml.in.h:1003
msgid "Default numeric keypad keys"
msgstr "Standard numerisk tastatur taster"
-#: ../rules/base.xml.in.h:991
+#: ../rules/base.xml.in.h:1004
msgid "Numeric keypad keys always enter digits (as in Mac OS)"
msgstr "Numerisk tastatur indtaster altid tal (som på Mac OS)"
-#: ../rules/base.xml.in.h:992
+#: ../rules/base.xml.in.h:1005
msgid "Shift with numeric keypad keys works as in MS Windows"
msgstr "Skift med numeriske taster virker som i MS Windows"
-#: ../rules/base.xml.in.h:993
+#: ../rules/base.xml.in.h:1006
msgid "Shift does not cancel Num Lock, chooses 3rd level instead"
msgstr "Skift afbryder ikke Num Lock, vælger tredje niveau i steden for"
-#: ../rules/base.xml.in.h:994
+#: ../rules/base.xml.in.h:1007
msgid "Special keys (Ctrl+Alt+&lt;key&gt;) handled in a server"
msgstr "Specialtaster (Ctrl+Alt+&lt;key&gt;) håndteret i en server"
-#: ../rules/base.xml.in.h:995
+#: ../rules/base.xml.in.h:1008
msgid "Apple Aluminium Keyboard: emulate PC keys (Print, Scroll Lock, Pause, Num Lock)"
msgstr "Apples aluminiumstastatur: Emuler PC-taster (Udskriv, Scroll Lock, Pause, NumLock)"
-#: ../rules/base.xml.in.h:996
+#: ../rules/base.xml.in.h:1009
msgid "Shift cancels Caps Lock"
msgstr "Skift afbryder Caps Lock"
-#: ../rules/base.xml.in.h:997
+#: ../rules/base.xml.in.h:1010
msgid "Enable extra typographic characters"
msgstr "Slå ekstra typografiske karakterer til"
-#: ../rules/base.xml.in.h:998
-msgid "Both Shift-Keys together toggle Caps Lock"
+#: ../rules/base.xml.in.h:1011
+msgid "Both Shift keys together toggle Caps Lock"
msgstr "Begge skift-taster sammen skifter Caps Lock"
-#: ../rules/base.xml.in.h:999
-msgid "Both Shift-Keys together activate Caps Lock, one Shift-Key deactivates"
+#: ../rules/base.xml.in.h:1012
+msgid "Both Shift keys together activate Caps Lock, one Shift key deactivates"
msgstr "Begge skift-taster sammen aktiverer Caps Lock, en Skift-tast deaktiverer"
-#: ../rules/base.xml.in.h:1000
-msgid "Both Shift-Keys together toggle ShiftLock"
+#: ../rules/base.xml.in.h:1013
+msgid "Both Shift keys together toggle ShiftLock"
msgstr "Begge skift-taster sammen skifter SkiftLock"
-#: ../rules/base.xml.in.h:1001
-msgid "Toggle PointerKeys with Shift + NumLock."
-msgstr "Skift pegetaster med Skift + NumLock."
+#: ../rules/base.xml.in.h:1014
+msgid "Shift + NumLock toggles PointerKeys"
+msgstr "Skift + NumLock skifter PointerKeys"
-#: ../rules/base.xml.in.h:1002
+#: ../rules/base.xml.in.h:1015
msgid "Allow breaking grabs with keyboard actions (warning: security risk)"
msgstr "Tillader afbrydelsesgreb med tastaturhandlinger (advarsel: sikkerhedsrisiko)"
-#: ../rules/base.xml.in.h:1003
+#: ../rules/base.xml.in.h:1016
+msgid "Allow grab and window tree logging"
+msgstr "Tillader afbrydelsesgreb med vinduestrælogning"
+
+#: ../rules/base.xml.in.h:1017
msgid "Adding currency signs to certain keys"
msgstr "Tilføjelse af valutategn til bestemte taster"
-#: ../rules/base.xml.in.h:1004
+#: ../rules/base.xml.in.h:1018
msgid "Euro on E"
msgstr "Euro på E"
@@ -3785,75 +3835,75 @@ msgstr "Euro på E"
# på to" mere beskrivende, selv om strengen isoleret set stadig kan være
# forvirrende. Når teksten står i en sammenhæng, er det nok ikke så
# vigtigt om det er det ene eller det andet.
-#: ../rules/base.xml.in.h:1005
+#: ../rules/base.xml.in.h:1019
msgid "Euro on 2"
msgstr "Euro på 2"
-#: ../rules/base.xml.in.h:1006
+#: ../rules/base.xml.in.h:1020
msgid "Euro on 4"
msgstr "Euro på 4"
-#: ../rules/base.xml.in.h:1007
+#: ../rules/base.xml.in.h:1021
msgid "Euro on 5"
msgstr "Euro på 5"
-#: ../rules/base.xml.in.h:1008
+#: ../rules/base.xml.in.h:1022
msgid "Rupee on 4"
msgstr "Rupee på 4"
-#: ../rules/base.xml.in.h:1009
+#: ../rules/base.xml.in.h:1023
msgid "Key to choose 5th level"
msgstr "Tast for at vælge femte niveau"
-#: ../rules/base.xml.in.h:1010
+#: ../rules/base.xml.in.h:1024
msgid "&lt;Less/Greater&gt; chooses 5th level, locks when pressed together with another 5th-level-chooser"
msgstr "&lt;Mindre end/Større end&gt; vælger femte niveau, låser når trykket ned sammen med en anden femte niveauvælger"
-#: ../rules/base.xml.in.h:1011
+#: ../rules/base.xml.in.h:1025
msgid "Right Alt chooses 5th level, locks when pressed together with another 5th-level-chooser"
msgstr "Højre Alt vælge femte niveau, låser når trykket ned sammen med en anden femte niveauvælger"
-#: ../rules/base.xml.in.h:1012
+#: ../rules/base.xml.in.h:1026
msgid "Left Win chooses 5th level, locks when pressed together with another 5th-level-chooser"
msgstr "Venstre Win-tast vælger femte niveau, låser når trykket ned sammen med en anden femte niveauvælger"
-#: ../rules/base.xml.in.h:1013
+#: ../rules/base.xml.in.h:1027
msgid "Right Win chooses 5th level, locks when pressed together with another 5th-level-chooser"
msgstr "Højre Win-tast vælger femte niveau, låser når trykket ned sammen med en anden femte niveauvælger"
-#: ../rules/base.xml.in.h:1014
+#: ../rules/base.xml.in.h:1028
msgid "Using space key to input non-breakable space character"
msgstr "Brug mellemrum for at indtaste ubrydelig mellemrumskarakter"
-#: ../rules/base.xml.in.h:1015
+#: ../rules/base.xml.in.h:1029
msgid "Usual space at any level"
msgstr "Normal mellemrum på alle niveauer"
-#: ../rules/base.xml.in.h:1016
+#: ../rules/base.xml.in.h:1030
msgid "Non-breakable space character at second level"
msgstr "Ubrydelig mellemrumskarakter på andet niveau"
-#: ../rules/base.xml.in.h:1017
+#: ../rules/base.xml.in.h:1031
msgid "Non-breakable space character at third level"
msgstr "Ubrydelig mellemrumskarakter på tredje niveau"
-#: ../rules/base.xml.in.h:1018
+#: ../rules/base.xml.in.h:1032
msgid "Non-breakable space character at third level, nothing at fourth level"
msgstr "Ubrydelig mellemrumskarakter på tredje niveau, intet på fjerde niveau"
-#: ../rules/base.xml.in.h:1019
+#: ../rules/base.xml.in.h:1033
msgid "Non-breakable space character at third level, thin non-breakable space character at fourth level"
msgstr "Ubrydelig mellemrumskarakter på tredje niveau, tynd ubrydelig mellemrumskarakter på fjerde niveau"
-#: ../rules/base.xml.in.h:1020
+#: ../rules/base.xml.in.h:1034
msgid "Non-breakable space character at fourth level"
msgstr "Ubrydelig mellemrumskarakter på fjerde niveau"
-#: ../rules/base.xml.in.h:1021
+#: ../rules/base.xml.in.h:1035
msgid "Non-breakable space character at fourth level, thin non-breakable space character at sixth level"
msgstr "Ubrydelig mellemrumskarakter på fjerde niveau, tynd ubrydelige mellemrumskarakter på sjette niveau"
-#: ../rules/base.xml.in.h:1022
+#: ../rules/base.xml.in.h:1036
msgid "Non-breakable space character at fourth level, thin non-breakable space character at sixth level (via Ctrl+Shift)"
msgstr "Ubrydelig mellemrumskarakter på fjerde niveau, tynd ubrydelige mellemrumskarakter på sjette niveau (via Ctrl+Skift)"
@@ -3865,82 +3915,86 @@ msgstr "Ubrydelig mellemrumskarakter på fjerde niveau, tynd ubrydelige mellemru
# is desirable to keep the words closer together. The ZWNJ is represented in Unicode
# is U+200C, and can be represented in HTML as &#x200C;, &#8204; or &zwnj;. Kilde eng.
# wikipedia 12. maj 2010
-#: ../rules/base.xml.in.h:1023
+#: ../rules/base.xml.in.h:1037
msgid "Zero-width non-joiner character at second level"
msgstr "Ubrydeligt mellemrumstegn (ZWNJ) på andet niveau"
-#: ../rules/base.xml.in.h:1024
+#: ../rules/base.xml.in.h:1038
msgid "Zero-width non-joiner character at second level, zero-width joiner character at third level"
msgstr "Ubrydeligt mellemrumstegn (ZWNJ) på andet niveau, ombrydeligt mellemrumstegn på tredje niveau"
-#: ../rules/base.xml.in.h:1025
+#: ../rules/base.xml.in.h:1039
msgid "Zero-width non-joiner character at second level, zero-width joiner character at third level, non-breakable space character at fourth level"
msgstr "Ubrydeligt mellemrumstegn (ZWNJ) på andet niveau, ombrydeligt mellemrumstegn på tredje niveau, ubrydeligt mellemrumsteng på fjerde niveau"
-#: ../rules/base.xml.in.h:1026
+#: ../rules/base.xml.in.h:1040
msgid "Zero-width non-joiner character at second level, non-breakable space character at third level"
msgstr "Ubrydeligt mellemrumstegn (ZWNJ) på andet niveau, ubrydeligt mellemrumstegn på tredje niveau"
-#: ../rules/base.xml.in.h:1027
+#: ../rules/base.xml.in.h:1041
msgid "Zero-width non-joiner character at second level, non-breakable space character at third level, nothing at fourth level"
msgstr "Ubrydeligt mellemrumstegn (ZWNJ) på andet niveau, ubrydeligt på mellemrum på tredje niveau"
-#: ../rules/base.xml.in.h:1028
+#: ../rules/base.xml.in.h:1042
msgid "Zero-width non-joiner character at second level, non-breakable space character at third level, zero-width joiner at fourth level"
msgstr "Ubrydeligt mellemrumstegn (ZWNJ) på andet niveau, ubrydeligt mellemrumstegn på tredje niveau, ubrydeligt mellemrumstegn (ZWNJ) på fjerde niveau"
-#: ../rules/base.xml.in.h:1029
+#: ../rules/base.xml.in.h:1043
msgid "Zero-width non-joiner character at second level, non-breakable space character at third level, thin non-breakable space at fourth level"
msgstr "Ubrydeligt mellemrumstegn (ZWNJ) på andet niveau, ubrydeligt mellemrumstegn på tredje niveau"
-#: ../rules/base.xml.in.h:1030
+#: ../rules/base.xml.in.h:1044
msgid "Zero-width non-joiner character at third level, zero-width joiner at fourth level"
msgstr "Ubrydeligt mellemrumstegn (ZWNJ) på tredje niveau, ombrydeligt mellemrumstegn på fjerde niveau"
-#: ../rules/base.xml.in.h:1031
+#: ../rules/base.xml.in.h:1045
msgid "Japanese keyboard options"
msgstr "Japanske tastaturvalg"
-#: ../rules/base.xml.in.h:1032
+#: ../rules/base.xml.in.h:1046
msgid "Kana Lock key is locking"
msgstr "Kana låsetast låser"
-#: ../rules/base.xml.in.h:1033
+#: ../rules/base.xml.in.h:1047
msgid "NICOLA-F style Backspace"
msgstr "NICOLA-F-stil rettelsestast"
-#: ../rules/base.xml.in.h:1034
+#: ../rules/base.xml.in.h:1048
msgid "Make Zenkaku Hankaku an additional ESC"
msgstr "Gør Zenkaku Hankaku til en ekstra Esc"
-#: ../rules/base.xml.in.h:1035
-msgid "Adding Esperanto circumflexes (supersigno)"
-msgstr "Tilføjelse af esperanto accent circonflexe (supersigno)"
+#: ../rules/base.xml.in.h:1049
+msgid "Adding Esperanto supersigned letters"
+msgstr "Tilføjelse af esperanto supersigned bogstaver"
-#: ../rules/base.xml.in.h:1036
-msgid "To the corresponding key in a Qwerty keyboard."
-msgstr "Til den tilsvarende tast på et Qwertytastatur."
+#: ../rules/base.xml.in.h:1050
+msgid "To the corresponding key in a Qwerty layout"
+msgstr "Til den tilsvarende tast på et Qwertytastatur"
-#: ../rules/base.xml.in.h:1037
-msgid "To the corresponding key in a Dvorak keyboard."
-msgstr "Til den tilsvarende tast i et Dvoraktastatur."
+#: ../rules/base.xml.in.h:1051
+msgid "To the corresponding key in a Dvorak layout"
+msgstr "Til den tilsvarende tast i et Dvoraktastatur"
-#: ../rules/base.xml.in.h:1038
+#: ../rules/base.xml.in.h:1052
+msgid "To the corresponding key in a Colemak layout"
+msgstr "Til den tilsvarende tast i et Colemaktastatur"
+
+#: ../rules/base.xml.in.h:1053
msgid "Maintain key compatibility with old Solaris keycodes"
msgstr "Vedligehold tastkompatibilitet med gamle tastkoder for Solaris"
-#: ../rules/base.xml.in.h:1039
+#: ../rules/base.xml.in.h:1054
msgid "Sun Key compatibility"
msgstr "Kompatibilitet med Suntast"
-#: ../rules/base.xml.in.h:1040
+#: ../rules/base.xml.in.h:1055
msgid "Key sequence to kill the X server"
msgstr "Tastsekvens for at slå X-serveren ned"
# Backspace kunne også være Slet tilbage
-#: ../rules/base.xml.in.h:1041
-msgid "Control + Alt + Backspace"
-msgstr "Control + Alt + Rettelsestast"
+#: ../rules/base.xml.in.h:1056
+msgid "Ctrl + Alt + Backspace"
+msgstr "Ctrl + Alt + Rettelsestast"
#: ../rules/base.extras.xml.in.h:1
msgid "apl"
@@ -4045,159 +4099,187 @@ msgstr "Atsina"
# http://en.wikipedia.org/wiki/Interior_Salish_languages
#: ../rules/base.extras.xml.in.h:38
-msgid "Couer D'alene Salish"
-msgstr "Couer D'alene Salish"
+msgid "Coeur d'Alene Salish"
+msgstr "Couer d'alene Salish"
#: ../rules/base.extras.xml.in.h:39
msgid "English (US, Sun Type 6/7)"
msgstr "Engelsk (US, Sun type 6/7)"
-#: ../rules/base.extras.xml.in.h:42
+#: ../rules/base.extras.xml.in.h:40
+msgid "English (Norman)"
+msgstr "Engelsk (norman)"
+
+#: ../rules/base.extras.xml.in.h:43
msgid "Polish (international with dead keys)"
msgstr "Polsk (international med døde taster)"
-#: ../rules/base.extras.xml.in.h:43
+#: ../rules/base.extras.xml.in.h:44
msgid "Polish (Colemak)"
msgstr "Polsk (Colemak)"
-#: ../rules/base.extras.xml.in.h:44
+#: ../rules/base.extras.xml.in.h:45
msgid "Polish (Sun Type 6/7)"
msgstr "Polsk (Sun type 6/7)"
-#: ../rules/base.extras.xml.in.h:48
+#: ../rules/base.extras.xml.in.h:49
msgid "Crimean Tatar (Dobruja Q)"
msgstr "Krimtatarsk (Dobruja Q)"
# touchtype = blindskrift (altså at skrive uden at kigge)
-#: ../rules/base.extras.xml.in.h:49
+#: ../rules/base.extras.xml.in.h:50
msgid "Romanian (ergonomic Touchtype)"
msgstr "Rumænsk (ergonomisk maskinskrivning)"
-#: ../rules/base.extras.xml.in.h:50
+#: ../rules/base.extras.xml.in.h:51
msgid "Romanian (Sun Type 6/7)"
msgstr "Rumænsk (Sun type 6/7)"
-#: ../rules/base.extras.xml.in.h:53
+#: ../rules/base.extras.xml.in.h:54
msgid "Serbian (combining accents instead of dead keys)"
msgstr "Serbisk (sammensætte accenter frem for døde taster)"
-#: ../rules/base.extras.xml.in.h:56
+#: ../rules/base.extras.xml.in.h:57
msgid "Russian (with Ukrainian-Belorussian layout)"
msgstr "Russisk (med ukrainsk-hviderussisk layout)"
-#: ../rules/base.extras.xml.in.h:57
+#: ../rules/base.extras.xml.in.h:58
msgid "Russian (Sun Type 6/7)"
msgstr "Russisk (Sun type 6/7)"
-#: ../rules/base.extras.xml.in.h:60
+#: ../rules/base.extras.xml.in.h:61
msgid "Armenian (OLPC phonetic)"
msgstr "Armensk (OLPC-fonetisk)"
# Er lidt usikker på betydningen af SIL, men antager at det drejer sig om:
# http://www.sil.org/sil/
-#: ../rules/base.extras.xml.in.h:63
+#: ../rules/base.extras.xml.in.h:64
msgid "Hebrew (Biblical, SIL phonetic)"
msgstr "Hebraisk (bibelsk, SIL-fonetik)"
-#: ../rules/base.extras.xml.in.h:66
+#: ../rules/base.extras.xml.in.h:67
msgid "Arabic (Sun Type 6/7)"
msgstr "Arabisk (Sun type 6/7)"
-#: ../rules/base.extras.xml.in.h:69
+#: ../rules/base.extras.xml.in.h:70
msgid "Belgian (Sun Type 6/7)"
msgstr "Belgisk (Sun type 6/7)"
-#: ../rules/base.extras.xml.in.h:72
+#: ../rules/base.extras.xml.in.h:73
msgid "Portuguese (Brazil, Sun Type 6/7)"
msgstr "Portugisisk (brasiliansk, Sun type 6/7)"
-#: ../rules/base.extras.xml.in.h:75
+#: ../rules/base.extras.xml.in.h:76
msgid "Czech (Sun Type 6/7)"
msgstr "Tjekkisk (Sun type 6/7)"
-#: ../rules/base.extras.xml.in.h:78
+#: ../rules/base.extras.xml.in.h:79
msgid "Danish (Sun Type 6/7)"
msgstr "Dansk (Sun type 6/7)"
-#: ../rules/base.extras.xml.in.h:81
+#: ../rules/base.extras.xml.in.h:82
msgid "Dutch (Sun Type 6/7)"
msgstr "Hollandsk (Sun type 6/7)"
-#: ../rules/base.extras.xml.in.h:84
+#: ../rules/base.extras.xml.in.h:85
msgid "Estonian (Sun Type 6/7)"
msgstr "Estisk (Sun type 6/7)"
-#: ../rules/base.extras.xml.in.h:87
+#: ../rules/base.extras.xml.in.h:88
msgid "Finnish (Sun Type 6/7)"
msgstr "Finsk (Sun type 6/7)"
-#: ../rules/base.extras.xml.in.h:89
+#: ../rules/base.extras.xml.in.h:90
msgid "French (Sun Type 6/7)"
msgstr "Fransk (Sun type 6/7)"
-#: ../rules/base.extras.xml.in.h:92
+#: ../rules/base.extras.xml.in.h:93
msgid "Greek (Sun Type 6/7)"
msgstr "Græsk (Sun type 6/7)"
-#: ../rules/base.extras.xml.in.h:95
+#: ../rules/base.extras.xml.in.h:96
msgid "Italian (Sun Type 6/7)"
msgstr "Italiensk (Sun type 6/7)"
-#: ../rules/base.extras.xml.in.h:98
+#: ../rules/base.extras.xml.in.h:99
msgid "Japanese (Sun Type 6)"
msgstr "Japansk (Sun type 6)"
-#: ../rules/base.extras.xml.in.h:99
+#: ../rules/base.extras.xml.in.h:100
msgid "Japanese (Sun Type 7 - pc compatible)"
msgstr "Japansk (Sun type 7 - pc-kompatibel)"
-#: ../rules/base.extras.xml.in.h:100
+#: ../rules/base.extras.xml.in.h:101
msgid "Japanese (Sun Type 7 - sun compatible)"
msgstr "Japansk (Sun type 7 - sun-kompatibel)"
-#: ../rules/base.extras.xml.in.h:103
+#: ../rules/base.extras.xml.in.h:104
msgid "Norwegian (Sun Type 6/7)"
msgstr "Norsk (Sun type 6/7)"
-#: ../rules/base.extras.xml.in.h:105
+#: ../rules/base.extras.xml.in.h:106
msgid "Portuguese (Sun Type 6/7)"
msgstr "Portugisisk (Sun type 6/7)"
-#: ../rules/base.extras.xml.in.h:108
+#: ../rules/base.extras.xml.in.h:109
msgid "Slovak (Sun Type 6/7)"
msgstr "Slovakisk (Sun type 6/7)"
-#: ../rules/base.extras.xml.in.h:111
+#: ../rules/base.extras.xml.in.h:112
msgid "Spanish (Sun Type 6/7)"
msgstr "Spansk (Sun type 6/7)"
-#: ../rules/base.extras.xml.in.h:114
+#: ../rules/base.extras.xml.in.h:115
msgid "Swedish (Sun Type 6/7)"
msgstr "Svensk (Sun type 6/7)"
-#: ../rules/base.extras.xml.in.h:116
+#: ../rules/base.extras.xml.in.h:117
msgid "German (Switzerland, Sun Type 6/7)"
msgstr "Tysk (Schweiz, Sun type 6/7)"
-#: ../rules/base.extras.xml.in.h:117
+#: ../rules/base.extras.xml.in.h:118
msgid "French (Switzerland, Sun Type 6/7)"
msgstr "Fransk (Schweiz, Sun type 6/7)"
-#: ../rules/base.extras.xml.in.h:120
+#: ../rules/base.extras.xml.in.h:121
msgid "Turkish (Sun Type 6/7)"
msgstr "Tyrkisk (Sun type 6/7)"
-#: ../rules/base.extras.xml.in.h:123
+#: ../rules/base.extras.xml.in.h:124
msgid "Ukrainian (Sun Type 6/7)"
msgstr "Ukrainsk (Sun type 6/7)"
-#: ../rules/base.extras.xml.in.h:125
+#: ../rules/base.extras.xml.in.h:126
msgid "English (UK, Sun Type 6/7)"
msgstr "Engelsk (UK, Sun type 6/7)"
-#: ../rules/base.extras.xml.in.h:128
+#: ../rules/base.extras.xml.in.h:129
msgid "Korean (Sun Type 6/7)"
msgstr "Koreansk (Sun type 6/7)"
+#~ msgid "Bengali"
+#~ msgstr "Bengali"
+
+#~ msgid "Portuguese (Brazil, nativo for Esperanto)"
+#~ msgstr "Portugisisk (brasiliansk, nativo for esperanto)"
+
+#~ msgid "English (layout toggle on multiply/divide key)"
+#~ msgstr "Engelsk (skift layout på gange-/divideretast)"
+
+#~ msgid "Key(s) to change layout"
+#~ msgstr "Tast(er) for at skifte layout"
+
+#~ msgid "Numeric keypad layout selection"
+#~ msgstr "Numerisk tastatur layout udvælgelse"
+
+#~ msgid "Make Caps Lock an additional Control but keep the Caps_Lock keysym"
+#~ msgstr "Gør Caps Lock til en ekstra Control men behold Caps_Lock keysym"
+
+#~ msgid "Compose key position"
+#~ msgstr "Placering af Composetast"
+
+#~ msgid "Toggle PointerKeys with Shift + NumLock."
+#~ msgstr "Skift pegetaster med Skift + NumLock."
+
#~ msgid ">German (Switzerland)"
#~ msgstr ">Tysk (Schweiz)"
diff --git a/xorg-server/xkeyboard-config/po/de.po b/xorg-server/xkeyboard-config/po/de.po
index 3781e6ec8..d50787623 100644
--- a/xorg-server/xkeyboard-config/po/de.po
+++ b/xorg-server/xkeyboard-config/po/de.po
@@ -1,14 +1,14 @@
# German translation of xkeyboard-config.
# This file is distributed under the same license as the xkeyboard-config package.
# Christian Kirbach <Christian.Kirbach@googlemail.com>, 2009.
-# Mario Blättermann <mario.blaettermann@gmail.com>, 2009, 2010, 2011, 2012, 2013.
+# Mario Blättermann <mario.blaettermann@gmail.com>, 2009, 2010, 2011, 2012, 2013, 2014.
#
msgid ""
msgstr ""
-"Project-Id-Version: xkeyboard-config-2.9.91\n"
+"Project-Id-Version: xkeyboard-config-2.10.99\n"
"Report-Msgid-Bugs-To: svu@users.sourceforge.net\n"
-"POT-Creation-Date: 2013-09-14 14:41+0200\n"
-"PO-Revision-Date: 2013-09-14 19:15+0100\n"
+"POT-Creation-Date: 2014-01-15 01:12+0000\n"
+"PO-Revision-Date: 2014-01-15 20:53+0100\n"
"Last-Translator: Mario Blättermann <mario.blaettermann@gmail.com>\n"
"Language-Team: German <translation-team-de@lists.sourceforge.net>\n"
"Language: de\n"
@@ -816,7 +816,7 @@ msgid "English (programmer Dvorak)"
msgstr "Englisch (Dvorak für Programmierer)"
#. Keyboard indicator for Russian layouts
-#: ../rules/base.xml.in.h:203 ../rules/base.extras.xml.in.h:54
+#: ../rules/base.xml.in.h:203 ../rules/base.extras.xml.in.h:55
msgid "ru"
msgstr "ru"
@@ -888,11 +888,11 @@ msgid "Uzbek (Afghanistan, OLPC)"
msgstr "Usbekisch (Afghanistan, OLPC)"
#. Keyboard indicator for Arabic layouts
-#: ../rules/base.xml.in.h:224 ../rules/base.extras.xml.in.h:64
+#: ../rules/base.xml.in.h:224 ../rules/base.extras.xml.in.h:65
msgid "ar"
msgstr "ar"
-#: ../rules/base.xml.in.h:225 ../rules/base.extras.xml.in.h:65
+#: ../rules/base.xml.in.h:225 ../rules/base.extras.xml.in.h:66
msgid "Arabic"
msgstr "Arabisch"
@@ -930,11 +930,11 @@ msgid "Albanian"
msgstr "Albanisch"
#. Keyboard indicator for Armenian layouts
-#: ../rules/base.xml.in.h:236 ../rules/base.extras.xml.in.h:58
+#: ../rules/base.xml.in.h:236 ../rules/base.extras.xml.in.h:59
msgid "hy"
msgstr "hy"
-#: ../rules/base.xml.in.h:237 ../rules/base.extras.xml.in.h:59
+#: ../rules/base.xml.in.h:237 ../rules/base.extras.xml.in.h:60
msgid "Armenian"
msgstr "Armenisch"
@@ -1010,11 +1010,11 @@ msgid "Belarusian (Latin)"
msgstr "Weißrussisch (Lateinisch)"
#. Keyboard indicator for Belgian layouts
-#: ../rules/base.xml.in.h:259 ../rules/base.extras.xml.in.h:67
+#: ../rules/base.xml.in.h:259 ../rules/base.extras.xml.in.h:68
msgid "be"
msgstr "be"
-#: ../rules/base.xml.in.h:260 ../rules/base.extras.xml.in.h:68
+#: ../rules/base.xml.in.h:260 ../rules/base.extras.xml.in.h:69
msgid "Belgian"
msgstr "Belgisch"
@@ -1046,17 +1046,17 @@ msgstr "Belgisch (Sun-Akzenttasten)"
msgid "Belgian (Wang model 724 azerty)"
msgstr "Belgisch (Wang Modell 724, azerty)"
-#. Keyboard indicator for Bengali layouts
+#. Keyboard indicator for Bangla layouts
#: ../rules/base.xml.in.h:269
msgid "bn"
msgstr "bn"
#: ../rules/base.xml.in.h:270
-msgid "Bengali"
-msgstr "Bengalisch"
+msgid "Bangla"
+msgstr "Bangla"
#: ../rules/base.xml.in.h:271
-msgid "Bengali (Probhat)"
+msgid "Bangla (Probhat)"
msgstr "Bengalisch (Probhat)"
#. Keyboard indicator for Indian layouts
@@ -1069,27 +1069,27 @@ msgid "Indian"
msgstr "Indisch"
#: ../rules/base.xml.in.h:275
-msgid "Bengali (India)"
+msgid "Bangla (India)"
msgstr "Bengalisch (Indien)"
#: ../rules/base.xml.in.h:276
-msgid "Bengali (India, Probhat)"
+msgid "Bangla (India, Probhat)"
msgstr "Bengalisch (Indien, Probhat)"
#: ../rules/base.xml.in.h:277
-msgid "Bengali (India, Baishakhi)"
+msgid "Bangla (India, Baishakhi)"
msgstr "Bengalisch (Indien, Baishakhi)"
#: ../rules/base.xml.in.h:278
-msgid "Bengali (India, Bornona)"
+msgid "Bangla (India, Bornona)"
msgstr "Bengalisch (Indien, Bornona)"
#: ../rules/base.xml.in.h:279
-msgid "Bengali (India, Uni Gitanjali)"
+msgid "Bangla (India, Uni Gitanjali)"
msgstr "Bengalisch (Indien, Uni Gitanjali)"
#: ../rules/base.xml.in.h:280
-msgid "Bengali (India, Baishakhi Inscript)"
+msgid "Bangla (India, Baishakhi Inscript)"
msgstr "Bengalisch (Indien, Baishakhi Inscript)"
#. Keyboard indicator for Gujarati layouts
@@ -1273,11 +1273,11 @@ msgid "Bosnian (US keyboard with Bosnian letters)"
msgstr "Bosnisch (US-Tastatur mit bosnischen Buchstaben)"
#. Keyboard indicator for Portuguese layouts
-#: ../rules/base.xml.in.h:336 ../rules/base.extras.xml.in.h:70
+#: ../rules/base.xml.in.h:336 ../rules/base.extras.xml.in.h:71
msgid "pt"
msgstr "pt"
-#: ../rules/base.xml.in.h:337 ../rules/base.extras.xml.in.h:71
+#: ../rules/base.xml.in.h:337 ../rules/base.extras.xml.in.h:72
msgid "Portuguese (Brazil)"
msgstr "Portugiesisch (Brasilien)"
@@ -1290,16 +1290,16 @@ msgid "Portuguese (Brazil, Dvorak)"
msgstr "Portugiesisch (Brasilien, Dvorak)"
#: ../rules/base.xml.in.h:340
-msgid "Portuguese (Brazil, nativo)"
+msgid "Portuguese (Brazil, Nativo)"
msgstr "Portugiesisch (Brasilien, nativo)"
#: ../rules/base.xml.in.h:341
-msgid "Portuguese (Brazil, nativo for US keyboards)"
+msgid "Portuguese (Brazil, Nativo for US keyboards)"
msgstr "Portugiesisch (Brasilien, Nativo für US-Tastaturen)"
#: ../rules/base.xml.in.h:342
-msgid "Portuguese (Brazil, nativo for Esperanto)"
-msgstr "Portugiesisch (Brasilien, Nativo für Esperanto)"
+msgid "Esperanto (Brazil, Nativo)"
+msgstr "Portugiesisch (Brasilien, Nativo)"
#. Keyboard indicator for Bulgarian layouts
#: ../rules/base.xml.in.h:344
@@ -1453,2463 +1453,2483 @@ msgid "Tibetan (with ASCII numerals)"
msgstr "Tibetanisch (mit ASCII-Ziffern)"
#: ../rules/base.xml.in.h:386
+msgid "ug"
+msgstr "ug"
+
+#: ../rules/base.xml.in.h:387
msgid "Uyghur"
msgstr "Uigurisch"
#. Keyboard indicator for Croatian layouts
-#: ../rules/base.xml.in.h:388
+#: ../rules/base.xml.in.h:389
msgid "hr"
msgstr "hr"
-#: ../rules/base.xml.in.h:389
+#: ../rules/base.xml.in.h:390
msgid "Croatian"
msgstr "Kroatisch"
-#: ../rules/base.xml.in.h:390
+#: ../rules/base.xml.in.h:391
msgid "Croatian (use guillemets for quotes)"
msgstr "Kroatisch (Anführungszeichen für Zitate verwenden)"
-#: ../rules/base.xml.in.h:391
+#: ../rules/base.xml.in.h:392
msgid "Croatian (use Croatian digraphs)"
msgstr "Kroatisch (Kroatische Digraphen verwenden)"
-#: ../rules/base.xml.in.h:392
+#: ../rules/base.xml.in.h:393
msgid "Croatian (US keyboard with Croatian digraphs)"
msgstr "Kroatisch (US-Tastatur mit kroatischen Digraphen)"
-#: ../rules/base.xml.in.h:393
+#: ../rules/base.xml.in.h:394
msgid "Croatian (US keyboard with Croatian letters)"
msgstr "Kroatisch (US-Tastatur mit kroatischen Buchstaben)"
#. Keyboard indicator for Chech layouts
-#: ../rules/base.xml.in.h:395 ../rules/base.extras.xml.in.h:73
+#: ../rules/base.xml.in.h:396 ../rules/base.extras.xml.in.h:74
msgid "cs"
msgstr "cs"
-#: ../rules/base.xml.in.h:396 ../rules/base.extras.xml.in.h:74
+#: ../rules/base.xml.in.h:397 ../rules/base.extras.xml.in.h:75
msgid "Czech"
msgstr "Tschechisch"
-#: ../rules/base.xml.in.h:397
+#: ../rules/base.xml.in.h:398
msgid "Czech (with &lt;\\|&gt; key)"
msgstr "Tschechisch (mit &lt;\\|&gt;-Taste)"
-#: ../rules/base.xml.in.h:398
+#: ../rules/base.xml.in.h:399
msgid "Czech (qwerty)"
msgstr "Tschechisch (qwerty)"
-#: ../rules/base.xml.in.h:399
+#: ../rules/base.xml.in.h:400
msgid "Czech (qwerty, extended Backslash)"
msgstr "Tschechisch (qwerty, erweiterter Backslash)"
-#: ../rules/base.xml.in.h:400
+#: ../rules/base.xml.in.h:401
msgid "Czech (UCW layout, accented letters only)"
msgstr "Tschechisch (UCW-Belegung, nur akzentuierte Buchstaben)"
-#: ../rules/base.xml.in.h:401
+#: ../rules/base.xml.in.h:402
msgid "Czech (US Dvorak with CZ UCW support)"
msgstr "Tschechisch (US Dvorak mit CZ-UCW-Unterstützung)"
#. Keyboard indicator for Danish layouts
-#: ../rules/base.xml.in.h:403 ../rules/base.extras.xml.in.h:76
+#: ../rules/base.xml.in.h:404 ../rules/base.extras.xml.in.h:77
msgid "da"
msgstr "da"
-#: ../rules/base.xml.in.h:404 ../rules/base.extras.xml.in.h:77
+#: ../rules/base.xml.in.h:405 ../rules/base.extras.xml.in.h:78
msgid "Danish"
msgstr "Dänisch"
-#: ../rules/base.xml.in.h:405
+#: ../rules/base.xml.in.h:406
msgid "Danish (eliminate dead keys)"
msgstr "Dänisch (ohne Akzenttasten)"
-#: ../rules/base.xml.in.h:406
+#: ../rules/base.xml.in.h:407
msgid "Danish (Macintosh)"
msgstr "Dänisch (Macintosh)"
-#: ../rules/base.xml.in.h:407
+#: ../rules/base.xml.in.h:408
msgid "Danish (Macintosh, eliminate dead keys)"
msgstr "Dänisch (Macintosh, ohne Akzenttasten)"
-#: ../rules/base.xml.in.h:408
+#: ../rules/base.xml.in.h:409
msgid "Danish (Dvorak)"
msgstr "Dänisch (Dvorak)"
#. Keyboard indicator for Dutch layouts
-#: ../rules/base.xml.in.h:410 ../rules/base.extras.xml.in.h:79
+#: ../rules/base.xml.in.h:411 ../rules/base.extras.xml.in.h:80
msgid "nl"
msgstr "nl"
-#: ../rules/base.xml.in.h:411 ../rules/base.extras.xml.in.h:80
+#: ../rules/base.xml.in.h:412 ../rules/base.extras.xml.in.h:81
msgid "Dutch"
msgstr "Niederländisch"
-#: ../rules/base.xml.in.h:412
+#: ../rules/base.xml.in.h:413
msgid "Dutch (Sun dead keys)"
msgstr "Niederländisch (Sun-Akzenttasten)"
-#: ../rules/base.xml.in.h:413
+#: ../rules/base.xml.in.h:414
msgid "Dutch (Macintosh)"
msgstr "Niederländisch (Macintosh)"
-#: ../rules/base.xml.in.h:414
+#: ../rules/base.xml.in.h:415
msgid "Dutch (standard)"
msgstr "Niederländisch (Standard)"
#. Keyboard indicator for Dzongkha layouts
-#: ../rules/base.xml.in.h:416
+#: ../rules/base.xml.in.h:417
msgid "dz"
msgstr "dz"
-#: ../rules/base.xml.in.h:417
+#: ../rules/base.xml.in.h:418
msgid "Dzongkha"
msgstr "Dzongkha"
#. Keyboard indicator for Estonian layouts
-#: ../rules/base.xml.in.h:419 ../rules/base.extras.xml.in.h:82
+#: ../rules/base.xml.in.h:420 ../rules/base.extras.xml.in.h:83
msgid "et"
msgstr "et"
-#: ../rules/base.xml.in.h:420 ../rules/base.extras.xml.in.h:83
+#: ../rules/base.xml.in.h:421 ../rules/base.extras.xml.in.h:84
msgid "Estonian"
msgstr "Estnisch"
-#: ../rules/base.xml.in.h:421
+#: ../rules/base.xml.in.h:422
msgid "Estonian (eliminate dead keys)"
msgstr "Estnisch (ohne Akzenttasten)"
-#: ../rules/base.xml.in.h:422
+#: ../rules/base.xml.in.h:423
msgid "Estonian (Dvorak)"
msgstr "Estnisch (Dvorak)"
-#: ../rules/base.xml.in.h:423
+#: ../rules/base.xml.in.h:424
msgid "Estonian (US keyboard with Estonian letters)"
msgstr "Estnisch (US-Tastatur mit estnischen Buchstaben)"
-#: ../rules/base.xml.in.h:424 ../rules/base.extras.xml.in.h:16
+#: ../rules/base.xml.in.h:425 ../rules/base.extras.xml.in.h:16
msgid "Persian"
msgstr "Persisch"
-#: ../rules/base.xml.in.h:425
+#: ../rules/base.xml.in.h:426
msgid "Persian (with Persian Keypad)"
msgstr "Persisch (mit persischem Nummernblock)"
#. Keyboard indicator for Kurdish layouts
-#: ../rules/base.xml.in.h:427
+#: ../rules/base.xml.in.h:428
msgid "ku"
msgstr "ku"
-#: ../rules/base.xml.in.h:428
+#: ../rules/base.xml.in.h:429
msgid "Kurdish (Iran, Latin Q)"
msgstr "Kurdisch (Iran, Lateinisches Q)"
-#: ../rules/base.xml.in.h:429
+#: ../rules/base.xml.in.h:430
msgid "Kurdish (Iran, F)"
msgstr "Kurdisch (Iran, F)"
-#: ../rules/base.xml.in.h:430
+#: ../rules/base.xml.in.h:431
msgid "Kurdish (Iran, Latin Alt-Q)"
msgstr "Kurdisch (Iran, Lateinisches Alt-Q)"
-#: ../rules/base.xml.in.h:431
+#: ../rules/base.xml.in.h:432
msgid "Kurdish (Iran, Arabic-Latin)"
msgstr "Kurdisch (Iran, Arabisch-Lateinisch)"
-#: ../rules/base.xml.in.h:432
+#: ../rules/base.xml.in.h:433
msgid "Iraqi"
msgstr "Irakisch"
-#: ../rules/base.xml.in.h:433
+#: ../rules/base.xml.in.h:434
msgid "Kurdish (Iraq, Latin Q)"
msgstr "Kurdisch (Irak, lateinisches Q)"
-#: ../rules/base.xml.in.h:434
+#: ../rules/base.xml.in.h:435
msgid "Kurdish (Iraq, F)"
msgstr "Kurdisch (Irak, F)"
-#: ../rules/base.xml.in.h:435
+#: ../rules/base.xml.in.h:436
msgid "Kurdish (Iraq, Latin Alt-Q)"
msgstr "Kurdisch (Irak, Lateinisches Alt-Q)"
-#: ../rules/base.xml.in.h:436
+#: ../rules/base.xml.in.h:437
msgid "Kurdish (Iraq, Arabic-Latin)"
msgstr "Kurdisch (Irak, Arabisch-Lateinisch)"
#. Keyboard indicator for Faroese layouts
-#: ../rules/base.xml.in.h:438
+#: ../rules/base.xml.in.h:439
msgid "fo"
msgstr "fo"
-#: ../rules/base.xml.in.h:439
+#: ../rules/base.xml.in.h:440
msgid "Faroese"
msgstr "Färöisch"
-#: ../rules/base.xml.in.h:440
+#: ../rules/base.xml.in.h:441
msgid "Faroese (eliminate dead keys)"
msgstr "Färöisch (ohne Akzenttasten)"
#. Keyboard indicator for Finnish layouts
-#: ../rules/base.xml.in.h:442 ../rules/base.extras.xml.in.h:85
+#: ../rules/base.xml.in.h:443 ../rules/base.extras.xml.in.h:86
msgid "fi"
msgstr "fi"
-#: ../rules/base.xml.in.h:443 ../rules/base.extras.xml.in.h:86
+#: ../rules/base.xml.in.h:444 ../rules/base.extras.xml.in.h:87
msgid "Finnish"
msgstr "Finnisch"
-#: ../rules/base.xml.in.h:444
+#: ../rules/base.xml.in.h:445
msgid "Finnish (classic)"
msgstr "Finnisch (klassisch)"
-#: ../rules/base.xml.in.h:445
+#: ../rules/base.xml.in.h:446
msgid "Finnish (classic, eliminate dead keys)"
msgstr "Finnisch (klassisch, ohne Akzenttasten)"
-#: ../rules/base.xml.in.h:446
+#: ../rules/base.xml.in.h:447
msgid "Northern Saami (Finland)"
msgstr "Nördliches Saami (Finnland)"
-#: ../rules/base.xml.in.h:447
+#: ../rules/base.xml.in.h:448
msgid "Finnish (Macintosh)"
msgstr "Finnisch (Macintosh)"
-#: ../rules/base.xml.in.h:448 ../rules/base.extras.xml.in.h:88
+#: ../rules/base.xml.in.h:449 ../rules/base.extras.xml.in.h:89
msgid "French"
msgstr "Französisch"
-#: ../rules/base.xml.in.h:449
+#: ../rules/base.xml.in.h:450
msgid "French (eliminate dead keys)"
msgstr "Französisch (ohne Akzenttasten)"
-#: ../rules/base.xml.in.h:450
+#: ../rules/base.xml.in.h:451
msgid "French (Sun dead keys)"
msgstr "Französisch (Sun-Akzenttasten)"
-#: ../rules/base.xml.in.h:451
+#: ../rules/base.xml.in.h:452
msgid "French (alternative)"
msgstr "Französisch (alternativ)"
-#: ../rules/base.xml.in.h:452
+#: ../rules/base.xml.in.h:453
msgid "French (alternative, Latin-9 only)"
msgstr "Französisch (Alternative, nur latin-9)"
-#: ../rules/base.xml.in.h:453
+#: ../rules/base.xml.in.h:454
msgid "French (alternative, eliminate dead keys)"
msgstr "Französisch (Alternative, ohne Akzenttasten)"
-#: ../rules/base.xml.in.h:454
+#: ../rules/base.xml.in.h:455
msgid "French (alternative, Sun dead keys)"
msgstr "Französisch (Alternative, Sun-Akzenttasten)"
-#: ../rules/base.xml.in.h:455
+#: ../rules/base.xml.in.h:456
msgid "French (legacy, alternative)"
msgstr "Französisch (Alternative, veraltet)"
-#: ../rules/base.xml.in.h:456
+#: ../rules/base.xml.in.h:457
msgid "French (legacy, alternative, eliminate dead keys)"
msgstr "Französisch (Alternative, veraltet, ohne Akzenttasten)"
-#: ../rules/base.xml.in.h:457
+#: ../rules/base.xml.in.h:458
msgid "French (legacy, alternative, Sun dead keys)"
msgstr "Französisch (Alternative, veraltet, Sun-Akzenttasten)"
-#: ../rules/base.xml.in.h:458
+#: ../rules/base.xml.in.h:459
msgid "French (Bepo, ergonomic, Dvorak way)"
msgstr "Französich (Bepo, ergonomisch, Dvorak-ähnlich)"
-#: ../rules/base.xml.in.h:459
+#: ../rules/base.xml.in.h:460
msgid "French (Bepo, ergonomic, Dvorak way, Latin-9 only)"
msgstr "Französisch (Bepo, ergonomisch, Dvorak-ähnlich, nur latin-9)"
-#: ../rules/base.xml.in.h:460
+#: ../rules/base.xml.in.h:461
msgid "French (Dvorak)"
msgstr "Französisch (Dvorak)"
-#: ../rules/base.xml.in.h:461
+#: ../rules/base.xml.in.h:462
msgid "French (Macintosh)"
msgstr "Französisch (Macintosh)"
-#: ../rules/base.xml.in.h:462
+#: ../rules/base.xml.in.h:463
msgid "French (Breton)"
msgstr "Französisch (Bretonisch)"
-#: ../rules/base.xml.in.h:463
+#: ../rules/base.xml.in.h:464
msgid "Occitan"
msgstr "Okzitanisch"
-#: ../rules/base.xml.in.h:464
+#: ../rules/base.xml.in.h:465
msgid "Georgian (France, AZERTY Tskapo)"
msgstr "Georgisch (Frankreich, AZERTY Tskapo)"
-#: ../rules/base.xml.in.h:465
+#: ../rules/base.xml.in.h:466
msgid "English (Ghana)"
msgstr "Englisch (Ghana)"
-#: ../rules/base.xml.in.h:466
+#: ../rules/base.xml.in.h:467
msgid "English (Ghana, multilingual)"
msgstr "Englisch (Ghana, mehrsprachig)"
#. Keyboard indicator for Akan layouts
-#: ../rules/base.xml.in.h:468
+#: ../rules/base.xml.in.h:469
msgid "ak"
msgstr "ak"
-#: ../rules/base.xml.in.h:469
+#: ../rules/base.xml.in.h:470
msgid "Akan"
msgstr "Akan"
#. Keyboard indicator for Ewe layouts
-#: ../rules/base.xml.in.h:471
+#: ../rules/base.xml.in.h:472
msgid "ee"
msgstr "ee"
-#: ../rules/base.xml.in.h:472
+#: ../rules/base.xml.in.h:473
msgid "Ewe"
msgstr "Ewe"
#. Keyboard indicator for Fula layouts
-#: ../rules/base.xml.in.h:474
+#: ../rules/base.xml.in.h:475
msgid "ff"
msgstr "ff"
-#: ../rules/base.xml.in.h:475
+#: ../rules/base.xml.in.h:476
msgid "Fula"
msgstr "Fula"
#. Keyboard indicator for Ga layouts
-#: ../rules/base.xml.in.h:477
+#: ../rules/base.xml.in.h:478
msgid "gaa"
msgstr "gaa"
-#: ../rules/base.xml.in.h:478
+#: ../rules/base.xml.in.h:479
msgid "Ga"
msgstr "Ga"
#. Keyboard indicator for Hausa layouts
-#: ../rules/base.xml.in.h:480
+#: ../rules/base.xml.in.h:481
msgid "ha"
msgstr "ha"
-#: ../rules/base.xml.in.h:481
+#: ../rules/base.xml.in.h:482
msgid "Hausa"
msgstr "Haussa"
#. Keyboard indicator for Avatime layouts
-#: ../rules/base.xml.in.h:483
+#: ../rules/base.xml.in.h:484
msgid "avn"
msgstr "avn"
-#: ../rules/base.xml.in.h:484
+#: ../rules/base.xml.in.h:485
msgid "Avatime"
msgstr "Avatime"
-#: ../rules/base.xml.in.h:485
+#: ../rules/base.xml.in.h:486
msgid "English (Ghana, GILLBT)"
msgstr "Englisch (Ghana, GILLBT)"
-#: ../rules/base.xml.in.h:486
+#: ../rules/base.xml.in.h:487
msgid "French (Guinea)"
msgstr "Französisch (Guinea)"
#. Keyboard indicator for Georgian layouts
-#: ../rules/base.xml.in.h:488
+#: ../rules/base.xml.in.h:489
msgid "ka"
msgstr "ka"
-#: ../rules/base.xml.in.h:489
+#: ../rules/base.xml.in.h:490
msgid "Georgian"
msgstr "Georgisch"
-#: ../rules/base.xml.in.h:490
+#: ../rules/base.xml.in.h:491
msgid "Georgian (ergonomic)"
msgstr "Georgisch (ergonomisch)"
-#: ../rules/base.xml.in.h:491
+#: ../rules/base.xml.in.h:492
msgid "Georgian (MESS)"
msgstr "Georgisch (MESS)"
-#: ../rules/base.xml.in.h:492
+#: ../rules/base.xml.in.h:493
msgid "Russian (Georgia)"
msgstr "Russisch (Georgien)"
-#: ../rules/base.xml.in.h:493
+#: ../rules/base.xml.in.h:494
msgid "Ossetian (Georgia)"
msgstr "Ossetisch (Georgien)"
-#: ../rules/base.xml.in.h:494 ../rules/base.extras.xml.in.h:11
+#: ../rules/base.xml.in.h:495 ../rules/base.extras.xml.in.h:11
msgid "German"
msgstr "Deutsch"
-#: ../rules/base.xml.in.h:495
+#: ../rules/base.xml.in.h:496
msgid "German (dead acute)"
msgstr "Deutsch (Nur Acute-(')Akzentzeichen)"
-#: ../rules/base.xml.in.h:496
+#: ../rules/base.xml.in.h:497
msgid "German (dead grave acute)"
msgstr "Deutsch (Nur Grave-(`) und Acute-(')Akzentzeichen)"
-#: ../rules/base.xml.in.h:497
+#: ../rules/base.xml.in.h:498
msgid "German (eliminate dead keys)"
msgstr "Deutsch (ohne Akzenttasten)"
-#: ../rules/base.xml.in.h:498
+#: ../rules/base.xml.in.h:499
msgid "German (T3)"
msgstr "Deutsch (T3)"
-#: ../rules/base.xml.in.h:499
+#: ../rules/base.xml.in.h:500
msgid "Romanian (Germany)"
msgstr "Rumänisch (Deutschland)"
-#: ../rules/base.xml.in.h:500
+#: ../rules/base.xml.in.h:501
msgid "Romanian (Germany, eliminate dead keys)"
msgstr "Rumänisch (Deutschland, ohne Akzenttasten)"
-#: ../rules/base.xml.in.h:501
+#: ../rules/base.xml.in.h:502
msgid "German (Dvorak)"
msgstr "Deutsch (Dvorak)"
-#: ../rules/base.xml.in.h:502
+#: ../rules/base.xml.in.h:503
msgid "German (Sun dead keys)"
msgstr "Deutsch (Sun-Akzenttasten)"
-#: ../rules/base.xml.in.h:503
+#: ../rules/base.xml.in.h:504
msgid "German (Neo 2)"
msgstr "Deutsch (Neo 2)"
-#: ../rules/base.xml.in.h:504
+#: ../rules/base.xml.in.h:505
msgid "German (Macintosh)"
msgstr "Deutsch (Macintosh)"
-#: ../rules/base.xml.in.h:505
+#: ../rules/base.xml.in.h:506
msgid "German (Macintosh, eliminate dead keys)"
msgstr "Deutsch (Macintosh, ohne Akzenttasten)"
-#: ../rules/base.xml.in.h:506
+#: ../rules/base.xml.in.h:507
msgid "Lower Sorbian"
msgstr "Niedersorbisch"
-#: ../rules/base.xml.in.h:507
+#: ../rules/base.xml.in.h:508
msgid "Lower Sorbian (qwertz)"
msgstr "Niedersorbisch (qwertz)"
-#: ../rules/base.xml.in.h:508
+#: ../rules/base.xml.in.h:509
msgid "German (qwerty)"
msgstr "Deutsch (qwerty)"
-#: ../rules/base.xml.in.h:509
+#: ../rules/base.xml.in.h:510
msgid "Russian (Germany, phonetic)"
msgstr "Russisch (Deutschland, phonetisch)"
-#: ../rules/base.xml.in.h:510
+#: ../rules/base.xml.in.h:511
msgid "German (legacy)"
msgstr "Deutsch (veraltet)"
#. Keyboard indicator for Greek layouts
-#: ../rules/base.xml.in.h:512 ../rules/base.extras.xml.in.h:90
+#: ../rules/base.xml.in.h:513 ../rules/base.extras.xml.in.h:91
msgid "gr"
msgstr "gr"
-#: ../rules/base.xml.in.h:513 ../rules/base.extras.xml.in.h:91
+#: ../rules/base.xml.in.h:514 ../rules/base.extras.xml.in.h:92
msgid "Greek"
msgstr "Griechisch"
-#: ../rules/base.xml.in.h:514
+#: ../rules/base.xml.in.h:515
msgid "Greek (simple)"
msgstr "Griechisch (vereinfacht)"
-#: ../rules/base.xml.in.h:515
+#: ../rules/base.xml.in.h:516
msgid "Greek (extended)"
msgstr "Griechisch (erweitert)"
-#: ../rules/base.xml.in.h:516
+#: ../rules/base.xml.in.h:517
msgid "Greek (eliminate dead keys)"
msgstr "Griechisch (ohne Akzenttasten)"
-#: ../rules/base.xml.in.h:517
+#: ../rules/base.xml.in.h:518
msgid "Greek (polytonic)"
msgstr "Griechisch (polytonisch)"
#. Keyboard indicator for Hungarian layouts
-#: ../rules/base.xml.in.h:519
+#: ../rules/base.xml.in.h:520
msgid "hu"
msgstr "hu"
-#: ../rules/base.xml.in.h:520
+#: ../rules/base.xml.in.h:521
msgid "Hungarian"
msgstr "Ungarisch"
-#: ../rules/base.xml.in.h:521
+#: ../rules/base.xml.in.h:522
msgid "Hungarian (standard)"
msgstr "Ungarisch (Standard)"
-#: ../rules/base.xml.in.h:522
+#: ../rules/base.xml.in.h:523
msgid "Hungarian (eliminate dead keys)"
msgstr "Ungarisch (ohne Akzenttasten)"
-#: ../rules/base.xml.in.h:523
+#: ../rules/base.xml.in.h:524
msgid "Hungarian (qwerty)"
msgstr "Ungarisch (qwerty)"
-#: ../rules/base.xml.in.h:524
+#: ../rules/base.xml.in.h:525
msgid "Hungarian (101/qwertz/comma/dead keys)"
msgstr "Ungarisch (101/qwertz/Komma/Akzenttasten)"
-#: ../rules/base.xml.in.h:525
+#: ../rules/base.xml.in.h:526
msgid "Hungarian (101/qwertz/comma/eliminate dead keys)"
msgstr "Ungarisch (101/qwertz/Komma/ohne Akzenttasten)"
-#: ../rules/base.xml.in.h:526
+#: ../rules/base.xml.in.h:527
msgid "Hungarian (101/qwertz/dot/dead keys)"
msgstr "Ungarisch (101/qwertz/Punkt/Akzenttasten)"
-#: ../rules/base.xml.in.h:527
+#: ../rules/base.xml.in.h:528
msgid "Hungarian (101/qwertz/dot/eliminate dead keys)"
msgstr "Ungarisch (101/qwertz/Punkt/ohne Akzenttasten)"
-#: ../rules/base.xml.in.h:528
+#: ../rules/base.xml.in.h:529
msgid "Hungarian (101/qwerty/comma/dead keys)"
msgstr "Ungarisch (101/qwerty/Komma/Akzenttasten)"
-#: ../rules/base.xml.in.h:529
+#: ../rules/base.xml.in.h:530
msgid "Hungarian (101/qwerty/comma/eliminate dead keys)"
msgstr "Ungarisch (101/qwerty/Komma/ohne Akzenttasten)"
-#: ../rules/base.xml.in.h:530
+#: ../rules/base.xml.in.h:531
msgid "Hungarian (101/qwerty/dot/dead keys)"
msgstr "Ungarisch (101/qwerty/Punkt/Akzenttasten)"
-#: ../rules/base.xml.in.h:531
+#: ../rules/base.xml.in.h:532
msgid "Hungarian (101/qwerty/dot/eliminate dead keys)"
msgstr "Ungarisch (101/qwerty/Punkt/ohne Akzenttasten)"
-#: ../rules/base.xml.in.h:532
+#: ../rules/base.xml.in.h:533
msgid "Hungarian (102/qwertz/comma/dead keys)"
msgstr "Ungarisch (102/qwertz/Komma/Akzenttasten)"
-#: ../rules/base.xml.in.h:533
+#: ../rules/base.xml.in.h:534
msgid "Hungarian (102/qwertz/comma/eliminate dead keys)"
msgstr "Ungarisch (102/qwertz/Komma/ohne Akzenttasten)"
-#: ../rules/base.xml.in.h:534
+#: ../rules/base.xml.in.h:535
msgid "Hungarian (102/qwertz/dot/dead keys)"
msgstr "Ungarisch (102/qwertz/Punkt/Akzenttasten)"
-#: ../rules/base.xml.in.h:535
+#: ../rules/base.xml.in.h:536
msgid "Hungarian (102/qwertz/dot/eliminate dead keys)"
msgstr "Ungarisch (102/qwertz/Punkt/ohne Akzenttasten)"
-#: ../rules/base.xml.in.h:536
+#: ../rules/base.xml.in.h:537
msgid "Hungarian (102/qwerty/comma/dead keys)"
msgstr "Ungarisch (102/qwerty/Komma/Akzenttasten)"
-#: ../rules/base.xml.in.h:537
+#: ../rules/base.xml.in.h:538
msgid "Hungarian (102/qwerty/comma/eliminate dead keys)"
msgstr "Ungarisch (102/qwerty/Komma/ohne Akzenttasten)"
-#: ../rules/base.xml.in.h:538
+#: ../rules/base.xml.in.h:539
msgid "Hungarian (102/qwerty/dot/dead keys)"
msgstr "Ungarisch (102/qwerty/Punkt/Akzenttasten)"
-#: ../rules/base.xml.in.h:539
+#: ../rules/base.xml.in.h:540
msgid "Hungarian (102/qwerty/dot/eliminate dead keys)"
msgstr "Ungarisch (102/qwerty/Punkt/ohne Akzenttasten)"
#. Keyboard indicator for Icelandic layouts
-#: ../rules/base.xml.in.h:541
+#: ../rules/base.xml.in.h:542
msgid "is"
msgstr "is"
-#: ../rules/base.xml.in.h:542
+#: ../rules/base.xml.in.h:543
msgid "Icelandic"
msgstr "Isländisch"
-#: ../rules/base.xml.in.h:543
+#: ../rules/base.xml.in.h:544
msgid "Icelandic (Sun dead keys)"
msgstr "Isländisch (Sun-Akzenttasten)"
-#: ../rules/base.xml.in.h:544
+#: ../rules/base.xml.in.h:545
msgid "Icelandic (eliminate dead keys)"
msgstr "Isländisch (ohne Akzenttasten)"
-#: ../rules/base.xml.in.h:545
+#: ../rules/base.xml.in.h:546
msgid "Icelandic (Macintosh)"
msgstr "Isländisch (Macintosh)"
-#: ../rules/base.xml.in.h:546
+#: ../rules/base.xml.in.h:547
msgid "Icelandic (Dvorak)"
msgstr "Isländisch (Dvorak)"
#. Keyboard indicator for Hebrew layouts
-#: ../rules/base.xml.in.h:548 ../rules/base.extras.xml.in.h:61
+#: ../rules/base.xml.in.h:549 ../rules/base.extras.xml.in.h:62
msgid "he"
msgstr "he"
-#: ../rules/base.xml.in.h:549 ../rules/base.extras.xml.in.h:62
+#: ../rules/base.xml.in.h:550 ../rules/base.extras.xml.in.h:63
msgid "Hebrew"
msgstr "Hebräisch"
-#: ../rules/base.xml.in.h:550
+#: ../rules/base.xml.in.h:551
msgid "Hebrew (lyx)"
msgstr "Hebräisch (lyx)"
-#: ../rules/base.xml.in.h:551
+#: ../rules/base.xml.in.h:552
msgid "Hebrew (phonetic)"
msgstr "Hebräisch (phonetisch)"
-#: ../rules/base.xml.in.h:552
+#: ../rules/base.xml.in.h:553
msgid "Hebrew (Biblical, Tiro)"
msgstr "Hebräisch (Biblisch, Tiro)"
#. Keyboard indicator for Italian layouts
-#: ../rules/base.xml.in.h:554 ../rules/base.extras.xml.in.h:93
+#: ../rules/base.xml.in.h:555 ../rules/base.extras.xml.in.h:94
msgid "it"
msgstr "it"
-#: ../rules/base.xml.in.h:555 ../rules/base.extras.xml.in.h:94
+#: ../rules/base.xml.in.h:556 ../rules/base.extras.xml.in.h:95
msgid "Italian"
msgstr "Italienisch"
-#: ../rules/base.xml.in.h:556
+#: ../rules/base.xml.in.h:557
msgid "Italian (eliminate dead keys)"
msgstr "Italienisch (ohne Akzenttasten)"
-#: ../rules/base.xml.in.h:557
+#: ../rules/base.xml.in.h:558
msgid "Italian (Macintosh)"
msgstr "Italienisch (Macintosh)"
-#: ../rules/base.xml.in.h:558
+#: ../rules/base.xml.in.h:559
msgid "Italian (US keyboard with Italian letters)"
msgstr "Italienisch (US-Tastatur mit italienischen Buchstaben)"
-#: ../rules/base.xml.in.h:559
+#: ../rules/base.xml.in.h:560
msgid "Georgian (Italy)"
msgstr "Georgisch (Italien)"
-#: ../rules/base.xml.in.h:560
+#: ../rules/base.xml.in.h:561
msgid "Italian (IBM 142)"
msgstr "Italienisch (IBM 142)"
#. Keyboard indicator for Japanese layouts
-#: ../rules/base.xml.in.h:562 ../rules/base.extras.xml.in.h:96
+#: ../rules/base.xml.in.h:563 ../rules/base.extras.xml.in.h:97
msgid "ja"
msgstr "ja"
-#: ../rules/base.xml.in.h:563 ../rules/base.extras.xml.in.h:97
+#: ../rules/base.xml.in.h:564 ../rules/base.extras.xml.in.h:98
msgid "Japanese"
msgstr "Japanisch"
-#: ../rules/base.xml.in.h:564
+#: ../rules/base.xml.in.h:565
msgid "Japanese (Kana)"
msgstr "Japanisch (Kana)"
-#: ../rules/base.xml.in.h:565
+#: ../rules/base.xml.in.h:566
msgid "Japanese (Kana 86)"
msgstr "Japanisch (Kana 86)"
-#: ../rules/base.xml.in.h:566
+#: ../rules/base.xml.in.h:567
msgid "Japanese (OADG 109A)"
msgstr "Japanisch (OADG 109A)"
-#: ../rules/base.xml.in.h:567
+#: ../rules/base.xml.in.h:568
msgid "Japanese (Macintosh)"
msgstr "Japanisch (Macintosh)"
-#: ../rules/base.xml.in.h:568
+#: ../rules/base.xml.in.h:569
msgid "Japanese (Dvorak)"
msgstr "Japanisch (Dvorak)"
#. Keyboard indicator for Kikuyu layouts
-#: ../rules/base.xml.in.h:570
+#: ../rules/base.xml.in.h:571
msgid "ki"
msgstr "ki"
-#: ../rules/base.xml.in.h:571
+#: ../rules/base.xml.in.h:572
msgid "Kyrgyz"
msgstr "Kirgisisch"
-#: ../rules/base.xml.in.h:572
+#: ../rules/base.xml.in.h:573
msgid "Kyrgyz (phonetic)"
msgstr "Kirgisisch (phonetisch)"
#. Keyboard indicator for Khmer layouts
-#: ../rules/base.xml.in.h:574
+#: ../rules/base.xml.in.h:575
msgid "km"
msgstr "km"
-#: ../rules/base.xml.in.h:575
+#: ../rules/base.xml.in.h:576
msgid "Khmer (Cambodia)"
msgstr "Khmer (Kambodscha)"
#. Keyboard indicator for Kazakh layouts
-#: ../rules/base.xml.in.h:577
+#: ../rules/base.xml.in.h:578
msgid "kk"
msgstr "kk"
-#: ../rules/base.xml.in.h:578
+#: ../rules/base.xml.in.h:579
msgid "Kazakh"
msgstr "Kasachisch"
-#: ../rules/base.xml.in.h:579
+#: ../rules/base.xml.in.h:580
msgid "Russian (Kazakhstan, with Kazakh)"
msgstr "Russisch (Kasachstan, mit Kasachisch)"
-#: ../rules/base.xml.in.h:580
+#: ../rules/base.xml.in.h:581
msgid "Kazakh (with Russian)"
msgstr "Kasachisch (mit russischer Belegung)"
#. Keyboard indicator for Lao layouts
-#: ../rules/base.xml.in.h:582
+#: ../rules/base.xml.in.h:583
msgid "lo"
msgstr "lo"
-#: ../rules/base.xml.in.h:583
+#: ../rules/base.xml.in.h:584
msgid "Lao"
msgstr "Lao"
-#: ../rules/base.xml.in.h:584
+#: ../rules/base.xml.in.h:585
msgid "Lao (STEA proposed standard layout)"
msgstr "Laotisch (durch STEA vorgeschlagene Standardbelegung)"
#. Keyboard indicator for Spanish layouts
-#: ../rules/base.xml.in.h:586 ../rules/base.extras.xml.in.h:109
+#: ../rules/base.xml.in.h:587 ../rules/base.extras.xml.in.h:110
msgid "es"
msgstr "es"
-#: ../rules/base.xml.in.h:587
+#: ../rules/base.xml.in.h:588
msgid "Spanish (Latin American)"
msgstr "Spabisch (Lateinamerikanisch)"
-#: ../rules/base.xml.in.h:588
+#: ../rules/base.xml.in.h:589
msgid "Spanish (Latin American, eliminate dead keys)"
msgstr "Spanisch (Lateinamerikanisch, ohne Akzenttasten)"
-#: ../rules/base.xml.in.h:589
+#: ../rules/base.xml.in.h:590
msgid "Spanish (Latin American, include dead tilde)"
msgstr "Spanisch (Lateinamerikanisch, Akzent-Tilde einschließen)"
-#: ../rules/base.xml.in.h:590
+#: ../rules/base.xml.in.h:591
msgid "Spanish (Latin American, Sun dead keys)"
msgstr "Spanisch (Lateinamerikanisch, Sun-Akzenttasten)"
#. Keyboard indicator for Lithuanian layouts
-#: ../rules/base.xml.in.h:592 ../rules/base.extras.xml.in.h:18
+#: ../rules/base.xml.in.h:593 ../rules/base.extras.xml.in.h:18
msgid "lt"
msgstr "lt"
-#: ../rules/base.xml.in.h:593 ../rules/base.extras.xml.in.h:19
+#: ../rules/base.xml.in.h:594 ../rules/base.extras.xml.in.h:19
msgid "Lithuanian"
msgstr "Litauisch"
-#: ../rules/base.xml.in.h:594
+#: ../rules/base.xml.in.h:595
msgid "Lithuanian (standard)"
msgstr "Litauisch (Standard)"
-#: ../rules/base.xml.in.h:595
+#: ../rules/base.xml.in.h:596
msgid "Lithuanian (US keyboard with Lithuanian letters)"
msgstr "Litauisch (US-Tastatur mit litauischen Buchstaben)"
-#: ../rules/base.xml.in.h:596
+#: ../rules/base.xml.in.h:597
msgid "Lithuanian (IBM LST 1205-92)"
msgstr "Litauisch (IBM LST 1205-92)"
-#: ../rules/base.xml.in.h:597
+#: ../rules/base.xml.in.h:598
msgid "Lithuanian (LEKP)"
msgstr "Litauisch (LEKP)"
-#: ../rules/base.xml.in.h:598
+#: ../rules/base.xml.in.h:599
msgid "Lithuanian (LEKPa)"
msgstr "Litauisch (LEKPa)"
#. Keyboard indicator for Latvian layouts
-#: ../rules/base.xml.in.h:600 ../rules/base.extras.xml.in.h:22
+#: ../rules/base.xml.in.h:601 ../rules/base.extras.xml.in.h:22
msgid "lv"
msgstr "lv"
-#: ../rules/base.xml.in.h:601 ../rules/base.extras.xml.in.h:23
+#: ../rules/base.xml.in.h:602 ../rules/base.extras.xml.in.h:23
msgid "Latvian"
msgstr "Lettisch"
-#: ../rules/base.xml.in.h:602
+#: ../rules/base.xml.in.h:603
msgid "Latvian (apostrophe variant)"
msgstr "Lettisch, (Apostroph-Variante)"
-#: ../rules/base.xml.in.h:603
+#: ../rules/base.xml.in.h:604
msgid "Latvian (tilde variant)"
msgstr "Lettisch (Tilde-Variante)"
-#: ../rules/base.xml.in.h:604
+#: ../rules/base.xml.in.h:605
msgid "Latvian (F variant)"
msgstr "Lettisch (F-Variante)"
-#: ../rules/base.xml.in.h:605
+#: ../rules/base.xml.in.h:606
msgid "Latvian (modern)"
msgstr "Lettisch (modern)"
-#: ../rules/base.xml.in.h:606
+#: ../rules/base.xml.in.h:607
msgid "Latvian (ergonomic, ŪGJRMV)"
msgstr "Georgisch (ergonomisch, ŪGJRMV)"
-#: ../rules/base.xml.in.h:607
+#: ../rules/base.xml.in.h:608
msgid "Latvian (adapted)"
msgstr "Lettisch (angepasst)"
#. Keyboard indicator for Maori layouts
-#: ../rules/base.xml.in.h:609
+#: ../rules/base.xml.in.h:610
msgid "mi"
msgstr "mi"
-#: ../rules/base.xml.in.h:610
+#: ../rules/base.xml.in.h:611
msgid "Maori"
msgstr "Maori"
#. Keyboard indicator for Serbian layouts
-#: ../rules/base.xml.in.h:612 ../rules/base.extras.xml.in.h:51
+#: ../rules/base.xml.in.h:613 ../rules/base.extras.xml.in.h:52
msgid "sr"
msgstr "sr"
-#: ../rules/base.xml.in.h:613
+#: ../rules/base.xml.in.h:614
msgid "Montenegrin"
msgstr "Montenegrinisch"
-#: ../rules/base.xml.in.h:614
+#: ../rules/base.xml.in.h:615
msgid "Montenegrin (Cyrillic)"
msgstr "Montenegrinisch (kyrillisch)"
-#: ../rules/base.xml.in.h:615
+#: ../rules/base.xml.in.h:616
msgid "Montenegrin (Cyrillic, Z and ZHE swapped)"
msgstr "Montenegrinisch, (Kyrillisch, »З« und »Ж« vertauscht)"
-#: ../rules/base.xml.in.h:616
+#: ../rules/base.xml.in.h:617
msgid "Montenegrin (Latin Unicode)"
msgstr "Montenegrinisch (lateinisch, Unicode)"
-#: ../rules/base.xml.in.h:617
+#: ../rules/base.xml.in.h:618
msgid "Montenegrin (Latin qwerty)"
msgstr "Montenegrinisch (lateinische qwerty-Tastatur)"
-#: ../rules/base.xml.in.h:618
+#: ../rules/base.xml.in.h:619
msgid "Montenegrin (Latin Unicode qwerty)"
msgstr "Montenegrinisch (lateinische qwerty-Tastatur, Unicode)"
-#: ../rules/base.xml.in.h:619
+#: ../rules/base.xml.in.h:620
msgid "Montenegrin (Cyrillic with guillemets)"
msgstr "Montenegrinisch (Kyrillisch mit Anführungszeichen)"
-#: ../rules/base.xml.in.h:620
+#: ../rules/base.xml.in.h:621
msgid "Montenegrin (Latin with guillemets)"
msgstr "Montenegrinisch (lateinisch mit Anführungszeichen)"
#. Keyboard indicator for Macedonian layouts
-#: ../rules/base.xml.in.h:622
+#: ../rules/base.xml.in.h:623
msgid "mk"
msgstr "mk"
-#: ../rules/base.xml.in.h:623
+#: ../rules/base.xml.in.h:624
msgid "Macedonian"
msgstr "Mazedonisch"
-#: ../rules/base.xml.in.h:624
+#: ../rules/base.xml.in.h:625
msgid "Macedonian (eliminate dead keys)"
msgstr "Mazedonisch (ohne Akzenttasten)"
#. Keyboard indicator for Maltese layouts
-#: ../rules/base.xml.in.h:626
+#: ../rules/base.xml.in.h:627
msgid "mt"
msgstr "mt"
-#: ../rules/base.xml.in.h:627
+#: ../rules/base.xml.in.h:628
msgid "Maltese"
msgstr "Maltesisch"
-#: ../rules/base.xml.in.h:628
+#: ../rules/base.xml.in.h:629
msgid "Maltese (with US layout)"
msgstr "Maltesisch (mit US-Belegung)"
#. Keyboard indicator for Mongolian layouts
-#: ../rules/base.xml.in.h:630
+#: ../rules/base.xml.in.h:631
msgid "mn"
msgstr "mn"
-#: ../rules/base.xml.in.h:631
+#: ../rules/base.xml.in.h:632
msgid "Mongolian"
msgstr "Mongolisch"
#. Keyboard indicator for Norwegian layouts
-#: ../rules/base.xml.in.h:633 ../rules/base.extras.xml.in.h:101
+#: ../rules/base.xml.in.h:634 ../rules/base.extras.xml.in.h:102
msgid "no"
msgstr "no"
-#: ../rules/base.xml.in.h:634 ../rules/base.extras.xml.in.h:102
+#: ../rules/base.xml.in.h:635 ../rules/base.extras.xml.in.h:103
msgid "Norwegian"
msgstr "Norwegisch"
-#: ../rules/base.xml.in.h:635
+#: ../rules/base.xml.in.h:636
msgid "Norwegian (eliminate dead keys)"
msgstr "Norwegisch (ohne Akzenttasten)"
-#: ../rules/base.xml.in.h:636
+#: ../rules/base.xml.in.h:637
msgid "Norwegian (Dvorak)"
msgstr "Norwegisch (Dvorak)"
-#: ../rules/base.xml.in.h:637
+#: ../rules/base.xml.in.h:638
msgid "Northern Saami (Norway)"
msgstr "Nördliches Saami (Norwegen)"
-#: ../rules/base.xml.in.h:638
+#: ../rules/base.xml.in.h:639
msgid "Northern Saami (Norway, eliminate dead keys)"
msgstr "Nördliches Saami (Norwegen, ohne Akzenttasten)"
-#: ../rules/base.xml.in.h:639
+#: ../rules/base.xml.in.h:640
msgid "Norwegian (Macintosh)"
msgstr "Norwegisch (Macintosh)"
-#: ../rules/base.xml.in.h:640
+#: ../rules/base.xml.in.h:641
msgid "Norwegian (Macintosh, eliminate dead keys)"
msgstr "Norwegisch (Macintosh, ohne Akzenttasten)"
-#: ../rules/base.xml.in.h:641
+#: ../rules/base.xml.in.h:642
msgid "Norwegian (Colemak)"
msgstr "Norwegisch (Colemak)"
#. Keyboard indicator for Polish layouts
-#: ../rules/base.xml.in.h:643 ../rules/base.extras.xml.in.h:40
+#: ../rules/base.xml.in.h:644 ../rules/base.extras.xml.in.h:41
msgid "pl"
msgstr "pl"
-#: ../rules/base.xml.in.h:644 ../rules/base.extras.xml.in.h:41
+#: ../rules/base.xml.in.h:645 ../rules/base.extras.xml.in.h:42
msgid "Polish"
msgstr "Polnisch"
-#: ../rules/base.xml.in.h:645
+#: ../rules/base.xml.in.h:646
msgid "Polish (legacy)"
msgstr "Polnisch (veraltet)"
-#: ../rules/base.xml.in.h:646
+#: ../rules/base.xml.in.h:647
msgid "Polish (qwertz)"
msgstr "Polnisch (qwertz)"
-#: ../rules/base.xml.in.h:647
+#: ../rules/base.xml.in.h:648
msgid "Polish (Dvorak)"
msgstr "Polnisch (Dvorak)"
-#: ../rules/base.xml.in.h:648
+#: ../rules/base.xml.in.h:649
msgid "Polish (Dvorak, Polish quotes on quotemark key)"
msgstr "Polnisch (Dvorak, polnische Anführungszeichen auf Taste mit Zitatzeichen)"
-#: ../rules/base.xml.in.h:649
+#: ../rules/base.xml.in.h:650
msgid "Polish (Dvorak, Polish quotes on key 1)"
msgstr "Polnisch (Dvorak, polnische Anführungszeichen auf Taste 1)"
-#: ../rules/base.xml.in.h:650
+#: ../rules/base.xml.in.h:651
msgid "Kashubian"
msgstr "Kaschubisch"
-#: ../rules/base.xml.in.h:651
+#: ../rules/base.xml.in.h:652
msgid "Russian (Poland, phonetic Dvorak)"
msgstr "Russisch (Polen, phonetisch, Dvorak)"
-#: ../rules/base.xml.in.h:652
+#: ../rules/base.xml.in.h:653
msgid "Polish (programmer Dvorak)"
msgstr "Polnisch (Dvorak für Programmierer)"
-#: ../rules/base.xml.in.h:653 ../rules/base.extras.xml.in.h:104
+#: ../rules/base.xml.in.h:654 ../rules/base.extras.xml.in.h:105
msgid "Portuguese"
msgstr "Portugiesisch"
-#: ../rules/base.xml.in.h:654
+#: ../rules/base.xml.in.h:655
msgid "Portuguese (eliminate dead keys)"
msgstr "Portugiesisch (ohne Akzenttasten)"
-#: ../rules/base.xml.in.h:655
+#: ../rules/base.xml.in.h:656
msgid "Portuguese (Sun dead keys)"
msgstr "Portugiesisch (Sun-Akzenttasten)"
-#: ../rules/base.xml.in.h:656
+#: ../rules/base.xml.in.h:657
msgid "Portuguese (Macintosh)"
msgstr "Portugiesisch (Macintosh)"
-#: ../rules/base.xml.in.h:657
+#: ../rules/base.xml.in.h:658
msgid "Portuguese (Macintosh, eliminate dead keys)"
msgstr "Portugiesisch (Macintosh, ohne Akzenttasten)"
-#: ../rules/base.xml.in.h:658
+#: ../rules/base.xml.in.h:659
msgid "Portuguese (Macintosh, Sun dead keys)"
msgstr "Portugiesisch (Macintosh, Sun-Akzenttasten)"
-#: ../rules/base.xml.in.h:659
+#: ../rules/base.xml.in.h:660
msgid "Portuguese (Nativo)"
msgstr "Portugiesisch (Nativo)"
-#: ../rules/base.xml.in.h:660
+#: ../rules/base.xml.in.h:661
msgid "Portuguese (Nativo for US keyboards)"
msgstr "Portugiesisch (Nativo für US-Tastaturen)"
-#: ../rules/base.xml.in.h:661
+#: ../rules/base.xml.in.h:662
msgid "Esperanto (Portugal, Nativo)"
msgstr "Esperanto (Portugal, Nativo)"
#. Keyboard indicator for Romanian layouts
-#: ../rules/base.xml.in.h:663 ../rules/base.extras.xml.in.h:45
+#: ../rules/base.xml.in.h:664 ../rules/base.extras.xml.in.h:46
msgid "ro"
msgstr "ro"
-#: ../rules/base.xml.in.h:664 ../rules/base.extras.xml.in.h:46
+#: ../rules/base.xml.in.h:665 ../rules/base.extras.xml.in.h:47
msgid "Romanian"
msgstr "Rumänisch"
-#: ../rules/base.xml.in.h:665
+#: ../rules/base.xml.in.h:666
msgid "Romanian (cedilla)"
msgstr "Rumänisch (Cedilla)"
-#: ../rules/base.xml.in.h:666
+#: ../rules/base.xml.in.h:667
msgid "Romanian (standard)"
msgstr "Rumänisch (Standard)"
-#: ../rules/base.xml.in.h:667
+#: ../rules/base.xml.in.h:668
msgid "Romanian (standard cedilla)"
msgstr "Rumänisch (Standard Cedilla)"
-#: ../rules/base.xml.in.h:668
+#: ../rules/base.xml.in.h:669
msgid "Romanian (WinKeys)"
msgstr "Rumänisch (Windows-Tasten)"
-#: ../rules/base.xml.in.h:669 ../rules/base.extras.xml.in.h:55
+#: ../rules/base.xml.in.h:670 ../rules/base.extras.xml.in.h:56
msgid "Russian"
msgstr "Russisch"
-#: ../rules/base.xml.in.h:670
+#: ../rules/base.xml.in.h:671
msgid "Russian (phonetic)"
msgstr "Russisch (phonetisch)"
-#: ../rules/base.xml.in.h:671
+#: ../rules/base.xml.in.h:672
msgid "Russian (phonetic WinKeys)"
msgstr "Russisch (phonetisch mit Windows-Tasten)"
-#: ../rules/base.xml.in.h:672
+#: ../rules/base.xml.in.h:673
msgid "Russian (typewriter)"
msgstr "Russisch (Schreibmaschine)"
-#: ../rules/base.xml.in.h:673
+#: ../rules/base.xml.in.h:674
msgid "Russian (legacy)"
msgstr "Russisch (veraltet)"
-#: ../rules/base.xml.in.h:674
+#: ../rules/base.xml.in.h:675
msgid "Russian (typewriter, legacy)"
msgstr "Russisch (Schreibmaschine, veraltet)"
-#: ../rules/base.xml.in.h:675
+#: ../rules/base.xml.in.h:676
msgid "Tatar"
msgstr "Tatarisch"
-#: ../rules/base.xml.in.h:676
+#: ../rules/base.xml.in.h:677
msgid "Ossetian (legacy)"
msgstr "Ossetisch (veraltet)"
-#: ../rules/base.xml.in.h:677
+#: ../rules/base.xml.in.h:678
msgid "Ossetian (WinKeys)"
msgstr "Ossetisch (Windows-Tasten)"
-#: ../rules/base.xml.in.h:678
+#: ../rules/base.xml.in.h:679
msgid "Chuvash"
msgstr "Tschuwaschisch"
-#: ../rules/base.xml.in.h:679
+#: ../rules/base.xml.in.h:680
msgid "Chuvash (Latin)"
msgstr "Tschuwaschisch (lateinische Schrift)"
-#: ../rules/base.xml.in.h:680
+#: ../rules/base.xml.in.h:681
msgid "Udmurt"
msgstr "Udmurtisch"
-#: ../rules/base.xml.in.h:681
+#: ../rules/base.xml.in.h:682
msgid "Komi"
msgstr "Komi"
-#: ../rules/base.xml.in.h:682
+#: ../rules/base.xml.in.h:683
msgid "Yakut"
msgstr "Jakutisch"
-#: ../rules/base.xml.in.h:683
+#: ../rules/base.xml.in.h:684
msgid "Kalmyk"
msgstr "Kalmykisch"
-#: ../rules/base.xml.in.h:684
+#: ../rules/base.xml.in.h:685
msgid "Russian (DOS)"
msgstr "Russisch (DOS)"
-#: ../rules/base.xml.in.h:685
+#: ../rules/base.xml.in.h:686
msgid "Russian (Macintosh)"
msgstr "Russisch (Macintosh)"
-#: ../rules/base.xml.in.h:686
+#: ../rules/base.xml.in.h:687
msgid "Serbian (Russia)"
msgstr "Serbisch (Russland)"
-#: ../rules/base.xml.in.h:687
+#: ../rules/base.xml.in.h:688
msgid "Bashkirian"
msgstr "Baschkirisch"
-#: ../rules/base.xml.in.h:688
+#: ../rules/base.xml.in.h:689
msgid "Mari"
msgstr "Mari"
-#: ../rules/base.xml.in.h:689 ../rules/base.extras.xml.in.h:52
+#: ../rules/base.xml.in.h:690 ../rules/base.extras.xml.in.h:53
msgid "Serbian"
msgstr "Serbisch"
-#: ../rules/base.xml.in.h:690
+#: ../rules/base.xml.in.h:691
msgid "Serbian (Cyrillic, Z and ZHE swapped)"
msgstr "Serbisch, (Kyrillisch, »З« und »Ж« vertauscht)"
-#: ../rules/base.xml.in.h:691
+#: ../rules/base.xml.in.h:692
msgid "Serbian (Latin)"
msgstr "Serbisch (Lateinisch)"
-#: ../rules/base.xml.in.h:692
+#: ../rules/base.xml.in.h:693
msgid "Serbian (Latin Unicode)"
msgstr "Serbisch (Lateinisch Unicode)"
-#: ../rules/base.xml.in.h:693
+#: ../rules/base.xml.in.h:694
msgid "Serbian (Latin qwerty)"
msgstr "Serbisch (Lateinische qwerty-Tastatur)"
-#: ../rules/base.xml.in.h:694
+#: ../rules/base.xml.in.h:695
msgid "Serbian (Latin Unicode qwerty)"
msgstr "Serbisch (lateinische qwerty-Tastatur, Unicode)"
-#: ../rules/base.xml.in.h:695
+#: ../rules/base.xml.in.h:696
msgid "Serbian (Cyrillic with guillemets)"
msgstr "Serbisch (Kyrillisch mit Anführungszeichen)"
-#: ../rules/base.xml.in.h:696
+#: ../rules/base.xml.in.h:697
msgid "Serbian (Latin with guillemets)"
msgstr "Serbisch (Lateinisch mit Anführungszeichen)"
-#: ../rules/base.xml.in.h:697
-msgid "Pannonian Rusyn (homophonic)"
-msgstr "Pannonisches Russinisch (homophon)"
+#: ../rules/base.xml.in.h:698
+msgid "Pannonian Rusyn"
+msgstr "Pannonisches Russinisch"
#. Keyboard indicator for Slovenian layouts
-#: ../rules/base.xml.in.h:699
+#: ../rules/base.xml.in.h:700
msgid "sl"
msgstr "sl"
-#: ../rules/base.xml.in.h:700
+#: ../rules/base.xml.in.h:701
msgid "Slovenian"
msgstr "Slowenisch"
-#: ../rules/base.xml.in.h:701
+#: ../rules/base.xml.in.h:702
msgid "Slovenian (use guillemets for quotes)"
msgstr "Slowenisch (Anführungszeichen für Zitate verwenden)"
-#: ../rules/base.xml.in.h:702
+#: ../rules/base.xml.in.h:703
msgid "Slovenian (US keyboard with Slovenian letters)"
msgstr "Slowenisch (US-Tastatur mit slowenischen Buchstaben)"
#. Keyboard indicator for Slovak layouts
-#: ../rules/base.xml.in.h:704 ../rules/base.extras.xml.in.h:106
+#: ../rules/base.xml.in.h:705 ../rules/base.extras.xml.in.h:107
msgid "sk"
msgstr "sk"
-#: ../rules/base.xml.in.h:705 ../rules/base.extras.xml.in.h:107
+#: ../rules/base.xml.in.h:706 ../rules/base.extras.xml.in.h:108
msgid "Slovak"
msgstr "Slowakisch"
-#: ../rules/base.xml.in.h:706
+#: ../rules/base.xml.in.h:707
msgid "Slovak (extended Backslash)"
msgstr "Slowakisch (erweiterter Backslash)"
-#: ../rules/base.xml.in.h:707
+#: ../rules/base.xml.in.h:708
msgid "Slovak (qwerty)"
msgstr "Slowakisch (qwerty)"
-#: ../rules/base.xml.in.h:708
+#: ../rules/base.xml.in.h:709
msgid "Slovak (qwerty, extended Backslash)"
msgstr "Slowakisch (qwerty, erweiterter Backslash)"
-#: ../rules/base.xml.in.h:709 ../rules/base.extras.xml.in.h:110
+#: ../rules/base.xml.in.h:710 ../rules/base.extras.xml.in.h:111
msgid "Spanish"
msgstr "Spanisch"
-#: ../rules/base.xml.in.h:710
+#: ../rules/base.xml.in.h:711
msgid "Spanish (eliminate dead keys)"
msgstr "Spanisch (ohne Akzenttasten)"
-#: ../rules/base.xml.in.h:711
+#: ../rules/base.xml.in.h:712
msgid "Spanish (include dead tilde)"
msgstr "Spanisch (Akzent-Tilde einschließen)"
-#: ../rules/base.xml.in.h:712
+#: ../rules/base.xml.in.h:713
msgid "Spanish (Sun dead keys)"
msgstr "Spanisch (Sun-Akzenttasten)"
-#: ../rules/base.xml.in.h:713
+#: ../rules/base.xml.in.h:714
msgid "Spanish (Dvorak)"
msgstr "Spanisch (Dvorak)"
-#: ../rules/base.xml.in.h:714
+#: ../rules/base.xml.in.h:715
msgid "Asturian (Spain, with bottom-dot H and bottom-dot L)"
msgstr "Asturisch (Spanien, mit unterpunktetem L und H)"
-#: ../rules/base.xml.in.h:715
+#: ../rules/base.xml.in.h:716
msgid "Catalan (Spain, with middle-dot L)"
msgstr "Katalanisch (Spanische Variante mit mittelpunktiertem L)"
-#: ../rules/base.xml.in.h:716
+#: ../rules/base.xml.in.h:717
msgid "Spanish (Macintosh)"
msgstr "Spanisch (Macintosh)"
#. Keyboard indicator for Swedish layouts
-#: ../rules/base.xml.in.h:718 ../rules/base.extras.xml.in.h:112
+#: ../rules/base.xml.in.h:719 ../rules/base.extras.xml.in.h:113
msgid "sv"
msgstr "sv"
-#: ../rules/base.xml.in.h:719 ../rules/base.extras.xml.in.h:113
+#: ../rules/base.xml.in.h:720 ../rules/base.extras.xml.in.h:114
msgid "Swedish"
msgstr "Schwedisch"
-#: ../rules/base.xml.in.h:720
+#: ../rules/base.xml.in.h:721
msgid "Swedish (eliminate dead keys)"
msgstr "Schwedisch (ohne Akzenttasten)"
-#: ../rules/base.xml.in.h:721
+#: ../rules/base.xml.in.h:722
msgid "Swedish (Dvorak)"
msgstr "Schwedisch (Dvorak)"
-#: ../rules/base.xml.in.h:722
+#: ../rules/base.xml.in.h:723
msgid "Russian (Sweden, phonetic)"
msgstr "Russisch (Schweden, phonetisch)"
-#: ../rules/base.xml.in.h:723
+#: ../rules/base.xml.in.h:724
msgid "Russian (Sweden, phonetic, eliminate dead keys)"
msgstr "Russisch (Schweden, phonetisch, ohne Akzenttasten)"
-#: ../rules/base.xml.in.h:724
+#: ../rules/base.xml.in.h:725
msgid "Northern Saami (Sweden)"
msgstr "Nördliches Saami (Schweden)"
-#: ../rules/base.xml.in.h:725
+#: ../rules/base.xml.in.h:726
msgid "Swedish (Macintosh)"
msgstr "Schwedisch (Macintosh)"
-#: ../rules/base.xml.in.h:726
+#: ../rules/base.xml.in.h:727
msgid "Swedish (Svdvorak)"
msgstr "Schwedisch (Svdvorak)"
-#: ../rules/base.xml.in.h:727
+#: ../rules/base.xml.in.h:728
msgid "Swedish Sign Language"
msgstr "Schwedische Gebärdensprache"
-#: ../rules/base.xml.in.h:728 ../rules/base.extras.xml.in.h:115
+#: ../rules/base.xml.in.h:729 ../rules/base.extras.xml.in.h:116
msgid "German (Switzerland)"
msgstr "Deutsch (Schweiz)"
-#: ../rules/base.xml.in.h:729
+#: ../rules/base.xml.in.h:730
msgid "German (Switzerland, legacy)"
msgstr "Deutsch (Schweiz, veraltet)"
-#: ../rules/base.xml.in.h:730
+#: ../rules/base.xml.in.h:731
msgid "German (Switzerland, eliminate dead keys)"
msgstr "Deutsch (Schweiz, ohne Akzenttasten)"
-#: ../rules/base.xml.in.h:731
+#: ../rules/base.xml.in.h:732
msgid "German (Switzerland, Sun dead keys)"
msgstr "Deutsch (Schweiz, Sun-Akzenttasten)"
-#: ../rules/base.xml.in.h:732
+#: ../rules/base.xml.in.h:733
msgid "French (Switzerland)"
msgstr "Französisch (Schweiz)"
-#: ../rules/base.xml.in.h:733
+#: ../rules/base.xml.in.h:734
msgid "French (Switzerland, eliminate dead keys)"
msgstr "Französisch (Schweiz, ohne Akzenttasten)"
-#: ../rules/base.xml.in.h:734
+#: ../rules/base.xml.in.h:735
msgid "French (Switzerland, Sun dead keys)"
msgstr "Französisch (Schweiz, Sun-Akzenttasten)"
-#: ../rules/base.xml.in.h:735
+#: ../rules/base.xml.in.h:736
msgid "French (Switzerland, Macintosh)"
msgstr "Französisch (Schweiz, Macintosh)"
-#: ../rules/base.xml.in.h:736
+#: ../rules/base.xml.in.h:737
msgid "German (Switzerland, Macintosh)"
msgstr "Deutsch (Schweiz, Macintosh)"
-#: ../rules/base.xml.in.h:737
+#: ../rules/base.xml.in.h:738
msgid "Arabic (Syria)"
msgstr "Arabisch (Syrien)"
#. Keyboard indicator for Syriac layouts
-#: ../rules/base.xml.in.h:739
+#: ../rules/base.xml.in.h:740
msgid "syc"
msgstr "syc"
-#: ../rules/base.xml.in.h:740
+#: ../rules/base.xml.in.h:741
msgid "Syriac"
msgstr "Syrisch"
-#: ../rules/base.xml.in.h:741
+#: ../rules/base.xml.in.h:742
msgid "Syriac (phonetic)"
msgstr "Syrisch (phonetisch)"
-#: ../rules/base.xml.in.h:742
+#: ../rules/base.xml.in.h:743
msgid "Kurdish (Syria, Latin Q)"
msgstr "Kurdisch (Syrien, lateinisches Q)"
-#: ../rules/base.xml.in.h:743
+#: ../rules/base.xml.in.h:744
msgid "Kurdish (Syria, F)"
msgstr "Kurdisch (Syrien, F)"
-#: ../rules/base.xml.in.h:744
+#: ../rules/base.xml.in.h:745
msgid "Kurdish (Syria, Latin Alt-Q)"
msgstr "Kurdisch (Syrien, lateinisches Alt-Q)"
#. Keyboard indicator for Tajik layouts
-#: ../rules/base.xml.in.h:746
+#: ../rules/base.xml.in.h:747
msgid "tg"
msgstr "tg"
-#: ../rules/base.xml.in.h:747
+#: ../rules/base.xml.in.h:748
msgid "Tajik"
msgstr "Tadschikisch"
-#: ../rules/base.xml.in.h:748
+#: ../rules/base.xml.in.h:749
msgid "Tajik (legacy)"
msgstr "Tadschikisch (veraltet)"
#. Keyboard indicator for Sinhala layouts
-#: ../rules/base.xml.in.h:750
+#: ../rules/base.xml.in.h:751
msgid "si"
msgstr "si"
-#: ../rules/base.xml.in.h:751
+#: ../rules/base.xml.in.h:752
msgid "Sinhala (phonetic)"
msgstr "Sinhala (phonetisch)"
-#: ../rules/base.xml.in.h:752
+#: ../rules/base.xml.in.h:753
msgid "Tamil (Sri Lanka, Unicode)"
msgstr "Tamilisch (Sri Lanka, Unicode)"
-#: ../rules/base.xml.in.h:753
+#: ../rules/base.xml.in.h:754
msgid "Tamil (Sri Lanka, TAB Typewriter)"
msgstr "Tamilisch (Sri Lanka, TAB Schreibmaschine)"
#. Keyboard indicator for Thai layouts
-#: ../rules/base.xml.in.h:755
+#: ../rules/base.xml.in.h:756
msgid "th"
msgstr "th"
-#: ../rules/base.xml.in.h:756
+#: ../rules/base.xml.in.h:757
msgid "Thai"
msgstr "Thailändisch"
-#: ../rules/base.xml.in.h:757
+#: ../rules/base.xml.in.h:758
msgid "Thai (TIS-820.2538)"
msgstr "Thailändisch (TIS-820.2538)"
-#: ../rules/base.xml.in.h:758
+#: ../rules/base.xml.in.h:759
msgid "Thai (Pattachote)"
msgstr "Thailändisch (Pattachote)"
#. Keyboard indicator for Turkish layouts
-#: ../rules/base.xml.in.h:760 ../rules/base.extras.xml.in.h:118
+#: ../rules/base.xml.in.h:761 ../rules/base.extras.xml.in.h:119
msgid "tr"
msgstr "tr"
-#: ../rules/base.xml.in.h:761 ../rules/base.extras.xml.in.h:119
+#: ../rules/base.xml.in.h:762 ../rules/base.extras.xml.in.h:120
msgid "Turkish"
msgstr "Türkisch"
-#: ../rules/base.xml.in.h:762
+#: ../rules/base.xml.in.h:763
msgid "Turkish (F)"
msgstr "Türkisch, (F)"
-#: ../rules/base.xml.in.h:763
+#: ../rules/base.xml.in.h:764
msgid "Turkish (Alt-Q)"
msgstr "Türkisch (Alt-Q)"
-#: ../rules/base.xml.in.h:764
+#: ../rules/base.xml.in.h:765
msgid "Turkish (Sun dead keys)"
msgstr "Türkisch (Sun-Akzenttasten)"
-#: ../rules/base.xml.in.h:765
+#: ../rules/base.xml.in.h:766
msgid "Kurdish (Turkey, Latin Q)"
msgstr "Kurdisch (Türkei, lateinisches Q)"
-#: ../rules/base.xml.in.h:766
+#: ../rules/base.xml.in.h:767
msgid "Kurdish (Turkey, F)"
msgstr "Kurdisch (Türkei, F)"
-#: ../rules/base.xml.in.h:767
+#: ../rules/base.xml.in.h:768
msgid "Kurdish (Turkey, Latin Alt-Q)"
msgstr "Kurdisch (Türkei, lateinisches Alt-Q)"
-#: ../rules/base.xml.in.h:768
+#: ../rules/base.xml.in.h:769
msgid "Turkish (international with dead keys)"
msgstr "Türkisch (International, mit Akzenttasten)"
#. Keyboard indicator for Crimean Tatar layouts
-#: ../rules/base.xml.in.h:770 ../rules/base.extras.xml.in.h:47
+#: ../rules/base.xml.in.h:771 ../rules/base.extras.xml.in.h:48
msgid "crh"
msgstr "crh"
-#: ../rules/base.xml.in.h:771
+#: ../rules/base.xml.in.h:772
msgid "Crimean Tatar (Turkish Q)"
msgstr "Krimtatarisch (Türkisch Q)"
-#: ../rules/base.xml.in.h:772
+#: ../rules/base.xml.in.h:773
msgid "Crimean Tatar (Turkish F)"
msgstr "Krimtatarisch (Türkisch F)"
-#: ../rules/base.xml.in.h:773
+#: ../rules/base.xml.in.h:774
msgid "Crimean Tatar (Turkish Alt-Q)"
msgstr "Krimtatarisch (Türkisch Alt-Q)"
-#: ../rules/base.xml.in.h:774
+#: ../rules/base.xml.in.h:775
msgid "Taiwanese"
msgstr "Taiwanesisch"
-#: ../rules/base.xml.in.h:775
+#: ../rules/base.xml.in.h:776
msgid "Taiwanese (indigenous)"
msgstr "Taiwanesisch (indigen)"
#. Keyboard indicator for Saisiyat layouts
-#: ../rules/base.xml.in.h:777
+#: ../rules/base.xml.in.h:778
msgid "xsy"
msgstr "xsy"
-#: ../rules/base.xml.in.h:778
+#: ../rules/base.xml.in.h:779
msgid "Saisiyat (Taiwan)"
msgstr "Saisiyat (Taiwan)"
#. Keyboard indicator for Ukranian layouts
-#: ../rules/base.xml.in.h:780 ../rules/base.extras.xml.in.h:121
+#: ../rules/base.xml.in.h:781 ../rules/base.extras.xml.in.h:122
msgid "uk"
msgstr "uk"
-#: ../rules/base.xml.in.h:781 ../rules/base.extras.xml.in.h:122
+#: ../rules/base.xml.in.h:782 ../rules/base.extras.xml.in.h:123
msgid "Ukrainian"
msgstr "Ukrainisch"
-#: ../rules/base.xml.in.h:782
+#: ../rules/base.xml.in.h:783
msgid "Ukrainian (phonetic)"
msgstr "Ukrainisch (phonetisch)"
-#: ../rules/base.xml.in.h:783
+#: ../rules/base.xml.in.h:784
msgid "Ukrainian (typewriter)"
msgstr "Ukrainisch (Schreibmaschine)"
-#: ../rules/base.xml.in.h:784
+#: ../rules/base.xml.in.h:785
msgid "Ukrainian (WinKeys)"
msgstr "Ukrainisch (Windows-Tasten)"
-#: ../rules/base.xml.in.h:785
+#: ../rules/base.xml.in.h:786
msgid "Ukrainian (legacy)"
msgstr "Ukrainisch (veraltet)"
-#: ../rules/base.xml.in.h:786
+#: ../rules/base.xml.in.h:787
msgid "Ukrainian (standard RSTU)"
msgstr "Ukrainisch (Standard-RSTU)"
-#: ../rules/base.xml.in.h:787
+#: ../rules/base.xml.in.h:788
msgid "Russian (Ukraine, standard RSTU)"
msgstr "Russisch (Ukraine, Standard-RSTU)"
-#: ../rules/base.xml.in.h:788
+#: ../rules/base.xml.in.h:789
msgid "Ukrainian (homophonic)"
msgstr "Ukrainisch (homophon)"
-#: ../rules/base.xml.in.h:789 ../rules/base.extras.xml.in.h:124
+#: ../rules/base.xml.in.h:790 ../rules/base.extras.xml.in.h:125
msgid "English (UK)"
msgstr "Englisch (Britisch)"
-#: ../rules/base.xml.in.h:790
+#: ../rules/base.xml.in.h:791
msgid "English (UK, extended WinKeys)"
msgstr "Englisch (Britisch erweitert, Windows-Tasten)"
-#: ../rules/base.xml.in.h:791
+#: ../rules/base.xml.in.h:792
msgid "English (UK, international with dead keys)"
msgstr "Englisch (Britisch international, mit Akzenttasten)"
-#: ../rules/base.xml.in.h:792
+#: ../rules/base.xml.in.h:793
msgid "English (UK, Dvorak)"
msgstr "Englisch (Britisch, Dvorak)"
-#: ../rules/base.xml.in.h:793
+#: ../rules/base.xml.in.h:794
msgid "English (UK, Dvorak with UK punctuation)"
msgstr "Englisch (Dvorak mit britischer Punktierung)"
-#: ../rules/base.xml.in.h:794
+#: ../rules/base.xml.in.h:795
msgid "English (UK, Macintosh)"
msgstr "Englisch (Britisch, Macintosh)"
-#: ../rules/base.xml.in.h:795
+#: ../rules/base.xml.in.h:796
msgid "English (UK, Macintosh international)"
msgstr "Englisch (Britisch, Macintosh international)"
-#: ../rules/base.xml.in.h:796
+#: ../rules/base.xml.in.h:797
msgid "English (UK, Colemak)"
msgstr "English (Britisch, Colemak)"
-#: ../rules/base.xml.in.h:797
+#: ../rules/base.xml.in.h:798
msgid "Uzbek"
msgstr "Usbekisch"
-#: ../rules/base.xml.in.h:798
+#: ../rules/base.xml.in.h:799
msgid "Uzbek (Latin)"
msgstr "Usbekisch (lateinische Schrift)"
#. Keyboard indicator for Vietnamese layouts
-#: ../rules/base.xml.in.h:800
+#: ../rules/base.xml.in.h:801
msgid "vi"
msgstr "vi"
-#: ../rules/base.xml.in.h:801
+#: ../rules/base.xml.in.h:802
msgid "Vietnamese"
msgstr "Vietnamesisch"
#. Keyboard indicator for Korean layouts
-#: ../rules/base.xml.in.h:803 ../rules/base.extras.xml.in.h:126
+#: ../rules/base.xml.in.h:804 ../rules/base.extras.xml.in.h:127
msgid "ko"
msgstr "ko"
-#: ../rules/base.xml.in.h:804 ../rules/base.extras.xml.in.h:127
+#: ../rules/base.xml.in.h:805 ../rules/base.extras.xml.in.h:128
msgid "Korean"
msgstr "Koreanisch"
-#: ../rules/base.xml.in.h:805
+#: ../rules/base.xml.in.h:806
msgid "Korean (101/104 key compatible)"
msgstr "Koreanisch (101/104-Tasten kompatibel)"
-#: ../rules/base.xml.in.h:806
+#: ../rules/base.xml.in.h:807
msgid "Japanese (PC-98xx Series)"
msgstr "Japanisch (PC-98xx-Serie)"
#. Keyboard indicator for Irish layouts
-#: ../rules/base.xml.in.h:808
+#: ../rules/base.xml.in.h:809
msgid "ie"
msgstr "ie"
-#: ../rules/base.xml.in.h:809
+#: ../rules/base.xml.in.h:810
msgid "Irish"
msgstr "Irisch"
-#: ../rules/base.xml.in.h:810
+#: ../rules/base.xml.in.h:811
msgid "CloGaelach"
msgstr "CloGaelach"
-#: ../rules/base.xml.in.h:811
+#: ../rules/base.xml.in.h:812
msgid "Irish (UnicodeExpert)"
msgstr "Irisch (UnicodeExpert)"
-#: ../rules/base.xml.in.h:812
+#: ../rules/base.xml.in.h:813
msgid "Ogham"
msgstr "Ogham"
-#: ../rules/base.xml.in.h:813
+#: ../rules/base.xml.in.h:814
msgid "Ogham (IS434)"
msgstr "Ogham (IS434)"
-#: ../rules/base.xml.in.h:814
+#: ../rules/base.xml.in.h:815
msgid "Urdu (Pakistan)"
msgstr "Urdu (Pakistan)"
-#: ../rules/base.xml.in.h:815
+#: ../rules/base.xml.in.h:816
msgid "Urdu (Pakistan, CRULP)"
msgstr "Urdu (Pakistan, CRULP)"
-#: ../rules/base.xml.in.h:816
+#: ../rules/base.xml.in.h:817
msgid "Urdu (Pakistan, NLA)"
msgstr "Urdu (Pakistan, NLA)"
-#: ../rules/base.xml.in.h:817
+#: ../rules/base.xml.in.h:818
msgid "Arabic (Pakistan)"
msgstr "Arabisch (Pakistan)"
#. Keyboard indicator for Sindhi layouts
-#: ../rules/base.xml.in.h:819
+#: ../rules/base.xml.in.h:820
msgid "sd"
msgstr "sd"
-#: ../rules/base.xml.in.h:820
+#: ../rules/base.xml.in.h:821
msgid "Sindhi"
msgstr "Sindhi"
#. Keyboard indicator for Dhivehi layouts
-#: ../rules/base.xml.in.h:822
+#: ../rules/base.xml.in.h:823
msgid "dv"
msgstr "dv"
-#: ../rules/base.xml.in.h:823
+#: ../rules/base.xml.in.h:824
msgid "Dhivehi"
msgstr "Dhivehi"
-#: ../rules/base.xml.in.h:824
+#: ../rules/base.xml.in.h:825
msgid "English (South Africa)"
msgstr "Englisch (Südafrika)"
#. Keyboard indicator for Esperanto layouts
-#: ../rules/base.xml.in.h:826
+#: ../rules/base.xml.in.h:827
msgid "eo"
msgstr "eo"
-#: ../rules/base.xml.in.h:827
+#: ../rules/base.xml.in.h:828
msgid "Esperanto"
msgstr "Esperanto"
-#: ../rules/base.xml.in.h:828
+#: ../rules/base.xml.in.h:829
msgid "Esperanto (displaced semicolon and quote, obsolete)"
msgstr "Esperanto (falsch platziertes Semikolon und Anführungszeichen, veraltet)"
#. Keyboard indicator for Nepali layouts
-#: ../rules/base.xml.in.h:830
+#: ../rules/base.xml.in.h:831
msgid "ne"
msgstr "ne"
-#: ../rules/base.xml.in.h:831
+#: ../rules/base.xml.in.h:832
msgid "Nepali"
msgstr "Nepalesisch"
-#: ../rules/base.xml.in.h:832
+#: ../rules/base.xml.in.h:833
msgid "English (Nigeria)"
msgstr "Englisch (Nigeria)"
#. Keyboard indicator for Igbo layouts
-#: ../rules/base.xml.in.h:834
+#: ../rules/base.xml.in.h:835
msgid "ig"
msgstr "ig"
-#: ../rules/base.xml.in.h:835
+#: ../rules/base.xml.in.h:836
msgid "Igbo"
msgstr "Igbo"
#. Keyboard indicator for Yoruba layouts
-#: ../rules/base.xml.in.h:837
+#: ../rules/base.xml.in.h:838
msgid "yo"
msgstr "yo"
-#: ../rules/base.xml.in.h:838
+#: ../rules/base.xml.in.h:839
msgid "Yoruba"
msgstr "Joruba"
#. Keyboard indicator for Amharic layouts
-#: ../rules/base.xml.in.h:840
+#: ../rules/base.xml.in.h:841
msgid "am"
msgstr "am"
-#: ../rules/base.xml.in.h:841
+#: ../rules/base.xml.in.h:842
msgid "Amharic"
msgstr "Amharisch"
#. Keyboard indicator for Wolof layouts
-#: ../rules/base.xml.in.h:843
+#: ../rules/base.xml.in.h:844
msgid "wo"
msgstr "wo"
-#: ../rules/base.xml.in.h:844
+#: ../rules/base.xml.in.h:845
msgid "Wolof"
msgstr "Wolof"
#. Keyboard indicator for Braille layouts
-#: ../rules/base.xml.in.h:846
+#: ../rules/base.xml.in.h:847
msgid "brl"
msgstr "brl"
-#: ../rules/base.xml.in.h:847
+#: ../rules/base.xml.in.h:848
msgid "Braille"
msgstr "Braille"
-#: ../rules/base.xml.in.h:848
+#: ../rules/base.xml.in.h:849
msgid "Braille (left hand)"
msgstr "Braille (linkshändig)"
-#: ../rules/base.xml.in.h:849
+#: ../rules/base.xml.in.h:850
msgid "Braille (right hand)"
msgstr "Braille (rechtshändig)"
#. Keyboard indicator for Turkmen layouts
-#: ../rules/base.xml.in.h:851
+#: ../rules/base.xml.in.h:852
msgid "tk"
msgstr "tk"
-#: ../rules/base.xml.in.h:852
+#: ../rules/base.xml.in.h:853
msgid "Turkmen"
msgstr "Turkmenisch"
-#: ../rules/base.xml.in.h:853
+#: ../rules/base.xml.in.h:854
msgid "Turkmen (Alt-Q)"
msgstr "Turkmenisch (Alt-Q)"
#. Keyboard indicator for Bambara layouts
-#: ../rules/base.xml.in.h:855
+#: ../rules/base.xml.in.h:856
msgid "bm"
msgstr "bm"
-#: ../rules/base.xml.in.h:856
+#: ../rules/base.xml.in.h:857
msgid "Bambara"
msgstr "Bambara"
-#: ../rules/base.xml.in.h:857
+#: ../rules/base.xml.in.h:858
msgid "French (Mali, alternative)"
msgstr "Französisch (Mali, Alternative)"
-#: ../rules/base.xml.in.h:858
+#: ../rules/base.xml.in.h:859
msgid "English (Mali, US Macintosh)"
msgstr "Englisch (Mali, USA Macintosh)"
-#: ../rules/base.xml.in.h:859
+#: ../rules/base.xml.in.h:860
msgid "English (Mali, US international)"
msgstr "Englisch (Mali, USA International)"
#. Keyboard indicator for Swahili layouts
-#: ../rules/base.xml.in.h:861
+#: ../rules/base.xml.in.h:862
msgid "sw"
msgstr "sw"
-#: ../rules/base.xml.in.h:862
+#: ../rules/base.xml.in.h:863
msgid "Swahili (Tanzania)"
msgstr "Swahili (Tansania)"
-#: ../rules/base.xml.in.h:863
+#: ../rules/base.xml.in.h:864
msgid "Swahili (Kenya)"
msgstr "Swahili (Kenia)"
-#: ../rules/base.xml.in.h:864
+#: ../rules/base.xml.in.h:865
msgid "Kikuyu"
msgstr "Kikuyu"
#. Keyboard indicator for Tswana layouts
-#: ../rules/base.xml.in.h:866
+#: ../rules/base.xml.in.h:867
msgid "tn"
msgstr "tn"
-#: ../rules/base.xml.in.h:867
+#: ../rules/base.xml.in.h:868
msgid "Tswana"
msgstr "Tswana"
#. Keyboard indicator for Filipino layouts
-#: ../rules/base.xml.in.h:869
+#: ../rules/base.xml.in.h:870
msgid "ph"
msgstr "ph"
-#: ../rules/base.xml.in.h:870
+#: ../rules/base.xml.in.h:871
msgid "Filipino"
msgstr "Philippinisch"
-#: ../rules/base.xml.in.h:871
+#: ../rules/base.xml.in.h:872
msgid "Filipino (QWERTY Baybayin)"
msgstr "Philippinisch (QWERTY, Baybayin)"
-#: ../rules/base.xml.in.h:872
+#: ../rules/base.xml.in.h:873
msgid "Filipino (Capewell-Dvorak Latin)"
msgstr "Philippinisch (Capewell-Dvorak, Lateinisch)"
-#: ../rules/base.xml.in.h:873
+#: ../rules/base.xml.in.h:874
msgid "Filipino (Capewell-Dvorak Baybayin)"
msgstr "Philippinisch (Capewell-Dvorak, Baybayin)"
-#: ../rules/base.xml.in.h:874
+#: ../rules/base.xml.in.h:875
msgid "Filipino (Capewell-QWERF 2006 Latin)"
msgstr "Philippinisch (Capewell-QWERF 2006, lateinisch)"
-#: ../rules/base.xml.in.h:875
+#: ../rules/base.xml.in.h:876
msgid "Filipino (Capewell-QWERF 2006 Baybayin)"
msgstr "Philippinisch (Capewell-QWERF 2006, Baybayin)"
-#: ../rules/base.xml.in.h:876
+#: ../rules/base.xml.in.h:877
msgid "Filipino (Colemak Latin)"
msgstr "Philippinisch (Colemak, lateinisch)"
-#: ../rules/base.xml.in.h:877
+#: ../rules/base.xml.in.h:878
msgid "Filipino (Colemak Baybayin)"
msgstr "Philippinisch (Colemak, Baybayin)"
-#: ../rules/base.xml.in.h:878
+#: ../rules/base.xml.in.h:879
msgid "Filipino (Dvorak Latin)"
msgstr "Philippinisch (Dvorak, lateinisch)"
-#: ../rules/base.xml.in.h:879
+#: ../rules/base.xml.in.h:880
msgid "Filipino (Dvorak Baybayin)"
msgstr "Philippinisch (Dvorak, Baybayin)"
-#: ../rules/base.xml.in.h:880
+#: ../rules/base.xml.in.h:881
msgid "md"
msgstr "md"
-#: ../rules/base.xml.in.h:881
+#: ../rules/base.xml.in.h:882
msgid "Moldavian"
msgstr "Moldawisch"
-#: ../rules/base.xml.in.h:882
+#: ../rules/base.xml.in.h:883
msgid "gag"
msgstr "gag"
-#: ../rules/base.xml.in.h:883
+#: ../rules/base.xml.in.h:884
msgid "Moldavian (Gagauz)"
msgstr "Moldauisch (Gagauz)"
-#: ../rules/base.xml.in.h:884
+#: ../rules/base.xml.in.h:885
msgid "Switching to another layout"
msgstr "Wechseln in eine andere Belegung"
-#: ../rules/base.xml.in.h:885
+#: ../rules/base.xml.in.h:886
msgid "Right Alt (while pressed)"
msgstr "Rechte Alt-Taste (gedrückt halten)"
-#: ../rules/base.xml.in.h:886
+#: ../rules/base.xml.in.h:887
msgid "Left Alt (while pressed)"
msgstr "Linke Alt-Taste (gedrückt halten)"
-#: ../rules/base.xml.in.h:887
+#: ../rules/base.xml.in.h:888
msgid "Left Win (while pressed)"
msgstr "Linke Windows-Taste (gedrückt halten)"
-#: ../rules/base.xml.in.h:888
+#: ../rules/base.xml.in.h:889
msgid "Right Win (while pressed)"
msgstr "Rechte Windows-Taste (gedrückt halten)"
-#: ../rules/base.xml.in.h:889
+#: ../rules/base.xml.in.h:890
msgid "Any Win key (while pressed)"
msgstr "Beliebige Windows-Taste (gedrückt halten)"
-#: ../rules/base.xml.in.h:890
+#: ../rules/base.xml.in.h:891
msgid "Caps Lock (while pressed), Alt+Caps Lock does the original capslock action"
msgstr "Feststelltaste (gedrückt halten), Alt+Feststelltaste führen die normale Feststelltasten-Aktion aus"
-#: ../rules/base.xml.in.h:891
+#: ../rules/base.xml.in.h:892
msgid "Right Ctrl (while pressed)"
msgstr "Rechte Strg-Taste (gedrückt halten)"
-#: ../rules/base.xml.in.h:892
+#: ../rules/base.xml.in.h:893
msgid "Right Alt"
msgstr "Rechte Alt-Taste"
-#: ../rules/base.xml.in.h:893
+#: ../rules/base.xml.in.h:894
msgid "Left Alt"
msgstr "Linke Alt-Taste"
-#: ../rules/base.xml.in.h:894
+#: ../rules/base.xml.in.h:895
msgid "Caps Lock"
msgstr "Feststelltaste"
-#: ../rules/base.xml.in.h:895
+#: ../rules/base.xml.in.h:896
msgid "Shift+Caps Lock"
msgstr "Umschalt-+Feststelltaste"
-#: ../rules/base.xml.in.h:896
+#: ../rules/base.xml.in.h:897
msgid "Caps Lock (to first layout), Shift+Caps Lock (to last layout)"
msgstr "Feststelltaste (zur ersten Belegung), Umschalttaste+Feststelltaste (zur letzten Belegung)"
-#: ../rules/base.xml.in.h:897
+#: ../rules/base.xml.in.h:898
msgid "Left Win (to first layout), Right Win/Menu (to last layout)"
msgstr "Linke Windows-Taste (zur ersten Belegung), rechte Windows/Menütaste (zur letzten Belegung)"
-#: ../rules/base.xml.in.h:898
+#: ../rules/base.xml.in.h:899
msgid "Left Ctrl (to first layout), Right Ctrl (to last layout)"
msgstr "Linke Strg-Taste (zur ersten Belegung), rechte Strg-Taste (zur letzten Belegung)"
-#: ../rules/base.xml.in.h:899
+#: ../rules/base.xml.in.h:900
msgid "Alt+Caps Lock"
msgstr "Alt+Feststelltaste"
-#: ../rules/base.xml.in.h:900
+#: ../rules/base.xml.in.h:901
msgid "Both Shift keys together"
msgstr "Beide Umschalttasten gleichzeitig"
-#: ../rules/base.xml.in.h:901
+#: ../rules/base.xml.in.h:902
msgid "Both Alt keys together"
msgstr "Beide Alt-Tasten gleichzeitig"
-#: ../rules/base.xml.in.h:902
+#: ../rules/base.xml.in.h:903
msgid "Both Ctrl keys together"
msgstr "Beide Steuerungstasten gleichzeitig"
-#: ../rules/base.xml.in.h:903
+#: ../rules/base.xml.in.h:904
msgid "Ctrl+Shift"
msgstr "Strg+Umschalttaste"
-#: ../rules/base.xml.in.h:904
+#: ../rules/base.xml.in.h:905
msgid "Left Ctrl+Left Shift"
msgstr "Linke Strg-Taste+Linke Umschalttaste"
-#: ../rules/base.xml.in.h:905
+#: ../rules/base.xml.in.h:906
msgid "Right Ctrl+Right Shift"
msgstr "Rechte Strg-Taste und rechte Umschalttaste"
-#: ../rules/base.xml.in.h:906
+#: ../rules/base.xml.in.h:907
msgid "Alt+Ctrl"
msgstr "Alt+Strg"
-#: ../rules/base.xml.in.h:907
+#: ../rules/base.xml.in.h:908
msgid "Alt+Shift"
msgstr "Alt+Umschalttaste"
-#: ../rules/base.xml.in.h:908
+#: ../rules/base.xml.in.h:909
msgid "Left Alt+Left Shift"
msgstr "Linke Alt-Taste+Linke Umschalttaste"
-#: ../rules/base.xml.in.h:909
+#: ../rules/base.xml.in.h:910
msgid "Alt+Space"
msgstr "Alt+Leertaste"
-#: ../rules/base.xml.in.h:910
+#: ../rules/base.xml.in.h:911
msgid "Menu"
msgstr "Menü"
-#: ../rules/base.xml.in.h:911
+#: ../rules/base.xml.in.h:912
msgid "Left Win"
msgstr "Linke Windows-Taste"
-#: ../rules/base.xml.in.h:912
+#: ../rules/base.xml.in.h:913
msgid "Right Win"
msgstr "Rechte Windows-Taste"
-#: ../rules/base.xml.in.h:913
+#: ../rules/base.xml.in.h:914
msgid "Left Shift"
msgstr "Linke Umschalttaste"
-#: ../rules/base.xml.in.h:914
+#: ../rules/base.xml.in.h:915
msgid "Right Shift"
msgstr "Rechte Umschalttaste"
-#: ../rules/base.xml.in.h:915
+#: ../rules/base.xml.in.h:916
msgid "Left Ctrl"
msgstr "Linke Strg-Taste"
-#: ../rules/base.xml.in.h:916
+#: ../rules/base.xml.in.h:917
msgid "Right Ctrl"
msgstr "Rechte Strg-Taste"
-#: ../rules/base.xml.in.h:917
+#: ../rules/base.xml.in.h:918
msgid "Scroll Lock"
msgstr "Rollen"
-#: ../rules/base.xml.in.h:918
+#: ../rules/base.xml.in.h:919
msgid "LeftCtrl+LeftWin (to first layout), RightCtrl+Menu (to second layout)"
msgstr "Linke Strg-Taste und linke Windows-Taste (zur ersten Belegung), rechte Strg-Taste und Menütaste (zur zweiten Belegung)"
-#: ../rules/base.xml.in.h:919
+#: ../rules/base.xml.in.h:920
msgid "Key to choose 3rd level"
msgstr "Taste zum Wechsel in die dritte Tastaturebene"
-#: ../rules/base.xml.in.h:920
+#: ../rules/base.xml.in.h:921
msgid "Any Win key"
msgstr "Beliebige Windows-Taste"
-#: ../rules/base.xml.in.h:921
+#: ../rules/base.xml.in.h:922
msgid "Any Alt key"
msgstr "Beliebige Alt-Taste"
-#: ../rules/base.xml.in.h:922
+#: ../rules/base.xml.in.h:923
msgid "Right Alt, Shift+Right Alt key is Compose"
msgstr "Rechte Alt-Taste, Umschalttaste + rechte Alt-Taste ist Compose-Taste"
-#: ../rules/base.xml.in.h:923
+#: ../rules/base.xml.in.h:924
msgid "Right Alt key never chooses 3rd level"
msgstr "Rechte Alt-Taste wählt niemals die dritte Tastaturebene."
-#: ../rules/base.xml.in.h:924
+#: ../rules/base.xml.in.h:925
msgid "Enter on keypad"
msgstr "Eingabetaste im Nummernblock"
-#: ../rules/base.xml.in.h:925
+#: ../rules/base.xml.in.h:926
msgid "Backslash"
msgstr "Backslash"
-#: ../rules/base.xml.in.h:926
+#: ../rules/base.xml.in.h:927
msgid "&lt;Less/Greater&gt;"
msgstr "&lt;Kleiner als/größer als&gt;"
-#: ../rules/base.xml.in.h:927
+#: ../rules/base.xml.in.h:928
msgid "Caps Lock chooses 3rd level, acts as onetime lock when pressed together with another 3rd-level-chooser"
msgstr "Feststelltaste wählt die dritte Ebene, sperrt einmalig wenn gedrückt, zusammen mit einer anderen Taste zum Wählen der dritten Ebene"
-#: ../rules/base.xml.in.h:928
+#: ../rules/base.xml.in.h:929
msgid "Backslash chooses 3rd level, acts as onetime lock when pressed together with another 3rd-level-chooser"
msgstr "Backslash wählt die dritte Ebene, sperrt einmalig wenn gedrückt, zusammen mit einer anderen Taste zum Wählen der dritten Ebene"
-#: ../rules/base.xml.in.h:929
+#: ../rules/base.xml.in.h:930
msgid "&lt;Less/Greater&gt; chooses 3rd level, acts as onetime lock when pressed together with another 3rd-level-chooser"
msgstr "&lt;Kleiner als/Größer als&gt; wählt die dritte Ebene, sperrt einmalig wenn gedrückt, zusammen mit einer anderen Taste zum Wählen der dritten Ebene"
-#: ../rules/base.xml.in.h:930
+#: ../rules/base.xml.in.h:931
msgid "Ctrl key position"
msgstr "Position der Strg-Taste"
-#: ../rules/base.xml.in.h:931
+#: ../rules/base.xml.in.h:932
msgid "Caps Lock as Ctrl"
msgstr "Feststelltaste als Strg-Taste"
-#: ../rules/base.xml.in.h:932
+#: ../rules/base.xml.in.h:933
msgid "Left Ctrl as Meta"
msgstr "Linke Strg-Taste als Meta"
-#: ../rules/base.xml.in.h:933
+#: ../rules/base.xml.in.h:934
msgid "Swap Ctrl and Caps Lock"
msgstr "Strg-Taste und Feststelltaste vertauschen"
-#: ../rules/base.xml.in.h:934
+#: ../rules/base.xml.in.h:935
msgid "At left of 'A'"
msgstr "Links von »A«"
-#: ../rules/base.xml.in.h:935
+#: ../rules/base.xml.in.h:936
msgid "At bottom left"
msgstr "Unten links"
-#: ../rules/base.xml.in.h:936
+#: ../rules/base.xml.in.h:937
msgid "Right Ctrl as Right Alt"
msgstr "Rechte Strg-Taste wie rechte Alt-Taste"
-#: ../rules/base.xml.in.h:937
+#: ../rules/base.xml.in.h:938
msgid "Menu as Right Ctrl"
msgstr "Menü als rechte Strg-Taste"
-#: ../rules/base.xml.in.h:938
+#: ../rules/base.xml.in.h:939
msgid "Right Alt as Right Ctrl"
msgstr "Rechte Alt-Taste als rechte Strg-Taste"
-#: ../rules/base.xml.in.h:939
+#: ../rules/base.xml.in.h:940
+msgid "Swap Left Alt key with Left Ctrl key"
+msgstr "Linke Alt-Taste und linke Strg-Taste vertauschen"
+
+#: ../rules/base.xml.in.h:941
+msgid "Swap Left Win key with Left Ctrl key"
+msgstr "Linke Win-Taste und linke Strg-Taste vertauschen"
+
+#: ../rules/base.xml.in.h:942
+msgid "Left Alt as Ctrl, Left Ctrl as Win, Left Win as Alt"
+msgstr "Linke Alt als Strg, linke Strg als Win, linke Win als Alt"
+
+#: ../rules/base.xml.in.h:943
msgid "Use keyboard LED to show alternative layout"
msgstr "Tastatur-LED zur Anzeige der alternativen Belegung verwenden"
-#: ../rules/base.xml.in.h:940
+#: ../rules/base.xml.in.h:944
msgid "Num Lock"
msgstr "NumLock"
-#: ../rules/base.xml.in.h:941
+#: ../rules/base.xml.in.h:945
msgid "Layout of numeric keypad"
msgstr "Belegung des Nummernblocks"
-#: ../rules/base.xml.in.h:942
+#: ../rules/base.xml.in.h:946
msgid "Legacy"
msgstr "Veraltet"
-#: ../rules/base.xml.in.h:943
+#: ../rules/base.xml.in.h:947
msgid "Unicode additions (arrows and math operators)"
msgstr "Unicode-Ergänzungen (Pfeile und mathematische Operatoren)"
-#: ../rules/base.xml.in.h:944
+#: ../rules/base.xml.in.h:948
msgid "Unicode additions (arrows and math operators; math operators on default level)"
msgstr "Unicode-Ergänzungen (Pfeile und mathematische Operatoren). Mathematische Operatoren befinden sich in der Standardebene."
-#: ../rules/base.xml.in.h:945
+#: ../rules/base.xml.in.h:949
msgid "Legacy Wang 724"
msgstr "Wang 724 (veraltet)"
-#: ../rules/base.xml.in.h:946
+#: ../rules/base.xml.in.h:950
msgid "Wang 724 keypad with Unicode additions (arrows and math operators)"
msgstr "Wang 724 mit Unicode-Ergänzungen (Pfeile und mathematische Operatoren)"
-#: ../rules/base.xml.in.h:947
+#: ../rules/base.xml.in.h:951
msgid "Wang 724 keypad with Unicode additions (arrows and math operators; math operators on default level)"
msgstr "Wang 724 mit Unicode-Ergänzungen (Pfeile und mathematische Operatoren). Mathematische Operatoren in der Standardebene"
-#: ../rules/base.xml.in.h:948
+#: ../rules/base.xml.in.h:952
msgid "Hexadecimal"
msgstr "Hexadezimal"
-#: ../rules/base.xml.in.h:949
+#: ../rules/base.xml.in.h:953
msgid "ATM/phone-style"
msgstr "ATM/Telefonstil"
-#: ../rules/base.xml.in.h:950
+#: ../rules/base.xml.in.h:954
msgid "Numeric keypad delete key behaviour"
msgstr "Verhalten der Löschtaste des Nummernblocks"
-#: ../rules/base.xml.in.h:951
+#: ../rules/base.xml.in.h:955
msgid "Legacy key with dot"
msgstr "Veraltete Taste mit Punkt"
#. Actually, with KP_SEPARATOR, as the old keypad(comma)
-#: ../rules/base.xml.in.h:953
+#: ../rules/base.xml.in.h:957
msgid "Legacy key with comma"
msgstr "Veraltete Taste mit Komma"
-#: ../rules/base.xml.in.h:954
+#: ../rules/base.xml.in.h:958
msgid "Four-level key with dot"
msgstr "Taste der vierten Ebene mit Punkt"
-#: ../rules/base.xml.in.h:955
+#: ../rules/base.xml.in.h:959
msgid "Four-level key with dot, Latin-9 only"
msgstr "Taste der vierten Ebene mit Punkt, Latin-9-Einschränkung"
-#: ../rules/base.xml.in.h:956
+#: ../rules/base.xml.in.h:960
msgid "Four-level key with comma"
msgstr "Taste der vierten Ebene mit Komma"
# momayyez? Was ist das?
-#: ../rules/base.xml.in.h:957
+#: ../rules/base.xml.in.h:961
msgid "Four-level key with momayyez"
msgstr "Taste der vierten Ebene mit »momayyez«"
#. This assumes the KP_ abstract symbols are actually useful for some apps
#. The description needs to be rewritten
-#: ../rules/base.xml.in.h:960
+#: ../rules/base.xml.in.h:964
msgid "Four-level key with abstract separators"
msgstr "Taste der vierten Ebene mit abstrakten Trennern"
-#: ../rules/base.xml.in.h:961
+#: ../rules/base.xml.in.h:965
msgid "Semicolon on third level"
msgstr "Semikolon in der dritten Tastaturebene"
-#: ../rules/base.xml.in.h:962
+#: ../rules/base.xml.in.h:966
msgid "Caps Lock key behavior"
msgstr "Verhalten der Feststelltaste"
-#: ../rules/base.xml.in.h:963
+#: ../rules/base.xml.in.h:967
msgid "Caps Lock uses internal capitalization; Shift \"pauses\" Caps Lock"
msgstr "Feststelltaste verwendet interne Großschreibung. Umschalttaste »unterbricht« Feststelltaste"
-#: ../rules/base.xml.in.h:964
+#: ../rules/base.xml.in.h:968
msgid "Caps Lock uses internal capitalization; Shift doesn't affect Caps Lock"
msgstr "Feststelltaste verwendet interne Großschreibung. Umschalttaste beeinflusst Feststelltaste nicht"
-#: ../rules/base.xml.in.h:965
+#: ../rules/base.xml.in.h:969
msgid "Caps Lock acts as Shift with locking; Shift \"pauses\" Caps Lock"
msgstr "Feststelltaste arbeitet als Umschalttaste mit Sperrung. Umschalttaste »unterbricht« Feststelltaste"
-#: ../rules/base.xml.in.h:966
+#: ../rules/base.xml.in.h:970
msgid "Caps Lock acts as Shift with locking; Shift doesn't affect Caps Lock"
msgstr "Feststelltaste arbeitet als Umschalttaste mit Sperrung. Umschalttaste beeinflusst Feststelltaste nicht"
-#: ../rules/base.xml.in.h:967
+#: ../rules/base.xml.in.h:971
msgid "Caps Lock toggles normal capitalization of alphabetic characters"
msgstr "Feststelltaste kehrt die normale Großschreibung alphabetischer Zeichen um"
-#: ../rules/base.xml.in.h:968
+#: ../rules/base.xml.in.h:972
msgid "Make Caps Lock an additional Num Lock"
msgstr "Feststelltaste als zusätzliche NumLock-Taste verwenden"
-#: ../rules/base.xml.in.h:969
+#: ../rules/base.xml.in.h:973
msgid "Swap ESC and Caps Lock"
msgstr "Esc und Feststelltaste vertauschen"
-#: ../rules/base.xml.in.h:970
+#: ../rules/base.xml.in.h:974
msgid "Make Caps Lock an additional ESC"
msgstr "Feststelltaste als zusätzliche Esc-Taste verwenden"
-#: ../rules/base.xml.in.h:971
+#: ../rules/base.xml.in.h:975
msgid "Make Caps Lock an additional Backspace"
msgstr "Feststelltaste als zusätzliche Löschtaste verwenden"
-#: ../rules/base.xml.in.h:972
+#: ../rules/base.xml.in.h:976
msgid "Make Caps Lock an additional Super"
msgstr "Feststelltaste als zusätzliche Super-Taste verwenden"
-#: ../rules/base.xml.in.h:973
+#: ../rules/base.xml.in.h:977
msgid "Make Caps Lock an additional Hyper"
msgstr "Feststelltaste als zusätzliche Hyper-Taste verwenden"
-#: ../rules/base.xml.in.h:974
+#: ../rules/base.xml.in.h:978
msgid "Caps Lock toggles ShiftLock (affects all keys)"
msgstr "Feststelltaste kehrt Umschalttaste um, so dass alle Tasten beeinflusst werden"
-#: ../rules/base.xml.in.h:975
+#: ../rules/base.xml.in.h:979
msgid "Caps Lock is disabled"
msgstr "Feststelltaste ist deaktiviert"
-#: ../rules/base.xml.in.h:976
+#: ../rules/base.xml.in.h:980
msgid "Make Caps Lock an additional Ctrl"
msgstr "Feststelltaste als zusätzliche Strg-Taste verwenden"
-#: ../rules/base.xml.in.h:977
+#: ../rules/base.xml.in.h:981
msgid "Alt/Win key behavior"
msgstr "Verhalten der Alt/Windows-Tasten"
-#: ../rules/base.xml.in.h:978
+#: ../rules/base.xml.in.h:982
msgid "Add the standard behavior to Menu key"
msgstr "Standardverhalten zur Menütaste hinzufügen"
-#: ../rules/base.xml.in.h:979
+#: ../rules/base.xml.in.h:983
msgid "Alt and Meta are on Alt keys"
msgstr "Alt und Meta befinden sich auf den Alt-Tasten."
-#: ../rules/base.xml.in.h:980
+#: ../rules/base.xml.in.h:984
msgid "Alt is mapped to Win keys (and the usual Alt keys)"
msgstr "Alt ist den Windows-Tasten zugeordnet (und den üblichen Alt-Tasten)"
-#: ../rules/base.xml.in.h:981
+#: ../rules/base.xml.in.h:985
msgid "Ctrl is mapped to Win keys (and the usual Ctrl keys)"
msgstr "Strg ist den Windows-Tasten zugeordnet (und den üblichen Strg-Tasten)"
-#: ../rules/base.xml.in.h:982
+#: ../rules/base.xml.in.h:986
msgid "Ctrl is mapped to Alt keys, Alt is mapped to Win keys"
msgstr "Strg ist den Alt-Tasten zugeordnet, Alt ist den Windows-Tasten zugeordnet"
-#: ../rules/base.xml.in.h:983
+#: ../rules/base.xml.in.h:987
msgid "Meta is mapped to Win keys"
msgstr "Meta ist den Windows-Tasten zugeordnet"
-#: ../rules/base.xml.in.h:984
+#: ../rules/base.xml.in.h:988
msgid "Meta is mapped to Left Win"
msgstr "Meta ist der linken Windows-Taste zugeordnet"
-#: ../rules/base.xml.in.h:985
+#: ../rules/base.xml.in.h:989
msgid "Hyper is mapped to Win-keys"
msgstr "Hyper ist den Windows-Tasten zugeordnet"
-#: ../rules/base.xml.in.h:986
+#: ../rules/base.xml.in.h:990
msgid "Alt is mapped to Right Win, Super to Menu"
msgstr "Alt ist der rechten Windows-Taste zugeordnet und Super der Menü-Taste."
-#: ../rules/base.xml.in.h:987
+#: ../rules/base.xml.in.h:991
msgid "Alt is swapped with Win"
msgstr "Alt-Taste ist gegen Windows-Taste vertauscht"
-#: ../rules/base.xml.in.h:988
+#: ../rules/base.xml.in.h:992
msgid "Position of Compose key"
msgstr "Position der Compose-Taste"
-#: ../rules/base.xml.in.h:989
+#: ../rules/base.xml.in.h:993
msgid "3rd level of Left Win"
msgstr "Dritte Ebene der linken Windows-Taste"
-#: ../rules/base.xml.in.h:990
+#: ../rules/base.xml.in.h:994
msgid "3rd level of Right Win"
msgstr "Dritte Ebene der rechten Windows-Taste"
-#: ../rules/base.xml.in.h:991
+#: ../rules/base.xml.in.h:995
msgid "3rd level of Menu"
msgstr "Dritte Ebene der Menü-Taste"
-#: ../rules/base.xml.in.h:992
+#: ../rules/base.xml.in.h:996
msgid "3rd level of Left Ctrl"
msgstr "Dritte Ebene der linken Strg-Taste"
-#: ../rules/base.xml.in.h:993
+#: ../rules/base.xml.in.h:997
msgid "3rd level of Right Ctrl"
msgstr "Dritte Ebene der rechten Strg-Taste"
-#: ../rules/base.xml.in.h:994
+#: ../rules/base.xml.in.h:998
msgid "3rd level of Caps Lock"
msgstr "Dritte Ebene der Feststelltaste"
-#: ../rules/base.xml.in.h:995
+#: ../rules/base.xml.in.h:999
msgid "3rd level of &lt;Less/Greater&gt;"
msgstr "Dritte Ebene von &lt;Kleiner als/größer als&gt;"
-#: ../rules/base.xml.in.h:996
+#: ../rules/base.xml.in.h:1000
msgid "Pause"
msgstr "Pause"
-#: ../rules/base.xml.in.h:997
+#: ../rules/base.xml.in.h:1001
msgid "PrtSc"
msgstr "Druck"
-#: ../rules/base.xml.in.h:998
+#: ../rules/base.xml.in.h:1002
msgid "Miscellaneous compatibility options"
msgstr "Verschiedene Optionen zur Kompatibilität"
-#: ../rules/base.xml.in.h:999
+#: ../rules/base.xml.in.h:1003
msgid "Default numeric keypad keys"
msgstr "Vorgegebene Nummernblocktasten"
-#: ../rules/base.xml.in.h:1000
+#: ../rules/base.xml.in.h:1004
msgid "Numeric keypad keys always enter digits (as in Mac OS)"
msgstr "Tasten des Nummernblocks geben immer Ziffern ein (wie bei Mac)"
-#: ../rules/base.xml.in.h:1001
+#: ../rules/base.xml.in.h:1005
msgid "Shift with numeric keypad keys works as in MS Windows"
msgstr "Umschalttaste funktioniert mit den Tasten des Nummernblocks wie in MS Windows"
-#: ../rules/base.xml.in.h:1002
+#: ../rules/base.xml.in.h:1006
msgid "Shift does not cancel Num Lock, chooses 3rd level instead"
msgstr "Umschalttaste deaktiviert NumLock nicht, wechselt stattdessen in die dritte Tastaturebene"
-#: ../rules/base.xml.in.h:1003
+#: ../rules/base.xml.in.h:1007
msgid "Special keys (Ctrl+Alt+&lt;key&gt;) handled in a server"
msgstr "Spezialtasten für Server (Strg+Alt+&lt;Taste&gt;)"
-#: ../rules/base.xml.in.h:1004
+#: ../rules/base.xml.in.h:1008
msgid "Apple Aluminium Keyboard: emulate PC keys (Print, Scroll Lock, Pause, Num Lock)"
msgstr "Apple Aluminium Keyboard: PC-Tasten emulieren (Druck, Scroll_Lock, Pause, NumLock)"
-#: ../rules/base.xml.in.h:1005
+#: ../rules/base.xml.in.h:1009
msgid "Shift cancels Caps Lock"
msgstr "Umschalttaste deaktiviert Feststelltaste"
-#: ../rules/base.xml.in.h:1006
+#: ../rules/base.xml.in.h:1010
msgid "Enable extra typographic characters"
msgstr "Typographische Sonderzeichen aktivieren"
-#: ../rules/base.xml.in.h:1007
+#: ../rules/base.xml.in.h:1011
msgid "Both Shift keys together toggle Caps Lock"
msgstr "Beide Umschalttasten gleichzeitig schalten CapsLock ein und aus"
-#: ../rules/base.xml.in.h:1008
+#: ../rules/base.xml.in.h:1012
msgid "Both Shift keys together activate Caps Lock, one Shift key deactivates"
msgstr "Beide Umschalttasten gleichzeitig schalten CapsLock ein, eine Umschalttaste deaktiviert"
-#: ../rules/base.xml.in.h:1009
+#: ../rules/base.xml.in.h:1013
msgid "Both Shift keys together toggle ShiftLock"
msgstr "Beide Umschalttasten gleichzeitig schalten ShiftLock ein und aus"
-#: ../rules/base.xml.in.h:1010
+#: ../rules/base.xml.in.h:1014
msgid "Shift + NumLock toggles PointerKeys"
msgstr "Umschalttaste + NumLock schaltet Tastaturmaus ein und aus"
-#: ../rules/base.xml.in.h:1011
+#: ../rules/base.xml.in.h:1015
msgid "Allow breaking grabs with keyboard actions (warning: security risk)"
msgstr "Erlauben, Grabs mit Tastaturaktionen abzubrechen (Achtung: Sicherheitsrisiko)"
-#: ../rules/base.xml.in.h:1012
+#: ../rules/base.xml.in.h:1016
+msgid "Allow grab and window tree logging"
+msgstr "Protokollieren von Grabs und Baumansichtsaktionen erlauben"
+
+#: ../rules/base.xml.in.h:1017
msgid "Adding currency signs to certain keys"
msgstr "Währungssymbole zu verschiedenen Tasten hinzufügen"
-#: ../rules/base.xml.in.h:1013
+#: ../rules/base.xml.in.h:1018
msgid "Euro on E"
msgstr "Euro auf E"
-#: ../rules/base.xml.in.h:1014
+#: ../rules/base.xml.in.h:1019
msgid "Euro on 2"
msgstr "Euro auf 2"
-#: ../rules/base.xml.in.h:1015
+#: ../rules/base.xml.in.h:1020
msgid "Euro on 4"
msgstr "Euro auf 4"
-#: ../rules/base.xml.in.h:1016
+#: ../rules/base.xml.in.h:1021
msgid "Euro on 5"
msgstr "Euro auf 5"
-#: ../rules/base.xml.in.h:1017
+#: ../rules/base.xml.in.h:1022
msgid "Rupee on 4"
msgstr "Rupie-Symbol auf 4"
-#: ../rules/base.xml.in.h:1018
+#: ../rules/base.xml.in.h:1023
msgid "Key to choose 5th level"
msgstr "Taste zum Wechsel in die fünfte Tastaturebene"
-#: ../rules/base.xml.in.h:1019
+#: ../rules/base.xml.in.h:1024
msgid "&lt;Less/Greater&gt; chooses 5th level, locks when pressed together with another 5th-level-chooser"
msgstr "&lt;Kleiner als/Größer als&gt; wählt die fünfte Ebene, sperrt wenn gedrückt, zusammen mit einer anderen Taste zum Wählen der fünften Ebene"
-#: ../rules/base.xml.in.h:1020
+#: ../rules/base.xml.in.h:1025
msgid "Right Alt chooses 5th level, locks when pressed together with another 5th-level-chooser"
msgstr "Rechte Alt-Taste wählt die fünfte Ebene, sperrt wenn gedrückt, zusammen mit einer anderen Taste zum Wählen der fünften Ebene"
-#: ../rules/base.xml.in.h:1021
+#: ../rules/base.xml.in.h:1026
msgid "Left Win chooses 5th level, locks when pressed together with another 5th-level-chooser"
msgstr "Linke Windows-Taste wählt die fünfte Ebene, sperrt wenn gedrückt, zusammen mit einer anderen Taste zum Wählen der fünften Ebene"
-#: ../rules/base.xml.in.h:1022
+#: ../rules/base.xml.in.h:1027
msgid "Right Win chooses 5th level, locks when pressed together with another 5th-level-chooser"
msgstr "Rechte Windows-Taste wählt die fünfte Ebene, sperrt wenn gedrückt, zusammen mit einer anderen Taste zum Wählen der fünften Ebene"
-#: ../rules/base.xml.in.h:1023
+#: ../rules/base.xml.in.h:1028
msgid "Using space key to input non-breakable space character"
msgstr "Leertaste zur Eingabe nicht umbrechbarer Zeichen verwenden"
-#: ../rules/base.xml.in.h:1024
+#: ../rules/base.xml.in.h:1029
msgid "Usual space at any level"
msgstr "Leertaste gibt in jeder Ebene stets Leerzeichen aus"
-#: ../rules/base.xml.in.h:1025
+#: ../rules/base.xml.in.h:1030
msgid "Non-breakable space character at second level"
msgstr "Nicht umbrechbares Leerzeichen in der zweiten Tastaturebene"
-#: ../rules/base.xml.in.h:1026
+#: ../rules/base.xml.in.h:1031
msgid "Non-breakable space character at third level"
msgstr "Nicht umbrechbares Leerzeichen in der dritten Tastaturebene"
-#: ../rules/base.xml.in.h:1027
+#: ../rules/base.xml.in.h:1032
msgid "Non-breakable space character at third level, nothing at fourth level"
msgstr "Nicht umbrechbares Leerzeichen in der dritten Tastaturebene, nichts in der vierten Ebene"
-#: ../rules/base.xml.in.h:1028
+#: ../rules/base.xml.in.h:1033
msgid "Non-breakable space character at third level, thin non-breakable space character at fourth level"
msgstr "Nicht umbrechbares Leerzeichen in der dritten Tastaturebene, schmales nicht umbrechbares Leerzeichen in der vierten Ebene"
-#: ../rules/base.xml.in.h:1029
+#: ../rules/base.xml.in.h:1034
msgid "Non-breakable space character at fourth level"
msgstr "Nicht umbrechbares Leerzeichen in der vierten Tastaturebene"
-#: ../rules/base.xml.in.h:1030
+#: ../rules/base.xml.in.h:1035
msgid "Non-breakable space character at fourth level, thin non-breakable space character at sixth level"
msgstr "Nicht umbrechbares Leerzeichen in der vierten Tastaturebene, schmales nicht umbrechbares Leerzeichen in der sechsten Ebene"
-#: ../rules/base.xml.in.h:1031
+#: ../rules/base.xml.in.h:1036
msgid "Non-breakable space character at fourth level, thin non-breakable space character at sixth level (via Ctrl+Shift)"
msgstr "Nicht umbrechbares Leerzeichen in der vierten Tastaturebene, schmales nicht umbrechbares Leerzeichen in der sechsten Ebene (mit Strg + Umschalttaste)"
-#: ../rules/base.xml.in.h:1032
+#: ../rules/base.xml.in.h:1037
msgid "Zero-width non-joiner character at second level"
msgstr "Nicht verbindendes Zeichen der Breite Null in der zweiten Ebene"
-#: ../rules/base.xml.in.h:1033
+#: ../rules/base.xml.in.h:1038
msgid "Zero-width non-joiner character at second level, zero-width joiner character at third level"
msgstr "Nicht verbindendes Zeichen der Breite Null in der zweiten Ebene, verbindendes Zeichen der Breite Null in der dritten Ebene"
-#: ../rules/base.xml.in.h:1034
+#: ../rules/base.xml.in.h:1039
msgid "Zero-width non-joiner character at second level, zero-width joiner character at third level, non-breakable space character at fourth level"
msgstr "Nicht verbindendes Zeichen der Breite Null in der zweiten Ebene, verbindendes Zeichen der Breite Null in der dritten Ebene, nicht umbrechbares Leerzeichen in der vierten Tastaturebene"
-#: ../rules/base.xml.in.h:1035
+#: ../rules/base.xml.in.h:1040
msgid "Zero-width non-joiner character at second level, non-breakable space character at third level"
msgstr "Nicht verbindendes Zeichen der Breite Null in der zweiten Ebene, nicht umbrechbares Leerzeichen in der dritten Ebene"
-#: ../rules/base.xml.in.h:1036
+#: ../rules/base.xml.in.h:1041
msgid "Zero-width non-joiner character at second level, non-breakable space character at third level, nothing at fourth level"
msgstr "Nicht verbindendes Zeichen der Breite Null in der zweiten Ebene, nicht umbrechbares Leerzeichen in der dritten Tastaturebene, nichts in der vierten Ebene"
-#: ../rules/base.xml.in.h:1037
+#: ../rules/base.xml.in.h:1042
msgid "Zero-width non-joiner character at second level, non-breakable space character at third level, zero-width joiner at fourth level"
msgstr "Nicht verbindendes Zeichen der Breite Null in der zweiten Ebene, nicht umbrechbares Leerzeichen in der dritten Tastaturebene, verbindendes Zeichen der Breite Null in der vierten Ebene"
-#: ../rules/base.xml.in.h:1038
+#: ../rules/base.xml.in.h:1043
msgid "Zero-width non-joiner character at second level, non-breakable space character at third level, thin non-breakable space at fourth level"
msgstr "Nicht verbindendes Zeichen der Breite Null in der zweiten Ebene, nicht umbrechbares Leerzeichen in der dritten Tastaturebene, schmales nicht umbrechbares Leerzeichen in der vierten Ebene"
-#: ../rules/base.xml.in.h:1039
+#: ../rules/base.xml.in.h:1044
msgid "Zero-width non-joiner character at third level, zero-width joiner at fourth level"
msgstr "Nicht verbindendes Zeichen der Breite Null in der dritten Ebene, verbindendes Zeichen der Breite Null in der vierten Ebene"
-#: ../rules/base.xml.in.h:1040
+#: ../rules/base.xml.in.h:1045
msgid "Japanese keyboard options"
msgstr "Japanische Tastaturoptionen"
-#: ../rules/base.xml.in.h:1041
+#: ../rules/base.xml.in.h:1046
msgid "Kana Lock key is locking"
msgstr "Kana-Sperrtaste ist gesperrt"
-#: ../rules/base.xml.in.h:1042
+#: ../rules/base.xml.in.h:1047
msgid "NICOLA-F style Backspace"
msgstr "Löschtaste wie NICOLA-F"
-#: ../rules/base.xml.in.h:1043
+#: ../rules/base.xml.in.h:1048
msgid "Make Zenkaku Hankaku an additional ESC"
msgstr "Zenkaku Hankaku als zusätzliche Esc-Taste verwenden"
-#: ../rules/base.xml.in.h:1044
+#: ../rules/base.xml.in.h:1049
msgid "Adding Esperanto supersigned letters"
msgstr "Zeichen mit Esperanto-Circumflex hinzufügen"
-#: ../rules/base.xml.in.h:1045
+#: ../rules/base.xml.in.h:1050
msgid "To the corresponding key in a Qwerty layout"
msgstr "Zur entsprechenden Taste einer Qwerty-Belegung."
-#: ../rules/base.xml.in.h:1046
+#: ../rules/base.xml.in.h:1051
msgid "To the corresponding key in a Dvorak layout"
msgstr "Zur entsprechenden Taste einer Dvorak-Belegung."
-#: ../rules/base.xml.in.h:1047
+#: ../rules/base.xml.in.h:1052
msgid "To the corresponding key in a Colemak layout"
msgstr "Zur entsprechenden Taste einer Colemak-Belegung."
-#: ../rules/base.xml.in.h:1048
+#: ../rules/base.xml.in.h:1053
msgid "Maintain key compatibility with old Solaris keycodes"
msgstr "Tastenkompatibilität mit veralteten Solaris-Tastencodes sicher stellen"
-#: ../rules/base.xml.in.h:1049
+#: ../rules/base.xml.in.h:1054
msgid "Sun Key compatibility"
msgstr "Sun-Tastenkompatibilität"
-#: ../rules/base.xml.in.h:1050
+#: ../rules/base.xml.in.h:1055
msgid "Key sequence to kill the X server"
msgstr "Tastenkombination zum erzwungenen Beenden des X-Servers"
-#: ../rules/base.xml.in.h:1051
+#: ../rules/base.xml.in.h:1056
msgid "Ctrl + Alt + Backspace"
msgstr "Strg + Alt + Löschtaste"
@@ -4021,182 +4041,150 @@ msgstr "Couer D'alene Salish"
msgid "English (US, Sun Type 6/7)"
msgstr "Englisch (USA, Sun Typ 6/7)"
-#: ../rules/base.extras.xml.in.h:42
+#: ../rules/base.extras.xml.in.h:40
+msgid "English (Norman)"
+msgstr "Englisch (Normannisch)"
+
+#: ../rules/base.extras.xml.in.h:43
msgid "Polish (international with dead keys)"
msgstr "Polnisch (International, mit Akzenttasten)"
-#: ../rules/base.extras.xml.in.h:43
+#: ../rules/base.extras.xml.in.h:44
msgid "Polish (Colemak)"
msgstr "Polnisch (Colemak)"
-#: ../rules/base.extras.xml.in.h:44
+#: ../rules/base.extras.xml.in.h:45
msgid "Polish (Sun Type 6/7)"
msgstr "Polnisch (Sun Type 6/7)"
-#: ../rules/base.extras.xml.in.h:48
+#: ../rules/base.extras.xml.in.h:49
msgid "Crimean Tatar (Dobruja Q)"
msgstr "Krimtatarisch (Dobruja Q)"
-#: ../rules/base.extras.xml.in.h:49
+#: ../rules/base.extras.xml.in.h:50
msgid "Romanian (ergonomic Touchtype)"
msgstr "Rumänisch (ergonomische Bedienung)"
-#: ../rules/base.extras.xml.in.h:50
+#: ../rules/base.extras.xml.in.h:51
msgid "Romanian (Sun Type 6/7)"
msgstr "Rumänisch (Sun Typ 6/7)"
-#: ../rules/base.extras.xml.in.h:53
+#: ../rules/base.extras.xml.in.h:54
msgid "Serbian (combining accents instead of dead keys)"
msgstr "Serbisch (Akzente kombinieren anstelle von Akzenttasten)"
-#: ../rules/base.extras.xml.in.h:56
+#: ../rules/base.extras.xml.in.h:57
msgid "Russian (with Ukrainian-Belorussian layout)"
msgstr "Russisch (mit ukrainisch-weißrussischer Belegung)"
-#: ../rules/base.extras.xml.in.h:57
+#: ../rules/base.extras.xml.in.h:58
msgid "Russian (Sun Type 6/7)"
msgstr "Russische (Sun Type 6/7)"
-#: ../rules/base.extras.xml.in.h:60
+#: ../rules/base.extras.xml.in.h:61
msgid "Armenian (OLPC phonetic)"
msgstr "Armenisch (OLPC-phonetisch)"
-#: ../rules/base.extras.xml.in.h:63
+#: ../rules/base.extras.xml.in.h:64
msgid "Hebrew (Biblical, SIL phonetic)"
msgstr "Hebräisch (Biblisch, SIL phonetisch)"
-#: ../rules/base.extras.xml.in.h:66
+#: ../rules/base.extras.xml.in.h:67
msgid "Arabic (Sun Type 6/7)"
msgstr "Arabisch (Sun Typ 6/7)"
-#: ../rules/base.extras.xml.in.h:69
+#: ../rules/base.extras.xml.in.h:70
msgid "Belgian (Sun Type 6/7)"
msgstr "Belgisch (Sun Typ 6/7)"
-#: ../rules/base.extras.xml.in.h:72
+#: ../rules/base.extras.xml.in.h:73
msgid "Portuguese (Brazil, Sun Type 6/7)"
msgstr "Portugiesisch (Brasilien, Sun Typ 6/7)"
-#: ../rules/base.extras.xml.in.h:75
+#: ../rules/base.extras.xml.in.h:76
msgid "Czech (Sun Type 6/7)"
msgstr "Tschechisch (Sun Typ 6/7)"
-#: ../rules/base.extras.xml.in.h:78
+#: ../rules/base.extras.xml.in.h:79
msgid "Danish (Sun Type 6/7)"
msgstr "Dänisch (Sun Typ 6/7)"
-#: ../rules/base.extras.xml.in.h:81
+#: ../rules/base.extras.xml.in.h:82
msgid "Dutch (Sun Type 6/7)"
msgstr "Niederländisch (Sun Typ 6/7)"
-#: ../rules/base.extras.xml.in.h:84
+#: ../rules/base.extras.xml.in.h:85
msgid "Estonian (Sun Type 6/7)"
msgstr "Estnisch (Sun Typ 6/7)"
-#: ../rules/base.extras.xml.in.h:87
+#: ../rules/base.extras.xml.in.h:88
msgid "Finnish (Sun Type 6/7)"
msgstr "Finnisch (Sun Typ 6/7)"
-#: ../rules/base.extras.xml.in.h:89
+#: ../rules/base.extras.xml.in.h:90
msgid "French (Sun Type 6/7)"
msgstr "Französisch (Sun Typ 6/7)"
-#: ../rules/base.extras.xml.in.h:92
+#: ../rules/base.extras.xml.in.h:93
msgid "Greek (Sun Type 6/7)"
msgstr "Griechisch (Sun Typ 6/7)"
-#: ../rules/base.extras.xml.in.h:95
+#: ../rules/base.extras.xml.in.h:96
msgid "Italian (Sun Type 6/7)"
msgstr "Italienisch (Sun Typ 6/7)"
-#: ../rules/base.extras.xml.in.h:98
+#: ../rules/base.extras.xml.in.h:99
msgid "Japanese (Sun Type 6)"
msgstr "Japanisch (Sun Typ 6)"
-#: ../rules/base.extras.xml.in.h:99
+#: ../rules/base.extras.xml.in.h:100
msgid "Japanese (Sun Type 7 - pc compatible)"
msgstr "Japanisch (Sun Typ 7 - PC-kompatibel)"
-#: ../rules/base.extras.xml.in.h:100
+#: ../rules/base.extras.xml.in.h:101
msgid "Japanese (Sun Type 7 - sun compatible)"
msgstr "Japanisch (Sun Typ 7 - Sun-kompatibel)"
-#: ../rules/base.extras.xml.in.h:103
+#: ../rules/base.extras.xml.in.h:104
msgid "Norwegian (Sun Type 6/7)"
msgstr "Norwegisch (Sun Typ 6/7)"
-#: ../rules/base.extras.xml.in.h:105
+#: ../rules/base.extras.xml.in.h:106
msgid "Portuguese (Sun Type 6/7)"
msgstr "Portugiesisch (Sun Typ 6/7)"
-#: ../rules/base.extras.xml.in.h:108
+#: ../rules/base.extras.xml.in.h:109
msgid "Slovak (Sun Type 6/7)"
msgstr "Slowakisch (Sun Typ 6/7)"
-#: ../rules/base.extras.xml.in.h:111
+#: ../rules/base.extras.xml.in.h:112
msgid "Spanish (Sun Type 6/7)"
msgstr "Spanisch (Sun Typ 6/7)"
-#: ../rules/base.extras.xml.in.h:114
+#: ../rules/base.extras.xml.in.h:115
msgid "Swedish (Sun Type 6/7)"
msgstr "Schwedisch (Sun Typ 6/7)"
-#: ../rules/base.extras.xml.in.h:116
+#: ../rules/base.extras.xml.in.h:117
msgid "German (Switzerland, Sun Type 6/7)"
msgstr "Deutsch (Schweiz, Sun Typ 6/7)"
-#: ../rules/base.extras.xml.in.h:117
+#: ../rules/base.extras.xml.in.h:118
msgid "French (Switzerland, Sun Type 6/7)"
msgstr "Französisch (Schweiz, Sun Typ 6/7)"
-#: ../rules/base.extras.xml.in.h:120
+#: ../rules/base.extras.xml.in.h:121
msgid "Turkish (Sun Type 6/7)"
msgstr "Türkisch (Sun Typ 6/7)"
-#: ../rules/base.extras.xml.in.h:123
+#: ../rules/base.extras.xml.in.h:124
msgid "Ukrainian (Sun Type 6/7)"
msgstr "Ukrainisch (Sun Typ 6/7)"
-#: ../rules/base.extras.xml.in.h:125
+#: ../rules/base.extras.xml.in.h:126
msgid "English (UK, Sun Type 6/7)"
msgstr "Englisch (Großbritannien, Sun Typ 6/7)"
-#: ../rules/base.extras.xml.in.h:128
+#: ../rules/base.extras.xml.in.h:129
msgid "Korean (Sun Type 6/7)"
msgstr "Koreanisch (Sun Typ 6/7)"
-
-#~ msgid "English (layout toggle on multiply/divide key)"
-#~ msgstr "Englisch (Belegungsumschalter auf der Multiplikations-/Divisionstaste)"
-
-#~ msgid "Key(s) to change layout"
-#~ msgstr "Taste(n) zum Wechseln der Belegung"
-
-#~ msgid "Numeric keypad layout selection"
-#~ msgstr "Belegungsauswahl des Nummernblocks"
-
-#~ msgid "Make Caps Lock an additional Control but keep the Caps_Lock keysym"
-#~ msgstr "Feststelltaste als zusätzliche Strg-Taste verwenden, aber Caps_Lock als Schnellzugriff erhalten"
-
-#~ msgid "Compose key position"
-#~ msgstr "Position der Compose-Taste"
-
-#~ msgid "Toggle PointerKeys with Shift + NumLock."
-#~ msgstr "Zeigertasten mit Umschalttaste + NumLock umschalten"
-
-#~ msgid ">German (Switzerland)"
-#~ msgstr ">Deutsch (Schweiz)"
-
-#~ msgid "ca"
-#~ msgstr "ca"
-
-#~ msgid "Catalan"
-#~ msgstr "Katalanisch"
-
-#~ msgid "Serbian (Cyrillic)"
-#~ msgstr "Serbisch (Kyrillisch)"
-
-#~ msgid "Gagauz"
-#~ msgstr "Gagauz"
-
-#~ msgid "Hebrew (Biblical SIL)"
-#~ msgstr "Hebräisch (Biblisch, SIL)"
diff --git a/xorg-server/xkeyboard-config/po/eo.po b/xorg-server/xkeyboard-config/po/eo.po
index 9460fe1c8..d956c0e9e 100644
--- a/xorg-server/xkeyboard-config/po/eo.po
+++ b/xorg-server/xkeyboard-config/po/eo.po
@@ -1,14 +1,14 @@
# Esperanta traduko por 'xkeyboard-config'
-# Copyright (C) 2008, 2009, 2010, 2011, 2012, 2013 The Free Software Foundation, Inc.
+# Copyright (C) 2008, 2009, 2010, 2011, 2012, 2013, 2014 The Free Software Foundation, Inc.
# This file is distributed under the same license as the xkeyboard-config package.
-# Felipe Castro <fefcas@gmail.com>, 2008, 2009, 2010, 2011, 2012, 2013.
+# Felipe Castro <fefcas@gmail.com>, 2008, 2009, 2010, 2011, 2012, 2013, 2014.
#
msgid ""
msgstr ""
-"Project-Id-Version: xkeyboard-config 2.9.91\n"
+"Project-Id-Version: xkeyboard-config 2.10.99\n"
"Report-Msgid-Bugs-To: svu@users.sourceforge.net\n"
-"POT-Creation-Date: 2013-09-14 14:41+0200\n"
-"PO-Revision-Date: 2013-09-16 08:38-0300\n"
+"POT-Creation-Date: 2014-01-15 01:12+0000\n"
+"PO-Revision-Date: 2014-01-15 10:58-0300\n"
"Last-Translator: Felipe Castro <fefcas@gmail.com>\n"
"Language-Team: Esperanto <translation-team-eo@lists.sourceforge.net>\n"
"Language: eo\n"
@@ -816,7 +816,7 @@ msgid "English (programmer Dvorak)"
msgstr "Angla (Dvorako por programistoj)"
#. Keyboard indicator for Russian layouts
-#: ../rules/base.xml.in.h:203 ../rules/base.extras.xml.in.h:54
+#: ../rules/base.xml.in.h:203 ../rules/base.extras.xml.in.h:55
msgid "ru"
msgstr "ru"
@@ -888,11 +888,11 @@ msgid "Uzbek (Afghanistan, OLPC)"
msgstr "Uzbeka (Afganujo, OLPC)"
#. Keyboard indicator for Arabic layouts
-#: ../rules/base.xml.in.h:224 ../rules/base.extras.xml.in.h:64
+#: ../rules/base.xml.in.h:224 ../rules/base.extras.xml.in.h:65
msgid "ar"
msgstr "ar"
-#: ../rules/base.xml.in.h:225 ../rules/base.extras.xml.in.h:65
+#: ../rules/base.xml.in.h:225 ../rules/base.extras.xml.in.h:66
msgid "Arabic"
msgstr "Araba"
@@ -930,11 +930,11 @@ msgid "Albanian"
msgstr "Albana"
#. Keyboard indicator for Armenian layouts
-#: ../rules/base.xml.in.h:236 ../rules/base.extras.xml.in.h:58
+#: ../rules/base.xml.in.h:236 ../rules/base.extras.xml.in.h:59
msgid "hy"
msgstr "hy"
-#: ../rules/base.xml.in.h:237 ../rules/base.extras.xml.in.h:59
+#: ../rules/base.xml.in.h:237 ../rules/base.extras.xml.in.h:60
msgid "Armenian"
msgstr "Armena"
@@ -1010,11 +1010,11 @@ msgid "Belarusian (Latin)"
msgstr "Belorusa (Latina)"
#. Keyboard indicator for Belgian layouts
-#: ../rules/base.xml.in.h:259 ../rules/base.extras.xml.in.h:67
+#: ../rules/base.xml.in.h:259 ../rules/base.extras.xml.in.h:68
msgid "be"
msgstr "be"
-#: ../rules/base.xml.in.h:260 ../rules/base.extras.xml.in.h:68
+#: ../rules/base.xml.in.h:260 ../rules/base.extras.xml.in.h:69
msgid "Belgian"
msgstr "Belga"
@@ -1046,17 +1046,17 @@ msgstr "Belga (senpaŝaj klavoj de Sun)"
msgid "Belgian (Wang model 724 azerty)"
msgstr "Belga (Wang modelo 724 azerty)"
-#. Keyboard indicator for Bengali layouts
+#. Keyboard indicator for Bangla layouts
#: ../rules/base.xml.in.h:269
msgid "bn"
msgstr "bn"
#: ../rules/base.xml.in.h:270
-msgid "Bengali"
+msgid "Bangla"
msgstr "Bengala"
#: ../rules/base.xml.in.h:271
-msgid "Bengali (Probhat)"
+msgid "Bangla (Probhat)"
msgstr "Bengala (Probhat)"
#. Keyboard indicator for Indian layouts
@@ -1066,31 +1066,31 @@ msgstr "in"
#: ../rules/base.xml.in.h:274
msgid "Indian"
-msgstr "Hinda"
+msgstr "Barata"
#: ../rules/base.xml.in.h:275
-msgid "Bengali (India)"
-msgstr "Bengala (Hindujo)"
+msgid "Bangla (India)"
+msgstr "Bengala (Barato)"
#: ../rules/base.xml.in.h:276
-msgid "Bengali (India, Probhat)"
-msgstr "Bengala (Hindujo, Probhat)"
+msgid "Bangla (India, Probhat)"
+msgstr "Bengala (Barato, Probhat)"
#: ../rules/base.xml.in.h:277
-msgid "Bengali (India, Baishakhi)"
-msgstr "Bengala (Hindujo, Baishakhi)"
+msgid "Bangla (India, Baishakhi)"
+msgstr "Bengala (Barato, Baishakhi)"
#: ../rules/base.xml.in.h:278
-msgid "Bengali (India, Bornona)"
-msgstr "Bengala (Hindujo, Bornona)"
+msgid "Bangla (India, Bornona)"
+msgstr "Bengala (Barato, Bornona)"
#: ../rules/base.xml.in.h:279
-msgid "Bengali (India, Uni Gitanjali)"
-msgstr "Bengala (Hindujo, Uni Gitanjali)"
+msgid "Bangla (India, Uni Gitanjali)"
+msgstr "Bengala (Barato, Uni Gitanjali)"
#: ../rules/base.xml.in.h:280
-msgid "Bengali (India, Baishakhi Inscript)"
-msgstr "Bengala (Hindujo, Baishakhi InScript)"
+msgid "Bangla (India, Baishakhi Inscript)"
+msgstr "Bengala (Barato, Baishakhi InScript)"
#. Keyboard indicator for Gujarati layouts
#: ../rules/base.xml.in.h:282
@@ -1245,7 +1245,7 @@ msgstr "Marata (KaGaPa fonetika)"
#: ../rules/base.xml.in.h:327
msgid "English (India, with RupeeSign)"
-msgstr "Angla (Hindujo, kun RupiSigno)"
+msgstr "Angla (Barato, kun RupiSigno)"
#. Keyboard indicator for Bosnian layouts
#: ../rules/base.xml.in.h:329
@@ -1273,11 +1273,11 @@ msgid "Bosnian (US keyboard with Bosnian letters)"
msgstr "Bosna (usona klavaro kun bosnaj literoj)"
#. Keyboard indicator for Portuguese layouts
-#: ../rules/base.xml.in.h:336 ../rules/base.extras.xml.in.h:70
+#: ../rules/base.xml.in.h:336 ../rules/base.extras.xml.in.h:71
msgid "pt"
msgstr "pt"
-#: ../rules/base.xml.in.h:337 ../rules/base.extras.xml.in.h:71
+#: ../rules/base.xml.in.h:337 ../rules/base.extras.xml.in.h:72
msgid "Portuguese (Brazil)"
msgstr "Portugala (Brazilo)"
@@ -1290,16 +1290,16 @@ msgid "Portuguese (Brazil, Dvorak)"
msgstr "Portugala (Brazilo, Dvorako)"
#: ../rules/base.xml.in.h:340
-msgid "Portuguese (Brazil, nativo)"
+msgid "Portuguese (Brazil, Nativo)"
msgstr "Portugala (Brazilo, Nativo)"
#: ../rules/base.xml.in.h:341
-msgid "Portuguese (Brazil, nativo for US keyboards)"
+msgid "Portuguese (Brazil, Nativo for US keyboards)"
msgstr "Portugala (Brazilo, Nativo por usonaj klavaroj)"
#: ../rules/base.xml.in.h:342
-msgid "Portuguese (Brazil, nativo for Esperanto)"
-msgstr "Portugala (Brazilo, Nativo por Esperanto)"
+msgid "Esperanto (Brazil, Nativo)"
+msgstr "Esperanto (Brazilo, Nativo)"
#. Keyboard indicator for Bulgarian layouts
#: ../rules/base.xml.in.h:344
@@ -1453,2463 +1453,2483 @@ msgid "Tibetan (with ASCII numerals)"
msgstr "Tibeta (kun ciferoj ASCII)"
#: ../rules/base.xml.in.h:386
+msgid "ug"
+msgstr "ug"
+
+#: ../rules/base.xml.in.h:387
msgid "Uyghur"
msgstr "Ujgura"
#. Keyboard indicator for Croatian layouts
-#: ../rules/base.xml.in.h:388
+#: ../rules/base.xml.in.h:389
msgid "hr"
msgstr "hr"
-#: ../rules/base.xml.in.h:389
+#: ../rules/base.xml.in.h:390
msgid "Croatian"
msgstr "Kroata"
-#: ../rules/base.xml.in.h:390
+#: ../rules/base.xml.in.h:391
msgid "Croatian (use guillemets for quotes)"
msgstr "Kroata (uzi angul-citilojn por citiloj)"
-#: ../rules/base.xml.in.h:391
+#: ../rules/base.xml.in.h:392
msgid "Croatian (use Croatian digraphs)"
msgstr "Kroata (uzi kroatajn duliteraĵojn)"
-#: ../rules/base.xml.in.h:392
+#: ../rules/base.xml.in.h:393
msgid "Croatian (US keyboard with Croatian digraphs)"
msgstr "Kroata (Usona klavaro kun kroataj duliteraĵoj)"
-#: ../rules/base.xml.in.h:393
+#: ../rules/base.xml.in.h:394
msgid "Croatian (US keyboard with Croatian letters)"
msgstr "Kroata (Usona klavaro kun kroataj literoj)"
#. Keyboard indicator for Chech layouts
-#: ../rules/base.xml.in.h:395 ../rules/base.extras.xml.in.h:73
+#: ../rules/base.xml.in.h:396 ../rules/base.extras.xml.in.h:74
msgid "cs"
msgstr "cs"
-#: ../rules/base.xml.in.h:396 ../rules/base.extras.xml.in.h:74
+#: ../rules/base.xml.in.h:397 ../rules/base.extras.xml.in.h:75
msgid "Czech"
msgstr "Ĉeĥa"
-#: ../rules/base.xml.in.h:397
+#: ../rules/base.xml.in.h:398
msgid "Czech (with &lt;\\|&gt; key)"
msgstr "Ĉeĥa (kun klavo &lt;\\|&gt;)"
-#: ../rules/base.xml.in.h:398
+#: ../rules/base.xml.in.h:399
msgid "Czech (qwerty)"
msgstr "Ĉeĥa (qwerty)"
-#: ../rules/base.xml.in.h:399
+#: ../rules/base.xml.in.h:400
msgid "Czech (qwerty, extended Backslash)"
msgstr "Ĉeĥa (qwerty, etendita Retroklino)"
-#: ../rules/base.xml.in.h:400
+#: ../rules/base.xml.in.h:401
msgid "Czech (UCW layout, accented letters only)"
msgstr "Ĉeĥa (aranĝo UCW, nur diakritaĵoj)"
-#: ../rules/base.xml.in.h:401
+#: ../rules/base.xml.in.h:402
msgid "Czech (US Dvorak with CZ UCW support)"
msgstr "Ĉeĥa (usona Dvorako kun subteno al CZ UCW)"
#. Keyboard indicator for Danish layouts
-#: ../rules/base.xml.in.h:403 ../rules/base.extras.xml.in.h:76
+#: ../rules/base.xml.in.h:404 ../rules/base.extras.xml.in.h:77
msgid "da"
msgstr "da"
-#: ../rules/base.xml.in.h:404 ../rules/base.extras.xml.in.h:77
+#: ../rules/base.xml.in.h:405 ../rules/base.extras.xml.in.h:78
msgid "Danish"
msgstr "Dana"
-#: ../rules/base.xml.in.h:405
+#: ../rules/base.xml.in.h:406
msgid "Danish (eliminate dead keys)"
msgstr "Dana (forigi senpaŝajn klavojn)"
-#: ../rules/base.xml.in.h:406
+#: ../rules/base.xml.in.h:407
msgid "Danish (Macintosh)"
msgstr "Dana (Macintosh)"
-#: ../rules/base.xml.in.h:407
+#: ../rules/base.xml.in.h:408
msgid "Danish (Macintosh, eliminate dead keys)"
msgstr "Dana (Macintosh, forigi senpaŝajn klavojn)"
-#: ../rules/base.xml.in.h:408
+#: ../rules/base.xml.in.h:409
msgid "Danish (Dvorak)"
msgstr "Dana (Dvorako)"
#. Keyboard indicator for Dutch layouts
-#: ../rules/base.xml.in.h:410 ../rules/base.extras.xml.in.h:79
+#: ../rules/base.xml.in.h:411 ../rules/base.extras.xml.in.h:80
msgid "nl"
msgstr "nl"
-#: ../rules/base.xml.in.h:411 ../rules/base.extras.xml.in.h:80
+#: ../rules/base.xml.in.h:412 ../rules/base.extras.xml.in.h:81
msgid "Dutch"
msgstr "Nederlanda"
-#: ../rules/base.xml.in.h:412
+#: ../rules/base.xml.in.h:413
msgid "Dutch (Sun dead keys)"
msgstr "Nederlanda (senpaŝaj klavoj de Sun)"
-#: ../rules/base.xml.in.h:413
+#: ../rules/base.xml.in.h:414
msgid "Dutch (Macintosh)"
msgstr "Nederlanda (Macintosh)"
-#: ../rules/base.xml.in.h:414
+#: ../rules/base.xml.in.h:415
msgid "Dutch (standard)"
msgstr "Nederlanda (norma)"
#. Keyboard indicator for Dzongkha layouts
-#: ../rules/base.xml.in.h:416
+#: ../rules/base.xml.in.h:417
msgid "dz"
msgstr "dz"
-#: ../rules/base.xml.in.h:417
+#: ../rules/base.xml.in.h:418
msgid "Dzongkha"
msgstr "Dzonka"
#. Keyboard indicator for Estonian layouts
-#: ../rules/base.xml.in.h:419 ../rules/base.extras.xml.in.h:82
+#: ../rules/base.xml.in.h:420 ../rules/base.extras.xml.in.h:83
msgid "et"
msgstr "et"
-#: ../rules/base.xml.in.h:420 ../rules/base.extras.xml.in.h:83
+#: ../rules/base.xml.in.h:421 ../rules/base.extras.xml.in.h:84
msgid "Estonian"
msgstr "Estona"
-#: ../rules/base.xml.in.h:421
+#: ../rules/base.xml.in.h:422
msgid "Estonian (eliminate dead keys)"
msgstr "Estona (forigi senpaŝajn klavojn)"
-#: ../rules/base.xml.in.h:422
+#: ../rules/base.xml.in.h:423
msgid "Estonian (Dvorak)"
msgstr "Estona (Dvorako)"
-#: ../rules/base.xml.in.h:423
+#: ../rules/base.xml.in.h:424
msgid "Estonian (US keyboard with Estonian letters)"
msgstr "Estona (Usona klavaro kun estonaj literoj)"
-#: ../rules/base.xml.in.h:424 ../rules/base.extras.xml.in.h:16
+#: ../rules/base.xml.in.h:425 ../rules/base.extras.xml.in.h:16
msgid "Persian"
msgstr "Persa"
-#: ../rules/base.xml.in.h:425
+#: ../rules/base.xml.in.h:426
msgid "Persian (with Persian Keypad)"
msgstr "Persa (kun persa ciferklavaro)"
#. Keyboard indicator for Kurdish layouts
-#: ../rules/base.xml.in.h:427
+#: ../rules/base.xml.in.h:428
msgid "ku"
msgstr "ku"
-#: ../rules/base.xml.in.h:428
+#: ../rules/base.xml.in.h:429
msgid "Kurdish (Iran, Latin Q)"
msgstr "Kurda (Irano, Latina Q)"
-#: ../rules/base.xml.in.h:429
+#: ../rules/base.xml.in.h:430
msgid "Kurdish (Iran, F)"
msgstr "Kurda (Irano, F)"
-#: ../rules/base.xml.in.h:430
+#: ../rules/base.xml.in.h:431
msgid "Kurdish (Iran, Latin Alt-Q)"
msgstr "Kurda (Irano, Latina Alt-Q)"
-#: ../rules/base.xml.in.h:431
+#: ../rules/base.xml.in.h:432
msgid "Kurdish (Iran, Arabic-Latin)"
msgstr "Kurda (Irano, Araba-Latina)"
-#: ../rules/base.xml.in.h:432
+#: ../rules/base.xml.in.h:433
msgid "Iraqi"
msgstr "Iraka"
-#: ../rules/base.xml.in.h:433
+#: ../rules/base.xml.in.h:434
msgid "Kurdish (Iraq, Latin Q)"
msgstr "Kurda (Irako, Latina Q)"
-#: ../rules/base.xml.in.h:434
+#: ../rules/base.xml.in.h:435
msgid "Kurdish (Iraq, F)"
msgstr "Kurda, (Irako, F)"
-#: ../rules/base.xml.in.h:435
+#: ../rules/base.xml.in.h:436
msgid "Kurdish (Iraq, Latin Alt-Q)"
msgstr "Kurda (Irako, Latina Alt-Q)"
-#: ../rules/base.xml.in.h:436
+#: ../rules/base.xml.in.h:437
msgid "Kurdish (Iraq, Arabic-Latin)"
msgstr "Kurda (Irako, Araba-Latina)"
#. Keyboard indicator for Faroese layouts
-#: ../rules/base.xml.in.h:438
+#: ../rules/base.xml.in.h:439
msgid "fo"
msgstr "fo"
-#: ../rules/base.xml.in.h:439
+#: ../rules/base.xml.in.h:440
msgid "Faroese"
msgstr "Feroa"
-#: ../rules/base.xml.in.h:440
+#: ../rules/base.xml.in.h:441
msgid "Faroese (eliminate dead keys)"
msgstr "Feroa (forigi senpaŝajn klavojn)"
#. Keyboard indicator for Finnish layouts
-#: ../rules/base.xml.in.h:442 ../rules/base.extras.xml.in.h:85
+#: ../rules/base.xml.in.h:443 ../rules/base.extras.xml.in.h:86
msgid "fi"
msgstr "fi"
-#: ../rules/base.xml.in.h:443 ../rules/base.extras.xml.in.h:86
+#: ../rules/base.xml.in.h:444 ../rules/base.extras.xml.in.h:87
msgid "Finnish"
msgstr "Finna"
-#: ../rules/base.xml.in.h:444
+#: ../rules/base.xml.in.h:445
msgid "Finnish (classic)"
msgstr "Finna (klasika)"
-#: ../rules/base.xml.in.h:445
+#: ../rules/base.xml.in.h:446
msgid "Finnish (classic, eliminate dead keys)"
msgstr "Finna (klasika, forigi senpaŝajn klavojn)"
-#: ../rules/base.xml.in.h:446
+#: ../rules/base.xml.in.h:447
msgid "Northern Saami (Finland)"
msgstr "Norda Samea (Finlando)"
-#: ../rules/base.xml.in.h:447
+#: ../rules/base.xml.in.h:448
msgid "Finnish (Macintosh)"
msgstr "Finna (Macintosh)"
-#: ../rules/base.xml.in.h:448 ../rules/base.extras.xml.in.h:88
+#: ../rules/base.xml.in.h:449 ../rules/base.extras.xml.in.h:89
msgid "French"
msgstr "Franca"
-#: ../rules/base.xml.in.h:449
+#: ../rules/base.xml.in.h:450
msgid "French (eliminate dead keys)"
msgstr "Franca (forigi senpaŝajn klavojn)"
-#: ../rules/base.xml.in.h:450
+#: ../rules/base.xml.in.h:451
msgid "French (Sun dead keys)"
msgstr "Franca (senpaŝaj klavoj de Sun)"
-#: ../rules/base.xml.in.h:451
+#: ../rules/base.xml.in.h:452
msgid "French (alternative)"
msgstr "Franca (alternativa)"
-#: ../rules/base.xml.in.h:452
+#: ../rules/base.xml.in.h:453
msgid "French (alternative, Latin-9 only)"
msgstr "Franca (alternativa, nur Latin-9)"
-#: ../rules/base.xml.in.h:453
+#: ../rules/base.xml.in.h:454
msgid "French (alternative, eliminate dead keys)"
msgstr "Franca (alternativa, forigi senpaŝajn klavojn)"
-#: ../rules/base.xml.in.h:454
+#: ../rules/base.xml.in.h:455
msgid "French (alternative, Sun dead keys)"
msgstr "Franca (alternava, senpaŝaj klavoj de Sun)"
-#: ../rules/base.xml.in.h:455
+#: ../rules/base.xml.in.h:456
msgid "French (legacy, alternative)"
msgstr "Franca (malmoderna, alternativa)"
-#: ../rules/base.xml.in.h:456
+#: ../rules/base.xml.in.h:457
msgid "French (legacy, alternative, eliminate dead keys)"
msgstr "Franca (malmoderna, alternativa, forigi senpaŝajn klavojn)"
-#: ../rules/base.xml.in.h:457
+#: ../rules/base.xml.in.h:458
msgid "French (legacy, alternative, Sun dead keys)"
msgstr "Franca (malmoderna, alternativa, senpaŝaj klavoj de Sun)"
-#: ../rules/base.xml.in.h:458
+#: ../rules/base.xml.in.h:459
msgid "French (Bepo, ergonomic, Dvorak way)"
msgstr "Franca (Bepo, komforteca, dvorake)"
-#: ../rules/base.xml.in.h:459
+#: ../rules/base.xml.in.h:460
msgid "French (Bepo, ergonomic, Dvorak way, Latin-9 only)"
msgstr "Franca (Bepo, komforteca, dvorake, nur Latin-9)"
-#: ../rules/base.xml.in.h:460
+#: ../rules/base.xml.in.h:461
msgid "French (Dvorak)"
msgstr "Franca (Dvorako)"
-#: ../rules/base.xml.in.h:461
+#: ../rules/base.xml.in.h:462
msgid "French (Macintosh)"
msgstr "Franca (Macintosh)"
-#: ../rules/base.xml.in.h:462
+#: ../rules/base.xml.in.h:463
msgid "French (Breton)"
msgstr "Franca (Bretona)"
-#: ../rules/base.xml.in.h:463
+#: ../rules/base.xml.in.h:464
msgid "Occitan"
msgstr "Okcitana"
-#: ../rules/base.xml.in.h:464
+#: ../rules/base.xml.in.h:465
msgid "Georgian (France, AZERTY Tskapo)"
msgstr "Kartvela (Franca, AZERTY Tskapo)"
-#: ../rules/base.xml.in.h:465
+#: ../rules/base.xml.in.h:466
msgid "English (Ghana)"
msgstr "Angla (Ganao)"
-#: ../rules/base.xml.in.h:466
+#: ../rules/base.xml.in.h:467
msgid "English (Ghana, multilingual)"
msgstr "Angla (Ganao, plurlingva)"
#. Keyboard indicator for Akan layouts
-#: ../rules/base.xml.in.h:468
+#: ../rules/base.xml.in.h:469
msgid "ak"
msgstr "ak"
-#: ../rules/base.xml.in.h:469
+#: ../rules/base.xml.in.h:470
msgid "Akan"
msgstr "Akan"
#. Keyboard indicator for Ewe layouts
-#: ../rules/base.xml.in.h:471
+#: ../rules/base.xml.in.h:472
msgid "ee"
msgstr "ee"
-#: ../rules/base.xml.in.h:472
+#: ../rules/base.xml.in.h:473
msgid "Ewe"
msgstr "Ewe"
#. Keyboard indicator for Fula layouts
-#: ../rules/base.xml.in.h:474
+#: ../rules/base.xml.in.h:475
msgid "ff"
msgstr "ff"
-#: ../rules/base.xml.in.h:475
+#: ../rules/base.xml.in.h:476
msgid "Fula"
msgstr "Fula"
#. Keyboard indicator for Ga layouts
-#: ../rules/base.xml.in.h:477
+#: ../rules/base.xml.in.h:478
msgid "gaa"
msgstr "gaa"
-#: ../rules/base.xml.in.h:478
+#: ../rules/base.xml.in.h:479
msgid "Ga"
msgstr "Ga"
#. Keyboard indicator for Hausa layouts
-#: ../rules/base.xml.in.h:480
+#: ../rules/base.xml.in.h:481
msgid "ha"
msgstr "ha"
-#: ../rules/base.xml.in.h:481
+#: ../rules/base.xml.in.h:482
msgid "Hausa"
msgstr "Haŭsa"
#. Keyboard indicator for Avatime layouts
-#: ../rules/base.xml.in.h:483
+#: ../rules/base.xml.in.h:484
msgid "avn"
msgstr "avn"
-#: ../rules/base.xml.in.h:484
+#: ../rules/base.xml.in.h:485
msgid "Avatime"
msgstr "Avatime"
-#: ../rules/base.xml.in.h:485
+#: ../rules/base.xml.in.h:486
msgid "English (Ghana, GILLBT)"
msgstr "Angla (Ganao, GILLBT)"
-#: ../rules/base.xml.in.h:486
+#: ../rules/base.xml.in.h:487
msgid "French (Guinea)"
msgstr "Franca (Gvineo)"
#. Keyboard indicator for Georgian layouts
-#: ../rules/base.xml.in.h:488
+#: ../rules/base.xml.in.h:489
msgid "ka"
msgstr "ka"
-#: ../rules/base.xml.in.h:489
+#: ../rules/base.xml.in.h:490
msgid "Georgian"
msgstr "Kartvela"
-#: ../rules/base.xml.in.h:490
+#: ../rules/base.xml.in.h:491
msgid "Georgian (ergonomic)"
msgstr "Kartvela (komforteca)"
-#: ../rules/base.xml.in.h:491
+#: ../rules/base.xml.in.h:492
msgid "Georgian (MESS)"
msgstr "Kartvela (MESS)"
-#: ../rules/base.xml.in.h:492
+#: ../rules/base.xml.in.h:493
msgid "Russian (Georgia)"
msgstr "Rusa (Kartvela)"
-#: ../rules/base.xml.in.h:493
+#: ../rules/base.xml.in.h:494
msgid "Ossetian (Georgia)"
msgstr "Oseta (Kartvelujo)"
-#: ../rules/base.xml.in.h:494 ../rules/base.extras.xml.in.h:11
+#: ../rules/base.xml.in.h:495 ../rules/base.extras.xml.in.h:11
msgid "German"
msgstr "Germana"
-#: ../rules/base.xml.in.h:495
+#: ../rules/base.xml.in.h:496
msgid "German (dead acute)"
msgstr "Germana (senpaŝa dekstra korno)"
-#: ../rules/base.xml.in.h:496
+#: ../rules/base.xml.in.h:497
msgid "German (dead grave acute)"
msgstr "Germana (senpaŝa maldekstra/dekstra korno)"
-#: ../rules/base.xml.in.h:497
+#: ../rules/base.xml.in.h:498
msgid "German (eliminate dead keys)"
msgstr "Germana (forigi senpaŝajn klavojn)"
-#: ../rules/base.xml.in.h:498
+#: ../rules/base.xml.in.h:499
msgid "German (T3)"
msgstr "Germana (T3)"
-#: ../rules/base.xml.in.h:499
+#: ../rules/base.xml.in.h:500
msgid "Romanian (Germany)"
msgstr "Rumana (Germanujo)"
-#: ../rules/base.xml.in.h:500
+#: ../rules/base.xml.in.h:501
msgid "Romanian (Germany, eliminate dead keys)"
msgstr "Rumana (Germanujo, forigi senpaŝajn klavojn)"
-#: ../rules/base.xml.in.h:501
+#: ../rules/base.xml.in.h:502
msgid "German (Dvorak)"
msgstr "Germana (Dvorako)"
-#: ../rules/base.xml.in.h:502
+#: ../rules/base.xml.in.h:503
msgid "German (Sun dead keys)"
msgstr "Germana (senpaŝaj klavoj de Sun)"
-#: ../rules/base.xml.in.h:503
+#: ../rules/base.xml.in.h:504
msgid "German (Neo 2)"
msgstr "Germana (Neo 2)"
-#: ../rules/base.xml.in.h:504
+#: ../rules/base.xml.in.h:505
msgid "German (Macintosh)"
msgstr "Germana (Macintosh)"
-#: ../rules/base.xml.in.h:505
+#: ../rules/base.xml.in.h:506
msgid "German (Macintosh, eliminate dead keys)"
msgstr "Germana (Macintosh, forigi senpaŝajn klavojn)"
-#: ../rules/base.xml.in.h:506
+#: ../rules/base.xml.in.h:507
msgid "Lower Sorbian"
msgstr "Malsupra Soraba"
-#: ../rules/base.xml.in.h:507
+#: ../rules/base.xml.in.h:508
msgid "Lower Sorbian (qwertz)"
msgstr "Malsupra Soraba (qwertz)"
-#: ../rules/base.xml.in.h:508
+#: ../rules/base.xml.in.h:509
msgid "German (qwerty)"
msgstr "Germana (qwerty)"
-#: ../rules/base.xml.in.h:509
+#: ../rules/base.xml.in.h:510
msgid "Russian (Germany, phonetic)"
msgstr "Rusa (Germana, fonetika)"
-#: ../rules/base.xml.in.h:510
+#: ../rules/base.xml.in.h:511
msgid "German (legacy)"
msgstr "Germana (malmoderna)"
#. Keyboard indicator for Greek layouts
-#: ../rules/base.xml.in.h:512 ../rules/base.extras.xml.in.h:90
+#: ../rules/base.xml.in.h:513 ../rules/base.extras.xml.in.h:91
msgid "gr"
msgstr "gr"
-#: ../rules/base.xml.in.h:513 ../rules/base.extras.xml.in.h:91
+#: ../rules/base.xml.in.h:514 ../rules/base.extras.xml.in.h:92
msgid "Greek"
msgstr "Greka"
-#: ../rules/base.xml.in.h:514
+#: ../rules/base.xml.in.h:515
msgid "Greek (simple)"
msgstr "Greka (simpla)"
-#: ../rules/base.xml.in.h:515
+#: ../rules/base.xml.in.h:516
msgid "Greek (extended)"
msgstr "Greka (etendita)"
-#: ../rules/base.xml.in.h:516
+#: ../rules/base.xml.in.h:517
msgid "Greek (eliminate dead keys)"
msgstr "Greka (forigi senpaŝajn klavojn)"
-#: ../rules/base.xml.in.h:517
+#: ../rules/base.xml.in.h:518
msgid "Greek (polytonic)"
msgstr "Greka (plurtona)"
#. Keyboard indicator for Hungarian layouts
-#: ../rules/base.xml.in.h:519
+#: ../rules/base.xml.in.h:520
msgid "hu"
msgstr "hu"
-#: ../rules/base.xml.in.h:520
+#: ../rules/base.xml.in.h:521
msgid "Hungarian"
msgstr "Hungara"
-#: ../rules/base.xml.in.h:521
+#: ../rules/base.xml.in.h:522
msgid "Hungarian (standard)"
msgstr "Hungara (norma)"
-#: ../rules/base.xml.in.h:522
+#: ../rules/base.xml.in.h:523
msgid "Hungarian (eliminate dead keys)"
msgstr "Hungara (forigi senpaŝajn klavojn)"
-#: ../rules/base.xml.in.h:523
+#: ../rules/base.xml.in.h:524
msgid "Hungarian (qwerty)"
msgstr "Hungara (qwerty)"
-#: ../rules/base.xml.in.h:524
+#: ../rules/base.xml.in.h:525
msgid "Hungarian (101/qwertz/comma/dead keys)"
msgstr "Hungara (101/qwertz/komo/senpaŝaj klavoj)"
-#: ../rules/base.xml.in.h:525
+#: ../rules/base.xml.in.h:526
msgid "Hungarian (101/qwertz/comma/eliminate dead keys)"
msgstr "Hungara (101/qwertz/komo/forigi senpaŝajn klavojn)"
-#: ../rules/base.xml.in.h:526
+#: ../rules/base.xml.in.h:527
msgid "Hungarian (101/qwertz/dot/dead keys)"
msgstr "Hungara (101/qwertz/punkto/senpaŝaj klavoj)"
-#: ../rules/base.xml.in.h:527
+#: ../rules/base.xml.in.h:528
msgid "Hungarian (101/qwertz/dot/eliminate dead keys)"
msgstr "Hungara (101/qwertz/punkto/forigi senpaŝajn klavojn)"
-#: ../rules/base.xml.in.h:528
+#: ../rules/base.xml.in.h:529
msgid "Hungarian (101/qwerty/comma/dead keys)"
msgstr "Hungara (101/qwerty/komo/senpaŝaj klavoj)"
-#: ../rules/base.xml.in.h:529
+#: ../rules/base.xml.in.h:530
msgid "Hungarian (101/qwerty/comma/eliminate dead keys)"
msgstr "Hungara (101/qwerty/komo/forigi senpaŝajn klavojn)"
-#: ../rules/base.xml.in.h:530
+#: ../rules/base.xml.in.h:531
msgid "Hungarian (101/qwerty/dot/dead keys)"
msgstr "Hungara (101/qwerty/punkto/senpaŝaj klavoj)"
-#: ../rules/base.xml.in.h:531
+#: ../rules/base.xml.in.h:532
msgid "Hungarian (101/qwerty/dot/eliminate dead keys)"
msgstr "Hungara (101/qwerty/punkto/forigi senpaŝajn klavojn)"
-#: ../rules/base.xml.in.h:532
+#: ../rules/base.xml.in.h:533
msgid "Hungarian (102/qwertz/comma/dead keys)"
msgstr "Hungara (102/qwertz/komo/senpaŝaj klavoj)"
-#: ../rules/base.xml.in.h:533
+#: ../rules/base.xml.in.h:534
msgid "Hungarian (102/qwertz/comma/eliminate dead keys)"
msgstr "Hungara (102/qwertz/komo/forigi senpaŝajn klavojn)"
-#: ../rules/base.xml.in.h:534
+#: ../rules/base.xml.in.h:535
msgid "Hungarian (102/qwertz/dot/dead keys)"
msgstr "Hungara (102/qwertz/punkto/senpaŝaj klavoj)"
-#: ../rules/base.xml.in.h:535
+#: ../rules/base.xml.in.h:536
msgid "Hungarian (102/qwertz/dot/eliminate dead keys)"
msgstr "Hungara (102/qwertz/punkto/forigi senpaŝajn klavojn)"
-#: ../rules/base.xml.in.h:536
+#: ../rules/base.xml.in.h:537
msgid "Hungarian (102/qwerty/comma/dead keys)"
msgstr "Hungara (102/qwerty/komo/senpaŝaj klavoj)"
-#: ../rules/base.xml.in.h:537
+#: ../rules/base.xml.in.h:538
msgid "Hungarian (102/qwerty/comma/eliminate dead keys)"
msgstr "Hungara (102/qwerty/komo/forigi senpaŝajn klavojn)"
-#: ../rules/base.xml.in.h:538
+#: ../rules/base.xml.in.h:539
msgid "Hungarian (102/qwerty/dot/dead keys)"
msgstr "Hungara (102/qwerty/punkto/senpaŝaj klavoj)"
-#: ../rules/base.xml.in.h:539
+#: ../rules/base.xml.in.h:540
msgid "Hungarian (102/qwerty/dot/eliminate dead keys)"
msgstr "Hungara (102/qwerty/punkto/forigi senpaŝajn klavojn)"
#. Keyboard indicator for Icelandic layouts
-#: ../rules/base.xml.in.h:541
+#: ../rules/base.xml.in.h:542
msgid "is"
msgstr "is"
-#: ../rules/base.xml.in.h:542
+#: ../rules/base.xml.in.h:543
msgid "Icelandic"
msgstr "Islanda"
-#: ../rules/base.xml.in.h:543
+#: ../rules/base.xml.in.h:544
msgid "Icelandic (Sun dead keys)"
msgstr "Islanda (senpaŝaj klavoj de Sun)"
-#: ../rules/base.xml.in.h:544
+#: ../rules/base.xml.in.h:545
msgid "Icelandic (eliminate dead keys)"
msgstr "Islanda (forigi senpaŝajn klavojn)"
-#: ../rules/base.xml.in.h:545
+#: ../rules/base.xml.in.h:546
msgid "Icelandic (Macintosh)"
msgstr "Islanda (Macintosh)"
-#: ../rules/base.xml.in.h:546
+#: ../rules/base.xml.in.h:547
msgid "Icelandic (Dvorak)"
msgstr "Islanda (Dvorako)"
#. Keyboard indicator for Hebrew layouts
-#: ../rules/base.xml.in.h:548 ../rules/base.extras.xml.in.h:61
+#: ../rules/base.xml.in.h:549 ../rules/base.extras.xml.in.h:62
msgid "he"
msgstr "he"
-#: ../rules/base.xml.in.h:549 ../rules/base.extras.xml.in.h:62
+#: ../rules/base.xml.in.h:550 ../rules/base.extras.xml.in.h:63
msgid "Hebrew"
msgstr "Hebrea"
-#: ../rules/base.xml.in.h:550
+#: ../rules/base.xml.in.h:551
msgid "Hebrew (lyx)"
msgstr "Hebrea (lyx)"
-#: ../rules/base.xml.in.h:551
+#: ../rules/base.xml.in.h:552
msgid "Hebrew (phonetic)"
msgstr "Hebrea (fonetika)"
-#: ../rules/base.xml.in.h:552
+#: ../rules/base.xml.in.h:553
msgid "Hebrew (Biblical, Tiro)"
msgstr "Hebrea (Biblia, Tiro)"
#. Keyboard indicator for Italian layouts
-#: ../rules/base.xml.in.h:554 ../rules/base.extras.xml.in.h:93
+#: ../rules/base.xml.in.h:555 ../rules/base.extras.xml.in.h:94
msgid "it"
msgstr "it"
-#: ../rules/base.xml.in.h:555 ../rules/base.extras.xml.in.h:94
+#: ../rules/base.xml.in.h:556 ../rules/base.extras.xml.in.h:95
msgid "Italian"
msgstr "Itala"
-#: ../rules/base.xml.in.h:556
+#: ../rules/base.xml.in.h:557
msgid "Italian (eliminate dead keys)"
msgstr "Itala (forigi senpaŝajn klavojn)"
-#: ../rules/base.xml.in.h:557
+#: ../rules/base.xml.in.h:558
msgid "Italian (Macintosh)"
msgstr "Itala (Macintosh)"
-#: ../rules/base.xml.in.h:558
+#: ../rules/base.xml.in.h:559
msgid "Italian (US keyboard with Italian letters)"
msgstr "Itala (usona klavaro kun italaj literoj)"
-#: ../rules/base.xml.in.h:559
+#: ../rules/base.xml.in.h:560
msgid "Georgian (Italy)"
msgstr "Kartvela (Italujo)"
-#: ../rules/base.xml.in.h:560
+#: ../rules/base.xml.in.h:561
msgid "Italian (IBM 142)"
msgstr "Itala (IBM 142)"
#. Keyboard indicator for Japanese layouts
-#: ../rules/base.xml.in.h:562 ../rules/base.extras.xml.in.h:96
+#: ../rules/base.xml.in.h:563 ../rules/base.extras.xml.in.h:97
msgid "ja"
msgstr "ja"
-#: ../rules/base.xml.in.h:563 ../rules/base.extras.xml.in.h:97
+#: ../rules/base.xml.in.h:564 ../rules/base.extras.xml.in.h:98
msgid "Japanese"
msgstr "Japana"
-#: ../rules/base.xml.in.h:564
+#: ../rules/base.xml.in.h:565
msgid "Japanese (Kana)"
msgstr "Japana (Kanao)"
-#: ../rules/base.xml.in.h:565
+#: ../rules/base.xml.in.h:566
msgid "Japanese (Kana 86)"
msgstr "Japana (Kanao 86)"
-#: ../rules/base.xml.in.h:566
+#: ../rules/base.xml.in.h:567
msgid "Japanese (OADG 109A)"
msgstr "Japana (OADG 109A)"
-#: ../rules/base.xml.in.h:567
+#: ../rules/base.xml.in.h:568
msgid "Japanese (Macintosh)"
msgstr "Japana (Macintosh)"
-#: ../rules/base.xml.in.h:568
+#: ../rules/base.xml.in.h:569
msgid "Japanese (Dvorak)"
msgstr "Japana (Dvorako)"
#. Keyboard indicator for Kikuyu layouts
-#: ../rules/base.xml.in.h:570
+#: ../rules/base.xml.in.h:571
msgid "ki"
msgstr "ki"
-#: ../rules/base.xml.in.h:571
+#: ../rules/base.xml.in.h:572
msgid "Kyrgyz"
msgstr "Kirgiza"
-#: ../rules/base.xml.in.h:572
+#: ../rules/base.xml.in.h:573
msgid "Kyrgyz (phonetic)"
msgstr "Kirgiza (fonetika)"
#. Keyboard indicator for Khmer layouts
-#: ../rules/base.xml.in.h:574
+#: ../rules/base.xml.in.h:575
msgid "km"
msgstr "km"
-#: ../rules/base.xml.in.h:575
+#: ../rules/base.xml.in.h:576
msgid "Khmer (Cambodia)"
msgstr "Kmera (Kamboĝo)"
#. Keyboard indicator for Kazakh layouts
-#: ../rules/base.xml.in.h:577
+#: ../rules/base.xml.in.h:578
msgid "kk"
msgstr "kk"
-#: ../rules/base.xml.in.h:578
+#: ../rules/base.xml.in.h:579
msgid "Kazakh"
msgstr "Kazaĥa"
-#: ../rules/base.xml.in.h:579
+#: ../rules/base.xml.in.h:580
msgid "Russian (Kazakhstan, with Kazakh)"
msgstr "Rusa (Kazaĥujo, kun Kazaĥa)"
-#: ../rules/base.xml.in.h:580
+#: ../rules/base.xml.in.h:581
msgid "Kazakh (with Russian)"
msgstr "Kazaĥa (kun Rusa)"
#. Keyboard indicator for Lao layouts
-#: ../rules/base.xml.in.h:582
+#: ../rules/base.xml.in.h:583
msgid "lo"
msgstr "lo"
-#: ../rules/base.xml.in.h:583
+#: ../rules/base.xml.in.h:584
msgid "Lao"
msgstr "Lao"
-#: ../rules/base.xml.in.h:584
+#: ../rules/base.xml.in.h:585
msgid "Lao (STEA proposed standard layout)"
msgstr "Lao (norma aranĝo proponita de STEA)"
#. Keyboard indicator for Spanish layouts
-#: ../rules/base.xml.in.h:586 ../rules/base.extras.xml.in.h:109
+#: ../rules/base.xml.in.h:587 ../rules/base.extras.xml.in.h:110
msgid "es"
msgstr "es"
-#: ../rules/base.xml.in.h:587
+#: ../rules/base.xml.in.h:588
msgid "Spanish (Latin American)"
msgstr "Hispana (Latin-amerika)"
-#: ../rules/base.xml.in.h:588
+#: ../rules/base.xml.in.h:589
msgid "Spanish (Latin American, eliminate dead keys)"
msgstr "Hispana (Latin-amerika, forigi senpaŝajn klavojn)"
-#: ../rules/base.xml.in.h:589
+#: ../rules/base.xml.in.h:590
msgid "Spanish (Latin American, include dead tilde)"
msgstr "Hispana (Latin-amerika, inkluzive senpaŝa tildo)"
-#: ../rules/base.xml.in.h:590
+#: ../rules/base.xml.in.h:591
msgid "Spanish (Latin American, Sun dead keys)"
msgstr "Hispana (Latin-amerika, senpaŝaj klavoj de Sun)"
#. Keyboard indicator for Lithuanian layouts
-#: ../rules/base.xml.in.h:592 ../rules/base.extras.xml.in.h:18
+#: ../rules/base.xml.in.h:593 ../rules/base.extras.xml.in.h:18
msgid "lt"
msgstr "lt"
-#: ../rules/base.xml.in.h:593 ../rules/base.extras.xml.in.h:19
+#: ../rules/base.xml.in.h:594 ../rules/base.extras.xml.in.h:19
msgid "Lithuanian"
msgstr "Litova"
-#: ../rules/base.xml.in.h:594
+#: ../rules/base.xml.in.h:595
msgid "Lithuanian (standard)"
msgstr "Litova (norma)"
-#: ../rules/base.xml.in.h:595
+#: ../rules/base.xml.in.h:596
msgid "Lithuanian (US keyboard with Lithuanian letters)"
msgstr "Litova (Usona klavaro kun litovaj literoj)"
-#: ../rules/base.xml.in.h:596
+#: ../rules/base.xml.in.h:597
msgid "Lithuanian (IBM LST 1205-92)"
msgstr "Litova (IBM LST 1205-92)"
-#: ../rules/base.xml.in.h:597
+#: ../rules/base.xml.in.h:598
msgid "Lithuanian (LEKP)"
msgstr "Litova (LEKP)"
-#: ../rules/base.xml.in.h:598
+#: ../rules/base.xml.in.h:599
msgid "Lithuanian (LEKPa)"
msgstr "Litova (LEKPa)"
#. Keyboard indicator for Latvian layouts
-#: ../rules/base.xml.in.h:600 ../rules/base.extras.xml.in.h:22
+#: ../rules/base.xml.in.h:601 ../rules/base.extras.xml.in.h:22
msgid "lv"
msgstr "lv"
-#: ../rules/base.xml.in.h:601 ../rules/base.extras.xml.in.h:23
+#: ../rules/base.xml.in.h:602 ../rules/base.extras.xml.in.h:23
msgid "Latvian"
msgstr "Latva"
-#: ../rules/base.xml.in.h:602
+#: ../rules/base.xml.in.h:603
msgid "Latvian (apostrophe variant)"
msgstr "Latva (citila variaĵo)"
-#: ../rules/base.xml.in.h:603
+#: ../rules/base.xml.in.h:604
msgid "Latvian (tilde variant)"
msgstr "Latva (tilda variaĵo)"
-#: ../rules/base.xml.in.h:604
+#: ../rules/base.xml.in.h:605
msgid "Latvian (F variant)"
msgstr "Latva (variaĵo F)"
-#: ../rules/base.xml.in.h:605
+#: ../rules/base.xml.in.h:606
msgid "Latvian (modern)"
msgstr "Latva (moderna)"
-#: ../rules/base.xml.in.h:606
+#: ../rules/base.xml.in.h:607
msgid "Latvian (ergonomic, ŪGJRMV)"
msgstr "Latva (komforteca, ŪGJRMV)"
-#: ../rules/base.xml.in.h:607
+#: ../rules/base.xml.in.h:608
msgid "Latvian (adapted)"
msgstr "Latva (adaptita)"
#. Keyboard indicator for Maori layouts
-#: ../rules/base.xml.in.h:609
+#: ../rules/base.xml.in.h:610
msgid "mi"
msgstr "mi"
-#: ../rules/base.xml.in.h:610
+#: ../rules/base.xml.in.h:611
msgid "Maori"
msgstr "Maoria"
#. Keyboard indicator for Serbian layouts
-#: ../rules/base.xml.in.h:612 ../rules/base.extras.xml.in.h:51
+#: ../rules/base.xml.in.h:613 ../rules/base.extras.xml.in.h:52
msgid "sr"
msgstr "sr"
-#: ../rules/base.xml.in.h:613
+#: ../rules/base.xml.in.h:614
msgid "Montenegrin"
msgstr "Montenegra"
-#: ../rules/base.xml.in.h:614
+#: ../rules/base.xml.in.h:615
msgid "Montenegrin (Cyrillic)"
msgstr "Montenegra (Cirila)"
-#: ../rules/base.xml.in.h:615
+#: ../rules/base.xml.in.h:616
msgid "Montenegrin (Cyrillic, Z and ZHE swapped)"
msgstr "Montenegra (Cirila, Z kaj ZHE interŝanĝita)"
-#: ../rules/base.xml.in.h:616
+#: ../rules/base.xml.in.h:617
msgid "Montenegrin (Latin Unicode)"
msgstr "Montenegra (Latina Unikodo)"
-#: ../rules/base.xml.in.h:617
+#: ../rules/base.xml.in.h:618
msgid "Montenegrin (Latin qwerty)"
msgstr "Montenegra (Latina qwerty)"
-#: ../rules/base.xml.in.h:618
+#: ../rules/base.xml.in.h:619
msgid "Montenegrin (Latin Unicode qwerty)"
msgstr "Montenegra (Latina Unikodo qwerty)"
-#: ../rules/base.xml.in.h:619
+#: ../rules/base.xml.in.h:620
msgid "Montenegrin (Cyrillic with guillemets)"
msgstr "Montenegra (Cirila kun angul-citiloj)"
-#: ../rules/base.xml.in.h:620
+#: ../rules/base.xml.in.h:621
msgid "Montenegrin (Latin with guillemets)"
msgstr "Montenegra (Latina kun angul-citiloj)"
#. Keyboard indicator for Macedonian layouts
-#: ../rules/base.xml.in.h:622
+#: ../rules/base.xml.in.h:623
msgid "mk"
msgstr "mk"
-#: ../rules/base.xml.in.h:623
+#: ../rules/base.xml.in.h:624
msgid "Macedonian"
msgstr "Makedona"
-#: ../rules/base.xml.in.h:624
+#: ../rules/base.xml.in.h:625
msgid "Macedonian (eliminate dead keys)"
msgstr "Makedona (forigi senpaŝajn klavojn)"
#. Keyboard indicator for Maltese layouts
-#: ../rules/base.xml.in.h:626
+#: ../rules/base.xml.in.h:627
msgid "mt"
msgstr "mt"
-#: ../rules/base.xml.in.h:627
+#: ../rules/base.xml.in.h:628
msgid "Maltese"
msgstr "Malta"
-#: ../rules/base.xml.in.h:628
+#: ../rules/base.xml.in.h:629
msgid "Maltese (with US layout)"
msgstr "Malta (kun usona aranĝo)"
#. Keyboard indicator for Mongolian layouts
-#: ../rules/base.xml.in.h:630
+#: ../rules/base.xml.in.h:631
msgid "mn"
msgstr "mn"
-#: ../rules/base.xml.in.h:631
+#: ../rules/base.xml.in.h:632
msgid "Mongolian"
msgstr "Mongola"
#. Keyboard indicator for Norwegian layouts
-#: ../rules/base.xml.in.h:633 ../rules/base.extras.xml.in.h:101
+#: ../rules/base.xml.in.h:634 ../rules/base.extras.xml.in.h:102
msgid "no"
msgstr "no"
-#: ../rules/base.xml.in.h:634 ../rules/base.extras.xml.in.h:102
+#: ../rules/base.xml.in.h:635 ../rules/base.extras.xml.in.h:103
msgid "Norwegian"
msgstr "Norvega"
-#: ../rules/base.xml.in.h:635
+#: ../rules/base.xml.in.h:636
msgid "Norwegian (eliminate dead keys)"
msgstr "Norvega (forigi senpaŝajn klavojn)"
-#: ../rules/base.xml.in.h:636
+#: ../rules/base.xml.in.h:637
msgid "Norwegian (Dvorak)"
msgstr "Norvega (Dvorako)"
-#: ../rules/base.xml.in.h:637
+#: ../rules/base.xml.in.h:638
msgid "Northern Saami (Norway)"
msgstr "Norda Samea (Norvegujo)"
-#: ../rules/base.xml.in.h:638
+#: ../rules/base.xml.in.h:639
msgid "Northern Saami (Norway, eliminate dead keys)"
msgstr "Norda Samea (Norvegujo, forigi senpaŝajn klavojn)"
-#: ../rules/base.xml.in.h:639
+#: ../rules/base.xml.in.h:640
msgid "Norwegian (Macintosh)"
msgstr "Norvega (Macintosh)"
-#: ../rules/base.xml.in.h:640
+#: ../rules/base.xml.in.h:641
msgid "Norwegian (Macintosh, eliminate dead keys)"
msgstr "Norvega (Macintosh, forigi senpaŝajn klavojn)"
-#: ../rules/base.xml.in.h:641
+#: ../rules/base.xml.in.h:642
msgid "Norwegian (Colemak)"
msgstr "Norvega (Colemak)"
#. Keyboard indicator for Polish layouts
-#: ../rules/base.xml.in.h:643 ../rules/base.extras.xml.in.h:40
+#: ../rules/base.xml.in.h:644 ../rules/base.extras.xml.in.h:41
msgid "pl"
msgstr "pl"
-#: ../rules/base.xml.in.h:644 ../rules/base.extras.xml.in.h:41
+#: ../rules/base.xml.in.h:645 ../rules/base.extras.xml.in.h:42
msgid "Polish"
msgstr "Pola"
-#: ../rules/base.xml.in.h:645
+#: ../rules/base.xml.in.h:646
msgid "Polish (legacy)"
msgstr "Pola (malmoderna)"
-#: ../rules/base.xml.in.h:646
+#: ../rules/base.xml.in.h:647
msgid "Polish (qwertz)"
msgstr "Pola (qwertz)"
-#: ../rules/base.xml.in.h:647
+#: ../rules/base.xml.in.h:648
msgid "Polish (Dvorak)"
msgstr "Pola (Dvorako)"
-#: ../rules/base.xml.in.h:648
+#: ../rules/base.xml.in.h:649
msgid "Polish (Dvorak, Polish quotes on quotemark key)"
msgstr "Pola (Dvorako, polaj citiloj ĉe citila klavo)"
-#: ../rules/base.xml.in.h:649
+#: ../rules/base.xml.in.h:650
msgid "Polish (Dvorak, Polish quotes on key 1)"
msgstr "Pola (Dvorako, polaj citiloj ĉe klavo 1)"
-#: ../rules/base.xml.in.h:650
+#: ../rules/base.xml.in.h:651
msgid "Kashubian"
msgstr "Kaŝuba"
-#: ../rules/base.xml.in.h:651
+#: ../rules/base.xml.in.h:652
msgid "Russian (Poland, phonetic Dvorak)"
msgstr "Rusa (Polujo, fonetika Dvorako)"
-#: ../rules/base.xml.in.h:652
+#: ../rules/base.xml.in.h:653
msgid "Polish (programmer Dvorak)"
msgstr "Pola (Dvorako por programistoj)"
-#: ../rules/base.xml.in.h:653 ../rules/base.extras.xml.in.h:104
+#: ../rules/base.xml.in.h:654 ../rules/base.extras.xml.in.h:105
msgid "Portuguese"
msgstr "Portugala"
-#: ../rules/base.xml.in.h:654
+#: ../rules/base.xml.in.h:655
msgid "Portuguese (eliminate dead keys)"
msgstr "Portugala (forigi senpaŝajn klavojn)"
-#: ../rules/base.xml.in.h:655
+#: ../rules/base.xml.in.h:656
msgid "Portuguese (Sun dead keys)"
msgstr "Portugala (senpaŝaj klavoj de Sun)"
-#: ../rules/base.xml.in.h:656
+#: ../rules/base.xml.in.h:657
msgid "Portuguese (Macintosh)"
msgstr "Portugala (Macintosh)"
-#: ../rules/base.xml.in.h:657
+#: ../rules/base.xml.in.h:658
msgid "Portuguese (Macintosh, eliminate dead keys)"
msgstr "Portugala (Macintosh, forigi senpaŝajn klavojn)"
-#: ../rules/base.xml.in.h:658
+#: ../rules/base.xml.in.h:659
msgid "Portuguese (Macintosh, Sun dead keys)"
msgstr "Portugala (Macintosh, senpaŝaj klavoj de Sun)"
-#: ../rules/base.xml.in.h:659
+#: ../rules/base.xml.in.h:660
msgid "Portuguese (Nativo)"
msgstr "Portugala (Nativo)"
-#: ../rules/base.xml.in.h:660
+#: ../rules/base.xml.in.h:661
msgid "Portuguese (Nativo for US keyboards)"
msgstr "Portugala (Nativo por usonaj klavaroj)"
-#: ../rules/base.xml.in.h:661
+#: ../rules/base.xml.in.h:662
msgid "Esperanto (Portugal, Nativo)"
msgstr "Esperanto (Portugalujo, Nativo)"
#. Keyboard indicator for Romanian layouts
-#: ../rules/base.xml.in.h:663 ../rules/base.extras.xml.in.h:45
+#: ../rules/base.xml.in.h:664 ../rules/base.extras.xml.in.h:46
msgid "ro"
msgstr "ro"
-#: ../rules/base.xml.in.h:664 ../rules/base.extras.xml.in.h:46
+#: ../rules/base.xml.in.h:665 ../rules/base.extras.xml.in.h:47
msgid "Romanian"
msgstr "Rumana"
-#: ../rules/base.xml.in.h:665
+#: ../rules/base.xml.in.h:666
msgid "Romanian (cedilla)"
msgstr "Rumana (subhoko)"
-#: ../rules/base.xml.in.h:666
+#: ../rules/base.xml.in.h:667
msgid "Romanian (standard)"
msgstr "Rumana (norma)"
-#: ../rules/base.xml.in.h:667
+#: ../rules/base.xml.in.h:668
msgid "Romanian (standard cedilla)"
msgstr "Rumana (norma subhoko)"
-#: ../rules/base.xml.in.h:668
+#: ../rules/base.xml.in.h:669
msgid "Romanian (WinKeys)"
msgstr "Rumana (WinKeys)"
-#: ../rules/base.xml.in.h:669 ../rules/base.extras.xml.in.h:55
+#: ../rules/base.xml.in.h:670 ../rules/base.extras.xml.in.h:56
msgid "Russian"
msgstr "Rusa"
-#: ../rules/base.xml.in.h:670
+#: ../rules/base.xml.in.h:671
msgid "Russian (phonetic)"
msgstr "Rusa (fonetika)"
-#: ../rules/base.xml.in.h:671
+#: ../rules/base.xml.in.h:672
msgid "Russian (phonetic WinKeys)"
msgstr "Rusa (fonetika WinKeys)"
-#: ../rules/base.xml.in.h:672
+#: ../rules/base.xml.in.h:673
msgid "Russian (typewriter)"
msgstr "Rusa (skribmaŝina)"
-#: ../rules/base.xml.in.h:673
+#: ../rules/base.xml.in.h:674
msgid "Russian (legacy)"
msgstr "Rusa (malmoderna)"
-#: ../rules/base.xml.in.h:674
+#: ../rules/base.xml.in.h:675
msgid "Russian (typewriter, legacy)"
msgstr "Rusa (skribmaŝina, malmoderna)"
-#: ../rules/base.xml.in.h:675
+#: ../rules/base.xml.in.h:676
msgid "Tatar"
msgstr "Tatara"
-#: ../rules/base.xml.in.h:676
+#: ../rules/base.xml.in.h:677
msgid "Ossetian (legacy)"
msgstr "Oseta (malmoderna)"
-#: ../rules/base.xml.in.h:677
+#: ../rules/base.xml.in.h:678
msgid "Ossetian (WinKeys)"
msgstr "Oseta (WinKeys)"
-#: ../rules/base.xml.in.h:678
+#: ../rules/base.xml.in.h:679
msgid "Chuvash"
msgstr "Ĉuvaŝa"
-#: ../rules/base.xml.in.h:679
+#: ../rules/base.xml.in.h:680
msgid "Chuvash (Latin)"
msgstr "Ĉuvaŝa (Latina)"
-#: ../rules/base.xml.in.h:680
+#: ../rules/base.xml.in.h:681
msgid "Udmurt"
msgstr "Udmurta"
-#: ../rules/base.xml.in.h:681
+#: ../rules/base.xml.in.h:682
msgid "Komi"
msgstr "Komia"
-#: ../rules/base.xml.in.h:682
+#: ../rules/base.xml.in.h:683
msgid "Yakut"
msgstr "Jakuta"
-#: ../rules/base.xml.in.h:683
+#: ../rules/base.xml.in.h:684
msgid "Kalmyk"
msgstr "Kalmyk"
-#: ../rules/base.xml.in.h:684
+#: ../rules/base.xml.in.h:685
msgid "Russian (DOS)"
msgstr "Rusa (DOS)"
-#: ../rules/base.xml.in.h:685
+#: ../rules/base.xml.in.h:686
msgid "Russian (Macintosh)"
msgstr "Rusa (Macintosh)"
-#: ../rules/base.xml.in.h:686
+#: ../rules/base.xml.in.h:687
msgid "Serbian (Russia)"
msgstr "Serba (Rusujo)"
-#: ../rules/base.xml.in.h:687
+#: ../rules/base.xml.in.h:688
msgid "Bashkirian"
msgstr "Baŝkira"
-#: ../rules/base.xml.in.h:688
+#: ../rules/base.xml.in.h:689
msgid "Mari"
msgstr "Maria"
-#: ../rules/base.xml.in.h:689 ../rules/base.extras.xml.in.h:52
+#: ../rules/base.xml.in.h:690 ../rules/base.extras.xml.in.h:53
msgid "Serbian"
msgstr "Serba"
-#: ../rules/base.xml.in.h:690
+#: ../rules/base.xml.in.h:691
msgid "Serbian (Cyrillic, Z and ZHE swapped)"
msgstr "Serba (Cirila, Z kaj ZHE interŝanĝita)"
-#: ../rules/base.xml.in.h:691
+#: ../rules/base.xml.in.h:692
msgid "Serbian (Latin)"
msgstr "Serba (Latina)"
-#: ../rules/base.xml.in.h:692
+#: ../rules/base.xml.in.h:693
msgid "Serbian (Latin Unicode)"
msgstr "Serba (Latina Unikoda)"
-#: ../rules/base.xml.in.h:693
+#: ../rules/base.xml.in.h:694
msgid "Serbian (Latin qwerty)"
msgstr "Serba (Latina qwerty)"
-#: ../rules/base.xml.in.h:694
+#: ../rules/base.xml.in.h:695
msgid "Serbian (Latin Unicode qwerty)"
msgstr "Serba (Latina Unikoda qwerty)"
-#: ../rules/base.xml.in.h:695
+#: ../rules/base.xml.in.h:696
msgid "Serbian (Cyrillic with guillemets)"
msgstr "Serba (Cirila kun angul-citiloj)"
-#: ../rules/base.xml.in.h:696
+#: ../rules/base.xml.in.h:697
msgid "Serbian (Latin with guillemets)"
msgstr "Serba (Latina kun angul-citiloj)"
-#: ../rules/base.xml.in.h:697
-msgid "Pannonian Rusyn (homophonic)"
-msgstr "Panona Rusina (homofonia)"
+#: ../rules/base.xml.in.h:698
+msgid "Pannonian Rusyn"
+msgstr "Panona Rusina"
#. Keyboard indicator for Slovenian layouts
-#: ../rules/base.xml.in.h:699
+#: ../rules/base.xml.in.h:700
msgid "sl"
msgstr "sl"
-#: ../rules/base.xml.in.h:700
+#: ../rules/base.xml.in.h:701
msgid "Slovenian"
msgstr "Slovena"
-#: ../rules/base.xml.in.h:701
+#: ../rules/base.xml.in.h:702
msgid "Slovenian (use guillemets for quotes)"
msgstr "Slovena (uzi angul-citilojn por citiloj)"
-#: ../rules/base.xml.in.h:702
+#: ../rules/base.xml.in.h:703
msgid "Slovenian (US keyboard with Slovenian letters)"
msgstr "Slovena (Usona klavaro kun slovenaj literoj)"
#. Keyboard indicator for Slovak layouts
-#: ../rules/base.xml.in.h:704 ../rules/base.extras.xml.in.h:106
+#: ../rules/base.xml.in.h:705 ../rules/base.extras.xml.in.h:107
msgid "sk"
msgstr "sk"
-#: ../rules/base.xml.in.h:705 ../rules/base.extras.xml.in.h:107
+#: ../rules/base.xml.in.h:706 ../rules/base.extras.xml.in.h:108
msgid "Slovak"
msgstr "Slovaka"
-#: ../rules/base.xml.in.h:706
+#: ../rules/base.xml.in.h:707
msgid "Slovak (extended Backslash)"
msgstr "Slovaka (etendita Retroklino)"
-#: ../rules/base.xml.in.h:707
+#: ../rules/base.xml.in.h:708
msgid "Slovak (qwerty)"
msgstr "Slovaka (qwerty)"
-#: ../rules/base.xml.in.h:708
+#: ../rules/base.xml.in.h:709
msgid "Slovak (qwerty, extended Backslash)"
msgstr "Slovaka (qwerty, etendita Retroklino)"
-#: ../rules/base.xml.in.h:709 ../rules/base.extras.xml.in.h:110
+#: ../rules/base.xml.in.h:710 ../rules/base.extras.xml.in.h:111
msgid "Spanish"
msgstr "Hispana"
-#: ../rules/base.xml.in.h:710
+#: ../rules/base.xml.in.h:711
msgid "Spanish (eliminate dead keys)"
msgstr "Hispana (forigi senpaŝajn klavojn)"
-#: ../rules/base.xml.in.h:711
+#: ../rules/base.xml.in.h:712
msgid "Spanish (include dead tilde)"
msgstr "Hispana (inkluzive senpaŝa tildo)"
-#: ../rules/base.xml.in.h:712
+#: ../rules/base.xml.in.h:713
msgid "Spanish (Sun dead keys)"
msgstr "Hispana (senpaŝaj klavoj de Sun)"
-#: ../rules/base.xml.in.h:713
+#: ../rules/base.xml.in.h:714
msgid "Spanish (Dvorak)"
msgstr "Hispana (Dvorako)"
-#: ../rules/base.xml.in.h:714
+#: ../rules/base.xml.in.h:715
msgid "Asturian (Spain, with bottom-dot H and bottom-dot L)"
msgstr "Asturia (Hispanujo, kun subpunktita H kaj subpunktita L)"
-#: ../rules/base.xml.in.h:715
+#: ../rules/base.xml.in.h:716
msgid "Catalan (Spain, with middle-dot L)"
msgstr "Kataluna (Hispanujo, kun centro-punktita L)"
-#: ../rules/base.xml.in.h:716
+#: ../rules/base.xml.in.h:717
msgid "Spanish (Macintosh)"
msgstr "Hispana (Macintosh)"
#. Keyboard indicator for Swedish layouts
-#: ../rules/base.xml.in.h:718 ../rules/base.extras.xml.in.h:112
+#: ../rules/base.xml.in.h:719 ../rules/base.extras.xml.in.h:113
msgid "sv"
msgstr "sv"
-#: ../rules/base.xml.in.h:719 ../rules/base.extras.xml.in.h:113
+#: ../rules/base.xml.in.h:720 ../rules/base.extras.xml.in.h:114
msgid "Swedish"
msgstr "Sveda"
-#: ../rules/base.xml.in.h:720
+#: ../rules/base.xml.in.h:721
msgid "Swedish (eliminate dead keys)"
msgstr "Sveda (forigi senpaŝajn klavojn)"
-#: ../rules/base.xml.in.h:721
+#: ../rules/base.xml.in.h:722
msgid "Swedish (Dvorak)"
msgstr "Sveda (Dvorako)"
-#: ../rules/base.xml.in.h:722
+#: ../rules/base.xml.in.h:723
msgid "Russian (Sweden, phonetic)"
msgstr "Rusa (Svedujo, fonetika)"
-#: ../rules/base.xml.in.h:723
+#: ../rules/base.xml.in.h:724
msgid "Russian (Sweden, phonetic, eliminate dead keys)"
msgstr "Rusa (Svedujo, fonetika, forigi senpaŝajn klavojn)"
-#: ../rules/base.xml.in.h:724
+#: ../rules/base.xml.in.h:725
msgid "Northern Saami (Sweden)"
msgstr "Norda Samea (Svedujo)"
-#: ../rules/base.xml.in.h:725
+#: ../rules/base.xml.in.h:726
msgid "Swedish (Macintosh)"
msgstr "Sveda (Macintosh)"
-#: ../rules/base.xml.in.h:726
+#: ../rules/base.xml.in.h:727
msgid "Swedish (Svdvorak)"
msgstr "Sveda (Svdvorak)"
-#: ../rules/base.xml.in.h:727
+#: ../rules/base.xml.in.h:728
msgid "Swedish Sign Language"
msgstr "Sveda gestlingvo"
-#: ../rules/base.xml.in.h:728 ../rules/base.extras.xml.in.h:115
+#: ../rules/base.xml.in.h:729 ../rules/base.extras.xml.in.h:116
msgid "German (Switzerland)"
msgstr "Germana (Svislando)"
-#: ../rules/base.xml.in.h:729
+#: ../rules/base.xml.in.h:730
msgid "German (Switzerland, legacy)"
msgstr "Germana (Svislando, malmoderna)"
-#: ../rules/base.xml.in.h:730
+#: ../rules/base.xml.in.h:731
msgid "German (Switzerland, eliminate dead keys)"
msgstr "Germana (Svislando, forigi senpaŝajn klavojn)"
-#: ../rules/base.xml.in.h:731
+#: ../rules/base.xml.in.h:732
msgid "German (Switzerland, Sun dead keys)"
msgstr "Germana (Svislando, senpaŝaj klavoj de Sun)"
-#: ../rules/base.xml.in.h:732
+#: ../rules/base.xml.in.h:733
msgid "French (Switzerland)"
msgstr "Franca (Svislando)"
-#: ../rules/base.xml.in.h:733
+#: ../rules/base.xml.in.h:734
msgid "French (Switzerland, eliminate dead keys)"
msgstr "Franca (Svislando, forigi senpaŝajn klavojn)"
-#: ../rules/base.xml.in.h:734
+#: ../rules/base.xml.in.h:735
msgid "French (Switzerland, Sun dead keys)"
msgstr "Franca (Svislando, senpaŝaj klavoj de Sun)"
-#: ../rules/base.xml.in.h:735
+#: ../rules/base.xml.in.h:736
msgid "French (Switzerland, Macintosh)"
msgstr "Franca (Svislando, Macintosh)"
-#: ../rules/base.xml.in.h:736
+#: ../rules/base.xml.in.h:737
msgid "German (Switzerland, Macintosh)"
msgstr "Germana (Svislando, Macintosh)"
-#: ../rules/base.xml.in.h:737
+#: ../rules/base.xml.in.h:738
msgid "Arabic (Syria)"
msgstr "Araba (Sirio)"
#. Keyboard indicator for Syriac layouts
-#: ../rules/base.xml.in.h:739
+#: ../rules/base.xml.in.h:740
msgid "syc"
msgstr "syc"
-#: ../rules/base.xml.in.h:740
+#: ../rules/base.xml.in.h:741
msgid "Syriac"
msgstr "Siria"
-#: ../rules/base.xml.in.h:741
+#: ../rules/base.xml.in.h:742
msgid "Syriac (phonetic)"
msgstr "Siria (fonetika)"
-#: ../rules/base.xml.in.h:742
+#: ../rules/base.xml.in.h:743
msgid "Kurdish (Syria, Latin Q)"
msgstr "Kurda, (Sirio, Latina Q)"
-#: ../rules/base.xml.in.h:743
+#: ../rules/base.xml.in.h:744
msgid "Kurdish (Syria, F)"
msgstr "Kurda (Sirio, F)"
-#: ../rules/base.xml.in.h:744
+#: ../rules/base.xml.in.h:745
msgid "Kurdish (Syria, Latin Alt-Q)"
msgstr "Kurda (Sirio, Latina Alt-Q)"
#. Keyboard indicator for Tajik layouts
-#: ../rules/base.xml.in.h:746
+#: ../rules/base.xml.in.h:747
msgid "tg"
msgstr "tg"
-#: ../rules/base.xml.in.h:747
+#: ../rules/base.xml.in.h:748
msgid "Tajik"
msgstr "Taĝika"
-#: ../rules/base.xml.in.h:748
+#: ../rules/base.xml.in.h:749
msgid "Tajik (legacy)"
msgstr "Taĝika (malmoderna)"
#. Keyboard indicator for Sinhala layouts
-#: ../rules/base.xml.in.h:750
+#: ../rules/base.xml.in.h:751
msgid "si"
msgstr "si"
-#: ../rules/base.xml.in.h:751
+#: ../rules/base.xml.in.h:752
msgid "Sinhala (phonetic)"
msgstr "Sinhala (fonetika)"
-#: ../rules/base.xml.in.h:752
+#: ../rules/base.xml.in.h:753
msgid "Tamil (Sri Lanka, Unicode)"
msgstr "Tamila (Sri-lanko, Unikodo)"
-#: ../rules/base.xml.in.h:753
+#: ../rules/base.xml.in.h:754
msgid "Tamil (Sri Lanka, TAB Typewriter)"
msgstr "Tamila (Sri-lanko, Skribmaŝino TAB)"
#. Keyboard indicator for Thai layouts
-#: ../rules/base.xml.in.h:755
+#: ../rules/base.xml.in.h:756
msgid "th"
msgstr "th"
-#: ../rules/base.xml.in.h:756
+#: ../rules/base.xml.in.h:757
msgid "Thai"
msgstr "Taja"
-#: ../rules/base.xml.in.h:757
+#: ../rules/base.xml.in.h:758
msgid "Thai (TIS-820.2538)"
msgstr "Taja (TIS-820.2538)"
-#: ../rules/base.xml.in.h:758
+#: ../rules/base.xml.in.h:759
msgid "Thai (Pattachote)"
msgstr "Taja (Pattachote)"
#. Keyboard indicator for Turkish layouts
-#: ../rules/base.xml.in.h:760 ../rules/base.extras.xml.in.h:118
+#: ../rules/base.xml.in.h:761 ../rules/base.extras.xml.in.h:119
msgid "tr"
msgstr "tr"
-#: ../rules/base.xml.in.h:761 ../rules/base.extras.xml.in.h:119
+#: ../rules/base.xml.in.h:762 ../rules/base.extras.xml.in.h:120
msgid "Turkish"
msgstr "Turka"
-#: ../rules/base.xml.in.h:762
+#: ../rules/base.xml.in.h:763
msgid "Turkish (F)"
msgstr "Turka (F)"
-#: ../rules/base.xml.in.h:763
+#: ../rules/base.xml.in.h:764
msgid "Turkish (Alt-Q)"
msgstr "Turka (Alt-Q)"
-#: ../rules/base.xml.in.h:764
+#: ../rules/base.xml.in.h:765
msgid "Turkish (Sun dead keys)"
msgstr "Turka (senpaŝaj klavoj de Sun)"
-#: ../rules/base.xml.in.h:765
+#: ../rules/base.xml.in.h:766
msgid "Kurdish (Turkey, Latin Q)"
msgstr "Kurda (Turkujo, Latina Q)"
-#: ../rules/base.xml.in.h:766
+#: ../rules/base.xml.in.h:767
msgid "Kurdish (Turkey, F)"
msgstr "Kurda, (Turkujo, F)"
-#: ../rules/base.xml.in.h:767
+#: ../rules/base.xml.in.h:768
msgid "Kurdish (Turkey, Latin Alt-Q)"
msgstr "Kurda (Turkujo, Latina Alt-Q)"
-#: ../rules/base.xml.in.h:768
+#: ../rules/base.xml.in.h:769
msgid "Turkish (international with dead keys)"
msgstr "Turka (internacia kun senpaŝaj klavoj)"
#. Keyboard indicator for Crimean Tatar layouts
-#: ../rules/base.xml.in.h:770 ../rules/base.extras.xml.in.h:47
+#: ../rules/base.xml.in.h:771 ../rules/base.extras.xml.in.h:48
msgid "crh"
msgstr "crh"
-#: ../rules/base.xml.in.h:771
+#: ../rules/base.xml.in.h:772
msgid "Crimean Tatar (Turkish Q)"
msgstr "Krime-tatara (Turka Q)"
-#: ../rules/base.xml.in.h:772
+#: ../rules/base.xml.in.h:773
msgid "Crimean Tatar (Turkish F)"
msgstr "Krime-tatara (Turka F)"
-#: ../rules/base.xml.in.h:773
+#: ../rules/base.xml.in.h:774
msgid "Crimean Tatar (Turkish Alt-Q)"
msgstr "Krime-tatara (Turka Alt-Q)"
-#: ../rules/base.xml.in.h:774
+#: ../rules/base.xml.in.h:775
msgid "Taiwanese"
msgstr "Tajvana"
-#: ../rules/base.xml.in.h:775
+#: ../rules/base.xml.in.h:776
msgid "Taiwanese (indigenous)"
msgstr "Tajvana (indiĝena)"
#. Keyboard indicator for Saisiyat layouts
-#: ../rules/base.xml.in.h:777
+#: ../rules/base.xml.in.h:778
msgid "xsy"
msgstr "xsy"
-#: ../rules/base.xml.in.h:778
+#: ../rules/base.xml.in.h:779
msgid "Saisiyat (Taiwan)"
msgstr "Saisiyat (Tajvano)"
#. Keyboard indicator for Ukranian layouts
-#: ../rules/base.xml.in.h:780 ../rules/base.extras.xml.in.h:121
+#: ../rules/base.xml.in.h:781 ../rules/base.extras.xml.in.h:122
msgid "uk"
msgstr "uk"
-#: ../rules/base.xml.in.h:781 ../rules/base.extras.xml.in.h:122
+#: ../rules/base.xml.in.h:782 ../rules/base.extras.xml.in.h:123
msgid "Ukrainian"
msgstr "Ukrajna"
-#: ../rules/base.xml.in.h:782
+#: ../rules/base.xml.in.h:783
msgid "Ukrainian (phonetic)"
msgstr "Ukrajna (fonetika)"
-#: ../rules/base.xml.in.h:783
+#: ../rules/base.xml.in.h:784
msgid "Ukrainian (typewriter)"
msgstr "Ukrajna (skribmaŝino)"
-#: ../rules/base.xml.in.h:784
+#: ../rules/base.xml.in.h:785
msgid "Ukrainian (WinKeys)"
msgstr "Ukrajna (WinKeys)"
-#: ../rules/base.xml.in.h:785
+#: ../rules/base.xml.in.h:786
msgid "Ukrainian (legacy)"
msgstr "Ukrajna (malmoderna)"
-#: ../rules/base.xml.in.h:786
+#: ../rules/base.xml.in.h:787
msgid "Ukrainian (standard RSTU)"
msgstr "Ukrajna (norma RSTU)"
-#: ../rules/base.xml.in.h:787
+#: ../rules/base.xml.in.h:788
msgid "Russian (Ukraine, standard RSTU)"
msgstr "Rusa (Ukrajnujo, norma RSTU)"
-#: ../rules/base.xml.in.h:788
+#: ../rules/base.xml.in.h:789
msgid "Ukrainian (homophonic)"
msgstr "Ukrajna (homofonia)"
-#: ../rules/base.xml.in.h:789 ../rules/base.extras.xml.in.h:124
+#: ../rules/base.xml.in.h:790 ../rules/base.extras.xml.in.h:125
msgid "English (UK)"
msgstr "Angla (UK)"
-#: ../rules/base.xml.in.h:790
+#: ../rules/base.xml.in.h:791
msgid "English (UK, extended WinKeys)"
msgstr "Angla (UK, etenditaj WinKeys)"
-#: ../rules/base.xml.in.h:791
+#: ../rules/base.xml.in.h:792
msgid "English (UK, international with dead keys)"
msgstr "Angla (UK, internacia kun senpaŝaj klavoj)"
-#: ../rules/base.xml.in.h:792
+#: ../rules/base.xml.in.h:793
msgid "English (UK, Dvorak)"
msgstr "Angla (UK, Dvorako)"
-#: ../rules/base.xml.in.h:793
+#: ../rules/base.xml.in.h:794
msgid "English (UK, Dvorak with UK punctuation)"
msgstr "Angla (UK, Dvorako kun interpunkcio de UK)"
-#: ../rules/base.xml.in.h:794
+#: ../rules/base.xml.in.h:795
msgid "English (UK, Macintosh)"
msgstr "Angla (UK, Macintosh)"
-#: ../rules/base.xml.in.h:795
+#: ../rules/base.xml.in.h:796
msgid "English (UK, Macintosh international)"
msgstr "Angla (UK, internacia Macintosh)"
-#: ../rules/base.xml.in.h:796
+#: ../rules/base.xml.in.h:797
msgid "English (UK, Colemak)"
msgstr "Angla (UK, Colemak)"
-#: ../rules/base.xml.in.h:797
+#: ../rules/base.xml.in.h:798
msgid "Uzbek"
msgstr "Uzbeka"
-#: ../rules/base.xml.in.h:798
+#: ../rules/base.xml.in.h:799
msgid "Uzbek (Latin)"
msgstr "Uzbeka (Latina)"
#. Keyboard indicator for Vietnamese layouts
-#: ../rules/base.xml.in.h:800
+#: ../rules/base.xml.in.h:801
msgid "vi"
msgstr "vi"
-#: ../rules/base.xml.in.h:801
+#: ../rules/base.xml.in.h:802
msgid "Vietnamese"
msgstr "Vjetnama"
#. Keyboard indicator for Korean layouts
-#: ../rules/base.xml.in.h:803 ../rules/base.extras.xml.in.h:126
+#: ../rules/base.xml.in.h:804 ../rules/base.extras.xml.in.h:127
msgid "ko"
msgstr "ko"
-#: ../rules/base.xml.in.h:804 ../rules/base.extras.xml.in.h:127
+#: ../rules/base.xml.in.h:805 ../rules/base.extras.xml.in.h:128
msgid "Korean"
msgstr "Korea"
-#: ../rules/base.xml.in.h:805
+#: ../rules/base.xml.in.h:806
msgid "Korean (101/104 key compatible)"
msgstr "Korea (kongrua al 101/104 klavoj)"
-#: ../rules/base.xml.in.h:806
+#: ../rules/base.xml.in.h:807
msgid "Japanese (PC-98xx Series)"
msgstr "Japana (Serio PC-98xx)"
#. Keyboard indicator for Irish layouts
-#: ../rules/base.xml.in.h:808
+#: ../rules/base.xml.in.h:809
msgid "ie"
msgstr "ie"
-#: ../rules/base.xml.in.h:809
+#: ../rules/base.xml.in.h:810
msgid "Irish"
msgstr "Irlanda"
-#: ../rules/base.xml.in.h:810
+#: ../rules/base.xml.in.h:811
msgid "CloGaelach"
msgstr "CloGaelach"
-#: ../rules/base.xml.in.h:811
+#: ../rules/base.xml.in.h:812
msgid "Irish (UnicodeExpert)"
msgstr "Irlanda (UnicodeExpert)"
-#: ../rules/base.xml.in.h:812
+#: ../rules/base.xml.in.h:813
msgid "Ogham"
msgstr "Ogamo"
-#: ../rules/base.xml.in.h:813
+#: ../rules/base.xml.in.h:814
msgid "Ogham (IS434)"
msgstr "Ogamo (IS434)"
-#: ../rules/base.xml.in.h:814
+#: ../rules/base.xml.in.h:815
msgid "Urdu (Pakistan)"
msgstr "Urdua (Pakistano)"
-#: ../rules/base.xml.in.h:815
+#: ../rules/base.xml.in.h:816
msgid "Urdu (Pakistan, CRULP)"
msgstr "Urdua (Pakistano, CRULP)"
-#: ../rules/base.xml.in.h:816
+#: ../rules/base.xml.in.h:817
msgid "Urdu (Pakistan, NLA)"
msgstr "Urdua (Pakistano, NLA)"
-#: ../rules/base.xml.in.h:817
+#: ../rules/base.xml.in.h:818
msgid "Arabic (Pakistan)"
msgstr "Araba (Pakistano)"
#. Keyboard indicator for Sindhi layouts
-#: ../rules/base.xml.in.h:819
+#: ../rules/base.xml.in.h:820
msgid "sd"
msgstr "sd"
-#: ../rules/base.xml.in.h:820
+#: ../rules/base.xml.in.h:821
msgid "Sindhi"
msgstr "Sinda"
#. Keyboard indicator for Dhivehi layouts
-#: ../rules/base.xml.in.h:822
+#: ../rules/base.xml.in.h:823
msgid "dv"
msgstr "dv"
-#: ../rules/base.xml.in.h:823
+#: ../rules/base.xml.in.h:824
msgid "Dhivehi"
msgstr "Mahla"
-#: ../rules/base.xml.in.h:824
+#: ../rules/base.xml.in.h:825
msgid "English (South Africa)"
msgstr "Angla (Sud-Afriko)"
#. Keyboard indicator for Esperanto layouts
-#: ../rules/base.xml.in.h:826
+#: ../rules/base.xml.in.h:827
msgid "eo"
msgstr "eo"
-#: ../rules/base.xml.in.h:827
+#: ../rules/base.xml.in.h:828
msgid "Esperanto"
msgstr "Esperanto"
-#: ../rules/base.xml.in.h:828
+#: ../rules/base.xml.in.h:829
msgid "Esperanto (displaced semicolon and quote, obsolete)"
msgstr "Esperanto (translokitaj punktokomo kaj citilo, malaktuale)"
#. Keyboard indicator for Nepali layouts
-#: ../rules/base.xml.in.h:830
+#: ../rules/base.xml.in.h:831
msgid "ne"
msgstr "ne"
-#: ../rules/base.xml.in.h:831
+#: ../rules/base.xml.in.h:832
msgid "Nepali"
msgstr "Nepala"
-#: ../rules/base.xml.in.h:832
+#: ../rules/base.xml.in.h:833
msgid "English (Nigeria)"
msgstr "Angla (Niĝerio)"
#. Keyboard indicator for Igbo layouts
-#: ../rules/base.xml.in.h:834
+#: ../rules/base.xml.in.h:835
msgid "ig"
msgstr "ig"
-#: ../rules/base.xml.in.h:835
+#: ../rules/base.xml.in.h:836
msgid "Igbo"
msgstr "Igbo"
#. Keyboard indicator for Yoruba layouts
-#: ../rules/base.xml.in.h:837
+#: ../rules/base.xml.in.h:838
msgid "yo"
msgstr "yo"
-#: ../rules/base.xml.in.h:838
+#: ../rules/base.xml.in.h:839
msgid "Yoruba"
msgstr "Joruba"
#. Keyboard indicator for Amharic layouts
-#: ../rules/base.xml.in.h:840
+#: ../rules/base.xml.in.h:841
msgid "am"
msgstr "am"
-#: ../rules/base.xml.in.h:841
+#: ../rules/base.xml.in.h:842
msgid "Amharic"
msgstr "Amhara"
#. Keyboard indicator for Wolof layouts
-#: ../rules/base.xml.in.h:843
+#: ../rules/base.xml.in.h:844
msgid "wo"
msgstr "wo"
-#: ../rules/base.xml.in.h:844
+#: ../rules/base.xml.in.h:845
msgid "Wolof"
msgstr "Volofa"
#. Keyboard indicator for Braille layouts
-#: ../rules/base.xml.in.h:846
+#: ../rules/base.xml.in.h:847
msgid "brl"
msgstr "brl"
-#: ../rules/base.xml.in.h:847
+#: ../rules/base.xml.in.h:848
msgid "Braille"
msgstr "Brajla"
-#: ../rules/base.xml.in.h:848
+#: ../rules/base.xml.in.h:849
msgid "Braille (left hand)"
msgstr "Brajla (maldekstra mano)"
-#: ../rules/base.xml.in.h:849
+#: ../rules/base.xml.in.h:850
msgid "Braille (right hand)"
msgstr "Brajla (dekstra mano)"
#. Keyboard indicator for Turkmen layouts
-#: ../rules/base.xml.in.h:851
+#: ../rules/base.xml.in.h:852
msgid "tk"
msgstr "tk"
-#: ../rules/base.xml.in.h:852
+#: ../rules/base.xml.in.h:853
msgid "Turkmen"
msgstr "Turkmena"
-#: ../rules/base.xml.in.h:853
+#: ../rules/base.xml.in.h:854
msgid "Turkmen (Alt-Q)"
msgstr "Turkmena (Alt-Q)"
#. Keyboard indicator for Bambara layouts
-#: ../rules/base.xml.in.h:855
+#: ../rules/base.xml.in.h:856
msgid "bm"
msgstr "bm"
-#: ../rules/base.xml.in.h:856
+#: ../rules/base.xml.in.h:857
msgid "Bambara"
msgstr "Bambara"
-#: ../rules/base.xml.in.h:857
+#: ../rules/base.xml.in.h:858
msgid "French (Mali, alternative)"
msgstr "Franca (Malio, alternativa)"
-#: ../rules/base.xml.in.h:858
+#: ../rules/base.xml.in.h:859
msgid "English (Mali, US Macintosh)"
msgstr "Angla (Malio , usona Macintosh)"
-#: ../rules/base.xml.in.h:859
+#: ../rules/base.xml.in.h:860
msgid "English (Mali, US international)"
msgstr "Angla (Malio, usona internacia)"
#. Keyboard indicator for Swahili layouts
-#: ../rules/base.xml.in.h:861
+#: ../rules/base.xml.in.h:862
msgid "sw"
msgstr "sw"
-#: ../rules/base.xml.in.h:862
+#: ../rules/base.xml.in.h:863
msgid "Swahili (Tanzania)"
msgstr "Svahila (Tanzanio)"
-#: ../rules/base.xml.in.h:863
+#: ../rules/base.xml.in.h:864
msgid "Swahili (Kenya)"
msgstr "Svahila (Kenjo)"
-#: ../rules/base.xml.in.h:864
+#: ../rules/base.xml.in.h:865
msgid "Kikuyu"
msgstr "Kikuyu"
#. Keyboard indicator for Tswana layouts
-#: ../rules/base.xml.in.h:866
+#: ../rules/base.xml.in.h:867
msgid "tn"
msgstr "tn"
-#: ../rules/base.xml.in.h:867
+#: ../rules/base.xml.in.h:868
msgid "Tswana"
msgstr "Cvana"
#. Keyboard indicator for Filipino layouts
-#: ../rules/base.xml.in.h:869
+#: ../rules/base.xml.in.h:870
msgid "ph"
msgstr "ph"
-#: ../rules/base.xml.in.h:870
+#: ../rules/base.xml.in.h:871
msgid "Filipino"
msgstr "Filipina"
-#: ../rules/base.xml.in.h:871
+#: ../rules/base.xml.in.h:872
msgid "Filipino (QWERTY Baybayin)"
msgstr "Filipina (QWERTY, Baybayin)"
-#: ../rules/base.xml.in.h:872
+#: ../rules/base.xml.in.h:873
msgid "Filipino (Capewell-Dvorak Latin)"
msgstr "Filipina (Capewell-Dvorako, Latina)"
-#: ../rules/base.xml.in.h:873
+#: ../rules/base.xml.in.h:874
msgid "Filipino (Capewell-Dvorak Baybayin)"
msgstr "Filipina (Capewell-Dvorako, Baybayin)"
-#: ../rules/base.xml.in.h:874
+#: ../rules/base.xml.in.h:875
msgid "Filipino (Capewell-QWERF 2006 Latin)"
msgstr "Filipina (Capewell-QWERF 2006, Latina)"
-#: ../rules/base.xml.in.h:875
+#: ../rules/base.xml.in.h:876
msgid "Filipino (Capewell-QWERF 2006 Baybayin)"
msgstr "Filipina (Capewell-QWERF 2006, Baybayin)"
-#: ../rules/base.xml.in.h:876
+#: ../rules/base.xml.in.h:877
msgid "Filipino (Colemak Latin)"
msgstr "Filipina (Colemak, latina)"
-#: ../rules/base.xml.in.h:877
+#: ../rules/base.xml.in.h:878
msgid "Filipino (Colemak Baybayin)"
msgstr "Filipina (Colemak, Baybayin)"
-#: ../rules/base.xml.in.h:878
+#: ../rules/base.xml.in.h:879
msgid "Filipino (Dvorak Latin)"
msgstr "Filipina (Dvorako, latina)"
-#: ../rules/base.xml.in.h:879
+#: ../rules/base.xml.in.h:880
msgid "Filipino (Dvorak Baybayin)"
msgstr "Filipina (Dvorako Baybayin)"
-#: ../rules/base.xml.in.h:880
+#: ../rules/base.xml.in.h:881
msgid "md"
msgstr "md"
-#: ../rules/base.xml.in.h:881
+#: ../rules/base.xml.in.h:882
msgid "Moldavian"
msgstr "Moldava"
-#: ../rules/base.xml.in.h:882
+#: ../rules/base.xml.in.h:883
msgid "gag"
msgstr "gag"
-#: ../rules/base.xml.in.h:883
+#: ../rules/base.xml.in.h:884
msgid "Moldavian (Gagauz)"
msgstr "Moldava (Gagauz)"
-#: ../rules/base.xml.in.h:884
+#: ../rules/base.xml.in.h:885
msgid "Switching to another layout"
msgstr "Ni alternigas al alia aranĝo."
-#: ../rules/base.xml.in.h:885
+#: ../rules/base.xml.in.h:886
msgid "Right Alt (while pressed)"
msgstr "Dekstra Alt (dum premata)"
-#: ../rules/base.xml.in.h:886
+#: ../rules/base.xml.in.h:887
msgid "Left Alt (while pressed)"
msgstr "Maldekstra Alt (dum premata)"
-#: ../rules/base.xml.in.h:887
+#: ../rules/base.xml.in.h:888
msgid "Left Win (while pressed)"
msgstr "Maldekstra Win (dum premata)"
-#: ../rules/base.xml.in.h:888
+#: ../rules/base.xml.in.h:889
msgid "Right Win (while pressed)"
msgstr "Dekstra Win (dum premata)"
-#: ../rules/base.xml.in.h:889
+#: ../rules/base.xml.in.h:890
msgid "Any Win key (while pressed)"
msgstr "Iu ajn Win-klavo (dum premata)"
-#: ../rules/base.xml.in.h:890
+#: ../rules/base.xml.in.h:891
msgid "Caps Lock (while pressed), Alt+Caps Lock does the original capslock action"
msgstr "Caps Lock (dum premata), Alt+Caps Lock restarigas la originalan uskligon"
-#: ../rules/base.xml.in.h:891
+#: ../rules/base.xml.in.h:892
msgid "Right Ctrl (while pressed)"
msgstr "Dekstra Ctrl (dum premata)"
-#: ../rules/base.xml.in.h:892
+#: ../rules/base.xml.in.h:893
msgid "Right Alt"
msgstr "Dekstra Alt"
-#: ../rules/base.xml.in.h:893
+#: ../rules/base.xml.in.h:894
msgid "Left Alt"
msgstr "Maldekstra Alt"
-#: ../rules/base.xml.in.h:894
+#: ../rules/base.xml.in.h:895
msgid "Caps Lock"
msgstr "Caps Lock"
-#: ../rules/base.xml.in.h:895
+#: ../rules/base.xml.in.h:896
msgid "Shift+Caps Lock"
msgstr "Shift+Caps Lock"
-#: ../rules/base.xml.in.h:896
+#: ../rules/base.xml.in.h:897
msgid "Caps Lock (to first layout), Shift+Caps Lock (to last layout)"
msgstr "Caps Lock (al la unua aranĝo), Shift+Caps Lock (al la lasta aranĝo)"
-#: ../rules/base.xml.in.h:897
+#: ../rules/base.xml.in.h:898
msgid "Left Win (to first layout), Right Win/Menu (to last layout)"
msgstr "Maldekstra Win (al la unua aranĝo), dekstra Win/Menu (al la lasta aranĝo)"
-#: ../rules/base.xml.in.h:898
+#: ../rules/base.xml.in.h:899
msgid "Left Ctrl (to first layout), Right Ctrl (to last layout)"
msgstr "Maldekstra Ctrl (por la unua aranĝo), dekstra Ctrl (por la lasta aranĝo)"
-#: ../rules/base.xml.in.h:899
+#: ../rules/base.xml.in.h:900
msgid "Alt+Caps Lock"
msgstr "Alt+Caps Lock"
-#: ../rules/base.xml.in.h:900
+#: ../rules/base.xml.in.h:901
msgid "Both Shift keys together"
msgstr "Ambaŭ klavoj Shift kune"
-#: ../rules/base.xml.in.h:901
+#: ../rules/base.xml.in.h:902
msgid "Both Alt keys together"
msgstr "Ambaŭ klavoj Alt kune"
-#: ../rules/base.xml.in.h:902
+#: ../rules/base.xml.in.h:903
msgid "Both Ctrl keys together"
msgstr "Ambaŭ klavoj Ctrl kune"
-#: ../rules/base.xml.in.h:903
+#: ../rules/base.xml.in.h:904
msgid "Ctrl+Shift"
msgstr "Ctrl+Shift"
-#: ../rules/base.xml.in.h:904
+#: ../rules/base.xml.in.h:905
msgid "Left Ctrl+Left Shift"
msgstr "Maldekstra Ctrl+maldekstra Shift"
-#: ../rules/base.xml.in.h:905
+#: ../rules/base.xml.in.h:906
msgid "Right Ctrl+Right Shift"
msgstr "Dekstra Ctrl+dekstra Shift"
-#: ../rules/base.xml.in.h:906
+#: ../rules/base.xml.in.h:907
msgid "Alt+Ctrl"
msgstr "Alt+Ctrl"
-#: ../rules/base.xml.in.h:907
+#: ../rules/base.xml.in.h:908
msgid "Alt+Shift"
msgstr "Alt+Shift"
-#: ../rules/base.xml.in.h:908
+#: ../rules/base.xml.in.h:909
msgid "Left Alt+Left Shift"
msgstr "Maldekstra Alt+maldekstra Shift"
-#: ../rules/base.xml.in.h:909
+#: ../rules/base.xml.in.h:910
msgid "Alt+Space"
msgstr "Alt+Space"
-#: ../rules/base.xml.in.h:910
+#: ../rules/base.xml.in.h:911
msgid "Menu"
msgstr "Menu"
-#: ../rules/base.xml.in.h:911
+#: ../rules/base.xml.in.h:912
msgid "Left Win"
msgstr "Maldekstra Win"
-#: ../rules/base.xml.in.h:912
+#: ../rules/base.xml.in.h:913
msgid "Right Win"
msgstr "Dekstra Win"
-#: ../rules/base.xml.in.h:913
+#: ../rules/base.xml.in.h:914
msgid "Left Shift"
msgstr "Maldekstra Shift"
-#: ../rules/base.xml.in.h:914
+#: ../rules/base.xml.in.h:915
msgid "Right Shift"
msgstr "Dekstra Shift"
-#: ../rules/base.xml.in.h:915
+#: ../rules/base.xml.in.h:916
msgid "Left Ctrl"
msgstr "Maldekstra Ctrl"
-#: ../rules/base.xml.in.h:916
+#: ../rules/base.xml.in.h:917
msgid "Right Ctrl"
msgstr "Dekstra Ctrl"
-#: ../rules/base.xml.in.h:917
+#: ../rules/base.xml.in.h:918
msgid "Scroll Lock"
msgstr "Ruluma Baskulo"
-#: ../rules/base.xml.in.h:918
+#: ../rules/base.xml.in.h:919
msgid "LeftCtrl+LeftWin (to first layout), RightCtrl+Menu (to second layout)"
msgstr "Maldekstra Ctrl + dekstra Win (por la unua aranĝo), dekstra Ctrl + Menu (por la dua aranĝo)"
-#: ../rules/base.xml.in.h:919
+#: ../rules/base.xml.in.h:920
msgid "Key to choose 3rd level"
msgstr "Klavo por elekti 3-an nivelon"
-#: ../rules/base.xml.in.h:920
+#: ../rules/base.xml.in.h:921
msgid "Any Win key"
msgstr "Iu ajn Win-klavo"
-#: ../rules/base.xml.in.h:921
+#: ../rules/base.xml.in.h:922
msgid "Any Alt key"
msgstr "Iu ajn klavo Alt"
-#: ../rules/base.xml.in.h:922
+#: ../rules/base.xml.in.h:923
msgid "Right Alt, Shift+Right Alt key is Compose"
msgstr "Dekstra Alt, Shift+dekstra Alt estas Compose"
-#: ../rules/base.xml.in.h:923
+#: ../rules/base.xml.in.h:924
msgid "Right Alt key never chooses 3rd level"
msgstr "Dekstra Alt neniam elektas la 3-an nivelon"
-#: ../rules/base.xml.in.h:924
+#: ../rules/base.xml.in.h:925
msgid "Enter on keypad"
msgstr "Enen-klavo en ciferklavaro"
-#: ../rules/base.xml.in.h:925
+#: ../rules/base.xml.in.h:926
msgid "Backslash"
msgstr "Retroklino"
-#: ../rules/base.xml.in.h:926
+#: ../rules/base.xml.in.h:927
msgid "&lt;Less/Greater&gt;"
msgstr "&lt;Malpli-signo/Pli-signo&gt;"
-#: ../rules/base.xml.in.h:927
+#: ../rules/base.xml.in.h:928
msgid "Caps Lock chooses 3rd level, acts as onetime lock when pressed together with another 3rd-level-chooser"
msgstr "Caps Lock elektas 3-an nivelon, funkcias kiel unufoja ŝloso kiam premita kun alia 3-nivela elektilo"
-#: ../rules/base.xml.in.h:928
+#: ../rules/base.xml.in.h:929
msgid "Backslash chooses 3rd level, acts as onetime lock when pressed together with another 3rd-level-chooser"
msgstr "Retroklino elektas 3-an nivelon, funkcias kiel unufoja ŝloso kiam premita kun alia 3-nivela elektilo"
-#: ../rules/base.xml.in.h:929
+#: ../rules/base.xml.in.h:930
msgid "&lt;Less/Greater&gt; chooses 3rd level, acts as onetime lock when pressed together with another 3rd-level-chooser"
msgstr "&lt;Malpli-signo/Pli-signo&gt; elektas 3-an nivelon, funkcias kiel unufoja ŝloso kiam premita kun alia 3-nivela elektilo"
-#: ../rules/base.xml.in.h:930
+#: ../rules/base.xml.in.h:931
msgid "Ctrl key position"
msgstr "Pozicio de la klavo Ctrl"
-#: ../rules/base.xml.in.h:931
+#: ../rules/base.xml.in.h:932
msgid "Caps Lock as Ctrl"
msgstr "Caps Lock kiel Ctrl"
-#: ../rules/base.xml.in.h:932
+#: ../rules/base.xml.in.h:933
msgid "Left Ctrl as Meta"
msgstr "Maldekstra Ctrl kiel Meta"
-#: ../rules/base.xml.in.h:933
+#: ../rules/base.xml.in.h:934
msgid "Swap Ctrl and Caps Lock"
msgstr "Permuti Ctrl kaj Caps Lock"
-#: ../rules/base.xml.in.h:934
+#: ../rules/base.xml.in.h:935
msgid "At left of 'A'"
msgstr "Maldekstre de 'A'"
-#: ../rules/base.xml.in.h:935
+#: ../rules/base.xml.in.h:936
msgid "At bottom left"
msgstr "Malsupre maldekstre"
-#: ../rules/base.xml.in.h:936
+#: ../rules/base.xml.in.h:937
msgid "Right Ctrl as Right Alt"
msgstr "Dekstra Ctrl kiel dekstran Alt"
-#: ../rules/base.xml.in.h:937
+#: ../rules/base.xml.in.h:938
msgid "Menu as Right Ctrl"
msgstr "Menu kiel dekstran Ctrl"
-#: ../rules/base.xml.in.h:938
+#: ../rules/base.xml.in.h:939
msgid "Right Alt as Right Ctrl"
msgstr "Dekstra Alt kiel dekstran Ctrl"
-#: ../rules/base.xml.in.h:939
+#: ../rules/base.xml.in.h:940
+msgid "Swap Left Alt key with Left Ctrl key"
+msgstr "Interŝanĝi la maldekstrajn klavojn Alt kun Ctrl"
+
+#: ../rules/base.xml.in.h:941
+msgid "Swap Left Win key with Left Ctrl key"
+msgstr "Interŝanĝi la maldekstrajn klavojn Win kun Ctrl"
+
+#: ../rules/base.xml.in.h:942
+msgid "Left Alt as Ctrl, Left Ctrl as Win, Left Win as Alt"
+msgstr "Maldekstra Alt kiel Ctrl, maldekstra Ctrl kiel Win, maldekstra Win kiel Alt"
+
+#: ../rules/base.xml.in.h:943
msgid "Use keyboard LED to show alternative layout"
msgstr "Uzi la LED de klavaro por indiki alternativan aranĝon"
-#: ../rules/base.xml.in.h:940
+#: ../rules/base.xml.in.h:944
msgid "Num Lock"
msgstr "Num Lock"
-#: ../rules/base.xml.in.h:941
+#: ../rules/base.xml.in.h:945
msgid "Layout of numeric keypad"
msgstr "Aranĝo de ciferklavaro"
-#: ../rules/base.xml.in.h:942
+#: ../rules/base.xml.in.h:946
msgid "Legacy"
msgstr "Malmoderna"
-#: ../rules/base.xml.in.h:943
+#: ../rules/base.xml.in.h:947
msgid "Unicode additions (arrows and math operators)"
msgstr "Unikodaj aldonoj (sagoj kaj operaci-simboloj)"
-#: ../rules/base.xml.in.h:944
+#: ../rules/base.xml.in.h:948
msgid "Unicode additions (arrows and math operators; math operators on default level)"
msgstr "Unikodaj aldonoj (sagoj kaj operaci-simboloj; operaci-simboloj en la apriora nivelo)"
-#: ../rules/base.xml.in.h:945
+#: ../rules/base.xml.in.h:949
msgid "Legacy Wang 724"
msgstr "Malmoderna Wang 724"
-#: ../rules/base.xml.in.h:946
+#: ../rules/base.xml.in.h:950
msgid "Wang 724 keypad with Unicode additions (arrows and math operators)"
msgstr "Wang 724 ciferklavaro kun Unikodaj aldonoj (sagoj kaj operaci-simboloj)"
-#: ../rules/base.xml.in.h:947
+#: ../rules/base.xml.in.h:951
msgid "Wang 724 keypad with Unicode additions (arrows and math operators; math operators on default level)"
msgstr "Ciferklavaro Wang 724 kun Unikodaj aldonoj (sagoj kaj operaci-simboloj; operaci-simboloj en la apriora nivelo)"
-#: ../rules/base.xml.in.h:948
+#: ../rules/base.xml.in.h:952
msgid "Hexadecimal"
msgstr "Deksesume"
-#: ../rules/base.xml.in.h:949
+#: ../rules/base.xml.in.h:953
msgid "ATM/phone-style"
msgstr "ATM/telefon-stilo"
-#: ../rules/base.xml.in.h:950
+#: ../rules/base.xml.in.h:954
msgid "Numeric keypad delete key behaviour"
msgstr "Funkciado de la forig-klavo de la ciferklavaro"
-#: ../rules/base.xml.in.h:951
+#: ../rules/base.xml.in.h:955
msgid "Legacy key with dot"
msgstr "Malmoderna klavo kun punkto"
#. Actually, with KP_SEPARATOR, as the old keypad(comma)
-#: ../rules/base.xml.in.h:953
+#: ../rules/base.xml.in.h:957
msgid "Legacy key with comma"
msgstr "Malmoderna klavo kun komo"
-#: ../rules/base.xml.in.h:954
+#: ../rules/base.xml.in.h:958
msgid "Four-level key with dot"
msgstr "Kvar-nivela klavo kun punkto"
-#: ../rules/base.xml.in.h:955
+#: ../rules/base.xml.in.h:959
msgid "Four-level key with dot, Latin-9 only"
msgstr "Kvar-nivela klavo kun punkto, limigite al Latin-9"
-#: ../rules/base.xml.in.h:956
+#: ../rules/base.xml.in.h:960
msgid "Four-level key with comma"
msgstr "Kvar-nivela klavo kun komo"
-#: ../rules/base.xml.in.h:957
+#: ../rules/base.xml.in.h:961
msgid "Four-level key with momayyez"
msgstr "Kvar-nivela klavo kun 'momayyez'"
#. This assumes the KP_ abstract symbols are actually useful for some apps
#. The description needs to be rewritten
-#: ../rules/base.xml.in.h:960
+#: ../rules/base.xml.in.h:964
msgid "Four-level key with abstract separators"
msgstr "Kvar-nivela klavo kun abstraktaj apartigiloj"
-#: ../rules/base.xml.in.h:961
+#: ../rules/base.xml.in.h:965
msgid "Semicolon on third level"
msgstr "Punktokomo ĉe la 3-a nivelo"
-#: ../rules/base.xml.in.h:962
+#: ../rules/base.xml.in.h:966
msgid "Caps Lock key behavior"
msgstr "Funkciado de la klavo Caps Lock"
-#: ../rules/base.xml.in.h:963
+#: ../rules/base.xml.in.h:967
msgid "Caps Lock uses internal capitalization; Shift \"pauses\" Caps Lock"
msgstr "Caps Lock uzas internan uskligon; Shift \"paŭzigas\" Caps Lock"
-#: ../rules/base.xml.in.h:964
+#: ../rules/base.xml.in.h:968
msgid "Caps Lock uses internal capitalization; Shift doesn't affect Caps Lock"
msgstr "Caps Lock uzas internan uskligon; Shift ne influas Caps Lock"
-#: ../rules/base.xml.in.h:965
+#: ../rules/base.xml.in.h:969
msgid "Caps Lock acts as Shift with locking; Shift \"pauses\" Caps Lock"
msgstr "Caps Lock funkcias kiel Shift kun ŝlosado; Shift \"paŭzigas\" Caps Lock"
-#: ../rules/base.xml.in.h:966
+#: ../rules/base.xml.in.h:970
msgid "Caps Lock acts as Shift with locking; Shift doesn't affect Caps Lock"
msgstr "Caps Lock funkcias kiel Shift kun ŝlosado; Shift ne influas Caps Lock"
-#: ../rules/base.xml.in.h:967
+#: ../rules/base.xml.in.h:971
msgid "Caps Lock toggles normal capitalization of alphabetic characters"
msgstr "Caps Lock alternigas la ordinaran uskligon de alfabetaj signoj"
-#: ../rules/base.xml.in.h:968
+#: ../rules/base.xml.in.h:972
msgid "Make Caps Lock an additional Num Lock"
msgstr "Igi Caps Lock kroman Num Lock"
-#: ../rules/base.xml.in.h:969
+#: ../rules/base.xml.in.h:973
msgid "Swap ESC and Caps Lock"
msgstr "Permuti ESC kaj Caps Lock"
-#: ../rules/base.xml.in.h:970
+#: ../rules/base.xml.in.h:974
msgid "Make Caps Lock an additional ESC"
msgstr "Igi Caps Lock kroman ESC"
-#: ../rules/base.xml.in.h:971
+#: ../rules/base.xml.in.h:975
msgid "Make Caps Lock an additional Backspace"
msgstr "Igi Caps Lock kroman Retroklavon"
-#: ../rules/base.xml.in.h:972
+#: ../rules/base.xml.in.h:976
msgid "Make Caps Lock an additional Super"
msgstr "Igi Caps Lock kroman Super"
-#: ../rules/base.xml.in.h:973
+#: ../rules/base.xml.in.h:977
msgid "Make Caps Lock an additional Hyper"
msgstr "Igi Caps Lock kroman Hyper"
-#: ../rules/base.xml.in.h:974
+#: ../rules/base.xml.in.h:978
msgid "Caps Lock toggles ShiftLock (affects all keys)"
msgstr "Caps Lock alternigas Shift (influante ĉiujn klavojn)"
-#: ../rules/base.xml.in.h:975
+#: ../rules/base.xml.in.h:979
msgid "Caps Lock is disabled"
msgstr "Caps Lock estas malebligita"
-#: ../rules/base.xml.in.h:976
+#: ../rules/base.xml.in.h:980
msgid "Make Caps Lock an additional Ctrl"
msgstr "Igi Caps Lock kroman Ctrl"
-#: ../rules/base.xml.in.h:977
+#: ../rules/base.xml.in.h:981
msgid "Alt/Win key behavior"
msgstr "Alt/Win, klava funkciado"
-#: ../rules/base.xml.in.h:978
+#: ../rules/base.xml.in.h:982
msgid "Add the standard behavior to Menu key"
msgstr "Aldoni laŭnorman funkciadon al la klavo Menu"
-#: ../rules/base.xml.in.h:979
+#: ../rules/base.xml.in.h:983
msgid "Alt and Meta are on Alt keys"
msgstr "Alt kaj Meta estas ĉe la klavoj Alt"
-#: ../rules/base.xml.in.h:980
+#: ../rules/base.xml.in.h:984
msgid "Alt is mapped to Win keys (and the usual Alt keys)"
msgstr "Alt estas mapita al Win-klavoj (kaj al la kutimaj klavoj Alt)"
-#: ../rules/base.xml.in.h:981
+#: ../rules/base.xml.in.h:985
msgid "Ctrl is mapped to Win keys (and the usual Ctrl keys)"
msgstr "Ctrl estas mapita al Win-klavoj (kaj al la kutimaj klavoj Ctrl)"
-#: ../rules/base.xml.in.h:982
+#: ../rules/base.xml.in.h:986
msgid "Ctrl is mapped to Alt keys, Alt is mapped to Win keys"
msgstr "Ctrl estas mapita al klavoj Alt, Alt estas mapita al Win-klavoj"
-#: ../rules/base.xml.in.h:983
+#: ../rules/base.xml.in.h:987
msgid "Meta is mapped to Win keys"
msgstr "Meta estas mapita al la Win-klavoj"
-#: ../rules/base.xml.in.h:984
+#: ../rules/base.xml.in.h:988
msgid "Meta is mapped to Left Win"
msgstr "Meta estas mapita al la maldekstra Win"
-#: ../rules/base.xml.in.h:985
+#: ../rules/base.xml.in.h:989
msgid "Hyper is mapped to Win-keys"
msgstr "Hyper estas mapita al la Win-klavoj"
-#: ../rules/base.xml.in.h:986
+#: ../rules/base.xml.in.h:990
msgid "Alt is mapped to Right Win, Super to Menu"
msgstr "Alt estas mapita al la dekstra Win-klavo kaj Super al Menu"
-#: ../rules/base.xml.in.h:987
+#: ../rules/base.xml.in.h:991
msgid "Alt is swapped with Win"
msgstr "Alt estas permutita kun Win"
-#: ../rules/base.xml.in.h:988
+#: ../rules/base.xml.in.h:992
msgid "Position of Compose key"
msgstr "Pozicio de la klavo Compose"
-#: ../rules/base.xml.in.h:989
+#: ../rules/base.xml.in.h:993
msgid "3rd level of Left Win"
msgstr "3-a nivelo de maldekstra Win"
-#: ../rules/base.xml.in.h:990
+#: ../rules/base.xml.in.h:994
msgid "3rd level of Right Win"
msgstr "3-a nivelo de dekstra Win"
-#: ../rules/base.xml.in.h:991
+#: ../rules/base.xml.in.h:995
msgid "3rd level of Menu"
msgstr "3-a nivelo de Menu"
-#: ../rules/base.xml.in.h:992
+#: ../rules/base.xml.in.h:996
msgid "3rd level of Left Ctrl"
msgstr "3-a nivelo de maldekstra Ctrl"
-#: ../rules/base.xml.in.h:993
+#: ../rules/base.xml.in.h:997
msgid "3rd level of Right Ctrl"
msgstr "3-a nivelo de dekstra Ctrl"
-#: ../rules/base.xml.in.h:994
+#: ../rules/base.xml.in.h:998
msgid "3rd level of Caps Lock"
msgstr "3-a nivelo de Caps Lock"
-#: ../rules/base.xml.in.h:995
+#: ../rules/base.xml.in.h:999
msgid "3rd level of &lt;Less/Greater&gt;"
msgstr "3-a nivelo de &lt;Malpli/Pli-signo&gt;"
# La klavo plej ofte estas markita "Pause".
-#: ../rules/base.xml.in.h:996
+#: ../rules/base.xml.in.h:1000
msgid "Pause"
msgstr "Pause"
-#: ../rules/base.xml.in.h:997
+#: ../rules/base.xml.in.h:1001
msgid "PrtSc"
msgstr "PrtSc"
-#: ../rules/base.xml.in.h:998
+#: ../rules/base.xml.in.h:1002
msgid "Miscellaneous compatibility options"
msgstr "Ceteraj kongruaj opcioj"
-#: ../rules/base.xml.in.h:999
+#: ../rules/base.xml.in.h:1003
msgid "Default numeric keypad keys"
msgstr "Aprioraj klavoj en ciferklavaro"
-#: ../rules/base.xml.in.h:1000
+#: ../rules/base.xml.in.h:1004
msgid "Numeric keypad keys always enter digits (as in Mac OS)"
msgstr "La klavoj de la ciferklavaro ĉiam enigas ciferojn (kiel en Macintosh)"
-#: ../rules/base.xml.in.h:1001
+#: ../rules/base.xml.in.h:1005
msgid "Shift with numeric keypad keys works as in MS Windows"
msgstr "Shift funkcias kun la ciferklavaro same kiel en MS Windows"
-#: ../rules/base.xml.in.h:1002
+#: ../rules/base.xml.in.h:1006
msgid "Shift does not cancel Num Lock, chooses 3rd level instead"
msgstr "Shift ne nuligas Num Lock, sed elektas 3-an nivelon"
-#: ../rules/base.xml.in.h:1003
+#: ../rules/base.xml.in.h:1007
msgid "Special keys (Ctrl+Alt+&lt;key&gt;) handled in a server"
msgstr "Specialaj klavoj (Ctrl+Alt+&lt;klavo&gt;) traktotas en servilo"
-#: ../rules/base.xml.in.h:1004
+#: ../rules/base.xml.in.h:1008
msgid "Apple Aluminium Keyboard: emulate PC keys (Print, Scroll Lock, Pause, Num Lock)"
msgstr "Apple Aluminium Keyboard: ŝajnigi klavojn de PC (Print, Scroll Lock, Pause, Num Lock)"
-#: ../rules/base.xml.in.h:1005
+#: ../rules/base.xml.in.h:1009
msgid "Shift cancels Caps Lock"
msgstr "Shift nuligas Caps Lock"
-#: ../rules/base.xml.in.h:1006
+#: ../rules/base.xml.in.h:1010
msgid "Enable extra typographic characters"
msgstr "Ebligi kromajn tipografiajn signojn"
-#: ../rules/base.xml.in.h:1007
+#: ../rules/base.xml.in.h:1011
msgid "Both Shift keys together toggle Caps Lock"
msgstr "Ambaŭ klavoj Shift kune alternigas Caps Lock"
-#: ../rules/base.xml.in.h:1008
+#: ../rules/base.xml.in.h:1012
msgid "Both Shift keys together activate Caps Lock, one Shift key deactivates"
msgstr "Ambaŭ klavoj Shift kune aktivigas Caps Lock, unu klavo Shift malaktivigas"
-#: ../rules/base.xml.in.h:1009
+#: ../rules/base.xml.in.h:1013
msgid "Both Shift keys together toggle ShiftLock"
msgstr "Ambaŭ klavoj Shift kune alternigas ShiftLock"
-#: ../rules/base.xml.in.h:1010
+#: ../rules/base.xml.in.h:1014
msgid "Shift + NumLock toggles PointerKeys"
msgstr "Shift + NumLock alternigas PointerKeys"
-#: ../rules/base.xml.in.h:1011
+#: ../rules/base.xml.in.h:1015
msgid "Allow breaking grabs with keyboard actions (warning: security risk)"
msgstr "Permesi rompi ŝlosojn per klavaraj agoj (averto: sekureca risko)"
-#: ../rules/base.xml.in.h:1012
+#: ../rules/base.xml.in.h:1016
+msgid "Allow grab and window tree logging"
+msgstr "Ebligi registradon de ŝlosoj kaj fenestro-arboj"
+
+#: ../rules/base.xml.in.h:1017
msgid "Adding currency signs to certain keys"
msgstr "Aldono de valut-signoj al iuj klavoj"
-#: ../rules/base.xml.in.h:1013
+#: ../rules/base.xml.in.h:1018
msgid "Euro on E"
msgstr "Eŭro-signo ĉe E"
-#: ../rules/base.xml.in.h:1014
+#: ../rules/base.xml.in.h:1019
msgid "Euro on 2"
msgstr "Eŭro-signo ĉe 2"
-#: ../rules/base.xml.in.h:1015
+#: ../rules/base.xml.in.h:1020
msgid "Euro on 4"
msgstr "Eŭro-signo ĉe 4"
-#: ../rules/base.xml.in.h:1016
+#: ../rules/base.xml.in.h:1021
msgid "Euro on 5"
msgstr "Eŭro-signo ĉe 5"
-#: ../rules/base.xml.in.h:1017
+#: ../rules/base.xml.in.h:1022
msgid "Rupee on 4"
msgstr "Rupio ĉe 4"
-#: ../rules/base.xml.in.h:1018
+#: ../rules/base.xml.in.h:1023
msgid "Key to choose 5th level"
msgstr "Klavo por elekti 5-an nivelon"
-#: ../rules/base.xml.in.h:1019
+#: ../rules/base.xml.in.h:1024
msgid "&lt;Less/Greater&gt; chooses 5th level, locks when pressed together with another 5th-level-chooser"
msgstr "&lt;Malpli-signo/Pli-signo&gt; elektas 5-an nivelon, ŝlosas kiam premite kun alia 5-nivela elektilo"
-#: ../rules/base.xml.in.h:1020
+#: ../rules/base.xml.in.h:1025
msgid "Right Alt chooses 5th level, locks when pressed together with another 5th-level-chooser"
msgstr "Dekstra Alt elektas 5-an nivelon, ŝlosas kiam premite kun alia 5-nivela elektilo"
-#: ../rules/base.xml.in.h:1021
+#: ../rules/base.xml.in.h:1026
msgid "Left Win chooses 5th level, locks when pressed together with another 5th-level-chooser"
msgstr "Maldekstra Win elektas 5-an nivelon, ŝlosas kiam premite kun alia 5-nivela elektilo"
-#: ../rules/base.xml.in.h:1022
+#: ../rules/base.xml.in.h:1027
msgid "Right Win chooses 5th level, locks when pressed together with another 5th-level-chooser"
msgstr "Dekstra Win elektas 5-an nivelon, ŝlosas kiam premite kun alia 5-nivela elektilo"
-#: ../rules/base.xml.in.h:1023
+#: ../rules/base.xml.in.h:1028
msgid "Using space key to input non-breakable space character"
msgstr "Uzado de spac-klavo por enmeti ne-rompeblan spaco-signon"
-#: ../rules/base.xml.in.h:1024
+#: ../rules/base.xml.in.h:1029
msgid "Usual space at any level"
msgstr "Kutima spaco-signo ĉe iu ajn nivelo"
-#: ../rules/base.xml.in.h:1025
+#: ../rules/base.xml.in.h:1030
msgid "Non-breakable space character at second level"
msgstr "Ne-rompebla spaco-signo ĉe la 2-a nivelo"
-#: ../rules/base.xml.in.h:1026
+#: ../rules/base.xml.in.h:1031
msgid "Non-breakable space character at third level"
msgstr "Ne-rompebla spaco-signo ĉe la 3-a nivelo"
-#: ../rules/base.xml.in.h:1027
+#: ../rules/base.xml.in.h:1032
msgid "Non-breakable space character at third level, nothing at fourth level"
msgstr "Ne-rompebla spaco-signo ĉe la 3-a nivelo, nenio ĉe la 4-a nivelo"
-#: ../rules/base.xml.in.h:1028
+#: ../rules/base.xml.in.h:1033
msgid "Non-breakable space character at third level, thin non-breakable space character at fourth level"
msgstr "Ne-rompebla spaco-signo ĉe la 3-a nivelo, maldika ne-rompebla spaco-signo ĉe la 4-a nivelo"
-#: ../rules/base.xml.in.h:1029
+#: ../rules/base.xml.in.h:1034
msgid "Non-breakable space character at fourth level"
msgstr "Ne-rompebla spaco-signo ĉe la 4-a nivelo"
-#: ../rules/base.xml.in.h:1030
+#: ../rules/base.xml.in.h:1035
msgid "Non-breakable space character at fourth level, thin non-breakable space character at sixth level"
msgstr "Ne-rompebla spaco-signo ĉe la 4-a nivelo, maldika ne-rompebla spaco-signo ĉe la 6-a nivelo"
-#: ../rules/base.xml.in.h:1031
+#: ../rules/base.xml.in.h:1036
msgid "Non-breakable space character at fourth level, thin non-breakable space character at sixth level (via Ctrl+Shift)"
msgstr "Ne-rompebla spaco-signo ĉe la 4-a nivelo, maldika ne-rompebla spaco-signo ĉe la 6-a nivelo (per Ctrl+Shift)"
-#: ../rules/base.xml.in.h:1032
+#: ../rules/base.xml.in.h:1037
msgid "Zero-width non-joiner character at second level"
msgstr "Nul-larĝa ne-kuniga signo ĉe dua nivelo"
-#: ../rules/base.xml.in.h:1033
+#: ../rules/base.xml.in.h:1038
msgid "Zero-width non-joiner character at second level, zero-width joiner character at third level"
msgstr "Nul-larĝa ne-kuniga signo ĉe la dua nivelo, nul-larĝa kuniga signo ĉe la tria nivelo"
-#: ../rules/base.xml.in.h:1034
+#: ../rules/base.xml.in.h:1039
msgid "Zero-width non-joiner character at second level, zero-width joiner character at third level, non-breakable space character at fourth level"
msgstr "Nul-larĝa ne-kuniga signo ĉe la dua nivelo, nul-larĝa kuniga signo ĉe la tria nivelo, ne-rompebla spaco-signo ĉe la kvara nivelo"
-#: ../rules/base.xml.in.h:1035
+#: ../rules/base.xml.in.h:1040
msgid "Zero-width non-joiner character at second level, non-breakable space character at third level"
msgstr "Nul-larĝa ne-kuniga signo ĉe la dua nivelo, ne-rompebla spaco-signo ĉe la tria nivelo"
-#: ../rules/base.xml.in.h:1036
+#: ../rules/base.xml.in.h:1041
msgid "Zero-width non-joiner character at second level, non-breakable space character at third level, nothing at fourth level"
msgstr "Nul-larĝa ne-kuniga signo ĉe la dua nivelo, ne-rompebla spaco-signo ĉe la tria nivelo, nenio ĉe la kvara nivelo"
-#: ../rules/base.xml.in.h:1037
+#: ../rules/base.xml.in.h:1042
msgid "Zero-width non-joiner character at second level, non-breakable space character at third level, zero-width joiner at fourth level"
msgstr "Nul-larĝa ne-kuniga signo ĉe la dua nivelo, ne-rompebla spaco-signo ĉe la tria nivelo, nul-larĝa kuniga signo ĉe la kvara nivelo"
-#: ../rules/base.xml.in.h:1038
+#: ../rules/base.xml.in.h:1043
msgid "Zero-width non-joiner character at second level, non-breakable space character at third level, thin non-breakable space at fourth level"
msgstr "Nul-larĝa ne-kuniga signo ĉe la dua nivelo, ne-rompebla spaco-signo ĉe la tria nivelo, maldika ne-rompebla spaco-signo ĉe la kvara nivelo"
-#: ../rules/base.xml.in.h:1039
+#: ../rules/base.xml.in.h:1044
msgid "Zero-width non-joiner character at third level, zero-width joiner at fourth level"
msgstr "Nul-larĝa ne-kuniga signo ĉe la tria nivelo, nul-larĝa kuniga signo ĉe la kvara nivelo"
-#: ../rules/base.xml.in.h:1040
+#: ../rules/base.xml.in.h:1045
msgid "Japanese keyboard options"
msgstr "Elektebloj de japana klavaro"
-#: ../rules/base.xml.in.h:1041
+#: ../rules/base.xml.in.h:1046
msgid "Kana Lock key is locking"
msgstr "Kanaa klavo Lock ŝlosigas"
-#: ../rules/base.xml.in.h:1042
+#: ../rules/base.xml.in.h:1047
msgid "NICOLA-F style Backspace"
msgstr "Retropaŝo laŭ estilo NICOLA-F"
-#: ../rules/base.xml.in.h:1043
+#: ../rules/base.xml.in.h:1048
msgid "Make Zenkaku Hankaku an additional ESC"
msgstr "Igi Zenkaku Hankaku kroman ESC"
-#: ../rules/base.xml.in.h:1044
+#: ../rules/base.xml.in.h:1049
msgid "Adding Esperanto supersigned letters"
msgstr "Aldono de Esperantaj literoj kun supersignoj"
-#: ../rules/base.xml.in.h:1045
+#: ../rules/base.xml.in.h:1050
msgid "To the corresponding key in a Qwerty layout"
msgstr "Al la ekvivalenta klavo en aranĝo Qwerty."
-#: ../rules/base.xml.in.h:1046
+#: ../rules/base.xml.in.h:1051
msgid "To the corresponding key in a Dvorak layout"
msgstr "Al la ekvivalenta klavo en dvoraka aranĝo."
-#: ../rules/base.xml.in.h:1047
+#: ../rules/base.xml.in.h:1052
msgid "To the corresponding key in a Colemak layout"
msgstr "Al la ekvivalenta klavo en dvoraka aranĝo."
-#: ../rules/base.xml.in.h:1048
+#: ../rules/base.xml.in.h:1053
msgid "Maintain key compatibility with old Solaris keycodes"
msgstr "Teni klav-kongrueco kun malnovaj klavkodoj de Solaris"
-#: ../rules/base.xml.in.h:1049
+#: ../rules/base.xml.in.h:1054
msgid "Sun Key compatibility"
msgstr "Kongrueco kun klavoj de Sun"
-#: ../rules/base.xml.in.h:1050
+#: ../rules/base.xml.in.h:1055
msgid "Key sequence to kill the X server"
msgstr "Klav-sekvo por formortigi la X-servilon"
-#: ../rules/base.xml.in.h:1051
+#: ../rules/base.xml.in.h:1056
msgid "Ctrl + Alt + Backspace"
msgstr "Ctrl + Alt + Backspace"
@@ -4021,150 +4041,160 @@ msgstr "Couer d'Alene Salish"
msgid "English (US, Sun Type 6/7)"
msgstr "Angla (US, Sun Tipo 6/7)"
-#: ../rules/base.extras.xml.in.h:42
+#: ../rules/base.extras.xml.in.h:40
+msgid "English (Norman)"
+msgstr "Angla (Norman)"
+
+#: ../rules/base.extras.xml.in.h:43
msgid "Polish (international with dead keys)"
msgstr "Pola (internacia kun senpaŝaj klavoj)"
-#: ../rules/base.extras.xml.in.h:43
+#: ../rules/base.extras.xml.in.h:44
msgid "Polish (Colemak)"
msgstr "Pola (Colemak)"
-#: ../rules/base.extras.xml.in.h:44
+#: ../rules/base.extras.xml.in.h:45
msgid "Polish (Sun Type 6/7)"
msgstr "Pola (Sun Tipo 6/7)"
-#: ../rules/base.extras.xml.in.h:48
+#: ../rules/base.extras.xml.in.h:49
msgid "Crimean Tatar (Dobruja Q)"
msgstr "Krime-tatara (Dobruja Q)"
-#: ../rules/base.extras.xml.in.h:49
+#: ../rules/base.extras.xml.in.h:50
msgid "Romanian (ergonomic Touchtype)"
msgstr "Rumana (komforteca Touchtype)"
-#: ../rules/base.extras.xml.in.h:50
+#: ../rules/base.extras.xml.in.h:51
msgid "Romanian (Sun Type 6/7)"
msgstr "Rumana (Sun Tipo 6/7)"
-#: ../rules/base.extras.xml.in.h:53
+#: ../rules/base.extras.xml.in.h:54
msgid "Serbian (combining accents instead of dead keys)"
msgstr "Serba (kunmiksado de diakritaĵoj anstataŭ senpaŝaj klavoj)"
-#: ../rules/base.extras.xml.in.h:56
+#: ../rules/base.extras.xml.in.h:57
msgid "Russian (with Ukrainian-Belorussian layout)"
msgstr "Rusa (kun aranĝo ukrainia-belorusa)"
-#: ../rules/base.extras.xml.in.h:57
+#: ../rules/base.extras.xml.in.h:58
msgid "Russian (Sun Type 6/7)"
msgstr "Rusa (Sun Tipo 6/7)"
-#: ../rules/base.extras.xml.in.h:60
+#: ../rules/base.extras.xml.in.h:61
msgid "Armenian (OLPC phonetic)"
msgstr "Armena (fonetika OLPC)"
-#: ../rules/base.extras.xml.in.h:63
+#: ../rules/base.extras.xml.in.h:64
msgid "Hebrew (Biblical, SIL phonetic)"
msgstr "Hebrea (Biblia, fonetika SIL)"
-#: ../rules/base.extras.xml.in.h:66
+#: ../rules/base.extras.xml.in.h:67
msgid "Arabic (Sun Type 6/7)"
msgstr "Araba (Sun Tipo 6/7)"
-#: ../rules/base.extras.xml.in.h:69
+#: ../rules/base.extras.xml.in.h:70
msgid "Belgian (Sun Type 6/7)"
msgstr "Belga (Sun Tipo 6/7)"
-#: ../rules/base.extras.xml.in.h:72
+#: ../rules/base.extras.xml.in.h:73
msgid "Portuguese (Brazil, Sun Type 6/7)"
msgstr "Portugala (Brazilo, Sun Tipo 6/7)"
-#: ../rules/base.extras.xml.in.h:75
+#: ../rules/base.extras.xml.in.h:76
msgid "Czech (Sun Type 6/7)"
msgstr "Ĉeĥa (Sun Type 6/7)"
-#: ../rules/base.extras.xml.in.h:78
+#: ../rules/base.extras.xml.in.h:79
msgid "Danish (Sun Type 6/7)"
msgstr "Dana (Sun Tipo 6/7)"
-#: ../rules/base.extras.xml.in.h:81
+#: ../rules/base.extras.xml.in.h:82
msgid "Dutch (Sun Type 6/7)"
msgstr "Nederlanda (Sun Tipo 6/7)"
-#: ../rules/base.extras.xml.in.h:84
+#: ../rules/base.extras.xml.in.h:85
msgid "Estonian (Sun Type 6/7)"
msgstr "Estona (Sun Tipo 6/7)"
-#: ../rules/base.extras.xml.in.h:87
+#: ../rules/base.extras.xml.in.h:88
msgid "Finnish (Sun Type 6/7)"
msgstr "Fina (Sun Tipo 6/7)"
-#: ../rules/base.extras.xml.in.h:89
+#: ../rules/base.extras.xml.in.h:90
msgid "French (Sun Type 6/7)"
msgstr "Franca (Sun Tipo 6/7)"
-#: ../rules/base.extras.xml.in.h:92
+#: ../rules/base.extras.xml.in.h:93
msgid "Greek (Sun Type 6/7)"
msgstr "Greka (Sun Tipo 6/7)"
-#: ../rules/base.extras.xml.in.h:95
+#: ../rules/base.extras.xml.in.h:96
msgid "Italian (Sun Type 6/7)"
msgstr "Itala (Sun Tipo 6/7)"
-#: ../rules/base.extras.xml.in.h:98
+#: ../rules/base.extras.xml.in.h:99
msgid "Japanese (Sun Type 6)"
msgstr "Japana (Sun Tipo 6)"
-#: ../rules/base.extras.xml.in.h:99
+#: ../rules/base.extras.xml.in.h:100
msgid "Japanese (Sun Type 7 - pc compatible)"
msgstr "Japana (Sun Tipo 7 - kongrua kun pc)"
-#: ../rules/base.extras.xml.in.h:100
+#: ../rules/base.extras.xml.in.h:101
msgid "Japanese (Sun Type 7 - sun compatible)"
msgstr "Japana (Sun Tipo 7 - kongrua kun Sun)"
-#: ../rules/base.extras.xml.in.h:103
+#: ../rules/base.extras.xml.in.h:104
msgid "Norwegian (Sun Type 6/7)"
msgstr "Norvega (Sun Tipo 6/7)"
-#: ../rules/base.extras.xml.in.h:105
+#: ../rules/base.extras.xml.in.h:106
msgid "Portuguese (Sun Type 6/7)"
msgstr "Portugala (Sun Tipo 6/7)"
-#: ../rules/base.extras.xml.in.h:108
+#: ../rules/base.extras.xml.in.h:109
msgid "Slovak (Sun Type 6/7)"
msgstr "Slovaka (Sun Type 6/7)"
-#: ../rules/base.extras.xml.in.h:111
+#: ../rules/base.extras.xml.in.h:112
msgid "Spanish (Sun Type 6/7)"
msgstr "Hispana (Sun Tipo 6/7)"
-#: ../rules/base.extras.xml.in.h:114
+#: ../rules/base.extras.xml.in.h:115
msgid "Swedish (Sun Type 6/7)"
msgstr "Sveda (Sun Tipo 6/7)"
-#: ../rules/base.extras.xml.in.h:116
+#: ../rules/base.extras.xml.in.h:117
msgid "German (Switzerland, Sun Type 6/7)"
msgstr "Germana (Svislando, Sun Tipo 6/7)"
-#: ../rules/base.extras.xml.in.h:117
+#: ../rules/base.extras.xml.in.h:118
msgid "French (Switzerland, Sun Type 6/7)"
msgstr "Franca (Svislando, Sun Tipo 6/7)"
-#: ../rules/base.extras.xml.in.h:120
+#: ../rules/base.extras.xml.in.h:121
msgid "Turkish (Sun Type 6/7)"
msgstr "Turka (Sun Tipo 6/7)"
-#: ../rules/base.extras.xml.in.h:123
+#: ../rules/base.extras.xml.in.h:124
msgid "Ukrainian (Sun Type 6/7)"
msgstr "Ukrajna (Sun Tipo 6/7)"
-#: ../rules/base.extras.xml.in.h:125
+#: ../rules/base.extras.xml.in.h:126
msgid "English (UK, Sun Type 6/7)"
msgstr "Angla (UK, Sun Tipo 6/7)"
-#: ../rules/base.extras.xml.in.h:128
+#: ../rules/base.extras.xml.in.h:129
msgid "Korean (Sun Type 6/7)"
msgstr "Kore (Sun Tipo 6/7)"
+#~ msgid "Bengali"
+#~ msgstr "Bengala"
+
+#~ msgid "Portuguese (Brazil, nativo for Esperanto)"
+#~ msgstr "Portugala (Brazilo, Nativo por Esperanto)"
+
#~ msgid "English (layout toggle on multiply/divide key)"
#~ msgstr "Angla (alternigi aranĝon per la klavo multipliko/divido)"
@@ -4435,9 +4465,6 @@ msgstr "Kore (Sun Tipo 6/7)"
#~ msgid "Aze"
#~ msgstr "Aze"
-#~ msgid "Bangladesh"
-#~ msgstr "Bangladeŝo"
-
#~ msgid "Bel"
#~ msgstr "Bel"
diff --git a/xorg-server/xkeyboard-config/po/es.po b/xorg-server/xkeyboard-config/po/es.po
index 4f7bb3156..a784d6043 100644
--- a/xorg-server/xkeyboard-config/po/es.po
+++ b/xorg-server/xkeyboard-config/po/es.po
@@ -1,3778 +1,4253 @@
-# translation of xkeyboard-config-2.3.99.po to Spanish
+# translation of xkeyboard-config-2.10.99.po to Spanish
# This file is distributed under the same license as the xkeyboard-config package.
# Copyright (C) 2006 The free software foundation
# Francisco Javier F. Serrador <serrador@cvs.gnome.org>, 2006.
# Jorge González <jorgegonz@svn.gnome.org>, 2009, 2010, 2011.
+# Facundo Dario Illanes <fdillanes@gmail.com>, 2013, 2014.
#
msgid ""
msgstr ""
-"Project-Id-Version: xkeyboard-config-2.3.99\n"
+"Project-Id-Version: xkeyboard-config-2.10.99\n"
"Report-Msgid-Bugs-To: svu@users.sourceforge.net\n"
-"POT-Creation-Date: 2011-09-15 21:25+0100\n"
-"PO-Revision-Date: 2011-10-02 15:54+0200\n"
-"Last-Translator: Jorge González González <aloriel@gmail.com>\n"
+"POT-Creation-Date: 2014-01-15 01:12+0000\n"
+"PO-Revision-Date: 2014-01-27 17:13-0300\n"
+"Last-Translator: Facundo Dario Illanes <fdillanes@gmail.com>\n"
"Language-Team: Spanish <es@li.org>\n"
"Language: es\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
-"X-Generator: KBabel 1.9.1\n"
+"X-Generator: Gtranslator 2.91.6\n"
"Plural-Forms: nplurals=2; plural=(n!=1);\n"
#: ../rules/base.xml.in.h:1
-msgid "&lt;Less/Greater&gt;"
-msgstr "&lt;Menor que/Mayor que&gt;"
+msgid "Generic 101-key PC"
+msgstr "PC genérico 101 teclas"
#: ../rules/base.xml.in.h:2
-msgid "&lt;Less/Greater&gt; (chooses 3rd level, latches when pressed together with another 3rd-level-chooser)"
-msgstr "&lt;Menor que/Mayor que&gt; (elige el 3º nivel, bloquea al pulsarse junto con otro selector de 3º nivel)"
+msgid "Generic 102-key (Intl) PC"
+msgstr "PC genérico 102 teclas (intl)"
#: ../rules/base.xml.in.h:3
-msgid "&lt;Less/Greater&gt; chooses 5th level and activates level5-Lock when pressed together with another 5th-level-chooser, one press releases the lock"
-msgstr "&lt;Menor que/Mayor que&gt; elige el 5º nivel y activa el bloqueo de 5º nivel al pulsarse junto con otro selector de 5º nivel, una pulsación libera el bloqueo"
+msgid "Generic 104-key PC"
+msgstr "PC genérico 104 teclas"
#: ../rules/base.xml.in.h:4
-msgid "&lt;Less/Greater&gt; chooses 5th level, locks when pressed together with another 5th-level-chooser"
-msgstr "&lt;Menor que/Mayor que&gt; elige el 5º nivel, bloquea al pulsarse junto con otro selector de 5º nivel"
+msgid "Generic 105-key (Intl) PC"
+msgstr "PC genérico 105 teclas (intl)"
#: ../rules/base.xml.in.h:5
-msgid "&lt;Less/Greater&gt; chooses 5th level, locks when pressed together with another 5th-level-chooser, one press releases the lock"
-msgstr "&lt;Menor que/Mayor que&gt; elige el 5º nivel, bloquea al pulsarse junto con otro selector de 5º nivel, una pulsación libera el bloqueo"
+msgid "Dell 101-key PC"
+msgstr "Dell PC 101 teclas"
#: ../rules/base.xml.in.h:6
-msgid "A4Tech KB-21"
-msgstr "A4Tech KB-21"
+msgid "Dell Latitude series laptop"
+msgstr "Portátil Dell Latitude"
#: ../rules/base.xml.in.h:7
-msgid "A4Tech KBS-8"
-msgstr "A4Tech KBS-8"
+msgid "Dell Precision M65"
+msgstr "Dell Precision M65"
#: ../rules/base.xml.in.h:8
-msgid "A4Tech Wireless Desktop RFKB-23"
-msgstr "A4Tech Wireless Desktop RFKB-23"
+msgid "Everex STEPnote"
+msgstr "Everex STEPnote"
#: ../rules/base.xml.in.h:9
-msgid "ATM/phone-style"
-msgstr "Cajero automático/estilo teléfono"
+msgid "Keytronic FlexPro"
+msgstr "Keytronic FlexPro"
#: ../rules/base.xml.in.h:10
-msgid "Acer AirKey V"
-msgstr "Acer AirKey V"
+msgid "Microsoft Natural"
+msgstr "Microsoft Natural"
#: ../rules/base.xml.in.h:11
-msgid "Acer C300"
-msgstr "Acer C300"
+msgid "Northgate OmniKey 101"
+msgstr "Northgate OmniKey 101"
#: ../rules/base.xml.in.h:12
-msgid "Acer Ferrari 4000"
-msgstr "Acer Ferrari 4000"
+msgid "Winbook Model XP5"
+msgstr "Winbook Model XP5"
#: ../rules/base.xml.in.h:13
-msgid "Acer Laptop"
-msgstr "Portátil Acer"
+msgid "PC-98xx Series"
+msgstr "PC-98xx Series"
#: ../rules/base.xml.in.h:14
-msgid "Add the standard behavior to Menu key"
-msgstr "Añadir el comportamiento estándar a la tecla Menú."
+msgid "A4Tech KB-21"
+msgstr "A4Tech KB-21"
#: ../rules/base.xml.in.h:15
-msgid "Adding Esperanto circumflexes (supersigno)"
-msgstr "Añadir las tildes circunflejas del esperanto (supersigno)"
+msgid "A4Tech KBS-8"
+msgstr "A4Tech KBS-8"
#: ../rules/base.xml.in.h:16
-msgid "Adding currency signs to certain keys"
-msgstr "Añadir símbolo de divisa a algunas teclas"
+msgid "A4Tech Wireless Desktop RFKB-23"
+msgstr "A4Tech Wireless Desktop RFKB-23"
#: ../rules/base.xml.in.h:17
-msgid "Advance Scorpius KI"
-msgstr "Advance Scorpius KI"
+msgid "Acer AirKey V"
+msgstr "Acer AirKey V"
#: ../rules/base.xml.in.h:18
-msgid "Afghani"
-msgstr "Afgano"
+msgid "Azona RF2300 wireless Internet Keyboard"
+msgstr "Azona RF2300 wireless Internet Keyboard"
#: ../rules/base.xml.in.h:19
-msgid "Akan"
-msgstr "Akan"
+msgid "Advance Scorpius KI"
+msgstr "Advance Scorpius KI"
#: ../rules/base.xml.in.h:20
-msgid "Albanian"
-msgstr "Albanés"
+msgid "Brother Internet Keyboard"
+msgstr "Brother Internet Keyboard"
#: ../rules/base.xml.in.h:21
-msgid "Alt and Meta are on Alt keys"
-msgstr "Alt y Meta están en las teclas Alt"
+msgid "BTC 5113RF Multimedia"
+msgstr "BTC 5113RF Multimedia"
#: ../rules/base.xml.in.h:22
-msgid "Alt is mapped to Right Win, Super to Menu"
-msgstr "Alt está mapeada a la tecla Windows derecho y Super a la tecla Menú"
+msgid "BTC 5126T"
+msgstr "BTC 5126T"
#: ../rules/base.xml.in.h:23
-msgid "Alt+Caps Lock"
-msgstr "Alt+Bloq Mayús"
+msgid "BTC 6301URF"
+msgstr "BTC 6301URF"
#: ../rules/base.xml.in.h:24
-msgid "Alt+Ctrl"
-msgstr "Alt+Ctrl"
+msgid "BTC 9000"
+msgstr "BTC 9000"
#: ../rules/base.xml.in.h:25
-msgid "Alt+Shift"
-msgstr "Alt+Mayús"
+msgid "BTC 9000A"
+msgstr "BTC 9000A"
#: ../rules/base.xml.in.h:26
-msgid "Alt+Space"
-msgstr "Alt+Espacio"
+msgid "BTC 9001AH"
+msgstr "BTC 9001AH"
#: ../rules/base.xml.in.h:27
-msgid "Alt/Win key behavior"
-msgstr "Comportamiento de la tecla Alt/Windows"
+msgid "BTC 5090"
+msgstr "BTC 5090"
#: ../rules/base.xml.in.h:28
-msgid "Amharic"
-msgstr "Amharico"
+msgid "BTC 9019U"
+msgstr "BTC 9019U"
#: ../rules/base.xml.in.h:29
-msgid "Any Alt key"
-msgstr "Cualquier tecla Alt"
+msgid "BTC 9116U Mini Wireless Internet and Gaming"
+msgstr "BTC 9116U Mini Wireless Internet and Gaming"
#: ../rules/base.xml.in.h:30
-msgid "Any Win key"
-msgstr "Cualquier tecla Windows"
+msgid "Cherry Blue Line CyBo@rd"
+msgstr "Cherry Blue Line CyBo@rd"
#: ../rules/base.xml.in.h:31
-msgid "Any Win key (while pressed)"
-msgstr "Cualquier tecla Windows (al pulsarla)"
+msgid "Cherry CyMotion Master XPress"
+msgstr "Cherry CyMotion Master XPress"
#: ../rules/base.xml.in.h:32
-msgid "Apple"
-msgstr "Apple"
+msgid "Cherry Blue Line CyBo@rd (alternate option)"
+msgstr "Cherry Blue Line CyBo@rd (opción alternativa)"
#: ../rules/base.xml.in.h:33
-msgid "Apple Aluminium Keyboard (ANSI)"
-msgstr "Teclado de aluminio de Apple (ANSI)"
+msgid "Cherry CyBo@rd USB-Hub"
+msgstr "Cherry CyBo@rd USB-Hub"
#: ../rules/base.xml.in.h:34
-msgid "Apple Aluminium Keyboard (ISO)"
-msgstr "Teclado de aluminio de Apple (ISO)"
+msgid "Cherry CyMotion Expert"
+msgstr "Cherry CyMotion Expert"
#: ../rules/base.xml.in.h:35
-msgid "Apple Aluminium Keyboard (JIS)"
-msgstr "Teclado de aluminio de Apple (JIS)"
+msgid "Cherry B.UNLIMITED"
+msgstr "Cherry B.UNLIMITED"
#: ../rules/base.xml.in.h:36
-msgid "Apple Aluminium Keyboard: emulate PC keys (Print, Scroll Lock, Pause, Num Lock)"
-msgstr "Teclado de aluminio de Apple: emular teclas PC (Imprimir, Bloq Despl, Pausa, Bloq Num)"
+msgid "Chicony Internet Keyboard"
+msgstr "Chicony Internet Keyboard"
#: ../rules/base.xml.in.h:37
-msgid "Apple Laptop"
-msgstr "Portátil Apple"
+msgid "Chicony KU-0108"
+msgstr "Chicony KU-0108"
#: ../rules/base.xml.in.h:38
-msgid "Arabic"
-msgstr "Árabe"
+msgid "Chicony KU-0420"
+msgstr "Chicony KU-0420"
#: ../rules/base.xml.in.h:39
-msgid "Arabic (Buckwalter)"
-msgstr "Árabe (Buckwalter)"
+msgid "Chicony KB-9885"
+msgstr "Chicony KB-9885"
#: ../rules/base.xml.in.h:40
-msgid "Arabic (Morocco)"
-msgstr "Árabbe (Marruecos)"
+msgid "Compaq Easy Access Keyboard"
+msgstr "Compaq Easy Access Keyboard"
#: ../rules/base.xml.in.h:41
-msgid "Arabic (Pakistan)"
-msgstr "Árabe (Pakistán)"
+msgid "Compaq Internet Keyboard (7 keys)"
+msgstr "Compaq Internet Keyboard (7 teclas)"
#: ../rules/base.xml.in.h:42
-msgid "Arabic (Syria)"
-msgstr "Árabe (Siria)"
+msgid "Compaq Internet Keyboard (13 keys)"
+msgstr "Compaq Internet Keyboard (13 teclas)"
#: ../rules/base.xml.in.h:43
-msgid "Arabic (azerty)"
-msgstr "Árabe (azerty)"
+msgid "Compaq Internet Keyboard (18 keys)"
+msgstr "Compaq Internet Keyboard (18 teclas)"
#: ../rules/base.xml.in.h:44
-msgid "Arabic (azerty/digits)"
-msgstr "Árabe (azerty/dígitos)"
+msgid "Cherry CyMotion Master Linux"
+msgstr "Cherry CyMotion Master Linux"
#: ../rules/base.xml.in.h:45
-msgid "Arabic (digits)"
-msgstr "Árabe (dígitos)"
+msgid "Laptop/notebook Compaq (eg. Armada) Laptop Keyboard"
+msgstr "Laptop/notebook Compaq (eg. Armada) Laptop Keyboard"
#: ../rules/base.xml.in.h:46
-msgid "Arabic (qwerty)"
-msgstr "Árabe (qwery)"
+msgid "Laptop/notebook Compaq (eg. Presario) Internet Keyboard"
+msgstr "Laptop/notebook Compaq (eg. Presario) Internet Keyboard"
#: ../rules/base.xml.in.h:47
-msgid "Arabic (qwerty/digits)"
-msgstr "Árabe (qwerty/dígitos)"
+msgid "Compaq iPaq Keyboard"
+msgstr "Compaq iPaq Keyboard"
-#: ../rules/base.xml.in.h:48 ../rules/base.extras.xml.in.h:2
-msgid "Armenian"
-msgstr "Armenio"
+#: ../rules/base.xml.in.h:48
+msgid "Dell"
+msgstr "Dell"
#: ../rules/base.xml.in.h:49
-msgid "Armenian (alternative eastern)"
-msgstr "Armenio (alternativa oriental)"
+msgid "Dell SK-8125"
+msgstr "Dell SK-8125"
#: ../rules/base.xml.in.h:50
-msgid "Armenian (alternative phonetic)"
-msgstr "Armenio (alternativa fonética)"
+msgid "Dell SK-8135"
+msgstr "Dell SK-8135"
#: ../rules/base.xml.in.h:51
-msgid "Armenian (eastern)"
-msgstr "Armenio (oriental)"
+msgid "Dell USB Multimedia Keyboard"
+msgstr "Dell USB Multimedia Keyboard"
#: ../rules/base.xml.in.h:52
-msgid "Armenian (phonetic)"
-msgstr "Armenio (fonético)"
+msgid "Dell Laptop/notebook Inspiron 6xxx/8xxx"
+msgstr "Dell Laptop/notebook Inspiron 6xxx/8xxx"
#: ../rules/base.xml.in.h:53
-msgid "Armenian (western)"
-msgstr "Armenio (occidental)"
+msgid "Dell Laptop/notebook Precision M series"
+msgstr "Dell Laptop/notebook Precision M series"
#: ../rules/base.xml.in.h:54
-msgid "Asturian (Spain, with bottom-dot H and bottom-dot L)"
-msgstr "Asturiano (español, con H de medio punto y L de medio punto)"
+msgid "Dexxa Wireless Desktop Keyboard"
+msgstr "Dexxa Wireless Desktop Keyboard"
#: ../rules/base.xml.in.h:55
-msgid "Asus Laptop"
-msgstr "Portátil Asus"
+msgid "Diamond 9801 / 9802 series"
+msgstr "Diamond 9801 / 9802 series"
#: ../rules/base.xml.in.h:56
-msgid "At bottom left"
-msgstr "En la parte inferior izquierdo"
+msgid "DTK2000"
+msgstr "DTK2000"
#: ../rules/base.xml.in.h:57
-msgid "At left of 'A'"
-msgstr "A la izquierdo de la «A»"
+msgid "Ennyah DKB-1008"
+msgstr "Ennyah DKB-1008"
#: ../rules/base.xml.in.h:58
-msgid "Avatime"
-msgstr "Avatime"
+msgid "Fujitsu-Siemens Computers AMILO laptop"
+msgstr "Portátil Fujitsu-Siemens Computers AMILO"
#: ../rules/base.xml.in.h:59
-msgid "Azerbaijani"
-msgstr "Azerbaijaní"
+msgid "Genius Comfy KB-16M / Genius MM Keyboard KWD-910"
+msgstr "Genius Comfy KB-16M / Genius MM Keyboard KWD-910"
#: ../rules/base.xml.in.h:60
-msgid "Azerbaijani (Cyrillic)"
-msgstr "Azerbajaní (cirílico)"
+msgid "Genius Comfy KB-12e"
+msgstr "Genius Comfy KB-12e"
#: ../rules/base.xml.in.h:61
-msgid "Azona RF2300 wireless Internet Keyboard"
-msgstr "Azona RF2300 wireless Internet Keyboard"
+msgid "Genius Comfy KB-21e-Scroll"
+msgstr "Genius Comfy KB-21e-Scroll"
#: ../rules/base.xml.in.h:62
-msgid "BTC 5090"
-msgstr "BTC 5090"
+msgid "Genius KB-19e NB"
+msgstr "Genius KB-19e NB"
#: ../rules/base.xml.in.h:63
-msgid "BTC 5113RF Multimedia"
-msgstr "BTC 5113RF Multimedia"
+msgid "Genius KKB-2050HS"
+msgstr "Genius KKB-2050HS"
#: ../rules/base.xml.in.h:64
-msgid "BTC 5126T"
-msgstr "BTC 5126T"
+msgid "Gyration"
+msgstr "Gyration"
#: ../rules/base.xml.in.h:65
-msgid "BTC 6301URF"
-msgstr "BTC 6301URF"
+msgid "HTC Dream"
+msgstr "HTC Dream"
#: ../rules/base.xml.in.h:66
-msgid "BTC 9000"
-msgstr "BTC 9000"
+msgid "Kinesis"
+msgstr "Kinesis"
#: ../rules/base.xml.in.h:67
-msgid "BTC 9000A"
-msgstr "BTC 9000A"
+msgid "Logitech Generic Keyboard"
+msgstr "Logitech, teclado genérico"
#: ../rules/base.xml.in.h:68
-msgid "BTC 9001AH"
-msgstr "BTC 9001AH"
+msgid "Logitech G15 extra keys via G15daemon"
+msgstr "Logitech G15 extra keys via G15daemon"
#: ../rules/base.xml.in.h:69
-msgid "BTC 9019U"
-msgstr "BTC 9019U"
+msgid "Hewlett-Packard Internet Keyboard"
+msgstr "Hewlett-Packard Internet Keyboard"
#: ../rules/base.xml.in.h:70
-msgid "BTC 9116U Mini Wireless Internet and Gaming"
-msgstr "BTC 9116U Mini Wireless Internet and Gaming"
+msgid "Hewlett-Packard SK-250x Multimedia Keyboard"
+msgstr "Hewlett-Packard SK-250x Multimedia Keyboard"
#: ../rules/base.xml.in.h:71
-msgid "Backslash"
-msgstr "Contrabarra"
+msgid "Hewlett-Packard Omnibook XE3 GC"
+msgstr "Hewlett-Packard Omnibook XE3 GC"
#: ../rules/base.xml.in.h:72
-msgid "Backslash (chooses 3rd level, latches when pressed together with another 3rd-level-chooser)"
-msgstr "Contrabarra (elige el 3º nivel, bloquea al pulsarse junto con otro selector de 3º nivel)"
+msgid "Hewlett-Packard Omnibook XE3 GF"
+msgstr "Hewlett-Packard Omnibook XE3 GF"
#: ../rules/base.xml.in.h:73
-msgid "Bambara"
-msgstr "Bambara"
+msgid "Hewlett-Packard Omnibook XT1000"
+msgstr "Hewlett-Packard Omnibook XT1000"
#: ../rules/base.xml.in.h:74
-msgid "Bashkirian"
-msgstr "Bashkiriano"
+msgid "Hewlett-Packard Pavilion dv5"
+msgstr "Hewlett-Packard Pavilion dv5"
#: ../rules/base.xml.in.h:75
-msgid "Belarusian"
-msgstr "Bielorruso"
+msgid "Hewlett-Packard Pavilion ZT11xx"
+msgstr "Hewlett-Packard Pavilion ZT11xx"
#: ../rules/base.xml.in.h:76
-msgid "Belarusian (Latin)"
-msgstr "Bielorruso (latino)"
+msgid "Hewlett-Packard Omnibook 500 FA"
+msgstr "Hewlett-Packard Omnibook 500 FA"
#: ../rules/base.xml.in.h:77
-msgid "Belarusian (legacy)"
-msgstr "Bielorruso (heredado)"
+msgid "Hewlett-Packard Omnibook 5xx"
+msgstr "Hewlett-Packard Omnibook 5xx"
#: ../rules/base.xml.in.h:78
-msgid "Belgian"
-msgstr "Belga"
+msgid "Hewlett-Packard nx9020"
+msgstr "Hewlett-Packard nx9020"
#: ../rules/base.xml.in.h:79
-msgid "Belgian (ISO alternate)"
-msgstr "Belga (alternativa ISO)"
+msgid "Hewlett-Packard Omnibook 6000/6100"
+msgstr "Hewlett-Packard Omnibook 6000/6100"
#: ../rules/base.xml.in.h:80
-msgid "Belgian (Sun dead keys)"
-msgstr "Belga (teclas muertas de Sun)"
+msgid "Honeywell Euroboard"
+msgstr "Honeywell Euroboard"
#: ../rules/base.xml.in.h:81
-msgid "Belgian (Wang model 724 azerty)"
-msgstr "Belga (modelo azerty 724 de Wang)"
+msgid "Hewlett-Packard Mini 110 Notebook"
+msgstr "Hewlett-Packard Mini 110 Notebook"
#: ../rules/base.xml.in.h:82
-msgid "Belgian (alternative)"
-msgstr "Belga (alternativa)"
+msgid "IBM Rapid Access"
+msgstr "IBM Rapid Access"
#: ../rules/base.xml.in.h:83
-msgid "Belgian (alternative, Sun dead keys)"
-msgstr "Belga (alternativa, teclas muertas de Sun)"
+msgid "IBM Rapid Access II"
+msgstr "IBM Rapid Access II"
#: ../rules/base.xml.in.h:84
-msgid "Belgian (alternative, latin-9 only)"
-msgstr "Belga (alternativa, sólo latin-9)"
+msgid "IBM ThinkPad 560Z/600/600E/A22E"
+msgstr "IBM ThinkPad 560Z/600/600E/A22E"
#: ../rules/base.xml.in.h:85
-msgid "Belgian (eliminate dead keys)"
-msgstr "Belga (eliminar teclas muertas)"
+msgid "IBM ThinkPad R60/T60/R61/T61"
+msgstr "IBM ThinkPad R60/T60/R61/T61"
#: ../rules/base.xml.in.h:86
-msgid "BenQ X-Touch"
-msgstr "BenQ X-Touch"
+msgid "IBM ThinkPad Z60m/Z60t/Z61m/Z61t"
+msgstr "IBM ThinkPad Z60m/Z60t/Z61m/Z61t"
#: ../rules/base.xml.in.h:87
-msgid "BenQ X-Touch 730"
-msgstr "BenQ X-Touch 730"
+msgid "IBM Space Saver"
+msgstr "IBM Space Saver"
#: ../rules/base.xml.in.h:88
-msgid "BenQ X-Touch 800"
-msgstr "BenQ X-Touch 800"
+msgid "Logitech Access Keyboard"
+msgstr "Logitech Access Keyboard"
#: ../rules/base.xml.in.h:89
-msgid "Bengali"
-msgstr "Bengalí"
+msgid "Logitech Cordless Desktop LX-300"
+msgstr "Logitech Cordless Desktop LX-300"
#: ../rules/base.xml.in.h:90
-msgid "Bengali (Baishakhi Inscript)"
-msgstr "Bengalí (Inscript Baishakhi)"
+msgid "Logitech Internet 350 Keyboard"
+msgstr "Logitech Internet 350 Keyboard"
#: ../rules/base.xml.in.h:91
-msgid "Bengali (Baishakhi)"
-msgstr "Bengalí (Baishakhi)"
+msgid "Logitech Media Elite Keyboard"
+msgstr "Logitech Media Elite Keyboard"
#: ../rules/base.xml.in.h:92
-msgid "Bengali (Bornona)"
-msgstr "Bengalí (Bornona)"
+msgid "Logitech Cordless Desktop"
+msgstr "Logitech Cordless Desktop"
#: ../rules/base.xml.in.h:93
-msgid "Bengali (Probhat)"
-msgstr "Bengalí (Probhat)"
+msgid "Logitech Cordless Desktop iTouch"
+msgstr "Logitech Cordless Desktop iTouch"
#: ../rules/base.xml.in.h:94
-msgid "Bengali (Uni Gitanjali)"
-msgstr "Bengalí (Uni Gitanjali)"
+msgid "Logitech Cordless Desktop Navigator"
+msgstr "Logitech Cordless Desktop Navigator"
#: ../rules/base.xml.in.h:95
-msgid "Berber (Morocco, Tifinagh alternative phonetic)"
-msgstr "Bereber (Marruecos, alternativa fonética tifinagh)"
+msgid "Logitech Cordless Desktop Optical"
+msgstr "Logitech Cordless Desktop Optical"
#: ../rules/base.xml.in.h:96
-msgid "Berber (Morocco, Tifinagh alternative)"
-msgstr "Bereber (Marruecos, alternativa tifinagh)"
+msgid "Logitech Cordless Desktop (alternate option)"
+msgstr "Logitech Cordless Desktop Pro (opción alternativa)"
#: ../rules/base.xml.in.h:97
-msgid "Berber (Morocco, Tifinagh extended phonetic)"
-msgstr "Bereber (Marruecos, tifinagh fonético extendido)"
+msgid "Logitech Cordless Desktop Pro (alternate option 2)"
+msgstr "Logitech Cordless Desktop Pro (opción alternativa 2)"
#: ../rules/base.xml.in.h:98
-msgid "Berber (Morocco, Tifinagh extended)"
-msgstr "Bereber (Marruecos, tifinagh extendido)"
+msgid "Logitech Cordless Freedom/Desktop Navigator"
+msgstr "Logitech Cordless Freedom/Desktop Navigator"
#: ../rules/base.xml.in.h:99
-msgid "Berber (Morocco, Tifinagh phonetic)"
-msgstr "Bereber (Marruecos, tifinagh fonético)"
+msgid "Logitech iTouch Cordless Keyboard (model Y-RB6)"
+msgstr "Logitech iTouch Cordless Keyboard (modelo Y-RB6)"
#: ../rules/base.xml.in.h:100
-msgid "Berber (Morocco, Tifinagh)"
-msgstr "Bereber (Marruecos, Tifinagh)"
+msgid "Logitech Internet Keyboard"
+msgstr "Logitech Internet Keyboard"
#: ../rules/base.xml.in.h:101
-msgid "Bosnian"
-msgstr "Bosnio"
+msgid "Logitech iTouch"
+msgstr "Logitech iTouch"
#: ../rules/base.xml.in.h:102
-msgid "Bosnian (US keyboard with Bosnian digraphs)"
-msgstr "Bosnio (teclado de EE. UU. con dígrafos bosnios)"
+msgid "Logitech Internet Navigator Keyboard"
+msgstr "Logitech Internet Navigator Keyboard"
#: ../rules/base.xml.in.h:103
-msgid "Bosnian (US keyboard with Bosnian letters)"
-msgstr "Bosnio (teclado de EE. UU. con letras bosnias)"
+msgid "Logitech Cordless Desktop EX110"
+msgstr "Logitech Cordless Desktop EX110"
#: ../rules/base.xml.in.h:104
-msgid "Bosnian (use Bosnian digraphs)"
-msgstr "Bosnio (usar dígrafos bosnios)"
+msgid "Logitech iTouch Internet Navigator Keyboard SE"
+msgstr "Logitech iTouch Internet Navigator Keyboard SE"
#: ../rules/base.xml.in.h:105
-msgid "Bosnian (use guillemets for quotes)"
-msgstr "Bosnio (usar guillemots para comillas)"
+msgid "Logitech iTouch Internet Navigator Keyboard SE (USB)"
+msgstr "Logitech iTouch Internet Navigator Keyboard SE (USB)"
#: ../rules/base.xml.in.h:106
-msgid "Both Alt keys together"
-msgstr "Ambas teclas Alt juntas"
+msgid "Logitech Ultra-X Keyboard"
+msgstr "Logitech Ultra-X Keyboard"
#: ../rules/base.xml.in.h:107
-msgid "Both Ctrl keys together"
-msgstr "Ambas teclas Ctrl juntas"
+msgid "Logitech Ultra-X Cordless Media Desktop Keyboard"
+msgstr "Logitech Ultra-X Cordless Media Desktop Keyboard"
#: ../rules/base.xml.in.h:108
-msgid "Both Shift keys together"
-msgstr "Ambas teclas Mayús juntas"
+msgid "Logitech diNovo Keyboard"
+msgstr "Logitech diNovo Keyboard"
#: ../rules/base.xml.in.h:109
-msgid "Both Shift-Keys together activate Caps Lock, one Shift-Key deactivates"
-msgstr "Ambas teclas Mayús juntas conmutan Bloq Mayús, una tecla Mayús lo desactiva"
+msgid "Logitech diNovo Edge Keyboard"
+msgstr "Logitech diNovo Edge Keyboard"
#: ../rules/base.xml.in.h:110
-msgid "Both Shift-Keys together toggle Caps Lock"
-msgstr "Ambas teclas Mayús juntas conmutan Bloq Mayús"
+msgid "Memorex MX1998"
+msgstr "Memorex MX1998"
#: ../rules/base.xml.in.h:111
-msgid "Both Shift-Keys together toggle ShiftLock"
-msgstr "Ambas teclas Mayús juntas conmutan Bloq Despl"
+msgid "Memorex MX2500 EZ-Access Keyboard"
+msgstr "Memorex MX2500 EZ-Access Keyboard"
#: ../rules/base.xml.in.h:112
-msgid "Braille"
-msgstr "Braille"
+msgid "Memorex MX2750"
+msgstr "Memorex MX2750"
#: ../rules/base.xml.in.h:113
-msgid "Braille (left hand)"
-msgstr "Braille (zurdo)"
+msgid "Microsoft Natural Wireless Ergonomic Keyboard 4000"
+msgstr "Microsoft Natural Wireless Ergonomic Keyboard 4000"
#: ../rules/base.xml.in.h:114
-msgid "Braille (right hand)"
-msgstr "Braille (diestro)"
+msgid "Microsoft Natural Wireless Ergonomic Keyboard 7000"
+msgstr "Microsoft Natural Wireless Ergonomic Keyboard 7000"
#: ../rules/base.xml.in.h:115
-msgid "Brother Internet Keyboard"
-msgstr "Brother Internet Keyboard"
+msgid "Microsoft Internet Keyboard"
+msgstr "Microsoft Internet Keyboard"
#: ../rules/base.xml.in.h:116
-msgid "Bulgarian"
-msgstr "Búlgaro"
+msgid "Microsoft Natural Keyboard Pro / Microsoft Internet Keyboard Pro"
+msgstr "Microsoft Natural Keyboard Pro / Microsoft Internet Keyboard Pro"
#: ../rules/base.xml.in.h:117
-msgid "Bulgarian (new phonetic)"
-msgstr "Búlgaro (fonética nueva)"
+msgid "Microsoft Natural Keyboard Pro USB / Microsoft Internet Keyboard Pro"
+msgstr "Microsoft Natural Keyboard Pro USB / Microsoft Internet Keyboard Pro"
#: ../rules/base.xml.in.h:118
-msgid "Bulgarian (traditional phonetic)"
-msgstr "Búlgaro (fonética tradicional)"
+msgid "Microsoft Natural Keyboard Pro OEM"
+msgstr "Microsoft Natural Keyboard Pro OEM"
#: ../rules/base.xml.in.h:119
-msgid "Burmese"
-msgstr "Burmese"
+msgid "ViewSonic KU-306 Internet Keyboard"
+msgstr "Teclado para internet ViewSonic KU-306"
#: ../rules/base.xml.in.h:120
-msgid "Cameroon Multilingual (azerty)"
-msgstr "Camerunés multilingüe (azerty)"
+msgid "Microsoft Internet Keyboard Pro, Swedish"
+msgstr "Microsoft Internet Keyboard Pro, sueco"
#: ../rules/base.xml.in.h:121
-msgid "Cameroon Multilingual (qwerty)"
-msgstr "Camerunés multilingüe (qwerty)"
+msgid "Microsoft Office Keyboard"
+msgstr "Microsoft Office Keyboard"
#: ../rules/base.xml.in.h:122
-msgid "Canadian Multilingual"
-msgstr "Canadiense multilingüe"
+msgid "Microsoft Wireless Multimedia Keyboard 1.0A"
+msgstr "Microsoft Wireless Multimedia Keyboard 1.0A"
#: ../rules/base.xml.in.h:123
-msgid "Canadian Multilingual (first part)"
-msgstr "Canadiense multilingüe (primera parte)"
+msgid "Microsoft Natural Keyboard Elite"
+msgstr "Microsoft Natural Keyboard Elite"
#: ../rules/base.xml.in.h:124
-msgid "Canadian Multilingual (second part)"
-msgstr "Canadiense multilingüe (segunda parte)"
+msgid "Microsoft Comfort Curve Keyboard 2000"
+msgstr "Microsoft Comfort Curve Keyboard 2000"
#: ../rules/base.xml.in.h:125
-msgid "Caps Lock"
-msgstr "Bloqueo de mayúsculas"
+msgid "Ortek MCK-800 MM/Internet keyboard"
+msgstr "Teclado Oretec MCK-800 MM/Internet"
#: ../rules/base.xml.in.h:126
-msgid "Caps Lock (chooses 3rd level, latches when pressed together with another 3rd-level-chooser)"
-msgstr "Bloq Mayús (elige el 3º nivel, bloquea al pulsarse junto con otro selector de 3º nivel)"
+msgid "Propeller Voyager (KTEZ-1000)"
+msgstr "Propeller Voyager (KTEZ-1000)"
#: ../rules/base.xml.in.h:127
-msgid "Caps Lock (to first layout), Shift+Caps Lock (to last layout)"
-msgstr "Bloq Mayús (a la primera distribución), Mayús+Bloq Mayús (a la última distribución)"
+msgid "QTronix Scorpius 98N+"
+msgstr "QTronix Scorpius 98N+"
#: ../rules/base.xml.in.h:128
-msgid "Caps Lock (while pressed), Alt+Caps Lock does the original capslock action"
-msgstr "Bloq Mayús (al pulsarse), Alt+Bloq Mayús realiza la acción original de bloqueo de mayúsculas"
+msgid "Samsung SDM 4500P"
+msgstr "Samsung SDM 4500P"
#: ../rules/base.xml.in.h:129
-msgid "Caps Lock acts as Shift with locking. Shift \"pauses\" Caps Lock"
-msgstr "Bloq Mayús actúa como Mayús con bloqueo; Mayús «pausa» Bloq Mayús"
+msgid "Samsung SDM 4510P"
+msgstr "Samsung SDM 4510P"
#: ../rules/base.xml.in.h:130
-msgid "Caps Lock acts as Shift with locking. Shift doesn't affect Caps Lock"
-msgstr "Bloq Mayús actúa como Mayús con bloqueo; Mayús no afecta a Bloq Mayús"
+msgid "Sanwa Supply SKB-KG3"
+msgstr "Sanwa Supply SKB-KG3"
#: ../rules/base.xml.in.h:131
-msgid "Caps Lock as Ctrl"
-msgstr "Bloq Mayús como Ctrl"
+msgid "SK-1300"
+msgstr "SK-1300"
#: ../rules/base.xml.in.h:132
-msgid "Caps Lock is disabled"
-msgstr "Bloq Mayús está desactivado"
+msgid "SK-2500"
+msgstr "SK-2500"
#: ../rules/base.xml.in.h:133
-msgid "Caps Lock key behavior"
-msgstr "Comportamiento de Bloq Mayús"
+msgid "SK-6200"
+msgstr "SK-6200"
#: ../rules/base.xml.in.h:134
-msgid "Caps Lock toggles Shift so all keys are affected"
-msgstr "Bloq Mayús cambia Mayús de forma que todas las teclas están afectadas"
+msgid "SK-7100"
+msgstr "SK-7100"
#: ../rules/base.xml.in.h:135
-msgid "Caps Lock toggles normal capitalization of alphabetic characters"
-msgstr "Bloq Mayús cambia la capitalización normal de los caracteres alfabéticos"
+msgid "Super Power Multimedia Keyboard"
+msgstr "Super Power Multimedia Keyboard"
#: ../rules/base.xml.in.h:136
-msgid "Caps Lock uses internal capitalization. Shift \"pauses\" Caps Lock"
-msgstr "Bloq Mayús usa la capitalización interna; Mayús «pausa» el Bloq Mayús"
+msgid "SVEN Ergonomic 2500"
+msgstr "SVEN Ergonomic 2500"
#: ../rules/base.xml.in.h:137
-msgid "Caps Lock uses internal capitalization. Shift doesn't affect Caps Lock"
-msgstr "Bloq Mayús usa la capitalización interna; Mayús no afecta a Bloq Mayús"
+msgid "SVEN Slim 303"
+msgstr "SVEN Slim 303"
#: ../rules/base.xml.in.h:138
-msgid "Catalan"
-msgstr "Catalán"
+msgid "Symplon PaceBook (tablet PC)"
+msgstr "Symplon PaceBook (tablet PC)"
#: ../rules/base.xml.in.h:139
-msgid "Catalan (Spain, with middle-dot L)"
-msgstr "Catalán (español, con L de medio punto)"
+msgid "Toshiba Satellite S3000"
+msgstr "Toshiba Satellite S3000"
#: ../rules/base.xml.in.h:140
-msgid "Cherokee"
-msgstr "Cherokee"
+msgid "Trust Wireless Keyboard Classic"
+msgstr "Trust Wireless Keyboard Classic"
#: ../rules/base.xml.in.h:141
-msgid "Cherry B.UNLIMITED"
-msgstr "Cherry B.UNLIMITED"
+msgid "Trust Direct Access Keyboard"
+msgstr "Trust Direct Access Keyboard"
#: ../rules/base.xml.in.h:142
-msgid "Cherry Blue Line CyBo@rd"
-msgstr "Cherry Blue Line CyBo@rd"
+msgid "Trust Slimline"
+msgstr "Trust Slimline"
#: ../rules/base.xml.in.h:143
-msgid "Cherry Blue Line CyBo@rd (alternate option)"
-msgstr "Cherry Blue Line CyBo@rd (opción alternativa)"
+msgid "TypeMatrix EZ-Reach 2020"
+msgstr "TypeMatrix EZ-Reach 2020"
#: ../rules/base.xml.in.h:144
-msgid "Cherry CyBo@rd USB-Hub"
-msgstr "Cherry CyBo@rd USB-Hub"
+msgid "TypeMatrix EZ-Reach 2030 PS2"
+msgstr "TypeMatrix EZ-Reach 2030 PS2"
#: ../rules/base.xml.in.h:145
-msgid "Cherry CyMotion Expert"
-msgstr "Cherry CyMotion Expert"
+msgid "TypeMatrix EZ-Reach 2030 USB"
+msgstr "TypeMatrix EZ-Reach 2030 USB"
#: ../rules/base.xml.in.h:146
-msgid "Cherry CyMotion Master Linux"
-msgstr "Cherry CyMotion Master Linux"
+msgid "TypeMatrix EZ-Reach 2030 USB (102/105:EU mode)"
+msgstr "TypeMatrix EZ-Reach 2030 USB (102/105:modo EU)"
#: ../rules/base.xml.in.h:147
-msgid "Cherry CyMotion Master XPress"
-msgstr "Cherry CyMotion Master XPress"
+msgid "TypeMatrix EZ-Reach 2030 USB (106:JP mode)"
+msgstr "TypeMatrix EZ-Reach 2030 USB (106:modo JP)"
#: ../rules/base.xml.in.h:148
-msgid "Chicony Internet Keyboard"
-msgstr "Chicony Internet Keyboard"
+msgid "Yahoo! Internet Keyboard"
+msgstr "Yahoo! Internet Keyboard"
#: ../rules/base.xml.in.h:149
-msgid "Chicony KB-9885"
-msgstr "Chicony KB-9885"
+msgid "MacBook/MacBook Pro"
+msgstr "MacBook/MacBook Pro"
#: ../rules/base.xml.in.h:150
-msgid "Chicony KU-0108"
-msgstr "Chicony KU-0108"
+msgid "MacBook/MacBook Pro (Intl)"
+msgstr "MacBook/MacBook Pro (Intl)"
#: ../rules/base.xml.in.h:151
-msgid "Chicony KU-0420"
-msgstr "Chicony KU-0420"
+msgid "Macintosh"
+msgstr "Macintosh"
#: ../rules/base.xml.in.h:152
-msgid "Chinese"
-msgstr "Chino"
+msgid "Macintosh Old"
+msgstr "Macintosh antiguo"
#: ../rules/base.xml.in.h:153
-msgid "Chuvash"
-msgstr "Chuvash"
+msgid "Happy Hacking Keyboard for Mac"
+msgstr "Happy Hacking Keyboard para Mac"
#: ../rules/base.xml.in.h:154
-msgid "Chuvash (Latin)"
-msgstr "Cuvash (latino)"
+msgid "Acer C300"
+msgstr "Acer C300"
#: ../rules/base.xml.in.h:155
-msgid "Classmate PC"
-msgstr "Classmate PC"
+msgid "Acer Ferrari 4000"
+msgstr "Acer Ferrari 4000"
#: ../rules/base.xml.in.h:156
-msgid "CloGaelach"
-msgstr "Cló Gaelach"
+msgid "Acer Laptop"
+msgstr "Portátil Acer"
#: ../rules/base.xml.in.h:157
-msgid "Compaq Easy Access Keyboard"
-msgstr "Compaq Easy Access Keyboard"
+msgid "Asus Laptop"
+msgstr "Portátil Asus"
#: ../rules/base.xml.in.h:158
-msgid "Compaq Internet Keyboard (13 keys)"
-msgstr "Compaq Internet Keyboard (13 teclas)"
+msgid "Apple"
+msgstr "Apple"
#: ../rules/base.xml.in.h:159
-msgid "Compaq Internet Keyboard (18 keys)"
-msgstr "Compaq Internet Keyboard (18 teclas)"
+msgid "Apple Laptop"
+msgstr "Portátil Apple"
#: ../rules/base.xml.in.h:160
-msgid "Compaq Internet Keyboard (7 keys)"
-msgstr "Compaq Internet Keyboard (7 teclas)"
+msgid "Apple Aluminium Keyboard (ANSI)"
+msgstr "Teclado de aluminio de Apple (ANSI)"
#: ../rules/base.xml.in.h:161
-msgid "Compaq iPaq Keyboard"
-msgstr "Compaq iPaq Keyboard"
+msgid "Apple Aluminium Keyboard (ISO)"
+msgstr "Teclado de aluminio de Apple (ISO)"
#: ../rules/base.xml.in.h:162
-msgid "Compose key position"
-msgstr "Posición de la tecla Componer"
+msgid "Apple Aluminium Keyboard (JIS)"
+msgstr "Teclado de aluminio de Apple (JIS)"
#: ../rules/base.xml.in.h:163
-msgid "Control + Alt + Backspace"
-msgstr "Control + Alt + Retroceso"
+msgid "SILVERCREST Multimedia Wireless Keyboard"
+msgstr "SILVERCREST Multimedia Wireless Keyboard"
#: ../rules/base.xml.in.h:164
-msgid "Control is mapped to Alt keys, Alt is mapped to Win keys"
-msgstr "Control está mapeada a las teclas Alt, Alt está mapeado a las teclas Windows"
+msgid "Laptop/notebook eMachines m68xx"
+msgstr "Laptop/notebook eMachines m68xx"
#: ../rules/base.xml.in.h:165
-msgid "Control is mapped to Win keys (and the usual Ctrl keys)"
-msgstr "Control está mapeada a las teclas Windows (y las teclas Ctrl usuales)"
+msgid "BenQ X-Touch"
+msgstr "BenQ X-Touch"
#: ../rules/base.xml.in.h:166
-msgid "Creative Desktop Wireless 7000"
-msgstr "Creative Desktop Wireless 7000"
+msgid "BenQ X-Touch 730"
+msgstr "BenQ X-Touch 730"
#: ../rules/base.xml.in.h:167
-msgid "Crimean Tatar (Turkish Alt-Q)"
-msgstr "Tártaro de Crimea (turco Alt-Q)"
+msgid "BenQ X-Touch 800"
+msgstr "BenQ X-Touch 800"
#: ../rules/base.xml.in.h:168
-msgid "Crimean Tatar (Turkish F)"
-msgstr "Tártaro de Crimea (F turca)"
+msgid "Happy Hacking Keyboard"
+msgstr "Happy Hacking Keyboard"
#: ../rules/base.xml.in.h:169
-msgid "Crimean Tatar (Turkish Q)"
-msgstr "Tártaro de Crimea (Q turca)"
+msgid "Classmate PC"
+msgstr "Classmate PC"
#: ../rules/base.xml.in.h:170
-msgid "Croatian"
-msgstr "Croata"
+msgid "OLPC"
+msgstr "OLPC"
#: ../rules/base.xml.in.h:171
-msgid "Croatian (US keyboard with Croatian digraphs)"
-msgstr "Croata (teclado de EE. UU. con dígrafos croatas)"
+msgid "Sun Type 7 USB"
+msgstr "Sun tipo 7 USB"
#: ../rules/base.xml.in.h:172
-msgid "Croatian (US keyboard with Croatian letters)"
-msgstr "Croata (teclado de EE. UU. con letras croatas)"
+msgid "Sun Type 7 USB (European layout)"
+msgstr "Sun tipo 7 USB (Distribución Europea)"
#: ../rules/base.xml.in.h:173
-msgid "Croatian (use Croatian digraphs)"
-msgstr "Croata (usar dígrafos croatas)"
+msgid "Sun Type 7 USB (Unix layout)"
+msgstr "Sun tipo 7 USB (Distribución Unix)"
#: ../rules/base.xml.in.h:174
-msgid "Croatian (use guillemets for quotes)"
-msgstr "Croata (usar guillemots para comillas)"
+msgid "Sun Type 7 USB (Japanese layout) / Japanese 106-key"
+msgstr "Sun tipo 7 USB (Distribución Japonesa) / Japonesa 106 teclas"
#: ../rules/base.xml.in.h:175
-msgid "Ctrl key position"
-msgstr "Posición de la tecla Ctrl"
+msgid "Sun Type 6/7 USB"
+msgstr "Sun tipo 6/7 USB"
#: ../rules/base.xml.in.h:176
-msgid "Ctrl+Shift"
-msgstr "Ctrl+Mayús"
+msgid "Sun Type 6/7 USB (European layout)"
+msgstr "Sun tipo 6/7 USB (Distribución Europea)"
#: ../rules/base.xml.in.h:177
-msgid "Czech"
-msgstr "Checo"
+msgid "Sun Type 6 USB (Unix layout)"
+msgstr "Sun tipo 6 USB (Distribución Unix)"
#: ../rules/base.xml.in.h:178
-msgid "Czech (UCW layout, accented letters only)"
-msgstr "Checo (distribución UCW, sólo teclas con tilde)"
+msgid "Sun Type 6 USB (Japanese layout)"
+msgstr "Sun tipo 6 USB (Distribución Japonesa)"
#: ../rules/base.xml.in.h:179
-msgid "Czech (US Dvorak with CZ UCW support)"
-msgstr "Checo (teclado Dvorak EE. UU. con soporte para UCW checo)"
+msgid "Sun Type 6 (Japanese layout)"
+msgstr "Sun tipo 6 (Distribución Japonesa)"
#: ../rules/base.xml.in.h:180
-msgid "Czech (qwerty)"
-msgstr "Checo (qwery)"
+msgid "Targa Visionary 811"
+msgstr "Targa Visionary 811"
#: ../rules/base.xml.in.h:181
-msgid "Czech (qwerty, extended Backslash)"
-msgstr "Checo (qwerty, contrabarra extendida)"
+msgid "Unitek KB-1925"
+msgstr "Unitek KB-1925"
#: ../rules/base.xml.in.h:182
-msgid "Czech (with &lt;\\|&gt; key)"
-msgstr "Checo (con tecla «\\|»)"
+msgid "FL90"
+msgstr "FL90"
#: ../rules/base.xml.in.h:183
-msgid "DTK2000"
-msgstr "DTK2000"
+msgid "Creative Desktop Wireless 7000"
+msgstr "Creative Desktop Wireless 7000"
#: ../rules/base.xml.in.h:184
-msgid "Danish"
-msgstr "Danés"
-
-#: ../rules/base.xml.in.h:185
-msgid "Danish (Dvorak)"
-msgstr "Danés (Dvorak)"
-
-#: ../rules/base.xml.in.h:186
-msgid "Danish (Macintosh)"
-msgstr "Danés (Macintosh)"
+msgid "Htc Dream phone"
+msgstr "Teléfono HTC Dream"
-#: ../rules/base.xml.in.h:187
-msgid "Danish (Macintosh, eliminate dead keys)"
-msgstr "Danés (Macintosh, eliminar teclas muertas)"
+#. Keyboard indicator for English layouts
+#: ../rules/base.xml.in.h:186 ../rules/base.extras.xml.in.h:33
+msgid "en"
+msgstr "en"
-#: ../rules/base.xml.in.h:188
-msgid "Danish (eliminate dead keys)"
-msgstr "Danés (eliminar teclas muertas)"
+#: ../rules/base.xml.in.h:187 ../rules/base.extras.xml.in.h:34
+msgid "English (US)"
+msgstr "Inglés (EE. UU.)"
+#. Keyboard indicator for Cherokee layouts
#: ../rules/base.xml.in.h:189
-msgid "Default numeric keypad keys"
-msgstr "Teclas del teclado numérico predeterminado"
+msgid "chr"
+msgstr "chr"
#: ../rules/base.xml.in.h:190
-msgid "Dell"
-msgstr "Dell"
+msgid "Cherokee"
+msgstr "Cherokee"
#: ../rules/base.xml.in.h:191
-msgid "Dell 101-key PC"
-msgstr "Dell PC 101 teclas"
+msgid "English (US, with euro on 5)"
+msgstr "Inglés (EE. UU. con euro en el 5)"
#: ../rules/base.xml.in.h:192
-msgid "Dell Laptop/notebook Inspiron 6xxx/8xxx"
-msgstr "Dell Laptop/notebook Inspiron 6xxx/8xxx"
+msgid "English (US, international with dead keys)"
+msgstr "Inglés (EE. UU. internacional con teclas muertas)"
#: ../rules/base.xml.in.h:193
-msgid "Dell Laptop/notebook Precision M series"
-msgstr "Dell Laptop/notebook Precision M series"
+msgid "English (US, alternative international)"
+msgstr "Inglés (EE. UU. alternativo internacional)"
#: ../rules/base.xml.in.h:194
-msgid "Dell Latitude series laptop"
-msgstr "Portátil Dell Latitude"
+msgid "English (Colemak)"
+msgstr "Inglés (Colemak)"
#: ../rules/base.xml.in.h:195
-msgid "Dell Precision M65"
-msgstr "Dell Precision M65"
+msgid "English (Dvorak)"
+msgstr "Inglés (Dvorak)"
#: ../rules/base.xml.in.h:196
-msgid "Dell SK-8125"
-msgstr "Dell SK-8125"
+msgid "English (Dvorak, international with dead keys)"
+msgstr "Inglés (Dvorak, internacional con teclas muertas)"
#: ../rules/base.xml.in.h:197
-msgid "Dell SK-8135"
-msgstr "Dell SK-8135"
+msgid "English (Dvorak alternative international no dead keys)"
+msgstr "Inglés (alternativo Dvorak internacional sin teclas muertas)"
#: ../rules/base.xml.in.h:198
-msgid "Dell USB Multimedia Keyboard"
-msgstr "Dell USB Multimedia Keyboard"
+msgid "English (left handed Dvorak)"
+msgstr "Inglés (Dvorak para zurdos)"
#: ../rules/base.xml.in.h:199
-msgid "Dexxa Wireless Desktop Keyboard"
-msgstr "Dexxa Wireless Desktop Keyboard"
+msgid "English (right handed Dvorak)"
+msgstr "Inglés (Dvorak para diestros)"
#: ../rules/base.xml.in.h:200
-msgid "Dhivehi"
-msgstr "Dhivehi"
+msgid "English (classic Dvorak)"
+msgstr "Inglés (Dvorak clásico)"
#: ../rules/base.xml.in.h:201
-msgid "Diamond 9801 / 9802 series"
-msgstr "Diamond 9801 / 9802 series"
-
-#: ../rules/base.xml.in.h:202
-msgid "Dutch"
-msgstr "Holandés"
+msgid "English (programmer Dvorak)"
+msgstr "Inglés (Dvorak de programador)"
-#: ../rules/base.xml.in.h:203
-msgid "Dutch (Macintosh)"
-msgstr "Holandés (Macintosh)"
+#. Keyboard indicator for Russian layouts
+#: ../rules/base.xml.in.h:203 ../rules/base.extras.xml.in.h:55
+msgid "ru"
+msgstr "ru"
#: ../rules/base.xml.in.h:204
-msgid "Dutch (Sun dead keys)"
-msgstr "Holandés (teclas muertas de Sun)"
+msgid "Russian (US, phonetic)"
+msgstr "Ruso (EE. UU., fonético)"
#: ../rules/base.xml.in.h:205
-msgid "Dutch (standard)"
-msgstr "Holandés (estándar)"
+msgid "English (Macintosh)"
+msgstr "Inglés (Macintosh)"
#: ../rules/base.xml.in.h:206
-msgid "Dzongkha"
-msgstr "Dzongkha"
+msgid "English (international AltGr dead keys)"
+msgstr "Inglés (internacional con teclas muertas por AltGr)"
#: ../rules/base.xml.in.h:207
-msgid "Enable extra typographic characters"
-msgstr "Activar caracteres tipográficos adicionales"
+msgid "English (the divide/multiply keys toggle the layout)"
+msgstr "Inglés (las teclas dividir/multiplicar cambian la distribución)"
#: ../rules/base.xml.in.h:208
-msgid "English (Cameroon Dvorak)"
-msgstr "Inglés (Dvorak de Camerún)"
+msgid "Serbo-Croatian (US)"
+msgstr "Serbocroata (EE. UU.)"
#: ../rules/base.xml.in.h:209
-msgid "English (Cameroon)"
-msgstr "Inglés (Camerún)"
+msgid "English (Workman)"
+msgstr "Inglés (Workman)"
#: ../rules/base.xml.in.h:210
-msgid "English (Canada)"
-msgstr "Inglés (Canadá)"
-
-#: ../rules/base.xml.in.h:211
-msgid "English (Colemak)"
-msgstr "Inglés (Colemark)"
+msgid "English (Workman, international with dead keys)"
+msgstr "Inglés (Workman, internacional con teclas muertas)"
-#: ../rules/base.xml.in.h:212
-msgid "English (Dvorak alternative international no dead keys)"
-msgstr "Inglés (alternativa Dvorak internacional sin teclas muertas)"
+#. Keyboard indicator for Persian layouts
+#: ../rules/base.xml.in.h:212 ../rules/base.extras.xml.in.h:15
+msgid "fa"
+msgstr "fa"
#: ../rules/base.xml.in.h:213
-msgid "English (Dvorak international with dead keys)"
-msgstr "Inglés (Dvorak internacional con teclas muertas)"
-
-#: ../rules/base.xml.in.h:214
-msgid "English (Dvorak)"
-msgstr "Inglés (Dvorak)"
+msgid "Afghani"
+msgstr "Afgano"
+#. Keyboard indicator for Pashto layouts
#: ../rules/base.xml.in.h:215
-msgid "English (Ghana)"
-msgstr "Inglés (Ghana)"
+msgid "ps"
+msgstr "ps"
#: ../rules/base.xml.in.h:216
-msgid "English (Ghana, GILLBT)"
-msgstr "Inglés (Ghana, GILLBT)"
-
-#: ../rules/base.xml.in.h:217
-msgid "English (Ghana, multilingual)"
-msgstr "Inglés (Ghana, multilingue)"
+msgid "Pashto"
+msgstr "Pashto"
+#. Keyboard indicator for Uzbek layouts
#: ../rules/base.xml.in.h:218
-msgid "English (India, with RupeeSign)"
-msgstr "Inglés (India, con signo de rupia)"
+msgid "uz"
+msgstr "uz"
#: ../rules/base.xml.in.h:219
-msgid "English (Macintosh)"
-msgstr "Inglés (Macintosh)"
+msgid "Uzbek (Afghanistan)"
+msgstr "Uzbeco (Afganistán)"
#: ../rules/base.xml.in.h:220
-msgid "English (Mali, US Macintosh)"
-msgstr "Inglés (Malí, Macintosh de EE. UU.)"
+msgid "Pashto (Afghanistan, OLPC)"
+msgstr "Pashto (Afganistán, OLPC)"
#: ../rules/base.xml.in.h:221
-msgid "English (Mali, US international)"
-msgstr "Inglés (Malí, EE. UU. internacional)"
+msgid "Persian (Afghanistan, Dari OLPC)"
+msgstr "Persa (Afganistán, OLPC dari)"
#: ../rules/base.xml.in.h:222
-msgid "English (Nigeria)"
-msgstr "Inglés (Nigeria)"
-
-#: ../rules/base.xml.in.h:223
-msgid "English (South Africa)"
-msgstr "Inglés (Sudáfrica)"
+msgid "Uzbek (Afghanistan, OLPC)"
+msgstr "Uzbeco (Afganistán, OLPC)"
-#: ../rules/base.xml.in.h:224
-msgid "English (UK)"
-msgstr "Inglés (RU)"
+#. Keyboard indicator for Arabic layouts
+#: ../rules/base.xml.in.h:224 ../rules/base.extras.xml.in.h:65
+msgid "ar"
+msgstr "ar"
-#: ../rules/base.xml.in.h:225
-msgid "English (UK, Colemak)"
-msgstr "Inglés (RU, Colemark)"
+#: ../rules/base.xml.in.h:225 ../rules/base.extras.xml.in.h:66
+msgid "Arabic"
+msgstr "Árabe"
#: ../rules/base.xml.in.h:226
-msgid "English (UK, Dvorak with UK punctuation)"
-msgstr "Inglés (RU, Dvorak con puntuación para RU)"
+msgid "Arabic (azerty)"
+msgstr "Árabe (azerty)"
#: ../rules/base.xml.in.h:227
-msgid "English (UK, Dvorak)"
-msgstr "Inglés (RU, Dvorak)"
+msgid "Arabic (azerty/digits)"
+msgstr "Árabe (azerty/dígitos)"
#: ../rules/base.xml.in.h:228
-msgid "English (UK, Macintosh international)"
-msgstr "Inglés (RU, Macintosh internacional)"
+msgid "Arabic (digits)"
+msgstr "Árabe (dígitos)"
#: ../rules/base.xml.in.h:229
-msgid "English (UK, Macintosh)"
-msgstr "Inglés (RU, Macintosh)"
+msgid "Arabic (qwerty)"
+msgstr "Árabe (qwery)"
#: ../rules/base.xml.in.h:230
-msgid "English (UK, extended WinKeys)"
-msgstr "Inglés (RU, extendido con teclas Windows)"
+msgid "Arabic (qwerty/digits)"
+msgstr "Árabe (qwerty/dígitos)"
#: ../rules/base.xml.in.h:231
-msgid "English (UK, international with dead keys)"
-msgstr "Inglés (RU, internacional con teclas muertas)"
-
-#: ../rules/base.xml.in.h:232 ../rules/base.extras.xml.in.h:8
-msgid "English (US)"
-msgstr "Inglés (EE. UU.)"
+msgid "Arabic (Buckwalter)"
+msgstr "Árabe (Buckwalter)"
+#. Keyboard indicator for Albanian layouts
#: ../rules/base.xml.in.h:233
-msgid "English (US, alternative international)"
-msgstr "Inglés (EE. UU. alternativa internacional)"
+msgid "sq"
+msgstr "sq"
#: ../rules/base.xml.in.h:234
-msgid "English (US, international with dead keys)"
-msgstr "Inglés (EE. UU. internacional con teclas muertas)"
-
-#: ../rules/base.xml.in.h:235
-msgid "English (US, with euro on 5)"
-msgstr "Inglés (EE. UU. con euro en el 5)"
+msgid "Albanian"
+msgstr "Albanés"
-#: ../rules/base.xml.in.h:236
-msgid "English (classic Dvorak)"
-msgstr "Inglés (Dvorak clásico)"
+#. Keyboard indicator for Armenian layouts
+#: ../rules/base.xml.in.h:236 ../rules/base.extras.xml.in.h:59
+msgid "hy"
+msgstr "hy"
-#: ../rules/base.xml.in.h:237
-msgid "English (international AltGr dead keys)"
-msgstr "Inglés (internacional con teclas muertas Alt Gr)"
+#: ../rules/base.xml.in.h:237 ../rules/base.extras.xml.in.h:60
+msgid "Armenian"
+msgstr "Armenio"
#: ../rules/base.xml.in.h:238
-msgid "English (layout toggle on multiply/divide key)"
-msgstr "Inglés (cambio de distribución en la tecla multiplicar/dividir)"
+msgid "Armenian (phonetic)"
+msgstr "Armenio (fonético)"
#: ../rules/base.xml.in.h:239
-msgid "English (left handed Dvorak)"
-msgstr "Inglés (Dvorak para zurdos)"
+msgid "Armenian (alternative phonetic)"
+msgstr "Armenio (alternativo fonético)"
#: ../rules/base.xml.in.h:240
-msgid "English (programmer Dvorak)"
-msgstr "Inglés (Dvorak de programador)"
+msgid "Armenian (eastern)"
+msgstr "Armenio (oriental)"
#: ../rules/base.xml.in.h:241
-msgid "English (right handed Dvorak)"
-msgstr "Inglés (Dvorak para diestros)"
+msgid "Armenian (western)"
+msgstr "Armenio (occidental)"
#: ../rules/base.xml.in.h:242
-msgid "Ennyah DKB-1008"
-msgstr "Ennyah DKB-1008"
-
-#: ../rules/base.xml.in.h:243
-msgid "Enter on keypad"
-msgstr "Intro en el teclado numérico"
+msgid "Armenian (alternative eastern)"
+msgstr "Armenio (alternativo oriental)"
-#: ../rules/base.xml.in.h:244
-msgid "Esperanto"
-msgstr "Esperanto"
+#. Keyboard indicator for German layouts
+#: ../rules/base.xml.in.h:244 ../rules/base.extras.xml.in.h:10
+msgid "de"
+msgstr "de"
#: ../rules/base.xml.in.h:245
-msgid "Esperanto (Portugal, Nativo)"
-msgstr "Esperanto (Portugal, Nativo)"
+msgid "German (Austria)"
+msgstr "Alemán (Austria)"
#: ../rules/base.xml.in.h:246
-msgid "Esperanto (displaced semicolon and quote, obsolete)"
-msgstr "Estonio (punto y coma y comilla desplazadas, obsoleto)"
+msgid "German (Austria, eliminate dead keys)"
+msgstr "Alemán (Austria, eliminar teclas muertas)"
#: ../rules/base.xml.in.h:247
-msgid "Estonian"
-msgstr "Estonio"
+msgid "German (Austria, Sun dead keys)"
+msgstr "Alemán (Austria, teclas muertas de Sun)"
#: ../rules/base.xml.in.h:248
-msgid "Estonian (Dvorak)"
-msgstr "Estonio (Dvorak)"
-
-#: ../rules/base.xml.in.h:249
-msgid "Estonian (US keyboard with Estonian letters)"
-msgstr "Estonio (teclado EE. UU. con letras estonias)"
+msgid "German (Austria, Macintosh)"
+msgstr "Alemán (Austria, Macintosh)"
+#. Keyboard indicator for Azerbaijani layouts
#: ../rules/base.xml.in.h:250
-msgid "Estonian (eliminate dead keys)"
-msgstr "Estonio (eliminar teclas muertas)"
+msgid "az"
+msgstr "az"
#: ../rules/base.xml.in.h:251
-msgid "Euro on 2"
-msgstr "Euro en el 2"
+msgid "Azerbaijani"
+msgstr "Azerbaijaní"
#: ../rules/base.xml.in.h:252
-msgid "Euro on 4"
-msgstr "Euro en el 4"
-
-#: ../rules/base.xml.in.h:253
-msgid "Euro on 5"
-msgstr "Euro en el 5"
+msgid "Azerbaijani (Cyrillic)"
+msgstr "Azerbajaní (cirílico)"
+#. Keyboard indicator for Belarusian layouts
#: ../rules/base.xml.in.h:254
-msgid "Euro on E"
-msgstr "Euro en la E"
+msgid "by"
+msgstr "by"
#: ../rules/base.xml.in.h:255
-msgid "Everex STEPnote"
-msgstr "Everex STEPnote"
+msgid "Belarusian"
+msgstr "Bielorruso"
#: ../rules/base.xml.in.h:256
-msgid "Ewe"
-msgstr "Ewe"
+msgid "Belarusian (legacy)"
+msgstr "Bielorruso (arcaico)"
#: ../rules/base.xml.in.h:257
-msgid "FL90"
-msgstr "FL90"
-
-#: ../rules/base.xml.in.h:258
-msgid "Faroese"
-msgstr "Faroés"
+msgid "Belarusian (Latin)"
+msgstr "Bielorruso (latino)"
-#: ../rules/base.xml.in.h:259
-msgid "Faroese (eliminate dead keys)"
-msgstr "Faroés (eliminar teclas muertas)"
+#. Keyboard indicator for Belgian layouts
+#: ../rules/base.xml.in.h:259 ../rules/base.extras.xml.in.h:68
+msgid "be"
+msgstr "be"
-#: ../rules/base.xml.in.h:260
-msgid "Filipino"
-msgstr "Filipino"
+#: ../rules/base.xml.in.h:260 ../rules/base.extras.xml.in.h:69
+msgid "Belgian"
+msgstr "Belga"
#: ../rules/base.xml.in.h:261
-msgid "Filipino (Capewell-Dvorak Baybayin)"
-msgstr "Filipino (Capewell-Dvorak baybayin)"
+msgid "Belgian (alternative)"
+msgstr "Belga (alternativo)"
#: ../rules/base.xml.in.h:262
-msgid "Filipino (Capewell-Dvorak Latin)"
-msgstr "Filipino (Capewell-Dvorak latino)"
+msgid "Belgian (alternative, Latin-9 only)"
+msgstr "Belga (alternativo, sólo latin-9)"
#: ../rules/base.xml.in.h:263
-msgid "Filipino (Capewell-QWERF 2006 Baybayin)"
-msgstr "Filipino (Capewell-QWERF 2006 baybayin)"
+msgid "Belgian (alternative, Sun dead keys)"
+msgstr "Belga (alternativo, teclas muertas de Sun)"
#: ../rules/base.xml.in.h:264
-msgid "Filipino (Capewell-QWERF 2006 Latin)"
-msgstr "Filipino (Capewell-QWERF 2006 latino)"
+msgid "Belgian (ISO alternate)"
+msgstr "Belga (alternativo ISO)"
#: ../rules/base.xml.in.h:265
-msgid "Filipino (Colemak Baybayin)"
-msgstr "Filipino (Colemak baybayin)"
+msgid "Belgian (eliminate dead keys)"
+msgstr "Belga (eliminar teclas muertas)"
#: ../rules/base.xml.in.h:266
-msgid "Filipino (Colemak Latin)"
-msgstr "Filipino (Colemak latino)"
+msgid "Belgian (Sun dead keys)"
+msgstr "Belga (teclas muertas de Sun)"
#: ../rules/base.xml.in.h:267
-msgid "Filipino (Dvorak Baybayin)"
-msgstr "Filipino (Dvorak baybayin)"
-
-#: ../rules/base.xml.in.h:268
-msgid "Filipino (Dvorak Latin)"
-msgstr "Filipino (Dvorak latino)"
+msgid "Belgian (Wang model 724 azerty)"
+msgstr "Belga (modelo azerty 724 de Wang)"
+#. Keyboard indicator for Bangla layouts
#: ../rules/base.xml.in.h:269
-msgid "Filipino (QWERTY Baybayin)"
-msgstr "Filipino (QWERTY baybayin)"
+msgid "bn"
+msgstr "bn"
#: ../rules/base.xml.in.h:270
-msgid "Finnish"
-msgstr "Finlandés"
+msgid "Bangla"
+msgstr "Bangladesh"
#: ../rules/base.xml.in.h:271
-msgid "Finnish (Macintosh)"
-msgstr "Finlandés (Macintosh)"
-
-#: ../rules/base.xml.in.h:272
-msgid "Finnish (classic)"
-msgstr "Finlandés (clásico)"
+msgid "Bangla (Probhat)"
+msgstr "Bengalí (Probhat)"
+#. Keyboard indicator for Indian layouts
#: ../rules/base.xml.in.h:273
-msgid "Finnish (classic, eliminate dead keys)"
-msgstr "Finlandés (clásico, eliminar teclas muertas)"
+msgid "in"
+msgstr "in"
+
+#: ../rules/base.xml.in.h:274
+msgid "Indian"
+msgstr "Indio"
+
+#: ../rules/base.xml.in.h:275
+msgid "Bangla (India)"
+msgstr "Bengalí (India)"
-#. This assumes the KP_ abstract symbols are actually useful for some apps
-#. The description needs to be rewritten
#: ../rules/base.xml.in.h:276
-msgid "Four-level key with abstract separators"
-msgstr "Tecla de cuarto nivel con separadores abstractos"
+msgid "Bangla (India, Probhat)"
+msgstr "Bengalí (India, Probhat)"
#: ../rules/base.xml.in.h:277
-msgid "Four-level key with comma"
-msgstr "Tecla de cuarto nivel con coma"
+msgid "Bangla (India, Baishakhi)"
+msgstr "Bengalí (India, Baishakhi)"
#: ../rules/base.xml.in.h:278
-msgid "Four-level key with dot"
-msgstr "Tecla de cuarto nivel con punto"
+msgid "Bangla (India, Bornona)"
+msgstr "Bengalí (India, Bornona)"
#: ../rules/base.xml.in.h:279
-msgid "Four-level key with dot, latin-9 restriction"
-msgstr "Tecla de cuarto nivel con punto, restricción latin-9"
+msgid "Bangla (India, Uni Gitanjali)"
+msgstr "Bengalí (India, Uni Gitanjali)"
#: ../rules/base.xml.in.h:280
-msgid "Four-level key with momayyez"
-msgstr "Tecla de cuarto nivel con momayyez"
-
-#: ../rules/base.xml.in.h:281
-msgid "French"
-msgstr "Francés"
+msgid "Bangla (India, Baishakhi Inscript)"
+msgstr "Bengalí (India, Inscript Baishakhi)"
+#. Keyboard indicator for Gujarati layouts
#: ../rules/base.xml.in.h:282
-msgid "French (Bepo, ergonomic, Dvorak way)"
-msgstr "Francés (bepo, ergonómico, forma Dvorak)"
+msgid "gu"
+msgstr "gu"
#: ../rules/base.xml.in.h:283
-msgid "French (Bepo, ergonomic, Dvorak way, latin-9 only)"
-msgstr "Francés (bepo, ergonómico, forma Dvorak, sólo latin-9)"
-
-#: ../rules/base.xml.in.h:284
-msgid "French (Breton)"
-msgstr "Francés (bretón)"
+msgid "Gujarati"
+msgstr "Gujarati"
+#. Keyboard indicator for Punjabi layouts
#: ../rules/base.xml.in.h:285
-msgid "French (Cameroon)"
-msgstr "Francés (Camerún)"
+msgid "pa"
+msgstr "pa"
-#: ../rules/base.xml.in.h:286 ../rules/base.extras.xml.in.h:11
-msgid "French (Canada)"
-msgstr "Francés (Canadá)"
+#: ../rules/base.xml.in.h:286
+msgid "Punjabi (Gurmukhi)"
+msgstr "Panyabí (gurmukhi)"
#: ../rules/base.xml.in.h:287
-msgid "French (Canada, Dvorak)"
-msgstr "Francés (Canadá, Dvorak)"
-
-#: ../rules/base.xml.in.h:288
-msgid "French (Canada, legacy)"
-msgstr "Francés (Canadá, heredado)"
+msgid "Punjabi (Gurmukhi Jhelum)"
+msgstr "Panyabí (gurmukhi jhelum)"
+#. Keyboard indicator for Kannada layouts
#: ../rules/base.xml.in.h:289
-msgid "French (Democratic Republic of the Congo)"
-msgstr "Francés (República Democrática del Congo)"
+msgid "kn"
+msgstr "kn"
#: ../rules/base.xml.in.h:290
-msgid "French (Dvorak)"
-msgstr "Francés (Dvorak)"
+msgid "Kannada"
+msgstr "Kannada"
#: ../rules/base.xml.in.h:291
-msgid "French (Guinea)"
-msgstr "Francés (Guinea)"
-
-#: ../rules/base.xml.in.h:292
-msgid "French (Macintosh)"
-msgstr "Francés (Macintosh)"
+msgid "Kannada (KaGaPa phonetic)"
+msgstr "Canarés (fonético KaGaPa)"
+#. Keyboard indicator for Malayalam layouts
#: ../rules/base.xml.in.h:293
-msgid "French (Mali, alternative)"
-msgstr "Francés (Malí, alternativa)"
+msgid "ml"
+msgstr "ml"
#: ../rules/base.xml.in.h:294
-msgid "French (Morocco)"
-msgstr "Francés (Marruecos)"
+msgid "Malayalam"
+msgstr "Malayalam"
#: ../rules/base.xml.in.h:295
-msgid "French (Sun dead keys)"
-msgstr "Francés (teclas muertas de Sun)"
+msgid "Malayalam (Lalitha)"
+msgstr "Malayalam (lalitha)"
#: ../rules/base.xml.in.h:296
-msgid "French (Switzerland)"
-msgstr "Francés (Suiza)"
-
-#: ../rules/base.xml.in.h:297
-msgid "French (Switzerland, Macintosh)"
-msgstr "Francés (Suiza, Macintosh)"
+msgid "Malayalam (enhanced Inscript with Rupee Sign)"
+msgstr "Malayam (Inscript mejorado con signo de rupia)"
+#. Keyboard indicator for Oriya layouts
#: ../rules/base.xml.in.h:298
-msgid "French (Switzerland, Sun dead keys)"
-msgstr "Francés (Suiza, teclas muertas de Sun)"
+msgid "or"
+msgstr "or"
#: ../rules/base.xml.in.h:299
-msgid "French (Switzerland, eliminate dead keys)"
-msgstr "Francés (Suiza, eliminar teclas muertas)"
-
-#: ../rules/base.xml.in.h:300
-msgid "French (alternative)"
-msgstr "Francés (alternativa)"
+msgid "Oriya"
+msgstr "Oriya"
+#. Keyboard indicator for Tamil layouts
#: ../rules/base.xml.in.h:301
-msgid "French (alternative, Sun dead keys)"
-msgstr "Francés (alternativa, teclas muertas de Sun)"
+msgid "ta"
+msgstr "ta"
#: ../rules/base.xml.in.h:302
-msgid "French (alternative, eliminate dead keys)"
-msgstr "Francés (alternativa, eliminar teclas muertas)"
+msgid "Tamil (Unicode)"
+msgstr "Tamil (Unicode)"
#: ../rules/base.xml.in.h:303
-msgid "French (alternative, latin-9 only)"
-msgstr "Francés (alternativa, sólo latin-9)"
+msgid "Tamil (keyboard with numerals)"
+msgstr "Tamil (teclado con números)"
#: ../rules/base.xml.in.h:304
-msgid "French (eliminate dead keys)"
-msgstr "Francés (eliminar teclas muertas)"
+msgid "Tamil (TAB typewriter)"
+msgstr "Tamil (máquina de escribir TAB)"
#: ../rules/base.xml.in.h:305
-msgid "French (legacy, alternative)"
-msgstr "Francés (heredado, alternativa)"
+msgid "Tamil (TSCII typewriter)"
+msgstr "Tamil (máquina de escribir TSCII)"
#: ../rules/base.xml.in.h:306
-msgid "French (legacy, alternative, Sun dead keys)"
-msgstr "Francés (heredado, alternativa, teclas muertas de Sun)"
-
-#: ../rules/base.xml.in.h:307
-msgid "French (legacy, alternative, eliminate dead keys)"
-msgstr "Francés (heredado, alternativa, eliminar teclas muertas)"
+msgid "Tamil"
+msgstr "Tamil"
+#. Keyboard indicator for Telugu layouts
#: ../rules/base.xml.in.h:308
-msgid "Fujitsu-Siemens Computers AMILO laptop"
-msgstr "Portátil Fujitsu-Siemens Computers AMILO"
+msgid "te"
+msgstr "te"
#: ../rules/base.xml.in.h:309
-msgid "Fula"
-msgstr "Fula"
+msgid "Telugu"
+msgstr "Telugu"
#: ../rules/base.xml.in.h:310
-msgid "Ga"
-msgstr "Ga"
-
-#: ../rules/base.xml.in.h:311
-msgid "Generic 101-key PC"
-msgstr "PC genérico 101 teclas"
+msgid "Telugu (KaGaPa phonetic)"
+msgstr "Telugu (fonético KaPaGa)"
+#. Keyboard indicator for Urdu layouts
#: ../rules/base.xml.in.h:312
-msgid "Generic 102-key (Intl) PC"
-msgstr "PC genérico 102 teclas (intl)"
+msgid "ur"
+msgstr "ur"
#: ../rules/base.xml.in.h:313
-msgid "Generic 104-key PC"
-msgstr "PC genérico 104 teclas"
+msgid "Urdu (phonetic)"
+msgstr "Urdu (fonético)"
#: ../rules/base.xml.in.h:314
-msgid "Generic 105-key (Intl) PC"
-msgstr "PC genérico 105 teclas (intl)"
+msgid "Urdu (alternative phonetic)"
+msgstr "Urdu (fonético alternativo)"
#: ../rules/base.xml.in.h:315
-msgid "Genius Comfy KB-12e"
-msgstr "Genius Comfy KB-12e"
-
-#: ../rules/base.xml.in.h:316
-msgid "Genius Comfy KB-16M / Genius MM Keyboard KWD-910"
-msgstr "Genius Comfy KB-16M / Genius MM Keyboard KWD-910"
+msgid "Urdu (WinKeys)"
+msgstr "Urdu (teclas Windows)"
+#. Keyboard indicator for Hindi layouts
#: ../rules/base.xml.in.h:317
-msgid "Genius Comfy KB-21e-Scroll"
-msgstr "Genius Comfy KB-21e-Scroll"
+msgid "hi"
+msgstr "hi"
#: ../rules/base.xml.in.h:318
-msgid "Genius KB-19e NB"
-msgstr "Genius KB-19e NB"
+msgid "Hindi (Bolnagri)"
+msgstr "Hindi (bolnagri)"
#: ../rules/base.xml.in.h:319
-msgid "Genius KKB-2050HS"
-msgstr "Genius KKB-2050HS"
+msgid "Hindi (Wx)"
+msgstr "Hindi (Wx)"
#: ../rules/base.xml.in.h:320
-msgid "Georgian"
-msgstr "Georgiano"
-
-#: ../rules/base.xml.in.h:321
-msgid "Georgian (France, AZERTY Tskapo)"
-msgstr "Georgiano (Francia, AZERTY tskapo)"
+msgid "Hindi (KaGaPa phonetic)"
+msgstr "Hindi (fonético KaGaPa)"
+#. Keyboard indicator for Sanskrit layouts
#: ../rules/base.xml.in.h:322
-msgid "Georgian (Italy)"
-msgstr "Georgiano (Italia)"
+msgid "sa"
+msgstr "sa"
#: ../rules/base.xml.in.h:323
-msgid "Georgian (MESS)"
-msgstr "Georgiano (MESS)"
+msgid "Sanskrit (KaGaPa phonetic)"
+msgstr "Sánscrito (fonético KaGaPa)"
-#: ../rules/base.xml.in.h:324
-msgid "Georgian (ergonomic)"
-msgstr "Georgiano (ergonómico)"
-
-#: ../rules/base.xml.in.h:325 ../rules/base.extras.xml.in.h:12
-msgid "German"
-msgstr "Alemán"
+#. Keyboard indicator for Marathi layouts
+#: ../rules/base.xml.in.h:325
+msgid "mr"
+msgstr "mr"
#: ../rules/base.xml.in.h:326
-msgid "German (Austria)"
-msgstr "Alemán (Austria)"
+msgid "Marathi (KaGaPa phonetic)"
+msgstr "Maratí (fonético KaGaPa)"
#: ../rules/base.xml.in.h:327
-msgid "German (Austria, Macintosh)"
-msgstr "Alemán (Austria, Macintosh)"
-
-#: ../rules/base.xml.in.h:328
-msgid "German (Austria, Sun dead keys)"
-msgstr "Alemán (Austria, teclas muertas de Sun)"
+msgid "English (India, with RupeeSign)"
+msgstr "Inglés (India, con signo de rupia)"
+#. Keyboard indicator for Bosnian layouts
#: ../rules/base.xml.in.h:329
-msgid "German (Austria, eliminate dead keys)"
-msgstr "Alemán (Austria, eliminar teclas muertas)"
+msgid "bs"
+msgstr "bs"
#: ../rules/base.xml.in.h:330
-msgid "German (Dvorak)"
-msgstr "Alemán (Dvorak)"
+msgid "Bosnian"
+msgstr "Bosnio"
#: ../rules/base.xml.in.h:331
-msgid "German (Macintosh)"
-msgstr "Alemán (Macintosh)"
+msgid "Bosnian (use guillemets for quotes)"
+msgstr "Bosnio (usar guillemots para comillas)"
#: ../rules/base.xml.in.h:332
-msgid "German (Macintosh, eliminate dead keys)"
-msgstr "Alemán (Macintosh, eliminar teclas muertas)"
+msgid "Bosnian (use Bosnian digraphs)"
+msgstr "Bosnio (usar dígrafos bosnios)"
#: ../rules/base.xml.in.h:333
-msgid "German (Neo 2)"
-msgstr "Alemán (Neo 2)"
+msgid "Bosnian (US keyboard with Bosnian digraphs)"
+msgstr "Bosnio (teclado de EE. UU. con dígrafos bosnios)"
#: ../rules/base.xml.in.h:334
-msgid "German (Sun dead keys)"
-msgstr "Alemán (teclas muertas de Sun)"
-
-#: ../rules/base.xml.in.h:335
-msgid "German (Switzerland)"
-msgstr "Alemán (Suiza)"
+msgid "Bosnian (US keyboard with Bosnian letters)"
+msgstr "Bosnio (teclado de EE. UU. con letras bosnias)"
-#: ../rules/base.xml.in.h:336
-msgid "German (Switzerland, Macintosh)"
-msgstr "Alemán (Suiza, Macintosh)"
+#. Keyboard indicator for Portuguese layouts
+#: ../rules/base.xml.in.h:336 ../rules/base.extras.xml.in.h:71
+msgid "pt"
+msgstr "pt"
-#: ../rules/base.xml.in.h:337
-msgid "German (Switzerland, Sun dead keys)"
-msgstr "Alemán (Suiza, teclas muertas de Sun)"
+#: ../rules/base.xml.in.h:337 ../rules/base.extras.xml.in.h:72
+msgid "Portuguese (Brazil)"
+msgstr "Portugués (Brasil)"
#: ../rules/base.xml.in.h:338
-msgid "German (Switzerland, eliminate dead keys)"
-msgstr "Alemán (Suiza, eliminar teclas muertas)"
+msgid "Portuguese (Brazil, eliminate dead keys)"
+msgstr "Portugués (Brasil, eliminar teclas muertas)"
#: ../rules/base.xml.in.h:339
-msgid "German (Switzerland, legacy)"
-msgstr "Alemán (Suiza, heredado)"
+msgid "Portuguese (Brazil, Dvorak)"
+msgstr "Portugués (Brasil, Dvorak)"
#: ../rules/base.xml.in.h:340
-msgid "German (dead acute)"
-msgstr "Alemán (acento muerto)"
+msgid "Portuguese (Brazil, Nativo)"
+msgstr "Portugués (Brasil, Nativo)"
#: ../rules/base.xml.in.h:341
-msgid "German (dead grave acute)"
-msgstr "Alemán (acento grave muerto)"
+msgid "Portuguese (Brazil, Nativo for US keyboards)"
+msgstr "Portugués (Brasil, Nativo para teclados de EE. UU.)"
#: ../rules/base.xml.in.h:342
-msgid "German (eliminate dead keys)"
-msgstr "Alemán (eliminar teclas muertas)"
-
-#: ../rules/base.xml.in.h:343
-msgid "Greek"
-msgstr "Griego"
+msgid "Esperanto (Brazil, Nativo)"
+msgstr "Esperanto (Brasil, Nativo)"
+#. Keyboard indicator for Bulgarian layouts
#: ../rules/base.xml.in.h:344
-msgid "Greek (eliminate dead keys)"
-msgstr "Griego (eliminar teclas muertas)"
+msgid "bg"
+msgstr "bg"
#: ../rules/base.xml.in.h:345
-msgid "Greek (extended)"
-msgstr "Griego (extendido)"
+msgid "Bulgarian"
+msgstr "Búlgaro"
#: ../rules/base.xml.in.h:346
-msgid "Greek (polytonic)"
-msgstr "Griego (politónico)"
+msgid "Bulgarian (traditional phonetic)"
+msgstr "Búlgaro (fonética tradicional)"
#: ../rules/base.xml.in.h:347
-msgid "Greek (simple)"
-msgstr "Griego (simple)"
+msgid "Bulgarian (new phonetic)"
+msgstr "Búlgaro (fonética nueva)"
#: ../rules/base.xml.in.h:348
-msgid "Gujarati"
-msgstr "Gujarati"
-
-#: ../rules/base.xml.in.h:349
-msgid "Gyration"
-msgstr "Gyration"
+msgid "Arabic (Morocco)"
+msgstr "Árabbe (Marruecos)"
-#: ../rules/base.xml.in.h:350
-msgid "HTC Dream"
-msgstr "HTC Dream"
+#. Keyboard indicator for French layouts
+#: ../rules/base.xml.in.h:350 ../rules/base.extras.xml.in.h:3
+msgid "fr"
+msgstr "fr"
#: ../rules/base.xml.in.h:351
-msgid "Happy Hacking Keyboard"
-msgstr "Happy Hacking Keyboard"
-
-#: ../rules/base.xml.in.h:352
-msgid "Happy Hacking Keyboard for Mac"
-msgstr "Happy Hacking Keyboard para Mac"
+msgid "French (Morocco)"
+msgstr "Francés (Marruecos)"
+#. Keyboard indicator for Berber layouts
#: ../rules/base.xml.in.h:353
-msgid "Hausa"
-msgstr "Hausa"
+msgid "ber"
+msgstr "ber"
#: ../rules/base.xml.in.h:354
-msgid "Hebrew"
-msgstr "Hebreo"
+msgid "Berber (Morocco, Tifinagh)"
+msgstr "Bereber (Marruecos, tifinagh)"
#: ../rules/base.xml.in.h:355
-msgid "Hebrew (Biblical, Tiro)"
-msgstr "Hebreo (bíblico, tiro)"
+msgid "Berber (Morocco, Tifinagh alternative)"
+msgstr "Bereber (Marruecos, alternativo tifinagh)"
#: ../rules/base.xml.in.h:356
-msgid "Hebrew (lyx)"
-msgstr "Hebreo (lyx)"
+msgid "Berber (Morocco, Tifinagh alternative phonetic)"
+msgstr "Bereber (Marruecos, alternativo fonético tifinagh)"
#: ../rules/base.xml.in.h:357
-msgid "Hebrew (phonetic)"
-msgstr "Hebreo (fonético)"
+msgid "Berber (Morocco, Tifinagh extended)"
+msgstr "Bereber (Marruecos, tifinagh extendido)"
#: ../rules/base.xml.in.h:358
-msgid "Hewlett-Packard Internet Keyboard"
-msgstr "Hewlett-Packard Internet Keyboard"
+msgid "Berber (Morocco, Tifinagh phonetic)"
+msgstr "Bereber (Marruecos, tifinagh fonético)"
#: ../rules/base.xml.in.h:359
-msgid "Hewlett-Packard Mini 110 Notebook"
-msgstr "Hewlett-Packard Mini 110 Notebook"
-
-#: ../rules/base.xml.in.h:360
-msgid "Hewlett-Packard Omnibook 500 FA"
-msgstr "Hewlett-Packard Omnibook 500 FA"
+msgid "Berber (Morocco, Tifinagh extended phonetic)"
+msgstr "Bereber (Marruecos, tifinagh fonético extendido)"
+#. Keyboard indicator for Cameroon layouts
#: ../rules/base.xml.in.h:361
-msgid "Hewlett-Packard Omnibook 5xx"
-msgstr "Hewlett-Packard Omnibook 5xx"
+msgid "cm"
+msgstr "cm"
#: ../rules/base.xml.in.h:362
-msgid "Hewlett-Packard Omnibook 6000/6100"
-msgstr "Hewlett-Packard Omnibook 6000/6100"
+msgid "English (Cameroon)"
+msgstr "Inglés (Camerún)"
#: ../rules/base.xml.in.h:363
-msgid "Hewlett-Packard Omnibook XE3 GC"
-msgstr "Hewlett-Packard Omnibook XE3 GC"
+msgid "French (Cameroon)"
+msgstr "Francés (Camerún)"
#: ../rules/base.xml.in.h:364
-msgid "Hewlett-Packard Omnibook XE3 GF"
-msgstr "Hewlett-Packard Omnibook XE3 GF"
+msgid "Cameroon Multilingual (qwerty)"
+msgstr "Camerunés multilingüe (qwerty)"
#: ../rules/base.xml.in.h:365
-msgid "Hewlett-Packard Omnibook XT1000"
-msgstr "Hewlett-Packard Omnibook XT1000"
+msgid "Cameroon Multilingual (azerty)"
+msgstr "Camerunés multilingüe (azerty)"
#: ../rules/base.xml.in.h:366
-msgid "Hewlett-Packard Pavilion ZT11xx"
-msgstr "Hewlett-Packard Pavilion ZT11xx"
-
-#: ../rules/base.xml.in.h:367
-msgid "Hewlett-Packard Pavilion dv5"
-msgstr "Hewlett-Packard Pavilion dv5"
+msgid "Cameroon Multilingual (Dvorak)"
+msgstr "Camerunés multilingüe (Dvorak)"
+#. Keyboard indicator for Burmese layouts
#: ../rules/base.xml.in.h:368
-msgid "Hewlett-Packard SK-250x Multimedia Keyboard"
-msgstr "Hewlett-Packard SK-250x Multimedia Keyboard"
+msgid "my"
+msgstr "my"
#: ../rules/base.xml.in.h:369
-msgid "Hewlett-Packard nx9020"
-msgstr "Hewlett-Packard nx9020"
+msgid "Burmese"
+msgstr "Burmese"
-#: ../rules/base.xml.in.h:370
-msgid "Hexadecimal"
-msgstr "Hexadecimal"
+#: ../rules/base.xml.in.h:370 ../rules/base.extras.xml.in.h:4
+msgid "French (Canada)"
+msgstr "Francés (Canadá)"
#: ../rules/base.xml.in.h:371
-msgid "Hindi (Bolnagri)"
-msgstr "Hindi (bolnagri)"
+msgid "French (Canada, Dvorak)"
+msgstr "Francés (Canadá, Dvorak)"
#: ../rules/base.xml.in.h:372
-msgid "Hindi (Wx)"
-msgstr "Hindi (Wx)"
+msgid "French (Canada, legacy)"
+msgstr "Francés (Canadá, arcaico)"
#: ../rules/base.xml.in.h:373
-msgid "Honeywell Euroboard"
-msgstr "Honeywell Euroboard"
+msgid "Canadian Multilingual"
+msgstr "Canadiense multilingüe"
#: ../rules/base.xml.in.h:374
-msgid "Htc Dream phone"
-msgstr "Teléfono HTC Dream"
+msgid "Canadian Multilingual (first part)"
+msgstr "Canadiense multilingüe (primera parte)"
#: ../rules/base.xml.in.h:375
-msgid "Hungarian"
-msgstr "Húngaro"
-
-#: ../rules/base.xml.in.h:376
-msgid "Hungarian (101/qwerty/comma/dead keys)"
-msgstr "Húngaro (101/qwerty/coma/teclas muertas)"
+msgid "Canadian Multilingual (second part)"
+msgstr "Canadiense multilingüe (segunda parte)"
+#. Keyboard indicator for Inuktikut layouts
#: ../rules/base.xml.in.h:377
-msgid "Hungarian (101/qwerty/comma/eliminate dead keys)"
-msgstr "Húngaro (101/qwerty/coma/eliminar teclas muertas)"
+msgid "ike"
+msgstr "ike"
#: ../rules/base.xml.in.h:378
-msgid "Hungarian (101/qwerty/dot/dead keys)"
-msgstr "Húngaro (101/qwerty/punto/teclas muertas)"
+msgid "Inuktitut"
+msgstr "Inuktitut"
#: ../rules/base.xml.in.h:379
-msgid "Hungarian (101/qwerty/dot/eliminate dead keys)"
-msgstr "Húngaro (101/qwerty/punto/eliminar teclas muertas)"
+msgid "English (Canada)"
+msgstr "Inglés (Canadá)"
#: ../rules/base.xml.in.h:380
-msgid "Hungarian (101/qwertz/comma/dead keys)"
-msgstr "Húngaro (101/qwertz/coma/teclas muertas)"
-
-#: ../rules/base.xml.in.h:381
-msgid "Hungarian (101/qwertz/comma/eliminate dead keys)"
-msgstr "Húngaro (101/qwertz/coma/eliminar teclas muertas)"
+msgid "French (Democratic Republic of the Congo)"
+msgstr "Francés (República Democrática del Congo)"
+#. Keyboard indicator for Taiwanese layouts
#: ../rules/base.xml.in.h:382
-msgid "Hungarian (101/qwertz/dot/dead keys)"
-msgstr "Húngaro (101/qwertz/punto/teclas muertas)"
+msgid "zh"
+msgstr "zh"
#: ../rules/base.xml.in.h:383
-msgid "Hungarian (101/qwertz/dot/eliminate dead keys)"
-msgstr "Húngaro (101/qwertz/punto/eliminar teclas muertas)"
+msgid "Chinese"
+msgstr "Chino"
#: ../rules/base.xml.in.h:384
-msgid "Hungarian (102/qwerty/comma/dead keys)"
-msgstr "Húngaro (102/qwerty/coma/teclas muertas)"
+msgid "Tibetan"
+msgstr "Tibetano"
#: ../rules/base.xml.in.h:385
-msgid "Hungarian (102/qwerty/comma/eliminate dead keys)"
-msgstr "Húngaro (102/qwerty/coma/eliminar teclas muertas)"
+msgid "Tibetan (with ASCII numerals)"
+msgstr "Tibetano (con numerales ASCII)"
#: ../rules/base.xml.in.h:386
-msgid "Hungarian (102/qwerty/dot/dead keys)"
-msgstr "Húngaro (102/qwerty/punto/teclas muertas)"
+msgid "ug"
+msgstr "ug"
#: ../rules/base.xml.in.h:387
-msgid "Hungarian (102/qwerty/dot/eliminate dead keys)"
-msgstr "Húngaro (102/qwerty/punto/eliminar teclas muertas)"
-
-#: ../rules/base.xml.in.h:388
-msgid "Hungarian (102/qwertz/comma/dead keys)"
-msgstr "Húngaro (102/qwertz/coma/teclas muertas)"
+msgid "Uyghur"
+msgstr "Uigur"
+#. Keyboard indicator for Croatian layouts
#: ../rules/base.xml.in.h:389
-msgid "Hungarian (102/qwertz/comma/eliminate dead keys)"
-msgstr "Húngaro (102/qwertz/coma/eliminar teclas muertas)"
+msgid "hr"
+msgstr "hr"
#: ../rules/base.xml.in.h:390
-msgid "Hungarian (102/qwertz/dot/dead keys)"
-msgstr "Húngaro (102/qwertz/punto/teclas muertas)"
+msgid "Croatian"
+msgstr "Croata"
#: ../rules/base.xml.in.h:391
-msgid "Hungarian (102/qwertz/dot/eliminate dead keys)"
-msgstr "Húngaro (102/qwertz/punto/eliminar teclas muertas)"
+msgid "Croatian (use guillemets for quotes)"
+msgstr "Croata (usar guillemots para comillas)"
#: ../rules/base.xml.in.h:392
-msgid "Hungarian (eliminate dead keys)"
-msgstr "Húngaro (eliminar teclas muertas)"
+msgid "Croatian (use Croatian digraphs)"
+msgstr "Croata (usar dígrafos croatas)"
#: ../rules/base.xml.in.h:393
-msgid "Hungarian (qwerty)"
-msgstr "Húngaro (qwerty)"
+msgid "Croatian (US keyboard with Croatian digraphs)"
+msgstr "Croata (teclado de EE. UU. con dígrafos croatas)"
#: ../rules/base.xml.in.h:394
-msgid "Hungarian (standard)"
-msgstr "Húngaro (estándar)"
-
-#: ../rules/base.xml.in.h:395
-msgid "Hyper is mapped to Win-keys"
-msgstr "Hyper está mapeada a las teclas Windows"
+msgid "Croatian (US keyboard with Croatian letters)"
+msgstr "Croata (teclado de EE. UU. con letras croatas)"
-#: ../rules/base.xml.in.h:396
-msgid "IBM Rapid Access"
-msgstr "IBM Rapid Access"
+#. Keyboard indicator for Chech layouts
+#: ../rules/base.xml.in.h:396 ../rules/base.extras.xml.in.h:74
+msgid "cs"
+msgstr "cs"
-#: ../rules/base.xml.in.h:397
-msgid "IBM Rapid Access II"
-msgstr "IBM Rapid Access II"
+#: ../rules/base.xml.in.h:397 ../rules/base.extras.xml.in.h:75
+msgid "Czech"
+msgstr "Checo"
#: ../rules/base.xml.in.h:398
-msgid "IBM Space Saver"
-msgstr "IBM Space Saver"
+msgid "Czech (with &lt;\\|&gt; key)"
+msgstr "Checo (con tecla «\\|»)"
#: ../rules/base.xml.in.h:399
-msgid "IBM ThinkPad 560Z/600/600E/A22E"
-msgstr "IBM ThinkPad 560Z/600/600E/A22E"
+msgid "Czech (qwerty)"
+msgstr "Checo (qwery)"
#: ../rules/base.xml.in.h:400
-msgid "IBM ThinkPad R60/T60/R61/T61"
-msgstr "IBM ThinkPad R60/T60/R61/T61"
+msgid "Czech (qwerty, extended Backslash)"
+msgstr "Checo (qwerty, contrabarra extendida)"
#: ../rules/base.xml.in.h:401
-msgid "IBM ThinkPad Z60m/Z60t/Z61m/Z61t"
-msgstr "IBM ThinkPad Z60m/Z60t/Z61m/Z61t"
+msgid "Czech (UCW layout, accented letters only)"
+msgstr "Checo (distribución UCW, sólo teclas con tilde)"
#: ../rules/base.xml.in.h:402
-msgid "Icelandic"
-msgstr "Islandés"
-
-#: ../rules/base.xml.in.h:403
-msgid "Icelandic (Dvorak)"
-msgstr "Islandés (Dvorak)"
+msgid "Czech (US Dvorak with CZ UCW support)"
+msgstr "Checo (teclado Dvorak EE. UU. con soporte para UCW checo)"
-#: ../rules/base.xml.in.h:404
-msgid "Icelandic (Macintosh)"
-msgstr "Islandés (Macintosh)"
+#. Keyboard indicator for Danish layouts
+#: ../rules/base.xml.in.h:404 ../rules/base.extras.xml.in.h:77
+msgid "da"
+msgstr "da"
-#: ../rules/base.xml.in.h:405
-msgid "Icelandic (Sun dead keys)"
-msgstr "Islandés (teclas muertas de Sun)"
+#: ../rules/base.xml.in.h:405 ../rules/base.extras.xml.in.h:78
+msgid "Danish"
+msgstr "Danés"
#: ../rules/base.xml.in.h:406
-msgid "Icelandic (eliminate dead keys)"
-msgstr "Islandés (eliminar teclas muertas)"
+msgid "Danish (eliminate dead keys)"
+msgstr "Danés (eliminar teclas muertas)"
#: ../rules/base.xml.in.h:407
-msgid "Igbo"
-msgstr "Igbo"
+msgid "Danish (Macintosh)"
+msgstr "Danés (Macintosh)"
#: ../rules/base.xml.in.h:408
-msgid "Indian"
-msgstr "Indio"
+msgid "Danish (Macintosh, eliminate dead keys)"
+msgstr "Danés (Macintosh, eliminar teclas muertas)"
#: ../rules/base.xml.in.h:409
-msgid "Inuktitut"
-msgstr "Inuktitut"
-
-#: ../rules/base.xml.in.h:410
-msgid "Iraqi"
-msgstr "Iraquí"
+msgid "Danish (Dvorak)"
+msgstr "Danés (Dvorak)"
-#: ../rules/base.xml.in.h:411
-msgid "Irish"
-msgstr "Irlandés"
+#. Keyboard indicator for Dutch layouts
+#: ../rules/base.xml.in.h:411 ../rules/base.extras.xml.in.h:80
+msgid "nl"
+msgstr "nl"
-#: ../rules/base.xml.in.h:412
-msgid "Irish (UnicodeExpert)"
-msgstr "Irlandés (UnicodeExperto)"
+#: ../rules/base.xml.in.h:412 ../rules/base.extras.xml.in.h:81
+msgid "Dutch"
+msgstr "Holandés"
#: ../rules/base.xml.in.h:413
-msgid "Italian"
-msgstr "Italiano"
+msgid "Dutch (Sun dead keys)"
+msgstr "Holandés (teclas muertas de Sun)"
#: ../rules/base.xml.in.h:414
-msgid "Italian (Macintosh)"
-msgstr "Italiano (Macintosh)"
+msgid "Dutch (Macintosh)"
+msgstr "Holandés (Macintosh)"
#: ../rules/base.xml.in.h:415
-msgid "Italian (US keyboard with Italian letters)"
-msgstr "Italiano (teclado EE. UU. con letras italianas)"
-
-#: ../rules/base.xml.in.h:416
-msgid "Italian (eliminate dead keys)"
-msgstr "Italiano (eliminar teclas muertas)"
+msgid "Dutch (standard)"
+msgstr "Holandés (estándar)"
+#. Keyboard indicator for Dzongkha layouts
#: ../rules/base.xml.in.h:417
-msgid "Japanese"
-msgstr "Japones"
+msgid "dz"
+msgstr "dz"
#: ../rules/base.xml.in.h:418
-msgid "Japanese (Kana 86)"
-msgstr "Japonés (kana 86)"
-
-#: ../rules/base.xml.in.h:419
-msgid "Japanese (Kana)"
-msgstr "Japonés (kana)"
+msgid "Dzongkha"
+msgstr "Dzongkha"
-#: ../rules/base.xml.in.h:420
-msgid "Japanese (Macintosh)"
-msgstr "Japonés (Macintosh)"
+#. Keyboard indicator for Estonian layouts
+#: ../rules/base.xml.in.h:420 ../rules/base.extras.xml.in.h:83
+msgid "et"
+msgstr "et"
-#: ../rules/base.xml.in.h:421
-msgid "Japanese (OADG 109A)"
-msgstr "Japonés (OADG 109A)"
+#: ../rules/base.xml.in.h:421 ../rules/base.extras.xml.in.h:84
+msgid "Estonian"
+msgstr "Estonio"
#: ../rules/base.xml.in.h:422
-msgid "Japanese (PC-98xx Series)"
-msgstr "Japonés (series PC-98xx)"
+msgid "Estonian (eliminate dead keys)"
+msgstr "Estonio (eliminar teclas muertas)"
#: ../rules/base.xml.in.h:423
-msgid "Japanese keyboard options"
-msgstr "Opciones de teclado japonés"
+msgid "Estonian (Dvorak)"
+msgstr "Estonio (Dvorak)"
#: ../rules/base.xml.in.h:424
-msgid "Kalmyk"
-msgstr "Calmuco"
+msgid "Estonian (US keyboard with Estonian letters)"
+msgstr "Estonio (teclado EE. UU. con letras estonias)"
-#: ../rules/base.xml.in.h:425
-msgid "Kana Lock key is locking"
-msgstr "La tecla Bloq Kana está bloqueando"
+#: ../rules/base.xml.in.h:425 ../rules/base.extras.xml.in.h:16
+msgid "Persian"
+msgstr "Persa"
#: ../rules/base.xml.in.h:426
-msgid "Kannada"
-msgstr "Kannada"
-
-#: ../rules/base.xml.in.h:427
-msgid "Kashubian"
-msgstr "Casubio"
+msgid "Persian (with Persian Keypad)"
+msgstr "Persa (con teclado numérico persa)"
+#. Keyboard indicator for Kurdish layouts
#: ../rules/base.xml.in.h:428
-msgid "Kazakh"
-msgstr "Kazajo"
+msgid "ku"
+msgstr "ku"
#: ../rules/base.xml.in.h:429
-msgid "Kazakh (with Russian)"
-msgstr "Kazajo (con ruso)"
+msgid "Kurdish (Iran, Latin Q)"
+msgstr "Kurdo (Irán latino Q)"
#: ../rules/base.xml.in.h:430
-msgid "Key sequence to kill the X server"
-msgstr "Secuencia de teclas para matar el servidor X"
+msgid "Kurdish (Iran, F)"
+msgstr "Kurdo (Irán, F)"
#: ../rules/base.xml.in.h:431
-msgid "Key to choose 3rd level"
-msgstr "Tecla para seleccionar el 3er nivel"
+msgid "Kurdish (Iran, Latin Alt-Q)"
+msgstr "Kurdo (Irán, latino Alt-Q)"
#: ../rules/base.xml.in.h:432
-msgid "Key to choose 5th level"
-msgstr "Tecla para seleccionar el 5o nivel"
+msgid "Kurdish (Iran, Arabic-Latin)"
+msgstr "Kurdo (Irán, arábigolatino)"
#: ../rules/base.xml.in.h:433
-msgid "Key(s) to change layout"
-msgstr "Tecla(s) para cambiar la distribución"
+msgid "Iraqi"
+msgstr "Iraquí"
#: ../rules/base.xml.in.h:434
-msgid "Keytronic FlexPro"
-msgstr "Keytronic FlexPro"
+msgid "Kurdish (Iraq, Latin Q)"
+msgstr "Kurdo (Irak, latino Q)"
#: ../rules/base.xml.in.h:435
-msgid "Khmer (Cambodia)"
-msgstr "Khmer (Camboya)"
+msgid "Kurdish (Iraq, F)"
+msgstr "Kurdo (Irak, F)"
#: ../rules/base.xml.in.h:436
-msgid "Kikuyu"
-msgstr "kikuyu"
+msgid "Kurdish (Iraq, Latin Alt-Q)"
+msgstr "Kurdo (Irak, latino Alt-Q)"
#: ../rules/base.xml.in.h:437
-msgid "Kinesis"
-msgstr "Kinesis"
-
-#: ../rules/base.xml.in.h:438
-msgid "Komi"
-msgstr "Komi"
+msgid "Kurdish (Iraq, Arabic-Latin)"
+msgstr "Kurdo (Irak, arábigolatino)"
+#. Keyboard indicator for Faroese layouts
#: ../rules/base.xml.in.h:439
-msgid "Korean"
-msgstr "Coreano"
+msgid "fo"
+msgstr "fo"
#: ../rules/base.xml.in.h:440
-msgid "Korean (101/104 key compatible)"
-msgstr "Coreano (101/104 teclas compatible)"
+msgid "Faroese"
+msgstr "Faroés"
#: ../rules/base.xml.in.h:441
-msgid "Kurdish (Iran, Arabic-Latin)"
-msgstr "Kurdo (Irán, arábigolatino)"
-
-#: ../rules/base.xml.in.h:442
-msgid "Kurdish (Iran, F)"
-msgstr "Kurdo (Irán, F)"
+msgid "Faroese (eliminate dead keys)"
+msgstr "Faroés (eliminar teclas muertas)"
-#: ../rules/base.xml.in.h:443
-msgid "Kurdish (Iran, Latin Alt-Q)"
-msgstr "Kurdo (Irán, latino Alt-Q)"
+#. Keyboard indicator for Finnish layouts
+#: ../rules/base.xml.in.h:443 ../rules/base.extras.xml.in.h:86
+msgid "fi"
+msgstr "fi"
-#: ../rules/base.xml.in.h:444
-msgid "Kurdish (Iran, Latin Q)"
-msgstr "Kurdo (Irán latino Q)"
+#: ../rules/base.xml.in.h:444 ../rules/base.extras.xml.in.h:87
+msgid "Finnish"
+msgstr "Finlandés"
#: ../rules/base.xml.in.h:445
-msgid "Kurdish (Iraq, Arabic-Latin)"
-msgstr "Kurdo (Irak, arábigolatino)"
+msgid "Finnish (classic)"
+msgstr "Finlandés (clásico)"
#: ../rules/base.xml.in.h:446
-msgid "Kurdish (Iraq, F)"
-msgstr "Kurdo (Irak, F)"
+msgid "Finnish (classic, eliminate dead keys)"
+msgstr "Finlandés (clásico, eliminar teclas muertas)"
#: ../rules/base.xml.in.h:447
-msgid "Kurdish (Iraq, Latin Alt-Q)"
-msgstr "Kurdo (Irak, latino Alt-Q)"
+msgid "Northern Saami (Finland)"
+msgstr "Lapón del norte (Finlandia)"
#: ../rules/base.xml.in.h:448
-msgid "Kurdish (Iraq, Latin Q)"
-msgstr "Kurdo (Irak, latino Q)"
+msgid "Finnish (Macintosh)"
+msgstr "Finlandés (Macintosh)"
-#: ../rules/base.xml.in.h:449
-msgid "Kurdish (Syria, F)"
-msgstr "Kurdo (Siria, F)"
+#: ../rules/base.xml.in.h:449 ../rules/base.extras.xml.in.h:89
+msgid "French"
+msgstr "Francés"
#: ../rules/base.xml.in.h:450
-msgid "Kurdish (Syria, Latin Alt-Q)"
-msgstr "Kurdo (Siria, latino Alt-Q)"
+msgid "French (eliminate dead keys)"
+msgstr "Francés (eliminar teclas muertas)"
#: ../rules/base.xml.in.h:451
-msgid "Kurdish (Syria, Latin Q)"
-msgstr "Kurdo (Siria, latino Q)"
+msgid "French (Sun dead keys)"
+msgstr "Francés (teclas muertas de Sun)"
#: ../rules/base.xml.in.h:452
-msgid "Kurdish (Turkey, F)"
-msgstr "Kurdo (Turquía, F)"
+msgid "French (alternative)"
+msgstr "Francés (alternativo)"
#: ../rules/base.xml.in.h:453
-msgid "Kurdish (Turkey, Latin Alt-Q)"
-msgstr "Kurdo (Turquía, latino Alt-Q)"
+msgid "French (alternative, Latin-9 only)"
+msgstr "Francés (alternativo, sólo latin-9)"
#: ../rules/base.xml.in.h:454
-msgid "Kurdish (Turkey, Latin Q)"
-msgstr "Kurdo (Turquía, latino Q)"
+msgid "French (alternative, eliminate dead keys)"
+msgstr "Francés (alternativo, eliminar teclas muertas)"
#: ../rules/base.xml.in.h:455
-msgid "Kyrgyz"
-msgstr "Kirguí"
+msgid "French (alternative, Sun dead keys)"
+msgstr "Francés (alternativo, teclas muertas de Sun)"
#: ../rules/base.xml.in.h:456
-msgid "Kyrgyz (phonetic)"
-msgstr "Kirguí (fonético)"
+msgid "French (legacy, alternative)"
+msgstr "Francés (arcaico, alternativo)"
#: ../rules/base.xml.in.h:457
-msgid "Lao"
-msgstr "Lao"
+msgid "French (legacy, alternative, eliminate dead keys)"
+msgstr "Francés (arcaico, alternativo, eliminar teclas muertas)"
#: ../rules/base.xml.in.h:458
-msgid "Lao (STEA proposed standard layout)"
-msgstr "Lao (distribución propuesta STEA estándar)"
+msgid "French (legacy, alternative, Sun dead keys)"
+msgstr "Francés (arcaico, alternativo, teclas muertas de Sun)"
#: ../rules/base.xml.in.h:459
-msgid "Laptop/notebook Compaq (eg. Armada) Laptop Keyboard"
-msgstr "Laptop/notebook Compaq (eg. Armada) Laptop Keyboard"
+msgid "French (Bepo, ergonomic, Dvorak way)"
+msgstr "Francés (bepo, ergonómico, forma Dvorak)"
#: ../rules/base.xml.in.h:460
-msgid "Laptop/notebook Compaq (eg. Presario) Internet Keyboard"
-msgstr "Laptop/notebook Compaq (eg. Presario) Internet Keyboard"
+msgid "French (Bepo, ergonomic, Dvorak way, Latin-9 only)"
+msgstr "Francés (bepo, ergonómico, forma Dvorak, sólo latin-9)"
#: ../rules/base.xml.in.h:461
-msgid "Laptop/notebook eMachines m68xx"
-msgstr "Laptop/notebook eMachines m68xx"
+msgid "French (Dvorak)"
+msgstr "Francés (Dvorak)"
-#: ../rules/base.xml.in.h:462 ../rules/base.extras.xml.in.h:16
-msgid "Latvian"
-msgstr "Letón"
+#: ../rules/base.xml.in.h:462
+msgid "French (Macintosh)"
+msgstr "Francés (Macintosh)"
#: ../rules/base.xml.in.h:463
-msgid "Latvian (F variant)"
-msgstr "Letón (variante de letra F)"
+msgid "French (Breton)"
+msgstr "Francés (bretón)"
#: ../rules/base.xml.in.h:464
-msgid "Latvian (adapted)"
-msgstr "Letón (adaptado)"
+msgid "Occitan"
+msgstr "Occitano"
#: ../rules/base.xml.in.h:465
-msgid "Latvian (apostrophe variant)"
-msgstr "Letón (variante con apóstrofo)"
+msgid "Georgian (France, AZERTY Tskapo)"
+msgstr "Georgiano (Francia, AZERTY tskapo)"
#: ../rules/base.xml.in.h:466
-msgid "Latvian (ergonomic, ŪGJRMV)"
-msgstr "Letón (ergonómico, ŪGJRMV)"
+msgid "English (Ghana)"
+msgstr "Inglés (Ghana)"
#: ../rules/base.xml.in.h:467
-msgid "Latvian (modern)"
-msgstr "Letón (moderno)"
-
-#: ../rules/base.xml.in.h:468
-msgid "Latvian (tilde variant)"
-msgstr "Letón (variante virgulilla)"
+msgid "English (Ghana, multilingual)"
+msgstr "Inglés (Ghana, multilingüe)"
+#. Keyboard indicator for Akan layouts
#: ../rules/base.xml.in.h:469
-msgid "Left Alt"
-msgstr "Alt izquierdo"
+msgid "ak"
+msgstr "ak"
#: ../rules/base.xml.in.h:470
-msgid "Left Alt (while pressed)"
-msgstr "Alt izquierdo (mientras está pulsado)"
-
-#: ../rules/base.xml.in.h:471
-msgid "Left Alt is swapped with Left Win"
-msgstr "Alt izquierdo está cambiado con Windows izquierdo"
+msgid "Akan"
+msgstr "Akan"
+#. Keyboard indicator for Ewe layouts
#: ../rules/base.xml.in.h:472
-msgid "Left Ctrl"
-msgstr "Ctrl izquierdo"
+msgid "ee"
+msgstr "ee"
#: ../rules/base.xml.in.h:473
-msgid "Left Ctrl (to first layout), Right Ctrl (to last layout)"
-msgstr "Ctrl izquierdo (a la primera distribución), Ctrl derecho (a la última distribución)"
-
-#: ../rules/base.xml.in.h:474
-msgid "Left Ctrl as Meta"
-msgstr "Ctrl izquierdo como Meta"
+msgid "Ewe"
+msgstr "Ewe"
+#. Keyboard indicator for Fula layouts
#: ../rules/base.xml.in.h:475
-msgid "Left Ctrl+Left Shift"
-msgstr "Ctrl izquierdo + Mayús izquierdo"
+msgid "ff"
+msgstr "ff"
#: ../rules/base.xml.in.h:476
-msgid "Left Shift"
-msgstr "Mayús izquierdo"
-
-#: ../rules/base.xml.in.h:477
-msgid "Left Win"
-msgstr "Win izquierdo"
+msgid "Fula"
+msgstr "Fula"
+#. Keyboard indicator for Ga layouts
#: ../rules/base.xml.in.h:478
-msgid "Left Win (to first layout), Right Win/Menu (to last layout)"
-msgstr "Win izquierdo (a la primera distribución), Win/Menu derecho (a la última distribución)"
+msgid "gaa"
+msgstr "gaa"
#: ../rules/base.xml.in.h:479
-msgid "Left Win (while pressed)"
-msgstr "Tecla Windows izquierdo (al pulsarla)"
-
-#: ../rules/base.xml.in.h:480
-msgid "Left Win chooses 5th level, locks when pressed together with another 5th-level-chooser"
-msgstr "Win izquierdo elige el 5º nivel, bloquea al pulsarse junto con otro selector de 5º nivel"
+msgid "Ga"
+msgstr "Ga"
+#. Keyboard indicator for Hausa layouts
#: ../rules/base.xml.in.h:481
-msgid "Left Win chooses 5th level, locks when pressed together with another 5th-level-chooser, one press releases the lock"
-msgstr "Win izquierdo elige el 5º nivel, bloquea al pulsarse junto con otro selector de 5º nivel, una pulsación libera el bloqueo"
+msgid "ha"
+msgstr "ha"
#: ../rules/base.xml.in.h:482
-msgid "LeftCtrl+LeftWin (to first layout), RightCtrl+Menu (to second layout)"
-msgstr "Ctrl izquierdo + Ctrl derecho (a la primera distribución), Ctrl derecho + Menú (a la segunda distribución)"
-
-#: ../rules/base.xml.in.h:483
-msgid "Legacy"
-msgstr "Heredado"
+msgid "Hausa"
+msgstr "Hausa"
+#. Keyboard indicator for Avatime layouts
#: ../rules/base.xml.in.h:484
-msgid "Legacy Wang 724"
-msgstr "Wang 724 heredado"
+msgid "avn"
+msgstr "avn"
+
+#: ../rules/base.xml.in.h:485
+msgid "Avatime"
+msgstr "Avatime"
-#. Actually, with KP_SEPARATOR, as the old keypad(comma)
#: ../rules/base.xml.in.h:486
-msgid "Legacy key with comma"
-msgstr "Tecla heredada con coma"
+msgid "English (Ghana, GILLBT)"
+msgstr "Inglés (Ghana, GILLBT)"
#: ../rules/base.xml.in.h:487
-msgid "Legacy key with dot"
-msgstr "Tecla heredada con punto"
-
-#: ../rules/base.xml.in.h:488 ../rules/base.extras.xml.in.h:25
-msgid "Lithuanian"
-msgstr "Lituano"
+msgid "French (Guinea)"
+msgstr "Francés (Guinea)"
+#. Keyboard indicator for Georgian layouts
#: ../rules/base.xml.in.h:489
-msgid "Lithuanian (IBM LST 1205-92)"
-msgstr "Lituano (IBM LST 1205-92)"
+msgid "ka"
+msgstr "ka"
#: ../rules/base.xml.in.h:490
-msgid "Lithuanian (LEKP)"
-msgstr "Lituano (LEKP)"
+msgid "Georgian"
+msgstr "Georgiano"
#: ../rules/base.xml.in.h:491
-msgid "Lithuanian (LEKPa)"
-msgstr "Lituano (LEKPa)"
+msgid "Georgian (ergonomic)"
+msgstr "Georgiano (ergonómico)"
#: ../rules/base.xml.in.h:492
-msgid "Lithuanian (US keyboard with Lithuanian letters)"
-msgstr "Lituano (teclado de EE. UU. con letras lituanas)"
+msgid "Georgian (MESS)"
+msgstr "Georgiano (MESS)"
#: ../rules/base.xml.in.h:493
-msgid "Lithuanian (standard)"
-msgstr "Lituano (estándar)"
+msgid "Russian (Georgia)"
+msgstr "Ruso (Georgia)"
#: ../rules/base.xml.in.h:494
-msgid "Logitech Access Keyboard"
-msgstr "Logitech Access Keyboard"
+msgid "Ossetian (Georgia)"
+msgstr "Osetio (Georgia)"
-#: ../rules/base.xml.in.h:495
-msgid "Logitech Cordless Desktop"
-msgstr "Logitech Cordless Desktop"
+#: ../rules/base.xml.in.h:495 ../rules/base.extras.xml.in.h:11
+msgid "German"
+msgstr "Alemán"
#: ../rules/base.xml.in.h:496
-msgid "Logitech Cordless Desktop (alternate option)"
-msgstr "Logitech Cordless Desktop Pro (opción alternativa)"
+msgid "German (dead acute)"
+msgstr "Alemán (acento muerto)"
#: ../rules/base.xml.in.h:497
-msgid "Logitech Cordless Desktop EX110"
-msgstr "Logitech Cordless Desktop EX110"
+msgid "German (dead grave acute)"
+msgstr "Alemán (acento grave muerto)"
#: ../rules/base.xml.in.h:498
-msgid "Logitech Cordless Desktop LX-300"
-msgstr "Logitech Cordless Desktop LX-300"
+msgid "German (eliminate dead keys)"
+msgstr "Alemán (eliminar teclas muertas)"
#: ../rules/base.xml.in.h:499
-msgid "Logitech Cordless Desktop Navigator"
-msgstr "Logitech Cordless Desktop Navigator"
+msgid "German (T3)"
+msgstr "Alemán (T3)"
#: ../rules/base.xml.in.h:500
-msgid "Logitech Cordless Desktop Optical"
-msgstr "Logitech Cordless Desktop Optical"
+msgid "Romanian (Germany)"
+msgstr "Rumano (Alemania)"
#: ../rules/base.xml.in.h:501
-msgid "Logitech Cordless Desktop Pro (alternate option 2)"
-msgstr "Logitech Cordless Desktop Pro (opción alternativa 2)"
+msgid "Romanian (Germany, eliminate dead keys)"
+msgstr "Rumano (Alemania, eliminar teclas muertas)"
#: ../rules/base.xml.in.h:502
-msgid "Logitech Cordless Desktop iTouch"
-msgstr "Logitech Cordless Desktop iTouch"
+msgid "German (Dvorak)"
+msgstr "Alemán (Dvorak)"
#: ../rules/base.xml.in.h:503
-msgid "Logitech Cordless Freedom/Desktop Navigator"
-msgstr "Logitech Cordless Freedom/Desktop Navigator"
+msgid "German (Sun dead keys)"
+msgstr "Alemán (teclas muertas de Sun)"
#: ../rules/base.xml.in.h:504
-msgid "Logitech G15 extra keys via G15daemon"
-msgstr "Logitech G15 extra keys via G15daemon"
+msgid "German (Neo 2)"
+msgstr "Alemán (Neo 2)"
#: ../rules/base.xml.in.h:505
-msgid "Logitech Generic Keyboard"
-msgstr "Logitech, teclado genérico"
+msgid "German (Macintosh)"
+msgstr "Alemán (Macintosh)"
#: ../rules/base.xml.in.h:506
-msgid "Logitech Internet 350 Keyboard"
-msgstr "Logitech Internet 350 Keyboard"
+msgid "German (Macintosh, eliminate dead keys)"
+msgstr "Alemán (Macintosh, eliminar teclas muertas)"
#: ../rules/base.xml.in.h:507
-msgid "Logitech Internet Keyboard"
-msgstr "Logitech Internet Keyboard"
+msgid "Lower Sorbian"
+msgstr "Bajo sorbio"
#: ../rules/base.xml.in.h:508
-msgid "Logitech Internet Navigator Keyboard"
-msgstr "Logitech Internet Navigator Keyboard"
+msgid "Lower Sorbian (qwertz)"
+msgstr "Bajo sorbio (qwertz)"
#: ../rules/base.xml.in.h:509
-msgid "Logitech Media Elite Keyboard"
-msgstr "Logitech Media Elite Keyboard"
+msgid "German (qwerty)"
+msgstr "Alemán (qwerty)"
#: ../rules/base.xml.in.h:510
-msgid "Logitech Ultra-X Cordless Media Desktop Keyboard"
-msgstr "Logitech Ultra-X Cordless Media Desktop Keyboard"
+msgid "Russian (Germany, phonetic)"
+msgstr "Ruso (Alemania, fonético)"
#: ../rules/base.xml.in.h:511
-msgid "Logitech Ultra-X Keyboard"
-msgstr "Logitech Ultra-X Keyboard"
+msgid "German (legacy)"
+msgstr "Alemán (arcaico)"
-#: ../rules/base.xml.in.h:512
-msgid "Logitech diNovo Edge Keyboard"
-msgstr "Logitech diNovo Edge Keyboard"
-
-#: ../rules/base.xml.in.h:513
-msgid "Logitech diNovo Keyboard"
-msgstr "Logitech diNovo Keyboard"
+#. Keyboard indicator for Greek layouts
+#: ../rules/base.xml.in.h:513 ../rules/base.extras.xml.in.h:91
+msgid "gr"
+msgstr "gr"
-#: ../rules/base.xml.in.h:514
-msgid "Logitech iTouch"
-msgstr "Logitech iTouch"
+#: ../rules/base.xml.in.h:514 ../rules/base.extras.xml.in.h:92
+msgid "Greek"
+msgstr "Griego"
#: ../rules/base.xml.in.h:515
-msgid "Logitech iTouch Cordless Keyboard (model Y-RB6)"
-msgstr "Logitech iTouch Cordless Keyboard (modelo Y-RB6)"
+msgid "Greek (simple)"
+msgstr "Griego (simple)"
#: ../rules/base.xml.in.h:516
-msgid "Logitech iTouch Internet Navigator Keyboard SE"
-msgstr "Logitech iTouch Internet Navigator Keyboard SE"
+msgid "Greek (extended)"
+msgstr "Griego (extendido)"
#: ../rules/base.xml.in.h:517
-msgid "Logitech iTouch Internet Navigator Keyboard SE (USB)"
-msgstr "Logitech iTouch Internet Navigator Keyboard SE (USB)"
+msgid "Greek (eliminate dead keys)"
+msgstr "Griego (eliminar teclas muertas)"
#: ../rules/base.xml.in.h:518
-msgid "Lower Sorbian"
-msgstr "Bajo sorbio"
-
-#: ../rules/base.xml.in.h:519
-msgid "Lower Sorbian (qwertz)"
-msgstr "Bajo sorbio (qwertz)"
+msgid "Greek (polytonic)"
+msgstr "Griego (politónico)"
+#. Keyboard indicator for Hungarian layouts
#: ../rules/base.xml.in.h:520
-msgid "MacBook/MacBook Pro"
-msgstr "MacBook/MacBook Pro"
+msgid "hu"
+msgstr "hu"
#: ../rules/base.xml.in.h:521
-msgid "MacBook/MacBook Pro (Intl)"
-msgstr "MacBook/MacBook Pro (Intl)"
+msgid "Hungarian"
+msgstr "Húngaro"
#: ../rules/base.xml.in.h:522
-msgid "Macedonian"
-msgstr "Macedonio"
+msgid "Hungarian (standard)"
+msgstr "Húngaro (estándar)"
#: ../rules/base.xml.in.h:523
-msgid "Macedonian (eliminate dead keys)"
-msgstr "Macedonio (eliminar teclas muertas)"
+msgid "Hungarian (eliminate dead keys)"
+msgstr "Húngaro (eliminar teclas muertas)"
#: ../rules/base.xml.in.h:524
-msgid "Macintosh"
-msgstr "Macintosh"
+msgid "Hungarian (qwerty)"
+msgstr "Húngaro (qwerty)"
#: ../rules/base.xml.in.h:525
-msgid "Macintosh Old"
-msgstr "Macintosh antiguo"
+msgid "Hungarian (101/qwertz/comma/dead keys)"
+msgstr "Húngaro (101/qwertz/coma/teclas muertas)"
#: ../rules/base.xml.in.h:526
-msgid "Make Caps Lock an additional Backspace"
-msgstr "Hacer de Bloq Mayús un Retroceso adicional"
+msgid "Hungarian (101/qwertz/comma/eliminate dead keys)"
+msgstr "Húngaro (101/qwertz/coma/eliminar teclas muertas)"
#: ../rules/base.xml.in.h:527
-msgid "Make Caps Lock an additional Control but keep the Caps_Lock keysym"
-msgstr "Hacer de Bloq Mayús un Control adicional pero mantener el símbolo de tecla Caps_Lock"
+msgid "Hungarian (101/qwertz/dot/dead keys)"
+msgstr "Húngaro (101/qwertz/punto/teclas muertas)"
#: ../rules/base.xml.in.h:528
-msgid "Make Caps Lock an additional ESC"
-msgstr "Hacer de Bloq Mayús un Esc adicional"
+msgid "Hungarian (101/qwertz/dot/eliminate dead keys)"
+msgstr "Húngaro (101/qwertz/punto/eliminar teclas muertas)"
#: ../rules/base.xml.in.h:529
-msgid "Make Caps Lock an additional Hyper"
-msgstr "Hacer de Bloq Mayús un Hyper adicional"
+msgid "Hungarian (101/qwerty/comma/dead keys)"
+msgstr "Húngaro (101/qwerty/coma/teclas muertas)"
#: ../rules/base.xml.in.h:530
-msgid "Make Caps Lock an additional Num Lock"
-msgstr "Hacer de Bloq Mayús un Bloq Num adicional"
+msgid "Hungarian (101/qwerty/comma/eliminate dead keys)"
+msgstr "Húngaro (101/qwerty/coma/eliminar teclas muertas)"
#: ../rules/base.xml.in.h:531
-msgid "Make Caps Lock an additional Super"
-msgstr "Hacer de Bloq Mayús un Super adicional"
+msgid "Hungarian (101/qwerty/dot/dead keys)"
+msgstr "Húngaro (101/qwerty/punto/teclas muertas)"
#: ../rules/base.xml.in.h:532
-msgid "Malayalam"
-msgstr "Malayalam"
+msgid "Hungarian (101/qwerty/dot/eliminate dead keys)"
+msgstr "Húngaro (101/qwerty/punto/eliminar teclas muertas)"
#: ../rules/base.xml.in.h:533
-msgid "Malayalam (Lalitha)"
-msgstr "Malayalam (lalitha)"
+msgid "Hungarian (102/qwertz/comma/dead keys)"
+msgstr "Húngaro (102/qwertz/coma/teclas muertas)"
#: ../rules/base.xml.in.h:534
-msgid "Malayalam (enhanced Inscript with Rupee Sign)"
-msgstr "Malayam (Inscript mejorado con signo de rupia)"
+msgid "Hungarian (102/qwertz/comma/eliminate dead keys)"
+msgstr "Húngaro (102/qwertz/coma/eliminar teclas muertas)"
#: ../rules/base.xml.in.h:535
-msgid "Maltese"
-msgstr "Maltés"
+msgid "Hungarian (102/qwertz/dot/dead keys)"
+msgstr "Húngaro (102/qwertz/punto/teclas muertas)"
#: ../rules/base.xml.in.h:536
-msgid "Maltese (with US layout)"
-msgstr "Maltés (con distribución para EE. UU.)"
+msgid "Hungarian (102/qwertz/dot/eliminate dead keys)"
+msgstr "Húngaro (102/qwertz/punto/eliminar teclas muertas)"
#: ../rules/base.xml.in.h:537
-msgid "Maori"
-msgstr "Maorí"
+msgid "Hungarian (102/qwerty/comma/dead keys)"
+msgstr "Húngaro (102/qwerty/coma/teclas muertas)"
#: ../rules/base.xml.in.h:538
-msgid "Mari"
-msgstr "Mari"
+msgid "Hungarian (102/qwerty/comma/eliminate dead keys)"
+msgstr "Húngaro (102/qwerty/coma/eliminar teclas muertas)"
#: ../rules/base.xml.in.h:539
-msgid "Memorex MX1998"
-msgstr "Memorex MX1998"
+msgid "Hungarian (102/qwerty/dot/dead keys)"
+msgstr "Húngaro (102/qwerty/punto/teclas muertas)"
#: ../rules/base.xml.in.h:540
-msgid "Memorex MX2500 EZ-Access Keyboard"
-msgstr "Memorex MX2500 EZ-Access Keyboard"
-
-#: ../rules/base.xml.in.h:541
-msgid "Memorex MX2750"
-msgstr "Memorex MX2750"
+msgid "Hungarian (102/qwerty/dot/eliminate dead keys)"
+msgstr "Húngaro (102/qwerty/punto/eliminar teclas muertas)"
+#. Keyboard indicator for Icelandic layouts
#: ../rules/base.xml.in.h:542
-msgid "Menu"
-msgstr "Menu"
+msgid "is"
+msgstr "is"
#: ../rules/base.xml.in.h:543
-msgid "Menu as Right Ctrl"
-msgstr "Menú como Ctrl derecho"
+msgid "Icelandic"
+msgstr "Islandés"
#: ../rules/base.xml.in.h:544
-msgid "Meta is mapped to Left Win"
-msgstr "Meta está mapeada a la tecla Windows izquierdo"
+msgid "Icelandic (Sun dead keys)"
+msgstr "Islandés (teclas muertas de Sun)"
#: ../rules/base.xml.in.h:545
-msgid "Meta is mapped to Win keys"
-msgstr "Meta está mapeada a las teclas Windows"
+msgid "Icelandic (eliminate dead keys)"
+msgstr "Islandés (eliminar teclas muertas)"
#: ../rules/base.xml.in.h:546
-msgid "Microsoft Comfort Curve Keyboard 2000"
-msgstr "Microsoft Comfort Curve Keyboard 2000"
+msgid "Icelandic (Macintosh)"
+msgstr "Islandés (Macintosh)"
#: ../rules/base.xml.in.h:547
-msgid "Microsoft Internet Keyboard"
-msgstr "Microsoft Internet Keyboard"
-
-#: ../rules/base.xml.in.h:548
-msgid "Microsoft Internet Keyboard Pro, Swedish"
-msgstr "Microsoft Internet Keyboard Pro, sueco"
+msgid "Icelandic (Dvorak)"
+msgstr "Islandés (Dvorak)"
-#: ../rules/base.xml.in.h:549
-msgid "Microsoft Natural"
-msgstr "Microsoft Natural"
+#. Keyboard indicator for Hebrew layouts
+#: ../rules/base.xml.in.h:549 ../rules/base.extras.xml.in.h:62
+msgid "he"
+msgstr "he"
-#: ../rules/base.xml.in.h:550
-msgid "Microsoft Natural Keyboard Elite"
-msgstr "Microsoft Natural Keyboard Elite"
+#: ../rules/base.xml.in.h:550 ../rules/base.extras.xml.in.h:63
+msgid "Hebrew"
+msgstr "Hebreo"
#: ../rules/base.xml.in.h:551
-msgid "Microsoft Natural Keyboard Pro / Microsoft Internet Keyboard Pro"
-msgstr "Microsoft Natural Keyboard Pro / Microsoft Internet Keyboard Pro"
+msgid "Hebrew (lyx)"
+msgstr "Hebreo (lyx)"
#: ../rules/base.xml.in.h:552
-msgid "Microsoft Natural Keyboard Pro OEM"
-msgstr "Microsoft Natural Keyboard Pro OEM"
+msgid "Hebrew (phonetic)"
+msgstr "Hebreo (fonético)"
#: ../rules/base.xml.in.h:553
-msgid "Microsoft Natural Keyboard Pro USB / Microsoft Internet Keyboard Pro"
-msgstr "Microsoft Natural Keyboard Pro USB / Microsoft Internet Keyboard Pro"
-
-#: ../rules/base.xml.in.h:554
-msgid "Microsoft Natural Wireless Ergonomic Keyboard 4000"
-msgstr "Microsoft Natural Wireless Ergonomic Keyboard 4000"
+msgid "Hebrew (Biblical, Tiro)"
+msgstr "Hebreo (bíblico, tiro)"
-#: ../rules/base.xml.in.h:555
-msgid "Microsoft Natural Wireless Ergonomic Keyboard 7000"
-msgstr "Microsoft Natural Wireless Ergonomic Keyboard 7000"
+#. Keyboard indicator for Italian layouts
+#: ../rules/base.xml.in.h:555 ../rules/base.extras.xml.in.h:94
+msgid "it"
+msgstr "it"
-#: ../rules/base.xml.in.h:556
-msgid "Microsoft Office Keyboard"
-msgstr "Microsoft Office Keyboard"
+#: ../rules/base.xml.in.h:556 ../rules/base.extras.xml.in.h:95
+msgid "Italian"
+msgstr "Italiano"
#: ../rules/base.xml.in.h:557
-msgid "Microsoft Wireless Multimedia Keyboard 1.0A"
-msgstr "Microsoft Wireless Multimedia Keyboard 1.0A"
+msgid "Italian (eliminate dead keys)"
+msgstr "Italiano (eliminar teclas muertas)"
#: ../rules/base.xml.in.h:558
-msgid "Miscellaneous compatibility options"
-msgstr "Opciones misceláneas de compatiblidad"
+msgid "Italian (Macintosh)"
+msgstr "Italiano (Macintosh)"
#: ../rules/base.xml.in.h:559
-msgid "Mongolian"
-msgstr "Mongol"
+msgid "Italian (US keyboard with Italian letters)"
+msgstr "Italiano (teclado EE. UU. con letras italianas)"
#: ../rules/base.xml.in.h:560
-msgid "Montenegrin"
-msgstr "Montenegrino"
+msgid "Georgian (Italy)"
+msgstr "Georgiano (Italia)"
#: ../rules/base.xml.in.h:561
-msgid "Montenegrin (Cyrillic with guillemets)"
-msgstr "Montenegrino (cirílico con guillemots)"
-
-#: ../rules/base.xml.in.h:562
-msgid "Montenegrin (Cyrillic)"
-msgstr "Montenegrino (cirílico)"
+msgid "Italian (IBM 142)"
+msgstr "Italiano (IBM 142)"
-#: ../rules/base.xml.in.h:563
-msgid "Montenegrin (Cyrillic, Z and ZHE swapped)"
-msgstr "Montenegrino (cirílico, Z y ZHE intercambiados)"
+#. Keyboard indicator for Japanese layouts
+#: ../rules/base.xml.in.h:563 ../rules/base.extras.xml.in.h:97
+msgid "ja"
+msgstr "ja"
-#: ../rules/base.xml.in.h:564
-msgid "Montenegrin (Latin Unicode qwerty)"
-msgstr "Montenegrino (latino Unicode qwerty)"
+#: ../rules/base.xml.in.h:564 ../rules/base.extras.xml.in.h:98
+msgid "Japanese"
+msgstr "Japones"
#: ../rules/base.xml.in.h:565
-msgid "Montenegrin (Latin Unicode)"
-msgstr "Montenegrino (latino Unicode)"
+msgid "Japanese (Kana)"
+msgstr "Japonés (kana)"
#: ../rules/base.xml.in.h:566
-msgid "Montenegrin (Latin qwerty)"
-msgstr "Montenegrino (latino qwerty)"
+msgid "Japanese (Kana 86)"
+msgstr "Japonés (kana 86)"
#: ../rules/base.xml.in.h:567
-msgid "Montenegrin (Latin with guillemets)"
-msgstr "Montenegrino (latino con guillemots)"
+msgid "Japanese (OADG 109A)"
+msgstr "Japonés (OADG 109A)"
#: ../rules/base.xml.in.h:568
-msgid "NICOLA-F style Backspace"
-msgstr "Retroceso estilo NICOLA-F"
+msgid "Japanese (Macintosh)"
+msgstr "Japonés (Macintosh)"
#: ../rules/base.xml.in.h:569
-msgid "Nepali"
-msgstr "Nepalí"
-
-#: ../rules/base.xml.in.h:570
-msgid "Non-breakable space character at fourth level"
-msgstr "Carácter de espacio no separable en el cuarto nivel"
+msgid "Japanese (Dvorak)"
+msgstr "Japonés (Dvorak)"
+#. Keyboard indicator for Kikuyu layouts
#: ../rules/base.xml.in.h:571
-msgid "Non-breakable space character at fourth level, thin non-breakable space character at sixth level"
-msgstr "Carácter de espacio no separable en el cuarto nivel, carácter de espacio estrecho no separable en el sexto nivel"
+msgid "ki"
+msgstr "ki"
#: ../rules/base.xml.in.h:572
-msgid "Non-breakable space character at fourth level, thin non-breakable space character at sixth level (via Ctrl+Shift)"
-msgstr "Carácter de espacio no separable en el cuarto nivel, carácter de espacio estrecho no separable en el sexto nivel (a través de Ctrl+Mayús)"
+msgid "Kyrgyz"
+msgstr "Kirguí"
#: ../rules/base.xml.in.h:573
-msgid "Non-breakable space character at second level"
-msgstr "Carácter de espacio no separable en el segundo nivel"
-
-#: ../rules/base.xml.in.h:574
-msgid "Non-breakable space character at third level"
-msgstr "Carácter de espacio no separable en el tercer nivel"
+msgid "Kyrgyz (phonetic)"
+msgstr "Kirguí (fonético)"
+#. Keyboard indicator for Khmer layouts
#: ../rules/base.xml.in.h:575
-msgid "Non-breakable space character at third level, nothing at fourth level"
-msgstr "Carácter de espacio no separable en el tercer nivel, nada en el cuarto nivel"
+msgid "km"
+msgstr "km"
#: ../rules/base.xml.in.h:576
-msgid "Non-breakable space character at third level, thin non-breakable space character at fourth level"
-msgstr "Carácter de espacio no separable en el tercer nivel, carácter de espacio estrecho no separable en el cuarto nivel"
-
-#: ../rules/base.xml.in.h:577
-msgid "Northern Saami (Finland)"
-msgstr "Lapón del norte (Finlandia)"
+msgid "Khmer (Cambodia)"
+msgstr "Khmer (Camboya)"
+#. Keyboard indicator for Kazakh layouts
#: ../rules/base.xml.in.h:578
-msgid "Northern Saami (Norway)"
-msgstr "Lapón del norte (Noruega)"
+msgid "kk"
+msgstr "kk"
#: ../rules/base.xml.in.h:579
-msgid "Northern Saami (Norway, eliminate dead keys)"
-msgstr "Lapón del norte (Noruego, eliminar teclas muertas)"
+msgid "Kazakh"
+msgstr "Kazajo"
#: ../rules/base.xml.in.h:580
-msgid "Northern Saami (Sweden)"
-msgstr "Lapón del norte (Suecia)"
+msgid "Russian (Kazakhstan, with Kazakh)"
+msgstr "Ruso (Kazajstán, con kazajo)"
#: ../rules/base.xml.in.h:581
-msgid "Northgate OmniKey 101"
-msgstr "Northgate OmniKey 101"
-
-#: ../rules/base.xml.in.h:582
-msgid "Norwegian"
-msgstr "Noruego"
+msgid "Kazakh (with Russian)"
+msgstr "Kazajo (con ruso)"
+#. Keyboard indicator for Lao layouts
#: ../rules/base.xml.in.h:583
-msgid "Norwegian (Dvorak)"
-msgstr "Noruego (Dvorak)"
+msgid "lo"
+msgstr "lo"
#: ../rules/base.xml.in.h:584
-msgid "Norwegian (Macintosh)"
-msgstr "Noruego (Macintosh)"
+msgid "Lao"
+msgstr "Lao"
#: ../rules/base.xml.in.h:585
-msgid "Norwegian (Macintosh, eliminate dead keys)"
-msgstr "Noruego (Macintosh, eliminar teclas muertas)"
-
-#: ../rules/base.xml.in.h:586
-msgid "Norwegian (eliminate dead keys)"
-msgstr "Noruego (eliminar teclas muertas)"
+msgid "Lao (STEA proposed standard layout)"
+msgstr "Lao (distribución propuesta STEA estándar)"
-#: ../rules/base.xml.in.h:587
-msgid "Num Lock"
-msgstr "Bloq Num"
+#. Keyboard indicator for Spanish layouts
+#: ../rules/base.xml.in.h:587 ../rules/base.extras.xml.in.h:110
+msgid "es"
+msgstr "es"
#: ../rules/base.xml.in.h:588
-msgid "Numeric keypad delete key behaviour"
-msgstr "Comportamiento de la tecla Supr del teclado numérico"
+msgid "Spanish (Latin American)"
+msgstr "Español (latinoamericano)"
#: ../rules/base.xml.in.h:589
-msgid "Numeric keypad keys work as with Macintosh"
-msgstr "Las teclas del teclado numérico funcionan como en un Macintosh"
+msgid "Spanish (Latin American, eliminate dead keys)"
+msgstr "Español (latinoamericano, eliminar teclas muertas)"
#: ../rules/base.xml.in.h:590
-msgid "Numeric keypad layout selection"
-msgstr "Selección de distribución de teclado numérico"
+msgid "Spanish (Latin American, include dead tilde)"
+msgstr "Español (latinoamericano, incluir tilde muerta)"
#: ../rules/base.xml.in.h:591
-msgid "OLPC"
-msgstr "OLPC"
-
-#: ../rules/base.xml.in.h:592
-msgid "Occitan"
-msgstr "Occitano"
+msgid "Spanish (Latin American, Sun dead keys)"
+msgstr "Español (latinoamericano, teclas muertas de Sun)"
-#: ../rules/base.xml.in.h:593
-msgid "Ogham"
-msgstr "Ogham"
+#. Keyboard indicator for Lithuanian layouts
+#: ../rules/base.xml.in.h:593 ../rules/base.extras.xml.in.h:18
+msgid "lt"
+msgstr "lt"
-#: ../rules/base.xml.in.h:594
-msgid "Ogham (IS434)"
-msgstr "Ogam (IS434)"
+#: ../rules/base.xml.in.h:594 ../rules/base.extras.xml.in.h:19
+msgid "Lithuanian"
+msgstr "Lituano"
#: ../rules/base.xml.in.h:595
-msgid "Oriya"
-msgstr "Oriya"
+msgid "Lithuanian (standard)"
+msgstr "Lituano (estándar)"
#: ../rules/base.xml.in.h:596
-msgid "Ortek MCK-800 MM/Internet keyboard"
-msgstr "Teclado Oretec MCK-800 MM/Internet"
+msgid "Lithuanian (US keyboard with Lithuanian letters)"
+msgstr "Lituano (teclado de EE. UU. con letras lituanas)"
#: ../rules/base.xml.in.h:597
-msgid "Ossetian (Georgia)"
-msgstr "Osetio (Georgia)"
+msgid "Lithuanian (IBM LST 1205-92)"
+msgstr "Lituano (IBM LST 1205-92)"
#: ../rules/base.xml.in.h:598
-msgid "Ossetian (WinKeys)"
-msgstr "Osetio (teclas Windows)"
+msgid "Lithuanian (LEKP)"
+msgstr "Lituano (LEKP)"
#: ../rules/base.xml.in.h:599
-msgid "Ossetian (legacy)"
-msgstr "Osetio (heredado)"
-
-#: ../rules/base.xml.in.h:600
-msgid "PC-98xx Series"
-msgstr "PC-98xx Series"
+msgid "Lithuanian (LEKPa)"
+msgstr "Lituano (LEKPa)"
-#: ../rules/base.xml.in.h:601
-msgid "Pannonian Rusyn (homophonic)"
-msgstr "Rusino de Panonia (homofónico)"
+#. Keyboard indicator for Latvian layouts
+#: ../rules/base.xml.in.h:601 ../rules/base.extras.xml.in.h:22
+msgid "lv"
+msgstr "lv"
-#: ../rules/base.xml.in.h:602
-msgid "Pashto"
-msgstr "Pashto"
+#: ../rules/base.xml.in.h:602 ../rules/base.extras.xml.in.h:23
+msgid "Latvian"
+msgstr "Letón"
#: ../rules/base.xml.in.h:603
-msgid "Pashto (Afghanistan, OLPC)"
-msgstr "Pashto (Afganistán, OLPC)"
+msgid "Latvian (apostrophe variant)"
+msgstr "Letón (variante con apóstrofo)"
#: ../rules/base.xml.in.h:604
-msgid "Pause"
-msgstr "Pausa"
+msgid "Latvian (tilde variant)"
+msgstr "Letón (variante virgulilla)"
-#: ../rules/base.xml.in.h:605 ../rules/base.extras.xml.in.h:27
-msgid "Persian"
-msgstr "Persa"
+#: ../rules/base.xml.in.h:605
+msgid "Latvian (F variant)"
+msgstr "Letón (variante de letra F)"
#: ../rules/base.xml.in.h:606
-msgid "Persian (Afghanistan, Dari OLPC)"
-msgstr "Persa (Afganistán, OLPC dari)"
+msgid "Latvian (modern)"
+msgstr "Letón (moderno)"
#: ../rules/base.xml.in.h:607
-msgid "Persian (with Persian Keypad)"
-msgstr "Persa (con teclado persa)"
-
-#: ../rules/base.xml.in.h:608 ../rules/base.extras.xml.in.h:28
-msgid "Polish"
-msgstr "Polaco"
+msgid "Latvian (ergonomic, ŪGJRMV)"
+msgstr "Letón (ergonómico, ŪGJRMV)"
-#: ../rules/base.xml.in.h:609
-msgid "Polish (Dvorak)"
-msgstr "Polaco (Dvorak)"
+#: ../rules/base.xml.in.h:608
+msgid "Latvian (adapted)"
+msgstr "Letón (adaptado)"
+#. Keyboard indicator for Maori layouts
#: ../rules/base.xml.in.h:610
-msgid "Polish (Dvorak, Polish quotes on key 1)"
-msgstr "Polaco (Dvorak, comillas polacas en la tecla 1)"
+msgid "mi"
+msgstr "mi"
#: ../rules/base.xml.in.h:611
-msgid "Polish (Dvorak, Polish quotes on quotemark key)"
-msgstr "Polaco (Dvorak, comillas polacas en la tecla de comillas)"
-
-#: ../rules/base.xml.in.h:612
-msgid "Polish (programmer Dvorak)"
-msgstr "Polaco (Dvorak de programador)"
+msgid "Maori"
+msgstr "Maorí"
-#: ../rules/base.xml.in.h:613
-msgid "Polish (qwertz)"
-msgstr "Polaco (qwertz)"
+#. Keyboard indicator for Serbian layouts
+#: ../rules/base.xml.in.h:613 ../rules/base.extras.xml.in.h:52
+msgid "sr"
+msgstr "sr"
#: ../rules/base.xml.in.h:614
-msgid "Portuguese"
-msgstr "Portugués"
+msgid "Montenegrin"
+msgstr "Montenegrino"
#: ../rules/base.xml.in.h:615
-msgid "Portuguese (Brazil)"
-msgstr "Portugués (Brasil)"
+msgid "Montenegrin (Cyrillic)"
+msgstr "Montenegrino (cirílico)"
#: ../rules/base.xml.in.h:616
-msgid "Portuguese (Brazil, Dvorak)"
-msgstr "Portugués (Brasil, Dvorak)"
+msgid "Montenegrin (Cyrillic, Z and ZHE swapped)"
+msgstr "Montenegrino (cirílico, Z y ZHE intercambiados)"
#: ../rules/base.xml.in.h:617
-msgid "Portuguese (Brazil, eliminate dead keys)"
-msgstr "Portugués (Brasil, eliminar teclas muertas)"
+msgid "Montenegrin (Latin Unicode)"
+msgstr "Montenegrino (latino Unicode)"
#: ../rules/base.xml.in.h:618
-msgid "Portuguese (Brazil, nativo for Esperanto)"
-msgstr "Portugués (Brasil, nativo para esperanto)"
+msgid "Montenegrin (Latin qwerty)"
+msgstr "Montenegrino (latino qwerty)"
#: ../rules/base.xml.in.h:619
-msgid "Portuguese (Brazil, nativo for USA keyboards)"
-msgstr "Portugués (Brasil, nativo para teclados de EE. UU.)"
+msgid "Montenegrin (Latin Unicode qwerty)"
+msgstr "Montenegrino (latino Unicode qwerty)"
#: ../rules/base.xml.in.h:620
-msgid "Portuguese (Brazil, nativo)"
-msgstr "Portugués (Brasil, nativo)"
+msgid "Montenegrin (Cyrillic with guillemets)"
+msgstr "Montenegrino (cirílico con guillemots)"
#: ../rules/base.xml.in.h:621
-msgid "Portuguese (Macintosh)"
-msgstr "Portugués (Macintosh)"
-
-#: ../rules/base.xml.in.h:622
-msgid "Portuguese (Macintosh, Sun dead keys)"
-msgstr "Portugués (Macintosh, teclas muertas de Sun)"
+msgid "Montenegrin (Latin with guillemets)"
+msgstr "Montenegrino (latino con guillemots)"
+#. Keyboard indicator for Macedonian layouts
#: ../rules/base.xml.in.h:623
-msgid "Portuguese (Macintosh, eliminate dead keys)"
-msgstr "Portugués (Macintosh, eliminar teclas muertas)"
+msgid "mk"
+msgstr "mk"
#: ../rules/base.xml.in.h:624
-msgid "Portuguese (Nativo for USA keyboards)"
-msgstr "Portugués (nativo para teclados de EE. UU.)"
+msgid "Macedonian"
+msgstr "Macedonio"
#: ../rules/base.xml.in.h:625
-msgid "Portuguese (Nativo)"
-msgstr "Portugués (nativo)"
-
-#: ../rules/base.xml.in.h:626
-msgid "Portuguese (Sun dead keys)"
-msgstr "Portugués (teclas muertas de Sun)"
+msgid "Macedonian (eliminate dead keys)"
+msgstr "Macedonio (eliminar teclas muertas)"
+#. Keyboard indicator for Maltese layouts
#: ../rules/base.xml.in.h:627
-msgid "Portuguese (eliminate dead keys)"
-msgstr "Portugués (eliminar teclas muertas)"
+msgid "mt"
+msgstr "mt"
#: ../rules/base.xml.in.h:628
-msgid "Propeller Voyager (KTEZ-1000)"
-msgstr "Propeller Voyager (KTEZ-1000)"
+msgid "Maltese"
+msgstr "Maltés"
#: ../rules/base.xml.in.h:629
-msgid "PrtSc"
-msgstr "PrtSc"
-
-#: ../rules/base.xml.in.h:630
-msgid "Punjabi (Gurmukhi Jhelum)"
-msgstr "Panyabí (gurmukhi jhelum)"
+msgid "Maltese (with US layout)"
+msgstr "Maltés (con distribución para EE. UU.)"
+#. Keyboard indicator for Mongolian layouts
#: ../rules/base.xml.in.h:631
-msgid "Punjabi (Gurmukhi)"
-msgstr "Panyabí (gurmukhi)"
+msgid "mn"
+msgstr "mn"
#: ../rules/base.xml.in.h:632
-msgid "QTronix Scorpius 98N+"
-msgstr "QTronix Scorpius 98N+"
-
-#: ../rules/base.xml.in.h:633
-msgid "Right Alt"
-msgstr "Alt derecho"
+msgid "Mongolian"
+msgstr "Mongol"
-#: ../rules/base.xml.in.h:634
-msgid "Right Alt (while pressed)"
-msgstr "Alt derecho (mientras está pulsado)"
+#. Keyboard indicator for Norwegian layouts
+#: ../rules/base.xml.in.h:634 ../rules/base.extras.xml.in.h:102
+msgid "no"
+msgstr "no"
-#: ../rules/base.xml.in.h:635
-msgid "Right Alt as Right Ctrl"
-msgstr "Alt derecho como Ctrl derecho"
+#: ../rules/base.xml.in.h:635 ../rules/base.extras.xml.in.h:103
+msgid "Norwegian"
+msgstr "Noruego"
#: ../rules/base.xml.in.h:636
-msgid "Right Alt chooses 5th level and activates level5-Lock when pressed together with another 5th-level-chooser, one press releases the lock"
-msgstr "Alt derecho elige el 5º nivel y activa el bloqueo de 5º nivel al pulsarse junto con otro selector de 5º nivel, una pulsación libera el bloqueo"
+msgid "Norwegian (eliminate dead keys)"
+msgstr "Noruego (eliminar teclas muertas)"
#: ../rules/base.xml.in.h:637
-msgid "Right Alt chooses 5th level, locks when pressed together with another 5th-level-chooser"
-msgstr "Alt derecho elige el 5º nivel, bloquea al pulsarse junto con otro selector de 5º nivel"
+msgid "Norwegian (Dvorak)"
+msgstr "Noruego (Dvorak)"
#: ../rules/base.xml.in.h:638
-msgid "Right Alt chooses 5th level, locks when pressed together with another 5th-level-chooser, one press releases the lock"
-msgstr "Alt derecho elige el 5º nivel, bloquea al pulsarse junto con otro selector de 5º nivel, una pulsación libera el bloqueo"
+msgid "Northern Saami (Norway)"
+msgstr "Lapón del norte (Noruega)"
#: ../rules/base.xml.in.h:639
-msgid "Right Alt key never chooses 3rd level"
-msgstr "La tecla Alt derecho nunca elige el 3er nivel"
+msgid "Northern Saami (Norway, eliminate dead keys)"
+msgstr "Lapón del norte (Noruego, eliminar teclas muertas)"
#: ../rules/base.xml.in.h:640
-msgid "Right Alt, Shift+Right Alt key is Multi_Key"
-msgstr "La tecla Alt derecho, Mayús+Alt derecho es tecla Multi"
+msgid "Norwegian (Macintosh)"
+msgstr "Noruego (Macintosh)"
#: ../rules/base.xml.in.h:641
-msgid "Right Ctrl"
-msgstr "Ctrl derecho"
+msgid "Norwegian (Macintosh, eliminate dead keys)"
+msgstr "Noruego (Macintosh, eliminar teclas muertas)"
#: ../rules/base.xml.in.h:642
-msgid "Right Ctrl (while pressed)"
-msgstr "Ctrl derecho (mientras está pulsado)"
+msgid "Norwegian (Colemak)"
+msgstr "Noruego (Colemak)"
-#: ../rules/base.xml.in.h:643
-msgid "Right Ctrl as Right Alt"
-msgstr "Ctrl derecho como Alt derecho"
-
-#: ../rules/base.xml.in.h:644
-msgid "Right Ctrl+Right Shift"
-msgstr "Ctrl derecho + Mayús derecho"
+#. Keyboard indicator for Polish layouts
+#: ../rules/base.xml.in.h:644 ../rules/base.extras.xml.in.h:41
+msgid "pl"
+msgstr "pl"
-#: ../rules/base.xml.in.h:645
-msgid "Right Shift"
-msgstr "Mayús derecho"
+#: ../rules/base.xml.in.h:645 ../rules/base.extras.xml.in.h:42
+msgid "Polish"
+msgstr "Polaco"
#: ../rules/base.xml.in.h:646
-msgid "Right Win"
-msgstr "Windows derecho"
+msgid "Polish (legacy)"
+msgstr "Polaco (arcaico)"
#: ../rules/base.xml.in.h:647
-msgid "Right Win (while pressed)"
-msgstr "La tecla Windows (mientras está pulsada)"
+msgid "Polish (qwertz)"
+msgstr "Polaco (qwertz)"
#: ../rules/base.xml.in.h:648
-msgid "Right Win chooses 5th level, locks when pressed together with another 5th-level-chooser"
-msgstr "Win derecho elige el 5º nivel, bloquea al pulsarse junto con otro selector de 5º nivel"
+msgid "Polish (Dvorak)"
+msgstr "Polaco (Dvorak)"
#: ../rules/base.xml.in.h:649
-msgid "Right Win chooses 5th level, locks when pressed together with another 5th-level-chooser, one press releases the lock"
-msgstr "Win derecho elige el 5º nivel, bloquea al pulsarse junto con otro selector de 5º nivel, una pulsación libera el bloqueo"
+msgid "Polish (Dvorak, Polish quotes on quotemark key)"
+msgstr "Polaco (Dvorak, comillas polacas en la tecla de comillas)"
-#: ../rules/base.xml.in.h:650 ../rules/base.extras.xml.in.h:30
-msgid "Romanian"
-msgstr "Rumano"
+#: ../rules/base.xml.in.h:650
+msgid "Polish (Dvorak, Polish quotes on key 1)"
+msgstr "Polaco (Dvorak, comillas polacas en la tecla 1)"
#: ../rules/base.xml.in.h:651
-msgid "Romanian (Germany)"
-msgstr "Rumano (Alemania)"
+msgid "Kashubian"
+msgstr "Casubio"
#: ../rules/base.xml.in.h:652
-msgid "Romanian (Germany, eliminate dead keys)"
-msgstr "Rumano (Alemania, eliminar teclas muertas)"
+msgid "Russian (Poland, phonetic Dvorak)"
+msgstr "Ruso (Polonia, Dvorak fonético)"
#: ../rules/base.xml.in.h:653
-msgid "Romanian (WinKeys)"
-msgstr "Rumano (teclas Windows)"
+msgid "Polish (programmer Dvorak)"
+msgstr "Polaco (Dvorak de programador)"
-#: ../rules/base.xml.in.h:654
-msgid "Romanian (cedilla)"
-msgstr "Rumano (cedilla)"
+#: ../rules/base.xml.in.h:654 ../rules/base.extras.xml.in.h:105
+msgid "Portuguese"
+msgstr "Portugués"
#: ../rules/base.xml.in.h:655
-msgid "Romanian (standard cedilla)"
-msgstr "Rumano (cedilla estándar)"
+msgid "Portuguese (eliminate dead keys)"
+msgstr "Portugués (eliminar teclas muertas)"
#: ../rules/base.xml.in.h:656
-msgid "Romanian (standard)"
-msgstr "Rumano (estándar)"
+msgid "Portuguese (Sun dead keys)"
+msgstr "Portugués (teclas muertas de Sun)"
#: ../rules/base.xml.in.h:657
-msgid "Rupee on 4"
-msgstr "Rupia en el 4"
+msgid "Portuguese (Macintosh)"
+msgstr "Portugués (Macintosh)"
-#: ../rules/base.xml.in.h:658 ../rules/base.extras.xml.in.h:32
-msgid "Russian"
-msgstr "Ruso"
+#: ../rules/base.xml.in.h:658
+msgid "Portuguese (Macintosh, eliminate dead keys)"
+msgstr "Portugués (Macintosh, eliminar teclas muertas)"
#: ../rules/base.xml.in.h:659
-msgid "Russian (DOS)"
-msgstr "Ruso (DOS)"
+msgid "Portuguese (Macintosh, Sun dead keys)"
+msgstr "Portugués (Macintosh, teclas muertas de Sun)"
#: ../rules/base.xml.in.h:660
-msgid "Russian (Georgia)"
-msgstr "Ruso (Georgia)"
+msgid "Portuguese (Nativo)"
+msgstr "Portugués (Nativo)"
#: ../rules/base.xml.in.h:661
-msgid "Russian (Germany, phonetic)"
-msgstr "Ruso (Alemania, fonético)"
+msgid "Portuguese (Nativo for US keyboards)"
+msgstr "Portugués (Nativo para teclados de EE. UU.)"
#: ../rules/base.xml.in.h:662
-msgid "Russian (Kazakhstan, with Kazakh)"
-msgstr "Ruso (Kazajstán, con kazajo)"
-
-#: ../rules/base.xml.in.h:663
-msgid "Russian (Poland, phonetic Dvorak)"
-msgstr "Ruso (Polonia, Dvorak fonético)"
+msgid "Esperanto (Portugal, Nativo)"
+msgstr "Esperanto (Portugal, Nativo)"
-#: ../rules/base.xml.in.h:664
-msgid "Russian (Sweden, phonetic)"
-msgstr "Ruso (sueco, fonético)"
+#. Keyboard indicator for Romanian layouts
+#: ../rules/base.xml.in.h:664 ../rules/base.extras.xml.in.h:46
+msgid "ro"
+msgstr "ro"
-#: ../rules/base.xml.in.h:665
-msgid "Russian (Sweden, phonetic, eliminate dead keys)"
-msgstr "Ruso (sueco, fonético, eliminar teclas muertas)"
+#: ../rules/base.xml.in.h:665 ../rules/base.extras.xml.in.h:47
+msgid "Romanian"
+msgstr "Rumano"
#: ../rules/base.xml.in.h:666
-msgid "Russian (US, phonetic)"
-msgstr "Ruso (EE. UU., fonético)"
+msgid "Romanian (cedilla)"
+msgstr "Rumano (cedilla)"
#: ../rules/base.xml.in.h:667
-msgid "Russian (Ukraine, standard RSTU)"
-msgstr "Ruso (ucraniano estándar RSTU)"
+msgid "Romanian (standard)"
+msgstr "Rumano (estándar)"
#: ../rules/base.xml.in.h:668
-msgid "Russian (legacy)"
-msgstr "Ruso (heredado)"
+msgid "Romanian (standard cedilla)"
+msgstr "Rumano (cedilla estándar)"
#: ../rules/base.xml.in.h:669
-msgid "Russian (phonetic WinKeys)"
-msgstr "Ruso (fonético con teclas Windows)"
+msgid "Romanian (WinKeys)"
+msgstr "Rumano (teclas Windows)"
-#: ../rules/base.xml.in.h:670
-msgid "Russian (phonetic)"
-msgstr "Ruso (fonético)"
+#: ../rules/base.xml.in.h:670 ../rules/base.extras.xml.in.h:56
+msgid "Russian"
+msgstr "Ruso"
#: ../rules/base.xml.in.h:671
-msgid "Russian (typewriter)"
-msgstr "Ruso (máquina de escribir)"
+msgid "Russian (phonetic)"
+msgstr "Ruso (fonético)"
#: ../rules/base.xml.in.h:672
-msgid "Russian (typewriter, legacy)"
-msgstr "Ruso (máquina de escribir, heredado)"
+msgid "Russian (phonetic WinKeys)"
+msgstr "Ruso (fonético con teclas Windows)"
#: ../rules/base.xml.in.h:673
-msgid "SILVERCREST Multimedia Wireless Keyboard"
-msgstr "SILVERCREST Multimedia Wireless Keyboard"
+msgid "Russian (typewriter)"
+msgstr "Ruso (máquina de escribir)"
#: ../rules/base.xml.in.h:674
-msgid "SK-1300"
-msgstr "SK-1300"
+msgid "Russian (legacy)"
+msgstr "Ruso (arcaico)"
#: ../rules/base.xml.in.h:675
-msgid "SK-2500"
-msgstr "SK-2500"
+msgid "Russian (typewriter, legacy)"
+msgstr "Ruso (máquina de escribir, arcaico)"
#: ../rules/base.xml.in.h:676
-msgid "SK-6200"
-msgstr "SK-6200"
+msgid "Tatar"
+msgstr "Tatar"
#: ../rules/base.xml.in.h:677
-msgid "SK-7100"
-msgstr "SK-7100"
+msgid "Ossetian (legacy)"
+msgstr "Osetio (arcaico)"
#: ../rules/base.xml.in.h:678
-msgid "SVEN Ergonomic 2500"
-msgstr "SVEN Ergonomic 2500"
+msgid "Ossetian (WinKeys)"
+msgstr "Osetio (teclas Windows)"
#: ../rules/base.xml.in.h:679
-msgid "SVEN Slim 303"
-msgstr "SVEN Slim 303"
+msgid "Chuvash"
+msgstr "Chuvash"
#: ../rules/base.xml.in.h:680
-msgid "Saisiyat (Taiwan)"
-msgstr "Saisiyat (Taiwán)"
+msgid "Chuvash (Latin)"
+msgstr "Cuvash (latino)"
#: ../rules/base.xml.in.h:681
-msgid "Samsung SDM 4500P"
-msgstr "Samsung SDM 4500P"
+msgid "Udmurt"
+msgstr "Udmurto"
#: ../rules/base.xml.in.h:682
-msgid "Samsung SDM 4510P"
-msgstr "Samsung SDM 4510P"
+msgid "Komi"
+msgstr "Komi"
#: ../rules/base.xml.in.h:683
-msgid "Sanwa Supply SKB-KG3"
-msgstr "Sanwa Supply SKB-KG3"
+msgid "Yakut"
+msgstr "Yakuto"
#: ../rules/base.xml.in.h:684
-msgid "Scroll Lock"
-msgstr "Bloq Despl"
+msgid "Kalmyk"
+msgstr "Calmuco"
#: ../rules/base.xml.in.h:685
-msgid "Semi-colon on third level"
-msgstr "Punto y coma en tercer nivel"
+msgid "Russian (DOS)"
+msgstr "Ruso (DOS)"
-#: ../rules/base.xml.in.h:686 ../rules/base.extras.xml.in.h:35
-msgid "Serbian"
-msgstr "Serbio"
+#: ../rules/base.xml.in.h:686
+msgid "Russian (Macintosh)"
+msgstr "Ruso (Macintosh)"
#: ../rules/base.xml.in.h:687
-msgid "Serbian (Latin Unicode qwerty)"
-msgstr "Serbio (latino Unicode qwerty)"
+msgid "Serbian (Russia)"
+msgstr "Serbio (Rusia)"
#: ../rules/base.xml.in.h:688
-msgid "Serbian (Latin Unicode)"
-msgstr "Serbio (latino Unicode)"
+msgid "Bashkirian"
+msgstr "Bashkiriano"
#: ../rules/base.xml.in.h:689
-msgid "Serbian (Latin qwerty)"
-msgstr "Serbio (latino qwerty)"
+msgid "Mari"
+msgstr "Mari"
-#: ../rules/base.xml.in.h:690
-msgid "Serbian (Latin with guillemets)"
-msgstr "Serbio (latino con guillemots)"
+#: ../rules/base.xml.in.h:690 ../rules/base.extras.xml.in.h:53
+msgid "Serbian"
+msgstr "Serbio"
#: ../rules/base.xml.in.h:691
-msgid "Serbian (Latin)"
-msgstr "Serbio (latino)"
+msgid "Serbian (Cyrillic, Z and ZHE swapped)"
+msgstr "Serbio (cirílico, Z y ZHE intercambiados)"
#: ../rules/base.xml.in.h:692
-msgid "Serbian (Russia)"
-msgstr "Serbio (Rusia)"
+msgid "Serbian (Latin)"
+msgstr "Serbio (latino)"
#: ../rules/base.xml.in.h:693
-msgid "Serbian (Z and ZHE swapped)"
-msgstr "Serbio (Z y ZHE intercambiados)"
+msgid "Serbian (Latin Unicode)"
+msgstr "Serbio (latino Unicode)"
#: ../rules/base.xml.in.h:694
-msgid "Serbian (with guillemets)"
-msgstr "Serbio (con guillemots)"
+msgid "Serbian (Latin qwerty)"
+msgstr "Serbio (latino qwerty)"
#: ../rules/base.xml.in.h:695
-msgid "Serbo-Croatian (US)"
-msgstr "Serbocroata (EE. UU.)"
+msgid "Serbian (Latin Unicode qwerty)"
+msgstr "Serbio (latino Unicode qwerty)"
#: ../rules/base.xml.in.h:696
-msgid "Shift cancels Caps Lock"
-msgstr "Mayús cancela Bloq Mayús"
+msgid "Serbian (Cyrillic with guillemets)"
+msgstr "Serbio (cirílico con guillemots)"
#: ../rules/base.xml.in.h:697
-msgid "Shift does not cancel Num Lock, chooses 3rd level instead"
-msgstr "Mayús no cancela Bloq Num, en su lugar elije el 3er nivel"
+msgid "Serbian (Latin with guillemets)"
+msgstr "Serbio (latino con guillemots)"
#: ../rules/base.xml.in.h:698
-msgid "Shift with numeric keypad keys works as in MS Windows"
-msgstr "Mayús con las teclas del teclado numérico funcionan como en MS Windows"
-
-#: ../rules/base.xml.in.h:699
-msgid "Shift+Caps Lock"
-msgstr "Mayús+Bloq Mayús"
+msgid "Pannonian Rusyn"
+msgstr "Rusino de Panonia"
+#. Keyboard indicator for Slovenian layouts
#: ../rules/base.xml.in.h:700
-msgid "Sindhi"
-msgstr "Sindhi"
+msgid "sl"
+msgstr "sl"
#: ../rules/base.xml.in.h:701
-msgid "Sinhala (phonetic)"
-msgstr "Cingalés (fonético)"
+msgid "Slovenian"
+msgstr "Esloveno"
#: ../rules/base.xml.in.h:702
+msgid "Slovenian (use guillemets for quotes)"
+msgstr "Esloveno (usar guillemots para comillas)"
+
+#: ../rules/base.xml.in.h:703
+msgid "Slovenian (US keyboard with Slovenian letters)"
+msgstr "Esloveno (teclado EE. UU. con letras eslovenas)"
+
+#. Keyboard indicator for Slovak layouts
+#: ../rules/base.xml.in.h:705 ../rules/base.extras.xml.in.h:107
+msgid "sk"
+msgstr "sk"
+
+#: ../rules/base.xml.in.h:706 ../rules/base.extras.xml.in.h:108
msgid "Slovak"
msgstr "Eslovaco"
-#: ../rules/base.xml.in.h:703
+#: ../rules/base.xml.in.h:707
msgid "Slovak (extended Backslash)"
msgstr "Eslovaco (contrabarra extendida)"
-#: ../rules/base.xml.in.h:704
+#: ../rules/base.xml.in.h:708
msgid "Slovak (qwerty)"
msgstr "Eslovaco (qwerty)"
-#: ../rules/base.xml.in.h:705
+#: ../rules/base.xml.in.h:709
msgid "Slovak (qwerty, extended Backslash)"
msgstr "Eslovaco (qwerty, contrabarra extendida)"
-#: ../rules/base.xml.in.h:706
-msgid "Slovenian"
-msgstr "Esloveno"
-
-#: ../rules/base.xml.in.h:707
-msgid "Slovenian (US keyboard with Slovenian letters)"
-msgstr "Esloveno (teclado EE. UU. con letras eslovenas)"
-
-#: ../rules/base.xml.in.h:708
-msgid "Slovenian (use guillemets for quotes)"
-msgstr "Esloveno (usar guillemots para comillas)"
-
-#: ../rules/base.xml.in.h:709
+#: ../rules/base.xml.in.h:710 ../rules/base.extras.xml.in.h:111
msgid "Spanish"
msgstr "Español"
-#: ../rules/base.xml.in.h:710
-msgid "Spanish (Dvorak)"
-msgstr "Español (Dvorak)"
-
#: ../rules/base.xml.in.h:711
-msgid "Spanish (Latin American)"
-msgstr "Español (latinoamericano)"
+msgid "Spanish (eliminate dead keys)"
+msgstr "Español (eliminar teclas muertas)"
#: ../rules/base.xml.in.h:712
-msgid "Spanish (Latin American, Sun dead keys)"
-msgstr "Español (latinoamericano, teclas muertas de Sun)"
+msgid "Spanish (include dead tilde)"
+msgstr "Español (incluir tilde muerta)"
#: ../rules/base.xml.in.h:713
-msgid "Spanish (Latin American, eliminate dead keys)"
-msgstr "Español (latinoamericano, eliminar teclas muertas)"
+msgid "Spanish (Sun dead keys)"
+msgstr "Español (teclas muertas de Sun)"
#: ../rules/base.xml.in.h:714
-msgid "Spanish (Latin American, include dead tilde)"
-msgstr "Español (latinoamericano, incluir tilde muerta)"
+msgid "Spanish (Dvorak)"
+msgstr "Español (Dvorak)"
#: ../rules/base.xml.in.h:715
-msgid "Spanish (Macintosh)"
-msgstr "Español (Macintosh)"
+msgid "Asturian (Spain, with bottom-dot H and bottom-dot L)"
+msgstr "Asturiano (España, con H y L con punto bajo)"
#: ../rules/base.xml.in.h:716
-msgid "Spanish (Sun dead keys)"
-msgstr "Español (teclas muertas de Sun)"
+msgid "Catalan (Spain, with middle-dot L)"
+msgstr "Catalán (España, con L con punto medio)"
#: ../rules/base.xml.in.h:717
-msgid "Spanish (eliminate dead keys)"
-msgstr "Español (eliminar teclas muertas)"
-
-#: ../rules/base.xml.in.h:718
-msgid "Spanish (include dead tilde)"
-msgstr "Español (incluir tilde muerta)"
+msgid "Spanish (Macintosh)"
+msgstr "Español (Macintosh)"
-#: ../rules/base.xml.in.h:719
-msgid "Special keys (Ctrl+Alt+&lt;key&gt;) handled in a server"
-msgstr "Teclas especiales (Ctrl+Alt+«tecla») manipuladas en un servidor"
+#. Keyboard indicator for Swedish layouts
+#: ../rules/base.xml.in.h:719 ../rules/base.extras.xml.in.h:113
+msgid "sv"
+msgstr "sv"
-#: ../rules/base.xml.in.h:720
-msgid "Sun Type 5/6"
-msgstr "Sun tipo 5/6"
+#: ../rules/base.xml.in.h:720 ../rules/base.extras.xml.in.h:114
+msgid "Swedish"
+msgstr "Sueco"
#: ../rules/base.xml.in.h:721
-msgid "Super Power Multimedia Keyboard"
-msgstr "Super Power Multimedia Keyboard"
+msgid "Swedish (eliminate dead keys)"
+msgstr "Sueco (eliminar teclas muertas)"
#: ../rules/base.xml.in.h:722
-msgid "Swahili (Kenya)"
-msgstr "Swahili (Kenia)"
+msgid "Swedish (Dvorak)"
+msgstr "Sueco (Dvorak)"
#: ../rules/base.xml.in.h:723
-msgid "Swahili (Tanzania)"
-msgstr "Swahili (Tanzania)"
+msgid "Russian (Sweden, phonetic)"
+msgstr "Ruso (sueco, fonético)"
#: ../rules/base.xml.in.h:724
-msgid "Swap Ctrl and Caps Lock"
-msgstr "Intercambiar Ctrl y Bloq Mayús"
+msgid "Russian (Sweden, phonetic, eliminate dead keys)"
+msgstr "Ruso (sueco, fonético, eliminar teclas muertas)"
#: ../rules/base.xml.in.h:725
-msgid "Swap ESC and Caps Lock"
-msgstr "Intercambiar ESC y Bloq Mayús"
+msgid "Northern Saami (Sweden)"
+msgstr "Lapón del norte (Suecia)"
#: ../rules/base.xml.in.h:726
-msgid "Swedish"
-msgstr "Sueco"
-
-#: ../rules/base.xml.in.h:727
-msgid "Swedish (Dvorak)"
-msgstr "Sueco (Dvorak)"
-
-#: ../rules/base.xml.in.h:728
msgid "Swedish (Macintosh)"
msgstr "Sueco (Macintosh)"
-#: ../rules/base.xml.in.h:729
+#: ../rules/base.xml.in.h:727
msgid "Swedish (Svdvorak)"
msgstr "Sueco (Svdvorak)"
+#: ../rules/base.xml.in.h:728
+msgid "Swedish Sign Language"
+msgstr "Lenguaje de signos sueco"
+
+#: ../rules/base.xml.in.h:729 ../rules/base.extras.xml.in.h:116
+msgid "German (Switzerland)"
+msgstr "Alemán (Suiza)"
+
#: ../rules/base.xml.in.h:730
-msgid "Swedish (eliminate dead keys)"
-msgstr "Sueco (eliminar teclas muertas)"
+msgid "German (Switzerland, legacy)"
+msgstr "Alemán (Suiza, arcaico)"
#: ../rules/base.xml.in.h:731
-msgid "Swedish Sign Language"
-msgstr "Lenguaje de signos sueco"
+msgid "German (Switzerland, eliminate dead keys)"
+msgstr "Alemán (Suiza, eliminar teclas muertas)"
#: ../rules/base.xml.in.h:732
-msgid "Symplon PaceBook (tablet PC)"
-msgstr "Symplon PaceBook (tablet PC)"
+msgid "German (Switzerland, Sun dead keys)"
+msgstr "Alemán (Suiza, teclas muertas de Sun)"
#: ../rules/base.xml.in.h:733
-msgid "Syriac"
-msgstr "Sirio"
+msgid "French (Switzerland)"
+msgstr "Francés (Suiza)"
#: ../rules/base.xml.in.h:734
-msgid "Syriac (phonetic)"
-msgstr "Sirio (fonético)"
+msgid "French (Switzerland, eliminate dead keys)"
+msgstr "Francés (Suiza, eliminar teclas muertas)"
#: ../rules/base.xml.in.h:735
-msgid "Taiwanese"
-msgstr "Taiwanés"
+msgid "French (Switzerland, Sun dead keys)"
+msgstr "Francés (Suiza, teclas muertas de Sun)"
#: ../rules/base.xml.in.h:736
-msgid "Taiwanese (indigenous)"
-msgstr "Taiwanés (autóctono)"
+msgid "French (Switzerland, Macintosh)"
+msgstr "Francés (Suiza, Macintosh)"
#: ../rules/base.xml.in.h:737
-msgid "Tajik"
-msgstr "Tajico"
+msgid "German (Switzerland, Macintosh)"
+msgstr "Alemán (Suiza, Macintosh)"
#: ../rules/base.xml.in.h:738
-msgid "Tajik (legacy)"
-msgstr "Tajico (heredado)"
-
-#: ../rules/base.xml.in.h:739
-msgid "Tamil"
-msgstr "Tamil"
+msgid "Arabic (Syria)"
+msgstr "Árabe (Siria)"
+#. Keyboard indicator for Syriac layouts
#: ../rules/base.xml.in.h:740
-msgid "Tamil (Sri Lanka, TAB Typewriter)"
-msgstr "Tamil (Sri Lanka, máquina de escribir TAB)"
+msgid "syc"
+msgstr "syc"
#: ../rules/base.xml.in.h:741
-msgid "Tamil (Sri Lanka, Unicode)"
-msgstr "Tamil (Sri Lanka, Unicode)"
+msgid "Syriac"
+msgstr "Sirio"
#: ../rules/base.xml.in.h:742
-msgid "Tamil (TAB typewriter)"
-msgstr "Tamil (máquina de escribir TAB)"
+msgid "Syriac (phonetic)"
+msgstr "Sirio (fonético)"
#: ../rules/base.xml.in.h:743
-msgid "Tamil (TSCII typewriter)"
-msgstr "Tamil (máquina de escribir TSCII)"
+msgid "Kurdish (Syria, Latin Q)"
+msgstr "Kurdo (Siria, latino Q)"
#: ../rules/base.xml.in.h:744
-msgid "Tamil (Unicode)"
-msgstr "Tamil (Unicode)"
+msgid "Kurdish (Syria, F)"
+msgstr "Kurdo (Siria, F)"
#: ../rules/base.xml.in.h:745
-msgid "Tamil (keyboard with numerals)"
-msgstr "Tamil (teclado con números)"
-
-#: ../rules/base.xml.in.h:746
-msgid "Targa Visionary 811"
-msgstr "Targa Visionary 811"
+msgid "Kurdish (Syria, Latin Alt-Q)"
+msgstr "Kurdo (Siria, latino Alt-Q)"
+#. Keyboard indicator for Tajik layouts
#: ../rules/base.xml.in.h:747
-msgid "Tatar"
-msgstr "Tatar"
+msgid "tg"
+msgstr "tg"
#: ../rules/base.xml.in.h:748
-msgid "Telugu"
-msgstr "Telugu"
+msgid "Tajik"
+msgstr "Tajico"
#: ../rules/base.xml.in.h:749
-msgid "Thai"
-msgstr "Tailandés"
-
-#: ../rules/base.xml.in.h:750
-msgid "Thai (Pattachote)"
-msgstr "Tailandés (Pattachote)"
+msgid "Tajik (legacy)"
+msgstr "Tajico (arcaico)"
+#. Keyboard indicator for Sinhala layouts
#: ../rules/base.xml.in.h:751
-msgid "Thai (TIS-820.2538)"
-msgstr "Tailandés (TIS-820.2538)"
+msgid "si"
+msgstr "si"
#: ../rules/base.xml.in.h:752
-msgid "Tibetan"
-msgstr "Tibetano"
+msgid "Sinhala (phonetic)"
+msgstr "Cingalés (fonético)"
#: ../rules/base.xml.in.h:753
-msgid "Tibetan (with ASCII numerals)"
-msgstr "Tibetano (con numerales ASCII)"
+msgid "Tamil (Sri Lanka, Unicode)"
+msgstr "Tamil (Sri Lanka, Unicode)"
#: ../rules/base.xml.in.h:754
-msgid "To the corresponding key in a Dvorak keyboard."
-msgstr "A la tecla correspondiente en un teclado Dvorak."
-
-#: ../rules/base.xml.in.h:755
-msgid "To the corresponding key in a Qwerty keyboard."
-msgstr "A la tecla correspondiente en un teclado Qwerty."
+msgid "Tamil (Sri Lanka, TAB Typewriter)"
+msgstr "Tamil (Sri Lanka, máquina de escribir TAB)"
+#. Keyboard indicator for Thai layouts
#: ../rules/base.xml.in.h:756
-msgid "Toggle PointerKeys with Shift + NumLock."
-msgstr "Cambiar las teclas de flechas con Mayús + Bloq Num"
+msgid "th"
+msgstr "th"
#: ../rules/base.xml.in.h:757
-msgid "Toshiba Satellite S3000"
-msgstr "Toshiba Satellite S3000"
+msgid "Thai"
+msgstr "Tailandés"
#: ../rules/base.xml.in.h:758
-msgid "Trust Direct Access Keyboard"
-msgstr "Trust Direct Access Keyboard"
+msgid "Thai (TIS-820.2538)"
+msgstr "Tailandés (TIS-820.2538)"
#: ../rules/base.xml.in.h:759
-msgid "Trust Slimline"
-msgstr "Trust Slimline"
-
-#: ../rules/base.xml.in.h:760
-msgid "Trust Wireless Keyboard Classic"
-msgstr "Trust Wireless Keyboard Classic"
+msgid "Thai (Pattachote)"
+msgstr "Tailandés (Pattachote)"
-#: ../rules/base.xml.in.h:761
-msgid "Tswana"
-msgstr "Tswana"
+#. Keyboard indicator for Turkish layouts
+#: ../rules/base.xml.in.h:761 ../rules/base.extras.xml.in.h:119
+msgid "tr"
+msgstr "tr"
-#: ../rules/base.xml.in.h:762
+#: ../rules/base.xml.in.h:762 ../rules/base.extras.xml.in.h:120
msgid "Turkish"
msgstr "Turco"
#: ../rules/base.xml.in.h:763
-msgid "Turkish (Alt-Q)"
-msgstr "Turco (Alt-Q)"
-
-#: ../rules/base.xml.in.h:764
msgid "Turkish (F)"
msgstr "Turco (F)"
+#: ../rules/base.xml.in.h:764
+msgid "Turkish (Alt-Q)"
+msgstr "Turco (Alt-Q)"
+
#: ../rules/base.xml.in.h:765
msgid "Turkish (Sun dead keys)"
msgstr "Turco (teclas muertas de Sun)"
#: ../rules/base.xml.in.h:766
-msgid "Turkish (international with dead keys)"
-msgstr "Turco (internacional con teclas muertas)"
+msgid "Kurdish (Turkey, Latin Q)"
+msgstr "Kurdo (Turquía, latino Q)"
#: ../rules/base.xml.in.h:767
-msgid "Turkmen"
-msgstr "Turkmenistano"
+msgid "Kurdish (Turkey, F)"
+msgstr "Kurdo (Turquía, F)"
#: ../rules/base.xml.in.h:768
-msgid "Turkmen (Alt-Q)"
-msgstr "Turkmenistano (Alt-Q)"
+msgid "Kurdish (Turkey, Latin Alt-Q)"
+msgstr "Kurdo (Turquía, latino Alt-Q)"
#: ../rules/base.xml.in.h:769
-msgid "TypeMatrix EZ-Reach 2020"
-msgstr "TypeMatrix EZ-Reach 2020"
-
-#: ../rules/base.xml.in.h:770
-msgid "TypeMatrix EZ-Reach 2030 PS2"
-msgstr "TypeMatrix EZ-Reach 2030 PS2"
+msgid "Turkish (international with dead keys)"
+msgstr "Turco (internacional con teclas muertas)"
-#: ../rules/base.xml.in.h:771
-msgid "TypeMatrix EZ-Reach 2030 USB"
-msgstr "TypeMatrix EZ-Reach 2030 USB"
+#. Keyboard indicator for Crimean Tatar layouts
+#: ../rules/base.xml.in.h:771 ../rules/base.extras.xml.in.h:48
+msgid "crh"
+msgstr "crh"
#: ../rules/base.xml.in.h:772
-msgid "TypeMatrix EZ-Reach 2030 USB (102/105:EU mode)"
-msgstr "TypeMatrix EZ-Reach 2030 USB (102/105:modo EU)"
+msgid "Crimean Tatar (Turkish Q)"
+msgstr "Tártaro de Crimea (Q turca)"
#: ../rules/base.xml.in.h:773
-msgid "TypeMatrix EZ-Reach 2030 USB (106:JP mode)"
-msgstr "TypeMatrix EZ-Reach 2030 USB (106:modo JP)"
+msgid "Crimean Tatar (Turkish F)"
+msgstr "Tártaro de Crimea (F turca)"
#: ../rules/base.xml.in.h:774
-msgid "Udmurt"
-msgstr "Udmurto"
+msgid "Crimean Tatar (Turkish Alt-Q)"
+msgstr "Tártaro de Crimea (Alt-Q turca)"
#: ../rules/base.xml.in.h:775
-msgid "Ukrainian"
-msgstr "Ucraniano"
+msgid "Taiwanese"
+msgstr "Taiwanés"
#: ../rules/base.xml.in.h:776
-msgid "Ukrainian (WinKeys)"
-msgstr "Ucraniano (teclas Windows)"
-
-#: ../rules/base.xml.in.h:777
-msgid "Ukrainian (homophonic)"
-msgstr "Ucraniano (homofónico)"
+msgid "Taiwanese (indigenous)"
+msgstr "Taiwanés (autóctono)"
+#. Keyboard indicator for Saisiyat layouts
#: ../rules/base.xml.in.h:778
-msgid "Ukrainian (legacy)"
-msgstr "Ucraniano (heredado)"
+msgid "xsy"
+msgstr "xsy"
#: ../rules/base.xml.in.h:779
-msgid "Ukrainian (phonetic)"
-msgstr "Ucraniano (fonético)"
-
-#: ../rules/base.xml.in.h:780
-msgid "Ukrainian (standard RSTU)"
-msgstr "Ucraniano (estándar RSTU)"
+msgid "Saisiyat (Taiwan)"
+msgstr "Saisiyat (Taiwán)"
-#: ../rules/base.xml.in.h:781
-msgid "Ukrainian (typewriter)"
-msgstr "Ucraniano (máquina de escribir)"
+#. Keyboard indicator for Ukranian layouts
+#: ../rules/base.xml.in.h:781 ../rules/base.extras.xml.in.h:122
+msgid "uk"
+msgstr "uk"
-#: ../rules/base.xml.in.h:782
-msgid "Unicode additions (arrows and math operators)"
-msgstr "Adiciones Unicode (flechas y operadores matemáticos)"
+#: ../rules/base.xml.in.h:782 ../rules/base.extras.xml.in.h:123
+msgid "Ukrainian"
+msgstr "Ucraniano"
#: ../rules/base.xml.in.h:783
-msgid "Unicode additions (arrows and math operators). Math operators on default level"
-msgstr "Adiciones Unicode (flechas y operadores matemáticos); operadores matemáticos en el nivel predeterminado"
+msgid "Ukrainian (phonetic)"
+msgstr "Ucraniano (fonético)"
#: ../rules/base.xml.in.h:784
-msgid "Unitek KB-1925"
-msgstr "Unitek KB-1925"
+msgid "Ukrainian (typewriter)"
+msgstr "Ucraniano (máquina de escribir)"
#: ../rules/base.xml.in.h:785
-msgid "Urdu (Pakistan)"
-msgstr "Urdu (Pakistán)"
+msgid "Ukrainian (WinKeys)"
+msgstr "Ucraniano (teclas Windows)"
#: ../rules/base.xml.in.h:786
-msgid "Urdu (Pakistan, CRULP)"
-msgstr "Urdu (Pakistán, CRULP)"
+msgid "Ukrainian (legacy)"
+msgstr "Ucraniano (arcaico)"
#: ../rules/base.xml.in.h:787
-msgid "Urdu (Pakistan, NLA)"
-msgstr "Urdu (Pakistán, NLA)"
+msgid "Ukrainian (standard RSTU)"
+msgstr "Ucraniano (estándar RSTU)"
#: ../rules/base.xml.in.h:788
-msgid "Urdu (WinKeys)"
-msgstr "Urdu (teclas Windows)"
+msgid "Russian (Ukraine, standard RSTU)"
+msgstr "Ruso (ucraniano estándar RSTU)"
#: ../rules/base.xml.in.h:789
-msgid "Urdu (alternative phonetic)"
-msgstr "Urdu (fonético alternativo)"
+msgid "Ukrainian (homophonic)"
+msgstr "Ucraniano (homofónico)"
-#: ../rules/base.xml.in.h:790
-msgid "Urdu (phonetic)"
-msgstr "Urdu (fonético)"
+#: ../rules/base.xml.in.h:790 ../rules/base.extras.xml.in.h:125
+msgid "English (UK)"
+msgstr "Inglés (RU)"
#: ../rules/base.xml.in.h:791
-msgid "Use keyboard LED to show alternative layout"
-msgstr "Usar LED del teclado para mostrar la distribución alternativa"
+msgid "English (UK, extended WinKeys)"
+msgstr "Inglés (RU, extendido con teclas Windows)"
#: ../rules/base.xml.in.h:792
-msgid "Using space key to input non-breakable space character"
-msgstr "Usando la tecla espacio para introducir un carácter de espacio no separable"
+msgid "English (UK, international with dead keys)"
+msgstr "Inglés (RU, internacional con teclas muertas)"
#: ../rules/base.xml.in.h:793
-msgid "Usual space at any level"
-msgstr "Espacio usual en cualquier nivel"
+msgid "English (UK, Dvorak)"
+msgstr "Inglés (RU, Dvorak)"
#: ../rules/base.xml.in.h:794
-msgid "Uyghur"
-msgstr "Uigur"
+msgid "English (UK, Dvorak with UK punctuation)"
+msgstr "Inglés (RU, Dvorak con puntuación para RU)"
#: ../rules/base.xml.in.h:795
-msgid "Uzbek"
-msgstr "Uzbeco"
+msgid "English (UK, Macintosh)"
+msgstr "Inglés (RU, Macintosh)"
#: ../rules/base.xml.in.h:796
-msgid "Uzbek (Afghanistan)"
-msgstr "Uzbeco (Afganistán)"
+msgid "English (UK, Macintosh international)"
+msgstr "Inglés (RU, Macintosh internacional)"
#: ../rules/base.xml.in.h:797
-msgid "Uzbek (Afghanistan, OLPC)"
-msgstr "Uzbeco (Afganistán, OLPC)"
+msgid "English (UK, Colemak)"
+msgstr "Inglés (RU, Colemak)"
#: ../rules/base.xml.in.h:798
-msgid "Uzbek (Latin)"
-msgstr "Uzbeco (latino)"
+msgid "Uzbek"
+msgstr "Uzbeco"
#: ../rules/base.xml.in.h:799
-msgid "Vietnamese"
-msgstr "Vietnamita"
-
-#: ../rules/base.xml.in.h:800
-msgid "ViewSonic KU-306 Internet Keyboard"
-msgstr "Teclado para internet ViewSonic KU-306"
+msgid "Uzbek (Latin)"
+msgstr "Uzbeco (latino)"
+#. Keyboard indicator for Vietnamese layouts
#: ../rules/base.xml.in.h:801
-msgid "Wang 724 keypad with Unicode additions (arrows and math operators)"
-msgstr "Teclado numérico Wang 724 con adiciones Unicode (flechas y operadores matemáticos)"
+msgid "vi"
+msgstr "vi"
#: ../rules/base.xml.in.h:802
-msgid "Wang 724 keypad with Unicode additions (arrows and math operators). Math operators on default level"
-msgstr "Teclado numérico Wang 724 con adiciones Unicode (flechas y operadores matemáticos); operadores matemáticos en el nivel predeterminado"
-
-#: ../rules/base.xml.in.h:803
-msgid "Winbook Model XP5"
-msgstr "Winbook Model XP5"
+msgid "Vietnamese"
+msgstr "Vietnamita"
-#: ../rules/base.xml.in.h:804
-msgid "Wolof"
-msgstr "Wolof"
+#. Keyboard indicator for Korean layouts
+#: ../rules/base.xml.in.h:804 ../rules/base.extras.xml.in.h:127
+msgid "ko"
+msgstr "ko"
-#: ../rules/base.xml.in.h:805
-msgid "Yahoo! Internet Keyboard"
-msgstr "Yahoo! Internet Keyboard"
+#: ../rules/base.xml.in.h:805 ../rules/base.extras.xml.in.h:128
+msgid "Korean"
+msgstr "Coreano"
#: ../rules/base.xml.in.h:806
-msgid "Yakut"
-msgstr "Yakuto"
+msgid "Korean (101/104 key compatible)"
+msgstr "Coreano (101/104 teclas compatible)"
#: ../rules/base.xml.in.h:807
-msgid "Yoruba"
-msgstr "Yoruba"
-
-#: ../rules/base.xml.in.h:808
-msgid "Zero-width non-joiner character at second level"
-msgstr "Carácer de espacio irrompible de anchura cero («ZWNJ») en el segundo nivel"
+msgid "Japanese (PC-98xx Series)"
+msgstr "Japonés (series PC-98xx)"
+#. Keyboard indicator for Irish layouts
#: ../rules/base.xml.in.h:809
-msgid "Zero-width non-joiner character at second level, non-breakable space character at third level"
-msgstr "Carácer de espacio irrompible de anchura cero («ZWNJ») en el segundo nivel, carácter de espacio no separable en el tercer nivel"
+msgid "ie"
+msgstr "ie"
#: ../rules/base.xml.in.h:810
-msgid "Zero-width non-joiner character at second level, non-breakable space character at third level, nothing at fourth level"
-msgstr "Carácer de espacio irrompible de anchura cero («ZWNJ») en el segundo nivel, carácter de espacio no separable en el tercer nivel, nada en el cuarto nivel"
+msgid "Irish"
+msgstr "Irlandés"
#: ../rules/base.xml.in.h:811
-msgid "Zero-width non-joiner character at second level, non-breakable space character at third level, thin non-breakable space at fourth level"
-msgstr "Carácer de espacio irrompible de anchura cero («ZWNJ») en el segundo nivel, carácter de espacio no separable en el tercer nivel, espacio estrecho no separable en el cuarto nivel"
+msgid "CloGaelach"
+msgstr "Cló Gaelach"
#: ../rules/base.xml.in.h:812
-msgid "Zero-width non-joiner character at second level, non-breakable space character at third level, zero-width joiner at fourth level"
-msgstr "Carácer de espacio irrompible de anchura cero («ZWNJ») en el segundo nivel, carácter de espacio no separable en el tercer nivel, espacio de anchura cero rompible («ZWJ») en el cuarto nivel"
+msgid "Irish (UnicodeExpert)"
+msgstr "Irlandés (UnicodeExperto)"
#: ../rules/base.xml.in.h:813
-msgid "Zero-width non-joiner character at second level, zero-width joiner character at third level"
-msgstr "Carácer de espacio irrompible de anchura cero («ZWNJ») en el segundo nivel, carácter de espacio de anchura cero rompible («ZWJ») en el tercer nivel"
+msgid "Ogham"
+msgstr "Ogham"
#: ../rules/base.xml.in.h:814
-msgid "Zero-width non-joiner character at second level, zero-width joiner character at third level, non-breakable space character at fourth level"
-msgstr "Carácer de espacio irrompible de anchura cero («ZWNJ») en el segundo nivel, carácter de espacio de anchura cero rompible («ZWJ») en el tercer nivel, caracter de espacio no separable en el cuarto nivel"
+msgid "Ogham (IS434)"
+msgstr "Ogam (IS434)"
#: ../rules/base.xml.in.h:815
-msgid "Zero-width non-joiner character at third level, zero-width joiner at fourth level"
-msgstr "Carácer de espacio irrompible de anchura cero («ZWNJ») en el tercer nivel, carácter de anchura cero rompible («ZWJ») en el cuarto nivel"
+msgid "Urdu (Pakistan)"
+msgstr "Urdu (Pakistán)"
#: ../rules/base.xml.in.h:816
-msgid "ak"
-msgstr "ak"
+msgid "Urdu (Pakistan, CRULP)"
+msgstr "Urdu (Pakistán, CRULP)"
#: ../rules/base.xml.in.h:817
-msgid "am"
-msgstr "am"
+msgid "Urdu (Pakistan, NLA)"
+msgstr "Urdu (Pakistán, NLA)"
#: ../rules/base.xml.in.h:818
-msgid "ar"
-msgstr "ar"
-
-#: ../rules/base.xml.in.h:819
-msgid "avn"
-msgstr "avn"
+msgid "Arabic (Pakistan)"
+msgstr "Árabe (Pakistán)"
+#. Keyboard indicator for Sindhi layouts
#: ../rules/base.xml.in.h:820
-msgid "az"
-msgstr "az"
+msgid "sd"
+msgstr "sd"
#: ../rules/base.xml.in.h:821
-msgid "be"
-msgstr "be"
-
-#: ../rules/base.xml.in.h:822
-msgid "ber"
-msgstr "ber"
+msgid "Sindhi"
+msgstr "Sindhi"
+#. Keyboard indicator for Dhivehi layouts
#: ../rules/base.xml.in.h:823
-msgid "bg"
-msgstr "bg"
+msgid "dv"
+msgstr "dv"
#: ../rules/base.xml.in.h:824
-msgid "bm"
-msgstr "bm"
+msgid "Dhivehi"
+msgstr "Dhivehi"
#: ../rules/base.xml.in.h:825
-msgid "bn"
-msgstr "bn"
-
-#: ../rules/base.xml.in.h:826
-msgid "brl"
-msgstr "brl"
+msgid "English (South Africa)"
+msgstr "Inglés (Sudáfrica)"
+#. Keyboard indicator for Esperanto layouts
#: ../rules/base.xml.in.h:827
-msgid "bs"
-msgstr "bs"
+msgid "eo"
+msgstr "eo"
#: ../rules/base.xml.in.h:828
-msgid "ca"
-msgstr "ca"
+msgid "Esperanto"
+msgstr "Esperanto"
#: ../rules/base.xml.in.h:829
-msgid "chr"
-msgstr "chr"
-
-#: ../rules/base.xml.in.h:830
-msgid "cm"
-msgstr "cm"
+msgid "Esperanto (displaced semicolon and quote, obsolete)"
+msgstr "Estonio (punto y coma y comilla desplazadas, obsoleto)"
-#: ../rules/base.xml.in.h:831 ../rules/base.extras.xml.in.h:38
-msgid "crh"
-msgstr "crh"
+#. Keyboard indicator for Nepali layouts
+#: ../rules/base.xml.in.h:831
+msgid "ne"
+msgstr "ne"
#: ../rules/base.xml.in.h:832
-msgid "cs"
-msgstr "cs"
+msgid "Nepali"
+msgstr "Nepalí"
#: ../rules/base.xml.in.h:833
-msgid "da"
-msgstr "da"
-
-#: ../rules/base.xml.in.h:834 ../rules/base.extras.xml.in.h:39
-msgid "de"
-msgstr "de"
+msgid "English (Nigeria)"
+msgstr "Inglés (Nigeria)"
+#. Keyboard indicator for Igbo layouts
#: ../rules/base.xml.in.h:835
-msgid "dv"
-msgstr "dv"
+msgid "ig"
+msgstr "ig"
#: ../rules/base.xml.in.h:836
-msgid "dz"
-msgstr "dz"
-
-#: ../rules/base.xml.in.h:837
-msgid "ee"
-msgstr "ee"
+msgid "Igbo"
+msgstr "Igbo"
-#: ../rules/base.xml.in.h:838 ../rules/base.extras.xml.in.h:40
-msgid "en"
-msgstr "en"
+#. Keyboard indicator for Yoruba layouts
+#: ../rules/base.xml.in.h:838
+msgid "yo"
+msgstr "yo"
#: ../rules/base.xml.in.h:839
-msgid "eo"
-msgstr "eo"
-
-#: ../rules/base.xml.in.h:840
-msgid "es"
-msgstr "es"
+msgid "Yoruba"
+msgstr "Yoruba"
+#. Keyboard indicator for Amharic layouts
#: ../rules/base.xml.in.h:841
-msgid "et"
-msgstr "et"
-
-#: ../rules/base.xml.in.h:842 ../rules/base.extras.xml.in.h:41
-msgid "fa"
-msgstr "fa"
+msgid "am"
+msgstr "am"
-#: ../rules/base.xml.in.h:843
-msgid "ff"
-msgstr "ff"
+#: ../rules/base.xml.in.h:842
+msgid "Amharic"
+msgstr "Amharico"
+#. Keyboard indicator for Wolof layouts
#: ../rules/base.xml.in.h:844
-msgid "fi"
-msgstr "fi"
+msgid "wo"
+msgstr "wo"
#: ../rules/base.xml.in.h:845
-msgid "fo"
-msgstr "fo"
-
-#: ../rules/base.xml.in.h:846 ../rules/base.extras.xml.in.h:42
-msgid "fr"
-msgstr "fr"
+msgid "Wolof"
+msgstr "Wolof"
+#. Keyboard indicator for Braille layouts
#: ../rules/base.xml.in.h:847
-msgid "gaa"
-msgstr "gaa"
+msgid "brl"
+msgstr "brl"
#: ../rules/base.xml.in.h:848
-msgid "gr"
-msgstr "gr"
+msgid "Braille"
+msgstr "Braille"
#: ../rules/base.xml.in.h:849
-msgid "gu"
-msgstr "gu"
+msgid "Braille (left hand)"
+msgstr "Braille (zurdo)"
#: ../rules/base.xml.in.h:850
-msgid "ha"
-msgstr "ha"
-
-#: ../rules/base.xml.in.h:851
-msgid "he"
-msgstr "he"
+msgid "Braille (right hand)"
+msgstr "Braille (diestro)"
+#. Keyboard indicator for Turkmen layouts
#: ../rules/base.xml.in.h:852
-msgid "hi"
-msgstr "hi"
+msgid "tk"
+msgstr "tk"
#: ../rules/base.xml.in.h:853
-msgid "hr"
-msgstr "hr"
+msgid "Turkmen"
+msgstr "Turkmenistano"
#: ../rules/base.xml.in.h:854
-msgid "hu"
-msgstr "hu"
-
-#: ../rules/base.xml.in.h:855 ../rules/base.extras.xml.in.h:43
-msgid "hy"
-msgstr "hy"
+msgid "Turkmen (Alt-Q)"
+msgstr "Turkmenistano (Alt-Q)"
+#. Keyboard indicator for Bambara layouts
#: ../rules/base.xml.in.h:856
-msgid "ie"
-msgstr "ie"
+msgid "bm"
+msgstr "bm"
#: ../rules/base.xml.in.h:857
-msgid "ig"
-msgstr "ig"
+msgid "Bambara"
+msgstr "Bambara"
#: ../rules/base.xml.in.h:858
-msgid "ike"
-msgstr "ike"
+msgid "French (Mali, alternative)"
+msgstr "Francés (Malí, alternativo)"
#: ../rules/base.xml.in.h:859
-msgid "in"
-msgstr "in"
+msgid "English (Mali, US Macintosh)"
+msgstr "Inglés (Malí, Macintosh de EE. UU.)"
#: ../rules/base.xml.in.h:860
-msgid "is"
-msgstr "is"
-
-#: ../rules/base.xml.in.h:861
-msgid "it"
-msgstr "it"
+msgid "English (Mali, US international)"
+msgstr "Inglés (Malí, EE. UU. internacional)"
+#. Keyboard indicator for Swahili layouts
#: ../rules/base.xml.in.h:862
-msgid "ja"
-msgstr "ja"
+msgid "sw"
+msgstr "sw"
#: ../rules/base.xml.in.h:863
-msgid "ka"
-msgstr "ka"
+msgid "Swahili (Tanzania)"
+msgstr "Swahili (Tanzania)"
#: ../rules/base.xml.in.h:864
-msgid "ki"
-msgstr "ki"
+msgid "Swahili (Kenya)"
+msgstr "Swahili (Kenia)"
#: ../rules/base.xml.in.h:865
-msgid "kk"
-msgstr "kk"
-
-#: ../rules/base.xml.in.h:866
-msgid "km"
-msgstr "km"
+msgid "Kikuyu"
+msgstr "kikuyu"
+#. Keyboard indicator for Tswana layouts
#: ../rules/base.xml.in.h:867
-msgid "kn"
-msgstr "kn"
+msgid "tn"
+msgstr "tn"
#: ../rules/base.xml.in.h:868
-msgid "ko"
-msgstr "ko"
-
-#: ../rules/base.xml.in.h:869
-msgid "ku"
-msgstr "ku"
+msgid "Tswana"
+msgstr "Tswana"
+#. Keyboard indicator for Filipino layouts
#: ../rules/base.xml.in.h:870
-msgid "lo"
-msgstr "lo"
+msgid "ph"
+msgstr "ph"
-#: ../rules/base.xml.in.h:871 ../rules/base.extras.xml.in.h:45
-msgid "lt"
-msgstr "lt"
+#: ../rules/base.xml.in.h:871
+msgid "Filipino"
+msgstr "Filipino"
-#: ../rules/base.xml.in.h:872 ../rules/base.extras.xml.in.h:46
-msgid "lv"
-msgstr "lv"
+#: ../rules/base.xml.in.h:872
+msgid "Filipino (QWERTY Baybayin)"
+msgstr "Filipino (QWERTY baybayin)"
#: ../rules/base.xml.in.h:873
-msgid "mi"
-msgstr "mi"
+msgid "Filipino (Capewell-Dvorak Latin)"
+msgstr "Filipino (Capewell-Dvorak latino)"
#: ../rules/base.xml.in.h:874
-msgid "mk"
-msgstr "mk"
+msgid "Filipino (Capewell-Dvorak Baybayin)"
+msgstr "Filipino (Capewell-Dvorak baybayin)"
#: ../rules/base.xml.in.h:875
-msgid "ml"
-msgstr "ml"
+msgid "Filipino (Capewell-QWERF 2006 Latin)"
+msgstr "Filipino (Capewell-QWERF 2006 latino)"
#: ../rules/base.xml.in.h:876
-msgid "mn"
-msgstr "mn"
+msgid "Filipino (Capewell-QWERF 2006 Baybayin)"
+msgstr "Filipino (Capewell-QWERF 2006 baybayin)"
#: ../rules/base.xml.in.h:877
-msgid "mt"
-msgstr "mt"
+msgid "Filipino (Colemak Latin)"
+msgstr "Filipino (Colemak latino)"
#: ../rules/base.xml.in.h:878
-msgid "my"
-msgstr "my"
+msgid "Filipino (Colemak Baybayin)"
+msgstr "Filipino (Colemak baybayin)"
#: ../rules/base.xml.in.h:879
-msgid "ne"
-msgstr "ne"
+msgid "Filipino (Dvorak Latin)"
+msgstr "Filipino (Dvorak latino)"
#: ../rules/base.xml.in.h:880
-msgid "nl"
-msgstr "nl"
+msgid "Filipino (Dvorak Baybayin)"
+msgstr "Filipino (Dvorak baybayin)"
#: ../rules/base.xml.in.h:881
-msgid "no"
-msgstr "no"
+msgid "md"
+msgstr "md"
#: ../rules/base.xml.in.h:882
-msgid "or"
-msgstr "or"
+msgid "Moldavian"
+msgstr "Moldavo"
#: ../rules/base.xml.in.h:883
-msgid "pa"
-msgstr "pa"
+msgid "gag"
+msgstr "gag"
#: ../rules/base.xml.in.h:884
-msgid "ph"
-msgstr "ph"
+msgid "Moldavian (Gagauz)"
+msgstr "Moldavo (Gagauzia)"
-#: ../rules/base.xml.in.h:885 ../rules/base.extras.xml.in.h:47
-msgid "pl"
-msgstr "pl"
+#: ../rules/base.xml.in.h:885
+msgid "Switching to another layout"
+msgstr "Cambiar a otra distribución"
#: ../rules/base.xml.in.h:886
-msgid "ps"
-msgstr "ps"
+msgid "Right Alt (while pressed)"
+msgstr "Alt derecho (mientras está pulsado)"
#: ../rules/base.xml.in.h:887
-msgid "pt"
-msgstr "pt"
+msgid "Left Alt (while pressed)"
+msgstr "Alt izquierdo (mientras está pulsado)"
-#: ../rules/base.xml.in.h:888 ../rules/base.extras.xml.in.h:48
-msgid "ro"
-msgstr "ro"
+#: ../rules/base.xml.in.h:888
+msgid "Left Win (while pressed)"
+msgstr "Tecla Windows izquierda (al pulsarla)"
-#: ../rules/base.xml.in.h:889 ../rules/base.extras.xml.in.h:49
-msgid "ru"
-msgstr "ru"
+#: ../rules/base.xml.in.h:889
+msgid "Right Win (while pressed)"
+msgstr "La tecla Windows (mientras está pulsada)"
#: ../rules/base.xml.in.h:890
-msgid "sd"
-msgstr "sd"
+msgid "Any Win key (while pressed)"
+msgstr "Cualquier tecla Windows (al pulsarla)"
#: ../rules/base.xml.in.h:891
-msgid "si"
-msgstr "si"
+msgid "Caps Lock (while pressed), Alt+Caps Lock does the original capslock action"
+msgstr "Bloq Mayús (al pulsarse), Alt+Bloq Mayús realiza la acción original de bloqueo de mayúsculas"
#: ../rules/base.xml.in.h:892
-msgid "sk"
-msgstr "sk"
+msgid "Right Ctrl (while pressed)"
+msgstr "Ctrl derecho (mientras está pulsado)"
#: ../rules/base.xml.in.h:893
-msgid "sl"
-msgstr "sl"
+msgid "Right Alt"
+msgstr "Alt derecho"
#: ../rules/base.xml.in.h:894
-msgid "sq"
-msgstr "sq"
+msgid "Left Alt"
+msgstr "Alt izquierdo"
-#: ../rules/base.xml.in.h:895 ../rules/base.extras.xml.in.h:51
-msgid "sr"
-msgstr "sr"
+#: ../rules/base.xml.in.h:895
+msgid "Caps Lock"
+msgstr "Bloqueo de mayúsculas"
#: ../rules/base.xml.in.h:896
-msgid "sv"
-msgstr "sv"
+msgid "Shift+Caps Lock"
+msgstr "Mayús+Bloq Mayús"
#: ../rules/base.xml.in.h:897
-msgid "sw"
-msgstr "sw"
+msgid "Caps Lock (to first layout), Shift+Caps Lock (to last layout)"
+msgstr "Bloq Mayús (a la primera distribución), Mayús+Bloq Mayús (a la última distribución)"
#: ../rules/base.xml.in.h:898
-msgid "syc"
-msgstr "syc"
+msgid "Left Win (to first layout), Right Win/Menu (to last layout)"
+msgstr "Win izquierdo (a la primera distribución), Win/Menu derecho (a la última distribución)"
#: ../rules/base.xml.in.h:899
-msgid "ta"
-msgstr "ta"
+msgid "Left Ctrl (to first layout), Right Ctrl (to last layout)"
+msgstr "Ctrl izquierdo (a la primera distribución), Ctrl derecho (a la última distribución)"
#: ../rules/base.xml.in.h:900
-msgid "te"
-msgstr "te"
+msgid "Alt+Caps Lock"
+msgstr "Alt+Bloq Mayús"
#: ../rules/base.xml.in.h:901
-msgid "tg"
-msgstr "tg"
+msgid "Both Shift keys together"
+msgstr "Ambas teclas Mayús juntas"
#: ../rules/base.xml.in.h:902
-msgid "th"
-msgstr "th"
+msgid "Both Alt keys together"
+msgstr "Ambas teclas Alt juntas"
#: ../rules/base.xml.in.h:903
-msgid "tk"
-msgstr "tk"
+msgid "Both Ctrl keys together"
+msgstr "Ambas teclas Ctrl juntas"
#: ../rules/base.xml.in.h:904
-msgid "tn"
-msgstr "tn"
+msgid "Ctrl+Shift"
+msgstr "Ctrl+Mayús"
#: ../rules/base.xml.in.h:905
-msgid "tr"
-msgstr "tr"
+msgid "Left Ctrl+Left Shift"
+msgstr "Ctrl izquierdo + Mayús izquierdo"
#: ../rules/base.xml.in.h:906
-msgid "uk"
-msgstr "uk"
+msgid "Right Ctrl+Right Shift"
+msgstr "Ctrl derecho + Mayús derecho"
#: ../rules/base.xml.in.h:907
-msgid "ur"
-msgstr "ur"
+msgid "Alt+Ctrl"
+msgstr "Alt+Ctrl"
#: ../rules/base.xml.in.h:908
-msgid "uz"
-msgstr "uz"
+msgid "Alt+Shift"
+msgstr "Alt+Mayús"
#: ../rules/base.xml.in.h:909
-msgid "vi"
-msgstr "vi"
+msgid "Left Alt+Left Shift"
+msgstr "Alt izquierdo + Mayús izquierdo"
#: ../rules/base.xml.in.h:910
-msgid "wo"
-msgstr "wo"
+msgid "Alt+Space"
+msgstr "Alt+Espacio"
#: ../rules/base.xml.in.h:911
-msgid "xsy"
-msgstr "xsy"
+msgid "Menu"
+msgstr "Menu"
#: ../rules/base.xml.in.h:912
-msgid "yo"
-msgstr "yo"
+msgid "Left Win"
+msgstr "Win izquierdo"
#: ../rules/base.xml.in.h:913
-msgid "zh"
-msgstr "zh"
+msgid "Right Win"
+msgstr "Windows derecho"
-#: ../rules/base.extras.xml.in.h:1
-msgid "APL Keyboard Symbols"
-msgstr "Símbolos de teclado APL"
+#: ../rules/base.xml.in.h:914
+msgid "Left Shift"
+msgstr "Mayús izquierdo"
-#: ../rules/base.extras.xml.in.h:3
-msgid "Armenian (OLPC phonetic)"
-msgstr "Armenio (OLPC fonético)"
+#: ../rules/base.xml.in.h:915
+msgid "Right Shift"
+msgstr "Mayús derecho"
-#: ../rules/base.extras.xml.in.h:4
-msgid "Atsina"
-msgstr "Atsina"
+#: ../rules/base.xml.in.h:916
+msgid "Left Ctrl"
+msgstr "Ctrl izquierdo"
+
+#: ../rules/base.xml.in.h:917
+msgid "Right Ctrl"
+msgstr "Ctrl derecho"
+
+#: ../rules/base.xml.in.h:918
+msgid "Scroll Lock"
+msgstr "Bloq Despl"
+
+#: ../rules/base.xml.in.h:919
+msgid "LeftCtrl+LeftWin (to first layout), RightCtrl+Menu (to second layout)"
+msgstr "Ctrl izquierdo + Ctrl derecho (a la primera distribución), Ctrl derecho + Menú (a la segunda distribución)"
+
+#: ../rules/base.xml.in.h:920
+msgid "Key to choose 3rd level"
+msgstr "Tecla para seleccionar el tercer nivel"
+
+#: ../rules/base.xml.in.h:921
+msgid "Any Win key"
+msgstr "Cualquier tecla Windows"
+
+#: ../rules/base.xml.in.h:922
+msgid "Any Alt key"
+msgstr "Cualquier tecla Alt"
+
+#: ../rules/base.xml.in.h:923
+msgid "Right Alt, Shift+Right Alt key is Compose"
+msgstr "La tecla Alt derecho, Mayús+Alt derecho es tecla Componer"
+
+#: ../rules/base.xml.in.h:924
+msgid "Right Alt key never chooses 3rd level"
+msgstr "La tecla Alt derecho nunca elige el tercer nivel"
+
+#: ../rules/base.xml.in.h:925
+msgid "Enter on keypad"
+msgstr "Intro en el teclado numérico"
+
+#: ../rules/base.xml.in.h:926
+msgid "Backslash"
+msgstr "Contrabarra"
+
+#: ../rules/base.xml.in.h:927
+msgid "&lt;Less/Greater&gt;"
+msgstr "&lt;Menor que/Mayor que&gt;"
+
+#: ../rules/base.xml.in.h:928
+msgid "Caps Lock chooses 3rd level, acts as onetime lock when pressed together with another 3rd-level-chooser"
+msgstr "Bloq Mayús elige el tercer nivel, actúa como un bloqueo de una sola vez al pulsarse junto con otro selector de tercer nivel"
+
+#: ../rules/base.xml.in.h:929
+msgid "Backslash chooses 3rd level, acts as onetime lock when pressed together with another 3rd-level-chooser"
+msgstr "Contrabarra elige el tercer nivel, bloquea solo una vez al pulsarse junto con otro selector de tercer nivel"
+
+#: ../rules/base.xml.in.h:930
+msgid "&lt;Less/Greater&gt; chooses 3rd level, acts as onetime lock when pressed together with another 3rd-level-chooser"
+msgstr "&lt;Menor que/Mayor que&gt; elige el 3º nivel, bloquea solo una vez al pulsarse junto con otro selector de 3º nivel"
+
+#: ../rules/base.xml.in.h:931
+msgid "Ctrl key position"
+msgstr "Posición de la tecla Ctrl"
+
+#: ../rules/base.xml.in.h:932
+msgid "Caps Lock as Ctrl"
+msgstr "Bloq Mayús como Ctrl"
+
+#: ../rules/base.xml.in.h:933
+msgid "Left Ctrl as Meta"
+msgstr "Ctrl izquierdo como Meta"
+
+#: ../rules/base.xml.in.h:934
+msgid "Swap Ctrl and Caps Lock"
+msgstr "Intercambiar Ctrl y Bloq Mayús"
+
+#: ../rules/base.xml.in.h:935
+msgid "At left of 'A'"
+msgstr "A la izquierda de la «A»"
+
+#: ../rules/base.xml.in.h:936
+msgid "At bottom left"
+msgstr "En la parte inferior izquierda"
+
+#: ../rules/base.xml.in.h:937
+msgid "Right Ctrl as Right Alt"
+msgstr "Ctrl derecho como Alt derecho"
+
+#: ../rules/base.xml.in.h:938
+msgid "Menu as Right Ctrl"
+msgstr "Menú como Ctrl derecho"
+
+#: ../rules/base.xml.in.h:939
+msgid "Right Alt as Right Ctrl"
+msgstr "Alt derecho como Ctrl derecho"
+
+#: ../rules/base.xml.in.h:940
+msgid "Swap Left Alt key with Left Ctrl key"
+msgstr "Intercambiar tecla Alt Izquierda con tecla Ctrl Izquierda"
+
+#: ../rules/base.xml.in.h:941
+msgid "Swap Left Win key with Left Ctrl key"
+msgstr "Intercambiar tecla Windows Izquierda con tecla Ctrl Izquierda"
+
+#: ../rules/base.xml.in.h:942
+msgid "Left Alt as Ctrl, Left Ctrl as Win, Left Win as Alt"
+msgstr "Tecla Alt como tecla Ctrl, Tecla Ctrl izquierda como tecla Windows, tecla Windows como tecla Alt"
+
+#: ../rules/base.xml.in.h:943
+msgid "Use keyboard LED to show alternative layout"
+msgstr "Usar LED del teclado para mostrar la distribución alternativa"
+
+#: ../rules/base.xml.in.h:944
+msgid "Num Lock"
+msgstr "Bloq Num"
+
+#: ../rules/base.xml.in.h:945
+msgid "Layout of numeric keypad"
+msgstr "Distribución del teclado numérico "
+
+#: ../rules/base.xml.in.h:946
+msgid "Legacy"
+msgstr "Arcaico"
+
+#: ../rules/base.xml.in.h:947
+msgid "Unicode additions (arrows and math operators)"
+msgstr "Adiciones Unicode (flechas y operadores matemáticos)"
+
+#: ../rules/base.xml.in.h:948
+msgid "Unicode additions (arrows and math operators; math operators on default level)"
+msgstr "Adiciones Unicode (flechas y operadores matemáticos; operadores matemáticos en el nivel predeterminado)"
+
+#: ../rules/base.xml.in.h:949
+msgid "Legacy Wang 724"
+msgstr "Wang 724 arcaico"
+
+#: ../rules/base.xml.in.h:950
+msgid "Wang 724 keypad with Unicode additions (arrows and math operators)"
+msgstr "Teclado numérico Wang 724 con adiciones Unicode (flechas y operadores matemáticos)"
+
+#: ../rules/base.xml.in.h:951
+msgid "Wang 724 keypad with Unicode additions (arrows and math operators; math operators on default level)"
+msgstr "Teclado numérico Wang 724 con adiciones Unicode (flechas y operadores matemáticos; operadores matemáticos en el nivel predeterminado)"
+
+#: ../rules/base.xml.in.h:952
+msgid "Hexadecimal"
+msgstr "Hexadecimal"
+
+#: ../rules/base.xml.in.h:953
+msgid "ATM/phone-style"
+msgstr "Estilo de cajero automático ó teléfono"
+
+#: ../rules/base.xml.in.h:954
+msgid "Numeric keypad delete key behaviour"
+msgstr "Comportamiento de la tecla Supr del teclado numérico"
+
+#: ../rules/base.xml.in.h:955
+msgid "Legacy key with dot"
+msgstr "Tecla arcaica con punto"
+
+#. Actually, with KP_SEPARATOR, as the old keypad(comma)
+#: ../rules/base.xml.in.h:957
+msgid "Legacy key with comma"
+msgstr "Tecla arcaica con coma"
+
+#: ../rules/base.xml.in.h:958
+msgid "Four-level key with dot"
+msgstr "Tecla de cuarto nivel con punto"
+
+#: ../rules/base.xml.in.h:959
+msgid "Four-level key with dot, Latin-9 only"
+msgstr "Tecla de cuarto nivel con punto, restricción latin-9"
+
+#: ../rules/base.xml.in.h:960
+msgid "Four-level key with comma"
+msgstr "Tecla de cuarto nivel con coma"
+
+#: ../rules/base.xml.in.h:961
+msgid "Four-level key with momayyez"
+msgstr "Tecla de cuarto nivel con momayyez"
+
+#. This assumes the KP_ abstract symbols are actually useful for some apps
+#. The description needs to be rewritten
+#: ../rules/base.xml.in.h:964
+msgid "Four-level key with abstract separators"
+msgstr "Tecla de cuarto nivel con separadores abstractos"
+
+#: ../rules/base.xml.in.h:965
+msgid "Semicolon on third level"
+msgstr "Punto y coma en tercer nivel"
+
+#: ../rules/base.xml.in.h:966
+msgid "Caps Lock key behavior"
+msgstr "Comportamiento de Bloq Mayús"
+
+#: ../rules/base.xml.in.h:967
+msgid "Caps Lock uses internal capitalization; Shift \"pauses\" Caps Lock"
+msgstr "Bloq Mayús usa la capitalización interna; Mayús «pausa» el Bloq Mayús"
+
+#: ../rules/base.xml.in.h:968
+msgid "Caps Lock uses internal capitalization; Shift doesn't affect Caps Lock"
+msgstr "Bloq Mayús usa la capitalización interna; Mayús no afecta a Bloq Mayús"
+
+#: ../rules/base.xml.in.h:969
+msgid "Caps Lock acts as Shift with locking; Shift \"pauses\" Caps Lock"
+msgstr "Bloq Mayús actúa como Mayús con bloqueo; Mayús «pausa» Bloq Mayús"
+
+#: ../rules/base.xml.in.h:970
+msgid "Caps Lock acts as Shift with locking; Shift doesn't affect Caps Lock"
+msgstr "Bloq Mayús actúa como Mayús con bloqueo; Mayús no afecta a Bloq Mayús"
+
+#: ../rules/base.xml.in.h:971
+msgid "Caps Lock toggles normal capitalization of alphabetic characters"
+msgstr "Bloq Mayús cambia la capitalización normal de los caracteres alfabéticos"
+
+#: ../rules/base.xml.in.h:972
+msgid "Make Caps Lock an additional Num Lock"
+msgstr "Hacer de Bloq Mayús un Bloq Num adicional"
+
+#: ../rules/base.xml.in.h:973
+msgid "Swap ESC and Caps Lock"
+msgstr "Intercambiar ESC y Bloq Mayús"
+
+#: ../rules/base.xml.in.h:974
+msgid "Make Caps Lock an additional ESC"
+msgstr "Hacer de Bloq Mayús un Esc adicional"
+
+#: ../rules/base.xml.in.h:975
+msgid "Make Caps Lock an additional Backspace"
+msgstr "Hacer de Bloq Mayús un Retroceso adicional"
+
+#: ../rules/base.xml.in.h:976
+msgid "Make Caps Lock an additional Super"
+msgstr "Hacer de Bloq Mayús un Super adicional"
+
+#: ../rules/base.xml.in.h:977
+msgid "Make Caps Lock an additional Hyper"
+msgstr "Hacer de Bloq Mayús un Hyper adicional"
+
+#: ../rules/base.xml.in.h:978
+msgid "Caps Lock toggles ShiftLock (affects all keys)"
+msgstr "Bloq Mayús cambia Mayús de forma que todas las teclas están afectadas"
+
+#: ../rules/base.xml.in.h:979
+msgid "Caps Lock is disabled"
+msgstr "Bloq Mayús está desactivado"
+
+#: ../rules/base.xml.in.h:980
+msgid "Make Caps Lock an additional Ctrl"
+msgstr "Hacer de Bloq Mayús un Ctrl adicional"
+
+#: ../rules/base.xml.in.h:981
+msgid "Alt/Win key behavior"
+msgstr "Comportamiento de la tecla Alt/Windows"
+
+#: ../rules/base.xml.in.h:982
+msgid "Add the standard behavior to Menu key"
+msgstr "Añadir el comportamiento estándar a la tecla Menú."
+
+#: ../rules/base.xml.in.h:983
+msgid "Alt and Meta are on Alt keys"
+msgstr "Alt y Meta están en las teclas Alt"
+
+#: ../rules/base.xml.in.h:984
+msgid "Alt is mapped to Win keys (and the usual Alt keys)"
+msgstr "Alt está mapeada en las teclas Windows (y las teclas Alt usuales)"
+
+#: ../rules/base.xml.in.h:985
+msgid "Ctrl is mapped to Win keys (and the usual Ctrl keys)"
+msgstr "Control está mapeada en las teclas Windows (y las teclas Ctrl usuales)"
+
+#: ../rules/base.xml.in.h:986
+msgid "Ctrl is mapped to Alt keys, Alt is mapped to Win keys"
+msgstr "Control está mapeada en las teclas Alt, Alt está mapeado en las teclas Windows"
+
+#: ../rules/base.xml.in.h:987
+msgid "Meta is mapped to Win keys"
+msgstr "Meta está mapeada a las teclas Windows"
+
+#: ../rules/base.xml.in.h:988
+msgid "Meta is mapped to Left Win"
+msgstr "Meta está mapeada a la tecla Windows izquierdo"
+
+#: ../rules/base.xml.in.h:989
+msgid "Hyper is mapped to Win-keys"
+msgstr "Hyper está mapeada a las teclas Windows"
+
+#: ../rules/base.xml.in.h:990
+msgid "Alt is mapped to Right Win, Super to Menu"
+msgstr "Alt está mapeada a la tecla Windows derecho y Super a la tecla Menú"
+
+#: ../rules/base.xml.in.h:991
+msgid "Alt is swapped with Win"
+msgstr "Alt está cambiado con la tecla Windows"
+
+#: ../rules/base.xml.in.h:992
+msgid "Position of Compose key"
+msgstr "Posición de la tecla Componer"
+
+#: ../rules/base.xml.in.h:993
+msgid "3rd level of Left Win"
+msgstr "3er nivel de tecla windows izquierda"
+
+#: ../rules/base.xml.in.h:994
+msgid "3rd level of Right Win"
+msgstr "3er nivel de tecla windows derecha"
+
+#: ../rules/base.xml.in.h:995
+msgid "3rd level of Menu"
+msgstr "3er nivel de tecla Menu"
+
+#: ../rules/base.xml.in.h:996
+msgid "3rd level of Left Ctrl"
+msgstr "3er nivel de Ctrl izquierdo"
+
+#: ../rules/base.xml.in.h:997
+msgid "3rd level of Right Ctrl"
+msgstr "3er nivel de Control derecho"
+
+#: ../rules/base.xml.in.h:998
+msgid "3rd level of Caps Lock"
+msgstr "3er nivel de tecla Bloq Mayús"
+
+#: ../rules/base.xml.in.h:999
+msgid "3rd level of &lt;Less/Greater&gt;"
+msgstr "3er nivel de &lt;Menor que/Mayor que&gt;"
+
+#: ../rules/base.xml.in.h:1000
+msgid "Pause"
+msgstr "Pausa"
+
+#: ../rules/base.xml.in.h:1001
+msgid "PrtSc"
+msgstr "PrtSc"
+
+#: ../rules/base.xml.in.h:1002
+msgid "Miscellaneous compatibility options"
+msgstr "Opciones misceláneas de compatiblidad"
+
+#: ../rules/base.xml.in.h:1003
+msgid "Default numeric keypad keys"
+msgstr "Teclas del teclado numérico predeterminado"
+
+#: ../rules/base.xml.in.h:1004
+msgid "Numeric keypad keys always enter digits (as in Mac OS)"
+msgstr "Las teclas del teclado numérico siempre introducen dígitos (como en Mac OS)"
+
+#: ../rules/base.xml.in.h:1005
+msgid "Shift with numeric keypad keys works as in MS Windows"
+msgstr "Mayús con las teclas del teclado numérico funcionan como en MS Windows"
+
+#: ../rules/base.xml.in.h:1006
+msgid "Shift does not cancel Num Lock, chooses 3rd level instead"
+msgstr "Mayús no cancela Bloq Num, en su lugar elije el 3er nivel"
+
+#: ../rules/base.xml.in.h:1007
+msgid "Special keys (Ctrl+Alt+&lt;key&gt;) handled in a server"
+msgstr "Teclas especiales (Ctrl+Alt+«tecla») manipuladas en un servidor"
+
+#: ../rules/base.xml.in.h:1008
+msgid "Apple Aluminium Keyboard: emulate PC keys (Print, Scroll Lock, Pause, Num Lock)"
+msgstr "Teclado de aluminio de Apple: emular teclas PC (Imprimir, Bloq Despl, Pausa, Bloq Num)"
+
+#: ../rules/base.xml.in.h:1009
+msgid "Shift cancels Caps Lock"
+msgstr "Mayús cancela Bloq Mayús"
+
+#: ../rules/base.xml.in.h:1010
+msgid "Enable extra typographic characters"
+msgstr "Activar caracteres tipográficos adicionales"
+
+#: ../rules/base.xml.in.h:1011
+msgid "Both Shift keys together toggle Caps Lock"
+msgstr "Ambas teclas Mayús juntas conmutan Bloq Mayús"
+
+#: ../rules/base.xml.in.h:1012
+msgid "Both Shift keys together activate Caps Lock, one Shift key deactivates"
+msgstr "Ambas teclas Mayús juntas conmutan Bloq Mayús, una tecla Mayús lo desactiva"
+
+#: ../rules/base.xml.in.h:1013
+msgid "Both Shift keys together toggle ShiftLock"
+msgstr "Ambas teclas Mayús juntas conmutan Bloq Mayús"
+
+#: ../rules/base.xml.in.h:1014
+msgid "Shift + NumLock toggles PointerKeys"
+msgstr "Shift + Bloq Num cambia las teclas de flechas"
+
+#: ../rules/base.xml.in.h:1015
+msgid "Allow breaking grabs with keyboard actions (warning: security risk)"
+msgstr "Permitir tomar interrupciones con el teclado (Peligro: riesgos de seguridad)"
+
+# dice literalmente "árbol" he visto que se utiliza como sinónimo de servidor.
+#: ../rules/base.xml.in.h:1016
+msgid "Allow grab and window tree logging"
+msgstr "Permitir tomar y loguearse al árbol windows"
+
+#: ../rules/base.xml.in.h:1017
+msgid "Adding currency signs to certain keys"
+msgstr "Añadir símbolo de divisa a algunas teclas"
+
+#: ../rules/base.xml.in.h:1018
+msgid "Euro on E"
+msgstr "Euro en la E"
+
+#: ../rules/base.xml.in.h:1019
+msgid "Euro on 2"
+msgstr "Euro en el 2"
+
+#: ../rules/base.xml.in.h:1020
+msgid "Euro on 4"
+msgstr "Euro en el 4"
+
+#: ../rules/base.xml.in.h:1021
+msgid "Euro on 5"
+msgstr "Euro en el 5"
+
+#: ../rules/base.xml.in.h:1022
+msgid "Rupee on 4"
+msgstr "Rupia en el 4"
+
+#: ../rules/base.xml.in.h:1023
+msgid "Key to choose 5th level"
+msgstr "Tecla para seleccionar el 5o nivel"
+
+#: ../rules/base.xml.in.h:1024
+msgid "&lt;Less/Greater&gt; chooses 5th level, locks when pressed together with another 5th-level-chooser"
+msgstr "&lt;Menor que/Mayor que&gt; elige el 5º nivel, bloquea al pulsarse junto con otro selector de 5º nivel"
+
+#: ../rules/base.xml.in.h:1025
+msgid "Right Alt chooses 5th level, locks when pressed together with another 5th-level-chooser"
+msgstr "Alt derecho elige el 5º nivel, bloquea al pulsarse junto con otro selector de 5º nivel"
+
+#: ../rules/base.xml.in.h:1026
+msgid "Left Win chooses 5th level, locks when pressed together with another 5th-level-chooser"
+msgstr "Win izquierdo elige el 5º nivel, bloquea al pulsarse junto con otro selector de 5º nivel"
+
+#: ../rules/base.xml.in.h:1027
+msgid "Right Win chooses 5th level, locks when pressed together with another 5th-level-chooser"
+msgstr "Win derecho elige el 5º nivel, bloquea al pulsarse junto con otro selector de 5º nivel"
+
+#: ../rules/base.xml.in.h:1028
+msgid "Using space key to input non-breakable space character"
+msgstr "Usar la tecla espacio para introducir un carácter de espacio no separable"
+
+#: ../rules/base.xml.in.h:1029
+msgid "Usual space at any level"
+msgstr "Espacio usual en cualquier nivel"
+
+#: ../rules/base.xml.in.h:1030
+msgid "Non-breakable space character at second level"
+msgstr "Carácter de espacio no separable en el segundo nivel"
+
+#: ../rules/base.xml.in.h:1031
+msgid "Non-breakable space character at third level"
+msgstr "Carácter de espacio no separable en el tercer nivel"
+
+#: ../rules/base.xml.in.h:1032
+msgid "Non-breakable space character at third level, nothing at fourth level"
+msgstr "Carácter de espacio no separable en el tercer nivel, nada en el cuarto nivel"
+
+#: ../rules/base.xml.in.h:1033
+msgid "Non-breakable space character at third level, thin non-breakable space character at fourth level"
+msgstr "Carácter de espacio no separable en el tercer nivel, carácter de espacio estrecho no separable en el cuarto nivel"
+
+#: ../rules/base.xml.in.h:1034
+msgid "Non-breakable space character at fourth level"
+msgstr "Carácter de espacio no separable en el cuarto nivel"
+
+#: ../rules/base.xml.in.h:1035
+msgid "Non-breakable space character at fourth level, thin non-breakable space character at sixth level"
+msgstr "Carácter de espacio no separable en el cuarto nivel, carácter de espacio estrecho no separable en el sexto nivel"
+
+#: ../rules/base.xml.in.h:1036
+msgid "Non-breakable space character at fourth level, thin non-breakable space character at sixth level (via Ctrl+Shift)"
+msgstr "Carácter de espacio no separable en el cuarto nivel, carácter de espacio estrecho no separable en el sexto nivel (a través de Ctrl+Mayús)"
+
+#: ../rules/base.xml.in.h:1037
+msgid "Zero-width non-joiner character at second level"
+msgstr "Carácer de espacio irrompible de anchura cero («ZWNJ») en el segundo nivel"
+
+#: ../rules/base.xml.in.h:1038
+msgid "Zero-width non-joiner character at second level, zero-width joiner character at third level"
+msgstr "Carácer de espacio irrompible de anchura cero («ZWNJ») en el segundo nivel, carácter de espacio de anchura cero rompible («ZWJ») en el tercer nivel"
+
+#: ../rules/base.xml.in.h:1039
+msgid "Zero-width non-joiner character at second level, zero-width joiner character at third level, non-breakable space character at fourth level"
+msgstr "Carácer de espacio irrompible de anchura cero («ZWNJ») en el segundo nivel, carácter de espacio de anchura cero rompible («ZWJ») en el tercer nivel, caracter de espacio no separable en el cuarto nivel"
+
+#: ../rules/base.xml.in.h:1040
+msgid "Zero-width non-joiner character at second level, non-breakable space character at third level"
+msgstr "Carácer de espacio irrompible de anchura cero («ZWNJ») en el segundo nivel, carácter de espacio no separable en el tercer nivel"
+
+#: ../rules/base.xml.in.h:1041
+msgid "Zero-width non-joiner character at second level, non-breakable space character at third level, nothing at fourth level"
+msgstr "Carácer de espacio irrompible de anchura cero («ZWNJ») en el segundo nivel, carácter de espacio no separable en el tercer nivel, nada en el cuarto nivel"
+
+#: ../rules/base.xml.in.h:1042
+msgid "Zero-width non-joiner character at second level, non-breakable space character at third level, zero-width joiner at fourth level"
+msgstr "Carácer de espacio irrompible de anchura cero («ZWNJ») en el segundo nivel, carácter de espacio no separable en el tercer nivel, espacio de anchura cero rompible («ZWJ») en el cuarto nivel"
+
+#: ../rules/base.xml.in.h:1043
+msgid "Zero-width non-joiner character at second level, non-breakable space character at third level, thin non-breakable space at fourth level"
+msgstr "Carácer de espacio irrompible de anchura cero («ZWNJ») en el segundo nivel, carácter de espacio no separable en el tercer nivel, espacio estrecho no separable en el cuarto nivel"
+
+#: ../rules/base.xml.in.h:1044
+msgid "Zero-width non-joiner character at third level, zero-width joiner at fourth level"
+msgstr "Carácer de espacio irrompible de anchura cero («ZWNJ») en el tercer nivel, carácter de anchura cero rompible («ZWJ») en el cuarto nivel"
+
+#: ../rules/base.xml.in.h:1045
+msgid "Japanese keyboard options"
+msgstr "Opciones de teclado japonés"
+
+#: ../rules/base.xml.in.h:1046
+msgid "Kana Lock key is locking"
+msgstr "La tecla Bloq Kana está bloqueando"
+
+#: ../rules/base.xml.in.h:1047
+msgid "NICOLA-F style Backspace"
+msgstr "Retroceso estilo NICOLA-F"
+
+#: ../rules/base.xml.in.h:1048
+msgid "Make Zenkaku Hankaku an additional ESC"
+msgstr "Hacer de Zenkaku Hankaku un Esc adicional"
+
+#: ../rules/base.xml.in.h:1049
+msgid "Adding Esperanto supersigned letters"
+msgstr "Añadir las tildes del esperanto"
+
+#: ../rules/base.xml.in.h:1050
+msgid "To the corresponding key in a Qwerty layout"
+msgstr "A la tecla correspondiente en un teclado Qwerty."
+
+#: ../rules/base.xml.in.h:1051
+msgid "To the corresponding key in a Dvorak layout"
+msgstr "A la tecla correspondiente en un teclado Dvorak."
+
+#: ../rules/base.xml.in.h:1052
+msgid "To the corresponding key in a Colemak layout"
+msgstr "A la tecla correspondiente en un teclado Colemak."
+
+#: ../rules/base.xml.in.h:1053
+msgid "Maintain key compatibility with old Solaris keycodes"
+msgstr "Mantener compatibilidad de teclas con los viejos códigos de Solaris"
+
+#: ../rules/base.xml.in.h:1054
+msgid "Sun Key compatibility"
+msgstr "Compatibilidad con tecla Sun"
+
+#: ../rules/base.xml.in.h:1055
+msgid "Key sequence to kill the X server"
+msgstr "Secuencia de teclas para matar el servidor X"
+
+#: ../rules/base.xml.in.h:1056
+msgid "Ctrl + Alt + Backspace"
+msgstr "Control + Alt + Retroceso"
+
+#: ../rules/base.extras.xml.in.h:1
+msgid "apl"
+msgstr "apl"
+
+#: ../rules/base.extras.xml.in.h:2
+msgid "APL keyboard symbols"
+msgstr "Símbolos de teclado APL"
#: ../rules/base.extras.xml.in.h:5
-msgid "Avestan"
-msgstr "Avéstico"
+msgid "kut"
+msgstr "kut"
#: ../rules/base.extras.xml.in.h:6
-msgid "Couer D'alene Salish"
-msgstr "Coeur d’Alene salish"
+msgid "Kutenai"
+msgstr "Kutenai"
#: ../rules/base.extras.xml.in.h:7
-msgid "Crimean Tatar (Dobruja Q)"
-msgstr "Tártaro de Crimea (Dobruca Q)"
+msgid "shs"
+msgstr "shs"
-#: ../rules/base.extras.xml.in.h:9
-msgid "English (US, international AltGr Unicode combining)"
-msgstr "Inglés (EE. UU., internacional combinando AltGr Unicode)"
+#: ../rules/base.extras.xml.in.h:8
+msgid "Secwepemctsin"
+msgstr "Shuswap"
-#: ../rules/base.extras.xml.in.h:10
-msgid "English (US, international AltGr Unicode combining, alternative)"
-msgstr "Inglés (EE. UU., internacional combinando AltGr Unicode, alternativa)"
+#: ../rules/base.extras.xml.in.h:9
+msgid "Multilingual (Canada, Sun Type 6/7)"
+msgstr "Multilingüe (Canada, Sun tipo 6/7)"
-#: ../rules/base.extras.xml.in.h:13
+#: ../rules/base.extras.xml.in.h:12
msgid "German (US keyboard with German letters)"
msgstr "Alemán (teclado estadounidense con letras alemanas)"
-#: ../rules/base.extras.xml.in.h:14
+#: ../rules/base.extras.xml.in.h:13
msgid "German (with Hungarian letters and no dead keys)"
msgstr "Alemán (con letras húngaras y sin teclas muertas)"
-#: ../rules/base.extras.xml.in.h:15
-msgid "Kutenai"
-msgstr "Kutenai"
+#: ../rules/base.extras.xml.in.h:14
+msgid "German (Sun Type 6/7)"
+msgstr "Alemán (Sun tipo 6/7)"
#: ../rules/base.extras.xml.in.h:17
-msgid "Latvian (US Colemak)"
-msgstr "Letón (Colemark RU)"
+msgid "Avestan"
+msgstr "Avéstico"
-#: ../rules/base.extras.xml.in.h:18
-msgid "Latvian (US Colemak, apostrophe variant)"
-msgstr "Letón (Colemark de RU, variante con apóstrofo)"
+#: ../rules/base.extras.xml.in.h:20
+msgid "Lithuanian (US Dvorak with Lithuanian letters)"
+msgstr "Lituano (Dvorak de EE. UU. con letras lituanas)"
+
+#: ../rules/base.extras.xml.in.h:21
+msgid "Lithuanian (Sun Type 6/7)"
+msgstr "Lituano (Sun tipo 6/7)"
-#: ../rules/base.extras.xml.in.h:19
+#: ../rules/base.extras.xml.in.h:24
msgid "Latvian (US Dvorak)"
msgstr "Letón (Dvorak de EE. UU.)"
-#: ../rules/base.extras.xml.in.h:20
+#: ../rules/base.extras.xml.in.h:25
msgid "Latvian (US Dvorak, Y variant)"
msgstr "Letón (Dvorak de EE. UU., variante Y)"
-#: ../rules/base.extras.xml.in.h:21
+#: ../rules/base.extras.xml.in.h:26
msgid "Latvian (US Dvorak, minus variant)"
msgstr "Letón (Dvorak de EE. UU., variante menos)"
-#: ../rules/base.extras.xml.in.h:22
+#: ../rules/base.extras.xml.in.h:27
msgid "Latvian (programmer US Dvorak)"
msgstr "Letón (programador, Dvorak de EE. UU.)"
-#: ../rules/base.extras.xml.in.h:23
+#: ../rules/base.extras.xml.in.h:28
msgid "Latvian (programmer US Dvorak, Y variant)"
msgstr "Letón (programador, Dvorak de EE. UU., variante Y)"
-#: ../rules/base.extras.xml.in.h:24
+#: ../rules/base.extras.xml.in.h:29
msgid "Latvian (programmer US Dvorak, minus variant)"
msgstr "Letón (programador, Dvorak de EE. UU., variante menos)"
-#: ../rules/base.extras.xml.in.h:26
-msgid "Lithuanian (US Dvorak with Lithuanian letters)"
-msgstr "Lituano (Dvorak de EE. UU. con letras lituanas)"
+#: ../rules/base.extras.xml.in.h:30
+msgid "Latvian (US Colemak)"
+msgstr "Letón (Colemak EE.UU.)"
-#: ../rules/base.extras.xml.in.h:29
+#: ../rules/base.extras.xml.in.h:31
+msgid "Latvian (US Colemak, apostrophe variant)"
+msgstr "Letón (Colemak EE.UU., variante con apóstrofo)"
+
+#: ../rules/base.extras.xml.in.h:32
+msgid "Latvian (Sun Type 6/7)"
+msgstr "Letón (Sun tipo 6/7)"
+
+#: ../rules/base.extras.xml.in.h:35
+msgid "English (US, international AltGr Unicode combining)"
+msgstr "Inglés (EE. UU., internacional combinando Unicode por AltGr)"
+
+#: ../rules/base.extras.xml.in.h:36
+msgid "English (US, international AltGr Unicode combining, alternative)"
+msgstr "Inglés (EE. UU., internacional combinando Unicode por AltGr, alternativo)"
+
+#: ../rules/base.extras.xml.in.h:37
+msgid "Atsina"
+msgstr "Atsina"
+
+#: ../rules/base.extras.xml.in.h:38
+msgid "Coeur d'Alene Salish"
+msgstr "Cœur d’Alene Salish"
+
+#: ../rules/base.extras.xml.in.h:39
+msgid "English (US, Sun Type 6/7)"
+msgstr "Inglés (EE. UU, Sun tipo 6/7)"
+
+#: ../rules/base.extras.xml.in.h:40
+msgid "English (Norman)"
+msgstr "Inglés (Norman)"
+
+#: ../rules/base.extras.xml.in.h:43
msgid "Polish (international with dead keys)"
msgstr "Polaco (internacional con teclas muertas)"
-#: ../rules/base.extras.xml.in.h:31
+#: ../rules/base.extras.xml.in.h:44
+msgid "Polish (Colemak)"
+msgstr "Polaco (Colemak)"
+
+#: ../rules/base.extras.xml.in.h:45
+msgid "Polish (Sun Type 6/7)"
+msgstr "Polaco (Sun tipo 6/7)"
+
+#: ../rules/base.extras.xml.in.h:49
+msgid "Crimean Tatar (Dobruja Q)"
+msgstr "Tártaro de Crimea (Dobruca Q)"
+
+#: ../rules/base.extras.xml.in.h:50
msgid "Romanian (ergonomic Touchtype)"
msgstr "Rumanía (tipo de pulsación ergonómica)"
-#: ../rules/base.extras.xml.in.h:33
+#: ../rules/base.extras.xml.in.h:51
+msgid "Romanian (Sun Type 6/7)"
+msgstr "Rumano (Sun tipo 6/7)"
+
+#: ../rules/base.extras.xml.in.h:54
+msgid "Serbian (combining accents instead of dead keys)"
+msgstr "Serbio (combinar tildes en lugar de teclas muertas)"
+
+#: ../rules/base.extras.xml.in.h:57
msgid "Russian (with Ukrainian-Belorussian layout)"
msgstr "Ruso (con distribución ucraniana y bielorrusa)"
-#: ../rules/base.extras.xml.in.h:34
-msgid "Secwepemctsin"
-msgstr "Shuswap"
+#: ../rules/base.extras.xml.in.h:58
+msgid "Russian (Sun Type 6/7)"
+msgstr "Ruso (Sun tipo 6/7)"
-#: ../rules/base.extras.xml.in.h:36
-msgid "Serbian (combining accents instead of dead keys)"
-msgstr "Serbio (combinar tildes en lugar de teclas muertas)"
+#: ../rules/base.extras.xml.in.h:61
+msgid "Armenian (OLPC phonetic)"
+msgstr "Armenio (OLPC fonético)"
-#: ../rules/base.extras.xml.in.h:37
-msgid "apl"
-msgstr "apl"
+#: ../rules/base.extras.xml.in.h:64
+msgid "Hebrew (Biblical, SIL phonetic)"
+msgstr "Hebreo (bíblico, fonética SIL)"
-#: ../rules/base.extras.xml.in.h:44
-msgid "kut"
-msgstr "kut"
+#: ../rules/base.extras.xml.in.h:67
+msgid "Arabic (Sun Type 6/7)"
+msgstr "Árabe (Sun tipo 6/7)"
-#: ../rules/base.extras.xml.in.h:50
-msgid "shs"
-msgstr "shs"
+#: ../rules/base.extras.xml.in.h:70
+msgid "Belgian (Sun Type 6/7)"
+msgstr "Belga (Sun tipo 6/7)"
+
+#: ../rules/base.extras.xml.in.h:73
+msgid "Portuguese (Brazil, Sun Type 6/7)"
+msgstr "Portugués (Brasil, Sun tipo 6/7)"
+
+#: ../rules/base.extras.xml.in.h:76
+msgid "Czech (Sun Type 6/7)"
+msgstr "Checo (Sun tipo 6/7)"
+
+#: ../rules/base.extras.xml.in.h:79
+msgid "Danish (Sun Type 6/7)"
+msgstr "Danés (Sun tipo 6/7)"
+
+#: ../rules/base.extras.xml.in.h:82
+msgid "Dutch (Sun Type 6/7)"
+msgstr "Holandés (Sun tipo 6/7)"
+
+#: ../rules/base.extras.xml.in.h:85
+msgid "Estonian (Sun Type 6/7)"
+msgstr "Estonio (Sun tipo 6/7)"
+
+#: ../rules/base.extras.xml.in.h:88
+msgid "Finnish (Sun Type 6/7)"
+msgstr "Finlandés (Sun tipo 6/7)"
+
+#: ../rules/base.extras.xml.in.h:90
+msgid "French (Sun Type 6/7)"
+msgstr "Francés (Sun tipo 6/7)"
+
+#: ../rules/base.extras.xml.in.h:93
+msgid "Greek (Sun Type 6/7)"
+msgstr "Griego (Sun tipo 6/7)"
+
+#: ../rules/base.extras.xml.in.h:96
+msgid "Italian (Sun Type 6/7)"
+msgstr "Italiano (Sun tipo 6/7)"
+
+#: ../rules/base.extras.xml.in.h:99
+msgid "Japanese (Sun Type 6)"
+msgstr "Japonés (Sun tipo 6)"
+
+#: ../rules/base.extras.xml.in.h:100
+msgid "Japanese (Sun Type 7 - pc compatible)"
+msgstr "Japonés (Sun tipo 7 - compatible con PC)"
+
+#: ../rules/base.extras.xml.in.h:101
+msgid "Japanese (Sun Type 7 - sun compatible)"
+msgstr "Japonés (Sun tipo 7 - compatible con Sun)"
+
+#: ../rules/base.extras.xml.in.h:104
+msgid "Norwegian (Sun Type 6/7)"
+msgstr "Noruego (Sun tipo 6/7)"
+
+#: ../rules/base.extras.xml.in.h:106
+msgid "Portuguese (Sun Type 6/7)"
+msgstr "Portugués (Sun tipo 6/7)"
+
+#: ../rules/base.extras.xml.in.h:109
+msgid "Slovak (Sun Type 6/7)"
+msgstr "Eslovaco (Sun tipo 6/7)"
+
+#: ../rules/base.extras.xml.in.h:112
+msgid "Spanish (Sun Type 6/7)"
+msgstr "Español (Sun tipo 6/7)"
+
+#: ../rules/base.extras.xml.in.h:115
+msgid "Swedish (Sun Type 6/7)"
+msgstr "Sueco (Sun tipo 6/7)"
+
+#: ../rules/base.extras.xml.in.h:117
+msgid "German (Switzerland, Sun Type 6/7)"
+msgstr "Alemán (Suiza, Sun tipo 6/7)"
+
+#: ../rules/base.extras.xml.in.h:118
+msgid "French (Switzerland, Sun Type 6/7)"
+msgstr "Francés (Suiza, Sun tipo 6/7)"
+
+#: ../rules/base.extras.xml.in.h:121
+msgid "Turkish (Sun Type 6/7)"
+msgstr "Turco (Sun tipo 6/7)"
+
+#: ../rules/base.extras.xml.in.h:124
+msgid "Ukrainian (Sun Type 6/7)"
+msgstr "Ucraniano (Sun tipo 6/7)"
+
+#: ../rules/base.extras.xml.in.h:126
+msgid "English (UK, Sun Type 6/7)"
+msgstr "Inglés (UK, Sun tipo 6/7)"
+
+#: ../rules/base.extras.xml.in.h:129
+msgid "Korean (Sun Type 6/7)"
+msgstr "Coreano (Sun tipo 6/7)"
+
+#~ msgid "Bengali"
+#~ msgstr "Bengalí"
+
+#~ msgid "Portuguese (Brazil, nativo for Esperanto)"
+#~ msgstr "Portugués (Brasil, nativo para esperanto)"
+
+#~ msgid "&lt;Less/Greater&gt; chooses 5th level and activates level5-Lock when pressed together with another 5th-level-chooser, one press releases the lock"
+#~ msgstr "&lt;Menor que/Mayor que&gt; elige el 5º nivel y activa el bloqueo de 5º nivel al pulsarse junto con otro selector de 5º nivel, una pulsación libera el bloqueo"
+
+#~ msgid "&lt;Less/Greater&gt; chooses 5th level, locks when pressed together with another 5th-level-chooser, one press releases the lock"
+#~ msgstr "&lt;Menor que/Mayor que&gt; elige el 5º nivel, bloquea al pulsarse junto con otro selector de 5º nivel, una pulsación libera el bloqueo"
+
+#~ msgid "Catalan"
+#~ msgstr "Catalán"
+
+#~ msgid "Compose key position"
+#~ msgstr "Posición de la tecla Componer"
+
+#~ msgid "English (Cameroon Dvorak)"
+#~ msgstr "Inglés (Dvorak de Camerún)"
+
+#~ msgid "English (layout toggle on multiply/divide key)"
+#~ msgstr "Inglés (cambio de distribución en la tecla multiplicar/dividir)"
+
+#~ msgid "Key(s) to change layout"
+#~ msgstr "Tecla(s) para cambiar la distribución"
+
+#~ msgid "Left Win chooses 5th level, locks when pressed together with another 5th-level-chooser, one press releases the lock"
+#~ msgstr "Win izquierdo elige el 5º nivel, bloquea al pulsarse junto con otro selector de 5º nivel, una pulsación libera el bloqueo"
+
+#~ msgid "Make Caps Lock an additional Control but keep the Caps_Lock keysym"
+#~ msgstr "Hacer de Bloq Mayús un Control adicional pero mantener el símbolo de tecla Caps_Lock"
+
+#~ msgid "Numeric keypad layout selection"
+#~ msgstr "Selección de distribución de teclado numérico"
+
+#~ msgid "Right Alt chooses 5th level and activates level5-Lock when pressed together with another 5th-level-chooser, one press releases the lock"
+#~ msgstr "Alt derecho elige el 5º nivel y activa el bloqueo de 5º nivel al pulsarse junto con otro selector de 5º nivel, una pulsación libera el bloqueo"
+
+#~ msgid "Right Alt chooses 5th level, locks when pressed together with another 5th-level-chooser, one press releases the lock"
+#~ msgstr "Alt derecho elige el 5º nivel, bloquea al pulsarse junto con otro selector de 5º nivel, una pulsación libera el bloqueo"
+
+#~ msgid "Right Win chooses 5th level, locks when pressed together with another 5th-level-chooser, one press releases the lock"
+#~ msgstr "Win derecho elige el 5º nivel, bloquea al pulsarse junto con otro selector de 5º nivel, una pulsación libera el bloqueo"
+
+#~ msgid "Serbian (Z and ZHE swapped)"
+#~ msgstr "Serbio (Z y ZHE intercambiados)"
+
+#~ msgid "Serbian (with guillemets)"
+#~ msgstr "Serbio (con guillemots)"
+
+#~ msgid "Toggle PointerKeys with Shift + NumLock."
+#~ msgstr "Cambiar las teclas de flechas con Mayús + Bloq Num"
+
+#~ msgid "ca"
+#~ msgstr "ca"
#~ msgid "English (Cameroon qwerty)"
#~ msgstr "Inglés (qwerty de Camerún)"
@@ -3780,15 +4255,6 @@ msgstr "shs"
#~ msgid "French (Cameroon azerty)"
#~ msgstr "Francés (azerty de Camerún)"
-#~ msgid "German (qwerty)"
-#~ msgstr "Alemán (qwerty)"
-
-#~ msgid "Make Caps Lock an additional Ctrl"
-#~ msgstr "Hacer de Bloq Mayús un Ctrl adicional"
-
-#~ msgid "Meta on Left Ctrl"
-#~ msgstr "Meta en Ctrl izquierda"
-
#~ msgid "Right Ctrl is mapped to Menu"
#~ msgstr "Ctrl derecho está mapeada a la tecla Menú"
@@ -3807,9 +4273,6 @@ msgstr "shs"
#~ msgid "Danish (Mac)"
#~ msgstr "Danés (Mac)"
-#~ msgid "English (UK, Mac)"
-#~ msgstr "Inglés (RU, Mac)"
-
#~ msgid "Finnish (Mac)"
#~ msgstr "Croata (Mac_Croatian)"
@@ -3891,9 +4354,6 @@ msgstr "shs"
#~ msgid "Swiss"
#~ msgstr "Suizo"
-#~ msgid "Swiss (legacy)"
-#~ msgstr "Suizo (heredado)"
-
#~ msgid "Turkish (Crimean Tatar Turkish Alt-Q)"
#~ msgstr "Turco (Alt-Q turca del tártaro de Crimea)"
@@ -3996,9 +4456,6 @@ msgstr "shs"
#~ msgid "Aze"
#~ msgstr "Aze"
-#~ msgid "Bangladesh"
-#~ msgstr "Bangladesh"
-
#~ msgid "Bel"
#~ msgstr "Bel"
@@ -4209,9 +4666,6 @@ msgstr "shs"
#~ msgid "Mli"
#~ msgstr "Mli"
-#~ msgid "Mmr"
-#~ msgstr "Mmr"
-
#~ msgid "Mng"
#~ msgstr "Mng"
@@ -4465,9 +4919,6 @@ msgstr "shs"
#~ msgid "Left Win-key is Compose."
#~ msgstr "La tecla Windows izquierda es Componer."
-#~ msgid "Macintosh layout"
-#~ msgstr "Distribución Macintosh"
-
#~ msgid "Menu is Compose."
#~ msgstr "Menú es Componer."
diff --git a/xorg-server/xkeyboard-config/po/fr.po b/xorg-server/xkeyboard-config/po/fr.po
index d850685da..93d7197cc 100644
--- a/xorg-server/xkeyboard-config/po/fr.po
+++ b/xorg-server/xkeyboard-config/po/fr.po
@@ -9,10 +9,10 @@
#
msgid ""
msgstr ""
-"Project-Id-Version: xkeyboard-config 2.9.91\n"
+"Project-Id-Version: xkeyboard-config 2.10.99\n"
"Report-Msgid-Bugs-To: svu@users.sourceforge.net\n"
-"POT-Creation-Date: 2013-09-14 14:41+0200\n"
-"PO-Revision-Date: 2013-09-15 20:13+0200\n"
+"POT-Creation-Date: 2014-01-15 01:12+0000\n"
+"PO-Revision-Date: 2014-01-15 23:58+0100\n"
"Last-Translator: Jean-Philippe Guérard <jean-philippe.guerard@corbeaunoir.org>\n"
"Language-Team: French <traduc@traduc.org>\n"
"Language: fr\n"
@@ -826,7 +826,7 @@ msgid "English (programmer Dvorak)"
msgstr "Anglais (Dvorak pour programmeur)"
#. Keyboard indicator for Russian layouts
-#: ../rules/base.xml.in.h:203 ../rules/base.extras.xml.in.h:54
+#: ../rules/base.xml.in.h:203 ../rules/base.extras.xml.in.h:55
msgid "ru"
msgstr "ru"
@@ -902,11 +902,11 @@ msgid "Uzbek (Afghanistan, OLPC)"
msgstr "Ouzbek (Afghanistan, OLPC)"
#. Keyboard indicator for Arabic layouts
-#: ../rules/base.xml.in.h:224 ../rules/base.extras.xml.in.h:64
+#: ../rules/base.xml.in.h:224 ../rules/base.extras.xml.in.h:65
msgid "ar"
msgstr "ar"
-#: ../rules/base.xml.in.h:225 ../rules/base.extras.xml.in.h:65
+#: ../rules/base.xml.in.h:225 ../rules/base.extras.xml.in.h:66
msgid "Arabic"
msgstr "Arabe"
@@ -944,11 +944,11 @@ msgid "Albanian"
msgstr "Albanais"
#. Keyboard indicator for Armenian layouts
-#: ../rules/base.xml.in.h:236 ../rules/base.extras.xml.in.h:58
+#: ../rules/base.xml.in.h:236 ../rules/base.extras.xml.in.h:59
msgid "hy"
msgstr "hy"
-#: ../rules/base.xml.in.h:237 ../rules/base.extras.xml.in.h:59
+#: ../rules/base.xml.in.h:237 ../rules/base.extras.xml.in.h:60
msgid "Armenian"
msgstr "Arménien"
@@ -1024,11 +1024,11 @@ msgid "Belarusian (Latin)"
msgstr "Biélorusse (latin)"
#. Keyboard indicator for Belgian layouts
-#: ../rules/base.xml.in.h:259 ../rules/base.extras.xml.in.h:67
+#: ../rules/base.xml.in.h:259 ../rules/base.extras.xml.in.h:68
msgid "be"
msgstr "be"
-#: ../rules/base.xml.in.h:260 ../rules/base.extras.xml.in.h:68
+#: ../rules/base.xml.in.h:260 ../rules/base.extras.xml.in.h:69
msgid "Belgian"
msgstr "Belge"
@@ -1060,17 +1060,17 @@ msgstr "Belge (touches mortes Sun)"
msgid "Belgian (Wang model 724 azerty)"
msgstr "Belge (Wang modèle 724 azerty)"
-#. Keyboard indicator for Bengali layouts
+#. Keyboard indicator for Bangla layouts
#: ../rules/base.xml.in.h:269
msgid "bn"
msgstr "bn"
#: ../rules/base.xml.in.h:270
-msgid "Bengali"
+msgid "Bangla"
msgstr "Bengali"
#: ../rules/base.xml.in.h:271
-msgid "Bengali (Probhat)"
+msgid "Bangla (Probhat)"
msgstr "Bengali (Probhat)"
#. Keyboard indicator for Indian layouts
@@ -1083,28 +1083,28 @@ msgid "Indian"
msgstr "Indien"
#: ../rules/base.xml.in.h:275
-msgid "Bengali (India)"
+msgid "Bangla (India)"
msgstr "Bengali (Inde)"
#: ../rules/base.xml.in.h:276
-msgid "Bengali (India, Probhat)"
+msgid "Bangla (India, Probhat)"
msgstr "Bengali (Inde, Probhat)"
#: ../rules/base.xml.in.h:277
-msgid "Bengali (India, Baishakhi)"
+msgid "Bangla (India, Baishakhi)"
msgstr "Bengali (Inde, Baishakhi)"
#: ../rules/base.xml.in.h:278
-msgid "Bengali (India, Bornona)"
+msgid "Bangla (India, Bornona)"
msgstr "Bengali (Inde, Bornona)"
#: ../rules/base.xml.in.h:279
-msgid "Bengali (India, Uni Gitanjali)"
+msgid "Bangla (India, Uni Gitanjali)"
msgstr "Bengali (Inde, Uni Gitanjali)"
# InScript = Indian Script
#: ../rules/base.xml.in.h:280
-msgid "Bengali (India, Baishakhi Inscript)"
+msgid "Bangla (India, Baishakhi Inscript)"
msgstr "Bengali (Inde, Inscript Baishakhi)"
#. Keyboard indicator for Gujarati layouts
@@ -1298,11 +1298,11 @@ msgid "Bosnian (US keyboard with Bosnian letters)"
msgstr "Bosniaque (clavier US avec lettres bosniaques)"
#. Keyboard indicator for Portuguese layouts
-#: ../rules/base.xml.in.h:336 ../rules/base.extras.xml.in.h:70
+#: ../rules/base.xml.in.h:336 ../rules/base.extras.xml.in.h:71
msgid "pt"
msgstr "pt"
-#: ../rules/base.xml.in.h:337 ../rules/base.extras.xml.in.h:71
+#: ../rules/base.xml.in.h:337 ../rules/base.extras.xml.in.h:72
msgid "Portuguese (Brazil)"
msgstr "Portugais (Brésil)"
@@ -1317,16 +1317,16 @@ msgstr "Portugais (Brésil, Dvorak)"
# https://secure.wikimedia.org/wikipedia/en/wiki/Dvorak_Simplified_Keyboard#Other_languages
# http://tecladobrasileiro.com.br/images/stories/br-nativo/br-nativo-simples.svg
#: ../rules/base.xml.in.h:340
-msgid "Portuguese (Brazil, nativo)"
-msgstr "Portugais (Brésil, BR-Nativo)"
+msgid "Portuguese (Brazil, Nativo)"
+msgstr "Portugais (Brésil, Nativo)"
#: ../rules/base.xml.in.h:341
-msgid "Portuguese (Brazil, nativo for US keyboards)"
+msgid "Portuguese (Brazil, Nativo for US keyboards)"
msgstr "Portugais (Brésil, Nativo pour claviers US)"
#: ../rules/base.xml.in.h:342
-msgid "Portuguese (Brazil, nativo for Esperanto)"
-msgstr "Portugais (Brésil, BR-Nativo pour l'Espéranto)"
+msgid "Esperanto (Brazil, Nativo)"
+msgstr "Espéranto (Brésil, Nativo)"
#. Keyboard indicator for Bulgarian layouts
#: ../rules/base.xml.in.h:344
@@ -1481,2546 +1481,2566 @@ msgstr "Tibétain"
msgid "Tibetan (with ASCII numerals)"
msgstr "Tibétain (avec chiffres ASCII)"
-# https://secure.wikimedia.org/wikipedia/fr/wiki/Ou%C3%AFghour
#: ../rules/base.xml.in.h:386
+msgid "ug"
+msgstr "ug"
+
+# https://secure.wikimedia.org/wikipedia/fr/wiki/Ou%C3%AFghour
+#: ../rules/base.xml.in.h:387
msgid "Uyghur"
msgstr "Ouïghour"
#. Keyboard indicator for Croatian layouts
-#: ../rules/base.xml.in.h:388
+#: ../rules/base.xml.in.h:389
msgid "hr"
msgstr "hr"
-#: ../rules/base.xml.in.h:389
+#: ../rules/base.xml.in.h:390
msgid "Croatian"
msgstr "Croate"
-#: ../rules/base.xml.in.h:390
+#: ../rules/base.xml.in.h:391
msgid "Croatian (use guillemets for quotes)"
msgstr "Croate (utilise des guillemets typo. au lieu des guillemets simples)"
-#: ../rules/base.xml.in.h:391
+#: ../rules/base.xml.in.h:392
msgid "Croatian (use Croatian digraphs)"
msgstr "Croate (utilise les digraphes croates)"
-#: ../rules/base.xml.in.h:392
+#: ../rules/base.xml.in.h:393
msgid "Croatian (US keyboard with Croatian digraphs)"
msgstr "Croate (clavier US avec digraphes croates)"
-#: ../rules/base.xml.in.h:393
+#: ../rules/base.xml.in.h:394
msgid "Croatian (US keyboard with Croatian letters)"
msgstr "Croate (clavier US avec lettres croates)"
#. Keyboard indicator for Chech layouts
-#: ../rules/base.xml.in.h:395 ../rules/base.extras.xml.in.h:73
+#: ../rules/base.xml.in.h:396 ../rules/base.extras.xml.in.h:74
msgid "cs"
msgstr "cs"
-#: ../rules/base.xml.in.h:396 ../rules/base.extras.xml.in.h:74
+#: ../rules/base.xml.in.h:397 ../rules/base.extras.xml.in.h:75
msgid "Czech"
msgstr "Tchèque"
-#: ../rules/base.xml.in.h:397
+#: ../rules/base.xml.in.h:398
msgid "Czech (with &lt;\\|&gt; key)"
msgstr "Tchèque (avec la touche &lt;\\|&gt;)"
-#: ../rules/base.xml.in.h:398
+#: ../rules/base.xml.in.h:399
msgid "Czech (qwerty)"
msgstr "Tchèque (qwerty)"
-#: ../rules/base.xml.in.h:399
+#: ../rules/base.xml.in.h:400
msgid "Czech (qwerty, extended Backslash)"
msgstr "Tchèque (qwerty, barre oblique inverse étendue)"
# http://repo.or.cz/w/ucwcs-xkb.git/blob_plain/HEAD:/README
# http://www.ucw.cz/
-#: ../rules/base.xml.in.h:400
+#: ../rules/base.xml.in.h:401
msgid "Czech (UCW layout, accented letters only)"
msgstr "Tchèque (disposition UCW, lettres accentuées seulement)"
# http://repo.or.cz/w/ucwcs-xkb.git/blob_plain/HEAD:/README
# http://www.ucw.cz/
-#: ../rules/base.xml.in.h:401
+#: ../rules/base.xml.in.h:402
msgid "Czech (US Dvorak with CZ UCW support)"
msgstr "Tchèque (Dvorak US avec support UCW CZ)"
#. Keyboard indicator for Danish layouts
-#: ../rules/base.xml.in.h:403 ../rules/base.extras.xml.in.h:76
+#: ../rules/base.xml.in.h:404 ../rules/base.extras.xml.in.h:77
msgid "da"
msgstr "da"
-#: ../rules/base.xml.in.h:404 ../rules/base.extras.xml.in.h:77
+#: ../rules/base.xml.in.h:405 ../rules/base.extras.xml.in.h:78
msgid "Danish"
msgstr "Danois"
-#: ../rules/base.xml.in.h:405
+#: ../rules/base.xml.in.h:406
msgid "Danish (eliminate dead keys)"
msgstr "Danois (sans touche morte)"
-#: ../rules/base.xml.in.h:406
+#: ../rules/base.xml.in.h:407
msgid "Danish (Macintosh)"
msgstr "Danois (Macintosh)"
-#: ../rules/base.xml.in.h:407
+#: ../rules/base.xml.in.h:408
msgid "Danish (Macintosh, eliminate dead keys)"
msgstr "Danois (Macintosh, sans touche morte)"
-#: ../rules/base.xml.in.h:408
+#: ../rules/base.xml.in.h:409
msgid "Danish (Dvorak)"
msgstr "Danois (Dvorak)"
#. Keyboard indicator for Dutch layouts
-#: ../rules/base.xml.in.h:410 ../rules/base.extras.xml.in.h:79
+#: ../rules/base.xml.in.h:411 ../rules/base.extras.xml.in.h:80
msgid "nl"
msgstr "nl"
-#: ../rules/base.xml.in.h:411 ../rules/base.extras.xml.in.h:80
+#: ../rules/base.xml.in.h:412 ../rules/base.extras.xml.in.h:81
msgid "Dutch"
msgstr "Néerlandais"
-#: ../rules/base.xml.in.h:412
+#: ../rules/base.xml.in.h:413
msgid "Dutch (Sun dead keys)"
msgstr "Néerlandais (touches mortes Sun)"
-#: ../rules/base.xml.in.h:413
+#: ../rules/base.xml.in.h:414
msgid "Dutch (Macintosh)"
msgstr "Néerlandais (Macintosh)"
-#: ../rules/base.xml.in.h:414
+#: ../rules/base.xml.in.h:415
msgid "Dutch (standard)"
msgstr "Néerlandais (standard)"
#. Keyboard indicator for Dzongkha layouts
-#: ../rules/base.xml.in.h:416
+#: ../rules/base.xml.in.h:417
msgid "dz"
msgstr "dz"
-#: ../rules/base.xml.in.h:417
+#: ../rules/base.xml.in.h:418
msgid "Dzongkha"
msgstr "Dzongkha"
#. Keyboard indicator for Estonian layouts
-#: ../rules/base.xml.in.h:419 ../rules/base.extras.xml.in.h:82
+#: ../rules/base.xml.in.h:420 ../rules/base.extras.xml.in.h:83
msgid "et"
msgstr "et"
-#: ../rules/base.xml.in.h:420 ../rules/base.extras.xml.in.h:83
+#: ../rules/base.xml.in.h:421 ../rules/base.extras.xml.in.h:84
msgid "Estonian"
msgstr "Estonien"
-#: ../rules/base.xml.in.h:421
+#: ../rules/base.xml.in.h:422
msgid "Estonian (eliminate dead keys)"
msgstr "Estonien (sans touche morte)"
-#: ../rules/base.xml.in.h:422
+#: ../rules/base.xml.in.h:423
msgid "Estonian (Dvorak)"
msgstr "Estonien (Dvorak)"
-#: ../rules/base.xml.in.h:423
+#: ../rules/base.xml.in.h:424
msgid "Estonian (US keyboard with Estonian letters)"
msgstr "Estonien (clavier US avec lettres estoniennes)"
# https://secure.wikimedia.org/wikipedia/fr/wiki/Persan
-#: ../rules/base.xml.in.h:424 ../rules/base.extras.xml.in.h:16
+#: ../rules/base.xml.in.h:425 ../rules/base.extras.xml.in.h:16
msgid "Persian"
msgstr "Persan"
-#: ../rules/base.xml.in.h:425
+#: ../rules/base.xml.in.h:426
msgid "Persian (with Persian Keypad)"
msgstr "Persan (avec pavé numérique persan)"
#. Keyboard indicator for Kurdish layouts
-#: ../rules/base.xml.in.h:427
+#: ../rules/base.xml.in.h:428
msgid "ku"
msgstr "ku"
-#: ../rules/base.xml.in.h:428
+#: ../rules/base.xml.in.h:429
msgid "Kurdish (Iran, Latin Q)"
msgstr "Kurde (Iran, Q latin)"
-#: ../rules/base.xml.in.h:429
+#: ../rules/base.xml.in.h:430
msgid "Kurdish (Iran, F)"
msgstr "Kurde (Iran, F)"
-#: ../rules/base.xml.in.h:430
+#: ../rules/base.xml.in.h:431
msgid "Kurdish (Iran, Latin Alt-Q)"
msgstr "Kurde (Iran, Alt-Q latin)"
-#: ../rules/base.xml.in.h:431
+#: ../rules/base.xml.in.h:432
msgid "Kurdish (Iran, Arabic-Latin)"
msgstr "Kurde (Iran, arabe-latin)"
-#: ../rules/base.xml.in.h:432
+#: ../rules/base.xml.in.h:433
msgid "Iraqi"
msgstr "Irakien"
-#: ../rules/base.xml.in.h:433
+#: ../rules/base.xml.in.h:434
msgid "Kurdish (Iraq, Latin Q)"
msgstr "Kurde (Irak, Q latin)"
-#: ../rules/base.xml.in.h:434
+#: ../rules/base.xml.in.h:435
msgid "Kurdish (Iraq, F)"
msgstr "Kurde (Irak, F)"
-#: ../rules/base.xml.in.h:435
+#: ../rules/base.xml.in.h:436
msgid "Kurdish (Iraq, Latin Alt-Q)"
msgstr "Kurde (Irak, Alt-Q latin)"
-#: ../rules/base.xml.in.h:436
+#: ../rules/base.xml.in.h:437
msgid "Kurdish (Iraq, Arabic-Latin)"
msgstr "Kurde (Irak, arabe-latin)"
#. Keyboard indicator for Faroese layouts
-#: ../rules/base.xml.in.h:438
+#: ../rules/base.xml.in.h:439
msgid "fo"
msgstr "fo"
-#: ../rules/base.xml.in.h:439
+#: ../rules/base.xml.in.h:440
msgid "Faroese"
msgstr "Féroïen"
-#: ../rules/base.xml.in.h:440
+#: ../rules/base.xml.in.h:441
msgid "Faroese (eliminate dead keys)"
msgstr "Féroïen (sans touche morte)"
#. Keyboard indicator for Finnish layouts
-#: ../rules/base.xml.in.h:442 ../rules/base.extras.xml.in.h:85
+#: ../rules/base.xml.in.h:443 ../rules/base.extras.xml.in.h:86
msgid "fi"
msgstr "fi"
-#: ../rules/base.xml.in.h:443 ../rules/base.extras.xml.in.h:86
+#: ../rules/base.xml.in.h:444 ../rules/base.extras.xml.in.h:87
msgid "Finnish"
msgstr "Finnois"
-#: ../rules/base.xml.in.h:444
+#: ../rules/base.xml.in.h:445
msgid "Finnish (classic)"
msgstr "Finnois (classique)"
-#: ../rules/base.xml.in.h:445
+#: ../rules/base.xml.in.h:446
msgid "Finnish (classic, eliminate dead keys)"
msgstr "Finnois (classique, sans touche morte)"
-#: ../rules/base.xml.in.h:446
+#: ../rules/base.xml.in.h:447
msgid "Northern Saami (Finland)"
msgstr "Sami du Nord (Finlande)"
-#: ../rules/base.xml.in.h:447
+#: ../rules/base.xml.in.h:448
msgid "Finnish (Macintosh)"
msgstr "Finnois (Macintosh)"
-#: ../rules/base.xml.in.h:448 ../rules/base.extras.xml.in.h:88
+#: ../rules/base.xml.in.h:449 ../rules/base.extras.xml.in.h:89
msgid "French"
msgstr "Français"
-#: ../rules/base.xml.in.h:449
+#: ../rules/base.xml.in.h:450
msgid "French (eliminate dead keys)"
msgstr "Français (sans touche morte)"
-#: ../rules/base.xml.in.h:450
+#: ../rules/base.xml.in.h:451
msgid "French (Sun dead keys)"
msgstr "Français (touches mortes Sun)"
-#: ../rules/base.xml.in.h:451
+#: ../rules/base.xml.in.h:452
msgid "French (alternative)"
msgstr "Français (variante)"
-#: ../rules/base.xml.in.h:452
+#: ../rules/base.xml.in.h:453
msgid "French (alternative, Latin-9 only)"
msgstr "Français (variante, Latin-9 uniquement)"
-#: ../rules/base.xml.in.h:453
+#: ../rules/base.xml.in.h:454
msgid "French (alternative, eliminate dead keys)"
msgstr "Français (variante, sans touche morte)"
-#: ../rules/base.xml.in.h:454
+#: ../rules/base.xml.in.h:455
msgid "French (alternative, Sun dead keys)"
msgstr "Français (variante, touches mortes Sun)"
-#: ../rules/base.xml.in.h:455
+#: ../rules/base.xml.in.h:456
msgid "French (legacy, alternative)"
msgstr "Français (variante obsolète)"
-#: ../rules/base.xml.in.h:456
+#: ../rules/base.xml.in.h:457
msgid "French (legacy, alternative, eliminate dead keys)"
msgstr "Français (variante obsolète, sans touche morte)"
-#: ../rules/base.xml.in.h:457
+#: ../rules/base.xml.in.h:458
msgid "French (legacy, alternative, Sun dead keys)"
msgstr "Français (variante obsolète, touches mortes Sun)"
# http://bepo.fr
-#: ../rules/base.xml.in.h:458
+#: ../rules/base.xml.in.h:459
msgid "French (Bepo, ergonomic, Dvorak way)"
msgstr "Français (Bépo, ergonomique, façon Dvorak)"
# http://bepo.fr
-#: ../rules/base.xml.in.h:459
+#: ../rules/base.xml.in.h:460
msgid "French (Bepo, ergonomic, Dvorak way, Latin-9 only)"
msgstr "Français (Bépo, ergonomique, façon Dvorak, Latin-9 uniquement)"
-#: ../rules/base.xml.in.h:460
+#: ../rules/base.xml.in.h:461
msgid "French (Dvorak)"
msgstr "Français (Dvorak)"
-#: ../rules/base.xml.in.h:461
+#: ../rules/base.xml.in.h:462
msgid "French (Macintosh)"
msgstr "Français (Macintosh)"
-#: ../rules/base.xml.in.h:462
+#: ../rules/base.xml.in.h:463
msgid "French (Breton)"
msgstr "Français (breton)"
-#: ../rules/base.xml.in.h:463
+#: ../rules/base.xml.in.h:464
msgid "Occitan"
msgstr "Occitan"
# As the name suggests, this layout is based on French AZERTY keyboard. The layout is based on the Georgian AZERTY layout model by Georgian language and localizaton expert Vasil "Tskapo" Kekelia.
#
# http://www.gakartuleba.org/layouts/index.php
-#: ../rules/base.xml.in.h:464
+#: ../rules/base.xml.in.h:465
msgid "Georgian (France, AZERTY Tskapo)"
msgstr "Géorgien (France, azerty Tskapo)"
-#: ../rules/base.xml.in.h:465
+#: ../rules/base.xml.in.h:466
msgid "English (Ghana)"
msgstr "Anglais (Ghana)"
-#: ../rules/base.xml.in.h:466
+#: ../rules/base.xml.in.h:467
msgid "English (Ghana, multilingual)"
msgstr "Anglais (Ghana, multilingue)"
#. Keyboard indicator for Akan layouts
-#: ../rules/base.xml.in.h:468
+#: ../rules/base.xml.in.h:469
msgid "ak"
msgstr "ak"
-#: ../rules/base.xml.in.h:469
+#: ../rules/base.xml.in.h:470
msgid "Akan"
msgstr "Akan"
#. Keyboard indicator for Ewe layouts
-#: ../rules/base.xml.in.h:471
+#: ../rules/base.xml.in.h:472
msgid "ee"
msgstr "ee"
-#: ../rules/base.xml.in.h:472
+#: ../rules/base.xml.in.h:473
msgid "Ewe"
msgstr "Éwé"
#. Keyboard indicator for Fula layouts
-#: ../rules/base.xml.in.h:474
+#: ../rules/base.xml.in.h:475
msgid "ff"
msgstr "ff"
# https://secure.wikimedia.org/wikipedia/en/wiki/Fula_language
-#: ../rules/base.xml.in.h:475
+#: ../rules/base.xml.in.h:476
msgid "Fula"
msgstr "Peul"
#. Keyboard indicator for Ga layouts
-#: ../rules/base.xml.in.h:477
+#: ../rules/base.xml.in.h:478
msgid "gaa"
msgstr "gaa"
# Langue du Ghana.
-#: ../rules/base.xml.in.h:478
+#: ../rules/base.xml.in.h:479
msgid "Ga"
msgstr "Ga"
#. Keyboard indicator for Hausa layouts
-#: ../rules/base.xml.in.h:480
+#: ../rules/base.xml.in.h:481
msgid "ha"
msgstr "ha"
# https://secure.wikimedia.org/wikipedia/fr/wiki/Haoussa
-#: ../rules/base.xml.in.h:481
+#: ../rules/base.xml.in.h:482
msgid "Hausa"
msgstr "Haoussa"
#. Keyboard indicator for Avatime layouts
-#: ../rules/base.xml.in.h:483
+#: ../rules/base.xml.in.h:484
msgid "avn"
msgstr "avn"
-#: ../rules/base.xml.in.h:484
+#: ../rules/base.xml.in.h:485
msgid "Avatime"
msgstr "Avatime"
# http://www.gillbt.org/
-#: ../rules/base.xml.in.h:485
+#: ../rules/base.xml.in.h:486
msgid "English (Ghana, GILLBT)"
msgstr "Anglais (Ghana, GILLBT)"
-#: ../rules/base.xml.in.h:486
+#: ../rules/base.xml.in.h:487
msgid "French (Guinea)"
msgstr "Français (Guinée)"
#. Keyboard indicator for Georgian layouts
-#: ../rules/base.xml.in.h:488
+#: ../rules/base.xml.in.h:489
msgid "ka"
msgstr "ka"
-#: ../rules/base.xml.in.h:489
+#: ../rules/base.xml.in.h:490
msgid "Georgian"
msgstr "Géorgien"
-#: ../rules/base.xml.in.h:490
+#: ../rules/base.xml.in.h:491
msgid "Georgian (ergonomic)"
msgstr "Géorgien (ergonomique)"
-#: ../rules/base.xml.in.h:491
+#: ../rules/base.xml.in.h:492
msgid "Georgian (MESS)"
msgstr "Géorgien (MESS)"
-#: ../rules/base.xml.in.h:492
+#: ../rules/base.xml.in.h:493
msgid "Russian (Georgia)"
msgstr "Russe (Géorgie)"
-#: ../rules/base.xml.in.h:493
+#: ../rules/base.xml.in.h:494
msgid "Ossetian (Georgia)"
msgstr "Ossète (Géorgie)"
-#: ../rules/base.xml.in.h:494 ../rules/base.extras.xml.in.h:11
+#: ../rules/base.xml.in.h:495 ../rules/base.extras.xml.in.h:11
msgid "German"
msgstr "Allemand"
-#: ../rules/base.xml.in.h:495
+#: ../rules/base.xml.in.h:496
msgid "German (dead acute)"
msgstr "Allemand (accent aigu en touche morte)"
-#: ../rules/base.xml.in.h:496
+#: ../rules/base.xml.in.h:497
msgid "German (dead grave acute)"
msgstr "Allemand (accents aigu et grave en touches mortes)"
-#: ../rules/base.xml.in.h:497
+#: ../rules/base.xml.in.h:498
msgid "German (eliminate dead keys)"
msgstr "Allemand (sans touche morte)"
# https://de.wikipedia.org/wiki/ISO/IEC_9995
-#: ../rules/base.xml.in.h:498
+#: ../rules/base.xml.in.h:499
msgid "German (T3)"
msgstr "Allemand (T3)"
-#: ../rules/base.xml.in.h:499
+#: ../rules/base.xml.in.h:500
msgid "Romanian (Germany)"
msgstr "Roumain (Allemagne)"
-#: ../rules/base.xml.in.h:500
+#: ../rules/base.xml.in.h:501
msgid "Romanian (Germany, eliminate dead keys)"
msgstr "Roumain (Allemagne, sans touche morte)"
-#: ../rules/base.xml.in.h:501
+#: ../rules/base.xml.in.h:502
msgid "German (Dvorak)"
msgstr "Allemand (Dvorak)"
-#: ../rules/base.xml.in.h:502
+#: ../rules/base.xml.in.h:503
msgid "German (Sun dead keys)"
msgstr "Allemand (touches mortes Sun)"
# https://secure.wikimedia.org/wikipedia/en/wiki/Keyboard_layout#Neo
-#: ../rules/base.xml.in.h:503
+#: ../rules/base.xml.in.h:504
msgid "German (Neo 2)"
msgstr "Allemand (Neo 2)"
-#: ../rules/base.xml.in.h:504
+#: ../rules/base.xml.in.h:505
msgid "German (Macintosh)"
msgstr "Allemand (Macintosh)"
-#: ../rules/base.xml.in.h:505
+#: ../rules/base.xml.in.h:506
msgid "German (Macintosh, eliminate dead keys)"
msgstr "Allemand (Macintosh, sans touche morte)"
-#: ../rules/base.xml.in.h:506
+#: ../rules/base.xml.in.h:507
msgid "Lower Sorbian"
msgstr "Bas-sorabe"
# https://secure.wikimedia.org/wikipedia/fr/wiki/Bas-sorabe
-#: ../rules/base.xml.in.h:507
+#: ../rules/base.xml.in.h:508
msgid "Lower Sorbian (qwertz)"
msgstr "Bas-sorabe (qwertz)"
-#: ../rules/base.xml.in.h:508
+#: ../rules/base.xml.in.h:509
msgid "German (qwerty)"
msgstr "Allemand (qwerty)"
-#: ../rules/base.xml.in.h:509
+#: ../rules/base.xml.in.h:510
msgid "Russian (Germany, phonetic)"
msgstr "Russe (Allemagne, phonétique)"
-#: ../rules/base.xml.in.h:510
+#: ../rules/base.xml.in.h:511
msgid "German (legacy)"
msgstr "Allemand (obsolète)"
#. Keyboard indicator for Greek layouts
-#: ../rules/base.xml.in.h:512 ../rules/base.extras.xml.in.h:90
+#: ../rules/base.xml.in.h:513 ../rules/base.extras.xml.in.h:91
msgid "gr"
msgstr "gr"
-#: ../rules/base.xml.in.h:513 ../rules/base.extras.xml.in.h:91
+#: ../rules/base.xml.in.h:514 ../rules/base.extras.xml.in.h:92
msgid "Greek"
msgstr "Grec"
-#: ../rules/base.xml.in.h:514
+#: ../rules/base.xml.in.h:515
msgid "Greek (simple)"
msgstr "Grec (simple)"
-#: ../rules/base.xml.in.h:515
+#: ../rules/base.xml.in.h:516
msgid "Greek (extended)"
msgstr "Grec (étendu)"
-#: ../rules/base.xml.in.h:516
+#: ../rules/base.xml.in.h:517
msgid "Greek (eliminate dead keys)"
msgstr "Grec (sans touche morte)"
# https://secure.wikimedia.org/wikipedia/fr/wiki/Diacritiques_de_l%27alphabet_grec
-#: ../rules/base.xml.in.h:517
+#: ../rules/base.xml.in.h:518
msgid "Greek (polytonic)"
msgstr "Grec (polytonique)"
#. Keyboard indicator for Hungarian layouts
-#: ../rules/base.xml.in.h:519
+#: ../rules/base.xml.in.h:520
msgid "hu"
msgstr "hu"
# https://secure.wikimedia.org/wikipedia/fr/wiki/Hongrois
-#: ../rules/base.xml.in.h:520
+#: ../rules/base.xml.in.h:521
msgid "Hungarian"
msgstr "Hongrois"
-#: ../rules/base.xml.in.h:521
+#: ../rules/base.xml.in.h:522
msgid "Hungarian (standard)"
msgstr "Hongrois (standard)"
-#: ../rules/base.xml.in.h:522
+#: ../rules/base.xml.in.h:523
msgid "Hungarian (eliminate dead keys)"
msgstr "Hongrois (sans touche morte)"
-#: ../rules/base.xml.in.h:523
+#: ../rules/base.xml.in.h:524
msgid "Hungarian (qwerty)"
msgstr "Hongrois (qwerty)"
-#: ../rules/base.xml.in.h:524
+#: ../rules/base.xml.in.h:525
msgid "Hungarian (101/qwertz/comma/dead keys)"
msgstr "Hongrois (101, qwertz, virgule, touches mortes)"
-#: ../rules/base.xml.in.h:525
+#: ../rules/base.xml.in.h:526
msgid "Hungarian (101/qwertz/comma/eliminate dead keys)"
msgstr "Hongrois (101, qwertz, virgule, touches mortes)"
-#: ../rules/base.xml.in.h:526
+#: ../rules/base.xml.in.h:527
msgid "Hungarian (101/qwertz/dot/dead keys)"
msgstr "Hongrois (101, qwertz, point, touches mortes)"
-#: ../rules/base.xml.in.h:527
+#: ../rules/base.xml.in.h:528
msgid "Hungarian (101/qwertz/dot/eliminate dead keys)"
msgstr "Hongrois (101, qwertz, point, sans touche morte)"
-#: ../rules/base.xml.in.h:528
+#: ../rules/base.xml.in.h:529
msgid "Hungarian (101/qwerty/comma/dead keys)"
msgstr "Hongrois (101, qwerty, virgule, touches mortes)"
-#: ../rules/base.xml.in.h:529
+#: ../rules/base.xml.in.h:530
msgid "Hungarian (101/qwerty/comma/eliminate dead keys)"
msgstr "Hongrois (101, qwerty, virgule, sans touche morte)"
-#: ../rules/base.xml.in.h:530
+#: ../rules/base.xml.in.h:531
msgid "Hungarian (101/qwerty/dot/dead keys)"
msgstr "Hongrois (101, qwerty, point, touches mortes)"
-#: ../rules/base.xml.in.h:531
+#: ../rules/base.xml.in.h:532
msgid "Hungarian (101/qwerty/dot/eliminate dead keys)"
msgstr "Hongrois (101, qwerty, point, sans touche morte)"
-#: ../rules/base.xml.in.h:532
+#: ../rules/base.xml.in.h:533
msgid "Hungarian (102/qwertz/comma/dead keys)"
msgstr "Hongrois (102, qwertz, virgule, touches mortes)"
-#: ../rules/base.xml.in.h:533
+#: ../rules/base.xml.in.h:534
msgid "Hungarian (102/qwertz/comma/eliminate dead keys)"
msgstr "Hongrois (102, qwertz, virgule, sans touche morte)"
-#: ../rules/base.xml.in.h:534
+#: ../rules/base.xml.in.h:535
msgid "Hungarian (102/qwertz/dot/dead keys)"
msgstr "Hongrois (102, qwertz, point, touches mortes)"
-#: ../rules/base.xml.in.h:535
+#: ../rules/base.xml.in.h:536
msgid "Hungarian (102/qwertz/dot/eliminate dead keys)"
msgstr "Hongrois (102, qwertz, point, sans touche morte)"
-#: ../rules/base.xml.in.h:536
+#: ../rules/base.xml.in.h:537
msgid "Hungarian (102/qwerty/comma/dead keys)"
msgstr "Hongrois (102, qwerty, virgule, touches mortes)"
-#: ../rules/base.xml.in.h:537
+#: ../rules/base.xml.in.h:538
msgid "Hungarian (102/qwerty/comma/eliminate dead keys)"
msgstr "Hongrois (102, qwerty, virgule, sans touche morte)"
-#: ../rules/base.xml.in.h:538
+#: ../rules/base.xml.in.h:539
msgid "Hungarian (102/qwerty/dot/dead keys)"
msgstr "Hongrois (102, qwerty, point, touches mortes)"
-#: ../rules/base.xml.in.h:539
+#: ../rules/base.xml.in.h:540
msgid "Hungarian (102/qwerty/dot/eliminate dead keys)"
msgstr "Hongrois (102, qwerty, point, sans touche morte)"
#. Keyboard indicator for Icelandic layouts
-#: ../rules/base.xml.in.h:541
+#: ../rules/base.xml.in.h:542
msgid "is"
msgstr "is"
# https://secure.wikimedia.org/wikipedia/fr/wiki/Islandais
-#: ../rules/base.xml.in.h:542
+#: ../rules/base.xml.in.h:543
msgid "Icelandic"
msgstr "Islandais"
-#: ../rules/base.xml.in.h:543
+#: ../rules/base.xml.in.h:544
msgid "Icelandic (Sun dead keys)"
msgstr "Islandais (touches mortes Sun)"
-#: ../rules/base.xml.in.h:544
+#: ../rules/base.xml.in.h:545
msgid "Icelandic (eliminate dead keys)"
msgstr "Islandais (sans touche morte)"
-#: ../rules/base.xml.in.h:545
+#: ../rules/base.xml.in.h:546
msgid "Icelandic (Macintosh)"
msgstr "Islandais (Macintosh)"
-#: ../rules/base.xml.in.h:546
+#: ../rules/base.xml.in.h:547
msgid "Icelandic (Dvorak)"
msgstr "Islandais (Dvorak)"
#. Keyboard indicator for Hebrew layouts
-#: ../rules/base.xml.in.h:548 ../rules/base.extras.xml.in.h:61
+#: ../rules/base.xml.in.h:549 ../rules/base.extras.xml.in.h:62
msgid "he"
msgstr "he"
-#: ../rules/base.xml.in.h:549 ../rules/base.extras.xml.in.h:62
+#: ../rules/base.xml.in.h:550 ../rules/base.extras.xml.in.h:63
msgid "Hebrew"
msgstr "Hébreu"
-#: ../rules/base.xml.in.h:550
+#: ../rules/base.xml.in.h:551
msgid "Hebrew (lyx)"
msgstr "Hébreu (lyx)"
-#: ../rules/base.xml.in.h:551
+#: ../rules/base.xml.in.h:552
msgid "Hebrew (phonetic)"
msgstr "Hébreu (phonétique)"
# http://wiki.jewishliturgy.org/Hebrew_Font_and_Keyboard_Layout_Setup
-#: ../rules/base.xml.in.h:552
+#: ../rules/base.xml.in.h:553
msgid "Hebrew (Biblical, Tiro)"
msgstr "Hébreu (biblique, Tiro)"
#. Keyboard indicator for Italian layouts
-#: ../rules/base.xml.in.h:554 ../rules/base.extras.xml.in.h:93
+#: ../rules/base.xml.in.h:555 ../rules/base.extras.xml.in.h:94
msgid "it"
msgstr "it"
-#: ../rules/base.xml.in.h:555 ../rules/base.extras.xml.in.h:94
+#: ../rules/base.xml.in.h:556 ../rules/base.extras.xml.in.h:95
msgid "Italian"
msgstr "Italien"
-#: ../rules/base.xml.in.h:556
+#: ../rules/base.xml.in.h:557
msgid "Italian (eliminate dead keys)"
msgstr "Italien (sans touche morte)"
-#: ../rules/base.xml.in.h:557
+#: ../rules/base.xml.in.h:558
msgid "Italian (Macintosh)"
msgstr "Italien (Macintosh)"
-#: ../rules/base.xml.in.h:558
+#: ../rules/base.xml.in.h:559
msgid "Italian (US keyboard with Italian letters)"
msgstr "Italien (clavier US avec lettres italiennes)"
# https://secure.wikimedia.org/wikipedia/fr/wiki/Oss%C3%A8te
-#: ../rules/base.xml.in.h:559
+#: ../rules/base.xml.in.h:560
msgid "Georgian (Italy)"
msgstr "Géorgien (Italie)"
-#: ../rules/base.xml.in.h:560
+#: ../rules/base.xml.in.h:561
msgid "Italian (IBM 142)"
msgstr "Italien (IBM 142)"
#. Keyboard indicator for Japanese layouts
-#: ../rules/base.xml.in.h:562 ../rules/base.extras.xml.in.h:96
+#: ../rules/base.xml.in.h:563 ../rules/base.extras.xml.in.h:97
msgid "ja"
msgstr "ja"
-#: ../rules/base.xml.in.h:563 ../rules/base.extras.xml.in.h:97
+#: ../rules/base.xml.in.h:564 ../rules/base.extras.xml.in.h:98
msgid "Japanese"
msgstr "Japonais"
-#: ../rules/base.xml.in.h:564
+#: ../rules/base.xml.in.h:565
msgid "Japanese (Kana)"
msgstr "Japonais (Kana)"
-#: ../rules/base.xml.in.h:565
+#: ../rules/base.xml.in.h:566
msgid "Japanese (Kana 86)"
msgstr "Japonais (Kana 86)"
-#: ../rules/base.xml.in.h:566
+#: ../rules/base.xml.in.h:567
msgid "Japanese (OADG 109A)"
msgstr "Japonais (OADG 109A)"
-#: ../rules/base.xml.in.h:567
+#: ../rules/base.xml.in.h:568
msgid "Japanese (Macintosh)"
msgstr "Japonais (Macintosh)"
-#: ../rules/base.xml.in.h:568
+#: ../rules/base.xml.in.h:569
msgid "Japanese (Dvorak)"
msgstr "Japonais (Dvorak)"
#. Keyboard indicator for Kikuyu layouts
-#: ../rules/base.xml.in.h:570
+#: ../rules/base.xml.in.h:571
msgid "ki"
msgstr "ki"
# https://secure.wikimedia.org/wikipedia/fr/wiki/Kirghize_%28langue%29
-#: ../rules/base.xml.in.h:571
+#: ../rules/base.xml.in.h:572
msgid "Kyrgyz"
msgstr "Kirghize"
-#: ../rules/base.xml.in.h:572
+#: ../rules/base.xml.in.h:573
msgid "Kyrgyz (phonetic)"
msgstr "Kirghize (phonétique)"
#. Keyboard indicator for Khmer layouts
-#: ../rules/base.xml.in.h:574
+#: ../rules/base.xml.in.h:575
msgid "km"
msgstr "km"
# https://secure.wikimedia.org/wikipedia/fr/wiki/Khmer
-#: ../rules/base.xml.in.h:575
+#: ../rules/base.xml.in.h:576
msgid "Khmer (Cambodia)"
msgstr "Khmer (Cambodge)"
#. Keyboard indicator for Kazakh layouts
-#: ../rules/base.xml.in.h:577
+#: ../rules/base.xml.in.h:578
msgid "kk"
msgstr "kk"
# https://secure.wikimedia.org/wikipedia/fr/wiki/Kazakh
-#: ../rules/base.xml.in.h:578
+#: ../rules/base.xml.in.h:579
msgid "Kazakh"
msgstr "Kazakh"
# https://secure.wikimedia.org/wikipedia/fr/wiki/Kazakhstan
# https://secure.wikimedia.org/wikipedia/fr/wiki/Kazakh
-#: ../rules/base.xml.in.h:579
+#: ../rules/base.xml.in.h:580
msgid "Russian (Kazakhstan, with Kazakh)"
msgstr "Russe (Kazakhstan, avec kazakh)"
-#: ../rules/base.xml.in.h:580
+#: ../rules/base.xml.in.h:581
msgid "Kazakh (with Russian)"
msgstr "Kazakh (avec russe)"
#. Keyboard indicator for Lao layouts
-#: ../rules/base.xml.in.h:582
+#: ../rules/base.xml.in.h:583
msgid "lo"
msgstr "lo"
# https://secure.wikimedia.org/wikipedia/fr/wiki/Lao_%28langue%29
-#: ../rules/base.xml.in.h:583
+#: ../rules/base.xml.in.h:584
msgid "Lao"
msgstr "Lao"
# STEA = Agence pour la science, la technologie et l'environnement.
# http://www.clear-vu.com.hk/resources/lao_keyboard.asp
-#: ../rules/base.xml.in.h:584
+#: ../rules/base.xml.in.h:585
msgid "Lao (STEA proposed standard layout)"
msgstr "Lao (disposition proposée par la STEA)"
#. Keyboard indicator for Spanish layouts
-#: ../rules/base.xml.in.h:586 ../rules/base.extras.xml.in.h:109
+#: ../rules/base.xml.in.h:587 ../rules/base.extras.xml.in.h:110
msgid "es"
msgstr "es"
-#: ../rules/base.xml.in.h:587
+#: ../rules/base.xml.in.h:588
msgid "Spanish (Latin American)"
msgstr "Espagnol (Amérique latine)"
-#: ../rules/base.xml.in.h:588
+#: ../rules/base.xml.in.h:589
msgid "Spanish (Latin American, eliminate dead keys)"
msgstr "Espagnol (Amérique latine, sans touche morte)"
-#: ../rules/base.xml.in.h:589
+#: ../rules/base.xml.in.h:590
msgid "Spanish (Latin American, include dead tilde)"
msgstr "Espagnol (Amérique latine, y compris la touche morte tilde)"
-#: ../rules/base.xml.in.h:590
+#: ../rules/base.xml.in.h:591
msgid "Spanish (Latin American, Sun dead keys)"
msgstr "Espagnol (Amérique latine, touches mortes Sun)"
#. Keyboard indicator for Lithuanian layouts
-#: ../rules/base.xml.in.h:592 ../rules/base.extras.xml.in.h:18
+#: ../rules/base.xml.in.h:593 ../rules/base.extras.xml.in.h:18
msgid "lt"
msgstr "lt"
# https://secure.wikimedia.org/wikipedia/fr/wiki/Lituanien
-#: ../rules/base.xml.in.h:593 ../rules/base.extras.xml.in.h:19
+#: ../rules/base.xml.in.h:594 ../rules/base.extras.xml.in.h:19
msgid "Lithuanian"
msgstr "Lituanien"
-#: ../rules/base.xml.in.h:594
+#: ../rules/base.xml.in.h:595
msgid "Lithuanian (standard)"
msgstr "Lituanien (standard)"
-#: ../rules/base.xml.in.h:595
+#: ../rules/base.xml.in.h:596
msgid "Lithuanian (US keyboard with Lithuanian letters)"
msgstr "Lituanien (clavier US avec lettres lituaniennes)"
-#: ../rules/base.xml.in.h:596
+#: ../rules/base.xml.in.h:597
msgid "Lithuanian (IBM LST 1205-92)"
msgstr "Lituanien (IBM LST 1205-92)"
# http://lekp.info/LithuanianErgonomic
-#: ../rules/base.xml.in.h:597
+#: ../rules/base.xml.in.h:598
msgid "Lithuanian (LEKP)"
msgstr "Lituanien (LEKP)"
-#: ../rules/base.xml.in.h:598
+#: ../rules/base.xml.in.h:599
msgid "Lithuanian (LEKPa)"
msgstr "Lituanien (LEKPa)"
#. Keyboard indicator for Latvian layouts
-#: ../rules/base.xml.in.h:600 ../rules/base.extras.xml.in.h:22
+#: ../rules/base.xml.in.h:601 ../rules/base.extras.xml.in.h:22
msgid "lv"
msgstr "lv"
-#: ../rules/base.xml.in.h:601 ../rules/base.extras.xml.in.h:23
+#: ../rules/base.xml.in.h:602 ../rules/base.extras.xml.in.h:23
msgid "Latvian"
msgstr "Letton"
-#: ../rules/base.xml.in.h:602
+#: ../rules/base.xml.in.h:603
msgid "Latvian (apostrophe variant)"
msgstr "Letton (variante apostrophe)"
-#: ../rules/base.xml.in.h:603
+#: ../rules/base.xml.in.h:604
msgid "Latvian (tilde variant)"
msgstr "Letton (variante tilde)"
-#: ../rules/base.xml.in.h:604
+#: ../rules/base.xml.in.h:605
msgid "Latvian (F variant)"
msgstr "Letton (variante F)"
-#: ../rules/base.xml.in.h:605
+#: ../rules/base.xml.in.h:606
msgid "Latvian (modern)"
msgstr "Letton (moderne)"
-#: ../rules/base.xml.in.h:606
+#: ../rules/base.xml.in.h:607
msgid "Latvian (ergonomic, ŪGJRMV)"
msgstr "Letton (ergonomique, ŪGJRMV)"
-#: ../rules/base.xml.in.h:607
+#: ../rules/base.xml.in.h:608
msgid "Latvian (adapted)"
msgstr "Letton (adapté)"
#. Keyboard indicator for Maori layouts
-#: ../rules/base.xml.in.h:609
+#: ../rules/base.xml.in.h:610
msgid "mi"
msgstr "mi"
-#: ../rules/base.xml.in.h:610
+#: ../rules/base.xml.in.h:611
msgid "Maori"
msgstr "Maori"
#. Keyboard indicator for Serbian layouts
-#: ../rules/base.xml.in.h:612 ../rules/base.extras.xml.in.h:51
+#: ../rules/base.xml.in.h:613 ../rules/base.extras.xml.in.h:52
msgid "sr"
msgstr "sr"
# https://secure.wikimedia.org/wikipedia/fr/wiki/Mont%C3%A9n%C3%A9grin
-#: ../rules/base.xml.in.h:613
+#: ../rules/base.xml.in.h:614
msgid "Montenegrin"
msgstr "Monténégrin"
-#: ../rules/base.xml.in.h:614
+#: ../rules/base.xml.in.h:615
msgid "Montenegrin (Cyrillic)"
msgstr "Monténégrin (cyrillique)"
-#: ../rules/base.xml.in.h:615
+#: ../rules/base.xml.in.h:616
msgid "Montenegrin (Cyrillic, Z and ZHE swapped)"
msgstr "Monténégrin (cyrillique, Z et ZHE intervertis)"
-#: ../rules/base.xml.in.h:616
+#: ../rules/base.xml.in.h:617
msgid "Montenegrin (Latin Unicode)"
msgstr "Monténégrin (Unicode latin)"
-#: ../rules/base.xml.in.h:617
+#: ../rules/base.xml.in.h:618
msgid "Montenegrin (Latin qwerty)"
msgstr "Monténégrin (qwerty latin)"
-#: ../rules/base.xml.in.h:618
+#: ../rules/base.xml.in.h:619
msgid "Montenegrin (Latin Unicode qwerty)"
msgstr "Monténégrin (qwerty Unicode latin)"
-#: ../rules/base.xml.in.h:619
+#: ../rules/base.xml.in.h:620
msgid "Montenegrin (Cyrillic with guillemets)"
msgstr "Monténégrin (cyrillique avec guillemets)"
-#: ../rules/base.xml.in.h:620
+#: ../rules/base.xml.in.h:621
msgid "Montenegrin (Latin with guillemets)"
msgstr "Monténégrin (latin avec guillemets)"
#. Keyboard indicator for Macedonian layouts
-#: ../rules/base.xml.in.h:622
+#: ../rules/base.xml.in.h:623
msgid "mk"
msgstr "mk"
# https://secure.wikimedia.org/wikipedia/fr/wiki/Mac%C3%A9donien
-#: ../rules/base.xml.in.h:623
+#: ../rules/base.xml.in.h:624
msgid "Macedonian"
msgstr "Macédonien"
-#: ../rules/base.xml.in.h:624
+#: ../rules/base.xml.in.h:625
msgid "Macedonian (eliminate dead keys)"
msgstr "Macédonien (sans touche morte)"
#. Keyboard indicator for Maltese layouts
-#: ../rules/base.xml.in.h:626
+#: ../rules/base.xml.in.h:627
msgid "mt"
msgstr "mt"
# https://secure.wikimedia.org/wikipedia/fr/wiki/Maltais
-#: ../rules/base.xml.in.h:627
+#: ../rules/base.xml.in.h:628
msgid "Maltese"
msgstr "Maltais"
-#: ../rules/base.xml.in.h:628
+#: ../rules/base.xml.in.h:629
msgid "Maltese (with US layout)"
msgstr "Maltais (avec disposition US)"
#. Keyboard indicator for Mongolian layouts
-#: ../rules/base.xml.in.h:630
+#: ../rules/base.xml.in.h:631
msgid "mn"
msgstr "mn"
# https://secure.wikimedia.org/wikipedia/fr/wiki/Mongol
-#: ../rules/base.xml.in.h:631
+#: ../rules/base.xml.in.h:632
msgid "Mongolian"
msgstr "Mongol"
#. Keyboard indicator for Norwegian layouts
-#: ../rules/base.xml.in.h:633 ../rules/base.extras.xml.in.h:101
+#: ../rules/base.xml.in.h:634 ../rules/base.extras.xml.in.h:102
msgid "no"
msgstr "no"
# https://secure.wikimedia.org/wikipedia/fr/wiki/Norv%C3%A9gien
-#: ../rules/base.xml.in.h:634 ../rules/base.extras.xml.in.h:102
+#: ../rules/base.xml.in.h:635 ../rules/base.extras.xml.in.h:103
msgid "Norwegian"
msgstr "Norvégien"
-#: ../rules/base.xml.in.h:635
+#: ../rules/base.xml.in.h:636
msgid "Norwegian (eliminate dead keys)"
msgstr "Norvégien (sans touche morte)"
-#: ../rules/base.xml.in.h:636
+#: ../rules/base.xml.in.h:637
msgid "Norwegian (Dvorak)"
msgstr "Norvégien (Dvorak)"
-#: ../rules/base.xml.in.h:637
+#: ../rules/base.xml.in.h:638
msgid "Northern Saami (Norway)"
msgstr "Sami du Nord (Norvège)"
-#: ../rules/base.xml.in.h:638
+#: ../rules/base.xml.in.h:639
msgid "Northern Saami (Norway, eliminate dead keys)"
msgstr "Sami du Nord (Norvège, sans touche morte)"
-#: ../rules/base.xml.in.h:639
+#: ../rules/base.xml.in.h:640
msgid "Norwegian (Macintosh)"
msgstr "Norvégien (Macintosh)"
-#: ../rules/base.xml.in.h:640
+#: ../rules/base.xml.in.h:641
msgid "Norwegian (Macintosh, eliminate dead keys)"
msgstr "Norvégien (Macintosh, sans touche morte)"
-#: ../rules/base.xml.in.h:641
+#: ../rules/base.xml.in.h:642
msgid "Norwegian (Colemak)"
msgstr "Norvégien (Colemak)"
#. Keyboard indicator for Polish layouts
-#: ../rules/base.xml.in.h:643 ../rules/base.extras.xml.in.h:40
+#: ../rules/base.xml.in.h:644 ../rules/base.extras.xml.in.h:41
msgid "pl"
msgstr "pl"
# https://secure.wikimedia.org/wikipedia/fr/wiki/Polonais
-#: ../rules/base.xml.in.h:644 ../rules/base.extras.xml.in.h:41
+#: ../rules/base.xml.in.h:645 ../rules/base.extras.xml.in.h:42
msgid "Polish"
msgstr "Polonais"
-#: ../rules/base.xml.in.h:645
+#: ../rules/base.xml.in.h:646
msgid "Polish (legacy)"
msgstr "Polonais (obsolète)"
-#: ../rules/base.xml.in.h:646
+#: ../rules/base.xml.in.h:647
msgid "Polish (qwertz)"
msgstr "Polonais (qwertz)"
-#: ../rules/base.xml.in.h:647
+#: ../rules/base.xml.in.h:648
msgid "Polish (Dvorak)"
msgstr "Polonais (Dvorak)"
# https://secure.wikimedia.org/wikipedia/fr/wiki/Disposition_Dvorak
#
# Sur le clavier Dvorak, les guillemets sont sur une seule et même touche.
-#: ../rules/base.xml.in.h:648
+#: ../rules/base.xml.in.h:649
msgid "Polish (Dvorak, Polish quotes on quotemark key)"
msgstr "Polonais (Dvorak, guillemets polonais sur la touche guillemets)"
-#: ../rules/base.xml.in.h:649
+#: ../rules/base.xml.in.h:650
msgid "Polish (Dvorak, Polish quotes on key 1)"
msgstr "Polonais (Dvorak, guillemets polonais sur le « 1 »)"
# https://secure.wikimedia.org/wikipedia/fr/wiki/Cachoube
-#: ../rules/base.xml.in.h:650
+#: ../rules/base.xml.in.h:651
msgid "Kashubian"
msgstr "Cachoube"
-#: ../rules/base.xml.in.h:651
+#: ../rules/base.xml.in.h:652
msgid "Russian (Poland, phonetic Dvorak)"
msgstr "Russe (Pologne, Dvorak phonétique)"
-#: ../rules/base.xml.in.h:652
+#: ../rules/base.xml.in.h:653
msgid "Polish (programmer Dvorak)"
msgstr "Polonais (Dvorak pour le programmeur)"
-#: ../rules/base.xml.in.h:653 ../rules/base.extras.xml.in.h:104
+#: ../rules/base.xml.in.h:654 ../rules/base.extras.xml.in.h:105
msgid "Portuguese"
msgstr "Portugais"
-#: ../rules/base.xml.in.h:654
+#: ../rules/base.xml.in.h:655
msgid "Portuguese (eliminate dead keys)"
msgstr "Portugais (sans touche morte)"
-#: ../rules/base.xml.in.h:655
+#: ../rules/base.xml.in.h:656
msgid "Portuguese (Sun dead keys)"
msgstr "Portugais (touches mortes Sun)"
-#: ../rules/base.xml.in.h:656
+#: ../rules/base.xml.in.h:657
msgid "Portuguese (Macintosh)"
msgstr "Portugais (Macintosh)"
-#: ../rules/base.xml.in.h:657
+#: ../rules/base.xml.in.h:658
msgid "Portuguese (Macintosh, eliminate dead keys)"
msgstr "Portugais (Macintosh, sans touche morte)"
-#: ../rules/base.xml.in.h:658
+#: ../rules/base.xml.in.h:659
msgid "Portuguese (Macintosh, Sun dead keys)"
msgstr "Portugais (Macintosh, touches mortes Sun)"
-#: ../rules/base.xml.in.h:659
+#: ../rules/base.xml.in.h:660
msgid "Portuguese (Nativo)"
msgstr "Portugais (PT-Nativo)"
-#: ../rules/base.xml.in.h:660
+#: ../rules/base.xml.in.h:661
msgid "Portuguese (Nativo for US keyboards)"
msgstr "Portugais (Nativo pour claviers US)"
# http://tecladobrasileiro.com.br/index.php?option=com_content&task=view&id=20&Itemid=62
-#: ../rules/base.xml.in.h:661
+#: ../rules/base.xml.in.h:662
msgid "Esperanto (Portugal, Nativo)"
msgstr "Espéranto (Portugal, PT-Nativo)"
#. Keyboard indicator for Romanian layouts
-#: ../rules/base.xml.in.h:663 ../rules/base.extras.xml.in.h:45
+#: ../rules/base.xml.in.h:664 ../rules/base.extras.xml.in.h:46
msgid "ro"
msgstr "ro"
# https://secure.wikimedia.org/wikipedia/fr/wiki/Roumain
-#: ../rules/base.xml.in.h:664 ../rules/base.extras.xml.in.h:46
+#: ../rules/base.xml.in.h:665 ../rules/base.extras.xml.in.h:47
msgid "Romanian"
msgstr "Roumain"
-#: ../rules/base.xml.in.h:665
+#: ../rules/base.xml.in.h:666
msgid "Romanian (cedilla)"
msgstr "Roumain (cédille)"
-#: ../rules/base.xml.in.h:666
+#: ../rules/base.xml.in.h:667
msgid "Romanian (standard)"
msgstr "Roumain (standard)"
-#: ../rules/base.xml.in.h:667
+#: ../rules/base.xml.in.h:668
msgid "Romanian (standard cedilla)"
msgstr "Roumain (standard, cédille)"
-#: ../rules/base.xml.in.h:668
+#: ../rules/base.xml.in.h:669
msgid "Romanian (WinKeys)"
msgstr "Roumain (touche Windows)"
-#: ../rules/base.xml.in.h:669 ../rules/base.extras.xml.in.h:55
+#: ../rules/base.xml.in.h:670 ../rules/base.extras.xml.in.h:56
msgid "Russian"
msgstr "Russe"
-#: ../rules/base.xml.in.h:670
+#: ../rules/base.xml.in.h:671
msgid "Russian (phonetic)"
msgstr "Russe (phonétique)"
-#: ../rules/base.xml.in.h:671
+#: ../rules/base.xml.in.h:672
msgid "Russian (phonetic WinKeys)"
msgstr "Russe (phonétique, touches Windows)"
-#: ../rules/base.xml.in.h:672
+#: ../rules/base.xml.in.h:673
msgid "Russian (typewriter)"
msgstr "Russe (machine à écrire)"
-#: ../rules/base.xml.in.h:673
+#: ../rules/base.xml.in.h:674
msgid "Russian (legacy)"
msgstr "Russe (obsolète)"
-#: ../rules/base.xml.in.h:674
+#: ../rules/base.xml.in.h:675
msgid "Russian (typewriter, legacy)"
msgstr "Russe (machine à écrire, obsolète)"
-#: ../rules/base.xml.in.h:675
+#: ../rules/base.xml.in.h:676
msgid "Tatar"
msgstr "Tatar"
-#: ../rules/base.xml.in.h:676
+#: ../rules/base.xml.in.h:677
msgid "Ossetian (legacy)"
msgstr "Ossète (obsolète)"
# https://secure.wikimedia.org/wikipedia/fr/wiki/Oss%C3%A8te
-#: ../rules/base.xml.in.h:677
+#: ../rules/base.xml.in.h:678
msgid "Ossetian (WinKeys)"
msgstr "Ossète (touches Windows)"
-#: ../rules/base.xml.in.h:678
+#: ../rules/base.xml.in.h:679
msgid "Chuvash"
msgstr "Chuvash"
# https://secure.wikimedia.org/wikipedia/fr/wiki/Tchouvache
-#: ../rules/base.xml.in.h:679
+#: ../rules/base.xml.in.h:680
msgid "Chuvash (Latin)"
msgstr "Tchouvache (latin)"
-#: ../rules/base.xml.in.h:680
+#: ../rules/base.xml.in.h:681
msgid "Udmurt"
msgstr "Oudmourte"
# https://secure.wikimedia.org/wikipedia/fr/wiki/Komi_%28langue%29
-#: ../rules/base.xml.in.h:681
+#: ../rules/base.xml.in.h:682
msgid "Komi"
msgstr "Komi"
# https://secure.wikimedia.org/wikipedia/fr/wiki/Iakoute
-#: ../rules/base.xml.in.h:682
+#: ../rules/base.xml.in.h:683
msgid "Yakut"
msgstr "Iakute"
-#: ../rules/base.xml.in.h:683
+#: ../rules/base.xml.in.h:684
msgid "Kalmyk"
msgstr "Kalmyk"
-#: ../rules/base.xml.in.h:684
+#: ../rules/base.xml.in.h:685
msgid "Russian (DOS)"
msgstr "Russe (DOS)"
-#: ../rules/base.xml.in.h:685
+#: ../rules/base.xml.in.h:686
msgid "Russian (Macintosh)"
msgstr "Russe (Macintosh)"
-#: ../rules/base.xml.in.h:686
+#: ../rules/base.xml.in.h:687
msgid "Serbian (Russia)"
msgstr "Serbe (Russe)"
# https://secure.wikimedia.org/wikipedia/fr/wiki/Bachkir
-#: ../rules/base.xml.in.h:687
+#: ../rules/base.xml.in.h:688
msgid "Bashkirian"
msgstr "Bachkir"
# https://secure.wikimedia.org/wikipedia/fr/wiki/Mari_%28langue%29
-#: ../rules/base.xml.in.h:688
+#: ../rules/base.xml.in.h:689
msgid "Mari"
msgstr "Mari"
-#: ../rules/base.xml.in.h:689 ../rules/base.extras.xml.in.h:52
+#: ../rules/base.xml.in.h:690 ../rules/base.extras.xml.in.h:53
msgid "Serbian"
msgstr "Serbe"
-#: ../rules/base.xml.in.h:690
+#: ../rules/base.xml.in.h:691
msgid "Serbian (Cyrillic, Z and ZHE swapped)"
msgstr "Serbe (cyrillique, Z et ZHE intervertis)"
-#: ../rules/base.xml.in.h:691
+#: ../rules/base.xml.in.h:692
msgid "Serbian (Latin)"
msgstr "Serbe (Latin)"
-#: ../rules/base.xml.in.h:692
+#: ../rules/base.xml.in.h:693
msgid "Serbian (Latin Unicode)"
msgstr "Serbe (latin, Unicode)"
-#: ../rules/base.xml.in.h:693
+#: ../rules/base.xml.in.h:694
msgid "Serbian (Latin qwerty)"
msgstr "Serbe (latin, qwerty)"
-#: ../rules/base.xml.in.h:694
+#: ../rules/base.xml.in.h:695
msgid "Serbian (Latin Unicode qwerty)"
msgstr "Serbe (latin, Unicode, qwerty)"
-#: ../rules/base.xml.in.h:695
+#: ../rules/base.xml.in.h:696
msgid "Serbian (Cyrillic with guillemets)"
msgstr "Serbe (cyrillique avec guillemets)"
-#: ../rules/base.xml.in.h:696
+#: ../rules/base.xml.in.h:697
msgid "Serbian (Latin with guillemets)"
msgstr "Serbe (Latin avec guillemets)"
-#: ../rules/base.xml.in.h:697
-msgid "Pannonian Rusyn (homophonic)"
-msgstr "Ruthène pannonien (homophonique)"
+#: ../rules/base.xml.in.h:698
+msgid "Pannonian Rusyn"
+msgstr "Ruthène pannonien"
#. Keyboard indicator for Slovenian layouts
-#: ../rules/base.xml.in.h:699
+#: ../rules/base.xml.in.h:700
msgid "sl"
msgstr "sl"
# https://secure.wikimedia.org/wikipedia/fr/wiki/Slov%C3%A8ne
-#: ../rules/base.xml.in.h:700
+#: ../rules/base.xml.in.h:701
msgid "Slovenian"
msgstr "Slovène"
-#: ../rules/base.xml.in.h:701
+#: ../rules/base.xml.in.h:702
msgid "Slovenian (use guillemets for quotes)"
msgstr "Slovène (utilise des guillemets typographiques au lieu des guillemets simples)"
-#: ../rules/base.xml.in.h:702
+#: ../rules/base.xml.in.h:703
msgid "Slovenian (US keyboard with Slovenian letters)"
msgstr "Slovène (clavier US avec lettres slovènes)"
#. Keyboard indicator for Slovak layouts
-#: ../rules/base.xml.in.h:704 ../rules/base.extras.xml.in.h:106
+#: ../rules/base.xml.in.h:705 ../rules/base.extras.xml.in.h:107
msgid "sk"
msgstr "sk"
# https://secure.wikimedia.org/wikipedia/fr/wiki/Slovaque
-#: ../rules/base.xml.in.h:705 ../rules/base.extras.xml.in.h:107
+#: ../rules/base.xml.in.h:706 ../rules/base.extras.xml.in.h:108
msgid "Slovak"
msgstr "Slovaque"
-#: ../rules/base.xml.in.h:706
+#: ../rules/base.xml.in.h:707
msgid "Slovak (extended Backslash)"
msgstr "Slovaque (barre oblique inverse étendue)"
-#: ../rules/base.xml.in.h:707
+#: ../rules/base.xml.in.h:708
msgid "Slovak (qwerty)"
msgstr "Slovaque (qwerty)"
-#: ../rules/base.xml.in.h:708
+#: ../rules/base.xml.in.h:709
msgid "Slovak (qwerty, extended Backslash)"
msgstr "Slovaque (qwerty, barre oblique inverse étendue)"
-#: ../rules/base.xml.in.h:709 ../rules/base.extras.xml.in.h:110
+#: ../rules/base.xml.in.h:710 ../rules/base.extras.xml.in.h:111
msgid "Spanish"
msgstr "Espagnol"
-#: ../rules/base.xml.in.h:710
+#: ../rules/base.xml.in.h:711
msgid "Spanish (eliminate dead keys)"
msgstr "Espagnol (sans touche morte)"
-#: ../rules/base.xml.in.h:711
+#: ../rules/base.xml.in.h:712
msgid "Spanish (include dead tilde)"
msgstr "Espagnol (y compris la touche morte tilde)"
-#: ../rules/base.xml.in.h:712
+#: ../rules/base.xml.in.h:713
msgid "Spanish (Sun dead keys)"
msgstr "Espagnol (touches mortes Sun)"
-#: ../rules/base.xml.in.h:713
+#: ../rules/base.xml.in.h:714
msgid "Spanish (Dvorak)"
msgstr "Espagnol (Dvorak)"
-#: ../rules/base.xml.in.h:714
+#: ../rules/base.xml.in.h:715
msgid "Asturian (Spain, with bottom-dot H and bottom-dot L)"
msgstr "Asturien (Espagne, avec H point bas et L point bas)"
-#: ../rules/base.xml.in.h:715
+#: ../rules/base.xml.in.h:716
msgid "Catalan (Spain, with middle-dot L)"
msgstr "Catalan (Espagne, avec L point médian)"
-#: ../rules/base.xml.in.h:716
+#: ../rules/base.xml.in.h:717
msgid "Spanish (Macintosh)"
msgstr "Espagnol (Macintosh)"
#. Keyboard indicator for Swedish layouts
-#: ../rules/base.xml.in.h:718 ../rules/base.extras.xml.in.h:112
+#: ../rules/base.xml.in.h:719 ../rules/base.extras.xml.in.h:113
msgid "sv"
msgstr "sv"
# https://secure.wikimedia.org/wikipedia/fr/wiki/Su%C3%A9dois
-#: ../rules/base.xml.in.h:719 ../rules/base.extras.xml.in.h:113
+#: ../rules/base.xml.in.h:720 ../rules/base.extras.xml.in.h:114
msgid "Swedish"
msgstr "Suédois"
-#: ../rules/base.xml.in.h:720
+#: ../rules/base.xml.in.h:721
msgid "Swedish (eliminate dead keys)"
msgstr "Suédois (sans touche morte)"
-#: ../rules/base.xml.in.h:721
+#: ../rules/base.xml.in.h:722
msgid "Swedish (Dvorak)"
msgstr "Suédois (Dvorak)"
-#: ../rules/base.xml.in.h:722
+#: ../rules/base.xml.in.h:723
msgid "Russian (Sweden, phonetic)"
msgstr "Russe (Suède, phonétique)"
-#: ../rules/base.xml.in.h:723
+#: ../rules/base.xml.in.h:724
msgid "Russian (Sweden, phonetic, eliminate dead keys)"
msgstr "Russe (Suède, phonétique, sans touche morte)"
-#: ../rules/base.xml.in.h:724
+#: ../rules/base.xml.in.h:725
msgid "Northern Saami (Sweden)"
msgstr "Sami du Nord (Suède)"
-#: ../rules/base.xml.in.h:725
+#: ../rules/base.xml.in.h:726
msgid "Swedish (Macintosh)"
msgstr "Suédois (Macintosh)"
-#: ../rules/base.xml.in.h:726
+#: ../rules/base.xml.in.h:727
msgid "Swedish (Svdvorak)"
msgstr "Suédois (Svdvorak)"
-#: ../rules/base.xml.in.h:727
+#: ../rules/base.xml.in.h:728
msgid "Swedish Sign Language"
msgstr "Langue des signes suédoise"
-#: ../rules/base.xml.in.h:728 ../rules/base.extras.xml.in.h:115
+#: ../rules/base.xml.in.h:729 ../rules/base.extras.xml.in.h:116
msgid "German (Switzerland)"
msgstr "Allemand (Suisse)"
-#: ../rules/base.xml.in.h:729
+#: ../rules/base.xml.in.h:730
msgid "German (Switzerland, legacy)"
msgstr "Allemand (Suisse, obsolète)"
-#: ../rules/base.xml.in.h:730
+#: ../rules/base.xml.in.h:731
msgid "German (Switzerland, eliminate dead keys)"
msgstr "Allemand (Suisse, sans touche morte)"
-#: ../rules/base.xml.in.h:731
+#: ../rules/base.xml.in.h:732
msgid "German (Switzerland, Sun dead keys)"
msgstr "Allemand (Suisse, touches mortes Sun)"
-#: ../rules/base.xml.in.h:732
+#: ../rules/base.xml.in.h:733
msgid "French (Switzerland)"
msgstr "Français (Suisse)"
-#: ../rules/base.xml.in.h:733
+#: ../rules/base.xml.in.h:734
msgid "French (Switzerland, eliminate dead keys)"
msgstr "Français (Suisse, sans touche morte)"
-#: ../rules/base.xml.in.h:734
+#: ../rules/base.xml.in.h:735
msgid "French (Switzerland, Sun dead keys)"
msgstr "Français (Suisse, touches mortes Sun)"
-#: ../rules/base.xml.in.h:735
+#: ../rules/base.xml.in.h:736
msgid "French (Switzerland, Macintosh)"
msgstr "Français (Suisse, Macintosh)"
-#: ../rules/base.xml.in.h:736
+#: ../rules/base.xml.in.h:737
msgid "German (Switzerland, Macintosh)"
msgstr "Allemand (Suisse, Macintosh)"
-#: ../rules/base.xml.in.h:737
+#: ../rules/base.xml.in.h:738
msgid "Arabic (Syria)"
msgstr "Arabe (Syrie)"
#. Keyboard indicator for Syriac layouts
-#: ../rules/base.xml.in.h:739
+#: ../rules/base.xml.in.h:740
msgid "syc"
msgstr "syc"
# https://secure.wikimedia.org/wikipedia/fr/wiki/Syriaque
-#: ../rules/base.xml.in.h:740
+#: ../rules/base.xml.in.h:741
msgid "Syriac"
msgstr "Syriaque"
-#: ../rules/base.xml.in.h:741
+#: ../rules/base.xml.in.h:742
msgid "Syriac (phonetic)"
msgstr "Syriaque (phonétique)"
-#: ../rules/base.xml.in.h:742
+#: ../rules/base.xml.in.h:743
msgid "Kurdish (Syria, Latin Q)"
msgstr "Kurde (Syrie, Q latin)"
-#: ../rules/base.xml.in.h:743
+#: ../rules/base.xml.in.h:744
msgid "Kurdish (Syria, F)"
msgstr "Kurde (Syrie, F)"
-#: ../rules/base.xml.in.h:744
+#: ../rules/base.xml.in.h:745
msgid "Kurdish (Syria, Latin Alt-Q)"
msgstr "Kurde (Syrie, Alt-Q latin)"
#. Keyboard indicator for Tajik layouts
-#: ../rules/base.xml.in.h:746
+#: ../rules/base.xml.in.h:747
msgid "tg"
msgstr "tg"
# https://secure.wikimedia.org/wikipedia/fr/wiki/Tadjik
-#: ../rules/base.xml.in.h:747
+#: ../rules/base.xml.in.h:748
msgid "Tajik"
msgstr "Tadjik"
-#: ../rules/base.xml.in.h:748
+#: ../rules/base.xml.in.h:749
msgid "Tajik (legacy)"
msgstr "Tadjik (obsolète)"
#. Keyboard indicator for Sinhala layouts
-#: ../rules/base.xml.in.h:750
+#: ../rules/base.xml.in.h:751
msgid "si"
msgstr "si"
-#: ../rules/base.xml.in.h:751
+#: ../rules/base.xml.in.h:752
msgid "Sinhala (phonetic)"
msgstr "Cingalais (phonétique)"
-#: ../rules/base.xml.in.h:752
+#: ../rules/base.xml.in.h:753
msgid "Tamil (Sri Lanka, Unicode)"
msgstr "Tamoul (Sri Lanka, Unicode)"
-#: ../rules/base.xml.in.h:753
+#: ../rules/base.xml.in.h:754
msgid "Tamil (Sri Lanka, TAB Typewriter)"
msgstr "Tamoul (Sri Lanka, machine à écrire, TAB)"
#. Keyboard indicator for Thai layouts
-#: ../rules/base.xml.in.h:755
+#: ../rules/base.xml.in.h:756
msgid "th"
msgstr "th"
# https://secure.wikimedia.org/wikipedia/fr/wiki/Tha%C3%AF_%28langue%29
-#: ../rules/base.xml.in.h:756
+#: ../rules/base.xml.in.h:757
msgid "Thai"
msgstr "Thaï"
-#: ../rules/base.xml.in.h:757
+#: ../rules/base.xml.in.h:758
msgid "Thai (TIS-820.2538)"
msgstr "Thaï (TIS-820.2538)"
-#: ../rules/base.xml.in.h:758
+#: ../rules/base.xml.in.h:759
msgid "Thai (Pattachote)"
msgstr "Thaï (Pattachote)"
#. Keyboard indicator for Turkish layouts
-#: ../rules/base.xml.in.h:760 ../rules/base.extras.xml.in.h:118
+#: ../rules/base.xml.in.h:761 ../rules/base.extras.xml.in.h:119
msgid "tr"
msgstr "tr"
# https://secure.wikimedia.org/wikipedia/fr/wiki/Turc
-#: ../rules/base.xml.in.h:761 ../rules/base.extras.xml.in.h:119
+#: ../rules/base.xml.in.h:762 ../rules/base.extras.xml.in.h:120
msgid "Turkish"
msgstr "Turc"
-#: ../rules/base.xml.in.h:762
+#: ../rules/base.xml.in.h:763
msgid "Turkish (F)"
msgstr "Turc (F)"
-#: ../rules/base.xml.in.h:763
+#: ../rules/base.xml.in.h:764
msgid "Turkish (Alt-Q)"
msgstr "Turc (Alt-Q)"
-#: ../rules/base.xml.in.h:764
+#: ../rules/base.xml.in.h:765
msgid "Turkish (Sun dead keys)"
msgstr "Turc (touches mortes Sun)"
-#: ../rules/base.xml.in.h:765
+#: ../rules/base.xml.in.h:766
msgid "Kurdish (Turkey, Latin Q)"
msgstr "Kurde (Turquie, Q latin)"
-#: ../rules/base.xml.in.h:766
+#: ../rules/base.xml.in.h:767
msgid "Kurdish (Turkey, F)"
msgstr "Kurde (Turquie, F)"
-#: ../rules/base.xml.in.h:767
+#: ../rules/base.xml.in.h:768
msgid "Kurdish (Turkey, Latin Alt-Q)"
msgstr "Kurde (Turquie, Alt-Q latin)"
-#: ../rules/base.xml.in.h:768
+#: ../rules/base.xml.in.h:769
msgid "Turkish (international with dead keys)"
msgstr "Turc (international avec touches mortes)"
#. Keyboard indicator for Crimean Tatar layouts
-#: ../rules/base.xml.in.h:770 ../rules/base.extras.xml.in.h:47
+#: ../rules/base.xml.in.h:771 ../rules/base.extras.xml.in.h:48
msgid "crh"
msgstr "crh"
-#: ../rules/base.xml.in.h:771
+#: ../rules/base.xml.in.h:772
msgid "Crimean Tatar (Turkish Q)"
msgstr "Tatar de Crimée (Q turc)"
-#: ../rules/base.xml.in.h:772
+#: ../rules/base.xml.in.h:773
msgid "Crimean Tatar (Turkish F)"
msgstr "Tatar de Crimée (F turc)"
-#: ../rules/base.xml.in.h:773
+#: ../rules/base.xml.in.h:774
msgid "Crimean Tatar (Turkish Alt-Q)"
msgstr "Tatar de Crimée (Alt-Q turc)"
-#: ../rules/base.xml.in.h:774
+#: ../rules/base.xml.in.h:775
msgid "Taiwanese"
msgstr "Taïwanais"
-#: ../rules/base.xml.in.h:775
+#: ../rules/base.xml.in.h:776
msgid "Taiwanese (indigenous)"
msgstr "Taïwanais (indigène)"
#. Keyboard indicator for Saisiyat layouts
-#: ../rules/base.xml.in.h:777
+#: ../rules/base.xml.in.h:778
msgid "xsy"
msgstr "xsy"
-#: ../rules/base.xml.in.h:778
+#: ../rules/base.xml.in.h:779
msgid "Saisiyat (Taiwan)"
msgstr "Saisiyat (Taïwan)"
#. Keyboard indicator for Ukranian layouts
-#: ../rules/base.xml.in.h:780 ../rules/base.extras.xml.in.h:121
+#: ../rules/base.xml.in.h:781 ../rules/base.extras.xml.in.h:122
msgid "uk"
msgstr "uk"
# https://secure.wikimedia.org/wikipedia/fr/wiki/Ukrainien
-#: ../rules/base.xml.in.h:781 ../rules/base.extras.xml.in.h:122
+#: ../rules/base.xml.in.h:782 ../rules/base.extras.xml.in.h:123
msgid "Ukrainian"
msgstr "Ukrainien"
-#: ../rules/base.xml.in.h:782
+#: ../rules/base.xml.in.h:783
msgid "Ukrainian (phonetic)"
msgstr "Ukrainien (phonétique)"
-#: ../rules/base.xml.in.h:783
+#: ../rules/base.xml.in.h:784
msgid "Ukrainian (typewriter)"
msgstr "Ukrainien (machine à écrire)"
-#: ../rules/base.xml.in.h:784
+#: ../rules/base.xml.in.h:785
msgid "Ukrainian (WinKeys)"
msgstr "Ukrainien (touches Windows)"
-#: ../rules/base.xml.in.h:785
+#: ../rules/base.xml.in.h:786
msgid "Ukrainian (legacy)"
msgstr "Ukrainien (obsolète)"
-#: ../rules/base.xml.in.h:786
+#: ../rules/base.xml.in.h:787
msgid "Ukrainian (standard RSTU)"
msgstr "Ukrainien (RSTU standard)"
-#: ../rules/base.xml.in.h:787
+#: ../rules/base.xml.in.h:788
msgid "Russian (Ukraine, standard RSTU)"
msgstr "Russe (Ukraine, RSTU standard)"
-#: ../rules/base.xml.in.h:788
+#: ../rules/base.xml.in.h:789
msgid "Ukrainian (homophonic)"
msgstr "Ukrainien (homophonique)"
-#: ../rules/base.xml.in.h:789 ../rules/base.extras.xml.in.h:124
+#: ../rules/base.xml.in.h:790 ../rules/base.extras.xml.in.h:125
msgid "English (UK)"
msgstr "Anglais (Royaume-Uni)"
-#: ../rules/base.xml.in.h:790
+#: ../rules/base.xml.in.h:791
msgid "English (UK, extended WinKeys)"
msgstr "Anglais (Royaume-Uni, touche Windows étendue)"
-#: ../rules/base.xml.in.h:791
+#: ../rules/base.xml.in.h:792
msgid "English (UK, international with dead keys)"
msgstr "Anglais (Royaume-Uni, international, avec touches mortes)"
-#: ../rules/base.xml.in.h:792
+#: ../rules/base.xml.in.h:793
msgid "English (UK, Dvorak)"
msgstr "Anglais (Royaume-Uni, Dvorak)"
-#: ../rules/base.xml.in.h:793
+#: ../rules/base.xml.in.h:794
msgid "English (UK, Dvorak with UK punctuation)"
msgstr "Anglais (Royaume-Uni, Dvorak, ponctuation britannique)"
-#: ../rules/base.xml.in.h:794
+#: ../rules/base.xml.in.h:795
msgid "English (UK, Macintosh)"
msgstr "Anglais (Royaume-Uni, Macintosh)"
-#: ../rules/base.xml.in.h:795
+#: ../rules/base.xml.in.h:796
msgid "English (UK, Macintosh international)"
msgstr "Anglais (Royaume-Uni, Macintosh international)"
# http://colemak.com/
-#: ../rules/base.xml.in.h:796
+#: ../rules/base.xml.in.h:797
msgid "English (UK, Colemak)"
msgstr "Anglais (Royaume-Uni, Colemak)"
# https://secure.wikimedia.org/wikipedia/fr/wiki/Ouzbek
-#: ../rules/base.xml.in.h:797
+#: ../rules/base.xml.in.h:798
msgid "Uzbek"
msgstr "Ouzbek"
-#: ../rules/base.xml.in.h:798
+#: ../rules/base.xml.in.h:799
msgid "Uzbek (Latin)"
msgstr "Ouzbek (latin)"
#. Keyboard indicator for Vietnamese layouts
-#: ../rules/base.xml.in.h:800
+#: ../rules/base.xml.in.h:801
msgid "vi"
msgstr "vi"
-#: ../rules/base.xml.in.h:801
+#: ../rules/base.xml.in.h:802
msgid "Vietnamese"
msgstr "Vietnamien"
#. Keyboard indicator for Korean layouts
-#: ../rules/base.xml.in.h:803 ../rules/base.extras.xml.in.h:126
+#: ../rules/base.xml.in.h:804 ../rules/base.extras.xml.in.h:127
msgid "ko"
msgstr "ko"
-#: ../rules/base.xml.in.h:804 ../rules/base.extras.xml.in.h:127
+#: ../rules/base.xml.in.h:805 ../rules/base.extras.xml.in.h:128
msgid "Korean"
msgstr "Coréen"
-#: ../rules/base.xml.in.h:805
+#: ../rules/base.xml.in.h:806
msgid "Korean (101/104 key compatible)"
msgstr "Coréen (compatible 101/104 touches)"
-#: ../rules/base.xml.in.h:806
+#: ../rules/base.xml.in.h:807
msgid "Japanese (PC-98xx Series)"
msgstr "Japonais (PC-98xx)"
#. Keyboard indicator for Irish layouts
-#: ../rules/base.xml.in.h:808
+#: ../rules/base.xml.in.h:809
msgid "ie"
msgstr "ie"
-#: ../rules/base.xml.in.h:809
+#: ../rules/base.xml.in.h:810
msgid "Irish"
msgstr "Irlandais"
-#: ../rules/base.xml.in.h:810
+#: ../rules/base.xml.in.h:811
msgid "CloGaelach"
msgstr "Cló Gaelach"
-#: ../rules/base.xml.in.h:811
+#: ../rules/base.xml.in.h:812
msgid "Irish (UnicodeExpert)"
msgstr "Irlandais (UnicodeExpert)"
-#: ../rules/base.xml.in.h:812
+#: ../rules/base.xml.in.h:813
msgid "Ogham"
msgstr "Ogham"
-#: ../rules/base.xml.in.h:813
+#: ../rules/base.xml.in.h:814
msgid "Ogham (IS434)"
msgstr "Ogham (IS434)"
# https://secure.wikimedia.org/wikipedia/fr/wiki/Ourdou
-#: ../rules/base.xml.in.h:814
+#: ../rules/base.xml.in.h:815
msgid "Urdu (Pakistan)"
msgstr "Ourdou (Pakistan)"
-#: ../rules/base.xml.in.h:815
+#: ../rules/base.xml.in.h:816
msgid "Urdu (Pakistan, CRULP)"
msgstr "Ourdou (Pakistan, CRULP)"
-#: ../rules/base.xml.in.h:816
+#: ../rules/base.xml.in.h:817
msgid "Urdu (Pakistan, NLA)"
msgstr "Ourdou (Pakistan, NLA)"
-#: ../rules/base.xml.in.h:817
+#: ../rules/base.xml.in.h:818
msgid "Arabic (Pakistan)"
msgstr "Arabe (Pakistan)"
#. Keyboard indicator for Sindhi layouts
-#: ../rules/base.xml.in.h:819
+#: ../rules/base.xml.in.h:820
msgid "sd"
msgstr "sd"
# https://secure.wikimedia.org/wikipedia/fr/wiki/Sindhi
-#: ../rules/base.xml.in.h:820
+#: ../rules/base.xml.in.h:821
msgid "Sindhi"
msgstr "Sindhî"
#. Keyboard indicator for Dhivehi layouts
-#: ../rules/base.xml.in.h:822
+#: ../rules/base.xml.in.h:823
msgid "dv"
msgstr "dv"
-#: ../rules/base.xml.in.h:823
+#: ../rules/base.xml.in.h:824
msgid "Dhivehi"
msgstr "Divehi"
-#: ../rules/base.xml.in.h:824
+#: ../rules/base.xml.in.h:825
msgid "English (South Africa)"
msgstr "Anglais (Afrique du Sud)"
#. Keyboard indicator for Esperanto layouts
-#: ../rules/base.xml.in.h:826
+#: ../rules/base.xml.in.h:827
msgid "eo"
msgstr "eo"
-#: ../rules/base.xml.in.h:827
+#: ../rules/base.xml.in.h:828
msgid "Esperanto"
msgstr "Espéranto"
-#: ../rules/base.xml.in.h:828
+#: ../rules/base.xml.in.h:829
msgid "Esperanto (displaced semicolon and quote, obsolete)"
msgstr "Espéranto (point-virgule et guillemets simples déplacés, obsolète)"
#. Keyboard indicator for Nepali layouts
-#: ../rules/base.xml.in.h:830
+#: ../rules/base.xml.in.h:831
msgid "ne"
msgstr "ne"
# https://secure.wikimedia.org/wikipedia/fr/wiki/N%C3%A9palais
-#: ../rules/base.xml.in.h:831
+#: ../rules/base.xml.in.h:832
msgid "Nepali"
msgstr "Népalais"
-#: ../rules/base.xml.in.h:832
+#: ../rules/base.xml.in.h:833
msgid "English (Nigeria)"
msgstr "Anglais (Nigeria)"
#. Keyboard indicator for Igbo layouts
-#: ../rules/base.xml.in.h:834
+#: ../rules/base.xml.in.h:835
msgid "ig"
msgstr "ig"
# https://secure.wikimedia.org/wikipedia/fr/wiki/Igbo
-#: ../rules/base.xml.in.h:835
+#: ../rules/base.xml.in.h:836
msgid "Igbo"
msgstr "Igbo"
#. Keyboard indicator for Yoruba layouts
-#: ../rules/base.xml.in.h:837
+#: ../rules/base.xml.in.h:838
msgid "yo"
msgstr "yo"
# https://secure.wikimedia.org/wikipedia/fr/wiki/Yoruba
-#: ../rules/base.xml.in.h:838
+#: ../rules/base.xml.in.h:839
msgid "Yoruba"
msgstr "Yoruba"
#. Keyboard indicator for Amharic layouts
-#: ../rules/base.xml.in.h:840
+#: ../rules/base.xml.in.h:841
msgid "am"
msgstr "am"
-#: ../rules/base.xml.in.h:841
+#: ../rules/base.xml.in.h:842
msgid "Amharic"
msgstr "Amharique"
#. Keyboard indicator for Wolof layouts
-#: ../rules/base.xml.in.h:843
+#: ../rules/base.xml.in.h:844
msgid "wo"
msgstr "wo"
# https://secure.wikimedia.org/wikipedia/fr/wiki/Wolof_%28langue%29
-#: ../rules/base.xml.in.h:844
+#: ../rules/base.xml.in.h:845
msgid "Wolof"
msgstr "Wolof"
#. Keyboard indicator for Braille layouts
-#: ../rules/base.xml.in.h:846
+#: ../rules/base.xml.in.h:847
msgid "brl"
msgstr "brl"
-#: ../rules/base.xml.in.h:847
+#: ../rules/base.xml.in.h:848
msgid "Braille"
msgstr "Braille"
-#: ../rules/base.xml.in.h:848
+#: ../rules/base.xml.in.h:849
msgid "Braille (left hand)"
msgstr "Braille (main gauche)"
-#: ../rules/base.xml.in.h:849
+#: ../rules/base.xml.in.h:850
msgid "Braille (right hand)"
msgstr "Braille (main droite)"
#. Keyboard indicator for Turkmen layouts
-#: ../rules/base.xml.in.h:851
+#: ../rules/base.xml.in.h:852
msgid "tk"
msgstr "tk"
# https://secure.wikimedia.org/wikipedia/fr/wiki/Turkm%C3%A8ne
-#: ../rules/base.xml.in.h:852
+#: ../rules/base.xml.in.h:853
msgid "Turkmen"
msgstr "Turkmène"
-#: ../rules/base.xml.in.h:853
+#: ../rules/base.xml.in.h:854
msgid "Turkmen (Alt-Q)"
msgstr "Turkmène (Alt-Q)"
#. Keyboard indicator for Bambara layouts
-#: ../rules/base.xml.in.h:855
+#: ../rules/base.xml.in.h:856
msgid "bm"
msgstr "bm"
-#: ../rules/base.xml.in.h:856
+#: ../rules/base.xml.in.h:857
msgid "Bambara"
msgstr "Bambara"
-#: ../rules/base.xml.in.h:857
+#: ../rules/base.xml.in.h:858
msgid "French (Mali, alternative)"
msgstr "Français (Mali, variante)"
-#: ../rules/base.xml.in.h:858
+#: ../rules/base.xml.in.h:859
msgid "English (Mali, US Macintosh)"
msgstr "Anglais (Mali, Macintosh USA)"
-#: ../rules/base.xml.in.h:859
+#: ../rules/base.xml.in.h:860
msgid "English (Mali, US international)"
msgstr "Anglais (Mali, USA international)"
#. Keyboard indicator for Swahili layouts
-#: ../rules/base.xml.in.h:861
+#: ../rules/base.xml.in.h:862
msgid "sw"
msgstr "sw"
-#: ../rules/base.xml.in.h:862
+#: ../rules/base.xml.in.h:863
msgid "Swahili (Tanzania)"
msgstr "Swahili (Tanzanie)"
# https://secure.wikimedia.org/wikipedia/fr/wiki/Swahili
-#: ../rules/base.xml.in.h:863
+#: ../rules/base.xml.in.h:864
msgid "Swahili (Kenya)"
msgstr "Swahili (Kenya)"
# Langue bantoue.
# https://secure.wikimedia.org/wikipedia/fr/wiki/Kikuyu_%28langue%29
-#: ../rules/base.xml.in.h:864
+#: ../rules/base.xml.in.h:865
msgid "Kikuyu"
msgstr "Kikuyu"
#. Keyboard indicator for Tswana layouts
-#: ../rules/base.xml.in.h:866
+#: ../rules/base.xml.in.h:867
msgid "tn"
msgstr "tn"
# https://secure.wikimedia.org/wikipedia/fr/wiki/Tswana
-#: ../rules/base.xml.in.h:867
+#: ../rules/base.xml.in.h:868
msgid "Tswana"
msgstr "Tswana"
#. Keyboard indicator for Filipino layouts
-#: ../rules/base.xml.in.h:869
+#: ../rules/base.xml.in.h:870
msgid "ph"
msgstr "ph"
-#: ../rules/base.xml.in.h:870
+#: ../rules/base.xml.in.h:871
msgid "Filipino"
msgstr "Filipino"
-#: ../rules/base.xml.in.h:871
+#: ../rules/base.xml.in.h:872
msgid "Filipino (QWERTY Baybayin)"
msgstr "Filipino (baybayin, qwerty)"
# http://www.michaelcapewell.com/projects/keyboard/#The_Capewell-Dvorak_Layout
-#: ../rules/base.xml.in.h:872
+#: ../rules/base.xml.in.h:873
msgid "Filipino (Capewell-Dvorak Latin)"
msgstr "Filipino (Capewell-Dvorak, latin)"
# http://www.michaelcapewell.com/projects/keyboard/#The_Capewell-Dvorak_Layout
-#: ../rules/base.xml.in.h:873
+#: ../rules/base.xml.in.h:874
msgid "Filipino (Capewell-Dvorak Baybayin)"
msgstr "Filipino (Capewell-Dvorak, baybayin)"
# http://www.michaelcapewell.com/projects/keyboard/#The_QWERF_Layout
-#: ../rules/base.xml.in.h:874
+#: ../rules/base.xml.in.h:875
msgid "Filipino (Capewell-QWERF 2006 Latin)"
msgstr "Filipino (Capewell-QWERF 2006, latin)"
# http://www.michaelcapewell.com/projects/keyboard/#The_QWERF_Layout
-#: ../rules/base.xml.in.h:875
+#: ../rules/base.xml.in.h:876
msgid "Filipino (Capewell-QWERF 2006 Baybayin)"
msgstr "Filipino (Capewell-QWERF 2006, baybayin)"
-#: ../rules/base.xml.in.h:876
+#: ../rules/base.xml.in.h:877
msgid "Filipino (Colemak Latin)"
msgstr "Filipino (Colemak, latin)"
-#: ../rules/base.xml.in.h:877
+#: ../rules/base.xml.in.h:878
msgid "Filipino (Colemak Baybayin)"
msgstr "Filipino (Colemak, baybayin)"
-#: ../rules/base.xml.in.h:878
+#: ../rules/base.xml.in.h:879
msgid "Filipino (Dvorak Latin)"
msgstr "Filipino (Dvorak, latin)"
# https://secure.wikimedia.org/wikipedia/fr/wiki/Baybayin
-#: ../rules/base.xml.in.h:879
+#: ../rules/base.xml.in.h:880
msgid "Filipino (Dvorak Baybayin)"
msgstr "Filipino (Dvorak, baybayin)"
-#: ../rules/base.xml.in.h:880
+#: ../rules/base.xml.in.h:881
msgid "md"
msgstr "md"
-#: ../rules/base.xml.in.h:881
+#: ../rules/base.xml.in.h:882
msgid "Moldavian"
msgstr "Moldave"
-#: ../rules/base.xml.in.h:882
+#: ../rules/base.xml.in.h:883
msgid "gag"
msgstr "gag"
# https://fr.wikipedia.org/wiki/Gagaouze
-#: ../rules/base.xml.in.h:883
+#: ../rules/base.xml.in.h:884
msgid "Moldavian (Gagauz)"
msgstr "Moldave (Gagaouze)"
-#: ../rules/base.xml.in.h:884
+#: ../rules/base.xml.in.h:885
msgid "Switching to another layout"
msgstr "Passage à une autre disposition"
-#: ../rules/base.xml.in.h:885
+#: ../rules/base.xml.in.h:886
msgid "Right Alt (while pressed)"
msgstr "Alt droite (si enfoncé)"
-#: ../rules/base.xml.in.h:886
+#: ../rules/base.xml.in.h:887
msgid "Left Alt (while pressed)"
msgstr "Alt gauche (si enfoncé)"
-#: ../rules/base.xml.in.h:887
+#: ../rules/base.xml.in.h:888
msgid "Left Win (while pressed)"
msgstr "Windows gauche (si enfoncé)"
-#: ../rules/base.xml.in.h:888
+#: ../rules/base.xml.in.h:889
msgid "Right Win (while pressed)"
msgstr "Windows droite (si enfoncé)"
-#: ../rules/base.xml.in.h:889
+#: ../rules/base.xml.in.h:890
msgid "Any Win key (while pressed)"
msgstr "N'importe quelle touche Windows (enfoncée)"
-#: ../rules/base.xml.in.h:890
+#: ../rules/base.xml.in.h:891
msgid "Caps Lock (while pressed), Alt+Caps Lock does the original capslock action"
msgstr "Verr. maj. (si enfoncé), Alt+Verr. maj. joue le rôle original de Verr. maj."
-#: ../rules/base.xml.in.h:891
+#: ../rules/base.xml.in.h:892
msgid "Right Ctrl (while pressed)"
msgstr "Ctrl droite (si enfoncé)"
-#: ../rules/base.xml.in.h:892
+#: ../rules/base.xml.in.h:893
msgid "Right Alt"
msgstr "Alt droite"
-#: ../rules/base.xml.in.h:893
+#: ../rules/base.xml.in.h:894
msgid "Left Alt"
msgstr "Alt gauche"
-#: ../rules/base.xml.in.h:894
+#: ../rules/base.xml.in.h:895
msgid "Caps Lock"
msgstr "Verr. maj."
-#: ../rules/base.xml.in.h:895
+#: ../rules/base.xml.in.h:896
msgid "Shift+Caps Lock"
msgstr "Maj.+ Verr. maj."
-#: ../rules/base.xml.in.h:896
+#: ../rules/base.xml.in.h:897
msgid "Caps Lock (to first layout), Shift+Caps Lock (to last layout)"
msgstr "Verr. maj. (première disposition), Maj.+Verr. maj. (dernière disposition)"
-#: ../rules/base.xml.in.h:897
+#: ../rules/base.xml.in.h:898
msgid "Left Win (to first layout), Right Win/Menu (to last layout)"
msgstr "Touche Windows gauche (première disposition), touche Windows droite (dernière disposition)"
-#: ../rules/base.xml.in.h:898
+#: ../rules/base.xml.in.h:899
msgid "Left Ctrl (to first layout), Right Ctrl (to last layout)"
msgstr "Ctrl gauche (première disposition), Ctrl droit (dernière disposition)"
-#: ../rules/base.xml.in.h:899
+#: ../rules/base.xml.in.h:900
msgid "Alt+Caps Lock"
msgstr "Alt+Verr. maj."
-#: ../rules/base.xml.in.h:900
+#: ../rules/base.xml.in.h:901
msgid "Both Shift keys together"
msgstr "Les deux Maj. ensemble"
-#: ../rules/base.xml.in.h:901
+#: ../rules/base.xml.in.h:902
msgid "Both Alt keys together"
msgstr "Les deux Alt ensemble"
-#: ../rules/base.xml.in.h:902
+#: ../rules/base.xml.in.h:903
msgid "Both Ctrl keys together"
msgstr "Les deux Ctrl ensemble"
-#: ../rules/base.xml.in.h:903
+#: ../rules/base.xml.in.h:904
msgid "Ctrl+Shift"
msgstr "Ctrl+Maj."
-#: ../rules/base.xml.in.h:904
+#: ../rules/base.xml.in.h:905
msgid "Left Ctrl+Left Shift"
msgstr "Ctrl gauche+Maj. gauche"
-#: ../rules/base.xml.in.h:905
+#: ../rules/base.xml.in.h:906
msgid "Right Ctrl+Right Shift"
msgstr "Ctrl droite + Maj. droite"
-#: ../rules/base.xml.in.h:906
+#: ../rules/base.xml.in.h:907
msgid "Alt+Ctrl"
msgstr "Alt+Ctrl"
-#: ../rules/base.xml.in.h:907
+#: ../rules/base.xml.in.h:908
msgid "Alt+Shift"
msgstr "Alt+Maj."
-#: ../rules/base.xml.in.h:908
+#: ../rules/base.xml.in.h:909
msgid "Left Alt+Left Shift"
msgstr "Alt gauche+Maj. gauche"
-#: ../rules/base.xml.in.h:909
+#: ../rules/base.xml.in.h:910
msgid "Alt+Space"
msgstr "Alt+Espace"
-#: ../rules/base.xml.in.h:910
+#: ../rules/base.xml.in.h:911
msgid "Menu"
msgstr "Menu"
-#: ../rules/base.xml.in.h:911
+#: ../rules/base.xml.in.h:912
msgid "Left Win"
msgstr "Touche Windows gauche"
-#: ../rules/base.xml.in.h:912
+#: ../rules/base.xml.in.h:913
msgid "Right Win"
msgstr "Windows droite"
-#: ../rules/base.xml.in.h:913
+#: ../rules/base.xml.in.h:914
msgid "Left Shift"
msgstr "Maj. gauche"
-#: ../rules/base.xml.in.h:914
+#: ../rules/base.xml.in.h:915
msgid "Right Shift"
msgstr "Maj. droite"
-#: ../rules/base.xml.in.h:915
+#: ../rules/base.xml.in.h:916
msgid "Left Ctrl"
msgstr "Ctrl gauche"
-#: ../rules/base.xml.in.h:916
+#: ../rules/base.xml.in.h:917
msgid "Right Ctrl"
msgstr "Ctrl droite"
-#: ../rules/base.xml.in.h:917
+#: ../rules/base.xml.in.h:918
msgid "Scroll Lock"
msgstr "Arrêt défilement"
-#: ../rules/base.xml.in.h:918
+#: ../rules/base.xml.in.h:919
msgid "LeftCtrl+LeftWin (to first layout), RightCtrl+Menu (to second layout)"
msgstr "Ctrl gauche + Windows gauche (première disposition), Ctrl droit + Menu (seconde disposition)"
-#: ../rules/base.xml.in.h:919
+#: ../rules/base.xml.in.h:920
msgid "Key to choose 3rd level"
msgstr "Touche sélectionnant le niveau 3"
-#: ../rules/base.xml.in.h:920
+#: ../rules/base.xml.in.h:921
msgid "Any Win key"
msgstr "N'importe quelle touche Windows"
-#: ../rules/base.xml.in.h:921
+#: ../rules/base.xml.in.h:922
msgid "Any Alt key"
msgstr "N'importe quelle touche Alt"
# https://secure.wikimedia.org/wikipedia/fr/wiki/Touche_compose
-#: ../rules/base.xml.in.h:922
+#: ../rules/base.xml.in.h:923
msgid "Right Alt, Shift+Right Alt key is Compose"
msgstr "Alt droite, Maj. + Alt droite est la touche compose"
-#: ../rules/base.xml.in.h:923
+#: ../rules/base.xml.in.h:924
msgid "Right Alt key never chooses 3rd level"
msgstr "Alt droite ne sélectionne jamais le niveau 3"
-#: ../rules/base.xml.in.h:924
+#: ../rules/base.xml.in.h:925
msgid "Enter on keypad"
msgstr "Entrée sur le pavé numérique"
-#: ../rules/base.xml.in.h:925
+#: ../rules/base.xml.in.h:926
msgid "Backslash"
msgstr "Barre oblique inverse"
-#: ../rules/base.xml.in.h:926
+#: ../rules/base.xml.in.h:927
msgid "&lt;Less/Greater&gt;"
msgstr "&lt;Plus petit/Plus grand&gt;"
-#: ../rules/base.xml.in.h:927
+#: ../rules/base.xml.in.h:928
msgid "Caps Lock chooses 3rd level, acts as onetime lock when pressed together with another 3rd-level-chooser"
msgstr "Verr. maj. sélectionne le niveau 3 ; avec un autre sélecteur de niveau 3, enclenche une fois ce niveau"
-#: ../rules/base.xml.in.h:928
+#: ../rules/base.xml.in.h:929
msgid "Backslash chooses 3rd level, acts as onetime lock when pressed together with another 3rd-level-chooser"
msgstr "La barre oblique inverse sélectionne le niveau 3 ; avec un autre sélecteur de niveau 3, enclenche une fois ce niveau"
-#: ../rules/base.xml.in.h:929
+#: ../rules/base.xml.in.h:930
msgid "&lt;Less/Greater&gt; chooses 3rd level, acts as onetime lock when pressed together with another 3rd-level-chooser"
msgstr "&lt;Plus petit/Plus grand&gt; sélectionne le niveau 3 ; avec un autre sélecteur de niveau 3, enclenche une fois ce niveau"
-#: ../rules/base.xml.in.h:930
+#: ../rules/base.xml.in.h:931
msgid "Ctrl key position"
msgstr "Position de la touche Ctrl"
-#: ../rules/base.xml.in.h:931
+#: ../rules/base.xml.in.h:932
msgid "Caps Lock as Ctrl"
msgstr "Verr. maj. comme Ctrl"
-#: ../rules/base.xml.in.h:932
+#: ../rules/base.xml.in.h:933
msgid "Left Ctrl as Meta"
msgstr "Ctrl gauche comme Méta"
-#: ../rules/base.xml.in.h:933
+#: ../rules/base.xml.in.h:934
msgid "Swap Ctrl and Caps Lock"
msgstr "Intervertir Ctrl et Verr. maj."
-#: ../rules/base.xml.in.h:934
+#: ../rules/base.xml.in.h:935
msgid "At left of 'A'"
msgstr "À gauche du « A »"
-#: ../rules/base.xml.in.h:935
+#: ../rules/base.xml.in.h:936
msgid "At bottom left"
msgstr "En bas à gauche"
-#: ../rules/base.xml.in.h:936
+#: ../rules/base.xml.in.h:937
msgid "Right Ctrl as Right Alt"
msgstr "Ctrl droite comme Alt droite"
-#: ../rules/base.xml.in.h:937
+#: ../rules/base.xml.in.h:938
msgid "Menu as Right Ctrl"
msgstr "Menu comme Ctrl droite"
-#: ../rules/base.xml.in.h:938
+#: ../rules/base.xml.in.h:939
msgid "Right Alt as Right Ctrl"
msgstr "Alt droite comme Ctrl droite"
+#: ../rules/base.xml.in.h:940
+msgid "Swap Left Alt key with Left Ctrl key"
+msgstr "Échange Alt. gauche et Ctrl gauche"
+
+#: ../rules/base.xml.in.h:941
+msgid "Swap Left Win key with Left Ctrl key"
+msgstr "Échange Win gauche et Ctrl gauche"
+
+#: ../rules/base.xml.in.h:942
+msgid "Left Alt as Ctrl, Left Ctrl as Win, Left Win as Alt"
+msgstr "Alt. gauche pour Ctrl, Ctrl pour Win, Win gauche pour Alt."
+
# https://bugzilla.gnome.org/show_bug.cgi?id=518156
-#: ../rules/base.xml.in.h:939
+#: ../rules/base.xml.in.h:943
msgid "Use keyboard LED to show alternative layout"
msgstr "Utiliser les voyants du clavier pour indiquer une disposition alternative"
-#: ../rules/base.xml.in.h:940
+#: ../rules/base.xml.in.h:944
msgid "Num Lock"
msgstr "Verr. Num."
-#: ../rules/base.xml.in.h:941
+#: ../rules/base.xml.in.h:945
msgid "Layout of numeric keypad"
msgstr "Disposition du pavé numérique"
-#: ../rules/base.xml.in.h:942
+#: ../rules/base.xml.in.h:946
msgid "Legacy"
msgstr "Obsolète"
-#: ../rules/base.xml.in.h:943
+#: ../rules/base.xml.in.h:947
msgid "Unicode additions (arrows and math operators)"
msgstr "Ajouts Unicode (opérateurs mathématiques et flèches)"
-#: ../rules/base.xml.in.h:944
+#: ../rules/base.xml.in.h:948
msgid "Unicode additions (arrows and math operators; math operators on default level)"
msgstr "Ajouts Unicode (opérateurs mathématiques et flèches ; opérateurs mathématiques au niveau par défaut)"
-#: ../rules/base.xml.in.h:945
+#: ../rules/base.xml.in.h:949
msgid "Legacy Wang 724"
msgstr "Wang 724 (clavier obsolète)"
-#: ../rules/base.xml.in.h:946
+#: ../rules/base.xml.in.h:950
msgid "Wang 724 keypad with Unicode additions (arrows and math operators)"
msgstr "Wang 724 avec ajouts Unicode (opérateurs mathématiques et flèches)"
-#: ../rules/base.xml.in.h:947
+#: ../rules/base.xml.in.h:951
msgid "Wang 724 keypad with Unicode additions (arrows and math operators; math operators on default level)"
msgstr "Wang 724 avec ajouts Unicode (opérateurs mathématiques et flèches ; opérateurs mathématiques au niveau par défaut)"
-#: ../rules/base.xml.in.h:948
+#: ../rules/base.xml.in.h:952
msgid "Hexadecimal"
msgstr "Hexadécimal"
-#: ../rules/base.xml.in.h:949
+#: ../rules/base.xml.in.h:953
msgid "ATM/phone-style"
msgstr "Clavier de type téléphonique"
-#: ../rules/base.xml.in.h:950
+#: ../rules/base.xml.in.h:954
msgid "Numeric keypad delete key behaviour"
msgstr "Comportement de la touche de Suppr. du pavé numérique"
-#: ../rules/base.xml.in.h:951
+#: ../rules/base.xml.in.h:955
msgid "Legacy key with dot"
msgstr "Touche obsolète avec point"
#. Actually, with KP_SEPARATOR, as the old keypad(comma)
-#: ../rules/base.xml.in.h:953
+#: ../rules/base.xml.in.h:957
msgid "Legacy key with comma"
msgstr "Touche obsolète avec virgule"
-#: ../rules/base.xml.in.h:954
+#: ../rules/base.xml.in.h:958
msgid "Four-level key with dot"
msgstr "Touche à quatre niveaux avec point"
-#: ../rules/base.xml.in.h:955
+#: ../rules/base.xml.in.h:959
msgid "Four-level key with dot, Latin-9 only"
msgstr "Touche à quatre niveaux avec point, Latin-9 uniquement"
-#: ../rules/base.xml.in.h:956
+#: ../rules/base.xml.in.h:960
msgid "Four-level key with comma"
msgstr "Touche à quatre niveaux avec virgule"
# Le momayyez est le séparateur décimal perse.
-#: ../rules/base.xml.in.h:957
+#: ../rules/base.xml.in.h:961
msgid "Four-level key with momayyez"
msgstr "Touche à quatre niveaux avec le séparateur décimal momayyez"
#. This assumes the KP_ abstract symbols are actually useful for some apps
#. The description needs to be rewritten
-#: ../rules/base.xml.in.h:960
+#: ../rules/base.xml.in.h:964
msgid "Four-level key with abstract separators"
msgstr "Touche à quatre niveaux avec le séparateur décimal abstrait"
-#: ../rules/base.xml.in.h:961
+#: ../rules/base.xml.in.h:965
msgid "Semicolon on third level"
msgstr "Point-virgule au niveau 3"
-#: ../rules/base.xml.in.h:962
+#: ../rules/base.xml.in.h:966
msgid "Caps Lock key behavior"
msgstr "Comportement de la touche Verr. maj."
-#: ../rules/base.xml.in.h:963
+#: ../rules/base.xml.in.h:967
msgid "Caps Lock uses internal capitalization; Shift \"pauses\" Caps Lock"
msgstr "Verr. maj. utilise la mise en majuscule interne ; Maj. annule temporairement Verr. maj."
-#: ../rules/base.xml.in.h:964
+#: ../rules/base.xml.in.h:968
msgid "Caps Lock uses internal capitalization; Shift doesn't affect Caps Lock"
msgstr "Verr. maj. utilise la mise en majuscule interne ; Maj. n'a pas d'effet sur Verr. maj."
-#: ../rules/base.xml.in.h:965
+#: ../rules/base.xml.in.h:969
msgid "Caps Lock acts as Shift with locking; Shift \"pauses\" Caps Lock"
msgstr "Verr. maj. agit comme un verrouillage de maj ; Maj. l'annule temporairement"
-#: ../rules/base.xml.in.h:966
+#: ../rules/base.xml.in.h:970
msgid "Caps Lock acts as Shift with locking; Shift doesn't affect Caps Lock"
msgstr "Verr. maj. agit comme Maj. quand il est verrouillé ; Maj. n'a pas d'effet sur verr. Maj."
-#: ../rules/base.xml.in.h:967
+#: ../rules/base.xml.in.h:971
msgid "Caps Lock toggles normal capitalization of alphabetic characters"
msgstr "Verr. maj. active ou désactive la mise en majuscule usuelle des caractères alphabétiques"
-#: ../rules/base.xml.in.h:968
+#: ../rules/base.xml.in.h:972
msgid "Make Caps Lock an additional Num Lock"
msgstr "Faire de Verr. maj. un Verr. Num. supplémentaire"
-#: ../rules/base.xml.in.h:969
+#: ../rules/base.xml.in.h:973
msgid "Swap ESC and Caps Lock"
msgstr "Intervertir Échap. et Verr. maj."
-#: ../rules/base.xml.in.h:970
+#: ../rules/base.xml.in.h:974
msgid "Make Caps Lock an additional ESC"
msgstr "Faire de Verr. maj. un Échap. supplémentaire."
-#: ../rules/base.xml.in.h:971
+#: ../rules/base.xml.in.h:975
msgid "Make Caps Lock an additional Backspace"
msgstr "Faire de Verr. maj. un Effacement. arriière supplémentaire."
-#: ../rules/base.xml.in.h:972
+#: ../rules/base.xml.in.h:976
msgid "Make Caps Lock an additional Super"
msgstr "Faire de Verr. maj. un Super supplémentaire."
-#: ../rules/base.xml.in.h:973
+#: ../rules/base.xml.in.h:977
msgid "Make Caps Lock an additional Hyper"
msgstr "Faire de Verr. maj. un Hyper supplémentaire"
-#: ../rules/base.xml.in.h:974
+#: ../rules/base.xml.in.h:978
msgid "Caps Lock toggles ShiftLock (affects all keys)"
msgstr "Verr. maj. bascule le blocage majuscule (affecte toutes les touches)"
-#: ../rules/base.xml.in.h:975
+#: ../rules/base.xml.in.h:979
msgid "Caps Lock is disabled"
msgstr "Verr. maj. est désactivé"
-#: ../rules/base.xml.in.h:976
+#: ../rules/base.xml.in.h:980
msgid "Make Caps Lock an additional Ctrl"
msgstr "Faire de Verr. maj. un Ctrl supplémentaire."
-#: ../rules/base.xml.in.h:977
+#: ../rules/base.xml.in.h:981
msgid "Alt/Win key behavior"
msgstr "Comportement des touches Alt et Windows"
-#: ../rules/base.xml.in.h:978
+#: ../rules/base.xml.in.h:982
msgid "Add the standard behavior to Menu key"
msgstr "Ajouter du comportement standard à la touche Menu"
-#: ../rules/base.xml.in.h:979
+#: ../rules/base.xml.in.h:983
msgid "Alt and Meta are on Alt keys"
msgstr "Alt et Meta sont sur les touches Alt"
-#: ../rules/base.xml.in.h:980
+#: ../rules/base.xml.in.h:984
msgid "Alt is mapped to Win keys (and the usual Alt keys)"
msgstr "Alt est placé sur les touches Windows (et les touches Alt habituelles)"
-#: ../rules/base.xml.in.h:981
+#: ../rules/base.xml.in.h:985
msgid "Ctrl is mapped to Win keys (and the usual Ctrl keys)"
msgstr "Ctrl est placé sur les touches Windows (et les touches Ctrl habituelles)"
-#: ../rules/base.xml.in.h:982
+#: ../rules/base.xml.in.h:986
msgid "Ctrl is mapped to Alt keys, Alt is mapped to Win keys"
msgstr "Ctrl est placé sur les touches Alt, Alt sur les touches Windows"
-#: ../rules/base.xml.in.h:983
+#: ../rules/base.xml.in.h:987
msgid "Meta is mapped to Win keys"
msgstr "Méta est placé sur les touches Windows"
-#: ../rules/base.xml.in.h:984
+#: ../rules/base.xml.in.h:988
msgid "Meta is mapped to Left Win"
msgstr "Méta est placé sur Windows gauche"
-#: ../rules/base.xml.in.h:985
+#: ../rules/base.xml.in.h:989
msgid "Hyper is mapped to Win-keys"
msgstr "Hyper est placé sur les touches Windows"
-#: ../rules/base.xml.in.h:986
+#: ../rules/base.xml.in.h:990
msgid "Alt is mapped to Right Win, Super to Menu"
msgstr "Alt est placé sur Windows droite, Super sur Menu"
-#: ../rules/base.xml.in.h:987
+#: ../rules/base.xml.in.h:991
msgid "Alt is swapped with Win"
msgstr "Alt échangé avec Windows"
-#: ../rules/base.xml.in.h:988
+#: ../rules/base.xml.in.h:992
msgid "Position of Compose key"
msgstr "Position de la touche Compose"
-#: ../rules/base.xml.in.h:989
+#: ../rules/base.xml.in.h:993
msgid "3rd level of Left Win"
msgstr "Niveau 3 de la touche Windows de gauche"
-#: ../rules/base.xml.in.h:990
+#: ../rules/base.xml.in.h:994
msgid "3rd level of Right Win"
msgstr "Niveau 3 de la touche Windows de droite"
-#: ../rules/base.xml.in.h:991
+#: ../rules/base.xml.in.h:995
msgid "3rd level of Menu"
msgstr "Niveau 3 de menu"
-#: ../rules/base.xml.in.h:992
+#: ../rules/base.xml.in.h:996
msgid "3rd level of Left Ctrl"
msgstr "Niveau 3 de la touche Ctrl de gauche"
-#: ../rules/base.xml.in.h:993
+#: ../rules/base.xml.in.h:997
msgid "3rd level of Right Ctrl"
msgstr "Niveau 3 de la touche Ctrl de droite"
-#: ../rules/base.xml.in.h:994
+#: ../rules/base.xml.in.h:998
msgid "3rd level of Caps Lock"
msgstr "Niveau 3 de Verr. Maj."
-#: ../rules/base.xml.in.h:995
+#: ../rules/base.xml.in.h:999
msgid "3rd level of &lt;Less/Greater&gt;"
msgstr "Niveau 3 de &lt;Plus petit/Plus grand&gt;"
-#: ../rules/base.xml.in.h:996
+#: ../rules/base.xml.in.h:1000
msgid "Pause"
msgstr "Pause"
-#: ../rules/base.xml.in.h:997
+#: ../rules/base.xml.in.h:1001
msgid "PrtSc"
msgstr "Impr. Écr."
-#: ../rules/base.xml.in.h:998
+#: ../rules/base.xml.in.h:1002
msgid "Miscellaneous compatibility options"
msgstr "Diverses options de compatibilité"
-#: ../rules/base.xml.in.h:999
+#: ../rules/base.xml.in.h:1003
msgid "Default numeric keypad keys"
msgstr "Touches du pavé numérique par défaut"
-#: ../rules/base.xml.in.h:1000
+#: ../rules/base.xml.in.h:1004
msgid "Numeric keypad keys always enter digits (as in Mac OS)"
msgstr "Les touches du pavé numérique sont toujours numériques (comme sur Mac OS)"
-#: ../rules/base.xml.in.h:1001
+#: ../rules/base.xml.in.h:1005
msgid "Shift with numeric keypad keys works as in MS Windows"
msgstr "Maj. avec le pavé numérique se comporte comme dans Windows"
-#: ../rules/base.xml.in.h:1002
+#: ../rules/base.xml.in.h:1006
msgid "Shift does not cancel Num Lock, chooses 3rd level instead"
msgstr "Maj. n'annule pas Verr. maj., mais sélectionne le niveau 3"
# https://help.ubuntu.com/7.04/user-guide/C/prefs-hardware.html
-#: ../rules/base.xml.in.h:1003
+#: ../rules/base.xml.in.h:1007
msgid "Special keys (Ctrl+Alt+&lt;key&gt;) handled in a server"
msgstr "Les combinaisons spéciales (Ctrl+Alt+&lt;touche&gt;) sont traitées par le serveur X"
-#: ../rules/base.xml.in.h:1004
+#: ../rules/base.xml.in.h:1008
msgid "Apple Aluminium Keyboard: emulate PC keys (Print, Scroll Lock, Pause, Num Lock)"
msgstr "Clavier aluminium Apple : émulation des touches PC (Impr. écr. ; défil. ; pause ; Verr. Num.)"
-#: ../rules/base.xml.in.h:1005
+#: ../rules/base.xml.in.h:1009
msgid "Shift cancels Caps Lock"
msgstr "Maj. annule Verr. maj."
-#: ../rules/base.xml.in.h:1006
+#: ../rules/base.xml.in.h:1010
msgid "Enable extra typographic characters"
msgstr "Active des caractères typographiques supplémentaires"
-#: ../rules/base.xml.in.h:1007
+#: ../rules/base.xml.in.h:1011
msgid "Both Shift keys together toggle Caps Lock"
msgstr "Les deux touches Maj. activent ou désactivent Verr. maj."
-#: ../rules/base.xml.in.h:1008
+#: ../rules/base.xml.in.h:1012
msgid "Both Shift keys together activate Caps Lock, one Shift key deactivates"
msgstr "Les deux touches Maj. activent le verrouillage majuscule, une le désactive"
-#: ../rules/base.xml.in.h:1009
+#: ../rules/base.xml.in.h:1013
msgid "Both Shift keys together toggle ShiftLock"
msgstr "Les deux touches Maj. activent ou désactivent le blocage majuscule"
-#: ../rules/base.xml.in.h:1010
+#: ../rules/base.xml.in.h:1014
msgid "Shift + NumLock toggles PointerKeys"
msgstr "Maj. + VerrNum bascule le contrôle souris au clavier (PointerKeys) "
-#: ../rules/base.xml.in.h:1011
+#: ../rules/base.xml.in.h:1015
msgid "Allow breaking grabs with keyboard actions (warning: security risk)"
-msgstr "Autoriser des actions clavier à casser les captures (attention : faille de sécurité)"
+msgstr "Autorise des actions clavier à casser les captures (attention : faille de sécurité)"
-#: ../rules/base.xml.in.h:1012
+#: ../rules/base.xml.in.h:1016
+msgid "Allow grab and window tree logging"
+msgstr "Autorise l'enregistrement des captures et arborescences de fenêtres"
+
+#: ../rules/base.xml.in.h:1017
msgid "Adding currency signs to certain keys"
msgstr "Ajout des signes monétaires sur certaines touches"
-#: ../rules/base.xml.in.h:1013
+#: ../rules/base.xml.in.h:1018
msgid "Euro on E"
msgstr "Euro sur le E"
-#: ../rules/base.xml.in.h:1014
+#: ../rules/base.xml.in.h:1019
msgid "Euro on 2"
msgstr "Euro sur le 2"
-#: ../rules/base.xml.in.h:1015
+#: ../rules/base.xml.in.h:1020
msgid "Euro on 4"
msgstr "Euro sur le 4"
-#: ../rules/base.xml.in.h:1016
+#: ../rules/base.xml.in.h:1021
msgid "Euro on 5"
msgstr "Euro sur le 5"
-#: ../rules/base.xml.in.h:1017
+#: ../rules/base.xml.in.h:1022
msgid "Rupee on 4"
msgstr "Roupie sur le 4"
-#: ../rules/base.xml.in.h:1018
+#: ../rules/base.xml.in.h:1023
msgid "Key to choose 5th level"
msgstr "Touche sélectionnant le niveau 5"
-#: ../rules/base.xml.in.h:1019
+#: ../rules/base.xml.in.h:1024
msgid "&lt;Less/Greater&gt; chooses 5th level, locks when pressed together with another 5th-level-chooser"
msgstr "&lt;Plus petit/Plus grand&gt; sélectionne le niveau 5 ; se verrouille par un appui simultané avec un autre sélecteur de niveau 5"
-#: ../rules/base.xml.in.h:1020
+#: ../rules/base.xml.in.h:1025
msgid "Right Alt chooses 5th level, locks when pressed together with another 5th-level-chooser"
msgstr "Alt droite sélectionne le niveau 5 ; se verrouille par un appui simultané avec un autre sélecteur de niveau 5"
-#: ../rules/base.xml.in.h:1021
+#: ../rules/base.xml.in.h:1026
msgid "Left Win chooses 5th level, locks when pressed together with another 5th-level-chooser"
msgstr "Windows gauche sélectionne le niveau 5 ; se verrouille par un appui simultané avec un autre sélecteur de niveau 5"
-#: ../rules/base.xml.in.h:1022
+#: ../rules/base.xml.in.h:1027
msgid "Right Win chooses 5th level, locks when pressed together with another 5th-level-chooser"
msgstr "Windows droite sélectionne le niveau 5 ; se verrouille par un appui simultané avec un autre sélecteur du niveau 5"
-#: ../rules/base.xml.in.h:1023
+#: ../rules/base.xml.in.h:1028
msgid "Using space key to input non-breakable space character"
msgstr "Utiliser la barre d'espacement pour insérer une espace insécable"
-#: ../rules/base.xml.in.h:1024
+#: ../rules/base.xml.in.h:1029
msgid "Usual space at any level"
msgstr "L'espace habituelle quelque-soit le niveau"
-#: ../rules/base.xml.in.h:1025
+#: ../rules/base.xml.in.h:1030
msgid "Non-breakable space character at second level"
msgstr "Espace insécable au niveau 2"
-#: ../rules/base.xml.in.h:1026
+#: ../rules/base.xml.in.h:1031
msgid "Non-breakable space character at third level"
msgstr "Espace insécable au niveau 3"
-#: ../rules/base.xml.in.h:1027
+#: ../rules/base.xml.in.h:1032
msgid "Non-breakable space character at third level, nothing at fourth level"
msgstr "Espace insécable au niveau 3, rien au niveau 4"
-#: ../rules/base.xml.in.h:1028
+#: ../rules/base.xml.in.h:1033
msgid "Non-breakable space character at third level, thin non-breakable space character at fourth level"
msgstr "Espace insécable au niveau 3, espace fine insécable au niveau 4"
-#: ../rules/base.xml.in.h:1029
+#: ../rules/base.xml.in.h:1034
msgid "Non-breakable space character at fourth level"
msgstr "Espace insécable au niveau 4"
-#: ../rules/base.xml.in.h:1030
+#: ../rules/base.xml.in.h:1035
msgid "Non-breakable space character at fourth level, thin non-breakable space character at sixth level"
msgstr "Espace insécable au niveau 4, espace fine insécable au niveau 6"
-#: ../rules/base.xml.in.h:1031
+#: ../rules/base.xml.in.h:1036
msgid "Non-breakable space character at fourth level, thin non-breakable space character at sixth level (via Ctrl+Shift)"
msgstr "Espace insécable au niveau 4, espace fine insécable au niveau 6 (via Ctrl+Maj.)"
# http://hapax.qc.ca/glossaire.htm
-#: ../rules/base.xml.in.h:1032
+#: ../rules/base.xml.in.h:1037
msgid "Zero-width non-joiner character at second level"
msgstr "Antiliant à chasse nulle au niveau 2"
-#: ../rules/base.xml.in.h:1033
+#: ../rules/base.xml.in.h:1038
msgid "Zero-width non-joiner character at second level, zero-width joiner character at third level"
msgstr "Antiliant à chasse nulle au niveau 2, liant à chasse nulle au niveau 3"
-#: ../rules/base.xml.in.h:1034
+#: ../rules/base.xml.in.h:1039
msgid "Zero-width non-joiner character at second level, zero-width joiner character at third level, non-breakable space character at fourth level"
msgstr "Antiliant à chasse nulle au niveau 2, liant à chasse nulle au niveau 3, espace insécable au niveau 4"
-#: ../rules/base.xml.in.h:1035
+#: ../rules/base.xml.in.h:1040
msgid "Zero-width non-joiner character at second level, non-breakable space character at third level"
msgstr "Antiliant à chasse nulle au niveau 2. espace insécable au niveau 3"
-#: ../rules/base.xml.in.h:1036
+#: ../rules/base.xml.in.h:1041
msgid "Zero-width non-joiner character at second level, non-breakable space character at third level, nothing at fourth level"
msgstr "Antiliant à chasse nulle au niveau 2. espace insécable au niveau 3, rien au niveau 4"
-#: ../rules/base.xml.in.h:1037
+#: ../rules/base.xml.in.h:1042
msgid "Zero-width non-joiner character at second level, non-breakable space character at third level, zero-width joiner at fourth level"
msgstr "Antiliant à chasse nulle au niveau 2. espace insécable au niveau 3, liant à chasse nulle au niveau 4"
-#: ../rules/base.xml.in.h:1038
+#: ../rules/base.xml.in.h:1043
msgid "Zero-width non-joiner character at second level, non-breakable space character at third level, thin non-breakable space at fourth level"
msgstr "Antiliant à chasse nulle au niveau 2. espace insécable au niveau 3, espace fine insécable au niveau 4"
-#: ../rules/base.xml.in.h:1039
+#: ../rules/base.xml.in.h:1044
msgid "Zero-width non-joiner character at third level, zero-width joiner at fourth level"
msgstr "Antiliant à chasse nulle au niveau 3, liant à chasse nulle au niveau 4"
-#: ../rules/base.xml.in.h:1040
+#: ../rules/base.xml.in.h:1045
msgid "Japanese keyboard options"
msgstr "Options des claviers japonais"
-#: ../rules/base.xml.in.h:1041
+#: ../rules/base.xml.in.h:1046
msgid "Kana Lock key is locking"
msgstr "La touche « verrouillage Kana » verrouille"
-#: ../rules/base.xml.in.h:1042
+#: ../rules/base.xml.in.h:1047
msgid "NICOLA-F style Backspace"
msgstr "Eff. Arr. du type NICOLA-F"
-#: ../rules/base.xml.in.h:1043
+#: ../rules/base.xml.in.h:1048
msgid "Make Zenkaku Hankaku an additional ESC"
msgstr "Faire du Zenkaku Hankaku un Échap. supplémentaire."
-#: ../rules/base.xml.in.h:1044
+#: ../rules/base.xml.in.h:1049
msgid "Adding Esperanto supersigned letters"
msgstr "Ajout des lettres accentuées Espéranto"
-#: ../rules/base.xml.in.h:1045
+#: ../rules/base.xml.in.h:1050
msgid "To the corresponding key in a Qwerty layout"
msgstr "Vers la touche correspondante sur une disposition Qwerty."
-#: ../rules/base.xml.in.h:1046
+#: ../rules/base.xml.in.h:1051
msgid "To the corresponding key in a Dvorak layout"
msgstr "Vers la touche correspondante sur une disposition Dvorak."
-#: ../rules/base.xml.in.h:1047
+#: ../rules/base.xml.in.h:1052
msgid "To the corresponding key in a Colemak layout"
msgstr "Vers la touche correspondante sur une disposition Dvorak."
-#: ../rules/base.xml.in.h:1048
+#: ../rules/base.xml.in.h:1053
msgid "Maintain key compatibility with old Solaris keycodes"
msgstr "Rester compatible avec les anciens code clavier Solaris"
-#: ../rules/base.xml.in.h:1049
+#: ../rules/base.xml.in.h:1054
msgid "Sun Key compatibility"
msgstr "Compatibilité avec les touches Sun"
-#: ../rules/base.xml.in.h:1050
+#: ../rules/base.xml.in.h:1055
msgid "Key sequence to kill the X server"
msgstr "Séquence de touches pour tuer le serveur X"
-#: ../rules/base.xml.in.h:1051
+#: ../rules/base.xml.in.h:1056
msgid "Ctrl + Alt + Backspace"
msgstr "Ctrl + Alt + Eff. arrière"
@@ -4137,147 +4157,158 @@ msgstr "Salish Cœur d'Alène"
msgid "English (US, Sun Type 6/7)"
msgstr "Anglais (USA, Sun type 6/7)"
-#: ../rules/base.extras.xml.in.h:42
+# https://normanlayout.info/
+#: ../rules/base.extras.xml.in.h:40
+msgid "English (Norman)"
+msgstr "Anglais (Norman)"
+
+#: ../rules/base.extras.xml.in.h:43
msgid "Polish (international with dead keys)"
msgstr "Polonais (international avec touches mortes)"
# http://colemak.com/
-#: ../rules/base.extras.xml.in.h:43
+#: ../rules/base.extras.xml.in.h:44
msgid "Polish (Colemak)"
msgstr "Polonais (Colemak)"
-#: ../rules/base.extras.xml.in.h:44
+#: ../rules/base.extras.xml.in.h:45
msgid "Polish (Sun Type 6/7)"
msgstr "Polonais (Sun type 6/7)"
-#: ../rules/base.extras.xml.in.h:48
+#: ../rules/base.extras.xml.in.h:49
msgid "Crimean Tatar (Dobruja Q)"
msgstr "Tatar de Crimée (Q dobroudja)"
-#: ../rules/base.extras.xml.in.h:49
+#: ../rules/base.extras.xml.in.h:50
msgid "Romanian (ergonomic Touchtype)"
msgstr "Roumain (ergonomique dactylographique)"
-#: ../rules/base.extras.xml.in.h:50
+#: ../rules/base.extras.xml.in.h:51
msgid "Romanian (Sun Type 6/7)"
msgstr "Roumain (Sun type 6/7)"
-#: ../rules/base.extras.xml.in.h:53
+#: ../rules/base.extras.xml.in.h:54
msgid "Serbian (combining accents instead of dead keys)"
msgstr "Serbe (accents combinatoires à la place des touches mortes)"
-#: ../rules/base.extras.xml.in.h:56
+#: ../rules/base.extras.xml.in.h:57
msgid "Russian (with Ukrainian-Belorussian layout)"
msgstr "Russe (Ukrainien-Biélorusse)"
-#: ../rules/base.extras.xml.in.h:57
+#: ../rules/base.extras.xml.in.h:58
msgid "Russian (Sun Type 6/7)"
msgstr "Russe (Sun type 6/7)"
-#: ../rules/base.extras.xml.in.h:60
+#: ../rules/base.extras.xml.in.h:61
msgid "Armenian (OLPC phonetic)"
msgstr "Arménien (phonétique OLPC)"
-#: ../rules/base.extras.xml.in.h:63
+#: ../rules/base.extras.xml.in.h:64
msgid "Hebrew (Biblical, SIL phonetic)"
msgstr "Hébreu (biblique, SIL, phonétique)"
-#: ../rules/base.extras.xml.in.h:66
+#: ../rules/base.extras.xml.in.h:67
msgid "Arabic (Sun Type 6/7)"
msgstr "Arabe (Sun type 6/7)"
-#: ../rules/base.extras.xml.in.h:69
+#: ../rules/base.extras.xml.in.h:70
msgid "Belgian (Sun Type 6/7)"
msgstr "Belge (Sun type 6/7)"
-#: ../rules/base.extras.xml.in.h:72
+#: ../rules/base.extras.xml.in.h:73
msgid "Portuguese (Brazil, Sun Type 6/7)"
msgstr "Portugais (Brésil, Sun type 6/7)"
-#: ../rules/base.extras.xml.in.h:75
+#: ../rules/base.extras.xml.in.h:76
msgid "Czech (Sun Type 6/7)"
msgstr "Tchèque (Sun type 6/7)"
-#: ../rules/base.extras.xml.in.h:78
+#: ../rules/base.extras.xml.in.h:79
msgid "Danish (Sun Type 6/7)"
msgstr "Danois (Sun type 6/7)"
-#: ../rules/base.extras.xml.in.h:81
+#: ../rules/base.extras.xml.in.h:82
msgid "Dutch (Sun Type 6/7)"
msgstr "Danois (Sun type 6/7)"
-#: ../rules/base.extras.xml.in.h:84
+#: ../rules/base.extras.xml.in.h:85
msgid "Estonian (Sun Type 6/7)"
msgstr "Estonien (Sun type 6/7)"
-#: ../rules/base.extras.xml.in.h:87
+#: ../rules/base.extras.xml.in.h:88
msgid "Finnish (Sun Type 6/7)"
msgstr "Finnois (Sun type 6/7)"
-#: ../rules/base.extras.xml.in.h:89
+#: ../rules/base.extras.xml.in.h:90
msgid "French (Sun Type 6/7)"
msgstr "Français (Sun type 6/7)"
-#: ../rules/base.extras.xml.in.h:92
+#: ../rules/base.extras.xml.in.h:93
msgid "Greek (Sun Type 6/7)"
msgstr "Grec (Sun type 6/7)"
-#: ../rules/base.extras.xml.in.h:95
+#: ../rules/base.extras.xml.in.h:96
msgid "Italian (Sun Type 6/7)"
msgstr "Italien (Sun type 6/7)"
-#: ../rules/base.extras.xml.in.h:98
+#: ../rules/base.extras.xml.in.h:99
msgid "Japanese (Sun Type 6)"
msgstr "Japonais (Sun type 6)"
-#: ../rules/base.extras.xml.in.h:99
+#: ../rules/base.extras.xml.in.h:100
msgid "Japanese (Sun Type 7 - pc compatible)"
msgstr "Japonais (Sun type 7 - compatible PC)"
-#: ../rules/base.extras.xml.in.h:100
+#: ../rules/base.extras.xml.in.h:101
msgid "Japanese (Sun Type 7 - sun compatible)"
msgstr "Japonais (Sun type 7 - compatible Sun)"
-#: ../rules/base.extras.xml.in.h:103
+#: ../rules/base.extras.xml.in.h:104
msgid "Norwegian (Sun Type 6/7)"
msgstr "Norvégien (Sun type 6/7)"
-#: ../rules/base.extras.xml.in.h:105
+#: ../rules/base.extras.xml.in.h:106
msgid "Portuguese (Sun Type 6/7)"
msgstr "Portugais (Sun type 6/7)"
-#: ../rules/base.extras.xml.in.h:108
+#: ../rules/base.extras.xml.in.h:109
msgid "Slovak (Sun Type 6/7)"
msgstr "Slovaque (Sun type 6/7)"
-#: ../rules/base.extras.xml.in.h:111
+#: ../rules/base.extras.xml.in.h:112
msgid "Spanish (Sun Type 6/7)"
msgstr "Espagnol (Sun type 6/7)"
-#: ../rules/base.extras.xml.in.h:114
+#: ../rules/base.extras.xml.in.h:115
msgid "Swedish (Sun Type 6/7)"
msgstr "Suédois (Sun type 6/7)"
-#: ../rules/base.extras.xml.in.h:116
+#: ../rules/base.extras.xml.in.h:117
msgid "German (Switzerland, Sun Type 6/7)"
msgstr "Allemand (Suisse, Sun type 6/7)"
-#: ../rules/base.extras.xml.in.h:117
+#: ../rules/base.extras.xml.in.h:118
msgid "French (Switzerland, Sun Type 6/7)"
msgstr "Français (Suisse, Sun type 6/7)"
-#: ../rules/base.extras.xml.in.h:120
+#: ../rules/base.extras.xml.in.h:121
msgid "Turkish (Sun Type 6/7)"
msgstr "Turc (Sun type 6/7)"
-#: ../rules/base.extras.xml.in.h:123
+#: ../rules/base.extras.xml.in.h:124
msgid "Ukrainian (Sun Type 6/7)"
msgstr "Ukrainien (Sun type 6/7)"
-#: ../rules/base.extras.xml.in.h:125
+#: ../rules/base.extras.xml.in.h:126
msgid "English (UK, Sun Type 6/7)"
msgstr "Anglais (Royaume-Uni, Sun type 6/7)"
-#: ../rules/base.extras.xml.in.h:128
+#: ../rules/base.extras.xml.in.h:129
msgid "Korean (Sun Type 6/7)"
msgstr "Coréen (Sun type 6/7)"
+
+#~ msgid "Bengali"
+#~ msgstr "Bengali"
+
+#~ msgid "Portuguese (Brazil, nativo for Esperanto)"
+#~ msgstr "Portugais (Brésil, BR-Nativo pour l'Espéranto)"
diff --git a/xorg-server/xkeyboard-config/po/hu.po b/xorg-server/xkeyboard-config/po/hu.po
index a0ac3a6ea..d0b92760c 100644
--- a/xorg-server/xkeyboard-config/po/hu.po
+++ b/xorg-server/xkeyboard-config/po/hu.po
@@ -1,16 +1,16 @@
# Hungarian translation of xkeyboard-config
-# Copyright (C) 2004, 2006, 2007, 2008, 2009, 2010, 2011, 2012, 2013. Free Software Foundation, Inc.
+# Copyright (C) 2004, 2006, 2007, 2008, 2009, 2010, 2011, 2012, 2013, 2014. Free Software Foundation, Inc.
# This file is distributed under the same license as the xkeyboard-config package.
#
# Andras Timar <timar@fsf.hu>, 2004.
# Szilveszter Farkas <Szilveszter.Farkas@gmail.com>, 2006.
-# Gabor Kelemen <kelemeng@gnome.hu>, 2006, 2007, 2008, 2009, 2010, 2011, 2012, 2013.
+# Gabor Kelemen <kelemeng@gnome.hu>, 2006, 2007, 2008, 2009, 2010, 2011, 2012, 2013, 2014.
msgid ""
msgstr ""
-"Project-Id-Version: xkeyboard-config 2.9.91\n"
+"Project-Id-Version: xkeyboard-config 2.10.99\n"
"Report-Msgid-Bugs-To: svu@users.sourceforge.net\n"
-"POT-Creation-Date: 2013-09-14 14:41+0200\n"
-"PO-Revision-Date: 2013-09-15 00:37+0200\n"
+"POT-Creation-Date: 2014-01-15 01:12+0000\n"
+"PO-Revision-Date: 2014-01-21 10:43+0100\n"
"Last-Translator: Gabor Kelemen <kelemeng@gnome.hu>\n"
"Language-Team: Hungarian <translation-team-hu@lists.sourceforge.net>\n"
"Language: hu\n"
@@ -18,7 +18,7 @@ msgstr ""
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"Plural-Forms: nplurals=2; plural=(n != 1);\n"
-"X-Generator: Lokalize 1.5\n"
+"X-Generator: Lokalize 1.4\n"
#: ../rules/base.xml.in.h:1
msgid "Generic 101-key PC"
@@ -819,7 +819,7 @@ msgid "English (programmer Dvorak)"
msgstr "Angol (programozói Dvorak)"
#. Keyboard indicator for Russian layouts
-#: ../rules/base.xml.in.h:203 ../rules/base.extras.xml.in.h:54
+#: ../rules/base.xml.in.h:203 ../rules/base.extras.xml.in.h:55
msgid "ru"
msgstr "ru"
@@ -891,11 +891,11 @@ msgid "Uzbek (Afghanistan, OLPC)"
msgstr "Üzbég (Afganisztán, OLPC)"
#. Keyboard indicator for Arabic layouts
-#: ../rules/base.xml.in.h:224 ../rules/base.extras.xml.in.h:64
+#: ../rules/base.xml.in.h:224 ../rules/base.extras.xml.in.h:65
msgid "ar"
msgstr "ar"
-#: ../rules/base.xml.in.h:225 ../rules/base.extras.xml.in.h:65
+#: ../rules/base.xml.in.h:225 ../rules/base.extras.xml.in.h:66
msgid "Arabic"
msgstr "Arab"
@@ -933,11 +933,11 @@ msgid "Albanian"
msgstr "Albán"
#. Keyboard indicator for Armenian layouts
-#: ../rules/base.xml.in.h:236 ../rules/base.extras.xml.in.h:58
+#: ../rules/base.xml.in.h:236 ../rules/base.extras.xml.in.h:59
msgid "hy"
msgstr "hy"
-#: ../rules/base.xml.in.h:237 ../rules/base.extras.xml.in.h:59
+#: ../rules/base.xml.in.h:237 ../rules/base.extras.xml.in.h:60
msgid "Armenian"
msgstr "Örmény"
@@ -1013,11 +1013,11 @@ msgid "Belarusian (Latin)"
msgstr "Belorusz (Latin)"
#. Keyboard indicator for Belgian layouts
-#: ../rules/base.xml.in.h:259 ../rules/base.extras.xml.in.h:67
+#: ../rules/base.xml.in.h:259 ../rules/base.extras.xml.in.h:68
msgid "be"
msgstr "be"
-#: ../rules/base.xml.in.h:260 ../rules/base.extras.xml.in.h:68
+#: ../rules/base.xml.in.h:260 ../rules/base.extras.xml.in.h:69
msgid "Belgian"
msgstr "Belga"
@@ -1049,17 +1049,17 @@ msgstr "Belga (Sun halott billentyűk)"
msgid "Belgian (Wang model 724 azerty)"
msgstr "Belga (Wang 724-es modell, azerty)"
-#. Keyboard indicator for Bengali layouts
+#. Keyboard indicator for Bangla layouts
#: ../rules/base.xml.in.h:269
msgid "bn"
msgstr "bn"
#: ../rules/base.xml.in.h:270
-msgid "Bengali"
+msgid "Bangla"
msgstr "Bengáli"
#: ../rules/base.xml.in.h:271
-msgid "Bengali (Probhat)"
+msgid "Bangla (Probhat)"
msgstr "Bengáli (Probhat)"
#. Keyboard indicator for Indian layouts
@@ -1072,27 +1072,27 @@ msgid "Indian"
msgstr "Indiai"
#: ../rules/base.xml.in.h:275
-msgid "Bengali (India)"
+msgid "Bangla (India)"
msgstr "Bengáli (India)"
#: ../rules/base.xml.in.h:276
-msgid "Bengali (India, Probhat)"
+msgid "Bangla (India, Probhat)"
msgstr "Bengáli (India, Probhat)"
#: ../rules/base.xml.in.h:277
-msgid "Bengali (India, Baishakhi)"
+msgid "Bangla (India, Baishakhi)"
msgstr "Bengáli (India, Baishakhi)"
#: ../rules/base.xml.in.h:278
-msgid "Bengali (India, Bornona)"
+msgid "Bangla (India, Bornona)"
msgstr "Bengáli (India, Bornona)"
#: ../rules/base.xml.in.h:279
-msgid "Bengali (India, Uni Gitanjali)"
+msgid "Bangla (India, Uni Gitanjali)"
msgstr "Bengáli (India, Uni Gitanjali)"
#: ../rules/base.xml.in.h:280
-msgid "Bengali (India, Baishakhi Inscript)"
+msgid "Bangla (India, Baishakhi Inscript)"
msgstr "Bengáli (India, Baishakhi Inscript)"
#. Keyboard indicator for Gujarati layouts
@@ -1276,11 +1276,11 @@ msgid "Bosnian (US keyboard with Bosnian letters)"
msgstr "Bosnyák (US billentyűzet bosnyák betűkkel)"
#. Keyboard indicator for Portuguese layouts
-#: ../rules/base.xml.in.h:336 ../rules/base.extras.xml.in.h:70
+#: ../rules/base.xml.in.h:336 ../rules/base.extras.xml.in.h:71
msgid "pt"
msgstr "pt"
-#: ../rules/base.xml.in.h:337 ../rules/base.extras.xml.in.h:71
+#: ../rules/base.xml.in.h:337 ../rules/base.extras.xml.in.h:72
msgid "Portuguese (Brazil)"
msgstr "Portugál (brazil)"
@@ -1293,16 +1293,16 @@ msgid "Portuguese (Brazil, Dvorak)"
msgstr "Portugál (brazil, Dvorak)"
#: ../rules/base.xml.in.h:340
-msgid "Portuguese (Brazil, nativo)"
+msgid "Portuguese (Brazil, Nativo)"
msgstr "Portugál (brazil, natív)"
#: ../rules/base.xml.in.h:341
-msgid "Portuguese (Brazil, nativo for US keyboards)"
+msgid "Portuguese (Brazil, Nativo for US keyboards)"
msgstr "Portugál (brazil, natív a US billentyűzetekhez)"
#: ../rules/base.xml.in.h:342
-msgid "Portuguese (Brazil, nativo for Esperanto)"
-msgstr "Portugál (brazil, natív az eszperantóhoz)"
+msgid "Esperanto (Brazil, Nativo)"
+msgstr "Eszperantó (Brazil, natív)"
#. Keyboard indicator for Bulgarian layouts
#: ../rules/base.xml.in.h:344
@@ -1456,2462 +1456,2482 @@ msgid "Tibetan (with ASCII numerals)"
msgstr "Tibeti (ASCII számjegyekkel)"
#: ../rules/base.xml.in.h:386
+msgid "ug"
+msgstr "ug"
+
+#: ../rules/base.xml.in.h:387
msgid "Uyghur"
msgstr "Ujgur"
#. Keyboard indicator for Croatian layouts
-#: ../rules/base.xml.in.h:388
+#: ../rules/base.xml.in.h:389
msgid "hr"
msgstr "hr"
-#: ../rules/base.xml.in.h:389
+#: ../rules/base.xml.in.h:390
msgid "Croatian"
msgstr "Horvát"
-#: ../rules/base.xml.in.h:390
+#: ../rules/base.xml.in.h:391
msgid "Croatian (use guillemets for quotes)"
msgstr "Horvát (»Csúcsos« idézőjelek használata idézetekhez)"
-#: ../rules/base.xml.in.h:391
+#: ../rules/base.xml.in.h:392
msgid "Croatian (use Croatian digraphs)"
msgstr "Horvát (Horvát billentyűkombinációk használata)"
-#: ../rules/base.xml.in.h:392
+#: ../rules/base.xml.in.h:393
msgid "Croatian (US keyboard with Croatian digraphs)"
msgstr "Horvát (US billentyűzet horvát billentyűkombinációkkal)"
-#: ../rules/base.xml.in.h:393
+#: ../rules/base.xml.in.h:394
msgid "Croatian (US keyboard with Croatian letters)"
msgstr "Horvát (US billentyűzet horvát betűkkel)"
#. Keyboard indicator for Chech layouts
-#: ../rules/base.xml.in.h:395 ../rules/base.extras.xml.in.h:73
+#: ../rules/base.xml.in.h:396 ../rules/base.extras.xml.in.h:74
msgid "cs"
msgstr "cs"
-#: ../rules/base.xml.in.h:396 ../rules/base.extras.xml.in.h:74
+#: ../rules/base.xml.in.h:397 ../rules/base.extras.xml.in.h:75
msgid "Czech"
msgstr "Cseh"
-#: ../rules/base.xml.in.h:397
+#: ../rules/base.xml.in.h:398
msgid "Czech (with &lt;\\|&gt; key)"
msgstr "Cseh (az &lt;\\|&gt; billentyűvel)"
-#: ../rules/base.xml.in.h:398
+#: ../rules/base.xml.in.h:399
msgid "Czech (qwerty)"
msgstr "Cseh (qwerty)"
-#: ../rules/base.xml.in.h:399
+#: ../rules/base.xml.in.h:400
msgid "Czech (qwerty, extended Backslash)"
msgstr "Cseh (qwerty, kibővített fordított törtvonal)"
-#: ../rules/base.xml.in.h:400
+#: ../rules/base.xml.in.h:401
msgid "Czech (UCW layout, accented letters only)"
msgstr "Cseh (UCW kiosztás, csak ékezetes betűk)"
-#: ../rules/base.xml.in.h:401
+#: ../rules/base.xml.in.h:402
msgid "Czech (US Dvorak with CZ UCW support)"
msgstr "Cseh (US Dvorak CZ UCW támogatással)"
#. Keyboard indicator for Danish layouts
-#: ../rules/base.xml.in.h:403 ../rules/base.extras.xml.in.h:76
+#: ../rules/base.xml.in.h:404 ../rules/base.extras.xml.in.h:77
msgid "da"
msgstr "da"
-#: ../rules/base.xml.in.h:404 ../rules/base.extras.xml.in.h:77
+#: ../rules/base.xml.in.h:405 ../rules/base.extras.xml.in.h:78
msgid "Danish"
msgstr "Dán"
-#: ../rules/base.xml.in.h:405
+#: ../rules/base.xml.in.h:406
msgid "Danish (eliminate dead keys)"
msgstr "Dán (halott billentyűk tiltása)"
-#: ../rules/base.xml.in.h:406
+#: ../rules/base.xml.in.h:407
msgid "Danish (Macintosh)"
msgstr "Dán (Macintosh)"
-#: ../rules/base.xml.in.h:407
+#: ../rules/base.xml.in.h:408
msgid "Danish (Macintosh, eliminate dead keys)"
msgstr "Dán (Macintosh, halott billentyűk tiltása)"
-#: ../rules/base.xml.in.h:408
+#: ../rules/base.xml.in.h:409
msgid "Danish (Dvorak)"
msgstr "Dán (Dvorak)"
#. Keyboard indicator for Dutch layouts
-#: ../rules/base.xml.in.h:410 ../rules/base.extras.xml.in.h:79
+#: ../rules/base.xml.in.h:411 ../rules/base.extras.xml.in.h:80
msgid "nl"
msgstr "nl"
-#: ../rules/base.xml.in.h:411 ../rules/base.extras.xml.in.h:80
+#: ../rules/base.xml.in.h:412 ../rules/base.extras.xml.in.h:81
msgid "Dutch"
msgstr "Holland"
-#: ../rules/base.xml.in.h:412
+#: ../rules/base.xml.in.h:413
msgid "Dutch (Sun dead keys)"
msgstr "Holland (Sun halott billentyűk)"
-#: ../rules/base.xml.in.h:413
+#: ../rules/base.xml.in.h:414
msgid "Dutch (Macintosh)"
msgstr "Holland (Macintosh)"
-#: ../rules/base.xml.in.h:414
+#: ../rules/base.xml.in.h:415
msgid "Dutch (standard)"
msgstr "Holland (szabványos)"
#. Keyboard indicator for Dzongkha layouts
-#: ../rules/base.xml.in.h:416
+#: ../rules/base.xml.in.h:417
msgid "dz"
msgstr "dz"
-#: ../rules/base.xml.in.h:417
+#: ../rules/base.xml.in.h:418
msgid "Dzongkha"
msgstr "Dzongkha"
#. Keyboard indicator for Estonian layouts
-#: ../rules/base.xml.in.h:419 ../rules/base.extras.xml.in.h:82
+#: ../rules/base.xml.in.h:420 ../rules/base.extras.xml.in.h:83
msgid "et"
msgstr "et"
-#: ../rules/base.xml.in.h:420 ../rules/base.extras.xml.in.h:83
+#: ../rules/base.xml.in.h:421 ../rules/base.extras.xml.in.h:84
msgid "Estonian"
msgstr "Észt"
-#: ../rules/base.xml.in.h:421
+#: ../rules/base.xml.in.h:422
msgid "Estonian (eliminate dead keys)"
msgstr "Észt (halott billentyűk tiltása)"
-#: ../rules/base.xml.in.h:422
+#: ../rules/base.xml.in.h:423
msgid "Estonian (Dvorak)"
msgstr "Észt (Dvorak)"
-#: ../rules/base.xml.in.h:423
+#: ../rules/base.xml.in.h:424
msgid "Estonian (US keyboard with Estonian letters)"
msgstr "Észt (US billentyűzet észt betűkkel)"
-#: ../rules/base.xml.in.h:424 ../rules/base.extras.xml.in.h:16
+#: ../rules/base.xml.in.h:425 ../rules/base.extras.xml.in.h:16
msgid "Persian"
msgstr "Perzsa"
-#: ../rules/base.xml.in.h:425
+#: ../rules/base.xml.in.h:426
msgid "Persian (with Persian Keypad)"
msgstr "Perzsa (perzsa számbillentyűzettel)"
#. Keyboard indicator for Kurdish layouts
-#: ../rules/base.xml.in.h:427
+#: ../rules/base.xml.in.h:428
msgid "ku"
msgstr "ku"
-#: ../rules/base.xml.in.h:428
+#: ../rules/base.xml.in.h:429
msgid "Kurdish (Iran, Latin Q)"
msgstr "Kurd (Irán, latin Q)"
-#: ../rules/base.xml.in.h:429
+#: ../rules/base.xml.in.h:430
msgid "Kurdish (Iran, F)"
msgstr "Kurd (Irán, F)"
-#: ../rules/base.xml.in.h:430
+#: ../rules/base.xml.in.h:431
msgid "Kurdish (Iran, Latin Alt-Q)"
msgstr "Kurd (Irán, latin Alt-Q)"
-#: ../rules/base.xml.in.h:431
+#: ../rules/base.xml.in.h:432
msgid "Kurdish (Iran, Arabic-Latin)"
msgstr "Kurd (Irán, arab-latin)"
-#: ../rules/base.xml.in.h:432
+#: ../rules/base.xml.in.h:433
msgid "Iraqi"
msgstr "Iraki"
-#: ../rules/base.xml.in.h:433
+#: ../rules/base.xml.in.h:434
msgid "Kurdish (Iraq, Latin Q)"
msgstr "Kurd (Irak, latin Q)"
-#: ../rules/base.xml.in.h:434
+#: ../rules/base.xml.in.h:435
msgid "Kurdish (Iraq, F)"
msgstr "Kurd (Irak, F)"
-#: ../rules/base.xml.in.h:435
+#: ../rules/base.xml.in.h:436
msgid "Kurdish (Iraq, Latin Alt-Q)"
msgstr "Kurd (Irak, latin Alt-Q)"
-#: ../rules/base.xml.in.h:436
+#: ../rules/base.xml.in.h:437
msgid "Kurdish (Iraq, Arabic-Latin)"
msgstr "Kurd (Irak, arab-latin)"
#. Keyboard indicator for Faroese layouts
-#: ../rules/base.xml.in.h:438
+#: ../rules/base.xml.in.h:439
msgid "fo"
msgstr "fo"
-#: ../rules/base.xml.in.h:439
+#: ../rules/base.xml.in.h:440
msgid "Faroese"
msgstr "Feröeri"
-#: ../rules/base.xml.in.h:440
+#: ../rules/base.xml.in.h:441
msgid "Faroese (eliminate dead keys)"
msgstr "Feröeri (halott billentyűk tiltása)"
#. Keyboard indicator for Finnish layouts
-#: ../rules/base.xml.in.h:442 ../rules/base.extras.xml.in.h:85
+#: ../rules/base.xml.in.h:443 ../rules/base.extras.xml.in.h:86
msgid "fi"
msgstr "fi"
-#: ../rules/base.xml.in.h:443 ../rules/base.extras.xml.in.h:86
+#: ../rules/base.xml.in.h:444 ../rules/base.extras.xml.in.h:87
msgid "Finnish"
msgstr "Finn"
-#: ../rules/base.xml.in.h:444
+#: ../rules/base.xml.in.h:445
msgid "Finnish (classic)"
msgstr "Finn (klasszikus)"
-#: ../rules/base.xml.in.h:445
+#: ../rules/base.xml.in.h:446
msgid "Finnish (classic, eliminate dead keys)"
msgstr "Finn (klasszikus, halott billentyűk tiltása)"
-#: ../rules/base.xml.in.h:446
+#: ../rules/base.xml.in.h:447
msgid "Northern Saami (Finland)"
msgstr "Északi szami (Finnország)"
-#: ../rules/base.xml.in.h:447
+#: ../rules/base.xml.in.h:448
msgid "Finnish (Macintosh)"
msgstr "Finn (Macintosh)"
-#: ../rules/base.xml.in.h:448 ../rules/base.extras.xml.in.h:88
+#: ../rules/base.xml.in.h:449 ../rules/base.extras.xml.in.h:89
msgid "French"
msgstr "Francia"
-#: ../rules/base.xml.in.h:449
+#: ../rules/base.xml.in.h:450
msgid "French (eliminate dead keys)"
msgstr "Francia (halott billentyűk tiltása)"
-#: ../rules/base.xml.in.h:450
+#: ../rules/base.xml.in.h:451
msgid "French (Sun dead keys)"
msgstr "Francia (Sun halott billentyűk)"
-#: ../rules/base.xml.in.h:451
+#: ../rules/base.xml.in.h:452
msgid "French (alternative)"
msgstr "Francia (alternatív)"
-#: ../rules/base.xml.in.h:452
+#: ../rules/base.xml.in.h:453
msgid "French (alternative, Latin-9 only)"
msgstr "Francia (alternatív, csak Latin-9)"
-#: ../rules/base.xml.in.h:453
+#: ../rules/base.xml.in.h:454
msgid "French (alternative, eliminate dead keys)"
msgstr "Francia (alternatív, halott billentyűk tiltása)"
-#: ../rules/base.xml.in.h:454
+#: ../rules/base.xml.in.h:455
msgid "French (alternative, Sun dead keys)"
msgstr "Francia (alternatív, Sun halott billentyűk)"
-#: ../rules/base.xml.in.h:455
+#: ../rules/base.xml.in.h:456
msgid "French (legacy, alternative)"
msgstr "Francia (hagyományos, alternatív)"
-#: ../rules/base.xml.in.h:456
+#: ../rules/base.xml.in.h:457
msgid "French (legacy, alternative, eliminate dead keys)"
msgstr "Francia (hagyományos, alternatív, halott billentyűk tiltása)"
-#: ../rules/base.xml.in.h:457
+#: ../rules/base.xml.in.h:458
msgid "French (legacy, alternative, Sun dead keys)"
msgstr "Francia (hagyományos, alternatív, Sun halott billentyűk)"
-#: ../rules/base.xml.in.h:458
+#: ../rules/base.xml.in.h:459
msgid "French (Bepo, ergonomic, Dvorak way)"
msgstr "Finn (Bepo, ergonomikus, Dvorak kiosztás)"
-#: ../rules/base.xml.in.h:459
+#: ../rules/base.xml.in.h:460
msgid "French (Bepo, ergonomic, Dvorak way, Latin-9 only)"
msgstr "Finn (Bepo, ergonomikus, Dvorak kiosztás, csak Latin-9)"
-#: ../rules/base.xml.in.h:460
+#: ../rules/base.xml.in.h:461
msgid "French (Dvorak)"
msgstr "Francia (Dvorak)"
-#: ../rules/base.xml.in.h:461
+#: ../rules/base.xml.in.h:462
msgid "French (Macintosh)"
msgstr "Francia (Macintosh)"
-#: ../rules/base.xml.in.h:462
+#: ../rules/base.xml.in.h:463
msgid "French (Breton)"
msgstr "Francia (breton)"
-#: ../rules/base.xml.in.h:463
+#: ../rules/base.xml.in.h:464
msgid "Occitan"
msgstr "Okcitán"
-#: ../rules/base.xml.in.h:464
+#: ../rules/base.xml.in.h:465
msgid "Georgian (France, AZERTY Tskapo)"
msgstr "Grúz (Franciaország, AZERTY Tskapo)"
-#: ../rules/base.xml.in.h:465
+#: ../rules/base.xml.in.h:466
msgid "English (Ghana)"
msgstr "Angol (Ghána)"
-#: ../rules/base.xml.in.h:466
+#: ../rules/base.xml.in.h:467
msgid "English (Ghana, multilingual)"
msgstr "Angol (Ghána, többnyelvű)"
#. Keyboard indicator for Akan layouts
-#: ../rules/base.xml.in.h:468
+#: ../rules/base.xml.in.h:469
msgid "ak"
msgstr "ak"
-#: ../rules/base.xml.in.h:469
+#: ../rules/base.xml.in.h:470
msgid "Akan"
msgstr "akan"
#. Keyboard indicator for Ewe layouts
-#: ../rules/base.xml.in.h:471
+#: ../rules/base.xml.in.h:472
msgid "ee"
msgstr "ee"
-#: ../rules/base.xml.in.h:472
+#: ../rules/base.xml.in.h:473
msgid "Ewe"
msgstr "ewe"
#. Keyboard indicator for Fula layouts
-#: ../rules/base.xml.in.h:474
+#: ../rules/base.xml.in.h:475
msgid "ff"
msgstr "ff"
-#: ../rules/base.xml.in.h:475
+#: ../rules/base.xml.in.h:476
msgid "Fula"
msgstr "Fula"
#. Keyboard indicator for Ga layouts
-#: ../rules/base.xml.in.h:477
+#: ../rules/base.xml.in.h:478
msgid "gaa"
msgstr "gaa"
-#: ../rules/base.xml.in.h:478
+#: ../rules/base.xml.in.h:479
msgid "Ga"
msgstr "ga"
#. Keyboard indicator for Hausa layouts
-#: ../rules/base.xml.in.h:480
+#: ../rules/base.xml.in.h:481
msgid "ha"
msgstr "ha"
-#: ../rules/base.xml.in.h:481
+#: ../rules/base.xml.in.h:482
msgid "Hausa"
msgstr "hausza"
#. Keyboard indicator for Avatime layouts
-#: ../rules/base.xml.in.h:483
+#: ../rules/base.xml.in.h:484
msgid "avn"
msgstr "avn"
-#: ../rules/base.xml.in.h:484
+#: ../rules/base.xml.in.h:485
msgid "Avatime"
msgstr "Avatime"
-#: ../rules/base.xml.in.h:485
+#: ../rules/base.xml.in.h:486
msgid "English (Ghana, GILLBT)"
msgstr "Angol (Ghána, GILLBT)"
-#: ../rules/base.xml.in.h:486
+#: ../rules/base.xml.in.h:487
msgid "French (Guinea)"
msgstr "Francia (Guinea)"
#. Keyboard indicator for Georgian layouts
-#: ../rules/base.xml.in.h:488
+#: ../rules/base.xml.in.h:489
msgid "ka"
msgstr "ka"
-#: ../rules/base.xml.in.h:489
+#: ../rules/base.xml.in.h:490
msgid "Georgian"
msgstr "Grúz"
-#: ../rules/base.xml.in.h:490
+#: ../rules/base.xml.in.h:491
msgid "Georgian (ergonomic)"
msgstr "Grúz (ergonomikus)"
-#: ../rules/base.xml.in.h:491
+#: ../rules/base.xml.in.h:492
msgid "Georgian (MESS)"
msgstr "Grúz (MESS)"
-#: ../rules/base.xml.in.h:492
+#: ../rules/base.xml.in.h:493
msgid "Russian (Georgia)"
msgstr "Orosz (Grúzia)"
-#: ../rules/base.xml.in.h:493
+#: ../rules/base.xml.in.h:494
msgid "Ossetian (Georgia)"
msgstr "Oszét (Grúzia)"
-#: ../rules/base.xml.in.h:494 ../rules/base.extras.xml.in.h:11
+#: ../rules/base.xml.in.h:495 ../rules/base.extras.xml.in.h:11
msgid "German"
msgstr "Német"
-#: ../rules/base.xml.in.h:495
+#: ../rules/base.xml.in.h:496
msgid "German (dead acute)"
msgstr "Német (halott ékezet)"
-#: ../rules/base.xml.in.h:496
+#: ../rules/base.xml.in.h:497
msgid "German (dead grave acute)"
msgstr "Német (Halott grave ékezet)"
-#: ../rules/base.xml.in.h:497
+#: ../rules/base.xml.in.h:498
msgid "German (eliminate dead keys)"
msgstr "Német (halott billentyűk tiltása)"
-#: ../rules/base.xml.in.h:498
+#: ../rules/base.xml.in.h:499
msgid "German (T3)"
msgstr "Német (T3)"
-#: ../rules/base.xml.in.h:499
+#: ../rules/base.xml.in.h:500
msgid "Romanian (Germany)"
msgstr "Román (Németország)"
-#: ../rules/base.xml.in.h:500
+#: ../rules/base.xml.in.h:501
msgid "Romanian (Germany, eliminate dead keys)"
msgstr "Román (Németország, halott billentyűk tiltása)"
-#: ../rules/base.xml.in.h:501
+#: ../rules/base.xml.in.h:502
msgid "German (Dvorak)"
msgstr "Német (Dvorak)"
-#: ../rules/base.xml.in.h:502
+#: ../rules/base.xml.in.h:503
msgid "German (Sun dead keys)"
msgstr "Német (Sun halott billentyűk)"
-#: ../rules/base.xml.in.h:503
+#: ../rules/base.xml.in.h:504
msgid "German (Neo 2)"
msgstr "Német (Neo 2)"
-#: ../rules/base.xml.in.h:504
+#: ../rules/base.xml.in.h:505
msgid "German (Macintosh)"
msgstr "Német (Macintosh)"
-#: ../rules/base.xml.in.h:505
+#: ../rules/base.xml.in.h:506
msgid "German (Macintosh, eliminate dead keys)"
msgstr "Német (Macintosh, halott billentyűk tiltása)"
-#: ../rules/base.xml.in.h:506
+#: ../rules/base.xml.in.h:507
msgid "Lower Sorbian"
msgstr "Alsó szorb"
-#: ../rules/base.xml.in.h:507
+#: ../rules/base.xml.in.h:508
msgid "Lower Sorbian (qwertz)"
msgstr "Alsó szorb (qwertz)"
-#: ../rules/base.xml.in.h:508
+#: ../rules/base.xml.in.h:509
msgid "German (qwerty)"
msgstr "Német (qwerty)"
-#: ../rules/base.xml.in.h:509
+#: ../rules/base.xml.in.h:510
msgid "Russian (Germany, phonetic)"
msgstr "Orosz (Németország, fonetikus)"
-#: ../rules/base.xml.in.h:510
+#: ../rules/base.xml.in.h:511
msgid "German (legacy)"
msgstr "Német (hagyományos)"
#. Keyboard indicator for Greek layouts
-#: ../rules/base.xml.in.h:512 ../rules/base.extras.xml.in.h:90
+#: ../rules/base.xml.in.h:513 ../rules/base.extras.xml.in.h:91
msgid "gr"
msgstr "gr"
-#: ../rules/base.xml.in.h:513 ../rules/base.extras.xml.in.h:91
+#: ../rules/base.xml.in.h:514 ../rules/base.extras.xml.in.h:92
msgid "Greek"
msgstr "Görög"
-#: ../rules/base.xml.in.h:514
+#: ../rules/base.xml.in.h:515
msgid "Greek (simple)"
msgstr "Görög (egyszerű)"
-#: ../rules/base.xml.in.h:515
+#: ../rules/base.xml.in.h:516
msgid "Greek (extended)"
msgstr "Görög (kibővített)"
-#: ../rules/base.xml.in.h:516
+#: ../rules/base.xml.in.h:517
msgid "Greek (eliminate dead keys)"
msgstr "Görög (halott billentyűk tiltása)"
-#: ../rules/base.xml.in.h:517
+#: ../rules/base.xml.in.h:518
msgid "Greek (polytonic)"
msgstr "Görög (politonikus)"
#. Keyboard indicator for Hungarian layouts
-#: ../rules/base.xml.in.h:519
+#: ../rules/base.xml.in.h:520
msgid "hu"
msgstr "hu"
-#: ../rules/base.xml.in.h:520
+#: ../rules/base.xml.in.h:521
msgid "Hungarian"
msgstr "Magyar"
-#: ../rules/base.xml.in.h:521
+#: ../rules/base.xml.in.h:522
msgid "Hungarian (standard)"
msgstr "Magyar (szabványos)"
-#: ../rules/base.xml.in.h:522
+#: ../rules/base.xml.in.h:523
msgid "Hungarian (eliminate dead keys)"
msgstr "Magyar (halott billentyűk tiltása)"
-#: ../rules/base.xml.in.h:523
+#: ../rules/base.xml.in.h:524
msgid "Hungarian (qwerty)"
msgstr "Magyar (qwerty)"
-#: ../rules/base.xml.in.h:524
+#: ../rules/base.xml.in.h:525
msgid "Hungarian (101/qwertz/comma/dead keys)"
msgstr "Magyar (101/qwertz/vessző/halott billentyűk)"
-#: ../rules/base.xml.in.h:525
+#: ../rules/base.xml.in.h:526
msgid "Hungarian (101/qwertz/comma/eliminate dead keys)"
msgstr "Magyar (101/qwertz/vessző/halott billentyűk tiltása)"
-#: ../rules/base.xml.in.h:526
+#: ../rules/base.xml.in.h:527
msgid "Hungarian (101/qwertz/dot/dead keys)"
msgstr "Magyar (101/qwertz/pont/halott billentyűk)"
-#: ../rules/base.xml.in.h:527
+#: ../rules/base.xml.in.h:528
msgid "Hungarian (101/qwertz/dot/eliminate dead keys)"
msgstr "Magyar (101/qwertz/pont/halott billentyűk tiltása)"
-#: ../rules/base.xml.in.h:528
+#: ../rules/base.xml.in.h:529
msgid "Hungarian (101/qwerty/comma/dead keys)"
msgstr "Magyar (101/qwerty/vessző/halott billentyűk)"
-#: ../rules/base.xml.in.h:529
+#: ../rules/base.xml.in.h:530
msgid "Hungarian (101/qwerty/comma/eliminate dead keys)"
msgstr "Magyar (101/qwerty/vessző/halott billentyűk tiltása)"
-#: ../rules/base.xml.in.h:530
+#: ../rules/base.xml.in.h:531
msgid "Hungarian (101/qwerty/dot/dead keys)"
msgstr "Magyar (101/qwerty/pont/halott billentyűk)"
-#: ../rules/base.xml.in.h:531
+#: ../rules/base.xml.in.h:532
msgid "Hungarian (101/qwerty/dot/eliminate dead keys)"
msgstr "Magyar (101/qwerty/pont/halott billentyűk tiltása)"
-#: ../rules/base.xml.in.h:532
+#: ../rules/base.xml.in.h:533
msgid "Hungarian (102/qwertz/comma/dead keys)"
msgstr "Magyar (102/qwertz/vessző/halott billentyűk)"
-#: ../rules/base.xml.in.h:533
+#: ../rules/base.xml.in.h:534
msgid "Hungarian (102/qwertz/comma/eliminate dead keys)"
msgstr "Magyar (102/qwertz/vessző/halott billentyűk tiltása)"
-#: ../rules/base.xml.in.h:534
+#: ../rules/base.xml.in.h:535
msgid "Hungarian (102/qwertz/dot/dead keys)"
msgstr "Magyar (102/qwertz/pont/halott billentyűk)"
-#: ../rules/base.xml.in.h:535
+#: ../rules/base.xml.in.h:536
msgid "Hungarian (102/qwertz/dot/eliminate dead keys)"
msgstr "Magyar (102/qwertz/pont/halott billentyűk tiltása)"
-#: ../rules/base.xml.in.h:536
+#: ../rules/base.xml.in.h:537
msgid "Hungarian (102/qwerty/comma/dead keys)"
msgstr "Magyar (102/qwerty/vessző/halott billentyűk)"
-#: ../rules/base.xml.in.h:537
+#: ../rules/base.xml.in.h:538
msgid "Hungarian (102/qwerty/comma/eliminate dead keys)"
msgstr "Magyar (102/qwerty/vessző/halott billentyűk tiltása)"
-#: ../rules/base.xml.in.h:538
+#: ../rules/base.xml.in.h:539
msgid "Hungarian (102/qwerty/dot/dead keys)"
msgstr "Magyar (102/qwerty/pont/halott billentyűk)"
-#: ../rules/base.xml.in.h:539
+#: ../rules/base.xml.in.h:540
msgid "Hungarian (102/qwerty/dot/eliminate dead keys)"
msgstr "Magyar (102/qwerty/pont/halott billentyűk tiltása)"
#. Keyboard indicator for Icelandic layouts
-#: ../rules/base.xml.in.h:541
+#: ../rules/base.xml.in.h:542
msgid "is"
msgstr "is"
-#: ../rules/base.xml.in.h:542
+#: ../rules/base.xml.in.h:543
msgid "Icelandic"
msgstr "Izlandi"
-#: ../rules/base.xml.in.h:543
+#: ../rules/base.xml.in.h:544
msgid "Icelandic (Sun dead keys)"
msgstr "Izlandi (Sun halott billentyűk)"
-#: ../rules/base.xml.in.h:544
+#: ../rules/base.xml.in.h:545
msgid "Icelandic (eliminate dead keys)"
msgstr "Izlandi (halott billentyűk tiltása)"
-#: ../rules/base.xml.in.h:545
+#: ../rules/base.xml.in.h:546
msgid "Icelandic (Macintosh)"
msgstr "Izlandi (Macintosh)"
-#: ../rules/base.xml.in.h:546
+#: ../rules/base.xml.in.h:547
msgid "Icelandic (Dvorak)"
msgstr "Izlandi (Dvorak)"
#. Keyboard indicator for Hebrew layouts
-#: ../rules/base.xml.in.h:548 ../rules/base.extras.xml.in.h:61
+#: ../rules/base.xml.in.h:549 ../rules/base.extras.xml.in.h:62
msgid "he"
msgstr "he"
-#: ../rules/base.xml.in.h:549 ../rules/base.extras.xml.in.h:62
+#: ../rules/base.xml.in.h:550 ../rules/base.extras.xml.in.h:63
msgid "Hebrew"
msgstr "Héber"
-#: ../rules/base.xml.in.h:550
+#: ../rules/base.xml.in.h:551
msgid "Hebrew (lyx)"
msgstr "Héber (lyx)"
-#: ../rules/base.xml.in.h:551
+#: ../rules/base.xml.in.h:552
msgid "Hebrew (phonetic)"
msgstr "Héber (fonetikus)"
-#: ../rules/base.xml.in.h:552
+#: ../rules/base.xml.in.h:553
msgid "Hebrew (Biblical, Tiro)"
msgstr "Héber (Bibliai, Tiro)"
#. Keyboard indicator for Italian layouts
-#: ../rules/base.xml.in.h:554 ../rules/base.extras.xml.in.h:93
+#: ../rules/base.xml.in.h:555 ../rules/base.extras.xml.in.h:94
msgid "it"
msgstr "it"
-#: ../rules/base.xml.in.h:555 ../rules/base.extras.xml.in.h:94
+#: ../rules/base.xml.in.h:556 ../rules/base.extras.xml.in.h:95
msgid "Italian"
msgstr "Olasz"
-#: ../rules/base.xml.in.h:556
+#: ../rules/base.xml.in.h:557
msgid "Italian (eliminate dead keys)"
msgstr "Olasz (halott billentyűk tiltása)"
-#: ../rules/base.xml.in.h:557
+#: ../rules/base.xml.in.h:558
msgid "Italian (Macintosh)"
msgstr "Olasz (Macintosh)"
-#: ../rules/base.xml.in.h:558
+#: ../rules/base.xml.in.h:559
msgid "Italian (US keyboard with Italian letters)"
msgstr "Olasz (US billentyűzet olasz betűkkel)"
-#: ../rules/base.xml.in.h:559
+#: ../rules/base.xml.in.h:560
msgid "Georgian (Italy)"
msgstr "Grúz (Olaszország)"
-#: ../rules/base.xml.in.h:560
+#: ../rules/base.xml.in.h:561
msgid "Italian (IBM 142)"
msgstr "Olasz (IBM 142)"
#. Keyboard indicator for Japanese layouts
-#: ../rules/base.xml.in.h:562 ../rules/base.extras.xml.in.h:96
+#: ../rules/base.xml.in.h:563 ../rules/base.extras.xml.in.h:97
msgid "ja"
msgstr "ja"
-#: ../rules/base.xml.in.h:563 ../rules/base.extras.xml.in.h:97
+#: ../rules/base.xml.in.h:564 ../rules/base.extras.xml.in.h:98
msgid "Japanese"
msgstr "Japán"
-#: ../rules/base.xml.in.h:564
+#: ../rules/base.xml.in.h:565
msgid "Japanese (Kana)"
msgstr "Japán (Kana)"
-#: ../rules/base.xml.in.h:565
+#: ../rules/base.xml.in.h:566
msgid "Japanese (Kana 86)"
msgstr "Japán (Kana 86)"
-#: ../rules/base.xml.in.h:566
+#: ../rules/base.xml.in.h:567
msgid "Japanese (OADG 109A)"
msgstr "Japán (OADG 109A)"
-#: ../rules/base.xml.in.h:567
+#: ../rules/base.xml.in.h:568
msgid "Japanese (Macintosh)"
msgstr "Japán (Macintosh)"
-#: ../rules/base.xml.in.h:568
+#: ../rules/base.xml.in.h:569
msgid "Japanese (Dvorak)"
msgstr "Japán (Dvorak)"
#. Keyboard indicator for Kikuyu layouts
-#: ../rules/base.xml.in.h:570
+#: ../rules/base.xml.in.h:571
msgid "ki"
msgstr "ki"
-#: ../rules/base.xml.in.h:571
+#: ../rules/base.xml.in.h:572
msgid "Kyrgyz"
msgstr "Kirgiz"
-#: ../rules/base.xml.in.h:572
+#: ../rules/base.xml.in.h:573
msgid "Kyrgyz (phonetic)"
msgstr "Kirgiz (fonetikus)"
#. Keyboard indicator for Khmer layouts
-#: ../rules/base.xml.in.h:574
+#: ../rules/base.xml.in.h:575
msgid "km"
msgstr "km"
-#: ../rules/base.xml.in.h:575
+#: ../rules/base.xml.in.h:576
msgid "Khmer (Cambodia)"
msgstr "Khmer (Kambodzsa)"
#. Keyboard indicator for Kazakh layouts
-#: ../rules/base.xml.in.h:577
+#: ../rules/base.xml.in.h:578
msgid "kk"
msgstr "kk"
-#: ../rules/base.xml.in.h:578
+#: ../rules/base.xml.in.h:579
msgid "Kazakh"
msgstr "Kazah"
-#: ../rules/base.xml.in.h:579
+#: ../rules/base.xml.in.h:580
msgid "Russian (Kazakhstan, with Kazakh)"
msgstr "Orosz (Kazahsztán, kazahhal)"
-#: ../rules/base.xml.in.h:580
+#: ../rules/base.xml.in.h:581
msgid "Kazakh (with Russian)"
msgstr "Kazah (orosszal)"
#. Keyboard indicator for Lao layouts
-#: ../rules/base.xml.in.h:582
+#: ../rules/base.xml.in.h:583
msgid "lo"
msgstr "lo"
-#: ../rules/base.xml.in.h:583
+#: ../rules/base.xml.in.h:584
msgid "Lao"
msgstr "Lao"
-#: ../rules/base.xml.in.h:584
+#: ../rules/base.xml.in.h:585
msgid "Lao (STEA proposed standard layout)"
msgstr "Lao (STEA által javasolt szabványos)"
#. Keyboard indicator for Spanish layouts
-#: ../rules/base.xml.in.h:586 ../rules/base.extras.xml.in.h:109
+#: ../rules/base.xml.in.h:587 ../rules/base.extras.xml.in.h:110
msgid "es"
msgstr "es"
-#: ../rules/base.xml.in.h:587
+#: ../rules/base.xml.in.h:588
msgid "Spanish (Latin American)"
msgstr "Spanyol (latin-amerikai)"
-#: ../rules/base.xml.in.h:588
+#: ../rules/base.xml.in.h:589
msgid "Spanish (Latin American, eliminate dead keys)"
msgstr "Spanyol (latin-amerikai, halott billentyűk tiltása)"
-#: ../rules/base.xml.in.h:589
+#: ../rules/base.xml.in.h:590
msgid "Spanish (Latin American, include dead tilde)"
msgstr "Spanyol (latin-amerikai, halott tildevel)"
-#: ../rules/base.xml.in.h:590
+#: ../rules/base.xml.in.h:591
msgid "Spanish (Latin American, Sun dead keys)"
msgstr "Spanyol (latin-amerikai, Sun halott billentyűk)"
#. Keyboard indicator for Lithuanian layouts
-#: ../rules/base.xml.in.h:592 ../rules/base.extras.xml.in.h:18
+#: ../rules/base.xml.in.h:593 ../rules/base.extras.xml.in.h:18
msgid "lt"
msgstr "lt"
-#: ../rules/base.xml.in.h:593 ../rules/base.extras.xml.in.h:19
+#: ../rules/base.xml.in.h:594 ../rules/base.extras.xml.in.h:19
msgid "Lithuanian"
msgstr "Litván"
-#: ../rules/base.xml.in.h:594
+#: ../rules/base.xml.in.h:595
msgid "Lithuanian (standard)"
msgstr "Litván (szabványos)"
-#: ../rules/base.xml.in.h:595
+#: ../rules/base.xml.in.h:596
msgid "Lithuanian (US keyboard with Lithuanian letters)"
msgstr "Litván (US billentyűzet litván betűkkel)"
-#: ../rules/base.xml.in.h:596
+#: ../rules/base.xml.in.h:597
msgid "Lithuanian (IBM LST 1205-92)"
msgstr "Litván (IBM LST 1205-92)"
-#: ../rules/base.xml.in.h:597
+#: ../rules/base.xml.in.h:598
msgid "Lithuanian (LEKP)"
msgstr "Litván (LEKP)"
-#: ../rules/base.xml.in.h:598
+#: ../rules/base.xml.in.h:599
msgid "Lithuanian (LEKPa)"
msgstr "Litván (LEKPa)"
#. Keyboard indicator for Latvian layouts
-#: ../rules/base.xml.in.h:600 ../rules/base.extras.xml.in.h:22
+#: ../rules/base.xml.in.h:601 ../rules/base.extras.xml.in.h:22
msgid "lv"
msgstr "lv"
-#: ../rules/base.xml.in.h:601 ../rules/base.extras.xml.in.h:23
+#: ../rules/base.xml.in.h:602 ../rules/base.extras.xml.in.h:23
msgid "Latvian"
msgstr "Lett"
-#: ../rules/base.xml.in.h:602
+#: ../rules/base.xml.in.h:603
msgid "Latvian (apostrophe variant)"
msgstr "Lett (aposztróf változat)"
-#: ../rules/base.xml.in.h:603
+#: ../rules/base.xml.in.h:604
msgid "Latvian (tilde variant)"
msgstr "Lett (tilde változat)"
-#: ../rules/base.xml.in.h:604
+#: ../rules/base.xml.in.h:605
msgid "Latvian (F variant)"
msgstr "Lett (F-változat)"
-#: ../rules/base.xml.in.h:605
+#: ../rules/base.xml.in.h:606
msgid "Latvian (modern)"
msgstr "Lett (modern)"
-#: ../rules/base.xml.in.h:606
+#: ../rules/base.xml.in.h:607
msgid "Latvian (ergonomic, ŪGJRMV)"
msgstr "Lett (ergonomikus, ŪGJRMV)"
-#: ../rules/base.xml.in.h:607
+#: ../rules/base.xml.in.h:608
msgid "Latvian (adapted)"
msgstr "Lett (adaptált)"
#. Keyboard indicator for Maori layouts
-#: ../rules/base.xml.in.h:609
+#: ../rules/base.xml.in.h:610
msgid "mi"
msgstr "mi"
-#: ../rules/base.xml.in.h:610
+#: ../rules/base.xml.in.h:611
msgid "Maori"
msgstr "Maori"
#. Keyboard indicator for Serbian layouts
-#: ../rules/base.xml.in.h:612 ../rules/base.extras.xml.in.h:51
+#: ../rules/base.xml.in.h:613 ../rules/base.extras.xml.in.h:52
msgid "sr"
msgstr "sr"
-#: ../rules/base.xml.in.h:613
+#: ../rules/base.xml.in.h:614
msgid "Montenegrin"
msgstr "Montenegrói"
-#: ../rules/base.xml.in.h:614
+#: ../rules/base.xml.in.h:615
msgid "Montenegrin (Cyrillic)"
msgstr "Montenegrói (Cirill)"
-#: ../rules/base.xml.in.h:615
+#: ../rules/base.xml.in.h:616
msgid "Montenegrin (Cyrillic, Z and ZHE swapped)"
msgstr "Montenegrói (Cirill, a Z és a ZHE felcserélve)"
-#: ../rules/base.xml.in.h:616
+#: ../rules/base.xml.in.h:617
msgid "Montenegrin (Latin Unicode)"
msgstr "Montenegrói (Latin Unicode)"
-#: ../rules/base.xml.in.h:617
+#: ../rules/base.xml.in.h:618
msgid "Montenegrin (Latin qwerty)"
msgstr "Montenegrói (Latin qwerty)"
-#: ../rules/base.xml.in.h:618
+#: ../rules/base.xml.in.h:619
msgid "Montenegrin (Latin Unicode qwerty)"
msgstr "Montenegrói (Latin Unicode qwerty)"
-#: ../rules/base.xml.in.h:619
+#: ../rules/base.xml.in.h:620
msgid "Montenegrin (Cyrillic with guillemets)"
msgstr "Montenegrói (Cirill, »csúcsos« idézőjelekkel)"
-#: ../rules/base.xml.in.h:620
+#: ../rules/base.xml.in.h:621
msgid "Montenegrin (Latin with guillemets)"
msgstr "Montenegrói (Latin, »csúcsos« idézőjelekkel)"
#. Keyboard indicator for Macedonian layouts
-#: ../rules/base.xml.in.h:622
+#: ../rules/base.xml.in.h:623
msgid "mk"
msgstr "mk"
-#: ../rules/base.xml.in.h:623
+#: ../rules/base.xml.in.h:624
msgid "Macedonian"
msgstr "Macedón"
-#: ../rules/base.xml.in.h:624
+#: ../rules/base.xml.in.h:625
msgid "Macedonian (eliminate dead keys)"
msgstr "Macedón (halott billentyűk tiltása)"
#. Keyboard indicator for Maltese layouts
-#: ../rules/base.xml.in.h:626
+#: ../rules/base.xml.in.h:627
msgid "mt"
msgstr "mt"
-#: ../rules/base.xml.in.h:627
+#: ../rules/base.xml.in.h:628
msgid "Maltese"
msgstr "Máltai"
-#: ../rules/base.xml.in.h:628
+#: ../rules/base.xml.in.h:629
msgid "Maltese (with US layout)"
msgstr "Máltai (US kiosztással)"
#. Keyboard indicator for Mongolian layouts
-#: ../rules/base.xml.in.h:630
+#: ../rules/base.xml.in.h:631
msgid "mn"
msgstr "mn"
-#: ../rules/base.xml.in.h:631
+#: ../rules/base.xml.in.h:632
msgid "Mongolian"
msgstr "Mongol"
#. Keyboard indicator for Norwegian layouts
-#: ../rules/base.xml.in.h:633 ../rules/base.extras.xml.in.h:101
+#: ../rules/base.xml.in.h:634 ../rules/base.extras.xml.in.h:102
msgid "no"
msgstr "no"
-#: ../rules/base.xml.in.h:634 ../rules/base.extras.xml.in.h:102
+#: ../rules/base.xml.in.h:635 ../rules/base.extras.xml.in.h:103
msgid "Norwegian"
msgstr "Norvég"
-#: ../rules/base.xml.in.h:635
+#: ../rules/base.xml.in.h:636
msgid "Norwegian (eliminate dead keys)"
msgstr "Norvég (halott billentyűk tiltása)"
-#: ../rules/base.xml.in.h:636
+#: ../rules/base.xml.in.h:637
msgid "Norwegian (Dvorak)"
msgstr "Norvég (Dvorak)"
-#: ../rules/base.xml.in.h:637
+#: ../rules/base.xml.in.h:638
msgid "Northern Saami (Norway)"
msgstr "Északi szami (Norvégia)"
-#: ../rules/base.xml.in.h:638
+#: ../rules/base.xml.in.h:639
msgid "Northern Saami (Norway, eliminate dead keys)"
msgstr "Északi szami (Norvégia, halott billentyűk tiltása)"
-#: ../rules/base.xml.in.h:639
+#: ../rules/base.xml.in.h:640
msgid "Norwegian (Macintosh)"
msgstr "Norvég (Macintosh)"
-#: ../rules/base.xml.in.h:640
+#: ../rules/base.xml.in.h:641
msgid "Norwegian (Macintosh, eliminate dead keys)"
msgstr "Norvég (Macintosh, halott billentyűk tiltása)"
-#: ../rules/base.xml.in.h:641
+#: ../rules/base.xml.in.h:642
msgid "Norwegian (Colemak)"
msgstr "Norvég (Colemak)"
#. Keyboard indicator for Polish layouts
-#: ../rules/base.xml.in.h:643 ../rules/base.extras.xml.in.h:40
+#: ../rules/base.xml.in.h:644 ../rules/base.extras.xml.in.h:41
msgid "pl"
msgstr "pl"
-#: ../rules/base.xml.in.h:644 ../rules/base.extras.xml.in.h:41
+#: ../rules/base.xml.in.h:645 ../rules/base.extras.xml.in.h:42
msgid "Polish"
msgstr "Lengyel"
-#: ../rules/base.xml.in.h:645
+#: ../rules/base.xml.in.h:646
msgid "Polish (legacy)"
msgstr "Lengyel (hagyományos)"
-#: ../rules/base.xml.in.h:646
+#: ../rules/base.xml.in.h:647
msgid "Polish (qwertz)"
msgstr "Lengyel (qwertz)"
-#: ../rules/base.xml.in.h:647
+#: ../rules/base.xml.in.h:648
msgid "Polish (Dvorak)"
msgstr "Lengyel (Dvorak)"
-#: ../rules/base.xml.in.h:648
+#: ../rules/base.xml.in.h:649
msgid "Polish (Dvorak, Polish quotes on quotemark key)"
msgstr "Lengyel (Dvorak, lengyel idézőjelek az idézőjel billentyűn)"
-#: ../rules/base.xml.in.h:649
+#: ../rules/base.xml.in.h:650
msgid "Polish (Dvorak, Polish quotes on key 1)"
msgstr "Lengyel (Dvorak, lengyel idézőjelek az 1 billentyűn)"
-#: ../rules/base.xml.in.h:650
+#: ../rules/base.xml.in.h:651
msgid "Kashubian"
msgstr "Kasub"
-#: ../rules/base.xml.in.h:651
+#: ../rules/base.xml.in.h:652
msgid "Russian (Poland, phonetic Dvorak)"
msgstr "Orosz (Lengyelország, fonetikus Dvorak)"
-#: ../rules/base.xml.in.h:652
+#: ../rules/base.xml.in.h:653
msgid "Polish (programmer Dvorak)"
msgstr "Lengyel (programozói Dvorak)"
-#: ../rules/base.xml.in.h:653 ../rules/base.extras.xml.in.h:104
+#: ../rules/base.xml.in.h:654 ../rules/base.extras.xml.in.h:105
msgid "Portuguese"
msgstr "Portugál"
-#: ../rules/base.xml.in.h:654
+#: ../rules/base.xml.in.h:655
msgid "Portuguese (eliminate dead keys)"
msgstr "Portugál (halott billentyűk tiltása)"
-#: ../rules/base.xml.in.h:655
+#: ../rules/base.xml.in.h:656
msgid "Portuguese (Sun dead keys)"
msgstr "Portugál (Sun halott billentyűk)"
-#: ../rules/base.xml.in.h:656
+#: ../rules/base.xml.in.h:657
msgid "Portuguese (Macintosh)"
msgstr "Portugál (Macintosh)"
-#: ../rules/base.xml.in.h:657
+#: ../rules/base.xml.in.h:658
msgid "Portuguese (Macintosh, eliminate dead keys)"
msgstr "Portugál (Macintosh, halott billentyűk tiltása)"
-#: ../rules/base.xml.in.h:658
+#: ../rules/base.xml.in.h:659
msgid "Portuguese (Macintosh, Sun dead keys)"
msgstr "Portugál (Macintosh, Sun halott billentyűk)"
-#: ../rules/base.xml.in.h:659
+#: ../rules/base.xml.in.h:660
msgid "Portuguese (Nativo)"
msgstr "Portugál (natív)"
-#: ../rules/base.xml.in.h:660
+#: ../rules/base.xml.in.h:661
msgid "Portuguese (Nativo for US keyboards)"
msgstr "Portugál (Natív az USA billentyűzetekhez)"
-#: ../rules/base.xml.in.h:661
+#: ../rules/base.xml.in.h:662
msgid "Esperanto (Portugal, Nativo)"
msgstr "Eszperantó (Portugália, Nativo)"
#. Keyboard indicator for Romanian layouts
-#: ../rules/base.xml.in.h:663 ../rules/base.extras.xml.in.h:45
+#: ../rules/base.xml.in.h:664 ../rules/base.extras.xml.in.h:46
msgid "ro"
msgstr "ro"
-#: ../rules/base.xml.in.h:664 ../rules/base.extras.xml.in.h:46
+#: ../rules/base.xml.in.h:665 ../rules/base.extras.xml.in.h:47
msgid "Romanian"
msgstr "Román"
-#: ../rules/base.xml.in.h:665
+#: ../rules/base.xml.in.h:666
msgid "Romanian (cedilla)"
msgstr "Román (cédille)"
-#: ../rules/base.xml.in.h:666
+#: ../rules/base.xml.in.h:667
msgid "Romanian (standard)"
msgstr "Román (szabványos)"
-#: ../rules/base.xml.in.h:667
+#: ../rules/base.xml.in.h:668
msgid "Romanian (standard cedilla)"
msgstr "Román (szabványos cédille)"
-#: ../rules/base.xml.in.h:668
+#: ../rules/base.xml.in.h:669
msgid "Romanian (WinKeys)"
msgstr "Román (Win billentyűk)"
-#: ../rules/base.xml.in.h:669 ../rules/base.extras.xml.in.h:55
+#: ../rules/base.xml.in.h:670 ../rules/base.extras.xml.in.h:56
msgid "Russian"
msgstr "Orosz"
-#: ../rules/base.xml.in.h:670
+#: ../rules/base.xml.in.h:671
msgid "Russian (phonetic)"
msgstr "Orosz (fonetikus)"
-#: ../rules/base.xml.in.h:671
+#: ../rules/base.xml.in.h:672
msgid "Russian (phonetic WinKeys)"
msgstr "Orosz (fonetikus, Win billentyűk)"
-#: ../rules/base.xml.in.h:672
+#: ../rules/base.xml.in.h:673
msgid "Russian (typewriter)"
msgstr "Orosz (írógép)"
-#: ../rules/base.xml.in.h:673
+#: ../rules/base.xml.in.h:674
msgid "Russian (legacy)"
msgstr "Orosz (hagyományos)"
-#: ../rules/base.xml.in.h:674
+#: ../rules/base.xml.in.h:675
msgid "Russian (typewriter, legacy)"
msgstr "Orosz (írógép, hagyományos)"
-#: ../rules/base.xml.in.h:675
+#: ../rules/base.xml.in.h:676
msgid "Tatar"
msgstr "Tatár"
-#: ../rules/base.xml.in.h:676
+#: ../rules/base.xml.in.h:677
msgid "Ossetian (legacy)"
msgstr "Oszét (hagyományos)"
-#: ../rules/base.xml.in.h:677
+#: ../rules/base.xml.in.h:678
msgid "Ossetian (WinKeys)"
msgstr "Oszét (Win billentyűk)"
-#: ../rules/base.xml.in.h:678
+#: ../rules/base.xml.in.h:679
msgid "Chuvash"
msgstr "Csuvas"
-#: ../rules/base.xml.in.h:679
+#: ../rules/base.xml.in.h:680
msgid "Chuvash (Latin)"
msgstr "Csuvas (latin)"
-#: ../rules/base.xml.in.h:680
+#: ../rules/base.xml.in.h:681
msgid "Udmurt"
msgstr "Udmurt"
-#: ../rules/base.xml.in.h:681
+#: ../rules/base.xml.in.h:682
msgid "Komi"
msgstr "Komi"
-#: ../rules/base.xml.in.h:682
+#: ../rules/base.xml.in.h:683
msgid "Yakut"
msgstr "Jakut"
-#: ../rules/base.xml.in.h:683
+#: ../rules/base.xml.in.h:684
msgid "Kalmyk"
msgstr "Kalmük"
-#: ../rules/base.xml.in.h:684
+#: ../rules/base.xml.in.h:685
msgid "Russian (DOS)"
msgstr "Orosz (DOS)"
-#: ../rules/base.xml.in.h:685
+#: ../rules/base.xml.in.h:686
msgid "Russian (Macintosh)"
msgstr "Orosz (Macintosh)"
-#: ../rules/base.xml.in.h:686
+#: ../rules/base.xml.in.h:687
msgid "Serbian (Russia)"
msgstr "Szerb (Oroszország)"
-#: ../rules/base.xml.in.h:687
+#: ../rules/base.xml.in.h:688
msgid "Bashkirian"
msgstr "Baskír"
-#: ../rules/base.xml.in.h:688
+#: ../rules/base.xml.in.h:689
msgid "Mari"
msgstr "Mari"
-#: ../rules/base.xml.in.h:689 ../rules/base.extras.xml.in.h:52
+#: ../rules/base.xml.in.h:690 ../rules/base.extras.xml.in.h:53
msgid "Serbian"
msgstr "Szerb"
-#: ../rules/base.xml.in.h:690
+#: ../rules/base.xml.in.h:691
msgid "Serbian (Cyrillic, Z and ZHE swapped)"
msgstr "Szerb (cirill, a Z és a ZHE felcserélve)"
-#: ../rules/base.xml.in.h:691
+#: ../rules/base.xml.in.h:692
msgid "Serbian (Latin)"
msgstr "Szerb (latin)"
-#: ../rules/base.xml.in.h:692
+#: ../rules/base.xml.in.h:693
msgid "Serbian (Latin Unicode)"
msgstr "Szerb (latin Unicode)"
-#: ../rules/base.xml.in.h:693
+#: ../rules/base.xml.in.h:694
msgid "Serbian (Latin qwerty)"
msgstr "Szerb (latin qwerty)"
-#: ../rules/base.xml.in.h:694
+#: ../rules/base.xml.in.h:695
msgid "Serbian (Latin Unicode qwerty)"
msgstr "Szerb (latin Unicode qwerty)"
-#: ../rules/base.xml.in.h:695
+#: ../rules/base.xml.in.h:696
msgid "Serbian (Cyrillic with guillemets)"
msgstr "Szerb (cirill, »csúcsos« idézőjelekkel)"
-#: ../rules/base.xml.in.h:696
+#: ../rules/base.xml.in.h:697
msgid "Serbian (Latin with guillemets)"
msgstr "Szerb (latin, »csúcsos« idézőjelekkel)"
-#: ../rules/base.xml.in.h:697
-msgid "Pannonian Rusyn (homophonic)"
-msgstr "Pannon ruszin (homofon)"
+#: ../rules/base.xml.in.h:698
+msgid "Pannonian Rusyn"
+msgstr "Pannon ruszin"
#. Keyboard indicator for Slovenian layouts
-#: ../rules/base.xml.in.h:699
+#: ../rules/base.xml.in.h:700
msgid "sl"
msgstr "sl"
-#: ../rules/base.xml.in.h:700
+#: ../rules/base.xml.in.h:701
msgid "Slovenian"
msgstr "Szlovén"
-#: ../rules/base.xml.in.h:701
+#: ../rules/base.xml.in.h:702
msgid "Slovenian (use guillemets for quotes)"
msgstr "Szlovén (»Csúcsos« idézőjelek használata idézetekhez)"
-#: ../rules/base.xml.in.h:702
+#: ../rules/base.xml.in.h:703
msgid "Slovenian (US keyboard with Slovenian letters)"
msgstr "Szlovén (US billentyűzet szlovén betűkkel)"
#. Keyboard indicator for Slovak layouts
-#: ../rules/base.xml.in.h:704 ../rules/base.extras.xml.in.h:106
+#: ../rules/base.xml.in.h:705 ../rules/base.extras.xml.in.h:107
msgid "sk"
msgstr "sk"
-#: ../rules/base.xml.in.h:705 ../rules/base.extras.xml.in.h:107
+#: ../rules/base.xml.in.h:706 ../rules/base.extras.xml.in.h:108
msgid "Slovak"
msgstr "Szlovák"
-#: ../rules/base.xml.in.h:706
+#: ../rules/base.xml.in.h:707
msgid "Slovak (extended Backslash)"
msgstr "Szlovák (kibővített fordított törtvonal)"
-#: ../rules/base.xml.in.h:707
+#: ../rules/base.xml.in.h:708
msgid "Slovak (qwerty)"
msgstr "Szlovák (qwerty)"
-#: ../rules/base.xml.in.h:708
+#: ../rules/base.xml.in.h:709
msgid "Slovak (qwerty, extended Backslash)"
msgstr "Szlovák (qwerty, kibővített fordított törtvonal)"
-#: ../rules/base.xml.in.h:709 ../rules/base.extras.xml.in.h:110
+#: ../rules/base.xml.in.h:710 ../rules/base.extras.xml.in.h:111
msgid "Spanish"
msgstr "Spanyol"
-#: ../rules/base.xml.in.h:710
+#: ../rules/base.xml.in.h:711
msgid "Spanish (eliminate dead keys)"
msgstr "Spanyol (halott billentyűk tiltása)"
-#: ../rules/base.xml.in.h:711
+#: ../rules/base.xml.in.h:712
msgid "Spanish (include dead tilde)"
msgstr "Spanyol (halott tilde felvétele)"
-#: ../rules/base.xml.in.h:712
+#: ../rules/base.xml.in.h:713
msgid "Spanish (Sun dead keys)"
msgstr "Spanyol (Sun halott billentyűk)"
-#: ../rules/base.xml.in.h:713
+#: ../rules/base.xml.in.h:714
msgid "Spanish (Dvorak)"
msgstr "Spanyol (Dvorak)"
-#: ../rules/base.xml.in.h:714
+#: ../rules/base.xml.in.h:715
msgid "Asturian (Spain, with bottom-dot H and bottom-dot L)"
msgstr "Asztúri (Spanyolország, középső pontos H és alsó pontos L karakterrel)"
-#: ../rules/base.xml.in.h:715
+#: ../rules/base.xml.in.h:716
msgid "Catalan (Spain, with middle-dot L)"
msgstr "Katalán (Spanyolország, középső pontos L karakterrel)"
-#: ../rules/base.xml.in.h:716
+#: ../rules/base.xml.in.h:717
msgid "Spanish (Macintosh)"
msgstr "Spanyol (Macintosh)"
#. Keyboard indicator for Swedish layouts
-#: ../rules/base.xml.in.h:718 ../rules/base.extras.xml.in.h:112
+#: ../rules/base.xml.in.h:719 ../rules/base.extras.xml.in.h:113
msgid "sv"
msgstr "sv"
-#: ../rules/base.xml.in.h:719 ../rules/base.extras.xml.in.h:113
+#: ../rules/base.xml.in.h:720 ../rules/base.extras.xml.in.h:114
msgid "Swedish"
msgstr "Svéd"
-#: ../rules/base.xml.in.h:720
+#: ../rules/base.xml.in.h:721
msgid "Swedish (eliminate dead keys)"
msgstr "Svéd (halott billentyűk tiltása)"
-#: ../rules/base.xml.in.h:721
+#: ../rules/base.xml.in.h:722
msgid "Swedish (Dvorak)"
msgstr "Svéd (Dvorak)"
-#: ../rules/base.xml.in.h:722
+#: ../rules/base.xml.in.h:723
msgid "Russian (Sweden, phonetic)"
msgstr "Orosz (Svédország, fonetikus)"
-#: ../rules/base.xml.in.h:723
+#: ../rules/base.xml.in.h:724
msgid "Russian (Sweden, phonetic, eliminate dead keys)"
msgstr "Orosz (Svédország, fonetikus, halott billentyűk tiltása)"
-#: ../rules/base.xml.in.h:724
+#: ../rules/base.xml.in.h:725
msgid "Northern Saami (Sweden)"
msgstr "Északi szami (Svédország)"
-#: ../rules/base.xml.in.h:725
+#: ../rules/base.xml.in.h:726
msgid "Swedish (Macintosh)"
msgstr "Svéd (Macintosh)"
-#: ../rules/base.xml.in.h:726
+#: ../rules/base.xml.in.h:727
msgid "Swedish (Svdvorak)"
msgstr "Svéd (Svdvorak)"
-#: ../rules/base.xml.in.h:727
+#: ../rules/base.xml.in.h:728
msgid "Swedish Sign Language"
msgstr "Svéd jelnyelv"
-#: ../rules/base.xml.in.h:728 ../rules/base.extras.xml.in.h:115
+#: ../rules/base.xml.in.h:729 ../rules/base.extras.xml.in.h:116
msgid "German (Switzerland)"
msgstr "Német (Svájc)"
-#: ../rules/base.xml.in.h:729
+#: ../rules/base.xml.in.h:730
msgid "German (Switzerland, legacy)"
msgstr "Német (Svájc, hagyományos)"
-#: ../rules/base.xml.in.h:730
+#: ../rules/base.xml.in.h:731
msgid "German (Switzerland, eliminate dead keys)"
msgstr "Német (Svájc, halott billentyűk tiltása)"
-#: ../rules/base.xml.in.h:731
+#: ../rules/base.xml.in.h:732
msgid "German (Switzerland, Sun dead keys)"
msgstr "Német (Svájc, Sun halott billentyűk)"
-#: ../rules/base.xml.in.h:732
+#: ../rules/base.xml.in.h:733
msgid "French (Switzerland)"
msgstr "Francia (Svájc)"
-#: ../rules/base.xml.in.h:733
+#: ../rules/base.xml.in.h:734
msgid "French (Switzerland, eliminate dead keys)"
msgstr "Francia (Svájc, halott billentyűk tiltása)"
-#: ../rules/base.xml.in.h:734
+#: ../rules/base.xml.in.h:735
msgid "French (Switzerland, Sun dead keys)"
msgstr "Francia (Svájc, Sun halott billentyűk)"
-#: ../rules/base.xml.in.h:735
+#: ../rules/base.xml.in.h:736
msgid "French (Switzerland, Macintosh)"
msgstr "Francia (Svájc, Macintosh)"
-#: ../rules/base.xml.in.h:736
+#: ../rules/base.xml.in.h:737
msgid "German (Switzerland, Macintosh)"
msgstr "Német (Svájc, Macintosh)"
-#: ../rules/base.xml.in.h:737
+#: ../rules/base.xml.in.h:738
msgid "Arabic (Syria)"
msgstr "Arab (Szíria)"
#. Keyboard indicator for Syriac layouts
-#: ../rules/base.xml.in.h:739
+#: ../rules/base.xml.in.h:740
msgid "syc"
msgstr "syc"
-#: ../rules/base.xml.in.h:740
+#: ../rules/base.xml.in.h:741
msgid "Syriac"
msgstr "Szír"
-#: ../rules/base.xml.in.h:741
+#: ../rules/base.xml.in.h:742
msgid "Syriac (phonetic)"
msgstr "Szír (fonetikus)"
-#: ../rules/base.xml.in.h:742
+#: ../rules/base.xml.in.h:743
msgid "Kurdish (Syria, Latin Q)"
msgstr "Kurd (Szíria, latin Q)"
-#: ../rules/base.xml.in.h:743
+#: ../rules/base.xml.in.h:744
msgid "Kurdish (Syria, F)"
msgstr "Kurd (Szíria, F)"
-#: ../rules/base.xml.in.h:744
+#: ../rules/base.xml.in.h:745
msgid "Kurdish (Syria, Latin Alt-Q)"
msgstr "Kurd (Szíria, latin Alt-Q)"
#. Keyboard indicator for Tajik layouts
-#: ../rules/base.xml.in.h:746
+#: ../rules/base.xml.in.h:747
msgid "tg"
msgstr "tg"
-#: ../rules/base.xml.in.h:747
+#: ../rules/base.xml.in.h:748
msgid "Tajik"
msgstr "Tádzsik"
-#: ../rules/base.xml.in.h:748
+#: ../rules/base.xml.in.h:749
msgid "Tajik (legacy)"
msgstr "Tádzsik (hagyományos)"
#. Keyboard indicator for Sinhala layouts
-#: ../rules/base.xml.in.h:750
+#: ../rules/base.xml.in.h:751
msgid "si"
msgstr "si"
-#: ../rules/base.xml.in.h:751
+#: ../rules/base.xml.in.h:752
msgid "Sinhala (phonetic)"
msgstr "Szingaléz (fonetikus)"
-#: ../rules/base.xml.in.h:752
+#: ../rules/base.xml.in.h:753
msgid "Tamil (Sri Lanka, Unicode)"
msgstr "Tamil (Sri Lanka, Unicode)"
-#: ../rules/base.xml.in.h:753
+#: ../rules/base.xml.in.h:754
msgid "Tamil (Sri Lanka, TAB Typewriter)"
msgstr "Tamil (Sri Lanka, TAB írógép)"
#. Keyboard indicator for Thai layouts
-#: ../rules/base.xml.in.h:755
+#: ../rules/base.xml.in.h:756
msgid "th"
msgstr "th"
-#: ../rules/base.xml.in.h:756
+#: ../rules/base.xml.in.h:757
msgid "Thai"
msgstr "Thai"
-#: ../rules/base.xml.in.h:757
+#: ../rules/base.xml.in.h:758
msgid "Thai (TIS-820.2538)"
msgstr "Thai (TIS-820.2538)"
-#: ../rules/base.xml.in.h:758
+#: ../rules/base.xml.in.h:759
msgid "Thai (Pattachote)"
msgstr "Thai (Pattachote)"
#. Keyboard indicator for Turkish layouts
-#: ../rules/base.xml.in.h:760 ../rules/base.extras.xml.in.h:118
+#: ../rules/base.xml.in.h:761 ../rules/base.extras.xml.in.h:119
msgid "tr"
msgstr "tr"
-#: ../rules/base.xml.in.h:761 ../rules/base.extras.xml.in.h:119
+#: ../rules/base.xml.in.h:762 ../rules/base.extras.xml.in.h:120
msgid "Turkish"
msgstr "Török"
-#: ../rules/base.xml.in.h:762
+#: ../rules/base.xml.in.h:763
msgid "Turkish (F)"
msgstr "Török (F)"
-#: ../rules/base.xml.in.h:763
+#: ../rules/base.xml.in.h:764
msgid "Turkish (Alt-Q)"
msgstr "Török (Alt-Q)"
-#: ../rules/base.xml.in.h:764
+#: ../rules/base.xml.in.h:765
msgid "Turkish (Sun dead keys)"
msgstr "Török (Sun halott billentyűk)"
-#: ../rules/base.xml.in.h:765
+#: ../rules/base.xml.in.h:766
msgid "Kurdish (Turkey, Latin Q)"
msgstr "Kurd (Törökország, latin Q)"
-#: ../rules/base.xml.in.h:766
+#: ../rules/base.xml.in.h:767
msgid "Kurdish (Turkey, F)"
msgstr "Kurd (Törökország, F)"
-#: ../rules/base.xml.in.h:767
+#: ../rules/base.xml.in.h:768
msgid "Kurdish (Turkey, Latin Alt-Q)"
msgstr "Kurd (Törökország, latin Alt-Q)"
-#: ../rules/base.xml.in.h:768
+#: ../rules/base.xml.in.h:769
msgid "Turkish (international with dead keys)"
msgstr "Török (nemzetközi, halott billentyűkkel)"
#. Keyboard indicator for Crimean Tatar layouts
-#: ../rules/base.xml.in.h:770 ../rules/base.extras.xml.in.h:47
+#: ../rules/base.xml.in.h:771 ../rules/base.extras.xml.in.h:48
msgid "crh"
msgstr "crh"
-#: ../rules/base.xml.in.h:771
+#: ../rules/base.xml.in.h:772
msgid "Crimean Tatar (Turkish Q)"
msgstr "Krími tatár (török Q)"
-#: ../rules/base.xml.in.h:772
+#: ../rules/base.xml.in.h:773
msgid "Crimean Tatar (Turkish F)"
msgstr "Krími tatár (török F)"
-#: ../rules/base.xml.in.h:773
+#: ../rules/base.xml.in.h:774
msgid "Crimean Tatar (Turkish Alt-Q)"
msgstr "Krími tatár (török Alt-Q)"
-#: ../rules/base.xml.in.h:774
+#: ../rules/base.xml.in.h:775
msgid "Taiwanese"
msgstr "Tajvani"
-#: ../rules/base.xml.in.h:775
+#: ../rules/base.xml.in.h:776
msgid "Taiwanese (indigenous)"
msgstr "Tajvani (őslakos)"
#. Keyboard indicator for Saisiyat layouts
-#: ../rules/base.xml.in.h:777
+#: ../rules/base.xml.in.h:778
msgid "xsy"
msgstr "xsy"
-#: ../rules/base.xml.in.h:778
+#: ../rules/base.xml.in.h:779
msgid "Saisiyat (Taiwan)"
msgstr "Saisiyat (Tajvan)"
#. Keyboard indicator for Ukranian layouts
-#: ../rules/base.xml.in.h:780 ../rules/base.extras.xml.in.h:121
+#: ../rules/base.xml.in.h:781 ../rules/base.extras.xml.in.h:122
msgid "uk"
msgstr "uk"
-#: ../rules/base.xml.in.h:781 ../rules/base.extras.xml.in.h:122
+#: ../rules/base.xml.in.h:782 ../rules/base.extras.xml.in.h:123
msgid "Ukrainian"
msgstr "Ukrán"
-#: ../rules/base.xml.in.h:782
+#: ../rules/base.xml.in.h:783
msgid "Ukrainian (phonetic)"
msgstr "Ukrán (fonetikus)"
-#: ../rules/base.xml.in.h:783
+#: ../rules/base.xml.in.h:784
msgid "Ukrainian (typewriter)"
msgstr "Ukrán (írógép)"
-#: ../rules/base.xml.in.h:784
+#: ../rules/base.xml.in.h:785
msgid "Ukrainian (WinKeys)"
msgstr "Ukrán (Win billentyűk)"
-#: ../rules/base.xml.in.h:785
+#: ../rules/base.xml.in.h:786
msgid "Ukrainian (legacy)"
msgstr "Ukrán (hagyományos)"
-#: ../rules/base.xml.in.h:786
+#: ../rules/base.xml.in.h:787
msgid "Ukrainian (standard RSTU)"
msgstr "Ukrán (szabványos RSTU)"
-#: ../rules/base.xml.in.h:787
+#: ../rules/base.xml.in.h:788
msgid "Russian (Ukraine, standard RSTU)"
msgstr "Orosz (Ukrajna, szabványos RSTU)"
-#: ../rules/base.xml.in.h:788
+#: ../rules/base.xml.in.h:789
msgid "Ukrainian (homophonic)"
msgstr "Ukrán (homofon)"
-#: ../rules/base.xml.in.h:789 ../rules/base.extras.xml.in.h:124
+#: ../rules/base.xml.in.h:790 ../rules/base.extras.xml.in.h:125
msgid "English (UK)"
msgstr "Angol (UK)"
-#: ../rules/base.xml.in.h:790
+#: ../rules/base.xml.in.h:791
msgid "English (UK, extended WinKeys)"
msgstr "Angol (UK, kibővített Win billentyűk)"
-#: ../rules/base.xml.in.h:791
+#: ../rules/base.xml.in.h:792
msgid "English (UK, international with dead keys)"
msgstr "Angol (UK, nemzetközi, halott billentyűkkel)"
-#: ../rules/base.xml.in.h:792
+#: ../rules/base.xml.in.h:793
msgid "English (UK, Dvorak)"
msgstr "Angol (USA, Dvorak)"
-#: ../rules/base.xml.in.h:793
+#: ../rules/base.xml.in.h:794
msgid "English (UK, Dvorak with UK punctuation)"
msgstr "Angol (UK, Dvorak UK központozással)"
-#: ../rules/base.xml.in.h:794
+#: ../rules/base.xml.in.h:795
msgid "English (UK, Macintosh)"
msgstr "Angol (UK, Macintosh)"
-#: ../rules/base.xml.in.h:795
+#: ../rules/base.xml.in.h:796
msgid "English (UK, Macintosh international)"
msgstr "Angol (UK, Macintosh nemzetközi)"
-#: ../rules/base.xml.in.h:796
+#: ../rules/base.xml.in.h:797
msgid "English (UK, Colemak)"
msgstr "Angol (UK, Colemak)"
-#: ../rules/base.xml.in.h:797
+#: ../rules/base.xml.in.h:798
msgid "Uzbek"
msgstr "Üzbég"
-#: ../rules/base.xml.in.h:798
+#: ../rules/base.xml.in.h:799
msgid "Uzbek (Latin)"
msgstr "Üzbég (latin)"
#. Keyboard indicator for Vietnamese layouts
-#: ../rules/base.xml.in.h:800
+#: ../rules/base.xml.in.h:801
msgid "vi"
msgstr "vi"
-#: ../rules/base.xml.in.h:801
+#: ../rules/base.xml.in.h:802
msgid "Vietnamese"
msgstr "Vietnami"
#. Keyboard indicator for Korean layouts
-#: ../rules/base.xml.in.h:803 ../rules/base.extras.xml.in.h:126
+#: ../rules/base.xml.in.h:804 ../rules/base.extras.xml.in.h:127
msgid "ko"
msgstr "ko"
-#: ../rules/base.xml.in.h:804 ../rules/base.extras.xml.in.h:127
+#: ../rules/base.xml.in.h:805 ../rules/base.extras.xml.in.h:128
msgid "Korean"
msgstr "Koreai"
-#: ../rules/base.xml.in.h:805
+#: ../rules/base.xml.in.h:806
msgid "Korean (101/104 key compatible)"
msgstr "Koreai (101/104 gomb kompatibilis)"
-#: ../rules/base.xml.in.h:806
+#: ../rules/base.xml.in.h:807
msgid "Japanese (PC-98xx Series)"
msgstr "Japán (PC-98xx sorozat)"
#. Keyboard indicator for Irish layouts
-#: ../rules/base.xml.in.h:808
+#: ../rules/base.xml.in.h:809
msgid "ie"
msgstr "ie"
-#: ../rules/base.xml.in.h:809
+#: ../rules/base.xml.in.h:810
msgid "Irish"
msgstr "Ír"
-#: ../rules/base.xml.in.h:810
+#: ../rules/base.xml.in.h:811
msgid "CloGaelach"
msgstr "CloGaelach"
-#: ../rules/base.xml.in.h:811
+#: ../rules/base.xml.in.h:812
msgid "Irish (UnicodeExpert)"
msgstr "Ír (UnicodeExpert)"
-#: ../rules/base.xml.in.h:812
+#: ../rules/base.xml.in.h:813
msgid "Ogham"
msgstr "Ogham"
-#: ../rules/base.xml.in.h:813
+#: ../rules/base.xml.in.h:814
msgid "Ogham (IS434)"
msgstr "Ogham (IS434)"
-#: ../rules/base.xml.in.h:814
+#: ../rules/base.xml.in.h:815
msgid "Urdu (Pakistan)"
msgstr "Urdu (Pakisztán)"
-#: ../rules/base.xml.in.h:815
+#: ../rules/base.xml.in.h:816
msgid "Urdu (Pakistan, CRULP)"
msgstr "Urdu (Pakisztán, CRULP)"
-#: ../rules/base.xml.in.h:816
+#: ../rules/base.xml.in.h:817
msgid "Urdu (Pakistan, NLA)"
msgstr "Urdu (Pakisztán, NLA)"
-#: ../rules/base.xml.in.h:817
+#: ../rules/base.xml.in.h:818
msgid "Arabic (Pakistan)"
msgstr "Arab (Pakisztán)"
#. Keyboard indicator for Sindhi layouts
-#: ../rules/base.xml.in.h:819
+#: ../rules/base.xml.in.h:820
msgid "sd"
msgstr "sd"
-#: ../rules/base.xml.in.h:820
+#: ../rules/base.xml.in.h:821
msgid "Sindhi"
msgstr "Szindhi"
#. Keyboard indicator for Dhivehi layouts
-#: ../rules/base.xml.in.h:822
+#: ../rules/base.xml.in.h:823
msgid "dv"
msgstr "dv"
-#: ../rules/base.xml.in.h:823
+#: ../rules/base.xml.in.h:824
msgid "Dhivehi"
msgstr "Dhivehi"
-#: ../rules/base.xml.in.h:824
+#: ../rules/base.xml.in.h:825
msgid "English (South Africa)"
msgstr "Angol (Dél-Afrika)"
#. Keyboard indicator for Esperanto layouts
-#: ../rules/base.xml.in.h:826
+#: ../rules/base.xml.in.h:827
msgid "eo"
msgstr "eo"
-#: ../rules/base.xml.in.h:827
+#: ../rules/base.xml.in.h:828
msgid "Esperanto"
msgstr "Eszperantó"
-#: ../rules/base.xml.in.h:828
+#: ../rules/base.xml.in.h:829
msgid "Esperanto (displaced semicolon and quote, obsolete)"
msgstr "Eszperantó (elcsúszott pontosvessző és idézőjel, elavult)"
#. Keyboard indicator for Nepali layouts
-#: ../rules/base.xml.in.h:830
+#: ../rules/base.xml.in.h:831
msgid "ne"
msgstr "ne"
-#: ../rules/base.xml.in.h:831
+#: ../rules/base.xml.in.h:832
msgid "Nepali"
msgstr "Nepáli"
-#: ../rules/base.xml.in.h:832
+#: ../rules/base.xml.in.h:833
msgid "English (Nigeria)"
msgstr "Angol (Nigéria)"
#. Keyboard indicator for Igbo layouts
-#: ../rules/base.xml.in.h:834
+#: ../rules/base.xml.in.h:835
msgid "ig"
msgstr "ig"
-#: ../rules/base.xml.in.h:835
+#: ../rules/base.xml.in.h:836
msgid "Igbo"
msgstr "Igbo"
#. Keyboard indicator for Yoruba layouts
-#: ../rules/base.xml.in.h:837
+#: ../rules/base.xml.in.h:838
msgid "yo"
msgstr "yo"
-#: ../rules/base.xml.in.h:838
+#: ../rules/base.xml.in.h:839
msgid "Yoruba"
msgstr "Joruba"
#. Keyboard indicator for Amharic layouts
-#: ../rules/base.xml.in.h:840
+#: ../rules/base.xml.in.h:841
msgid "am"
msgstr "am"
-#: ../rules/base.xml.in.h:841
+#: ../rules/base.xml.in.h:842
msgid "Amharic"
msgstr "Amhara"
#. Keyboard indicator for Wolof layouts
-#: ../rules/base.xml.in.h:843
+#: ../rules/base.xml.in.h:844
msgid "wo"
msgstr "wo"
-#: ../rules/base.xml.in.h:844
+#: ../rules/base.xml.in.h:845
msgid "Wolof"
msgstr "Wolof"
#. Keyboard indicator for Braille layouts
-#: ../rules/base.xml.in.h:846
+#: ../rules/base.xml.in.h:847
msgid "brl"
msgstr "brl"
-#: ../rules/base.xml.in.h:847
+#: ../rules/base.xml.in.h:848
msgid "Braille"
msgstr "Braille"
-#: ../rules/base.xml.in.h:848
+#: ../rules/base.xml.in.h:849
msgid "Braille (left hand)"
msgstr "Braille (balkezes)"
-#: ../rules/base.xml.in.h:849
+#: ../rules/base.xml.in.h:850
msgid "Braille (right hand)"
msgstr "Braille (jobbkezes)"
#. Keyboard indicator for Turkmen layouts
-#: ../rules/base.xml.in.h:851
+#: ../rules/base.xml.in.h:852
msgid "tk"
msgstr "tk"
-#: ../rules/base.xml.in.h:852
+#: ../rules/base.xml.in.h:853
msgid "Turkmen"
msgstr "Türkmén"
-#: ../rules/base.xml.in.h:853
+#: ../rules/base.xml.in.h:854
msgid "Turkmen (Alt-Q)"
msgstr "Türkmén (Alt-Q)"
#. Keyboard indicator for Bambara layouts
-#: ../rules/base.xml.in.h:855
+#: ../rules/base.xml.in.h:856
msgid "bm"
msgstr "bm"
-#: ../rules/base.xml.in.h:856
+#: ../rules/base.xml.in.h:857
msgid "Bambara"
msgstr "Bambara"
-#: ../rules/base.xml.in.h:857
+#: ../rules/base.xml.in.h:858
msgid "French (Mali, alternative)"
msgstr "Francia (Mali, alternatív)"
-#: ../rules/base.xml.in.h:858
+#: ../rules/base.xml.in.h:859
msgid "English (Mali, US Macintosh)"
msgstr "Angol (Mali, USA Macintosh)"
-#: ../rules/base.xml.in.h:859
+#: ../rules/base.xml.in.h:860
msgid "English (Mali, US international)"
msgstr "Angol (Mali, USA nemzetközi)"
#. Keyboard indicator for Swahili layouts
-#: ../rules/base.xml.in.h:861
+#: ../rules/base.xml.in.h:862
msgid "sw"
msgstr "sw"
-#: ../rules/base.xml.in.h:862
+#: ../rules/base.xml.in.h:863
msgid "Swahili (Tanzania)"
msgstr "Szuahéli (Tanzánia)"
-#: ../rules/base.xml.in.h:863
+#: ../rules/base.xml.in.h:864
msgid "Swahili (Kenya)"
msgstr "Szuahéli (Kenya)"
-#: ../rules/base.xml.in.h:864
+#: ../rules/base.xml.in.h:865
msgid "Kikuyu"
msgstr "Kikuju"
#. Keyboard indicator for Tswana layouts
-#: ../rules/base.xml.in.h:866
+#: ../rules/base.xml.in.h:867
msgid "tn"
msgstr "tn"
-#: ../rules/base.xml.in.h:867
+#: ../rules/base.xml.in.h:868
msgid "Tswana"
msgstr "Csvana"
#. Keyboard indicator for Filipino layouts
-#: ../rules/base.xml.in.h:869
+#: ../rules/base.xml.in.h:870
msgid "ph"
msgstr "ph"
-#: ../rules/base.xml.in.h:870
+#: ../rules/base.xml.in.h:871
msgid "Filipino"
msgstr "Filippínó"
-#: ../rules/base.xml.in.h:871
+#: ../rules/base.xml.in.h:872
msgid "Filipino (QWERTY Baybayin)"
msgstr "Filippínó (QWERTY Baybayin)"
-#: ../rules/base.xml.in.h:872
+#: ../rules/base.xml.in.h:873
msgid "Filipino (Capewell-Dvorak Latin)"
msgstr "Filippínó (Capewell-Dvorak Latin)"
-#: ../rules/base.xml.in.h:873
+#: ../rules/base.xml.in.h:874
msgid "Filipino (Capewell-Dvorak Baybayin)"
msgstr "Filippínó (Capewell-Dvorak Baybayin)"
-#: ../rules/base.xml.in.h:874
+#: ../rules/base.xml.in.h:875
msgid "Filipino (Capewell-QWERF 2006 Latin)"
msgstr "Filippínó (Capewell-QWERF 2006 Latin)"
-#: ../rules/base.xml.in.h:875
+#: ../rules/base.xml.in.h:876
msgid "Filipino (Capewell-QWERF 2006 Baybayin)"
msgstr "Filippínó (Capewell-QWERF 2006 Baybayin)"
-#: ../rules/base.xml.in.h:876
+#: ../rules/base.xml.in.h:877
msgid "Filipino (Colemak Latin)"
msgstr "Filippínó (Colemak Latin)"
-#: ../rules/base.xml.in.h:877
+#: ../rules/base.xml.in.h:878
msgid "Filipino (Colemak Baybayin)"
msgstr "Filippínó (Colemak Baybayin)"
-#: ../rules/base.xml.in.h:878
+#: ../rules/base.xml.in.h:879
msgid "Filipino (Dvorak Latin)"
msgstr "Filippínó (Dvorak Latin)"
-#: ../rules/base.xml.in.h:879
+#: ../rules/base.xml.in.h:880
msgid "Filipino (Dvorak Baybayin)"
msgstr "Filippínó (Dvorak Baybayin)"
-#: ../rules/base.xml.in.h:880
+#: ../rules/base.xml.in.h:881
msgid "md"
msgstr "md"
-#: ../rules/base.xml.in.h:881
+#: ../rules/base.xml.in.h:882
msgid "Moldavian"
msgstr "Moldáv"
-#: ../rules/base.xml.in.h:882
+#: ../rules/base.xml.in.h:883
msgid "gag"
msgstr "gag"
-#: ../rules/base.xml.in.h:883
+#: ../rules/base.xml.in.h:884
msgid "Moldavian (Gagauz)"
msgstr "Moldáv (Gagauz)"
-#: ../rules/base.xml.in.h:884
+#: ../rules/base.xml.in.h:885
msgid "Switching to another layout"
msgstr "Váltás másik kiosztásra"
-#: ../rules/base.xml.in.h:885
+#: ../rules/base.xml.in.h:886
msgid "Right Alt (while pressed)"
msgstr "Jobb Alt (lenyomva tartva)"
-#: ../rules/base.xml.in.h:886
+#: ../rules/base.xml.in.h:887
msgid "Left Alt (while pressed)"
msgstr "Bal Alt (lenyomva tartva)"
-#: ../rules/base.xml.in.h:887
+#: ../rules/base.xml.in.h:888
msgid "Left Win (while pressed)"
msgstr "Bal Win (lenyomva tartva)"
-#: ../rules/base.xml.in.h:888
+#: ../rules/base.xml.in.h:889
msgid "Right Win (while pressed)"
msgstr "Jobb Win (lenyomva tartva)"
-#: ../rules/base.xml.in.h:889
+#: ../rules/base.xml.in.h:890
msgid "Any Win key (while pressed)"
msgstr "Bármely Win billentyű (lenyomva tartva)"
-#: ../rules/base.xml.in.h:890
+#: ../rules/base.xml.in.h:891
msgid "Caps Lock (while pressed), Alt+Caps Lock does the original capslock action"
msgstr "Caps Lock (lenyomva tartva), Alt+Caps Lock végzi az eredeti nagybetűsítési műveletet"
-#: ../rules/base.xml.in.h:891
+#: ../rules/base.xml.in.h:892
msgid "Right Ctrl (while pressed)"
msgstr "Jobb Ctrl (lenyomva tartva)"
-#: ../rules/base.xml.in.h:892
+#: ../rules/base.xml.in.h:893
msgid "Right Alt"
msgstr "Jobb Alt"
-#: ../rules/base.xml.in.h:893
+#: ../rules/base.xml.in.h:894
msgid "Left Alt"
msgstr "Bal Alt"
-#: ../rules/base.xml.in.h:894
+#: ../rules/base.xml.in.h:895
msgid "Caps Lock"
msgstr "Caps Lock"
-#: ../rules/base.xml.in.h:895
+#: ../rules/base.xml.in.h:896
msgid "Shift+Caps Lock"
msgstr "Shift+Caps Lock"
-#: ../rules/base.xml.in.h:896
+#: ../rules/base.xml.in.h:897
msgid "Caps Lock (to first layout), Shift+Caps Lock (to last layout)"
msgstr "Caps Lock (az első kiosztásra), Shift+Caps Lock (az utolsó kiosztásra)"
-#: ../rules/base.xml.in.h:897
+#: ../rules/base.xml.in.h:898
msgid "Left Win (to first layout), Right Win/Menu (to last layout)"
msgstr "Bal Win (az első kiosztásra), jobb Win/Menü (az utolsó kiosztásra)"
-#: ../rules/base.xml.in.h:898
+#: ../rules/base.xml.in.h:899
msgid "Left Ctrl (to first layout), Right Ctrl (to last layout)"
msgstr "Bal Ctrl (az első kiosztásra), jobb Ctrl (az utolsó kiosztásra)"
-#: ../rules/base.xml.in.h:899
+#: ../rules/base.xml.in.h:900
msgid "Alt+Caps Lock"
msgstr "Alt+Caps Lock"
-#: ../rules/base.xml.in.h:900
+#: ../rules/base.xml.in.h:901
msgid "Both Shift keys together"
msgstr "A két Shift billentyű együtt"
-#: ../rules/base.xml.in.h:901
+#: ../rules/base.xml.in.h:902
msgid "Both Alt keys together"
msgstr "A két Alt billentyű együtt"
-#: ../rules/base.xml.in.h:902
+#: ../rules/base.xml.in.h:903
msgid "Both Ctrl keys together"
msgstr "A két Ctrl billentyű együtt"
-#: ../rules/base.xml.in.h:903
+#: ../rules/base.xml.in.h:904
msgid "Ctrl+Shift"
msgstr "Ctrl+Shift"
-#: ../rules/base.xml.in.h:904
+#: ../rules/base.xml.in.h:905
msgid "Left Ctrl+Left Shift"
msgstr "Bal Ctrl+Bal Shift"
-#: ../rules/base.xml.in.h:905
+#: ../rules/base.xml.in.h:906
msgid "Right Ctrl+Right Shift"
msgstr "Jobb Ctrl + jobb Shift"
-#: ../rules/base.xml.in.h:906
+#: ../rules/base.xml.in.h:907
msgid "Alt+Ctrl"
msgstr "Alt+Ctrl"
-#: ../rules/base.xml.in.h:907
+#: ../rules/base.xml.in.h:908
msgid "Alt+Shift"
msgstr "Alt+Shift"
-#: ../rules/base.xml.in.h:908
+#: ../rules/base.xml.in.h:909
msgid "Left Alt+Left Shift"
msgstr "Bal Alt+Bal Shift"
-#: ../rules/base.xml.in.h:909
+#: ../rules/base.xml.in.h:910
msgid "Alt+Space"
msgstr "Alt+Szóköz"
-#: ../rules/base.xml.in.h:910
+#: ../rules/base.xml.in.h:911
msgid "Menu"
msgstr "Menü"
-#: ../rules/base.xml.in.h:911
+#: ../rules/base.xml.in.h:912
msgid "Left Win"
msgstr "Bal Win"
-#: ../rules/base.xml.in.h:912
+#: ../rules/base.xml.in.h:913
msgid "Right Win"
msgstr "Jobb Win"
-#: ../rules/base.xml.in.h:913
+#: ../rules/base.xml.in.h:914
msgid "Left Shift"
msgstr "Bal Shift"
-#: ../rules/base.xml.in.h:914
+#: ../rules/base.xml.in.h:915
msgid "Right Shift"
msgstr "Jobb Shift"
-#: ../rules/base.xml.in.h:915
+#: ../rules/base.xml.in.h:916
msgid "Left Ctrl"
msgstr "Bal Ctrl"
-#: ../rules/base.xml.in.h:916
+#: ../rules/base.xml.in.h:917
msgid "Right Ctrl"
msgstr "Jobb Ctrl"
-#: ../rules/base.xml.in.h:917
+#: ../rules/base.xml.in.h:918
msgid "Scroll Lock"
msgstr "Scroll Lock"
-#: ../rules/base.xml.in.h:918
+#: ../rules/base.xml.in.h:919
msgid "LeftCtrl+LeftWin (to first layout), RightCtrl+Menu (to second layout)"
msgstr "Bal Ctrl + Bal Win (az első kiosztásra), jobb Ctrl + Menü (a második kiosztásra)"
-#: ../rules/base.xml.in.h:919
+#: ../rules/base.xml.in.h:920
msgid "Key to choose 3rd level"
msgstr "Billentyű a harmadik szint választásához"
-#: ../rules/base.xml.in.h:920
+#: ../rules/base.xml.in.h:921
msgid "Any Win key"
msgstr "Bármely Win billentyű"
-#: ../rules/base.xml.in.h:921
+#: ../rules/base.xml.in.h:922
msgid "Any Alt key"
msgstr "Bármely Alt billentyű"
-#: ../rules/base.xml.in.h:922
+#: ../rules/base.xml.in.h:923
msgid "Right Alt, Shift+Right Alt key is Compose"
msgstr "Jobb Alt, a Shift+jobb Alt a kombináló"
-#: ../rules/base.xml.in.h:923
+#: ../rules/base.xml.in.h:924
msgid "Right Alt key never chooses 3rd level"
msgstr "A jobb Alt billentyű sohasem választ harmadik szintet"
-#: ../rules/base.xml.in.h:924
+#: ../rules/base.xml.in.h:925
msgid "Enter on keypad"
msgstr "Enter a számbillentyűzeten"
-#: ../rules/base.xml.in.h:925
+#: ../rules/base.xml.in.h:926
msgid "Backslash"
msgstr "Fordított törtvonal"
-#: ../rules/base.xml.in.h:926
+#: ../rules/base.xml.in.h:927
msgid "&lt;Less/Greater&gt;"
msgstr "&lt;Kisebb/nagyobb&gt;"
-#: ../rules/base.xml.in.h:927
+#: ../rules/base.xml.in.h:928
msgid "Caps Lock chooses 3rd level, acts as onetime lock when pressed together with another 3rd-level-chooser"
msgstr "Caps Lock választja a 3. szintet, egyszeri zárként viselkedik másik 3. szintet választóval együtt lenyomva"
-#: ../rules/base.xml.in.h:928
+#: ../rules/base.xml.in.h:929
msgid "Backslash chooses 3rd level, acts as onetime lock when pressed together with another 3rd-level-chooser"
msgstr "Fordított törtvonal választja a 3. szintet, egyszeri zárként viselkedik másik 3. szintet választóval együtt lenyomva"
-#: ../rules/base.xml.in.h:929
+#: ../rules/base.xml.in.h:930
msgid "&lt;Less/Greater&gt; chooses 3rd level, acts as onetime lock when pressed together with another 3rd-level-chooser"
msgstr "&lt;Kisebb/nagyobb&gt; választja a 3. szintet, egyszeri zárként viselkedik másik 3. szintet választóval együtt lenyomva"
-#: ../rules/base.xml.in.h:930
+#: ../rules/base.xml.in.h:931
msgid "Ctrl key position"
msgstr "Ctrl billentyű helyzete"
-#: ../rules/base.xml.in.h:931
+#: ../rules/base.xml.in.h:932
msgid "Caps Lock as Ctrl"
msgstr "Caps Lock mint Ctrl"
-#: ../rules/base.xml.in.h:932
+#: ../rules/base.xml.in.h:933
msgid "Left Ctrl as Meta"
msgstr "Bal Ctrl mint Meta"
-#: ../rules/base.xml.in.h:933
+#: ../rules/base.xml.in.h:934
msgid "Swap Ctrl and Caps Lock"
msgstr "Ctrl és Caps Lock felcserélése"
-#: ../rules/base.xml.in.h:934
+#: ../rules/base.xml.in.h:935
msgid "At left of 'A'"
msgstr "Az „A”-tól balra"
-#: ../rules/base.xml.in.h:935
+#: ../rules/base.xml.in.h:936
msgid "At bottom left"
msgstr "Bal oldalt, alul"
-#: ../rules/base.xml.in.h:936
+#: ../rules/base.xml.in.h:937
msgid "Right Ctrl as Right Alt"
msgstr "Jobb Ctrl használata jobb Alt-ként"
-#: ../rules/base.xml.in.h:937
+#: ../rules/base.xml.in.h:938
msgid "Menu as Right Ctrl"
msgstr "Menü mint jobb Ctrl"
-#: ../rules/base.xml.in.h:938
+#: ../rules/base.xml.in.h:939
msgid "Right Alt as Right Ctrl"
msgstr "Jobb Alt jobb Ctrl-ként"
-#: ../rules/base.xml.in.h:939
+#: ../rules/base.xml.in.h:940
+msgid "Swap Left Alt key with Left Ctrl key"
+msgstr "Bal Alt és bal Ctrl felcserélése"
+
+#: ../rules/base.xml.in.h:941
+msgid "Swap Left Win key with Left Ctrl key"
+msgstr "Bal Win és bal Ctrl felcserélése"
+
+#: ../rules/base.xml.in.h:942
+msgid "Left Alt as Ctrl, Left Ctrl as Win, Left Win as Alt"
+msgstr "Bal Alt mint Ctrl, bal Ctrl mint Win, bal Win mint Alt"
+
+#: ../rules/base.xml.in.h:943
msgid "Use keyboard LED to show alternative layout"
msgstr "Az alternatív kiosztás megjelenítése a billentyűzet LED-ek használatával"
-#: ../rules/base.xml.in.h:940
+#: ../rules/base.xml.in.h:944
msgid "Num Lock"
msgstr "Num Lock"
-#: ../rules/base.xml.in.h:941
+#: ../rules/base.xml.in.h:945
msgid "Layout of numeric keypad"
msgstr "Numerikus billentyűzet kiosztása"
-#: ../rules/base.xml.in.h:942
+#: ../rules/base.xml.in.h:946
msgid "Legacy"
msgstr "Örökölt"
-#: ../rules/base.xml.in.h:943
+#: ../rules/base.xml.in.h:947
msgid "Unicode additions (arrows and math operators)"
msgstr "Unicode kiegészítések (nyilak és műveleti jelek)"
-#: ../rules/base.xml.in.h:944
+#: ../rules/base.xml.in.h:948
msgid "Unicode additions (arrows and math operators; math operators on default level)"
msgstr "Unicode kiegészítések (nyilak és műveleti jelek; a műveleti jelek az alapértelmezett szinten)"
-#: ../rules/base.xml.in.h:945
+#: ../rules/base.xml.in.h:949
msgid "Legacy Wang 724"
msgstr "Hagyományos Wang 724"
-#: ../rules/base.xml.in.h:946
+#: ../rules/base.xml.in.h:950
msgid "Wang 724 keypad with Unicode additions (arrows and math operators)"
msgstr "Wang 724 numerikus billentyűzet Unicode bővítésekkel (nyilak és műveleti jelek)"
-#: ../rules/base.xml.in.h:947
+#: ../rules/base.xml.in.h:951
msgid "Wang 724 keypad with Unicode additions (arrows and math operators; math operators on default level)"
msgstr "Wang 724 numerikus billentyűzet Unicode bővítésekkel (nyilak és műveleti jelek; a műveleti jelek az alapértelmezett szinten)"
-#: ../rules/base.xml.in.h:948
+#: ../rules/base.xml.in.h:952
msgid "Hexadecimal"
msgstr "Hexadecimális"
-#: ../rules/base.xml.in.h:949
+#: ../rules/base.xml.in.h:953
msgid "ATM/phone-style"
msgstr "ATM/telefon stílusú"
-#: ../rules/base.xml.in.h:950
+#: ../rules/base.xml.in.h:954
msgid "Numeric keypad delete key behaviour"
msgstr "Számbillentyűzet Delete billentyűjének viselkedése"
-#: ../rules/base.xml.in.h:951
+#: ../rules/base.xml.in.h:955
msgid "Legacy key with dot"
msgstr "Hagyományos számbillentyűzet ponttal"
#. Actually, with KP_SEPARATOR, as the old keypad(comma)
-#: ../rules/base.xml.in.h:953
+#: ../rules/base.xml.in.h:957
msgid "Legacy key with comma"
msgstr "Hagyományos számbillentyűzet vesszővel"
-#: ../rules/base.xml.in.h:954
+#: ../rules/base.xml.in.h:958
msgid "Four-level key with dot"
msgstr "Negyedik szintű billentyű ponttal"
-#: ../rules/base.xml.in.h:955
+#: ../rules/base.xml.in.h:959
msgid "Four-level key with dot, Latin-9 only"
msgstr "Negyedik szintű billentyű ponttal, csak Latin-9"
-#: ../rules/base.xml.in.h:956
+#: ../rules/base.xml.in.h:960
msgid "Four-level key with comma"
msgstr "Negyedik szintű billentyű vesszővel"
-#: ../rules/base.xml.in.h:957
+#: ../rules/base.xml.in.h:961
msgid "Four-level key with momayyez"
msgstr "Negyedik szintű billentyű momayyez-val"
#. This assumes the KP_ abstract symbols are actually useful for some apps
#. The description needs to be rewritten
-#: ../rules/base.xml.in.h:960
+#: ../rules/base.xml.in.h:964
msgid "Four-level key with abstract separators"
msgstr "Negyedik szintű billentyű absztrakt elválasztókkal"
-#: ../rules/base.xml.in.h:961
+#: ../rules/base.xml.in.h:965
msgid "Semicolon on third level"
msgstr "Pontosvessző a harmadik szinten"
-#: ../rules/base.xml.in.h:962
+#: ../rules/base.xml.in.h:966
msgid "Caps Lock key behavior"
msgstr "A Caps Lock billentyű viselkedése"
-#: ../rules/base.xml.in.h:963
+#: ../rules/base.xml.in.h:967
msgid "Caps Lock uses internal capitalization; Shift \"pauses\" Caps Lock"
msgstr "A Caps Lock belső nagybetűkre váltást használ; a Shift „szünetelteti” a nagybetűsítést"
-#: ../rules/base.xml.in.h:964
+#: ../rules/base.xml.in.h:968
msgid "Caps Lock uses internal capitalization; Shift doesn't affect Caps Lock"
msgstr "A Caps Lock belső nagybetűkre váltást használ; a Shift nem befolyásolja a nagybetűsítést"
-#: ../rules/base.xml.in.h:965
+#: ../rules/base.xml.in.h:969
msgid "Caps Lock acts as Shift with locking; Shift \"pauses\" Caps Lock"
msgstr "A Caps Lock Shiftként működik zárolással; a Shift „szünetelteti” a nagybetűsítést"
-#: ../rules/base.xml.in.h:966
+#: ../rules/base.xml.in.h:970
msgid "Caps Lock acts as Shift with locking; Shift doesn't affect Caps Lock"
msgstr "A Caps Lock Shiftként működik zárolással; a Shift nem befolyásolja a nagybetűsítést"
-#: ../rules/base.xml.in.h:967
+#: ../rules/base.xml.in.h:971
msgid "Caps Lock toggles normal capitalization of alphabetic characters"
msgstr "A Caps Lock átváltja a betűkarakterek normál kis- és nagybetűit"
-#: ../rules/base.xml.in.h:968
+#: ../rules/base.xml.in.h:972
msgid "Make Caps Lock an additional Num Lock"
msgstr "A Caps Lock használata másik Num Lock-ként"
-#: ../rules/base.xml.in.h:969
+#: ../rules/base.xml.in.h:973
msgid "Swap ESC and Caps Lock"
msgstr "Esc és Caps Lock felcserélése"
-#: ../rules/base.xml.in.h:970
+#: ../rules/base.xml.in.h:974
msgid "Make Caps Lock an additional ESC"
msgstr "A Caps Lock használata másik Esc-ként"
-#: ../rules/base.xml.in.h:971
+#: ../rules/base.xml.in.h:975
msgid "Make Caps Lock an additional Backspace"
msgstr "A Caps Lock használata másik Backspace-ként"
-#: ../rules/base.xml.in.h:972
+#: ../rules/base.xml.in.h:976
msgid "Make Caps Lock an additional Super"
msgstr "A Caps Lock használata másik Super-ként"
-#: ../rules/base.xml.in.h:973
+#: ../rules/base.xml.in.h:977
msgid "Make Caps Lock an additional Hyper"
msgstr "A Caps Lock használata másik Hyper-ként"
-#: ../rules/base.xml.in.h:974
+#: ../rules/base.xml.in.h:978
msgid "Caps Lock toggles ShiftLock (affects all keys)"
msgstr "A Caps Lock átváltja a Shiftet (minden billentyűt érinti)"
-#: ../rules/base.xml.in.h:975
+#: ../rules/base.xml.in.h:979
msgid "Caps Lock is disabled"
msgstr "A Caps Lock letiltva"
-#: ../rules/base.xml.in.h:976
+#: ../rules/base.xml.in.h:980
msgid "Make Caps Lock an additional Ctrl"
msgstr "A Caps Lock használata másik Ctrl-ként"
-#: ../rules/base.xml.in.h:977
+#: ../rules/base.xml.in.h:981
msgid "Alt/Win key behavior"
msgstr "Az Alt/Win billentyűk viselkedése"
-#: ../rules/base.xml.in.h:978
+#: ../rules/base.xml.in.h:982
msgid "Add the standard behavior to Menu key"
msgstr "A szabványos funkcionalitás hozzáadása a Menü billentyűhöz"
-#: ../rules/base.xml.in.h:979
+#: ../rules/base.xml.in.h:983
msgid "Alt and Meta are on Alt keys"
msgstr "Az Alt és Meta az Alt billentyűkön"
-#: ../rules/base.xml.in.h:980
+#: ../rules/base.xml.in.h:984
msgid "Alt is mapped to Win keys (and the usual Alt keys)"
msgstr "Az Alt a Win billentyűkhöz van rendelve (és a szokásos Alt billentyűkhöz)"
-#: ../rules/base.xml.in.h:981
+#: ../rules/base.xml.in.h:985
msgid "Ctrl is mapped to Win keys (and the usual Ctrl keys)"
msgstr "A Ctrl a Win billentyűkhöz van rendelve (és a szokásos Ctrl billentyűkhöz)"
-#: ../rules/base.xml.in.h:982
+#: ../rules/base.xml.in.h:986
msgid "Ctrl is mapped to Alt keys, Alt is mapped to Win keys"
msgstr "A Ctrl az Alt billentyűkhöz, az Alt a Win billentyűkhöz van rendelve"
-#: ../rules/base.xml.in.h:983
+#: ../rules/base.xml.in.h:987
msgid "Meta is mapped to Win keys"
msgstr "A Meta a Win billentyűkhöz van rendelve"
-#: ../rules/base.xml.in.h:984
+#: ../rules/base.xml.in.h:988
msgid "Meta is mapped to Left Win"
msgstr "A Meta a bal Win billentyűhöz van rendelve"
-#: ../rules/base.xml.in.h:985
+#: ../rules/base.xml.in.h:989
msgid "Hyper is mapped to Win-keys"
msgstr "A Hyper a Win billentyűkhöz van rendelve"
-#: ../rules/base.xml.in.h:986
+#: ../rules/base.xml.in.h:990
msgid "Alt is mapped to Right Win, Super to Menu"
msgstr "Az Alt a jobb Win billentyűhöz van rendelve, a Super a Menühöz"
-#: ../rules/base.xml.in.h:987
+#: ../rules/base.xml.in.h:991
msgid "Alt is swapped with Win"
msgstr "Az Alt fel van cserélve a Win billentyűvel"
-#: ../rules/base.xml.in.h:988
+#: ../rules/base.xml.in.h:992
msgid "Position of Compose key"
msgstr "A kombináló billentyű helye"
-#: ../rules/base.xml.in.h:989
+#: ../rules/base.xml.in.h:993
msgid "3rd level of Left Win"
msgstr "3. szintű bal Win"
-#: ../rules/base.xml.in.h:990
+#: ../rules/base.xml.in.h:994
msgid "3rd level of Right Win"
msgstr "3. szintű jobb Win"
-#: ../rules/base.xml.in.h:991
+#: ../rules/base.xml.in.h:995
msgid "3rd level of Menu"
msgstr "3. szintű Menü"
-#: ../rules/base.xml.in.h:992
+#: ../rules/base.xml.in.h:996
msgid "3rd level of Left Ctrl"
msgstr "3. szintű bal Ctrl"
-#: ../rules/base.xml.in.h:993
+#: ../rules/base.xml.in.h:997
msgid "3rd level of Right Ctrl"
msgstr "3. szintű jobb Ctrl"
-#: ../rules/base.xml.in.h:994
+#: ../rules/base.xml.in.h:998
msgid "3rd level of Caps Lock"
msgstr "3. szintű jobb Caps Lock"
-#: ../rules/base.xml.in.h:995
+#: ../rules/base.xml.in.h:999
msgid "3rd level of &lt;Less/Greater&gt;"
msgstr "3. szintű &lt;kisebb/nagyobb&gt;"
-#: ../rules/base.xml.in.h:996
+#: ../rules/base.xml.in.h:1000
msgid "Pause"
msgstr "Pause"
-#: ../rules/base.xml.in.h:997
+#: ../rules/base.xml.in.h:1001
msgid "PrtSc"
msgstr "PrtSc"
-#: ../rules/base.xml.in.h:998
+#: ../rules/base.xml.in.h:1002
msgid "Miscellaneous compatibility options"
msgstr "Egyéb kompatibilitási beállítások"
-#: ../rules/base.xml.in.h:999
+#: ../rules/base.xml.in.h:1003
msgid "Default numeric keypad keys"
msgstr "Alapértelmezett számbillentyűk"
-#: ../rules/base.xml.in.h:1000
+#: ../rules/base.xml.in.h:1004
msgid "Numeric keypad keys always enter digits (as in Mac OS)"
msgstr "A számbillentyűk mindig számokat visznek be (mint Mac OS-en)"
-#: ../rules/base.xml.in.h:1001
+#: ../rules/base.xml.in.h:1005
msgid "Shift with numeric keypad keys works as in MS Windows"
msgstr "A Shift+számbillentyűk úgy működjenek, mint az MS Windowsban"
-#: ../rules/base.xml.in.h:1002
+#: ../rules/base.xml.in.h:1006
msgid "Shift does not cancel Num Lock, chooses 3rd level instead"
msgstr "A Shift nem szakítja meg a Num Lockot, hanem a harmadik szintet választja"
-#: ../rules/base.xml.in.h:1003
+#: ../rules/base.xml.in.h:1007
msgid "Special keys (Ctrl+Alt+&lt;key&gt;) handled in a server"
msgstr "A speciális billentyűket (Ctrl+Alt+&lt;billentyű&gt;) a kiszolgáló kezeli"
-#: ../rules/base.xml.in.h:1004
+#: ../rules/base.xml.in.h:1008
msgid "Apple Aluminium Keyboard: emulate PC keys (Print, Scroll Lock, Pause, Num Lock)"
msgstr "Apple alumínium billentyűzet PC-billentyűk emulálása (Print, Scroll Lock, Pause, Num Lock)"
-#: ../rules/base.xml.in.h:1005
+#: ../rules/base.xml.in.h:1009
msgid "Shift cancels Caps Lock"
msgstr "A Shift megszakítja a Caps Lockot"
-#: ../rules/base.xml.in.h:1006
+#: ../rules/base.xml.in.h:1010
msgid "Enable extra typographic characters"
msgstr "Extra tipográfiai karakterek engedélyezése"
-#: ../rules/base.xml.in.h:1007
+#: ../rules/base.xml.in.h:1011
msgid "Both Shift keys together toggle Caps Lock"
msgstr "A két Shift billentyű együtt váltja a Caps Lockot"
-#: ../rules/base.xml.in.h:1008
+#: ../rules/base.xml.in.h:1012
msgid "Both Shift keys together activate Caps Lock, one Shift key deactivates"
msgstr "A két Shift billentyű együtt aktiválja a Caps Lockot, egy Shift deaktiválja"
-#: ../rules/base.xml.in.h:1009
+#: ../rules/base.xml.in.h:1013
msgid "Both Shift keys together toggle ShiftLock"
msgstr "A két Shift billentyű együtt váltja a ShiftLockot"
-#: ../rules/base.xml.in.h:1010
+#: ../rules/base.xml.in.h:1014
msgid "Shift + NumLock toggles PointerKeys"
msgstr "Mutatóbillentyűk átváltása a Shift + NumLock használatával"
-#: ../rules/base.xml.in.h:1011
+#: ../rules/base.xml.in.h:1015
msgid "Allow breaking grabs with keyboard actions (warning: security risk)"
msgstr "Megragadás billentyűzettel való feltörésének engedélyezése (biztonsági kockázat!)"
-#: ../rules/base.xml.in.h:1012
+#: ../rules/base.xml.in.h:1016
+msgid "Allow grab and window tree logging"
+msgstr "Megragadás és ablakfa naplózásának engedélyezése"
+
+#: ../rules/base.xml.in.h:1017
msgid "Adding currency signs to certain keys"
msgstr "Pénznem jelek hozzáadása bizonyos billentyűkhöz"
-#: ../rules/base.xml.in.h:1013
+#: ../rules/base.xml.in.h:1018
msgid "Euro on E"
msgstr "Euro jel az E billentyűn"
-#: ../rules/base.xml.in.h:1014
+#: ../rules/base.xml.in.h:1019
msgid "Euro on 2"
msgstr "Euro jel a 2-es billentyűn"
-#: ../rules/base.xml.in.h:1015
+#: ../rules/base.xml.in.h:1020
msgid "Euro on 4"
msgstr "Euro jel a 4-es billentyűn"
-#: ../rules/base.xml.in.h:1016
+#: ../rules/base.xml.in.h:1021
msgid "Euro on 5"
msgstr "Euro jel az 5-ös billentyűn"
-#: ../rules/base.xml.in.h:1017
+#: ../rules/base.xml.in.h:1022
msgid "Rupee on 4"
msgstr "Rúpia jel a 4-es billentyűn"
-#: ../rules/base.xml.in.h:1018
+#: ../rules/base.xml.in.h:1023
msgid "Key to choose 5th level"
msgstr "Billentyű az ötödik szint választásához"
-#: ../rules/base.xml.in.h:1019
+#: ../rules/base.xml.in.h:1024
msgid "&lt;Less/Greater&gt; chooses 5th level, locks when pressed together with another 5th-level-chooser"
msgstr "&lt;Kisebb/nagyobb&gt; választja az 5. szintet, másik 5. szintet választóval együtt lenyomva zárol"
-#: ../rules/base.xml.in.h:1020
+#: ../rules/base.xml.in.h:1025
msgid "Right Alt chooses 5th level, locks when pressed together with another 5th-level-chooser"
msgstr "Jobb Alt választja az 5. szintet, másik 5. szintet választóval együtt lenyomva zárol"
-#: ../rules/base.xml.in.h:1021
+#: ../rules/base.xml.in.h:1026
msgid "Left Win chooses 5th level, locks when pressed together with another 5th-level-chooser"
msgstr "Bal Win választja az 5. szintet, másik 5. szintet választóval együtt lenyomva zárol"
-#: ../rules/base.xml.in.h:1022
+#: ../rules/base.xml.in.h:1027
msgid "Right Win chooses 5th level, locks when pressed together with another 5th-level-chooser"
msgstr "Jobb Win választja az 5. szintet, másik 5. szintet választóval együtt lenyomva zárol"
-#: ../rules/base.xml.in.h:1023
+#: ../rules/base.xml.in.h:1028
msgid "Using space key to input non-breakable space character"
msgstr "A szóköz billentyű használata nem törhető szóköz bevitelére"
-#: ../rules/base.xml.in.h:1024
+#: ../rules/base.xml.in.h:1029
msgid "Usual space at any level"
msgstr "Hagyományos szóköz bármely szinten"
-#: ../rules/base.xml.in.h:1025
+#: ../rules/base.xml.in.h:1030
msgid "Non-breakable space character at second level"
msgstr "Nem törhető szóköz karakter a második szinten"
-#: ../rules/base.xml.in.h:1026
+#: ../rules/base.xml.in.h:1031
msgid "Non-breakable space character at third level"
msgstr "Nem törhető szóköz karakter a harmadik szinten"
-#: ../rules/base.xml.in.h:1027
+#: ../rules/base.xml.in.h:1032
msgid "Non-breakable space character at third level, nothing at fourth level"
msgstr "Nem törhető szóköz karakter a harmadik szinten és semmi a negyediken"
-#: ../rules/base.xml.in.h:1028
+#: ../rules/base.xml.in.h:1033
msgid "Non-breakable space character at third level, thin non-breakable space character at fourth level"
msgstr "Nem törhető szóköz karakter a harmadik szinten, keskeny nem törhető szóköz karakter a negyedik szinten"
-#: ../rules/base.xml.in.h:1029
+#: ../rules/base.xml.in.h:1034
msgid "Non-breakable space character at fourth level"
msgstr "Nem törhető szóköz karakter a negyedik szinten"
-#: ../rules/base.xml.in.h:1030
+#: ../rules/base.xml.in.h:1035
msgid "Non-breakable space character at fourth level, thin non-breakable space character at sixth level"
msgstr "Nem törhető szóköz karakter a negyedik szinten, keskeny nem törhető szóköz karakter a hatodik szinten"
-#: ../rules/base.xml.in.h:1031
+#: ../rules/base.xml.in.h:1036
msgid "Non-breakable space character at fourth level, thin non-breakable space character at sixth level (via Ctrl+Shift)"
msgstr "Nem törhető szóköz karakter a negyedik szinten, keskeny nem törhető szóköz karakter a hatodik szinten (a Ctrl+Shift segítségével)"
-#: ../rules/base.xml.in.h:1032
+#: ../rules/base.xml.in.h:1037
msgid "Zero-width non-joiner character at second level"
msgstr "Nulla szélességű nem egyesítő karakter a második szinten"
-#: ../rules/base.xml.in.h:1033
+#: ../rules/base.xml.in.h:1038
msgid "Zero-width non-joiner character at second level, zero-width joiner character at third level"
msgstr "Nulla szélességű nem egyesítő karakter a második szinten, nulla szélességű egyesítő karakter a harmadik szinten"
-#: ../rules/base.xml.in.h:1034
+#: ../rules/base.xml.in.h:1039
msgid "Zero-width non-joiner character at second level, zero-width joiner character at third level, non-breakable space character at fourth level"
msgstr "Nulla szélességű nem egyesítő karakter a második szinten, nulla szélességű egyesítő karakter a harmadik szinten, nem törhető szóköz karakter a negyedik szinten"
-#: ../rules/base.xml.in.h:1035
+#: ../rules/base.xml.in.h:1040
msgid "Zero-width non-joiner character at second level, non-breakable space character at third level"
msgstr "Nulla szélességű nem egyesítő karakter a második szinten, nem törhető szóköz karakter a harmadik szinten"
-#: ../rules/base.xml.in.h:1036
+#: ../rules/base.xml.in.h:1041
msgid "Zero-width non-joiner character at second level, non-breakable space character at third level, nothing at fourth level"
msgstr "Nulla szélességű nem egyesítő karakter a második szinten, nem törhető szóköz karakter a harmadik szinten, semmi a negyedik szinten"
-#: ../rules/base.xml.in.h:1037
+#: ../rules/base.xml.in.h:1042
msgid "Zero-width non-joiner character at second level, non-breakable space character at third level, zero-width joiner at fourth level"
msgstr "Nulla szélességű nem egyesítő karakter a második szinten, nem törhető szóköz karakter a harmadik szinten, nulla szélességű egyesítő karakter a negyedik szinten"
-#: ../rules/base.xml.in.h:1038
+#: ../rules/base.xml.in.h:1043
msgid "Zero-width non-joiner character at second level, non-breakable space character at third level, thin non-breakable space at fourth level"
msgstr "Nulla szélességű nem egyesítő karakter a második szinten, nem törhető szóköz karakter a harmadik szinten, keskeny nem törhető szóköz karakter a negyedik szinten"
-#: ../rules/base.xml.in.h:1039
+#: ../rules/base.xml.in.h:1044
msgid "Zero-width non-joiner character at third level, zero-width joiner at fourth level"
msgstr "Nulla szélességű nem egyesítő karakter a harmadik szinten, nulla szélességű egyesítő karakter a negyedik szinten"
-#: ../rules/base.xml.in.h:1040
+#: ../rules/base.xml.in.h:1045
msgid "Japanese keyboard options"
msgstr "Japán billentyűzet-beállítások"
-#: ../rules/base.xml.in.h:1041
+#: ../rules/base.xml.in.h:1046
msgid "Kana Lock key is locking"
msgstr "A Kana zárolásbillentyű zárol"
-#: ../rules/base.xml.in.h:1042
+#: ../rules/base.xml.in.h:1047
msgid "NICOLA-F style Backspace"
msgstr "NICOLA-F stílusú backspace"
-#: ../rules/base.xml.in.h:1043
+#: ../rules/base.xml.in.h:1048
msgid "Make Zenkaku Hankaku an additional ESC"
msgstr "A Zenkaku Hankaku használata másik Esc-ként"
-#: ../rules/base.xml.in.h:1044
+#: ../rules/base.xml.in.h:1049
msgid "Adding Esperanto supersigned letters"
msgstr "Eszperantó mellékjeles betűk hozzáadása"
-#: ../rules/base.xml.in.h:1045
+#: ../rules/base.xml.in.h:1050
msgid "To the corresponding key in a Qwerty layout"
msgstr "A Qwerty kiosztáson megfelelő billentyűre."
-#: ../rules/base.xml.in.h:1046
+#: ../rules/base.xml.in.h:1051
msgid "To the corresponding key in a Dvorak layout"
msgstr "A Dvorak kiosztáson megfelelő billentyűre."
-#: ../rules/base.xml.in.h:1047
+#: ../rules/base.xml.in.h:1052
msgid "To the corresponding key in a Colemak layout"
msgstr "A Colemak kiosztáson megfelelő billentyűre."
-#: ../rules/base.xml.in.h:1048
+#: ../rules/base.xml.in.h:1053
msgid "Maintain key compatibility with old Solaris keycodes"
msgstr "Billentyűkompatibilitás fenntartása a régi Solaris kódokkal"
-#: ../rules/base.xml.in.h:1049
+#: ../rules/base.xml.in.h:1054
msgid "Sun Key compatibility"
msgstr "Sun billentyűzetkompatibilitás"
-#: ../rules/base.xml.in.h:1050
+#: ../rules/base.xml.in.h:1055
msgid "Key sequence to kill the X server"
msgstr "Billentyűsorozat az X kiszolgáló kilövéséhez"
-#: ../rules/base.xml.in.h:1051
+#: ../rules/base.xml.in.h:1056
msgid "Ctrl + Alt + Backspace"
msgstr "Ctrl + Alt + Backspace"
@@ -4023,150 +4043,160 @@ msgstr "Coeur d'Alene Salish"
msgid "English (US, Sun Type 6/7)"
msgstr "Angol (US, Sun Type 6/7)"
-#: ../rules/base.extras.xml.in.h:42
+#: ../rules/base.extras.xml.in.h:40
+msgid "English (Norman)"
+msgstr "Angol (Norman)"
+
+#: ../rules/base.extras.xml.in.h:43
msgid "Polish (international with dead keys)"
msgstr "Lengyel (nemzetközi, halott billentyűkkel)"
-#: ../rules/base.extras.xml.in.h:43
+#: ../rules/base.extras.xml.in.h:44
msgid "Polish (Colemak)"
msgstr "Lengyel (Colemak)"
-#: ../rules/base.extras.xml.in.h:44
+#: ../rules/base.extras.xml.in.h:45
msgid "Polish (Sun Type 6/7)"
msgstr "Lengyel (Sun Type 6/7)"
-#: ../rules/base.extras.xml.in.h:48
+#: ../rules/base.extras.xml.in.h:49
msgid "Crimean Tatar (Dobruja Q)"
msgstr "Krími tatár (Dobrudzsa Q)"
-#: ../rules/base.extras.xml.in.h:49
+#: ../rules/base.extras.xml.in.h:50
msgid "Romanian (ergonomic Touchtype)"
msgstr "Román (ergonomikus Touchtype)"
-#: ../rules/base.extras.xml.in.h:50
+#: ../rules/base.extras.xml.in.h:51
msgid "Romanian (Sun Type 6/7)"
msgstr "Román (Sun Type 6/7)"
-#: ../rules/base.extras.xml.in.h:53
+#: ../rules/base.extras.xml.in.h:54
msgid "Serbian (combining accents instead of dead keys)"
msgstr "Szerb (ékezetek kombinálása a halott billentyűk helyett)"
-#: ../rules/base.extras.xml.in.h:56
+#: ../rules/base.extras.xml.in.h:57
msgid "Russian (with Ukrainian-Belorussian layout)"
msgstr "Orosz (Ukrán-fehérorosz kiosztással)"
-#: ../rules/base.extras.xml.in.h:57
+#: ../rules/base.extras.xml.in.h:58
msgid "Russian (Sun Type 6/7)"
msgstr "Orosz (Sun Type 6/7)"
-#: ../rules/base.extras.xml.in.h:60
+#: ../rules/base.extras.xml.in.h:61
msgid "Armenian (OLPC phonetic)"
msgstr "Örmény (OLPC fonetikus)"
-#: ../rules/base.extras.xml.in.h:63
+#: ../rules/base.extras.xml.in.h:64
msgid "Hebrew (Biblical, SIL phonetic)"
msgstr "Héber (bibliai, SIL fonetikus)"
-#: ../rules/base.extras.xml.in.h:66
+#: ../rules/base.extras.xml.in.h:67
msgid "Arabic (Sun Type 6/7)"
msgstr "Arab (Sun Type 6/7)"
-#: ../rules/base.extras.xml.in.h:69
+#: ../rules/base.extras.xml.in.h:70
msgid "Belgian (Sun Type 6/7)"
msgstr "Belga (Sun Type 6/7)"
-#: ../rules/base.extras.xml.in.h:72
+#: ../rules/base.extras.xml.in.h:73
msgid "Portuguese (Brazil, Sun Type 6/7)"
msgstr "Portugál (brazil, Sun Type 6/7)"
-#: ../rules/base.extras.xml.in.h:75
+#: ../rules/base.extras.xml.in.h:76
msgid "Czech (Sun Type 6/7)"
msgstr "Cseh (Sun Type 6/7)"
-#: ../rules/base.extras.xml.in.h:78
+#: ../rules/base.extras.xml.in.h:79
msgid "Danish (Sun Type 6/7)"
msgstr "Dán (Sun Type 6/7)"
-#: ../rules/base.extras.xml.in.h:81
+#: ../rules/base.extras.xml.in.h:82
msgid "Dutch (Sun Type 6/7)"
msgstr "Holland (Sun Type 6/7)"
-#: ../rules/base.extras.xml.in.h:84
+#: ../rules/base.extras.xml.in.h:85
msgid "Estonian (Sun Type 6/7)"
msgstr "Észt (Sun Type 6/7)"
-#: ../rules/base.extras.xml.in.h:87
+#: ../rules/base.extras.xml.in.h:88
msgid "Finnish (Sun Type 6/7)"
msgstr "Finn (Sun Type 6/7)"
-#: ../rules/base.extras.xml.in.h:89
+#: ../rules/base.extras.xml.in.h:90
msgid "French (Sun Type 6/7)"
msgstr "Francia (Sun Type 6/7)"
-#: ../rules/base.extras.xml.in.h:92
+#: ../rules/base.extras.xml.in.h:93
msgid "Greek (Sun Type 6/7)"
msgstr "Görög (Sun Type 6/7)"
-#: ../rules/base.extras.xml.in.h:95
+#: ../rules/base.extras.xml.in.h:96
msgid "Italian (Sun Type 6/7)"
msgstr "Olasz (Sun Type 6/7)"
-#: ../rules/base.extras.xml.in.h:98
+#: ../rules/base.extras.xml.in.h:99
msgid "Japanese (Sun Type 6)"
msgstr "Japán (Sun Type 6)"
-#: ../rules/base.extras.xml.in.h:99
+#: ../rules/base.extras.xml.in.h:100
msgid "Japanese (Sun Type 7 - pc compatible)"
msgstr "Japán (Sun Type 7 - PC kompatibilis)"
-#: ../rules/base.extras.xml.in.h:100
+#: ../rules/base.extras.xml.in.h:101
msgid "Japanese (Sun Type 7 - sun compatible)"
msgstr "Japán (Sun Type 7 - sun kompatibilis)"
-#: ../rules/base.extras.xml.in.h:103
+#: ../rules/base.extras.xml.in.h:104
msgid "Norwegian (Sun Type 6/7)"
msgstr "Norvég (Sun Type 6/7)"
-#: ../rules/base.extras.xml.in.h:105
+#: ../rules/base.extras.xml.in.h:106
msgid "Portuguese (Sun Type 6/7)"
msgstr "Portugál (Sun Type 6/7)"
-#: ../rules/base.extras.xml.in.h:108
+#: ../rules/base.extras.xml.in.h:109
msgid "Slovak (Sun Type 6/7)"
msgstr "Szlovák (Sun Type 6/7)"
-#: ../rules/base.extras.xml.in.h:111
+#: ../rules/base.extras.xml.in.h:112
msgid "Spanish (Sun Type 6/7)"
msgstr "Spanyol (Sun Type 6/7)"
-#: ../rules/base.extras.xml.in.h:114
+#: ../rules/base.extras.xml.in.h:115
msgid "Swedish (Sun Type 6/7)"
msgstr "Svéd (Sun Type 6/7)"
-#: ../rules/base.extras.xml.in.h:116
+#: ../rules/base.extras.xml.in.h:117
msgid "German (Switzerland, Sun Type 6/7)"
msgstr "Német (Svájc, Sun Type 6/7)"
-#: ../rules/base.extras.xml.in.h:117
+#: ../rules/base.extras.xml.in.h:118
msgid "French (Switzerland, Sun Type 6/7)"
msgstr "Francia (Svájc, Sun Type 6/7)"
-#: ../rules/base.extras.xml.in.h:120
+#: ../rules/base.extras.xml.in.h:121
msgid "Turkish (Sun Type 6/7)"
msgstr "Török (Sun Type 6/7)"
-#: ../rules/base.extras.xml.in.h:123
+#: ../rules/base.extras.xml.in.h:124
msgid "Ukrainian (Sun Type 6/7)"
msgstr "Ukrán (Sun Type 6/7)"
-#: ../rules/base.extras.xml.in.h:125
+#: ../rules/base.extras.xml.in.h:126
msgid "English (UK, Sun Type 6/7)"
msgstr "Angol (UK, Sun Type 6/7)"
-#: ../rules/base.extras.xml.in.h:128
+#: ../rules/base.extras.xml.in.h:129
msgid "Korean (Sun Type 6/7)"
msgstr "Koreai (Sun Type 6/7)"
+#~ msgid "Bengali"
+#~ msgstr "Bengáli"
+
+#~ msgid "Portuguese (Brazil, nativo for Esperanto)"
+#~ msgstr "Portugál (brazil, natív az eszperantóhoz)"
+
#~ msgid "English (layout toggle on multiply/divide key)"
#~ msgstr "Angol (kiosztás átváltása a szorzás/osztás billentyűn)"
diff --git a/xorg-server/xkeyboard-config/po/id.po b/xorg-server/xkeyboard-config/po/id.po
index fb0e2626e..93cb2f093 100644
--- a/xorg-server/xkeyboard-config/po/id.po
+++ b/xorg-server/xkeyboard-config/po/id.po
@@ -2,2914 +2,2697 @@
# Copyright (C) 2008 THE xkeyboard-config'S COPYRIGHT HOLDER
# This file is distributed under the same license as the xkeyboard-config package.
# Erwid M Jadied <jadied@gmail.com>, 2008.
-# Andhika Padmawan <andhika.padmawan@gmail.com>, 2010.
-# Andika Triwidada <andika@gmail.com>, 2012.
+# Andhika Padmawan <andhika.padmawan@gmail.com>, 2010, 2014.
+# Andika Triwidada <andika@gmail.com>, 2012, 2013.
#
msgid ""
msgstr ""
-"Project-Id-Version: xkeyboard-config-2.4.99\n"
+"Project-Id-Version: xkeyboard-config 2.10.99\n"
"Report-Msgid-Bugs-To: svu@users.sourceforge.net\n"
-"POT-Creation-Date: 2012-01-17 20:46+0000\n"
-"PO-Revision-Date: 2012-05-09 21:39+0700\n"
+"POT-Creation-Date: 2014-01-15 01:12+0000\n"
+"PO-Revision-Date: 2014-01-26 08:31+0700\n"
"Last-Translator: Andhika Padmawan <andhika.padmawan@gmail.com>\n"
"Language-Team: Indonesian <translation-team-id@lists.sourceforge.net>\n"
"Language: id\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
-"X-Poedit-Language: Indonesian\n"
-"X-Poedit-Country: INDONESIA\n"
+"Plural-Forms: nplurals=1; plural=0;\n"
#: ../rules/base.xml.in.h:1
-msgid "&lt;Less/Greater&gt;"
-msgstr "&lt;Lebih Kecil/Lebih Besar&gt;"
+msgid "Generic 101-key PC"
+msgstr "PC 101-tombol Generik "
#: ../rules/base.xml.in.h:2
-msgid "&lt;Less/Greater&gt; chooses 3rd level, acts as onetime lock when pressed together with another 3rd-level-chooser"
-msgstr "&lt;Lebih Kecil/Lebih Besar&gt; memilih level ke-3, berfungsi sebagai kunci sekali jika ditekan bersamaan dengan pemilih-level-ke-3 lainnya"
+msgid "Generic 102-key (Intl) PC"
+msgstr "PC 102-tombol (Intl) Generic"
#: ../rules/base.xml.in.h:3
-msgid "&lt;Less/Greater&gt; chooses 5th level, locks when pressed together with another 5th-level-chooser"
-msgstr "&lt;Lebih Kecil/Lebih Besar&gt; pilih level kelima, terkunci jika ditekan bersamaan dengan pemilih-level-kelima lainnya"
+msgid "Generic 104-key PC"
+msgstr "PC 104-tombol Generik "
#: ../rules/base.xml.in.h:4
-msgid "A4Tech KB-21"
-msgstr "A4Tech KB-21"
+msgid "Generic 105-key (Intl) PC"
+msgstr "PC 105-tombol (Intl) Generic"
#: ../rules/base.xml.in.h:5
-msgid "A4Tech KBS-8"
-msgstr "A4Tech KBS-8"
+msgid "Dell 101-key PC"
+msgstr "PC 101-tombol Dell"
#: ../rules/base.xml.in.h:6
-msgid "A4Tech Wireless Desktop RFKB-23"
-msgstr "A4Tech Wireless Desktop RFKB-23"
+msgid "Dell Latitude series laptop"
+msgstr "Laptop seri Dell Latitude"
#: ../rules/base.xml.in.h:7
-msgid "ATM/phone-style"
-msgstr "Gaya ATM/telepon"
+msgid "Dell Precision M65"
+msgstr "Dell Precision M65"
#: ../rules/base.xml.in.h:8
-msgid "Acer AirKey V"
-msgstr "Acer AirKey V"
+msgid "Everex STEPnote"
+msgstr "Everex STEPnote"
#: ../rules/base.xml.in.h:9
-msgid "Acer C300"
-msgstr "Acer C300"
+msgid "Keytronic FlexPro"
+msgstr "Keytronic FlexPro"
#: ../rules/base.xml.in.h:10
-msgid "Acer Ferrari 4000"
-msgstr "Acer Ferrari 4000"
+msgid "Microsoft Natural"
+msgstr "Microsoft Natural"
#: ../rules/base.xml.in.h:11
-msgid "Acer Laptop"
-msgstr "Laptop Acer"
+msgid "Northgate OmniKey 101"
+msgstr "Northgate OmniKey 101"
#: ../rules/base.xml.in.h:12
-msgid "Add the standard behavior to Menu key"
-msgstr "Tambah tindakan standar pada tombol Menu"
+msgid "Winbook Model XP5"
+msgstr "Winbook Model XP5"
#: ../rules/base.xml.in.h:13
-msgid "Adding Esperanto circumflexes (supersigno)"
-msgstr "Menambah circumflex Esperanto (supersigno)"
+msgid "PC-98xx Series"
+msgstr "Seri PC-98xx"
#: ../rules/base.xml.in.h:14
-msgid "Adding currency signs to certain keys"
-msgstr "Menambahkan tanda mata uang ke tombol tertentu"
+msgid "A4Tech KB-21"
+msgstr "A4Tech KB-21"
#: ../rules/base.xml.in.h:15
-msgid "Advance Scorpius KI"
-msgstr "Advance Scorpius KI"
+msgid "A4Tech KBS-8"
+msgstr "A4Tech KBS-8"
#: ../rules/base.xml.in.h:16
-msgid "Afghani"
-msgstr "Afganistan"
+msgid "A4Tech Wireless Desktop RFKB-23"
+msgstr "A4Tech Wireless Desktop RFKB-23"
#: ../rules/base.xml.in.h:17
-msgid "Akan"
-msgstr "Akan"
+msgid "Acer AirKey V"
+msgstr "Acer AirKey V"
#: ../rules/base.xml.in.h:18
-msgid "Albanian"
-msgstr "Albania"
+msgid "Azona RF2300 wireless Internet Keyboard"
+msgstr "Papan Ketik Internet nirkabel Azona RF2300"
#: ../rules/base.xml.in.h:19
-msgid "Alt and Meta are on Alt keys"
-msgstr "Alt dan Meta pada tombol Alt"
+msgid "Advance Scorpius KI"
+msgstr "Advance Scorpius KI"
#: ../rules/base.xml.in.h:20
-msgid "Alt is mapped to Right Win, Super to Menu"
-msgstr "Alt dipetakan ke Win Kanan, Super ke Menu"
+msgid "Brother Internet Keyboard"
+msgstr "Papan Tik Internet Brother"
#: ../rules/base.xml.in.h:21
-msgid "Alt+Caps Lock"
-msgstr "Tombol Alt+Caps"
+msgid "BTC 5113RF Multimedia"
+msgstr "BTC 5113RF Multimedia"
#: ../rules/base.xml.in.h:22
-msgid "Alt+Ctrl"
-msgstr "Alt+Ctrl"
+msgid "BTC 5126T"
+msgstr "BTC 5126T"
#: ../rules/base.xml.in.h:23
-msgid "Alt+Shift"
-msgstr "Alt+Shift"
+msgid "BTC 6301URF"
+msgstr "BTC 6301URF"
#: ../rules/base.xml.in.h:24
-msgid "Alt+Space"
-msgstr "Alt+Space"
+msgid "BTC 9000"
+msgstr "BTC 9000"
#: ../rules/base.xml.in.h:25
-msgid "Alt/Win key behavior"
-msgstr "Tindakan Tombol Alt/Win "
+msgid "BTC 9000A"
+msgstr "BTC 9000A"
#: ../rules/base.xml.in.h:26
-msgid "Amharic"
-msgstr "Amharic"
+msgid "BTC 9001AH"
+msgstr "BTC 9001AH"
#: ../rules/base.xml.in.h:27
-msgid "Any Alt key"
-msgstr "Tombol Alt apapun"
+msgid "BTC 5090"
+msgstr "BTC 5090"
#: ../rules/base.xml.in.h:28
-msgid "Any Win key"
-msgstr "Tombol Win apapun"
+msgid "BTC 9019U"
+msgstr "BTC 9019U"
#: ../rules/base.xml.in.h:29
-msgid "Any Win key (while pressed)"
-msgstr "Tombol Win apapun (ketika ditekan)"
+msgid "BTC 9116U Mini Wireless Internet and Gaming"
+msgstr "BTC 91116U Internet dan Permainan Nirkabel Mini"
#: ../rules/base.xml.in.h:30
-msgid "Apple"
-msgstr "Apple"
+msgid "Cherry Blue Line CyBo@rd"
+msgstr "Cherry Blue Line CyBo@rd"
#: ../rules/base.xml.in.h:31
-msgid "Apple Aluminium Keyboard (ANSI)"
-msgstr "Papan Ketik Aluminium Apple (ANSI)"
+msgid "Cherry CyMotion Master XPress"
+msgstr "Cherry CyMotion Master XPress"
#: ../rules/base.xml.in.h:32
-msgid "Apple Aluminium Keyboard (ISO)"
-msgstr "Papan Ketik Aluminium (ISO)"
+msgid "Cherry Blue Line CyBo@rd (alternate option)"
+msgstr "Cherry Blue Line CyBo@rd (alternate option)"
#: ../rules/base.xml.in.h:33
-msgid "Apple Aluminium Keyboard (JIS)"
-msgstr "Papan Ketik Aluminium (JIS)"
+msgid "Cherry CyBo@rd USB-Hub"
+msgstr "Cherry CyBo@rd USB-Hub"
#: ../rules/base.xml.in.h:34
-msgid "Apple Aluminium Keyboard: emulate PC keys (Print, Scroll Lock, Pause, Num Lock)"
-msgstr "Papan Ketik Aluminium Apple: mengemulasi tombol PC (Print, Scroll_Lock, Pause, Num Lock)"
+msgid "Cherry CyMotion Expert"
+msgstr "Cherry CyMotion Expert"
#: ../rules/base.xml.in.h:35
-msgid "Apple Laptop"
-msgstr "Laptop Apple"
+msgid "Cherry B.UNLIMITED"
+msgstr "Cherry B.UNLIMITED"
#: ../rules/base.xml.in.h:36
-msgid "Arabic"
-msgstr "Arab"
+msgid "Chicony Internet Keyboard"
+msgstr "Papan Tik Internet Chicony"
#: ../rules/base.xml.in.h:37
-msgid "Arabic (Buckwalter)"
-msgstr "Arab (Buckwalter)"
+msgid "Chicony KU-0108"
+msgstr "Chicony KU-0108"
#: ../rules/base.xml.in.h:38
-msgid "Arabic (Morocco)"
-msgstr "Arab (Maroko)"
+msgid "Chicony KU-0420"
+msgstr "Chicony KU-0420"
#: ../rules/base.xml.in.h:39
-msgid "Arabic (Pakistan)"
-msgstr "Arab (Pakistan)"
+msgid "Chicony KB-9885"
+msgstr "Chicony KB-9885"
#: ../rules/base.xml.in.h:40
-msgid "Arabic (Syria)"
-msgstr "Arab (Siria)"
+msgid "Compaq Easy Access Keyboard"
+msgstr "Papan Ketik Akses Mudah Compaq"
#: ../rules/base.xml.in.h:41
-msgid "Arabic (azerty)"
-msgstr "Arab (azerty)"
+msgid "Compaq Internet Keyboard (7 keys)"
+msgstr "Papan Ketik Internet Compaq (7 tombol)"
#: ../rules/base.xml.in.h:42
-msgid "Arabic (azerty/digits)"
-msgstr "Arab (azerty/digit)"
+msgid "Compaq Internet Keyboard (13 keys)"
+msgstr "Papan Ketik Internet Compaq (13 tombol)"
#: ../rules/base.xml.in.h:43
-msgid "Arabic (digits)"
-msgstr "Arab (digits)"
+msgid "Compaq Internet Keyboard (18 keys)"
+msgstr "Papan Ketik Internet Compaq (18 tombol)"
#: ../rules/base.xml.in.h:44
-msgid "Arabic (qwerty)"
-msgstr "Arab (qwerty)"
+msgid "Cherry CyMotion Master Linux"
+msgstr "Cherry CyMotion Master Linux"
#: ../rules/base.xml.in.h:45
-msgid "Arabic (qwerty/digits)"
-msgstr "Arab (qwerty/digit)"
+msgid "Laptop/notebook Compaq (eg. Armada) Laptop Keyboard"
+msgstr "Laptop/notebook Compaq (eg. Armada) Laptop Keyboard"
-#: ../rules/base.xml.in.h:46 ../rules/base.extras.xml.in.h:2
-msgid "Armenian"
-msgstr "Armenia"
+#: ../rules/base.xml.in.h:46
+msgid "Laptop/notebook Compaq (eg. Presario) Internet Keyboard"
+msgstr "Laptop/notebook Compaq (eg. Presario) Internet Keyboard"
#: ../rules/base.xml.in.h:47
-msgid "Armenian (alternative eastern)"
-msgstr "Armenia (timur alternatif)"
+msgid "Compaq iPaq Keyboard"
+msgstr "Papan Ketik Compaq iPaq"
#: ../rules/base.xml.in.h:48
-msgid "Armenian (alternative phonetic)"
-msgstr "Armenia (fonetik alternatif)"
+msgid "Dell"
+msgstr "Dell"
#: ../rules/base.xml.in.h:49
-msgid "Armenian (eastern)"
-msgstr "Armenia (timur)"
+msgid "Dell SK-8125"
+msgstr "Dell SK-8125"
#: ../rules/base.xml.in.h:50
-msgid "Armenian (phonetic)"
-msgstr "Armenia (fonetik)"
+msgid "Dell SK-8135"
+msgstr "Dell SK-8135"
#: ../rules/base.xml.in.h:51
-msgid "Armenian (western)"
-msgstr "Armenia (barat)"
+msgid "Dell USB Multimedia Keyboard"
+msgstr "Papan Ketik Multimedia USB Dell"
#: ../rules/base.xml.in.h:52
-msgid "Asturian (Spain, with bottom-dot H and bottom-dot L)"
-msgstr "Asturia (Spanyol, dengan titik di bawah pada H dan L)"
+msgid "Dell Laptop/notebook Inspiron 6xxx/8xxx"
+msgstr "Dell Laptop/notebook Inspiron 6xxx/8xxx"
#: ../rules/base.xml.in.h:53
-msgid "Asus Laptop"
-msgstr "Laptop Asus"
+msgid "Dell Laptop/notebook Precision M series"
+msgstr "Dell Laptop/notebook Precision M series"
#: ../rules/base.xml.in.h:54
-msgid "At bottom left"
-msgstr "Di kiri bawah"
+msgid "Dexxa Wireless Desktop Keyboard"
+msgstr "Papan Ketik Desktop Nirkabel Dexxa"
#: ../rules/base.xml.in.h:55
-msgid "At left of 'A'"
-msgstr "Di sebelah kiri 'A'"
+msgid "Diamond 9801 / 9802 series"
+msgstr "Diamond 9801 / 9802 series"
#: ../rules/base.xml.in.h:56
-msgid "Avatime"
-msgstr "Avatime"
+msgid "DTK2000"
+msgstr "DTK2000"
#: ../rules/base.xml.in.h:57
-msgid "Azerbaijani"
-msgstr "Ajarbaijan"
+msgid "Ennyah DKB-1008"
+msgstr "Ennyah DKB-1008"
#: ../rules/base.xml.in.h:58
-msgid "Azerbaijani (Cyrillic)"
-msgstr "Azerbaijan (Sirilik)"
+msgid "Fujitsu-Siemens Computers AMILO laptop"
+msgstr "Fujitsu-Siemens Computers AMILO laptop"
#: ../rules/base.xml.in.h:59
-msgid "Azona RF2300 wireless Internet Keyboard"
-msgstr "Papan Ketik Internet nirkabel Azona RF2300"
+msgid "Genius Comfy KB-16M / Genius MM Keyboard KWD-910"
+msgstr "Genius Comfy KB-16M / Genius MM Keyboard KWD-910"
#: ../rules/base.xml.in.h:60
-msgid "BTC 5090"
-msgstr "BTC 5090"
+msgid "Genius Comfy KB-12e"
+msgstr "Genius Comfy KB-12e"
#: ../rules/base.xml.in.h:61
-msgid "BTC 5113RF Multimedia"
-msgstr "BTC 5113RF Multimedia"
+msgid "Genius Comfy KB-21e-Scroll"
+msgstr "Genius Comfy KB-21e-Scroll"
#: ../rules/base.xml.in.h:62
-msgid "BTC 5126T"
-msgstr "BTC 5126T"
+msgid "Genius KB-19e NB"
+msgstr "Genius KB-19e NB"
#: ../rules/base.xml.in.h:63
-msgid "BTC 6301URF"
-msgstr "BTC 6301URF"
+msgid "Genius KKB-2050HS"
+msgstr "Genius KKB-2050HS"
#: ../rules/base.xml.in.h:64
-msgid "BTC 9000"
-msgstr "BTC 9000"
+msgid "Gyration"
+msgstr "Gyration"
#: ../rules/base.xml.in.h:65
-msgid "BTC 9000A"
-msgstr "BTC 9000A"
+msgid "HTC Dream"
+msgstr "HTC Dream"
#: ../rules/base.xml.in.h:66
-msgid "BTC 9001AH"
-msgstr "BTC 9001AH"
+msgid "Kinesis"
+msgstr "Kinesis"
#: ../rules/base.xml.in.h:67
-msgid "BTC 9019U"
-msgstr "BTC 9019U"
+msgid "Logitech Generic Keyboard"
+msgstr "Papan Ketik Generik Logitech"
#: ../rules/base.xml.in.h:68
-msgid "BTC 9116U Mini Wireless Internet and Gaming"
-msgstr "BTC 91116U Internet dan Permainan Nirkabel Mini"
+msgid "Logitech G15 extra keys via G15daemon"
+msgstr "Logitech G15 extra keys via G15daemon"
#: ../rules/base.xml.in.h:69
-msgid "Backslash"
-msgstr "Backslash"
+msgid "Hewlett-Packard Internet Keyboard"
+msgstr "Papan Ketik Internet Hewlett-Packard"
#: ../rules/base.xml.in.h:70
-msgid "Backslash chooses 3rd level, acts as onetime lock when pressed together with another 3rd-level-chooser"
-msgstr "Backslash memilih level ketiga, berfungsi sebagai kunci sekali jika ditekan bersamaan dengan pemilih-level-ketiga lainnya"
+msgid "Hewlett-Packard SK-250x Multimedia Keyboard"
+msgstr "Papan Ketik Multimedia Hewlett-Packard SK-2501"
#: ../rules/base.xml.in.h:71
-msgid "Bambara"
-msgstr "Bambara"
+msgid "Hewlett-Packard Omnibook XE3 GC"
+msgstr "Hewlett-Packard Omnibook XE3 GC"
#: ../rules/base.xml.in.h:72
-msgid "Bashkirian"
-msgstr "Bashkirian"
+msgid "Hewlett-Packard Omnibook XE3 GF"
+msgstr "Hewlett-Packard Omnibook XE3 GF"
#: ../rules/base.xml.in.h:73
-msgid "Belarusian"
-msgstr "Belarusia"
+msgid "Hewlett-Packard Omnibook XT1000"
+msgstr "Hewlett-Packard Omnibook XT1000"
#: ../rules/base.xml.in.h:74
-msgid "Belarusian (Latin)"
-msgstr "Belarusia (Latin)"
+msgid "Hewlett-Packard Pavilion dv5"
+msgstr "Hewlett-Packard Pavilion dv5"
#: ../rules/base.xml.in.h:75
-msgid "Belarusian (legacy)"
-msgstr "Belarusia (legacy)"
+msgid "Hewlett-Packard Pavilion ZT11xx"
+msgstr "Hewlett-Packard Pavilion ZT11xx"
#: ../rules/base.xml.in.h:76
-msgid "Belgian"
-msgstr "Belgia"
+msgid "Hewlett-Packard Omnibook 500 FA"
+msgstr "Hewlett-Packard Omnibook 500 FA"
#: ../rules/base.xml.in.h:77
-msgid "Belgian (ISO alternate)"
-msgstr "Belgia (alternatif ISO)"
+msgid "Hewlett-Packard Omnibook 5xx"
+msgstr "Hewlett-Packard Omnibook 5xx"
#: ../rules/base.xml.in.h:78
-msgid "Belgian (Sun dead keys)"
-msgstr "Belgia (tombol mati Sun)"
+msgid "Hewlett-Packard nx9020"
+msgstr "Hewlett-Packard nx9020"
#: ../rules/base.xml.in.h:79
-msgid "Belgian (Wang model 724 azerty)"
-msgstr "Belgia (Wang model 724 azerty)"
+msgid "Hewlett-Packard Omnibook 6000/6100"
+msgstr "Hewlett-Packard Omnibook 6000/6100"
#: ../rules/base.xml.in.h:80
-msgid "Belgian (alternative)"
-msgstr "Belgia (alternatif)"
+msgid "Honeywell Euroboard"
+msgstr "Honeywell Euroboard"
#: ../rules/base.xml.in.h:81
-msgid "Belgian (alternative, Sun dead keys)"
-msgstr "Belgia (alternatif, tombol mati Sun)"
+msgid "Hewlett-Packard Mini 110 Notebook"
+msgstr "Hewlett-Packard Mini 110 Notebook"
#: ../rules/base.xml.in.h:82
-msgid "Belgian (alternative, latin-9 only)"
-msgstr "Belgia (alternative, hanya latin-9)"
+msgid "IBM Rapid Access"
+msgstr "IBM Rapid Access"
#: ../rules/base.xml.in.h:83
-msgid "Belgian (eliminate dead keys)"
-msgstr "Belgia (hapus tombol mati)"
+msgid "IBM Rapid Access II"
+msgstr "IBM Rapid Access II"
#: ../rules/base.xml.in.h:84
-msgid "BenQ X-Touch"
-msgstr "BenQ X-Touch"
+msgid "IBM ThinkPad 560Z/600/600E/A22E"
+msgstr "IBM ThinkPad 560Z/600/600E/A22E"
#: ../rules/base.xml.in.h:85
-msgid "BenQ X-Touch 730"
-msgstr "BenQ X-Touch 730"
+msgid "IBM ThinkPad R60/T60/R61/T61"
+msgstr "IBM ThinkPad R60/T60/R61/T61"
#: ../rules/base.xml.in.h:86
-msgid "BenQ X-Touch 800"
-msgstr "BenQ X-Touch 800"
+msgid "IBM ThinkPad Z60m/Z60t/Z61m/Z61t"
+msgstr "IBM ThinkPad Z60m/Z60t/Z61m/Z61t"
#: ../rules/base.xml.in.h:87
-msgid "Bengali"
-msgstr "Bengali"
+msgid "IBM Space Saver"
+msgstr "IBM Space Saver"
#: ../rules/base.xml.in.h:88
-msgid "Bengali (India)"
-msgstr "Bengal (India)"
+msgid "Logitech Access Keyboard"
+msgstr "Logitech Access Keyboard"
#: ../rules/base.xml.in.h:89
-msgid "Bengali (India, Baishakhi Inscript)"
-msgstr "Bengali (India, Baishakhi Inscript)"
+msgid "Logitech Cordless Desktop LX-300"
+msgstr "Logitech Cordless Desktop LX-300"
#: ../rules/base.xml.in.h:90
-msgid "Bengali (India, Baishakhi)"
-msgstr "Bengali (India, Baishakhi)"
+msgid "Logitech Internet 350 Keyboard"
+msgstr "Papan Ketik Logitech Internet 350"
#: ../rules/base.xml.in.h:91
-msgid "Bengali (India, Bornona)"
-msgstr "Bengali (India, Bornona)"
+msgid "Logitech Media Elite Keyboard"
+msgstr "Papan Ketik Logitech Media Elite"
#: ../rules/base.xml.in.h:92
-msgid "Bengali (India, Probhat)"
-msgstr "Bengal (India, Probhat)"
+msgid "Logitech Cordless Desktop"
+msgstr "Logitech Cordless Desktop"
#: ../rules/base.xml.in.h:93
-msgid "Bengali (India, Uni Gitanjali)"
-msgstr "Bengali (India, Uni Gitanjali)"
+msgid "Logitech Cordless Desktop iTouch"
+msgstr "Logitech Cordless Desktop iTouch"
#: ../rules/base.xml.in.h:94
-msgid "Bengali (Probhat)"
-msgstr "Bengal (Probhat)"
+msgid "Logitech Cordless Desktop Navigator"
+msgstr "Logitech Cordless Desktop Navigator"
#: ../rules/base.xml.in.h:95
-msgid "Berber (Morocco, Tifinagh alternative phonetic)"
-msgstr "Berber (Maroko, fonetik alternatif Tifinagh)"
+msgid "Logitech Cordless Desktop Optical"
+msgstr "Logitech Cordless Desktop Optical"
#: ../rules/base.xml.in.h:96
-msgid "Berber (Morocco, Tifinagh alternative)"
-msgstr "Berber (Maroko, alternatif Tifinagh)"
+msgid "Logitech Cordless Desktop (alternate option)"
+msgstr "Logitech Cordless Desktop (pilihan alternatif)"
#: ../rules/base.xml.in.h:97
-msgid "Berber (Morocco, Tifinagh extended phonetic)"
-msgstr "Berber (Maroko, fonetik Tifinagh diperluas)"
+msgid "Logitech Cordless Desktop Pro (alternate option 2)"
+msgstr "Logitech Cordless Desktop Pro (opsi alternatif 2)"
#: ../rules/base.xml.in.h:98
-msgid "Berber (Morocco, Tifinagh extended)"
-msgstr "Berber (Maroko, Tifinagh diperluas)"
+msgid "Logitech Cordless Freedom/Desktop Navigator"
+msgstr "Logitech Cordless Freedom/Desktop Navigator"
#: ../rules/base.xml.in.h:99
-msgid "Berber (Morocco, Tifinagh phonetic)"
-msgstr "Berber (Maroko, fonetik Tifinagh)"
+msgid "Logitech iTouch Cordless Keyboard (model Y-RB6)"
+msgstr "Logitech iTouch Cordless Keyboard (model Y-RB6)"
#: ../rules/base.xml.in.h:100
-msgid "Berber (Morocco, Tifinagh)"
-msgstr "Berber (Morocco, Tifinagh)"
+msgid "Logitech Internet Keyboard"
+msgstr "Papan Ketik Internet Logitech"
#: ../rules/base.xml.in.h:101
-msgid "Bosnian"
-msgstr "Bosnia"
+msgid "Logitech iTouch"
+msgstr "Logitech iTouch"
#: ../rules/base.xml.in.h:102
-msgid "Bosnian (US keyboard with Bosnian digraphs)"
-msgstr "Bosnia (papan tik AS dengan digraf Bosnia)"
+msgid "Logitech Internet Navigator Keyboard"
+msgstr "Papan Ketik Navigator Internet Logitech"
#: ../rules/base.xml.in.h:103
-msgid "Bosnian (US keyboard with Bosnian letters)"
-msgstr "Bosnia (papan tik AS dengan huruf Bosnia)"
+msgid "Logitech Cordless Desktop EX110"
+msgstr "Logitech Cordless Desktop EX110"
#: ../rules/base.xml.in.h:104
-msgid "Bosnian (use Bosnian digraphs)"
-msgstr "Bosnia (gunakan diagraph Bosnia)"
+msgid "Logitech iTouch Internet Navigator Keyboard SE"
+msgstr "Logitech iTouch Internet Navigator Keyboard SE"
#: ../rules/base.xml.in.h:105
-msgid "Bosnian (use guillemets for quotes)"
-msgstr "Bosnia (gunakan guillemets untuk tanda petik)"
+msgid "Logitech iTouch Internet Navigator Keyboard SE (USB)"
+msgstr "Logitech iTouch Internet Navigator Keyboard SE (USB)"
#: ../rules/base.xml.in.h:106
-msgid "Both Alt keys together"
-msgstr "Kedua tombol Alt bersama"
+msgid "Logitech Ultra-X Keyboard"
+msgstr "Papan Ketik Logitech Ultra-X"
#: ../rules/base.xml.in.h:107
-msgid "Both Ctrl keys together"
-msgstr "Kedua tombol Ctrl bersama"
+msgid "Logitech Ultra-X Cordless Media Desktop Keyboard"
+msgstr "Papan Ketik Logitech Ultra-X Cordless Media Desktop"
#: ../rules/base.xml.in.h:108
-msgid "Both Shift keys together"
-msgstr "Kedua tombol Shift bersama"
+msgid "Logitech diNovo Keyboard"
+msgstr "Papan Ketik Logitech diNovo"
#: ../rules/base.xml.in.h:109
-msgid "Both Shift-Keys together activate Caps Lock, one Shift-Key deactivates"
-msgstr "Kedua tombol Shift bersamaan mengaktifkan Caps Lock, satu Tombol-Shift mematikannya"
+msgid "Logitech diNovo Edge Keyboard"
+msgstr "Papan Ketik Logitech diNovo Edge"
#: ../rules/base.xml.in.h:110
-msgid "Both Shift-Keys together toggle Caps Lock"
-msgstr "Kedua tombol Shift bersama ubah Caps Lock"
+msgid "Memorex MX1998"
+msgstr "Memorex MX1998"
#: ../rules/base.xml.in.h:111
-msgid "Both Shift-Keys together toggle ShiftLock"
-msgstr "Kedua tombol Shift bersama menjungkitkan ShiftLock"
+msgid "Memorex MX2500 EZ-Access Keyboard"
+msgstr "Papan Ketik Memorex MX2500 EZ-Access"
#: ../rules/base.xml.in.h:112
-msgid "Braille"
-msgstr "Braille"
+msgid "Memorex MX2750"
+msgstr "Memorex MX2750"
#: ../rules/base.xml.in.h:113
-msgid "Braille (left hand)"
-msgstr "Braille (tangan kiri)"
+msgid "Microsoft Natural Wireless Ergonomic Keyboard 4000"
+msgstr "Papan Tik Ergonomis Nirkabel Alami Microsoft 4000"
#: ../rules/base.xml.in.h:114
-msgid "Braille (right hand)"
-msgstr "Braille (tangan kanan)"
+msgid "Microsoft Natural Wireless Ergonomic Keyboard 7000"
+msgstr "Microsoft Natural Wireless Ergonomic Keyboard 7000"
#: ../rules/base.xml.in.h:115
-msgid "Brother Internet Keyboard"
-msgstr "Papan Tik Internet Brother"
+msgid "Microsoft Internet Keyboard"
+msgstr "Papan Ketik Internet Microsoft"
#: ../rules/base.xml.in.h:116
-msgid "Bulgarian"
-msgstr "Bulgaria"
+msgid "Microsoft Natural Keyboard Pro / Microsoft Internet Keyboard Pro"
+msgstr "Microsoft Natural Keyboard Pro / Microsoft Internet Keyboard Pro"
#: ../rules/base.xml.in.h:117
-msgid "Bulgarian (new phonetic)"
-msgstr "Bulgaria (fonetik baru)"
+msgid "Microsoft Natural Keyboard Pro USB / Microsoft Internet Keyboard Pro"
+msgstr "Microsoft Natural Keyboard Pro USB / Microsoft Internet Keyboard Pro"
#: ../rules/base.xml.in.h:118
-msgid "Bulgarian (traditional phonetic)"
-msgstr "Bulgaria (fonetik tradisional)"
+msgid "Microsoft Natural Keyboard Pro OEM"
+msgstr "Microsoft Natural Keyboard Pro OEM"
#: ../rules/base.xml.in.h:119
-msgid "Burmese"
-msgstr "Burma"
+msgid "ViewSonic KU-306 Internet Keyboard"
+msgstr "Papan Ketik Internet ViewSonic KU-306"
#: ../rules/base.xml.in.h:120
-msgid "Cameroon Multilingual (Dvorak)"
-msgstr "Kamerun Multibahasa (Dvorak)"
+msgid "Microsoft Internet Keyboard Pro, Swedish"
+msgstr "Microsoft Internet Keyboard Pro, Swedia"
#: ../rules/base.xml.in.h:121
-msgid "Cameroon Multilingual (azerty)"
-msgstr "Kamerun Multibahasa (azerty)"
+msgid "Microsoft Office Keyboard"
+msgstr "Papan Ketik Microsoft Office"
#: ../rules/base.xml.in.h:122
-msgid "Cameroon Multilingual (qwerty)"
-msgstr "Kamerun Multibahasa (qwerty)"
+msgid "Microsoft Wireless Multimedia Keyboard 1.0A"
+msgstr "Microsoft Wireless Multimedia Keyboard 1.0A"
#: ../rules/base.xml.in.h:123
-msgid "Canadian Multilingual"
-msgstr "Kanada Multibahasa"
+msgid "Microsoft Natural Keyboard Elite"
+msgstr "Microsoft Natural Keyboard Elite"
#: ../rules/base.xml.in.h:124
-msgid "Canadian Multilingual (first part)"
-msgstr "Kanada Multibahasa (bagian pertama)"
+msgid "Microsoft Comfort Curve Keyboard 2000"
+msgstr "Microsoft Comfort Curve Keyboard 2000"
#: ../rules/base.xml.in.h:125
-msgid "Canadian Multilingual (second part)"
-msgstr "Kanada Multibahasa (bagian kedua)"
+msgid "Ortek MCK-800 MM/Internet keyboard"
+msgstr "Ortek MCK-800 MM/Internet keyboard"
#: ../rules/base.xml.in.h:126
-msgid "Caps Lock"
-msgstr "Caps Lock"
+msgid "Propeller Voyager (KTEZ-1000)"
+msgstr "Propeller Voyager (KTEZ-1000)"
#: ../rules/base.xml.in.h:127
-msgid "Caps Lock (to first layout), Shift+Caps Lock (to last layout)"
-msgstr "Caps Lock (ke tata letak pertama), Shift+Caps Lock (ke tata letak terakhir)"
+msgid "QTronix Scorpius 98N+"
+msgstr "QTronix Scorpius 98N+"
#: ../rules/base.xml.in.h:128
-msgid "Caps Lock (while pressed), Alt+Caps Lock does the original capslock action"
-msgstr "Caps Lock (ketika ditekan), Alt+Caps Lock melakukan aksi capslock asli"
+msgid "Samsung SDM 4500P"
+msgstr "Samsung SDM 4500P"
#: ../rules/base.xml.in.h:129
-msgid "Caps Lock acts as Shift with locking. Shift \"pauses\" Caps Lock"
-msgstr "Caps Lock bertindak sebagai Shift dengan mengunci. Shift \"jeda\" Caps Lock."
+msgid "Samsung SDM 4510P"
+msgstr "Samsung SDM 4510P"
#: ../rules/base.xml.in.h:130
-msgid "Caps Lock acts as Shift with locking. Shift doesn't affect Caps Lock"
-msgstr "Caps Lock bertindak sebagai Shift yang terkunci. Shift tidak mempengaruhi Caps Lock"
+msgid "Sanwa Supply SKB-KG3"
+msgstr "Sanwa Supply SKB-KG3"
#: ../rules/base.xml.in.h:131
-msgid "Caps Lock as Ctrl"
-msgstr "Caps Lock sebagai Ctrl"
+msgid "SK-1300"
+msgstr "SK-1300"
#: ../rules/base.xml.in.h:132
-msgid "Caps Lock chooses 3rd level, acts as onetime lock when pressed together with another 3rd-level-chooser"
-msgstr "Caps Lock memilih level ketiga, berfungsi sebagai kunci sekali jika ditekan bersamaan dengan pemilih-level-ketiga lainnya"
+msgid "SK-2500"
+msgstr "SK-2500"
#: ../rules/base.xml.in.h:133
-msgid "Caps Lock is disabled"
-msgstr "Caps Lock dinonaktifkan"
+msgid "SK-6200"
+msgstr "SK-6200"
#: ../rules/base.xml.in.h:134
-msgid "Caps Lock key behavior"
-msgstr "Perilaku tombol Caps Lock"
+msgid "SK-7100"
+msgstr "SK-7100"
#: ../rules/base.xml.in.h:135
-msgid "Caps Lock toggles Shift so all keys are affected"
-msgstr "Caps Lock mengubah Shift sehingga semua tombol terpengaruh"
+msgid "Super Power Multimedia Keyboard"
+msgstr "Super Power Multimedia Keyboard"
#: ../rules/base.xml.in.h:136
-msgid "Caps Lock toggles normal capitalization of alphabetic characters"
-msgstr "Caps Lock mengubah huruf besar normal atau karakter secara alfabetis"
+msgid "SVEN Ergonomic 2500"
+msgstr "SVEN Ergonomic 2500"
#: ../rules/base.xml.in.h:137
-msgid "Caps Lock uses internal capitalization. Shift \"pauses\" Caps Lock"
-msgstr "Caps Lock menggunakan huruf besar internal. Shift \"pauses\" Caps Lock"
+msgid "SVEN Slim 303"
+msgstr "SVEN Slim 303"
#: ../rules/base.xml.in.h:138
-msgid "Caps Lock uses internal capitalization. Shift doesn't affect Caps Lock"
-msgstr "Caps Lock menggunakan huruf besar internal. Shift tidak mempengaruhi Caps Lock"
+msgid "Symplon PaceBook (tablet PC)"
+msgstr "Symplon PaceBook (tablet PC)"
#: ../rules/base.xml.in.h:139
-msgid "Catalan"
-msgstr "Katala"
+msgid "Toshiba Satellite S3000"
+msgstr "Toshiba Satellite S3000"
#: ../rules/base.xml.in.h:140
-msgid "Catalan (Spain, with middle-dot L)"
-msgstr "Katala (Spanyol, dengan titik-tengah pada L)"
+msgid "Trust Wireless Keyboard Classic"
+msgstr "Trust Wireless Keyboard Classic"
#: ../rules/base.xml.in.h:141
-msgid "Cherokee"
-msgstr "Cherokee"
+msgid "Trust Direct Access Keyboard"
+msgstr "Trust Direct Access Keyboard"
#: ../rules/base.xml.in.h:142
-msgid "Cherry B.UNLIMITED"
-msgstr "Cherry B.UNLIMITED"
+msgid "Trust Slimline"
+msgstr "Trust Slimline"
#: ../rules/base.xml.in.h:143
-msgid "Cherry Blue Line CyBo@rd"
-msgstr "Cherry Blue Line CyBo@rd"
+msgid "TypeMatrix EZ-Reach 2020"
+msgstr "TypeMatrix EZ-Reach 2020"
#: ../rules/base.xml.in.h:144
-msgid "Cherry Blue Line CyBo@rd (alternate option)"
-msgstr "Cherry Blue Line CyBo@rd (alternate option)"
+msgid "TypeMatrix EZ-Reach 2030 PS2"
+msgstr "TypeMatrix EZ-Reach 2030 PS2"
#: ../rules/base.xml.in.h:145
-msgid "Cherry CyBo@rd USB-Hub"
-msgstr "Cherry CyBo@rd USB-Hub"
+msgid "TypeMatrix EZ-Reach 2030 USB"
+msgstr "TypeMatrix EZ-Reach 2030 USB"
#: ../rules/base.xml.in.h:146
-msgid "Cherry CyMotion Expert"
-msgstr "Cherry CyMotion Expert"
+msgid "TypeMatrix EZ-Reach 2030 USB (102/105:EU mode)"
+msgstr "TypeMatrix EZ-Reach 2030 USB (mode 102/105:EU)"
#: ../rules/base.xml.in.h:147
-msgid "Cherry CyMotion Master Linux"
-msgstr "Cherry CyMotion Master Linux"
+msgid "TypeMatrix EZ-Reach 2030 USB (106:JP mode)"
+msgstr "TypeMatrix EZ-Reach 2030 USB (mode 106:JP)"
#: ../rules/base.xml.in.h:148
-msgid "Cherry CyMotion Master XPress"
-msgstr "Cherry CyMotion Master XPress"
+msgid "Yahoo! Internet Keyboard"
+msgstr "Papan Ketik Internet Yahoo!"
#: ../rules/base.xml.in.h:149
-msgid "Chicony Internet Keyboard"
-msgstr "Papan Tik Internet Chicony"
+msgid "MacBook/MacBook Pro"
+msgstr "MacBook/MacBook Pro"
#: ../rules/base.xml.in.h:150
-msgid "Chicony KB-9885"
-msgstr "Chicony KB-9885"
+msgid "MacBook/MacBook Pro (Intl)"
+msgstr "MacBook/MacBook Pro (Intl)"
#: ../rules/base.xml.in.h:151
-msgid "Chicony KU-0108"
-msgstr "Chicony KU-0108"
+msgid "Macintosh"
+msgstr "Macintosh"
#: ../rules/base.xml.in.h:152
-msgid "Chicony KU-0420"
-msgstr "Chicony KU-0420"
+msgid "Macintosh Old"
+msgstr "Macintosh Old"
#: ../rules/base.xml.in.h:153
-msgid "Chinese"
-msgstr "Cina"
+msgid "Happy Hacking Keyboard for Mac"
+msgstr "Happy Hacking Keyboard untuk Mac"
#: ../rules/base.xml.in.h:154
-msgid "Chuvash"
-msgstr "Chuvash"
+msgid "Acer C300"
+msgstr "Acer C300"
#: ../rules/base.xml.in.h:155
-msgid "Chuvash (Latin)"
-msgstr "Chuvash (Latin)"
+msgid "Acer Ferrari 4000"
+msgstr "Acer Ferrari 4000"
#: ../rules/base.xml.in.h:156
-msgid "Classmate PC"
-msgstr "Classmate PC"
+msgid "Acer Laptop"
+msgstr "Laptop Acer"
#: ../rules/base.xml.in.h:157
-msgid "CloGaelach"
-msgstr "CloGaelach"
+msgid "Asus Laptop"
+msgstr "Laptop Asus"
#: ../rules/base.xml.in.h:158
-msgid "Compaq Easy Access Keyboard"
-msgstr "Papan Ketik Akses Mudah Compaq"
+msgid "Apple"
+msgstr "Apple"
#: ../rules/base.xml.in.h:159
-msgid "Compaq Internet Keyboard (13 keys)"
-msgstr "Papan Ketik Internet Compaq (13 tombol)"
+msgid "Apple Laptop"
+msgstr "Laptop Apple"
#: ../rules/base.xml.in.h:160
-msgid "Compaq Internet Keyboard (18 keys)"
-msgstr "Papan Ketik Internet Compaq (18 tombol)"
+msgid "Apple Aluminium Keyboard (ANSI)"
+msgstr "Papan Ketik Aluminium Apple (ANSI)"
#: ../rules/base.xml.in.h:161
-msgid "Compaq Internet Keyboard (7 keys)"
-msgstr "Papan Ketik Internet Compaq (7 tombol)"
+msgid "Apple Aluminium Keyboard (ISO)"
+msgstr "Papan Ketik Aluminium (ISO)"
#: ../rules/base.xml.in.h:162
-msgid "Compaq iPaq Keyboard"
-msgstr "Papan Ketik Compaq iPaq"
+msgid "Apple Aluminium Keyboard (JIS)"
+msgstr "Papan Ketik Aluminium (JIS)"
#: ../rules/base.xml.in.h:163
-msgid "Compose key position"
-msgstr "Posisi tombol Compose"
+msgid "SILVERCREST Multimedia Wireless Keyboard"
+msgstr "Papan Ketik SILVERCREST Multimedia Wireless"
#: ../rules/base.xml.in.h:164
-msgid "Control + Alt + Backspace"
-msgstr "Control + Alt + Backspace"
+msgid "Laptop/notebook eMachines m68xx"
+msgstr "Laptop/notebook eMachines m68xx"
#: ../rules/base.xml.in.h:165
-msgid "Control is mapped to Alt keys, Alt is mapped to Win keys"
-msgstr "Kendali dipetakan ke tombol Alt, Alt dipetakan ke tombol Win"
+msgid "BenQ X-Touch"
+msgstr "BenQ X-Touch"
#: ../rules/base.xml.in.h:166
-msgid "Control is mapped to Win keys (and the usual Ctrl keys)"
-msgstr "Kendali dipetakan ke tombol Win ( dan tombol Ctrl biasa)"
+msgid "BenQ X-Touch 730"
+msgstr "BenQ X-Touch 730"
#: ../rules/base.xml.in.h:167
-msgid "Creative Desktop Wireless 7000"
-msgstr "Creative Desktop Wireless 7000"
+msgid "BenQ X-Touch 800"
+msgstr "BenQ X-Touch 800"
#: ../rules/base.xml.in.h:168
-msgid "Crimean Tatar (Turkish Alt-Q)"
-msgstr "Crimean Tatar (Turkish Alt-Q)"
+msgid "Happy Hacking Keyboard"
+msgstr "Happy Hacking Keyboard"
#: ../rules/base.xml.in.h:169
-msgid "Crimean Tatar (Turkish F)"
-msgstr "Crimean Tatar (Turkish F)"
+msgid "Classmate PC"
+msgstr "Classmate PC"
#: ../rules/base.xml.in.h:170
-msgid "Crimean Tatar (Turkish Q)"
-msgstr "Crimean Tatar (Turkish Q)"
+msgid "OLPC"
+msgstr "OLPC"
#: ../rules/base.xml.in.h:171
-msgid "Croatian"
-msgstr "Kroasia"
+msgid "Sun Type 7 USB"
+msgstr "Sun Type 7 USB"
#: ../rules/base.xml.in.h:172
-msgid "Croatian (US keyboard with Croatian digraphs)"
-msgstr "Kroasia (papan tik AS dengan digraf Kroasia)"
+msgid "Sun Type 7 USB (European layout)"
+msgstr "Sun Type 7 USB (tata letak Eropa)"
#: ../rules/base.xml.in.h:173
-msgid "Croatian (US keyboard with Croatian letters)"
-msgstr "Kroasia (papan tik AS dengan huruf Kroasia)"
+msgid "Sun Type 7 USB (Unix layout)"
+msgstr "Sun Type 7 USB (tata letak Unix)"
#: ../rules/base.xml.in.h:174
-msgid "Croatian (use Croatian digraphs)"
-msgstr "Kroasis (gunakan diagraph Kroasia)"
+msgid "Sun Type 7 USB (Japanese layout) / Japanese 106-key"
+msgstr "Sun Type 7 USB (tata letak Jepang) / Jepang 106-tombol"
#: ../rules/base.xml.in.h:175
-msgid "Croatian (use guillemets for quotes)"
-msgstr "Kroasia (gunakan guillemets untuk tanda petik)"
+msgid "Sun Type 6/7 USB"
+msgstr "Sun Type 6/7 USB"
#: ../rules/base.xml.in.h:176
-msgid "Ctrl key position"
-msgstr "Posisi tombol Ctrl"
+msgid "Sun Type 6/7 USB (European layout)"
+msgstr "Sun Type 6/7 USB (tata letak Eropa)"
#: ../rules/base.xml.in.h:177
-msgid "Ctrl+Shift"
-msgstr "Ctrl+Shift"
+msgid "Sun Type 6 USB (Unix layout)"
+msgstr "Sun Type 6 USB (tata letak Unix)"
#: ../rules/base.xml.in.h:178
-msgid "Czech"
-msgstr "Ceko"
+msgid "Sun Type 6 USB (Japanese layout)"
+msgstr "Sun Type 6 USB (tata letak Jepang)"
#: ../rules/base.xml.in.h:179
-msgid "Czech (UCW layout, accented letters only)"
-msgstr "Ceko (tata letak UCW, hanya huruf beraksen)"
+msgid "Sun Type 6 (Japanese layout)"
+msgstr "Sun Type 6 (tata letak Jepang)"
#: ../rules/base.xml.in.h:180
-msgid "Czech (US Dvorak with CZ UCW support)"
-msgstr "Ceko (Dvorak AS dengan dukungan CZ UCW)"
+msgid "Targa Visionary 811"
+msgstr "Targa Visionary 811"
#: ../rules/base.xml.in.h:181
-msgid "Czech (qwerty)"
-msgstr "Ceko (qwerty)"
+msgid "Unitek KB-1925"
+msgstr "Unitek KB-1925"
#: ../rules/base.xml.in.h:182
-msgid "Czech (qwerty, extended Backslash)"
-msgstr "Ceko (qwerty, Backslash diperpanjang)"
+msgid "FL90"
+msgstr "FL90"
#: ../rules/base.xml.in.h:183
-msgid "Czech (with &lt;\\|&gt; key)"
-msgstr "Ceko (dengan tombol &lt;\\|&gt;)"
+msgid "Creative Desktop Wireless 7000"
+msgstr "Creative Desktop Wireless 7000"
#: ../rules/base.xml.in.h:184
-msgid "DTK2000"
-msgstr "DTK2000"
-
-#: ../rules/base.xml.in.h:185
-msgid "Danish"
-msgstr "Denmark"
-
-#: ../rules/base.xml.in.h:186
-msgid "Danish (Dvorak)"
-msgstr "Denmark (Dvorak)"
+msgid "Htc Dream phone"
+msgstr "Telepon Htc Dream"
-#: ../rules/base.xml.in.h:187
-msgid "Danish (Macintosh)"
-msgstr "Denmark (Macintosh)"
+#. Keyboard indicator for English layouts
+#: ../rules/base.xml.in.h:186 ../rules/base.extras.xml.in.h:33
+msgid "en"
+msgstr "en"
-#: ../rules/base.xml.in.h:188
-msgid "Danish (Macintosh, eliminate dead keys)"
-msgstr "Denmark (Macintosh, hapus tombol mati"
+#: ../rules/base.xml.in.h:187 ../rules/base.extras.xml.in.h:34
+msgid "English (US)"
+msgstr "Inggris (AS)"
+#. Keyboard indicator for Cherokee layouts
#: ../rules/base.xml.in.h:189
-msgid "Danish (eliminate dead keys)"
-msgstr "Denmark (hapus tombol mati"
+msgid "chr"
+msgstr "chr"
#: ../rules/base.xml.in.h:190
-msgid "Default numeric keypad keys"
-msgstr "Tombol angka keypad standar"
+msgid "Cherokee"
+msgstr "Cherokee"
#: ../rules/base.xml.in.h:191
-msgid "Dell"
-msgstr "Dell"
+msgid "English (US, with euro on 5)"
+msgstr "Inggris (AS, dengan euro pada 5)"
#: ../rules/base.xml.in.h:192
-msgid "Dell 101-key PC"
-msgstr "PC 101-tombol Dell"
+msgid "English (US, international with dead keys)"
+msgstr "Inggris (AS, internasional dengan tombol mati)"
#: ../rules/base.xml.in.h:193
-msgid "Dell Laptop/notebook Inspiron 6xxx/8xxx"
-msgstr "Dell Laptop/notebook Inspiron 6xxx/8xxx"
+msgid "English (US, alternative international)"
+msgstr "Inggris (AS, internasional alternatif)"
#: ../rules/base.xml.in.h:194
-msgid "Dell Laptop/notebook Precision M series"
-msgstr "Dell Laptop/notebook Precision M series"
+msgid "English (Colemak)"
+msgstr "Inggris (Colemak)"
#: ../rules/base.xml.in.h:195
-msgid "Dell Latitude series laptop"
-msgstr "Laptop seri Dell Latitude"
+msgid "English (Dvorak)"
+msgstr "Inggris (Dvorak)"
#: ../rules/base.xml.in.h:196
-msgid "Dell Precision M65"
-msgstr "Dell Precision M65"
+msgid "English (Dvorak, international with dead keys)"
+msgstr "Inggris (Dvorak, internasional dengan tombol mati)"
#: ../rules/base.xml.in.h:197
-msgid "Dell SK-8125"
-msgstr "Dell SK-8125"
+msgid "English (Dvorak alternative international no dead keys)"
+msgstr "Inggris (Dvorak alternatif Internasional tanpa tombol mati)"
#: ../rules/base.xml.in.h:198
-msgid "Dell SK-8135"
-msgstr "Dell SK-8135"
+msgid "English (left handed Dvorak)"
+msgstr "Inggris (Dvorak kidal)"
#: ../rules/base.xml.in.h:199
-msgid "Dell USB Multimedia Keyboard"
-msgstr "Papan Ketik Multimedia USB Dell"
+msgid "English (right handed Dvorak)"
+msgstr "Inggris (Dvorak tangan kanan)"
#: ../rules/base.xml.in.h:200
-msgid "Dexxa Wireless Desktop Keyboard"
-msgstr "Papan Ketik Desktop Nirkabel Dexxa"
+msgid "English (classic Dvorak)"
+msgstr "Inggris (Dvorak klasik)"
#: ../rules/base.xml.in.h:201
-msgid "Dhivehi"
-msgstr "Dhivehi"
-
-#: ../rules/base.xml.in.h:202
-msgid "Diamond 9801 / 9802 series"
-msgstr "Diamond 9801 / 9802 series"
+msgid "English (programmer Dvorak)"
+msgstr "Inggris (Dvorak pemrogram)"
-#: ../rules/base.xml.in.h:203
-msgid "Dutch"
-msgstr "Belanda"
+#. Keyboard indicator for Russian layouts
+#: ../rules/base.xml.in.h:203 ../rules/base.extras.xml.in.h:55
+msgid "ru"
+msgstr "ru"
#: ../rules/base.xml.in.h:204
-msgid "Dutch (Macintosh)"
-msgstr "Belanda (Macintosh)"
+msgid "Russian (US, phonetic)"
+msgstr "Rusia (AS, fonetik)"
#: ../rules/base.xml.in.h:205
-msgid "Dutch (Sun dead keys)"
-msgstr "Belanda (tombol mati Sun)"
+msgid "English (Macintosh)"
+msgstr "Inggris (Macintosh)"
#: ../rules/base.xml.in.h:206
-msgid "Dutch (standard)"
-msgstr "Belanda (standar)"
+msgid "English (international AltGr dead keys)"
+msgstr "Inggris (internasional AltGr tombol mati)"
#: ../rules/base.xml.in.h:207
-msgid "Dzongkha"
-msgstr "Dzongkha"
+msgid "English (the divide/multiply keys toggle the layout)"
+msgstr "Inggris (tombol bagi/kali menjungkitkan tata letak)"
#: ../rules/base.xml.in.h:208
-msgid "Enable extra typographic characters"
-msgstr "Aktifkan karakter tipografi ekstra"
+msgid "Serbo-Croatian (US)"
+msgstr "Serbo-Kroasia (AS)"
#: ../rules/base.xml.in.h:209
-msgid "English (Cameroon)"
-msgstr "Inggris (Kamerun)"
+msgid "English (Workman)"
+msgstr "Inggris (Workman)"
#: ../rules/base.xml.in.h:210
-msgid "English (Canada)"
-msgstr "Inggris (Kanada)"
+msgid "English (Workman, international with dead keys)"
+msgstr "Inggris (Workman,internasional dengan tombol mati)"
-#: ../rules/base.xml.in.h:211
-msgid "English (Colemak)"
-msgstr "Inggris (Colemak)"
-
-#: ../rules/base.xml.in.h:212
-msgid "English (Dvorak alternative international no dead keys)"
-msgstr "Inggris (Dvorak alternatif Internasional tanpa tombol mati)"
+#. Keyboard indicator for Persian layouts
+#: ../rules/base.xml.in.h:212 ../rules/base.extras.xml.in.h:15
+msgid "fa"
+msgstr "fa"
#: ../rules/base.xml.in.h:213
-msgid "English (Dvorak international with dead keys)"
-msgstr "Inggris (Dvorak internasional dengan tombol mati)"
-
-#: ../rules/base.xml.in.h:214
-msgid "English (Dvorak)"
-msgstr "Inggris (Dvorak)"
+msgid "Afghani"
+msgstr "Afganistan"
+#. Keyboard indicator for Pashto layouts
#: ../rules/base.xml.in.h:215
-msgid "English (Ghana)"
-msgstr "Inggris (Ghana)"
+msgid "ps"
+msgstr "ps"
#: ../rules/base.xml.in.h:216
-msgid "English (Ghana, GILLBT)"
-msgstr "Inggris (Ghana, GILLBT)"
-
-#: ../rules/base.xml.in.h:217
-msgid "English (Ghana, multilingual)"
-msgstr "Inggris (Ghana, multibahasa)"
+msgid "Pashto"
+msgstr "Pashto"
+#. Keyboard indicator for Uzbek layouts
#: ../rules/base.xml.in.h:218
-msgid "English (India, with RupeeSign)"
-msgstr "English (India, dengan RupeeSign)"
+msgid "uz"
+msgstr "uz"
#: ../rules/base.xml.in.h:219
-msgid "English (Macintosh)"
-msgstr "Inggris (Macintosh)"
+msgid "Uzbek (Afghanistan)"
+msgstr "Uzbek (Afghanistan)"
#: ../rules/base.xml.in.h:220
-msgid "English (Mali, US Macintosh)"
-msgstr "Inggris (Mali, Macintosh AS)"
+msgid "Pashto (Afghanistan, OLPC)"
+msgstr "Pashto (Afghanistan, OLPC)"
#: ../rules/base.xml.in.h:221
-msgid "English (Mali, US international)"
-msgstr "Inggris (Mali, Internasional AS)"
+msgid "Persian (Afghanistan, Dari OLPC)"
+msgstr "Persia (Afghanistan, Dari OLPC)"
#: ../rules/base.xml.in.h:222
-msgid "English (Nigeria)"
-msgstr "Inggris (Nigeria)"
-
-#: ../rules/base.xml.in.h:223
-msgid "English (South Africa)"
-msgstr "Inggris (Afrika Selatan)"
+msgid "Uzbek (Afghanistan, OLPC)"
+msgstr "Uzbek (Afghanistan, OLPC)"
-#: ../rules/base.xml.in.h:224
-msgid "English (UK)"
-msgstr "Inggris (Britania)"
+#. Keyboard indicator for Arabic layouts
+#: ../rules/base.xml.in.h:224 ../rules/base.extras.xml.in.h:65
+msgid "ar"
+msgstr "ar"
-#: ../rules/base.xml.in.h:225
-msgid "English (UK, Colemak)"
-msgstr "Inggris (UK, Colemak)"
+#: ../rules/base.xml.in.h:225 ../rules/base.extras.xml.in.h:66
+msgid "Arabic"
+msgstr "Arab"
#: ../rules/base.xml.in.h:226
-msgid "English (UK, Dvorak with UK punctuation)"
-msgstr "Inggris (Britania, Dvorak dengan pungtuasi Britania)"
+msgid "Arabic (azerty)"
+msgstr "Arab (azerty)"
#: ../rules/base.xml.in.h:227
-msgid "English (UK, Dvorak)"
-msgstr "Inggris (Britania, Dvorak)"
+msgid "Arabic (azerty/digits)"
+msgstr "Arab (azerty/digit)"
#: ../rules/base.xml.in.h:228
-msgid "English (UK, Macintosh international)"
-msgstr "Inggris (Britania, Macintosh internasional)"
+msgid "Arabic (digits)"
+msgstr "Arab (digits)"
#: ../rules/base.xml.in.h:229
-msgid "English (UK, Macintosh)"
-msgstr "Inggris (Britania, Macintosh)"
+msgid "Arabic (qwerty)"
+msgstr "Arab (qwerty)"
#: ../rules/base.xml.in.h:230
-msgid "English (UK, extended WinKeys)"
-msgstr "Inggris (Britania, Winkeys diperluas)"
+msgid "Arabic (qwerty/digits)"
+msgstr "Arab (qwerty/digit)"
#: ../rules/base.xml.in.h:231
-msgid "English (UK, international with dead keys)"
-msgstr "Inggris (Britania, internasional dengan tombol mati)"
-
-#: ../rules/base.xml.in.h:232 ../rules/base.extras.xml.in.h:8
-msgid "English (US)"
-msgstr "Inggris (AS)"
+msgid "Arabic (Buckwalter)"
+msgstr "Arab (Buckwalter)"
+#. Keyboard indicator for Albanian layouts
#: ../rules/base.xml.in.h:233
-msgid "English (US, alternative international)"
-msgstr "Inggris (AS, internasional alternatif)"
+msgid "sq"
+msgstr "sq"
#: ../rules/base.xml.in.h:234
-msgid "English (US, international with dead keys)"
-msgstr "Inggris (AS, internasional dengan tombol mati)"
-
-#: ../rules/base.xml.in.h:235
-msgid "English (US, with euro on 5)"
-msgstr "Inggris (AS, dengan euro pada 5)"
+msgid "Albanian"
+msgstr "Albania"
-#: ../rules/base.xml.in.h:236
-msgid "English (classic Dvorak)"
-msgstr "Inggris (Dvorak klasik)"
+#. Keyboard indicator for Armenian layouts
+#: ../rules/base.xml.in.h:236 ../rules/base.extras.xml.in.h:59
+msgid "hy"
+msgstr "hy"
-#: ../rules/base.xml.in.h:237
-msgid "English (international AltGr dead keys)"
-msgstr "Inggris (internasional AltGr tombol mati)"
+#: ../rules/base.xml.in.h:237 ../rules/base.extras.xml.in.h:60
+msgid "Armenian"
+msgstr "Armenia"
#: ../rules/base.xml.in.h:238
-msgid "English (layout toggle on multiply/divide key)"
-msgstr "Inggris (ubah tata letak pada tombol perkalian/pembagian)"
+msgid "Armenian (phonetic)"
+msgstr "Armenia (fonetik)"
#: ../rules/base.xml.in.h:239
-msgid "English (left handed Dvorak)"
-msgstr "Inggris (Dvorak kidal)"
+msgid "Armenian (alternative phonetic)"
+msgstr "Armenia (fonetik alternatif)"
#: ../rules/base.xml.in.h:240
-msgid "English (programmer Dvorak)"
-msgstr "Inggris (Dvorak pemrogram)"
+msgid "Armenian (eastern)"
+msgstr "Armenia (timur)"
#: ../rules/base.xml.in.h:241
-msgid "English (right handed Dvorak)"
-msgstr "Inggris (Dvorak tangan kanan)"
+msgid "Armenian (western)"
+msgstr "Armenia (barat)"
#: ../rules/base.xml.in.h:242
-msgid "Ennyah DKB-1008"
-msgstr "Ennyah DKB-1008"
-
-#: ../rules/base.xml.in.h:243
-msgid "Enter on keypad"
-msgstr "Enter pada keypad"
+msgid "Armenian (alternative eastern)"
+msgstr "Armenia (timur alternatif)"
-#: ../rules/base.xml.in.h:244
-msgid "Esperanto"
-msgstr "Esperanto"
+#. Keyboard indicator for German layouts
+#: ../rules/base.xml.in.h:244 ../rules/base.extras.xml.in.h:10
+msgid "de"
+msgstr "de"
#: ../rules/base.xml.in.h:245
-msgid "Esperanto (Portugal, Nativo)"
-msgstr "Esperanto (Portugal, Nativo)"
+msgid "German (Austria)"
+msgstr "Jerman (Austria)"
#: ../rules/base.xml.in.h:246
-msgid "Esperanto (displaced semicolon and quote, obsolete)"
-msgstr "Esperanto (titik koma dan tanda kutip tergeser, kuno)"
+msgid "German (Austria, eliminate dead keys)"
+msgstr "Jerman (Austria, hapus tombol mati)"
#: ../rules/base.xml.in.h:247
-msgid "Estonian"
-msgstr "Estonia"
+msgid "German (Austria, Sun dead keys)"
+msgstr "Jerman (Austria, tombol mati Sun)"
#: ../rules/base.xml.in.h:248
-msgid "Estonian (Dvorak)"
-msgstr "Estonia (Dvorak)"
-
-#: ../rules/base.xml.in.h:249
-msgid "Estonian (US keyboard with Estonian letters)"
-msgstr "Estonia (papan tik AS dengan huruf Estonia)"
+msgid "German (Austria, Macintosh)"
+msgstr "Jerman (Austria, Macintosh)"
+#. Keyboard indicator for Azerbaijani layouts
#: ../rules/base.xml.in.h:250
-msgid "Estonian (eliminate dead keys)"
-msgstr "Estonia (hapus tombol mati)"
+msgid "az"
+msgstr "az"
#: ../rules/base.xml.in.h:251
-msgid "Euro on 2"
-msgstr "Euro pada 2"
+msgid "Azerbaijani"
+msgstr "Ajarbaijan"
#: ../rules/base.xml.in.h:252
-msgid "Euro on 4"
-msgstr "Euro pada 4"
-
-#: ../rules/base.xml.in.h:253
-msgid "Euro on 5"
-msgstr "Euro pada 5"
+msgid "Azerbaijani (Cyrillic)"
+msgstr "Azerbaijan (Sirilik)"
+#. Keyboard indicator for Belarusian layouts
#: ../rules/base.xml.in.h:254
-msgid "Euro on E"
-msgstr "Euro pada E"
+msgid "by"
+msgstr "by"
#: ../rules/base.xml.in.h:255
-msgid "Everex STEPnote"
-msgstr "Everex STEPnote"
+msgid "Belarusian"
+msgstr "Belarusia"
#: ../rules/base.xml.in.h:256
-msgid "Ewe"
-msgstr "Ewe"
+msgid "Belarusian (legacy)"
+msgstr "Belarusia (legacy)"
#: ../rules/base.xml.in.h:257
-msgid "FL90"
-msgstr "FL90"
-
-#: ../rules/base.xml.in.h:258
-msgid "Faroese"
-msgstr "Faro"
+msgid "Belarusian (Latin)"
+msgstr "Belarusia (Latin)"
-#: ../rules/base.xml.in.h:259
-msgid "Faroese (eliminate dead keys)"
-msgstr "Faro (hapus tombol mati)"
+#. Keyboard indicator for Belgian layouts
+#: ../rules/base.xml.in.h:259 ../rules/base.extras.xml.in.h:68
+msgid "be"
+msgstr "be"
-#: ../rules/base.xml.in.h:260
-msgid "Filipino"
-msgstr "Filipina"
+#: ../rules/base.xml.in.h:260 ../rules/base.extras.xml.in.h:69
+msgid "Belgian"
+msgstr "Belgia"
#: ../rules/base.xml.in.h:261
-msgid "Filipino (Capewell-Dvorak Baybayin)"
-msgstr "Filipina (Capewell-Dvorak Baybayin)"
+msgid "Belgian (alternative)"
+msgstr "Belgia (alternatif)"
#: ../rules/base.xml.in.h:262
-msgid "Filipino (Capewell-Dvorak Latin)"
-msgstr "Filipina (Capewell-Dvorak Latin)"
+msgid "Belgian (alternative, Latin-9 only)"
+msgstr "Belgia (alternative, hanya Latin-9)"
#: ../rules/base.xml.in.h:263
-msgid "Filipino (Capewell-QWERF 2006 Baybayin)"
-msgstr "Filipina (Capewell-QWERF 2006 Baybayin)"
+msgid "Belgian (alternative, Sun dead keys)"
+msgstr "Belgia (alternatif, tombol mati Sun)"
#: ../rules/base.xml.in.h:264
-msgid "Filipino (Capewell-QWERF 2006 Latin)"
-msgstr "Filipina (Capewell-QWERF 2006 Latin)"
+msgid "Belgian (ISO alternate)"
+msgstr "Belgia (alternatif ISO)"
#: ../rules/base.xml.in.h:265
-msgid "Filipino (Colemak Baybayin)"
-msgstr "Filipina (Colemak Baybayin)"
+msgid "Belgian (eliminate dead keys)"
+msgstr "Belgia (hapus tombol mati)"
#: ../rules/base.xml.in.h:266
-msgid "Filipino (Colemak Latin)"
-msgstr "Filipina (Colemak Latin)"
+msgid "Belgian (Sun dead keys)"
+msgstr "Belgia (tombol mati Sun)"
#: ../rules/base.xml.in.h:267
-msgid "Filipino (Dvorak Baybayin)"
-msgstr "Filipina (Dvorak Baybayin)"
-
-#: ../rules/base.xml.in.h:268
-msgid "Filipino (Dvorak Latin)"
-msgstr "Filipina (Dvorak Latin)"
+msgid "Belgian (Wang model 724 azerty)"
+msgstr "Belgia (Wang model 724 azerty)"
+#. Keyboard indicator for Bangla layouts
#: ../rules/base.xml.in.h:269
-msgid "Filipino (QWERTY Baybayin)"
-msgstr "Filipina (QWERTY Baybayin)"
+msgid "bn"
+msgstr "bn"
#: ../rules/base.xml.in.h:270
-msgid "Finnish"
-msgstr "Finlandia"
+msgid "Bangla"
+msgstr "Bangla"
#: ../rules/base.xml.in.h:271
-msgid "Finnish (Macintosh)"
-msgstr "Finlandia (Macintosh)"
-
-#: ../rules/base.xml.in.h:272
-msgid "Finnish (classic)"
-msgstr "Finlandia (klasik)"
+msgid "Bangla (Probhat)"
+msgstr "Bangla (Probhat)"
+#. Keyboard indicator for Indian layouts
#: ../rules/base.xml.in.h:273
-msgid "Finnish (classic, eliminate dead keys)"
-msgstr "Finlandia (klasik, hapus tombol mati)"
+msgid "in"
+msgstr "in"
+
+#: ../rules/base.xml.in.h:274
+msgid "Indian"
+msgstr "India"
+
+#: ../rules/base.xml.in.h:275
+msgid "Bangla (India)"
+msgstr "Bangla (India)"
-#. This assumes the KP_ abstract symbols are actually useful for some apps
-#. The description needs to be rewritten
#: ../rules/base.xml.in.h:276
-msgid "Four-level key with abstract separators"
-msgstr "Tombol empat-level dengan pemisah abstrak"
+msgid "Bangla (India, Probhat)"
+msgstr "Bangla (India, Probhat)"
#: ../rules/base.xml.in.h:277
-msgid "Four-level key with comma"
-msgstr "Tombol empat-level dengan koma"
+msgid "Bangla (India, Baishakhi)"
+msgstr "Bangla (India, Baishakhi)"
#: ../rules/base.xml.in.h:278
-msgid "Four-level key with dot"
-msgstr "Tombol empat-level dengan titik"
+msgid "Bangla (India, Bornona)"
+msgstr "Bangla (India, Bornona)"
#: ../rules/base.xml.in.h:279
-msgid "Four-level key with dot, latin-9 restriction"
-msgstr "Tombol empat-level dengan titik, pembatasan latin-9"
+msgid "Bangla (India, Uni Gitanjali)"
+msgstr "Bangla (India, Uni Gitanjali)"
#: ../rules/base.xml.in.h:280
-msgid "Four-level key with momayyez"
-msgstr "Tombol empat level dengan momayyez"
-
-#: ../rules/base.xml.in.h:281
-msgid "French"
-msgstr "Perancis"
+msgid "Bangla (India, Baishakhi Inscript)"
+msgstr "Bangla (India, Baishakhi Inscript)"
+#. Keyboard indicator for Gujarati layouts
#: ../rules/base.xml.in.h:282
-msgid "French (Bepo, ergonomic, Dvorak way)"
-msgstr "Perancis (Bepo, ergonomis, Dvorak way)"
+msgid "gu"
+msgstr "gu"
#: ../rules/base.xml.in.h:283
-msgid "French (Bepo, ergonomic, Dvorak way, latin-9 only)"
-msgstr "Perancis (Bepo, ergonomis, Dvorak way, hanya latin-9)"
-
-#: ../rules/base.xml.in.h:284
-msgid "French (Breton)"
-msgstr "Perancis (Breton)"
+msgid "Gujarati"
+msgstr "Gujurati"
+#. Keyboard indicator for Punjabi layouts
#: ../rules/base.xml.in.h:285
-msgid "French (Cameroon)"
-msgstr "Perancis (Kamerun)"
+msgid "pa"
+msgstr "pa"
-#: ../rules/base.xml.in.h:286 ../rules/base.extras.xml.in.h:11
-msgid "French (Canada)"
-msgstr "Perancis (Kanada)"
+#: ../rules/base.xml.in.h:286
+msgid "Punjabi (Gurmukhi)"
+msgstr "Punjab (Gurmukhi)"
#: ../rules/base.xml.in.h:287
-msgid "French (Canada, Dvorak)"
-msgstr "Perancis (Kanada, Dvorak)"
-
-#: ../rules/base.xml.in.h:288
-msgid "French (Canada, legacy)"
-msgstr "Perancis (Kanada, legacy)"
+msgid "Punjabi (Gurmukhi Jhelum)"
+msgstr "Punjab (Gurmukhi Jhelum)"
+#. Keyboard indicator for Kannada layouts
#: ../rules/base.xml.in.h:289
-msgid "French (Democratic Republic of the Congo)"
-msgstr "Perancis (Republik Demokratik Kongo)"
+msgid "kn"
+msgstr "kn"
#: ../rules/base.xml.in.h:290
-msgid "French (Dvorak)"
-msgstr "Perancis (Dvorak)"
+msgid "Kannada"
+msgstr "Kannada"
#: ../rules/base.xml.in.h:291
-msgid "French (Guinea)"
-msgstr "Perancis (Guinea)"
-
-#: ../rules/base.xml.in.h:292
-msgid "French (Macintosh)"
-msgstr "French (Macintosh)"
+msgid "Kannada (KaGaPa phonetic)"
+msgstr "Kannada (fonetik KaGaPa)"
+#. Keyboard indicator for Malayalam layouts
#: ../rules/base.xml.in.h:293
-msgid "French (Mali, alternative)"
-msgstr "Perancis (Mali, alternatif)"
+msgid "ml"
+msgstr "ml"
#: ../rules/base.xml.in.h:294
-msgid "French (Morocco)"
-msgstr "Perancis (Maroko)"
+msgid "Malayalam"
+msgstr "Malayalam"
#: ../rules/base.xml.in.h:295
-msgid "French (Sun dead keys)"
-msgstr "Perancis (tombol mati Sun)"
+msgid "Malayalam (Lalitha)"
+msgstr "Malayalam (Lalitha)"
#: ../rules/base.xml.in.h:296
-msgid "French (Switzerland)"
-msgstr "Perancis (Swiss)"
-
-#: ../rules/base.xml.in.h:297
-msgid "French (Switzerland, Macintosh)"
-msgstr "Perancis (Swiss, Macintosh)"
+msgid "Malayalam (enhanced Inscript with Rupee Sign)"
+msgstr "Malayalam (Inscript ditingkatkan dengan Tanda Rupee)"
+#. Keyboard indicator for Oriya layouts
#: ../rules/base.xml.in.h:298
-msgid "French (Switzerland, Sun dead keys)"
-msgstr "Perancis (Swiss, tombol mati Sun)"
+msgid "or"
+msgstr "or"
#: ../rules/base.xml.in.h:299
-msgid "French (Switzerland, eliminate dead keys)"
-msgstr "Perancis (Swiss, hapus tombol mati)"
-
-#: ../rules/base.xml.in.h:300
-msgid "French (alternative)"
-msgstr "Perancis (alternatif)"
+msgid "Oriya"
+msgstr "Oriya"
+#. Keyboard indicator for Tamil layouts
#: ../rules/base.xml.in.h:301
-msgid "French (alternative, Sun dead keys)"
-msgstr "Perancis (alternatif, tombol mati Sun)"
+msgid "ta"
+msgstr "ta"
#: ../rules/base.xml.in.h:302
-msgid "French (alternative, eliminate dead keys)"
-msgstr "Perancis (alternatif, hapus tombol mati)"
+msgid "Tamil (Unicode)"
+msgstr "Tamil (Unicode)"
#: ../rules/base.xml.in.h:303
-msgid "French (alternative, latin-9 only)"
-msgstr "Perancis (alternatif, hanya latin-9)"
+msgid "Tamil (keyboard with numerals)"
+msgstr "Tamil (papan tik dengan angka)"
#: ../rules/base.xml.in.h:304
-msgid "French (eliminate dead keys)"
-msgstr "Perancis (hapus tombol mati)"
+msgid "Tamil (TAB typewriter)"
+msgstr "Tamil (mesin tik TAB)"
#: ../rules/base.xml.in.h:305
-msgid "French (legacy, alternative)"
-msgstr "Perancis (legacy, alternatif)"
+msgid "Tamil (TSCII typewriter)"
+msgstr "Tamil (mestin tik TSCII)"
#: ../rules/base.xml.in.h:306
-msgid "French (legacy, alternative, Sun dead keys)"
-msgstr "Perancis (legacy, alternatif, tombol mati Sun)"
-
-#: ../rules/base.xml.in.h:307
-msgid "French (legacy, alternative, eliminate dead keys)"
-msgstr "Perancis (legacy, alternatif, hapus tombol mati)"
+msgid "Tamil"
+msgstr "Tamil"
+#. Keyboard indicator for Telugu layouts
#: ../rules/base.xml.in.h:308
-msgid "Fujitsu-Siemens Computers AMILO laptop"
-msgstr "Fujitsu-Siemens Computers AMILO laptop"
+msgid "te"
+msgstr "te"
#: ../rules/base.xml.in.h:309
-msgid "Fula"
-msgstr "Fula"
+msgid "Telugu"
+msgstr "Telugu"
#: ../rules/base.xml.in.h:310
-msgid "Ga"
-msgstr "Ga"
-
-#: ../rules/base.xml.in.h:311
-msgid "Generic 101-key PC"
-msgstr "PC 101-tombol Generik "
+msgid "Telugu (KaGaPa phonetic)"
+msgstr "Telugu (fonetik KaGaPa)"
+#. Keyboard indicator for Urdu layouts
#: ../rules/base.xml.in.h:312
-msgid "Generic 102-key (Intl) PC"
-msgstr "PC 102-tombol (Intl) Generic"
+msgid "ur"
+msgstr "ur"
#: ../rules/base.xml.in.h:313
-msgid "Generic 104-key PC"
-msgstr "PC 104-tombol Generik "
+msgid "Urdu (phonetic)"
+msgstr "Urdu (fonetik)"
#: ../rules/base.xml.in.h:314
-msgid "Generic 105-key (Intl) PC"
-msgstr "PC 105-tombol (Intl) Generic"
+msgid "Urdu (alternative phonetic)"
+msgstr "Urdu (fonetik alternatif)"
#: ../rules/base.xml.in.h:315
-msgid "Genius Comfy KB-12e"
-msgstr "Genius Comfy KB-12e"
-
-#: ../rules/base.xml.in.h:316
-msgid "Genius Comfy KB-16M / Genius MM Keyboard KWD-910"
-msgstr "Genius Comfy KB-16M / Genius MM Keyboard KWD-910"
+msgid "Urdu (WinKeys)"
+msgstr "Urdu (WinKeys)"
+#. Keyboard indicator for Hindi layouts
#: ../rules/base.xml.in.h:317
-msgid "Genius Comfy KB-21e-Scroll"
-msgstr "Genius Comfy KB-21e-Scroll"
+msgid "hi"
+msgstr "hi"
#: ../rules/base.xml.in.h:318
-msgid "Genius KB-19e NB"
-msgstr "Genius KB-19e NB"
+msgid "Hindi (Bolnagri)"
+msgstr "Hindi (Bolnagri)"
#: ../rules/base.xml.in.h:319
-msgid "Genius KKB-2050HS"
-msgstr "Genius KKB-2050HS"
+msgid "Hindi (Wx)"
+msgstr "Hindi (Wx)"
#: ../rules/base.xml.in.h:320
-msgid "Georgian"
-msgstr "Georgia"
-
-#: ../rules/base.xml.in.h:321
-msgid "Georgian (France, AZERTY Tskapo)"
-msgstr "Georgia (Perancis, AZERTY Tskapo)"
+msgid "Hindi (KaGaPa phonetic)"
+msgstr "Hindi (fonetik KaGaPa)"
+#. Keyboard indicator for Sanskrit layouts
#: ../rules/base.xml.in.h:322
-msgid "Georgian (Italy)"
-msgstr "Georgia (Italia)"
+msgid "sa"
+msgstr "sa"
#: ../rules/base.xml.in.h:323
-msgid "Georgian (MESS)"
-msgstr "Georgia (MESS)"
-
-#: ../rules/base.xml.in.h:324
-msgid "Georgian (ergonomic)"
-msgstr "Georgia (ergonomik)"
+msgid "Sanskrit (KaGaPa phonetic)"
+msgstr "Sanskerta (fonetik KaGaPa)"
-#: ../rules/base.xml.in.h:325 ../rules/base.extras.xml.in.h:12
-msgid "German"
-msgstr "Jerman"
+#. Keyboard indicator for Marathi layouts
+#: ../rules/base.xml.in.h:325
+msgid "mr"
+msgstr "mr"
#: ../rules/base.xml.in.h:326
-msgid "German (Austria)"
-msgstr "Jerman (Austria)"
+msgid "Marathi (KaGaPa phonetic)"
+msgstr "Marathi (fonetik KaGaPa)"
#: ../rules/base.xml.in.h:327
-msgid "German (Austria, Macintosh)"
-msgstr "Jerman (Austria, Macintosh)"
-
-#: ../rules/base.xml.in.h:328
-msgid "German (Austria, Sun dead keys)"
-msgstr "Jerman (Austria, tombol mati Sun)"
+msgid "English (India, with RupeeSign)"
+msgstr "English (India, dengan RupeeSign)"
+#. Keyboard indicator for Bosnian layouts
#: ../rules/base.xml.in.h:329
-msgid "German (Austria, eliminate dead keys)"
-msgstr "Jerman (Austria, hapus tombol mati)"
+msgid "bs"
+msgstr "bs"
#: ../rules/base.xml.in.h:330
-msgid "German (Dvorak)"
-msgstr "Jerman (Dvorak)"
+msgid "Bosnian"
+msgstr "Bosnia"
#: ../rules/base.xml.in.h:331
-msgid "German (Macintosh)"
-msgstr "German (Macintosh)"
+msgid "Bosnian (use guillemets for quotes)"
+msgstr "Bosnia (gunakan guillemets untuk tanda petik)"
#: ../rules/base.xml.in.h:332
-msgid "German (Macintosh, eliminate dead keys)"
-msgstr "Jerman (Macintosh, hapus tombol mati)"
+msgid "Bosnian (use Bosnian digraphs)"
+msgstr "Bosnia (gunakan diagraph Bosnia)"
#: ../rules/base.xml.in.h:333
-msgid "German (Neo 2)"
-msgstr "Jerman (Neo 2)"
+msgid "Bosnian (US keyboard with Bosnian digraphs)"
+msgstr "Bosnia (papan tik AS dengan digraf Bosnia)"
#: ../rules/base.xml.in.h:334
-msgid "German (Sun dead keys)"
-msgstr "Jerman (tombol mati Sun)"
-
-#: ../rules/base.xml.in.h:335
-msgid "German (Switzerland)"
-msgstr "Jerman (Swiss)"
+msgid "Bosnian (US keyboard with Bosnian letters)"
+msgstr "Bosnia (papan tik AS dengan huruf Bosnia)"
-#: ../rules/base.xml.in.h:336
-msgid "German (Switzerland, Macintosh)"
-msgstr "Jerman (Swiss, Macintosh)"
+#. Keyboard indicator for Portuguese layouts
+#: ../rules/base.xml.in.h:336 ../rules/base.extras.xml.in.h:71
+msgid "pt"
+msgstr "pt"
-#: ../rules/base.xml.in.h:337
-msgid "German (Switzerland, Sun dead keys)"
-msgstr "Jerman (Swiss, tombol mati Sun)"
+#: ../rules/base.xml.in.h:337 ../rules/base.extras.xml.in.h:72
+msgid "Portuguese (Brazil)"
+msgstr "Portugis (Brasil)"
#: ../rules/base.xml.in.h:338
-msgid "German (Switzerland, eliminate dead keys)"
-msgstr "Jerman (Swiss, hapus tombol mati)"
+msgid "Portuguese (Brazil, eliminate dead keys)"
+msgstr "Portugis (Brasil, hapus tombo mati)"
#: ../rules/base.xml.in.h:339
-msgid "German (Switzerland, legacy)"
-msgstr "Jerman (Swiss, legacy)"
+msgid "Portuguese (Brazil, Dvorak)"
+msgstr "Portugis (Brasil, Dvorak)"
#: ../rules/base.xml.in.h:340
-msgid "German (dead acute)"
-msgstr "Jerman (acute mati)"
+msgid "Portuguese (Brazil, Nativo)"
+msgstr "Portugis (Brasil, Nativo)"
#: ../rules/base.xml.in.h:341
-msgid "German (dead grave acute)"
-msgstr "Jerman (grave acute mati)"
+msgid "Portuguese (Brazil, Nativo for US keyboards)"
+msgstr "Portugis (Brasil, Nativo untuk papan ketik AS)"
#: ../rules/base.xml.in.h:342
-msgid "German (eliminate dead keys)"
-msgstr "Jerman (hapus tombol mati)"
-
-#: ../rules/base.xml.in.h:343
-msgid "Greek"
-msgstr "Yunani"
+msgid "Esperanto (Brazil, Nativo)"
+msgstr "Esperanto (Brazil, Nativo)"
+#. Keyboard indicator for Bulgarian layouts
#: ../rules/base.xml.in.h:344
-msgid "Greek (eliminate dead keys)"
-msgstr "Yunani (hapus tombol mati)"
+msgid "bg"
+msgstr "bg"
#: ../rules/base.xml.in.h:345
-msgid "Greek (extended)"
-msgstr "Yunani (diperluas)"
+msgid "Bulgarian"
+msgstr "Bulgaria"
#: ../rules/base.xml.in.h:346
-msgid "Greek (polytonic)"
-msgstr "Yunani (politonik)"
+msgid "Bulgarian (traditional phonetic)"
+msgstr "Bulgaria (fonetik tradisional)"
#: ../rules/base.xml.in.h:347
-msgid "Greek (simple)"
-msgstr "Yunani (sederhana)"
+msgid "Bulgarian (new phonetic)"
+msgstr "Bulgaria (fonetik baru)"
#: ../rules/base.xml.in.h:348
-msgid "Gujarati"
-msgstr "Gujurati"
-
-#: ../rules/base.xml.in.h:349
-msgid "Gyration"
-msgstr "Gyration"
+msgid "Arabic (Morocco)"
+msgstr "Arab (Maroko)"
-#: ../rules/base.xml.in.h:350
-msgid "HTC Dream"
-msgstr "HTC Dream"
+#. Keyboard indicator for French layouts
+#: ../rules/base.xml.in.h:350 ../rules/base.extras.xml.in.h:3
+msgid "fr"
+msgstr "fr"
#: ../rules/base.xml.in.h:351
-msgid "Happy Hacking Keyboard"
-msgstr "Happy Hacking Keyboard"
-
-#: ../rules/base.xml.in.h:352
-msgid "Happy Hacking Keyboard for Mac"
-msgstr "Happy Hacking Keyboard untuk Mac"
+msgid "French (Morocco)"
+msgstr "Perancis (Maroko)"
+#. Keyboard indicator for Berber layouts
#: ../rules/base.xml.in.h:353
-msgid "Hausa"
-msgstr "Hausa"
+msgid "ber"
+msgstr "ber"
#: ../rules/base.xml.in.h:354
-msgid "Hebrew"
-msgstr "Ibrani"
+msgid "Berber (Morocco, Tifinagh)"
+msgstr "Berber (Morocco, Tifinagh)"
#: ../rules/base.xml.in.h:355
-msgid "Hebrew (Biblical, Tiro)"
-msgstr "Ibrani (Biblical, Tiro)"
+msgid "Berber (Morocco, Tifinagh alternative)"
+msgstr "Berber (Maroko, alternatif Tifinagh)"
#: ../rules/base.xml.in.h:356
-msgid "Hebrew (lyx)"
-msgstr "Ibrani (lyx)"
+msgid "Berber (Morocco, Tifinagh alternative phonetic)"
+msgstr "Berber (Maroko, fonetik alternatif Tifinagh)"
#: ../rules/base.xml.in.h:357
-msgid "Hebrew (phonetic)"
-msgstr "Ibrani (fonetik)"
+msgid "Berber (Morocco, Tifinagh extended)"
+msgstr "Berber (Maroko, Tifinagh diperluas)"
#: ../rules/base.xml.in.h:358
-msgid "Hewlett-Packard Internet Keyboard"
-msgstr "Papan Ketik Internet Hewlett-Packard"
+msgid "Berber (Morocco, Tifinagh phonetic)"
+msgstr "Berber (Maroko, fonetik Tifinagh)"
#: ../rules/base.xml.in.h:359
-msgid "Hewlett-Packard Mini 110 Notebook"
-msgstr "Hewlett-Packard Mini 110 Notebook"
-
-#: ../rules/base.xml.in.h:360
-msgid "Hewlett-Packard Omnibook 500 FA"
-msgstr "Hewlett-Packard Omnibook 500 FA"
+msgid "Berber (Morocco, Tifinagh extended phonetic)"
+msgstr "Berber (Maroko, fonetik Tifinagh diperluas)"
+#. Keyboard indicator for Cameroon layouts
#: ../rules/base.xml.in.h:361
-msgid "Hewlett-Packard Omnibook 5xx"
-msgstr "Hewlett-Packard Omnibook 5xx"
+msgid "cm"
+msgstr "cm"
#: ../rules/base.xml.in.h:362
-msgid "Hewlett-Packard Omnibook 6000/6100"
-msgstr "Hewlett-Packard Omnibook 6000/6100"
+msgid "English (Cameroon)"
+msgstr "Inggris (Kamerun)"
#: ../rules/base.xml.in.h:363
-msgid "Hewlett-Packard Omnibook XE3 GC"
-msgstr "Hewlett-Packard Omnibook XE3 GC"
+msgid "French (Cameroon)"
+msgstr "Perancis (Kamerun)"
#: ../rules/base.xml.in.h:364
-msgid "Hewlett-Packard Omnibook XE3 GF"
-msgstr "Hewlett-Packard Omnibook XE3 GF"
+msgid "Cameroon Multilingual (qwerty)"
+msgstr "Kamerun Multibahasa (qwerty)"
#: ../rules/base.xml.in.h:365
-msgid "Hewlett-Packard Omnibook XT1000"
-msgstr "Hewlett-Packard Omnibook XT1000"
+msgid "Cameroon Multilingual (azerty)"
+msgstr "Kamerun Multibahasa (azerty)"
#: ../rules/base.xml.in.h:366
-msgid "Hewlett-Packard Pavilion ZT11xx"
-msgstr "Hewlett-Packard Pavilion ZT11xx"
-
-#: ../rules/base.xml.in.h:367
-msgid "Hewlett-Packard Pavilion dv5"
-msgstr "Hewlett-Packard Pavilion dv5"
+msgid "Cameroon Multilingual (Dvorak)"
+msgstr "Kamerun Multibahasa (Dvorak)"
+#. Keyboard indicator for Burmese layouts
#: ../rules/base.xml.in.h:368
-msgid "Hewlett-Packard SK-250x Multimedia Keyboard"
-msgstr "Papan Ketik Multimedia Hewlett-Packard SK-2501"
+msgid "my"
+msgstr "my"
#: ../rules/base.xml.in.h:369
-msgid "Hewlett-Packard nx9020"
-msgstr "Hewlett-Packard nx9020"
+msgid "Burmese"
+msgstr "Burma"
-#: ../rules/base.xml.in.h:370
-msgid "Hexadecimal"
-msgstr "Heksadesimal"
+#: ../rules/base.xml.in.h:370 ../rules/base.extras.xml.in.h:4
+msgid "French (Canada)"
+msgstr "Perancis (Kanada)"
#: ../rules/base.xml.in.h:371
-msgid "Hindi (Bolnagri)"
-msgstr "Hindi (Bolnagri)"
+msgid "French (Canada, Dvorak)"
+msgstr "Perancis (Kanada, Dvorak)"
#: ../rules/base.xml.in.h:372
-msgid "Hindi (Wx)"
-msgstr "Hindi (Wx)"
+msgid "French (Canada, legacy)"
+msgstr "Perancis (Kanada, legacy)"
#: ../rules/base.xml.in.h:373
-msgid "Honeywell Euroboard"
-msgstr "Honeywell Euroboard"
+msgid "Canadian Multilingual"
+msgstr "Kanada Multibahasa"
#: ../rules/base.xml.in.h:374
-msgid "Htc Dream phone"
-msgstr "Telepon Htc Dream"
+msgid "Canadian Multilingual (first part)"
+msgstr "Kanada Multibahasa (bagian pertama)"
#: ../rules/base.xml.in.h:375
-msgid "Hungarian"
-msgstr "Hungaria"
-
-#: ../rules/base.xml.in.h:376
-msgid "Hungarian (101/qwerty/comma/dead keys)"
-msgstr "Hungaria (101/qwerty/koma/tombol mati)"
+msgid "Canadian Multilingual (second part)"
+msgstr "Kanada Multibahasa (bagian kedua)"
+#. Keyboard indicator for Inuktikut layouts
#: ../rules/base.xml.in.h:377
-msgid "Hungarian (101/qwerty/comma/eliminate dead keys)"
-msgstr "Hungaria (101/qwerty/koma/hapus tombol mati)"
+msgid "ike"
+msgstr "ike"
#: ../rules/base.xml.in.h:378
-msgid "Hungarian (101/qwerty/dot/dead keys)"
-msgstr "Hungaria (101/qwerty/titik/tombol mati)"
+msgid "Inuktitut"
+msgstr "Inuktitut"
#: ../rules/base.xml.in.h:379
-msgid "Hungarian (101/qwerty/dot/eliminate dead keys)"
-msgstr "Hungaria (101/qwerty/titik/hapus tombol mati)"
+msgid "English (Canada)"
+msgstr "Inggris (Kanada)"
#: ../rules/base.xml.in.h:380
-msgid "Hungarian (101/qwertz/comma/dead keys)"
-msgstr "Hungaria (101/qwertz/koma/tombol mati)"
-
-#: ../rules/base.xml.in.h:381
-msgid "Hungarian (101/qwertz/comma/eliminate dead keys)"
-msgstr "Hungaria (101/qwertz/koma/hapus tombol mati)"
+msgid "French (Democratic Republic of the Congo)"
+msgstr "Perancis (Republik Demokratik Kongo)"
+#. Keyboard indicator for Taiwanese layouts
#: ../rules/base.xml.in.h:382
-msgid "Hungarian (101/qwertz/dot/dead keys)"
-msgstr "Hungaria (101/awertz/titik/tombol mati)"
+msgid "zh"
+msgstr "zh"
#: ../rules/base.xml.in.h:383
-msgid "Hungarian (101/qwertz/dot/eliminate dead keys)"
-msgstr "Hungaria (101/qwertz/titik/hapus tombol mati)"
+msgid "Chinese"
+msgstr "Cina"
#: ../rules/base.xml.in.h:384
-msgid "Hungarian (102/qwerty/comma/dead keys)"
-msgstr "Hungaria (102/qwerty/koma/tombol mati)"
+msgid "Tibetan"
+msgstr "Tibetan"
#: ../rules/base.xml.in.h:385
-msgid "Hungarian (102/qwerty/comma/eliminate dead keys)"
-msgstr "Hungaria (102/qwerty/koma/hapus tombol mati)"
+msgid "Tibetan (with ASCII numerals)"
+msgstr "Tibetan (with ASCII numerals)"
#: ../rules/base.xml.in.h:386
-msgid "Hungarian (102/qwerty/dot/dead keys)"
-msgstr "Hungaria (102/qwerty/titik/tombol mati)"
+msgid "ug"
+msgstr "ug"
#: ../rules/base.xml.in.h:387
-msgid "Hungarian (102/qwerty/dot/eliminate dead keys)"
-msgstr "Hungaria (102/qwerty/titik/hapus tombol mati)"
-
-#: ../rules/base.xml.in.h:388
-msgid "Hungarian (102/qwertz/comma/dead keys)"
-msgstr "Hungaria (102/qwertz/koma/tombol mati)"
+msgid "Uyghur"
+msgstr "Uyghur"
+#. Keyboard indicator for Croatian layouts
#: ../rules/base.xml.in.h:389
-msgid "Hungarian (102/qwertz/comma/eliminate dead keys)"
-msgstr "Hungaria (102/qwertz/koma/hapus tombol mati)"
+msgid "hr"
+msgstr "hr"
#: ../rules/base.xml.in.h:390
-msgid "Hungarian (102/qwertz/dot/dead keys)"
-msgstr "Hungaria (102/qwertz/titik/tombol mati)"
+msgid "Croatian"
+msgstr "Kroasia"
#: ../rules/base.xml.in.h:391
-msgid "Hungarian (102/qwertz/dot/eliminate dead keys)"
-msgstr "Hungaria (102/qwertz/titik/hapus tombol mati)"
+msgid "Croatian (use guillemets for quotes)"
+msgstr "Kroasia (gunakan guillemets untuk tanda petik)"
#: ../rules/base.xml.in.h:392
-msgid "Hungarian (eliminate dead keys)"
-msgstr "Hungaria (hapus tombol mati)"
+msgid "Croatian (use Croatian digraphs)"
+msgstr "Kroasis (gunakan diagraph Kroasia)"
#: ../rules/base.xml.in.h:393
-msgid "Hungarian (qwerty)"
-msgstr "Hungaria (qwerty)"
+msgid "Croatian (US keyboard with Croatian digraphs)"
+msgstr "Kroasia (papan tik AS dengan digraf Kroasia)"
#: ../rules/base.xml.in.h:394
-msgid "Hungarian (standard)"
-msgstr "Hungaria (standar)"
-
-#: ../rules/base.xml.in.h:395
-msgid "Hyper is mapped to Win-keys"
-msgstr "Hiper dipetakan ke tombol Win"
+msgid "Croatian (US keyboard with Croatian letters)"
+msgstr "Kroasia (papan tik AS dengan huruf Kroasia)"
-#: ../rules/base.xml.in.h:396
-msgid "IBM Rapid Access"
-msgstr "IBM Rapid Access"
+#. Keyboard indicator for Chech layouts
+#: ../rules/base.xml.in.h:396 ../rules/base.extras.xml.in.h:74
+msgid "cs"
+msgstr "cs"
-#: ../rules/base.xml.in.h:397
-msgid "IBM Rapid Access II"
-msgstr "IBM Rapid Access II"
+#: ../rules/base.xml.in.h:397 ../rules/base.extras.xml.in.h:75
+msgid "Czech"
+msgstr "Ceko"
#: ../rules/base.xml.in.h:398
-msgid "IBM Space Saver"
-msgstr "IBM Space Saver"
+msgid "Czech (with &lt;\\|&gt; key)"
+msgstr "Ceko (dengan tombol &lt;\\|&gt;)"
#: ../rules/base.xml.in.h:399
-msgid "IBM ThinkPad 560Z/600/600E/A22E"
-msgstr "IBM ThinkPad 560Z/600/600E/A22E"
+msgid "Czech (qwerty)"
+msgstr "Ceko (qwerty)"
#: ../rules/base.xml.in.h:400
-msgid "IBM ThinkPad R60/T60/R61/T61"
-msgstr "IBM ThinkPad R60/T60/R61/T61"
+msgid "Czech (qwerty, extended Backslash)"
+msgstr "Ceko (qwerty, Backslash diperpanjang)"
#: ../rules/base.xml.in.h:401
-msgid "IBM ThinkPad Z60m/Z60t/Z61m/Z61t"
-msgstr "IBM ThinkPad Z60m/Z60t/Z61m/Z61t"
+msgid "Czech (UCW layout, accented letters only)"
+msgstr "Ceko (tata letak UCW, hanya huruf beraksen)"
#: ../rules/base.xml.in.h:402
-msgid "Icelandic"
-msgstr "Islandia"
-
-#: ../rules/base.xml.in.h:403
-msgid "Icelandic (Dvorak)"
-msgstr "Islandia (Dvorak)"
+msgid "Czech (US Dvorak with CZ UCW support)"
+msgstr "Ceko (Dvorak AS dengan dukungan CZ UCW)"
-#: ../rules/base.xml.in.h:404
-msgid "Icelandic (Macintosh)"
-msgstr "Islandia (Macintosh)"
+#. Keyboard indicator for Danish layouts
+#: ../rules/base.xml.in.h:404 ../rules/base.extras.xml.in.h:77
+msgid "da"
+msgstr "da"
-#: ../rules/base.xml.in.h:405
-msgid "Icelandic (Sun dead keys)"
-msgstr "Islandia (tombol mati Sun)"
+#: ../rules/base.xml.in.h:405 ../rules/base.extras.xml.in.h:78
+msgid "Danish"
+msgstr "Denmark"
#: ../rules/base.xml.in.h:406
-msgid "Icelandic (eliminate dead keys)"
-msgstr "Islandia (hapus tombol mati)"
+msgid "Danish (eliminate dead keys)"
+msgstr "Denmark (hapus tombol mati"
#: ../rules/base.xml.in.h:407
-msgid "Igbo"
-msgstr "Igbo"
+msgid "Danish (Macintosh)"
+msgstr "Denmark (Macintosh)"
#: ../rules/base.xml.in.h:408
-msgid "Indian"
-msgstr "India"
+msgid "Danish (Macintosh, eliminate dead keys)"
+msgstr "Denmark (Macintosh, hapus tombol mati"
#: ../rules/base.xml.in.h:409
-msgid "Inuktitut"
-msgstr "Inuktitut"
-
-#: ../rules/base.xml.in.h:410
-msgid "Iraqi"
-msgstr "Irak"
+msgid "Danish (Dvorak)"
+msgstr "Denmark (Dvorak)"
-#: ../rules/base.xml.in.h:411
-msgid "Irish"
-msgstr "Irlandia"
+#. Keyboard indicator for Dutch layouts
+#: ../rules/base.xml.in.h:411 ../rules/base.extras.xml.in.h:80
+msgid "nl"
+msgstr "nl"
-#: ../rules/base.xml.in.h:412
-msgid "Irish (UnicodeExpert)"
-msgstr "Irlandia (UnicodeExpert)"
+#: ../rules/base.xml.in.h:412 ../rules/base.extras.xml.in.h:81
+msgid "Dutch"
+msgstr "Belanda"
#: ../rules/base.xml.in.h:413
-msgid "Italian"
-msgstr "Italia"
+msgid "Dutch (Sun dead keys)"
+msgstr "Belanda (tombol mati Sun)"
#: ../rules/base.xml.in.h:414
-msgid "Italian (Macintosh)"
-msgstr "Italia (Macintosh)"
+msgid "Dutch (Macintosh)"
+msgstr "Belanda (Macintosh)"
#: ../rules/base.xml.in.h:415
-msgid "Italian (US keyboard with Italian letters)"
-msgstr "Italia (papan tik AS dengan huruf Italia)"
-
-#: ../rules/base.xml.in.h:416
-msgid "Italian (eliminate dead keys)"
-msgstr "Italia (hapus tombol mati)"
+msgid "Dutch (standard)"
+msgstr "Belanda (standar)"
+#. Keyboard indicator for Dzongkha layouts
#: ../rules/base.xml.in.h:417
-msgid "Japanese"
-msgstr "Jepang"
+msgid "dz"
+msgstr "dz"
#: ../rules/base.xml.in.h:418
-msgid "Japanese (Kana 86)"
-msgstr "Jepang (Kana 86)"
-
-#: ../rules/base.xml.in.h:419
-msgid "Japanese (Kana)"
-msgstr "Jepang (Kana)"
+msgid "Dzongkha"
+msgstr "Dzongkha"
-#: ../rules/base.xml.in.h:420
-msgid "Japanese (Macintosh)"
-msgstr "Jepang (Macintosh)"
+#. Keyboard indicator for Estonian layouts
+#: ../rules/base.xml.in.h:420 ../rules/base.extras.xml.in.h:83
+msgid "et"
+msgstr "et"
-#: ../rules/base.xml.in.h:421
-msgid "Japanese (OADG 109A)"
-msgstr "Jepang (OADG 109A)"
+#: ../rules/base.xml.in.h:421 ../rules/base.extras.xml.in.h:84
+msgid "Estonian"
+msgstr "Estonia"
#: ../rules/base.xml.in.h:422
-msgid "Japanese (PC-98xx Series)"
-msgstr "Jepang (Seri PC-98xx)"
+msgid "Estonian (eliminate dead keys)"
+msgstr "Estonia (hapus tombol mati)"
#: ../rules/base.xml.in.h:423
-msgid "Japanese keyboard options"
-msgstr "Pilihan papan ketik Jepang"
+msgid "Estonian (Dvorak)"
+msgstr "Estonia (Dvorak)"
#: ../rules/base.xml.in.h:424
-msgid "Kalmyk"
-msgstr "Kalmyk"
+msgid "Estonian (US keyboard with Estonian letters)"
+msgstr "Estonia (papan tik AS dengan huruf Estonia)"
-#: ../rules/base.xml.in.h:425
-msgid "Kana Lock key is locking"
-msgstr "Tombol Kana Lock terkunci"
+#: ../rules/base.xml.in.h:425 ../rules/base.extras.xml.in.h:16
+msgid "Persian"
+msgstr "Persia"
#: ../rules/base.xml.in.h:426
-msgid "Kannada"
-msgstr "Kannada"
-
-#: ../rules/base.xml.in.h:427
-msgid "Kashubian"
-msgstr "Kashubian"
+msgid "Persian (with Persian Keypad)"
+msgstr "Persia (dengan papan tik Persia)"
+#. Keyboard indicator for Kurdish layouts
#: ../rules/base.xml.in.h:428
-msgid "Kazakh"
-msgstr "Kazakh"
+msgid "ku"
+msgstr "ku"
#: ../rules/base.xml.in.h:429
-msgid "Kazakh (with Russian)"
-msgstr "Kazakh (dengan Rusia)"
+msgid "Kurdish (Iran, Latin Q)"
+msgstr "Kurdi (Iran, Latin Q)"
#: ../rules/base.xml.in.h:430
-msgid "Key sequence to kill the X server"
-msgstr "Sekuensi kunci untuk mematikan server X"
+msgid "Kurdish (Iran, F)"
+msgstr "Kurdi (Iran, F)"
#: ../rules/base.xml.in.h:431
-msgid "Key to choose 3rd level"
-msgstr "Tekan Menu Kiri untuk memilih level 3"
+msgid "Kurdish (Iran, Latin Alt-Q)"
+msgstr "Kurdi (Iran, Latin Alt-Q)"
#: ../rules/base.xml.in.h:432
-msgid "Key to choose 5th level"
-msgstr "Tombol untuk memilih level kelima"
+msgid "Kurdish (Iran, Arabic-Latin)"
+msgstr "Kurdi (Iran, Arab-Latin)"
#: ../rules/base.xml.in.h:433
-msgid "Key(s) to change layout"
-msgstr "Tombol untuk mengubah tata letak"
+msgid "Iraqi"
+msgstr "Irak"
#: ../rules/base.xml.in.h:434
-msgid "Keytronic FlexPro"
-msgstr "Keytronic FlexPro"
+msgid "Kurdish (Iraq, Latin Q)"
+msgstr "Kurdi (Irak, Latin Q)"
#: ../rules/base.xml.in.h:435
-msgid "Khmer (Cambodia)"
-msgstr "Khmer (Kamboja)"
+msgid "Kurdish (Iraq, F)"
+msgstr "Kurdi (Irak, F)"
#: ../rules/base.xml.in.h:436
-msgid "Kikuyu"
-msgstr "Kikuyu"
+msgid "Kurdish (Iraq, Latin Alt-Q)"
+msgstr "Kurdi (Irak, Latin Alt-Q)"
#: ../rules/base.xml.in.h:437
-msgid "Kinesis"
-msgstr "Kinesis"
-
-#: ../rules/base.xml.in.h:438
-msgid "Komi"
-msgstr "Komi"
+msgid "Kurdish (Iraq, Arabic-Latin)"
+msgstr "Kurdi (Irak, Arab-Latin)"
+#. Keyboard indicator for Faroese layouts
#: ../rules/base.xml.in.h:439
-msgid "Korean"
-msgstr "Korea"
+msgid "fo"
+msgstr "fo"
#: ../rules/base.xml.in.h:440
-msgid "Korean (101/104 key compatible)"
-msgstr "Korea (kompatibel dengan 101/104 tombol)"
+msgid "Faroese"
+msgstr "Faro"
#: ../rules/base.xml.in.h:441
-msgid "Kurdish (Iran, Arabic-Latin)"
-msgstr "Kurdi (Iran, Arab-Latin)"
-
-#: ../rules/base.xml.in.h:442
-msgid "Kurdish (Iran, F)"
-msgstr "Kurdi (Iran, F)"
+msgid "Faroese (eliminate dead keys)"
+msgstr "Faro (hapus tombol mati)"
-#: ../rules/base.xml.in.h:443
-msgid "Kurdish (Iran, Latin Alt-Q)"
-msgstr "Kurdi (Iran, Latin Alt-Q)"
+#. Keyboard indicator for Finnish layouts
+#: ../rules/base.xml.in.h:443 ../rules/base.extras.xml.in.h:86
+msgid "fi"
+msgstr "fi"
-#: ../rules/base.xml.in.h:444
-msgid "Kurdish (Iran, Latin Q)"
-msgstr "Kurdi (Iran, Latin Q)"
+#: ../rules/base.xml.in.h:444 ../rules/base.extras.xml.in.h:87
+msgid "Finnish"
+msgstr "Finlandia"
#: ../rules/base.xml.in.h:445
-msgid "Kurdish (Iraq, Arabic-Latin)"
-msgstr "Kurdi (Irak, Arab-Latin)"
+msgid "Finnish (classic)"
+msgstr "Finlandia (klasik)"
#: ../rules/base.xml.in.h:446
-msgid "Kurdish (Iraq, F)"
-msgstr "Kurdi (Irak, F)"
+msgid "Finnish (classic, eliminate dead keys)"
+msgstr "Finlandia (klasik, hapus tombol mati)"
#: ../rules/base.xml.in.h:447
-msgid "Kurdish (Iraq, Latin Alt-Q)"
-msgstr "Kurdi (Irak, Latin Alt-Q)"
+msgid "Northern Saami (Finland)"
+msgstr "Saami Utara (Finlandia)"
#: ../rules/base.xml.in.h:448
-msgid "Kurdish (Iraq, Latin Q)"
-msgstr "Kurdi (Irak, Latin Q)"
+msgid "Finnish (Macintosh)"
+msgstr "Finlandia (Macintosh)"
-#: ../rules/base.xml.in.h:449
-msgid "Kurdish (Syria, F)"
-msgstr "Kurdi (Suriah, F)"
+#: ../rules/base.xml.in.h:449 ../rules/base.extras.xml.in.h:89
+msgid "French"
+msgstr "Perancis"
#: ../rules/base.xml.in.h:450
-msgid "Kurdish (Syria, Latin Alt-Q)"
-msgstr "Kurdi (Suriah, Latin Alt-Q)"
+msgid "French (eliminate dead keys)"
+msgstr "Perancis (hapus tombol mati)"
#: ../rules/base.xml.in.h:451
-msgid "Kurdish (Syria, Latin Q)"
-msgstr "Kurdi (Suriah, Latin Q"
+msgid "French (Sun dead keys)"
+msgstr "Perancis (tombol mati Sun)"
#: ../rules/base.xml.in.h:452
-msgid "Kurdish (Turkey, F)"
-msgstr "Kurdi (Turki, F)"
+msgid "French (alternative)"
+msgstr "Perancis (alternatif)"
#: ../rules/base.xml.in.h:453
-msgid "Kurdish (Turkey, Latin Alt-Q)"
-msgstr "Kurdi (Turki, Latin Alt-Q)"
+msgid "French (alternative, Latin-9 only)"
+msgstr "Perancis (alternatif, hanya Latin-9)"
#: ../rules/base.xml.in.h:454
-msgid "Kurdish (Turkey, Latin Q)"
-msgstr "Kurdi (Turki, Latin Q)"
+msgid "French (alternative, eliminate dead keys)"
+msgstr "Perancis (alternatif, hapus tombol mati)"
#: ../rules/base.xml.in.h:455
-msgid "Kyrgyz"
-msgstr "Kyrgyzstan"
+msgid "French (alternative, Sun dead keys)"
+msgstr "Perancis (alternatif, tombol mati Sun)"
#: ../rules/base.xml.in.h:456
-msgid "Kyrgyz (phonetic)"
-msgstr "Kyrgystan (fonetik)"
+msgid "French (legacy, alternative)"
+msgstr "Perancis (legacy, alternatif)"
#: ../rules/base.xml.in.h:457
-msgid "Lao"
-msgstr "Lao"
+msgid "French (legacy, alternative, eliminate dead keys)"
+msgstr "Perancis (legacy, alternatif, hapus tombol mati)"
#: ../rules/base.xml.in.h:458
-msgid "Lao (STEA proposed standard layout)"
-msgstr "Laos (tata letak standar yang diusulkan STEA)"
+msgid "French (legacy, alternative, Sun dead keys)"
+msgstr "Perancis (legacy, alternatif, tombol mati Sun)"
#: ../rules/base.xml.in.h:459
-msgid "Laptop/notebook Compaq (eg. Armada) Laptop Keyboard"
-msgstr "Laptop/notebook Compaq (eg. Armada) Laptop Keyboard"
+msgid "French (Bepo, ergonomic, Dvorak way)"
+msgstr "Perancis (Bepo, ergonomis, Dvorak way)"
#: ../rules/base.xml.in.h:460
-msgid "Laptop/notebook Compaq (eg. Presario) Internet Keyboard"
-msgstr "Laptop/notebook Compaq (eg. Presario) Internet Keyboard"
+msgid "French (Bepo, ergonomic, Dvorak way, Latin-9 only)"
+msgstr "Perancis (Bepo, ergonomis, Dvorak way, hanya Latin-9)"
#: ../rules/base.xml.in.h:461
-msgid "Laptop/notebook eMachines m68xx"
-msgstr "Laptop/notebook eMachines m68xx"
+msgid "French (Dvorak)"
+msgstr "Perancis (Dvorak)"
-#: ../rules/base.xml.in.h:462 ../rules/base.extras.xml.in.h:16
-msgid "Latvian"
-msgstr "Latvia"
+#: ../rules/base.xml.in.h:462
+msgid "French (Macintosh)"
+msgstr "French (Macintosh)"
#: ../rules/base.xml.in.h:463
-msgid "Latvian (F variant)"
-msgstr "Latvia (varian F)"
+msgid "French (Breton)"
+msgstr "Perancis (Breton)"
#: ../rules/base.xml.in.h:464
-msgid "Latvian (adapted)"
-msgstr "Latvia (diadaptasi)"
+msgid "Occitan"
+msgstr "Occitan"
#: ../rules/base.xml.in.h:465
-msgid "Latvian (apostrophe variant)"
-msgstr "Latvia (varian apostrof)"
+msgid "Georgian (France, AZERTY Tskapo)"
+msgstr "Georgia (Perancis, AZERTY Tskapo)"
#: ../rules/base.xml.in.h:466
-msgid "Latvian (ergonomic, ŪGJRMV)"
-msgstr "Latvia (ergonomis, ŪGJRMV)"
+msgid "English (Ghana)"
+msgstr "Inggris (Ghana)"
#: ../rules/base.xml.in.h:467
-msgid "Latvian (modern)"
-msgstr "Latvia (modern)"
-
-#: ../rules/base.xml.in.h:468
-msgid "Latvian (tilde variant)"
-msgstr "Latvia (varian tilde)"
+msgid "English (Ghana, multilingual)"
+msgstr "Inggris (Ghana, multibahasa)"
+#. Keyboard indicator for Akan layouts
#: ../rules/base.xml.in.h:469
-msgid "Left Alt"
-msgstr "Alt Kiri"
+msgid "ak"
+msgstr "ak"
#: ../rules/base.xml.in.h:470
-msgid "Left Alt (while pressed)"
-msgstr "Alt Kiri (ketika ditekan)"
-
-#: ../rules/base.xml.in.h:471
-msgid "Left Alt is swapped with Left Win"
-msgstr "Alt Kiri ditukar dengan Win Kiri"
+msgid "Akan"
+msgstr "Akan"
+#. Keyboard indicator for Ewe layouts
#: ../rules/base.xml.in.h:472
-msgid "Left Alt+Left Shift"
-msgstr "Alt Kiri+Shift Kiri"
+msgid "ee"
+msgstr "ee"
#: ../rules/base.xml.in.h:473
-msgid "Left Ctrl"
-msgstr "Ctrl Kiri"
-
-#: ../rules/base.xml.in.h:474
-msgid "Left Ctrl (to first layout), Right Ctrl (to last layout)"
-msgstr "Ctrl Kiri (ke tata letak pertama), Ctrl Kanan (ke tata letak terakhir)"
+msgid "Ewe"
+msgstr "Ewe"
+#. Keyboard indicator for Fula layouts
#: ../rules/base.xml.in.h:475
-msgid "Left Ctrl as Meta"
-msgstr "Ctrl Kiri sebagai Meta"
+msgid "ff"
+msgstr "ff"
#: ../rules/base.xml.in.h:476
-msgid "Left Ctrl+Left Shift"
-msgstr "Ctrl Kiri+Shift Kiri"
-
-#: ../rules/base.xml.in.h:477
-msgid "Left Shift"
-msgstr "Shift Kiri"
+msgid "Fula"
+msgstr "Fula"
+#. Keyboard indicator for Ga layouts
#: ../rules/base.xml.in.h:478
-msgid "Left Win"
-msgstr "Win Kiri"
+msgid "gaa"
+msgstr "gaa"
#: ../rules/base.xml.in.h:479
-msgid "Left Win (to first layout), Right Win/Menu (to last layout)"
-msgstr "Win Kiri (ke tata letak pertama), Win/Menu Kanan (ke tata letak terakhir)"
-
-#: ../rules/base.xml.in.h:480
-msgid "Left Win (while pressed)"
-msgstr "Win Kiri (ketika ditekan)"
+msgid "Ga"
+msgstr "Ga"
+#. Keyboard indicator for Hausa layouts
#: ../rules/base.xml.in.h:481
-msgid "Left Win chooses 5th level, locks when pressed together with another 5th-level-chooser"
-msgstr "Win kiri memilih level kelima, terkunci jika ditekan bersamaan dengan pemilih-level-kelima lainnya"
+msgid "ha"
+msgstr "ha"
#: ../rules/base.xml.in.h:482
-msgid "LeftCtrl+LeftWin (to first layout), RightCtrl+Menu (to second layout)"
-msgstr "Ctrl Kiri+Win Kiri (ke tata letak pertama), Ctrl Kanan+Menu (ke tata letak kedua)"
-
-#: ../rules/base.xml.in.h:483
-msgid "Legacy"
-msgstr "Legacy"
+msgid "Hausa"
+msgstr "Hausa"
+#. Keyboard indicator for Avatime layouts
#: ../rules/base.xml.in.h:484
-msgid "Legacy Wang 724"
-msgstr "Legacy Wang 724"
+msgid "avn"
+msgstr "avn"
+
+#: ../rules/base.xml.in.h:485
+msgid "Avatime"
+msgstr "Avatime"
-#. Actually, with KP_SEPARATOR, as the old keypad(comma)
#: ../rules/base.xml.in.h:486
-msgid "Legacy key with comma"
-msgstr "Tombol Legacy dengan koma"
+msgid "English (Ghana, GILLBT)"
+msgstr "Inggris (Ghana, GILLBT)"
#: ../rules/base.xml.in.h:487
-msgid "Legacy key with dot"
-msgstr "Tombol Legacy dengan titik"
-
-#: ../rules/base.xml.in.h:488 ../rules/base.extras.xml.in.h:25
-msgid "Lithuanian"
-msgstr "Lituania"
+msgid "French (Guinea)"
+msgstr "Perancis (Guinea)"
+#. Keyboard indicator for Georgian layouts
#: ../rules/base.xml.in.h:489
-msgid "Lithuanian (IBM LST 1205-92)"
-msgstr "Lituania (IBM LST 1205-92)"
+msgid "ka"
+msgstr "ka"
#: ../rules/base.xml.in.h:490
-msgid "Lithuanian (LEKP)"
-msgstr "Lituania (LEKP)"
+msgid "Georgian"
+msgstr "Georgia"
#: ../rules/base.xml.in.h:491
-msgid "Lithuanian (LEKPa)"
-msgstr "Lituania (LEKPa)"
+msgid "Georgian (ergonomic)"
+msgstr "Georgia (ergonomik)"
#: ../rules/base.xml.in.h:492
-msgid "Lithuanian (US keyboard with Lithuanian letters)"
-msgstr "Lituania (papan tik AS dengan huruf Lituania)"
+msgid "Georgian (MESS)"
+msgstr "Georgia (MESS)"
#: ../rules/base.xml.in.h:493
-msgid "Lithuanian (standard)"
-msgstr "Lituania (standar)"
+msgid "Russian (Georgia)"
+msgstr "Rusia (Georgia)"
#: ../rules/base.xml.in.h:494
-msgid "Logitech Access Keyboard"
-msgstr "Logitech Access Keyboard"
+msgid "Ossetian (Georgia)"
+msgstr "Ossetia (Georgia)"
-#: ../rules/base.xml.in.h:495
-msgid "Logitech Cordless Desktop"
-msgstr "Logitech Cordless Desktop"
+#: ../rules/base.xml.in.h:495 ../rules/base.extras.xml.in.h:11
+msgid "German"
+msgstr "Jerman"
#: ../rules/base.xml.in.h:496
-msgid "Logitech Cordless Desktop (alternate option)"
-msgstr "Logitech Cordless Desktop (pilihan alternatif)"
+msgid "German (dead acute)"
+msgstr "Jerman (acute mati)"
#: ../rules/base.xml.in.h:497
-msgid "Logitech Cordless Desktop EX110"
-msgstr "Logitech Cordless Desktop EX110"
+msgid "German (dead grave acute)"
+msgstr "Jerman (grave acute mati)"
#: ../rules/base.xml.in.h:498
-msgid "Logitech Cordless Desktop LX-300"
-msgstr "Logitech Cordless Desktop LX-300"
+msgid "German (eliminate dead keys)"
+msgstr "Jerman (hapus tombol mati)"
#: ../rules/base.xml.in.h:499
-msgid "Logitech Cordless Desktop Navigator"
-msgstr "Logitech Cordless Desktop Navigator"
+msgid "German (T3)"
+msgstr "Jerman (T3)"
#: ../rules/base.xml.in.h:500
-msgid "Logitech Cordless Desktop Optical"
-msgstr "Logitech Cordless Desktop Optical"
+msgid "Romanian (Germany)"
+msgstr "Rumania (Jerman)"
#: ../rules/base.xml.in.h:501
-msgid "Logitech Cordless Desktop Pro (alternate option 2)"
-msgstr "Logitech Cordless Desktop Pro (opsi alternatif 2)"
+msgid "Romanian (Germany, eliminate dead keys)"
+msgstr "Rumania (Jerman, hapus tombol mati)"
#: ../rules/base.xml.in.h:502
-msgid "Logitech Cordless Desktop iTouch"
-msgstr "Logitech Cordless Desktop iTouch"
+msgid "German (Dvorak)"
+msgstr "Jerman (Dvorak)"
#: ../rules/base.xml.in.h:503
-msgid "Logitech Cordless Freedom/Desktop Navigator"
-msgstr "Logitech Cordless Freedom/Desktop Navigator"
+msgid "German (Sun dead keys)"
+msgstr "Jerman (tombol mati Sun)"
#: ../rules/base.xml.in.h:504
-msgid "Logitech G15 extra keys via G15daemon"
-msgstr "Logitech G15 extra keys via G15daemon"
+msgid "German (Neo 2)"
+msgstr "Jerman (Neo 2)"
#: ../rules/base.xml.in.h:505
-msgid "Logitech Generic Keyboard"
-msgstr "Papan Ketik Generik Logitech"
+msgid "German (Macintosh)"
+msgstr "German (Macintosh)"
#: ../rules/base.xml.in.h:506
-msgid "Logitech Internet 350 Keyboard"
-msgstr "Papan Ketik Logitech Internet 350"
+msgid "German (Macintosh, eliminate dead keys)"
+msgstr "Jerman (Macintosh, hapus tombol mati)"
#: ../rules/base.xml.in.h:507
-msgid "Logitech Internet Keyboard"
-msgstr "Papan Ketik Internet Logitech"
+msgid "Lower Sorbian"
+msgstr "Lower Sorbian"
#: ../rules/base.xml.in.h:508
-msgid "Logitech Internet Navigator Keyboard"
-msgstr "Papan Ketik Navigator Internet Logitech"
+msgid "Lower Sorbian (qwertz)"
+msgstr "Lower Sorbian (qwertz)"
#: ../rules/base.xml.in.h:509
-msgid "Logitech Media Elite Keyboard"
-msgstr "Papan Ketik Logitech Media Elite"
+msgid "German (qwerty)"
+msgstr "Jerman (qwerty)"
#: ../rules/base.xml.in.h:510
-msgid "Logitech Ultra-X Cordless Media Desktop Keyboard"
-msgstr "Papan Ketik Logitech Ultra-X Cordless Media Desktop"
+msgid "Russian (Germany, phonetic)"
+msgstr "Rusia (Jerman, fonetik)"
#: ../rules/base.xml.in.h:511
-msgid "Logitech Ultra-X Keyboard"
-msgstr "Papan Ketik Logitech Ultra-X"
-
-#: ../rules/base.xml.in.h:512
-msgid "Logitech diNovo Edge Keyboard"
-msgstr "Papan Ketik Logitech diNovo Edge"
+msgid "German (legacy)"
+msgstr "Jerman (legacy)"
-#: ../rules/base.xml.in.h:513
-msgid "Logitech diNovo Keyboard"
-msgstr "Papan Ketik Logitech diNovo"
+#. Keyboard indicator for Greek layouts
+#: ../rules/base.xml.in.h:513 ../rules/base.extras.xml.in.h:91
+msgid "gr"
+msgstr "gr"
-#: ../rules/base.xml.in.h:514
-msgid "Logitech iTouch"
-msgstr "Logitech iTouch"
+#: ../rules/base.xml.in.h:514 ../rules/base.extras.xml.in.h:92
+msgid "Greek"
+msgstr "Yunani"
#: ../rules/base.xml.in.h:515
-msgid "Logitech iTouch Cordless Keyboard (model Y-RB6)"
-msgstr "Logitech iTouch Cordless Keyboard (model Y-RB6)"
+msgid "Greek (simple)"
+msgstr "Yunani (sederhana)"
#: ../rules/base.xml.in.h:516
-msgid "Logitech iTouch Internet Navigator Keyboard SE"
-msgstr "Logitech iTouch Internet Navigator Keyboard SE"
+msgid "Greek (extended)"
+msgstr "Yunani (diperluas)"
#: ../rules/base.xml.in.h:517
-msgid "Logitech iTouch Internet Navigator Keyboard SE (USB)"
-msgstr "Logitech iTouch Internet Navigator Keyboard SE (USB)"
+msgid "Greek (eliminate dead keys)"
+msgstr "Yunani (hapus tombol mati)"
#: ../rules/base.xml.in.h:518
-msgid "Lower Sorbian"
-msgstr "Lower Sorbian"
-
-#: ../rules/base.xml.in.h:519
-msgid "Lower Sorbian (qwertz)"
-msgstr "Lower Sorbian (qwertz)"
+msgid "Greek (polytonic)"
+msgstr "Yunani (politonik)"
+#. Keyboard indicator for Hungarian layouts
#: ../rules/base.xml.in.h:520
-msgid "MacBook/MacBook Pro"
-msgstr "MacBook/MacBook Pro"
+msgid "hu"
+msgstr "hu"
#: ../rules/base.xml.in.h:521
-msgid "MacBook/MacBook Pro (Intl)"
-msgstr "MacBook/MacBook Pro (Intl)"
+msgid "Hungarian"
+msgstr "Hungaria"
#: ../rules/base.xml.in.h:522
-msgid "Macedonian"
-msgstr "Masedonia"
+msgid "Hungarian (standard)"
+msgstr "Hungaria (standar)"
#: ../rules/base.xml.in.h:523
-msgid "Macedonian (eliminate dead keys)"
-msgstr "Makedonia (hapus tombol mati)"
+msgid "Hungarian (eliminate dead keys)"
+msgstr "Hungaria (hapus tombol mati)"
#: ../rules/base.xml.in.h:524
-msgid "Macintosh"
-msgstr "Macintosh"
+msgid "Hungarian (qwerty)"
+msgstr "Hungaria (qwerty)"
#: ../rules/base.xml.in.h:525
-msgid "Macintosh Old"
-msgstr "Macintosh Old"
+msgid "Hungarian (101/qwertz/comma/dead keys)"
+msgstr "Hungaria (101/qwertz/koma/tombol mati)"
#: ../rules/base.xml.in.h:526
-msgid "Make Caps Lock an additional Backspace"
-msgstr "Buat Caps Lock sebagai tambahan Backspace"
+msgid "Hungarian (101/qwertz/comma/eliminate dead keys)"
+msgstr "Hungaria (101/qwertz/koma/hapus tombol mati)"
#: ../rules/base.xml.in.h:527
-msgid "Make Caps Lock an additional Control but keep the Caps_Lock keysym"
-msgstr "Buat Caps Lock sebagai tambahan Control tapi pertahankan keysym Caps_Lock"
+msgid "Hungarian (101/qwertz/dot/dead keys)"
+msgstr "Hungaria (101/awertz/titik/tombol mati)"
#: ../rules/base.xml.in.h:528
-msgid "Make Caps Lock an additional ESC"
-msgstr "Buat Caps Lock sebagai tambahan ESC"
+msgid "Hungarian (101/qwertz/dot/eliminate dead keys)"
+msgstr "Hungaria (101/qwertz/titik/hapus tombol mati)"
#: ../rules/base.xml.in.h:529
-msgid "Make Caps Lock an additional Hyper"
-msgstr "Buat Caps Lock sebagai tambahan Hiper"
+msgid "Hungarian (101/qwerty/comma/dead keys)"
+msgstr "Hungaria (101/qwerty/koma/tombol mati)"
#: ../rules/base.xml.in.h:530
-msgid "Make Caps Lock an additional Num Lock"
-msgstr "Buat Caps Lock sebagai tambahan Num Lock"
+msgid "Hungarian (101/qwerty/comma/eliminate dead keys)"
+msgstr "Hungaria (101/qwerty/koma/hapus tombol mati)"
#: ../rules/base.xml.in.h:531
-msgid "Make Caps Lock an additional Super"
-msgstr "Buat Caps Lock sebagai tambahan Super"
+msgid "Hungarian (101/qwerty/dot/dead keys)"
+msgstr "Hungaria (101/qwerty/titik/tombol mati)"
#: ../rules/base.xml.in.h:532
-msgid "Make Zenkaku Hankaku an additional ESC"
-msgstr "Buat Zenkaku Hankaku sebagai tambahan ESC"
+msgid "Hungarian (101/qwerty/dot/eliminate dead keys)"
+msgstr "Hungaria (101/qwerty/titik/hapus tombol mati)"
#: ../rules/base.xml.in.h:533
-msgid "Malayalam"
-msgstr "Malayalam"
+msgid "Hungarian (102/qwertz/comma/dead keys)"
+msgstr "Hungaria (102/qwertz/koma/tombol mati)"
#: ../rules/base.xml.in.h:534
-msgid "Malayalam (Lalitha)"
-msgstr "Malayalam (Lalitha)"
+msgid "Hungarian (102/qwertz/comma/eliminate dead keys)"
+msgstr "Hungaria (102/qwertz/koma/hapus tombol mati)"
#: ../rules/base.xml.in.h:535
-msgid "Malayalam (enhanced Inscript with Rupee Sign)"
-msgstr "Malayalam (Inscript ditingkatkan dengan Tanda Rupee)"
+msgid "Hungarian (102/qwertz/dot/dead keys)"
+msgstr "Hungaria (102/qwertz/titik/tombol mati)"
#: ../rules/base.xml.in.h:536
-msgid "Maltese"
-msgstr "Malta"
+msgid "Hungarian (102/qwertz/dot/eliminate dead keys)"
+msgstr "Hungaria (102/qwertz/titik/hapus tombol mati)"
#: ../rules/base.xml.in.h:537
-msgid "Maltese (with US layout)"
-msgstr "Malta (dengan tata letak AS)"
+msgid "Hungarian (102/qwerty/comma/dead keys)"
+msgstr "Hungaria (102/qwerty/koma/tombol mati)"
#: ../rules/base.xml.in.h:538
-msgid "Maori"
-msgstr "Maori"
+msgid "Hungarian (102/qwerty/comma/eliminate dead keys)"
+msgstr "Hungaria (102/qwerty/koma/hapus tombol mati)"
#: ../rules/base.xml.in.h:539
-msgid "Mari"
-msgstr "Mari"
+msgid "Hungarian (102/qwerty/dot/dead keys)"
+msgstr "Hungaria (102/qwerty/titik/tombol mati)"
#: ../rules/base.xml.in.h:540
-msgid "Memorex MX1998"
-msgstr "Memorex MX1998"
-
-#: ../rules/base.xml.in.h:541
-msgid "Memorex MX2500 EZ-Access Keyboard"
-msgstr "Papan Ketik Memorex MX2500 EZ-Access"
+msgid "Hungarian (102/qwerty/dot/eliminate dead keys)"
+msgstr "Hungaria (102/qwerty/titik/hapus tombol mati)"
+#. Keyboard indicator for Icelandic layouts
#: ../rules/base.xml.in.h:542
-msgid "Memorex MX2750"
-msgstr "Memorex MX2750"
+msgid "is"
+msgstr "is"
#: ../rules/base.xml.in.h:543
-msgid "Menu"
-msgstr "Menu"
+msgid "Icelandic"
+msgstr "Islandia"
#: ../rules/base.xml.in.h:544
-msgid "Menu as Right Ctrl"
-msgstr "Menu sebagai Ctrl Kanan"
+msgid "Icelandic (Sun dead keys)"
+msgstr "Islandia (tombol mati Sun)"
#: ../rules/base.xml.in.h:545
-msgid "Meta is mapped to Left Win"
-msgstr "Meta dipetakan ke tombol Win Kiri"
+msgid "Icelandic (eliminate dead keys)"
+msgstr "Islandia (hapus tombol mati)"
#: ../rules/base.xml.in.h:546
-msgid "Meta is mapped to Win keys"
-msgstr "Meta dipetakan ke tombol Win"
+msgid "Icelandic (Macintosh)"
+msgstr "Islandia (Macintosh)"
#: ../rules/base.xml.in.h:547
-msgid "Microsoft Comfort Curve Keyboard 2000"
-msgstr "Microsoft Comfort Curve Keyboard 2000"
-
-#: ../rules/base.xml.in.h:548
-msgid "Microsoft Internet Keyboard"
-msgstr "Papan Ketik Internet Microsoft"
+msgid "Icelandic (Dvorak)"
+msgstr "Islandia (Dvorak)"
-#: ../rules/base.xml.in.h:549
-msgid "Microsoft Internet Keyboard Pro, Swedish"
-msgstr "Microsoft Internet Keyboard Pro, Swedia"
+#. Keyboard indicator for Hebrew layouts
+#: ../rules/base.xml.in.h:549 ../rules/base.extras.xml.in.h:62
+msgid "he"
+msgstr "he"
-#: ../rules/base.xml.in.h:550
-msgid "Microsoft Natural"
-msgstr "Microsoft Natural"
+#: ../rules/base.xml.in.h:550 ../rules/base.extras.xml.in.h:63
+msgid "Hebrew"
+msgstr "Ibrani"
#: ../rules/base.xml.in.h:551
-msgid "Microsoft Natural Keyboard Elite"
-msgstr "Microsoft Natural Keyboard Elite"
+msgid "Hebrew (lyx)"
+msgstr "Ibrani (lyx)"
#: ../rules/base.xml.in.h:552
-msgid "Microsoft Natural Keyboard Pro / Microsoft Internet Keyboard Pro"
-msgstr "Microsoft Natural Keyboard Pro / Microsoft Internet Keyboard Pro"
+msgid "Hebrew (phonetic)"
+msgstr "Ibrani (fonetik)"
#: ../rules/base.xml.in.h:553
-msgid "Microsoft Natural Keyboard Pro OEM"
-msgstr "Microsoft Natural Keyboard Pro OEM"
-
-#: ../rules/base.xml.in.h:554
-msgid "Microsoft Natural Keyboard Pro USB / Microsoft Internet Keyboard Pro"
-msgstr "Microsoft Natural Keyboard Pro USB / Microsoft Internet Keyboard Pro"
+msgid "Hebrew (Biblical, Tiro)"
+msgstr "Ibrani (Biblical, Tiro)"
-#: ../rules/base.xml.in.h:555
-msgid "Microsoft Natural Wireless Ergonomic Keyboard 4000"
-msgstr "Papan Tik Ergonomis Nirkabel Alami Microsoft 4000"
+#. Keyboard indicator for Italian layouts
+#: ../rules/base.xml.in.h:555 ../rules/base.extras.xml.in.h:94
+msgid "it"
+msgstr "it"
-#: ../rules/base.xml.in.h:556
-msgid "Microsoft Natural Wireless Ergonomic Keyboard 7000"
-msgstr "Microsoft Natural Wireless Ergonomic Keyboard 7000"
+#: ../rules/base.xml.in.h:556 ../rules/base.extras.xml.in.h:95
+msgid "Italian"
+msgstr "Italia"
#: ../rules/base.xml.in.h:557
-msgid "Microsoft Office Keyboard"
-msgstr "Papan Ketik Microsoft Office"
+msgid "Italian (eliminate dead keys)"
+msgstr "Italia (hapus tombol mati)"
#: ../rules/base.xml.in.h:558
-msgid "Microsoft Wireless Multimedia Keyboard 1.0A"
-msgstr "Microsoft Wireless Multimedia Keyboard 1.0A"
+msgid "Italian (Macintosh)"
+msgstr "Italia (Macintosh)"
#: ../rules/base.xml.in.h:559
-msgid "Miscellaneous compatibility options"
-msgstr "Pilihan kompabilitas lain-lain"
+msgid "Italian (US keyboard with Italian letters)"
+msgstr "Italia (papan tik AS dengan huruf Italia)"
#: ../rules/base.xml.in.h:560
-msgid "Mongolian"
-msgstr "Mongolia"
+msgid "Georgian (Italy)"
+msgstr "Georgia (Italia)"
#: ../rules/base.xml.in.h:561
-msgid "Montenegrin"
-msgstr "Montenegro"
-
-#: ../rules/base.xml.in.h:562
-msgid "Montenegrin (Cyrillic with guillemets)"
-msgstr "Montenegro (Sirilik dengan guillemets)"
+msgid "Italian (IBM 142)"
+msgstr "Italia (IBM 142)"
-#: ../rules/base.xml.in.h:563
-msgid "Montenegrin (Cyrillic)"
-msgstr "Montenegro (Sirilik)"
+#. Keyboard indicator for Japanese layouts
+#: ../rules/base.xml.in.h:563 ../rules/base.extras.xml.in.h:97
+msgid "ja"
+msgstr "ja"
-#: ../rules/base.xml.in.h:564
-msgid "Montenegrin (Cyrillic, Z and ZHE swapped)"
-msgstr "Montenegro (Sirilik, Z dan ZHE ditukar)"
+#: ../rules/base.xml.in.h:564 ../rules/base.extras.xml.in.h:98
+msgid "Japanese"
+msgstr "Jepang"
#: ../rules/base.xml.in.h:565
-msgid "Montenegrin (Latin Unicode qwerty)"
-msgstr "Montenegro (qwerty Unicode Latin)"
+msgid "Japanese (Kana)"
+msgstr "Jepang (Kana)"
#: ../rules/base.xml.in.h:566
-msgid "Montenegrin (Latin Unicode)"
-msgstr "Montenegro (Unicode Latin)"
+msgid "Japanese (Kana 86)"
+msgstr "Jepang (Kana 86)"
#: ../rules/base.xml.in.h:567
-msgid "Montenegrin (Latin qwerty)"
-msgstr "Montenegro (qwerty Latin)"
+msgid "Japanese (OADG 109A)"
+msgstr "Jepang (OADG 109A)"
#: ../rules/base.xml.in.h:568
-msgid "Montenegrin (Latin with guillemets)"
-msgstr "Montenegro (Latin dengan guillemets)"
+msgid "Japanese (Macintosh)"
+msgstr "Jepang (Macintosh)"
#: ../rules/base.xml.in.h:569
-msgid "NICOLA-F style Backspace"
-msgstr "NICOLA-F style Backspace"
-
-#: ../rules/base.xml.in.h:570
-msgid "Nepali"
-msgstr "Nepal"
+msgid "Japanese (Dvorak)"
+msgstr "Jepang (Dvorak)"
+#. Keyboard indicator for Kikuyu layouts
#: ../rules/base.xml.in.h:571
-msgid "Non-breakable space character at fourth level"
-msgstr "Karakter spasi yang tidak pecah pada level 4"
+msgid "ki"
+msgstr "ki"
#: ../rules/base.xml.in.h:572
-msgid "Non-breakable space character at fourth level, thin non-breakable space character at sixth level"
-msgstr "Karakter spasi yang tidak pecah pada level 4, karakter spasi yang tidak pecah dan tipis pada level 6"
+msgid "Kyrgyz"
+msgstr "Kyrgyzstan"
#: ../rules/base.xml.in.h:573
-msgid "Non-breakable space character at fourth level, thin non-breakable space character at sixth level (via Ctrl+Shift)"
-msgstr "Karakter spasi yang tidak pecah pada level 4, karakter spasi yang tidak pecah dan tipis pada level 6 (via Ctrl+Shift)"
-
-#: ../rules/base.xml.in.h:574
-msgid "Non-breakable space character at second level"
-msgstr "Karakter spasi yang tidak pecah pada level 2"
+msgid "Kyrgyz (phonetic)"
+msgstr "Kyrgystan (fonetik)"
+#. Keyboard indicator for Khmer layouts
#: ../rules/base.xml.in.h:575
-msgid "Non-breakable space character at third level"
-msgstr "Karakter spasi yang tidak pecah pada level 3"
+msgid "km"
+msgstr "km"
#: ../rules/base.xml.in.h:576
-msgid "Non-breakable space character at third level, nothing at fourth level"
-msgstr "Karakter spasi yang tidak pecah pada level 3, tidak ada pada level 4"
-
-#: ../rules/base.xml.in.h:577
-msgid "Non-breakable space character at third level, thin non-breakable space character at fourth level"
-msgstr "Karakter spasi yang tidak pecah pada level 3, karakter spasi yang tidak pecah dan tipis pada level 4"
+msgid "Khmer (Cambodia)"
+msgstr "Khmer (Kamboja)"
+#. Keyboard indicator for Kazakh layouts
#: ../rules/base.xml.in.h:578
-msgid "Northern Saami (Finland)"
-msgstr "Saami Utara (Finlandia)"
+msgid "kk"
+msgstr "kk"
#: ../rules/base.xml.in.h:579
-msgid "Northern Saami (Norway)"
-msgstr "Saami Utara (Norwegia)"
+msgid "Kazakh"
+msgstr "Kazakh"
#: ../rules/base.xml.in.h:580
-msgid "Northern Saami (Norway, eliminate dead keys)"
-msgstr "Saami Utara (Norwegia, hapus tombo mati)"
+msgid "Russian (Kazakhstan, with Kazakh)"
+msgstr "Rusia (Kazakhstan, dengan Kazakh)"
#: ../rules/base.xml.in.h:581
-msgid "Northern Saami (Sweden)"
-msgstr "Saami Utara (Swedia)"
-
-#: ../rules/base.xml.in.h:582
-msgid "Northgate OmniKey 101"
-msgstr "Northgate OmniKey 101"
+msgid "Kazakh (with Russian)"
+msgstr "Kazakh (dengan Rusia)"
+#. Keyboard indicator for Lao layouts
#: ../rules/base.xml.in.h:583
-msgid "Norwegian"
-msgstr "Norwegia"
+msgid "lo"
+msgstr "lo"
#: ../rules/base.xml.in.h:584
-msgid "Norwegian (Dvorak)"
-msgstr "Norwegia (Dvorak)"
+msgid "Lao"
+msgstr "Lao"
#: ../rules/base.xml.in.h:585
-msgid "Norwegian (Macintosh)"
-msgstr "Norwegia (Macintosh)"
-
-#: ../rules/base.xml.in.h:586
-msgid "Norwegian (Macintosh, eliminate dead keys)"
-msgstr "Norwegia (Macintosh, hapus tombol mati)"
+msgid "Lao (STEA proposed standard layout)"
+msgstr "Laos (tata letak standar yang diusulkan STEA)"
-#: ../rules/base.xml.in.h:587
-msgid "Norwegian (eliminate dead keys)"
-msgstr "Norwegia (hapus tombol mati)"
+#. Keyboard indicator for Spanish layouts
+#: ../rules/base.xml.in.h:587 ../rules/base.extras.xml.in.h:110
+msgid "es"
+msgstr "es"
#: ../rules/base.xml.in.h:588
-msgid "Num Lock"
-msgstr "Num Lock"
+msgid "Spanish (Latin American)"
+msgstr "Spanyol (Amerika Latin)"
#: ../rules/base.xml.in.h:589
-msgid "Numeric keypad delete key behaviour"
-msgstr "Keypad numerik menghapus perilaku tombol"
+msgid "Spanish (Latin American, eliminate dead keys)"
+msgstr "Spanyol (Amerika Latin, hapus tombol mati)"
#: ../rules/base.xml.in.h:590
-msgid "Numeric keypad keys always enter digits (as in Mac OS)"
-msgstr "Keypad numerik selalu memasukkan digit (seperti dalam Mac OS)"
+msgid "Spanish (Latin American, include dead tilde)"
+msgstr "Spanyol (Amerika Latin, termasuk tilde mati)"
#: ../rules/base.xml.in.h:591
-msgid "Numeric keypad layout selection"
-msgstr "Pilihan layout Keypad numerik "
-
-#: ../rules/base.xml.in.h:592
-msgid "OLPC"
-msgstr "OLPC"
+msgid "Spanish (Latin American, Sun dead keys)"
+msgstr "Spanyol (Amerika Latin, tombol mati Sun)"
-#: ../rules/base.xml.in.h:593
-msgid "Occitan"
-msgstr "Occitan"
+#. Keyboard indicator for Lithuanian layouts
+#: ../rules/base.xml.in.h:593 ../rules/base.extras.xml.in.h:18
+msgid "lt"
+msgstr "lt"
-#: ../rules/base.xml.in.h:594
-msgid "Ogham"
-msgstr "Ogham"
+#: ../rules/base.xml.in.h:594 ../rules/base.extras.xml.in.h:19
+msgid "Lithuanian"
+msgstr "Lituania"
#: ../rules/base.xml.in.h:595
-msgid "Ogham (IS434)"
-msgstr "Ogham (IS434)"
+msgid "Lithuanian (standard)"
+msgstr "Lituania (standar)"
#: ../rules/base.xml.in.h:596
-msgid "Oriya"
-msgstr "Oriya"
+msgid "Lithuanian (US keyboard with Lithuanian letters)"
+msgstr "Lituania (papan tik AS dengan huruf Lituania)"
#: ../rules/base.xml.in.h:597
-msgid "Ortek MCK-800 MM/Internet keyboard"
-msgstr "Ortek MCK-800 MM/Internet keyboard"
+msgid "Lithuanian (IBM LST 1205-92)"
+msgstr "Lituania (IBM LST 1205-92)"
#: ../rules/base.xml.in.h:598
-msgid "Ossetian (Georgia)"
-msgstr "Ossetia (Georgia)"
+msgid "Lithuanian (LEKP)"
+msgstr "Lituania (LEKP)"
#: ../rules/base.xml.in.h:599
-msgid "Ossetian (WinKeys)"
-msgstr "Ossetia (WinKeys)"
-
-#: ../rules/base.xml.in.h:600
-msgid "Ossetian (legacy)"
-msgstr "Ossetia (warisan)"
+msgid "Lithuanian (LEKPa)"
+msgstr "Lituania (LEKPa)"
-#: ../rules/base.xml.in.h:601
-msgid "PC-98xx Series"
-msgstr "Seri PC-98xx"
+#. Keyboard indicator for Latvian layouts
+#: ../rules/base.xml.in.h:601 ../rules/base.extras.xml.in.h:22
+msgid "lv"
+msgstr "lv"
-#: ../rules/base.xml.in.h:602
-msgid "Pannonian Rusyn (homophonic)"
-msgstr "Pannonian Rusyn (homofon)"
+#: ../rules/base.xml.in.h:602 ../rules/base.extras.xml.in.h:23
+msgid "Latvian"
+msgstr "Latvia"
#: ../rules/base.xml.in.h:603
-msgid "Pashto"
-msgstr "Pashto"
+msgid "Latvian (apostrophe variant)"
+msgstr "Latvia (varian apostrof)"
#: ../rules/base.xml.in.h:604
-msgid "Pashto (Afghanistan, OLPC)"
-msgstr "Pashto (Afghanistan, OLPC)"
+msgid "Latvian (tilde variant)"
+msgstr "Latvia (varian tilde)"
#: ../rules/base.xml.in.h:605
-msgid "Pause"
-msgstr "Pause"
+msgid "Latvian (F variant)"
+msgstr "Latvia (varian F)"
-#: ../rules/base.xml.in.h:606 ../rules/base.extras.xml.in.h:27
-msgid "Persian"
-msgstr "Persia"
+#: ../rules/base.xml.in.h:606
+msgid "Latvian (modern)"
+msgstr "Latvia (modern)"
#: ../rules/base.xml.in.h:607
-msgid "Persian (Afghanistan, Dari OLPC)"
-msgstr "Persia (Afghanistan, Dari OLPC)"
+msgid "Latvian (ergonomic, ŪGJRMV)"
+msgstr "Latvia (ergonomis, ŪGJRMV)"
#: ../rules/base.xml.in.h:608
-msgid "Persian (with Persian Keypad)"
-msgstr "Persia (dengan papan tik Persia)"
-
-#: ../rules/base.xml.in.h:609 ../rules/base.extras.xml.in.h:28
-msgid "Polish"
-msgstr "Polandia"
+msgid "Latvian (adapted)"
+msgstr "Latvia (diadaptasi)"
+#. Keyboard indicator for Maori layouts
#: ../rules/base.xml.in.h:610
-msgid "Polish (Dvorak)"
-msgstr "Polandia (Dvorak)"
+msgid "mi"
+msgstr "mi"
#: ../rules/base.xml.in.h:611
-msgid "Polish (Dvorak, Polish quotes on key 1)"
-msgstr "Polandia (Dvorak, tanda kutip Polandia pada tombol 1)"
-
-#: ../rules/base.xml.in.h:612
-msgid "Polish (Dvorak, Polish quotes on quotemark key)"
-msgstr "Polandia (Dvorak, tanda kutip Polandia pada tombol quotemark)"
+msgid "Maori"
+msgstr "Maori"
-#: ../rules/base.xml.in.h:613
-msgid "Polish (programmer Dvorak)"
-msgstr "Polandia (Dvorak pemrogram)"
+#. Keyboard indicator for Serbian layouts
+#: ../rules/base.xml.in.h:613 ../rules/base.extras.xml.in.h:52
+msgid "sr"
+msgstr "sr"
#: ../rules/base.xml.in.h:614
-msgid "Polish (qwertz)"
-msgstr "Polandia (qwertz)"
+msgid "Montenegrin"
+msgstr "Montenegro"
#: ../rules/base.xml.in.h:615
-msgid "Portuguese"
-msgstr "Portugis"
+msgid "Montenegrin (Cyrillic)"
+msgstr "Montenegro (Sirilik)"
#: ../rules/base.xml.in.h:616
-msgid "Portuguese (Brazil)"
-msgstr "Portugis (Brasil)"
+msgid "Montenegrin (Cyrillic, Z and ZHE swapped)"
+msgstr "Montenegro (Sirilik, Z dan ZHE ditukar)"
#: ../rules/base.xml.in.h:617
-msgid "Portuguese (Brazil, Dvorak)"
-msgstr "Portugis (Brasil, Dvorak)"
+msgid "Montenegrin (Latin Unicode)"
+msgstr "Montenegro (Unicode Latin)"
#: ../rules/base.xml.in.h:618
-msgid "Portuguese (Brazil, eliminate dead keys)"
-msgstr "Portugis (Brasil, hapus tombo mati)"
+msgid "Montenegrin (Latin qwerty)"
+msgstr "Montenegro (qwerty Latin)"
#: ../rules/base.xml.in.h:619
-msgid "Portuguese (Brazil, nativo for Esperanto)"
-msgstr "Portugis (Brasil, nativo untuk Esperanto)"
+msgid "Montenegrin (Latin Unicode qwerty)"
+msgstr "Montenegro (qwerty Unicode Latin)"
#: ../rules/base.xml.in.h:620
-msgid "Portuguese (Brazil, nativo for USA keyboards)"
-msgstr "Portugis (Brasil, nativo untuk papan tik AS)"
+msgid "Montenegrin (Cyrillic with guillemets)"
+msgstr "Montenegro (Sirilik dengan guillemets)"
#: ../rules/base.xml.in.h:621
-msgid "Portuguese (Brazil, nativo)"
-msgstr "Portugis (Brasil, nativo)"
-
-#: ../rules/base.xml.in.h:622
-msgid "Portuguese (Macintosh)"
-msgstr "Portugis (Macintosh)"
+msgid "Montenegrin (Latin with guillemets)"
+msgstr "Montenegro (Latin dengan guillemets)"
+#. Keyboard indicator for Macedonian layouts
#: ../rules/base.xml.in.h:623
-msgid "Portuguese (Macintosh, Sun dead keys)"
-msgstr "Portugis (Macintosh, tombol mati Sun)"
+msgid "mk"
+msgstr "mk"
#: ../rules/base.xml.in.h:624
-msgid "Portuguese (Macintosh, eliminate dead keys)"
-msgstr "Portugis (Macintosh, hapus tombol mati)"
+msgid "Macedonian"
+msgstr "Masedonia"
#: ../rules/base.xml.in.h:625
-msgid "Portuguese (Nativo for USA keyboards)"
-msgstr "Portugis (Nativo untuk papan tik AS)"
-
-#: ../rules/base.xml.in.h:626
-msgid "Portuguese (Nativo)"
-msgstr "Portugis (Nativo)"
+msgid "Macedonian (eliminate dead keys)"
+msgstr "Makedonia (hapus tombol mati)"
+#. Keyboard indicator for Maltese layouts
#: ../rules/base.xml.in.h:627
-msgid "Portuguese (Sun dead keys)"
-msgstr "Portugis (tombol mati Sun)"
+msgid "mt"
+msgstr "mt"
#: ../rules/base.xml.in.h:628
-msgid "Portuguese (eliminate dead keys)"
-msgstr "Portugis (hapus tombol mati)"
+msgid "Maltese"
+msgstr "Malta"
#: ../rules/base.xml.in.h:629
-msgid "Propeller Voyager (KTEZ-1000)"
-msgstr "Propeller Voyager (KTEZ-1000)"
-
-#: ../rules/base.xml.in.h:630
-msgid "PrtSc"
-msgstr "PrtSc"
+msgid "Maltese (with US layout)"
+msgstr "Malta (dengan tata letak AS)"
+#. Keyboard indicator for Mongolian layouts
#: ../rules/base.xml.in.h:631
-msgid "Punjabi (Gurmukhi Jhelum)"
-msgstr "Punjab (Gurmukhi Jhelum)"
+msgid "mn"
+msgstr "mn"
#: ../rules/base.xml.in.h:632
-msgid "Punjabi (Gurmukhi)"
-msgstr "Punjab (Gurmukhi)"
-
-#: ../rules/base.xml.in.h:633
-msgid "QTronix Scorpius 98N+"
-msgstr "QTronix Scorpius 98N+"
+msgid "Mongolian"
+msgstr "Mongolia"
-#: ../rules/base.xml.in.h:634
-msgid "Right Alt"
-msgstr "Alt Kanan"
+#. Keyboard indicator for Norwegian layouts
+#: ../rules/base.xml.in.h:634 ../rules/base.extras.xml.in.h:102
+msgid "no"
+msgstr "no"
-#: ../rules/base.xml.in.h:635
-msgid "Right Alt (while pressed)"
-msgstr "Alt Kanan (ketika ditekan)"
+#: ../rules/base.xml.in.h:635 ../rules/base.extras.xml.in.h:103
+msgid "Norwegian"
+msgstr "Norwegia"
#: ../rules/base.xml.in.h:636
-msgid "Right Alt as Right Ctrl"
-msgstr "Alt Kanan sebagai Ctrl Kanan"
+msgid "Norwegian (eliminate dead keys)"
+msgstr "Norwegia (hapus tombol mati)"
#: ../rules/base.xml.in.h:637
-msgid "Right Alt chooses 5th level, locks when pressed together with another 5th-level-chooser"
-msgstr "Alt kanan memilih level kelima, terkunci jika ditekan bersamaan dengan pemilih-level-kelima lainnya"
+msgid "Norwegian (Dvorak)"
+msgstr "Norwegia (Dvorak)"
#: ../rules/base.xml.in.h:638
-msgid "Right Alt key never chooses 3rd level"
-msgstr "Alt Kanan tidak pernah memilih level 3"
+msgid "Northern Saami (Norway)"
+msgstr "Saami Utara (Norwegia)"
#: ../rules/base.xml.in.h:639
-msgid "Right Alt, Shift+Right Alt key is Multi_Key"
-msgstr "Alt Kanan, Shift+Right Alt adalah Multi_Key"
+msgid "Northern Saami (Norway, eliminate dead keys)"
+msgstr "Saami Utara (Norwegia, hapus tombo mati)"
#: ../rules/base.xml.in.h:640
-msgid "Right Ctrl"
-msgstr "Ctrl Kanan"
+msgid "Norwegian (Macintosh)"
+msgstr "Norwegia (Macintosh)"
#: ../rules/base.xml.in.h:641
-msgid "Right Ctrl (while pressed)"
-msgstr "Ctrl Kanan (ketika ditekan)"
+msgid "Norwegian (Macintosh, eliminate dead keys)"
+msgstr "Norwegia (Macintosh, hapus tombol mati)"
#: ../rules/base.xml.in.h:642
-msgid "Right Ctrl as Right Alt"
-msgstr "Ctrl Kanan bertindak seperti Alt Kanan"
+msgid "Norwegian (Colemak)"
+msgstr "Norwegia (Colemak)"
-#: ../rules/base.xml.in.h:643
-msgid "Right Ctrl+Right Shift"
-msgstr "Ctrl Kanan+Shift Kanan"
-
-#: ../rules/base.xml.in.h:644
-msgid "Right Shift"
-msgstr "Shift Kanan"
+#. Keyboard indicator for Polish layouts
+#: ../rules/base.xml.in.h:644 ../rules/base.extras.xml.in.h:41
+msgid "pl"
+msgstr "pl"
-#: ../rules/base.xml.in.h:645
-msgid "Right Win"
-msgstr "Win Kanan"
+#: ../rules/base.xml.in.h:645 ../rules/base.extras.xml.in.h:42
+msgid "Polish"
+msgstr "Polandia"
#: ../rules/base.xml.in.h:646
-msgid "Right Win (while pressed)"
-msgstr "Win Kanan (ketika ditekan)"
+msgid "Polish (legacy)"
+msgstr "Polandia (warisan)"
#: ../rules/base.xml.in.h:647
-msgid "Right Win chooses 5th level, locks when pressed together with another 5th-level-chooser"
-msgstr "Win kanan memilih level kelima, terkunci jika ditekan bersamaan dengan pemilih-level-kelima"
+msgid "Polish (qwertz)"
+msgstr "Polandia (qwertz)"
-#: ../rules/base.xml.in.h:648 ../rules/base.extras.xml.in.h:30
-msgid "Romanian"
-msgstr "Rumania"
+#: ../rules/base.xml.in.h:648
+msgid "Polish (Dvorak)"
+msgstr "Polandia (Dvorak)"
#: ../rules/base.xml.in.h:649
-msgid "Romanian (Germany)"
-msgstr "Rumania (Jerman)"
+msgid "Polish (Dvorak, Polish quotes on quotemark key)"
+msgstr "Polandia (Dvorak, tanda kutip Polandia pada tombol quotemark)"
#: ../rules/base.xml.in.h:650
-msgid "Romanian (Germany, eliminate dead keys)"
-msgstr "Rumania (Jerman, hapus tombol mati)"
+msgid "Polish (Dvorak, Polish quotes on key 1)"
+msgstr "Polandia (Dvorak, tanda kutip Polandia pada tombol 1)"
#: ../rules/base.xml.in.h:651
-msgid "Romanian (WinKeys)"
-msgstr "Rumania (WinKeys)"
+msgid "Kashubian"
+msgstr "Kashubian"
#: ../rules/base.xml.in.h:652
-msgid "Romanian (cedilla)"
-msgstr "Rumania (cedilla)"
+msgid "Russian (Poland, phonetic Dvorak)"
+msgstr "Rusia (Polandia, Dvorak fonetik)"
#: ../rules/base.xml.in.h:653
-msgid "Romanian (standard cedilla)"
-msgstr "Rumania (standard cedilla)"
+msgid "Polish (programmer Dvorak)"
+msgstr "Polandia (Dvorak pemrogram)"
-#: ../rules/base.xml.in.h:654
-msgid "Romanian (standard)"
-msgstr "Rumania (standar)"
+#: ../rules/base.xml.in.h:654 ../rules/base.extras.xml.in.h:105
+msgid "Portuguese"
+msgstr "Portugis"
#: ../rules/base.xml.in.h:655
-msgid "Rupee on 4"
-msgstr "Rupee pada 4"
+msgid "Portuguese (eliminate dead keys)"
+msgstr "Portugis (hapus tombol mati)"
-#: ../rules/base.xml.in.h:656 ../rules/base.extras.xml.in.h:32
-msgid "Russian"
-msgstr "Rusia"
+#: ../rules/base.xml.in.h:656
+msgid "Portuguese (Sun dead keys)"
+msgstr "Portugis (tombol mati Sun)"
#: ../rules/base.xml.in.h:657
-msgid "Russian (DOS)"
-msgstr "Rusia (DOS)"
+msgid "Portuguese (Macintosh)"
+msgstr "Portugis (Macintosh)"
#: ../rules/base.xml.in.h:658
-msgid "Russian (Georgia)"
-msgstr "Rusia (Georgia)"
+msgid "Portuguese (Macintosh, eliminate dead keys)"
+msgstr "Portugis (Macintosh, hapus tombol mati)"
#: ../rules/base.xml.in.h:659
-msgid "Russian (Germany, phonetic)"
-msgstr "Rusia (Jerman, fonetik)"
+msgid "Portuguese (Macintosh, Sun dead keys)"
+msgstr "Portugis (Macintosh, tombol mati Sun)"
#: ../rules/base.xml.in.h:660
-msgid "Russian (Kazakhstan, with Kazakh)"
-msgstr "Rusia (Kazakhstan, dengan Kazakh)"
+msgid "Portuguese (Nativo)"
+msgstr "Portugis (Nativo)"
#: ../rules/base.xml.in.h:661
-msgid "Russian (Poland, phonetic Dvorak)"
-msgstr "Rusia (Polandia, Dvorak fonetik)"
+msgid "Portuguese (Nativo for US keyboards)"
+msgstr "Portugis (Nativo untuk papan tik AS)"
#: ../rules/base.xml.in.h:662
-msgid "Russian (Sweden, phonetic)"
-msgstr "Rusia (Swedia, fonetik)"
-
-#: ../rules/base.xml.in.h:663
-msgid "Russian (Sweden, phonetic, eliminate dead keys)"
-msgstr "Rusia (Swedia, fonetik, hapus tombol mati)"
+msgid "Esperanto (Portugal, Nativo)"
+msgstr "Esperanto (Portugal, Nativo)"
-#: ../rules/base.xml.in.h:664
-msgid "Russian (US, phonetic)"
-msgstr "Rusia (AS, fonetik)"
+#. Keyboard indicator for Romanian layouts
+#: ../rules/base.xml.in.h:664 ../rules/base.extras.xml.in.h:46
+msgid "ro"
+msgstr "ro"
-#: ../rules/base.xml.in.h:665
-msgid "Russian (Ukraine, standard RSTU)"
-msgstr "Rusia (Ukraina, standar RSTU)"
+#: ../rules/base.xml.in.h:665 ../rules/base.extras.xml.in.h:47
+msgid "Romanian"
+msgstr "Rumania"
#: ../rules/base.xml.in.h:666
-msgid "Russian (legacy)"
-msgstr "Rusia (legacy)"
+msgid "Romanian (cedilla)"
+msgstr "Rumania (cedilla)"
#: ../rules/base.xml.in.h:667
-msgid "Russian (phonetic WinKeys)"
-msgstr "Rusia (WinKeys fonetik)"
+msgid "Romanian (standard)"
+msgstr "Rumania (standar)"
#: ../rules/base.xml.in.h:668
-msgid "Russian (phonetic)"
-msgstr "Rusia (fonetik)"
+msgid "Romanian (standard cedilla)"
+msgstr "Rumania (standard cedilla)"
#: ../rules/base.xml.in.h:669
-msgid "Russian (typewriter)"
-msgstr "Rusia (mesin tik)"
+msgid "Romanian (WinKeys)"
+msgstr "Rumania (WinKeys)"
-#: ../rules/base.xml.in.h:670
-msgid "Russian (typewriter, legacy)"
-msgstr "Rusia (mesin tik, warisan)"
+#: ../rules/base.xml.in.h:670 ../rules/base.extras.xml.in.h:56
+msgid "Russian"
+msgstr "Rusia"
#: ../rules/base.xml.in.h:671
-msgid "SILVERCREST Multimedia Wireless Keyboard"
-msgstr "Papan Ketik SILVERCREST Multimedia Wireless"
+msgid "Russian (phonetic)"
+msgstr "Rusia (fonetik)"
#: ../rules/base.xml.in.h:672
-msgid "SK-1300"
-msgstr "SK-1300"
+msgid "Russian (phonetic WinKeys)"
+msgstr "Rusia (WinKeys fonetik)"
#: ../rules/base.xml.in.h:673
-msgid "SK-2500"
-msgstr "SK-2500"
+msgid "Russian (typewriter)"
+msgstr "Rusia (mesin tik)"
#: ../rules/base.xml.in.h:674
-msgid "SK-6200"
-msgstr "SK-6200"
+msgid "Russian (legacy)"
+msgstr "Rusia (legacy)"
#: ../rules/base.xml.in.h:675
-msgid "SK-7100"
-msgstr "SK-7100"
+msgid "Russian (typewriter, legacy)"
+msgstr "Rusia (mesin tik, warisan)"
#: ../rules/base.xml.in.h:676
-msgid "SVEN Ergonomic 2500"
-msgstr "SVEN Ergonomic 2500"
+msgid "Tatar"
+msgstr "Tatar"
#: ../rules/base.xml.in.h:677
-msgid "SVEN Slim 303"
-msgstr "SVEN Slim 303"
+msgid "Ossetian (legacy)"
+msgstr "Ossetia (warisan)"
#: ../rules/base.xml.in.h:678
-msgid "Saisiyat (Taiwan)"
-msgstr "Saisiyat (Taiwan)"
+msgid "Ossetian (WinKeys)"
+msgstr "Ossetia (WinKeys)"
#: ../rules/base.xml.in.h:679
-msgid "Samsung SDM 4500P"
-msgstr "Samsung SDM 4500P"
+msgid "Chuvash"
+msgstr "Chuvash"
#: ../rules/base.xml.in.h:680
-msgid "Samsung SDM 4510P"
-msgstr "Samsung SDM 4510P"
+msgid "Chuvash (Latin)"
+msgstr "Chuvash (Latin)"
#: ../rules/base.xml.in.h:681
-msgid "Sanwa Supply SKB-KG3"
-msgstr "Sanwa Supply SKB-KG3"
+msgid "Udmurt"
+msgstr "Udmurt"
#: ../rules/base.xml.in.h:682
-msgid "Scroll Lock"
-msgstr "Scroll Lock"
+msgid "Komi"
+msgstr "Komi"
#: ../rules/base.xml.in.h:683
-msgid "Semi-colon on third level"
-msgstr "Semi-kolon pada level ketiga"
+msgid "Yakut"
+msgstr "Yakut"
#: ../rules/base.xml.in.h:684
-msgid "Serbian (Cyrillic with guillemets)"
-msgstr "Serbia (Sirilik dengan guillemets)"
+msgid "Kalmyk"
+msgstr "Kalmyk"
#: ../rules/base.xml.in.h:685
-msgid "Serbian (Cyrillic)"
-msgstr "Serbia (Sirilik)"
+msgid "Russian (DOS)"
+msgstr "Rusia (DOS)"
#: ../rules/base.xml.in.h:686
-msgid "Serbian (Cyrillic, Z and ZHE swapped)"
-msgstr "Serbia (Sirilik, Z dan ZHE ditukar)"
+msgid "Russian (Macintosh)"
+msgstr "Rusia (Macintosh)"
#: ../rules/base.xml.in.h:687
-msgid "Serbian (Latin Unicode qwerty)"
-msgstr "Serbia (Latin Unicode qwerty)"
+msgid "Serbian (Russia)"
+msgstr "Serbia (Rusia)"
#: ../rules/base.xml.in.h:688
-msgid "Serbian (Latin Unicode)"
-msgstr "Serbia (Latin Unicode)"
+msgid "Bashkirian"
+msgstr "Bashkirian"
#: ../rules/base.xml.in.h:689
-msgid "Serbian (Latin qwerty)"
-msgstr "Serbia (Latin qwerty)"
+msgid "Mari"
+msgstr "Mari"
-#: ../rules/base.xml.in.h:690
-msgid "Serbian (Latin with guillemets)"
-msgstr "Serbia (Latin dengan guillemets)"
+#: ../rules/base.xml.in.h:690 ../rules/base.extras.xml.in.h:53
+msgid "Serbian"
+msgstr "Serbia"
#: ../rules/base.xml.in.h:691
-msgid "Serbian (Latin)"
-msgstr "Serbia (Latin)"
+msgid "Serbian (Cyrillic, Z and ZHE swapped)"
+msgstr "Serbia (Sirilik, Z dan ZHE ditukar)"
#: ../rules/base.xml.in.h:692
-msgid "Serbian (Russia)"
-msgstr "Serbia (Rusia)"
+msgid "Serbian (Latin)"
+msgstr "Serbia (Latin)"
#: ../rules/base.xml.in.h:693
-msgid "Serbo-Croatian (US)"
-msgstr "Serbo-Kroasia (AS)"
+msgid "Serbian (Latin Unicode)"
+msgstr "Serbia (Latin Unicode)"
#: ../rules/base.xml.in.h:694
-msgid "Shift cancels Caps Lock"
-msgstr "Shift membatalkan Caps Lock"
+msgid "Serbian (Latin qwerty)"
+msgstr "Serbia (Latin qwerty)"
#: ../rules/base.xml.in.h:695
-msgid "Shift does not cancel Num Lock, chooses 3rd level instead"
-msgstr "Shift tidak membatalkan Num Lock, lebih memilih level ketiga"
+msgid "Serbian (Latin Unicode qwerty)"
+msgstr "Serbia (Latin Unicode qwerty)"
#: ../rules/base.xml.in.h:696
-msgid "Shift with numeric keypad keys works as in MS Windows"
-msgstr "Shit dengan keypad numerik bekerja sesuai pada MS Windows"
+msgid "Serbian (Cyrillic with guillemets)"
+msgstr "Serbia (Sirilik dengan guillemets)"
#: ../rules/base.xml.in.h:697
-msgid "Shift+Caps Lock"
-msgstr "Shift+Caps Lock"
+msgid "Serbian (Latin with guillemets)"
+msgstr "Serbia (Latin dengan guillemets)"
#: ../rules/base.xml.in.h:698
-msgid "Sindhi"
-msgstr "Sindhi"
-
-#: ../rules/base.xml.in.h:699
-msgid "Sinhala (phonetic)"
-msgstr "Sinhala (fonetik)"
+msgid "Pannonian Rusyn"
+msgstr "Pannonian Rusyn"
+#. Keyboard indicator for Slovenian layouts
#: ../rules/base.xml.in.h:700
-msgid "Slovak"
-msgstr "Slovakia"
+msgid "sl"
+msgstr "sl"
#: ../rules/base.xml.in.h:701
-msgid "Slovak (extended Backslash)"
-msgstr "Slowakia (Backslash diperluas)"
+msgid "Slovenian"
+msgstr "Slovenia"
#: ../rules/base.xml.in.h:702
-msgid "Slovak (qwerty)"
-msgstr "Slovakia (qwerty)"
+msgid "Slovenian (use guillemets for quotes)"
+msgstr "Slovenia (gunakan guillemets untuk tanda petik)"
#: ../rules/base.xml.in.h:703
-msgid "Slovak (qwerty, extended Backslash)"
-msgstr "Slowakia (qwerty, Backslash diperluas)"
-
-#: ../rules/base.xml.in.h:704
-msgid "Slovenian"
-msgstr "Slovenia"
-
-#: ../rules/base.xml.in.h:705
msgid "Slovenian (US keyboard with Slovenian letters)"
msgstr "Slovenia (papan tik AS dengan huruf Slovenia)"
-#: ../rules/base.xml.in.h:706
-msgid "Slovenian (use guillemets for quotes)"
-msgstr "Slovenia (gunakan guillemets untuk tanda petik)"
+#. Keyboard indicator for Slovak layouts
+#: ../rules/base.xml.in.h:705 ../rules/base.extras.xml.in.h:107
+msgid "sk"
+msgstr "sk"
+
+#: ../rules/base.xml.in.h:706 ../rules/base.extras.xml.in.h:108
+msgid "Slovak"
+msgstr "Slovakia"
#: ../rules/base.xml.in.h:707
-msgid "Spanish"
-msgstr "Spanyol"
+msgid "Slovak (extended Backslash)"
+msgstr "Slowakia (Backslash diperluas)"
#: ../rules/base.xml.in.h:708
-msgid "Spanish (Dvorak)"
-msgstr "Spanyol (Dvorak)"
+msgid "Slovak (qwerty)"
+msgstr "Slovakia (qwerty)"
#: ../rules/base.xml.in.h:709
-msgid "Spanish (Latin American)"
-msgstr "Spanyol (Amerika Latin)"
+msgid "Slovak (qwerty, extended Backslash)"
+msgstr "Slowakia (qwerty, Backslash diperluas)"
-#: ../rules/base.xml.in.h:710
-msgid "Spanish (Latin American, Sun dead keys)"
-msgstr "Spanyol (Amerika Latin, tombol mati Sun)"
+#: ../rules/base.xml.in.h:710 ../rules/base.extras.xml.in.h:111
+msgid "Spanish"
+msgstr "Spanyol"
#: ../rules/base.xml.in.h:711
-msgid "Spanish (Latin American, eliminate dead keys)"
-msgstr "Spanyol (Amerika Latin, hapus tombol mati)"
+msgid "Spanish (eliminate dead keys)"
+msgstr "Spanyol (hapus tombol mati)"
#: ../rules/base.xml.in.h:712
-msgid "Spanish (Latin American, include dead tilde)"
-msgstr "Spanyol (Amerika Latin, termasuk tilde mati)"
+msgid "Spanish (include dead tilde)"
+msgstr "Spanyol (termasuk tilde mati)"
#: ../rules/base.xml.in.h:713
-msgid "Spanish (Macintosh)"
-msgstr "Spanyol (Macintosh)"
-
-#: ../rules/base.xml.in.h:714
msgid "Spanish (Sun dead keys)"
msgstr "Spanyol (tombol mati Sun)"
+#: ../rules/base.xml.in.h:714
+msgid "Spanish (Dvorak)"
+msgstr "Spanyol (Dvorak)"
+
#: ../rules/base.xml.in.h:715
-msgid "Spanish (eliminate dead keys)"
-msgstr "Spanyol (hapus tombol mati)"
+msgid "Asturian (Spain, with bottom-dot H and bottom-dot L)"
+msgstr "Asturia (Spanyol, dengan titik di bawah pada H dan L)"
#: ../rules/base.xml.in.h:716
-msgid "Spanish (include dead tilde)"
-msgstr "Spanyol (termasuk tilde mati)"
+msgid "Catalan (Spain, with middle-dot L)"
+msgstr "Katala (Spanyol, dengan titik-tengah pada L)"
#: ../rules/base.xml.in.h:717
-msgid "Special keys (Ctrl+Alt+&lt;key&gt;) handled in a server"
-msgstr "Tombol spesial (Ctrl+Alt+&lt;key&gt;) ditangani pada server"
-
-#: ../rules/base.xml.in.h:718
-msgid "Sun Type 5/6"
-msgstr "Sun Type 5/6"
+msgid "Spanish (Macintosh)"
+msgstr "Spanyol (Macintosh)"
-#: ../rules/base.xml.in.h:719
-msgid "Super Power Multimedia Keyboard"
-msgstr "Super Power Multimedia Keyboard"
+#. Keyboard indicator for Swedish layouts
+#: ../rules/base.xml.in.h:719 ../rules/base.extras.xml.in.h:113
+msgid "sv"
+msgstr "sv"
-#: ../rules/base.xml.in.h:720
-msgid "Swahili (Kenya)"
-msgstr "Swahili (Kenya)"
+#: ../rules/base.xml.in.h:720 ../rules/base.extras.xml.in.h:114
+msgid "Swedish"
+msgstr "Swedia"
#: ../rules/base.xml.in.h:721
-msgid "Swahili (Tanzania)"
-msgstr "Swahili (Tanzania)"
+msgid "Swedish (eliminate dead keys)"
+msgstr "Swedia (hapus tombol mati)"
#: ../rules/base.xml.in.h:722
-msgid "Swap Ctrl and Caps Lock"
-msgstr "Tukar Ctrl dan Caps Lock"
+msgid "Swedish (Dvorak)"
+msgstr "Swedia (Dvorak)"
#: ../rules/base.xml.in.h:723
-msgid "Swap ESC and Caps Lock"
-msgstr "Tukar ESC dan Caps Lock"
+msgid "Russian (Sweden, phonetic)"
+msgstr "Rusia (Swedia, fonetik)"
#: ../rules/base.xml.in.h:724
-msgid "Swedish"
-msgstr "Swedia"
+msgid "Russian (Sweden, phonetic, eliminate dead keys)"
+msgstr "Rusia (Swedia, fonetik, hapus tombol mati)"
#: ../rules/base.xml.in.h:725
-msgid "Swedish (Dvorak)"
-msgstr "Swedia (Dvorak)"
+msgid "Northern Saami (Sweden)"
+msgstr "Saami Utara (Swedia)"
#: ../rules/base.xml.in.h:726
msgid "Swedish (Macintosh)"
@@ -2920,971 +2703,1495 @@ msgid "Swedish (Svdvorak)"
msgstr "Swedia (Svdvorak)"
#: ../rules/base.xml.in.h:728
-msgid "Swedish (eliminate dead keys)"
-msgstr "Swedia (hapus tombol mati)"
-
-#: ../rules/base.xml.in.h:729
msgid "Swedish Sign Language"
msgstr "Bahasa Isyarat Swedia"
+#: ../rules/base.xml.in.h:729 ../rules/base.extras.xml.in.h:116
+msgid "German (Switzerland)"
+msgstr "Jerman (Swiss)"
+
#: ../rules/base.xml.in.h:730
-msgid "Symplon PaceBook (tablet PC)"
-msgstr "Symplon PaceBook (tablet PC)"
+msgid "German (Switzerland, legacy)"
+msgstr "Jerman (Swiss, legacy)"
#: ../rules/base.xml.in.h:731
-msgid "Syriac"
-msgstr "Syriac"
+msgid "German (Switzerland, eliminate dead keys)"
+msgstr "Jerman (Swiss, hapus tombol mati)"
#: ../rules/base.xml.in.h:732
-msgid "Syriac (phonetic)"
-msgstr "Suriah (fonetik)"
+msgid "German (Switzerland, Sun dead keys)"
+msgstr "Jerman (Swiss, tombol mati Sun)"
#: ../rules/base.xml.in.h:733
-msgid "Taiwanese"
-msgstr "Taiwan"
+msgid "French (Switzerland)"
+msgstr "Perancis (Swiss)"
#: ../rules/base.xml.in.h:734
-msgid "Taiwanese (indigenous)"
-msgstr "Taiwan (asli)"
+msgid "French (Switzerland, eliminate dead keys)"
+msgstr "Perancis (Swiss, hapus tombol mati)"
#: ../rules/base.xml.in.h:735
-msgid "Tajik"
-msgstr "Tajikistan"
+msgid "French (Switzerland, Sun dead keys)"
+msgstr "Perancis (Swiss, tombol mati Sun)"
#: ../rules/base.xml.in.h:736
-msgid "Tajik (legacy)"
-msgstr "Tajik (warisan)"
+msgid "French (Switzerland, Macintosh)"
+msgstr "Perancis (Swiss, Macintosh)"
#: ../rules/base.xml.in.h:737
-msgid "Tamil"
-msgstr "Tamil"
+msgid "German (Switzerland, Macintosh)"
+msgstr "Jerman (Swiss, Macintosh)"
#: ../rules/base.xml.in.h:738
-msgid "Tamil (Sri Lanka, TAB Typewriter)"
-msgstr "Tamil (Sri Lanka, Mesin Tik TAB)"
-
-#: ../rules/base.xml.in.h:739
-msgid "Tamil (Sri Lanka, Unicode)"
-msgstr "Tamil (Sri Lanka, Unicode)"
+msgid "Arabic (Syria)"
+msgstr "Arab (Siria)"
+#. Keyboard indicator for Syriac layouts
#: ../rules/base.xml.in.h:740
-msgid "Tamil (TAB typewriter)"
-msgstr "Tamil (mesin tik TAB)"
+msgid "syc"
+msgstr "syc"
#: ../rules/base.xml.in.h:741
-msgid "Tamil (TSCII typewriter)"
-msgstr "Tamil (mestin tik TSCII)"
+msgid "Syriac"
+msgstr "Syriac"
#: ../rules/base.xml.in.h:742
-msgid "Tamil (Unicode)"
-msgstr "Tamil (Unicode)"
+msgid "Syriac (phonetic)"
+msgstr "Suriah (fonetik)"
#: ../rules/base.xml.in.h:743
-msgid "Tamil (keyboard with numerals)"
-msgstr "Tamil (papan tik dengan angka)"
+msgid "Kurdish (Syria, Latin Q)"
+msgstr "Kurdi (Suriah, Latin Q"
#: ../rules/base.xml.in.h:744
-msgid "Targa Visionary 811"
-msgstr "Targa Visionary 811"
+msgid "Kurdish (Syria, F)"
+msgstr "Kurdi (Suriah, F)"
#: ../rules/base.xml.in.h:745
-msgid "Tatar"
-msgstr "Tatar"
-
-#: ../rules/base.xml.in.h:746
-msgid "Telugu"
-msgstr "Telugu"
+msgid "Kurdish (Syria, Latin Alt-Q)"
+msgstr "Kurdi (Suriah, Latin Alt-Q)"
+#. Keyboard indicator for Tajik layouts
#: ../rules/base.xml.in.h:747
-msgid "Thai"
-msgstr "Thailand"
+msgid "tg"
+msgstr "tg"
#: ../rules/base.xml.in.h:748
-msgid "Thai (Pattachote)"
-msgstr "Thailand (Pattachote)"
+msgid "Tajik"
+msgstr "Tajikistan"
#: ../rules/base.xml.in.h:749
-msgid "Thai (TIS-820.2538)"
-msgstr "Thailand (TIS-820.2538)"
-
-#: ../rules/base.xml.in.h:750
-msgid "Tibetan"
-msgstr "Tibetan"
+msgid "Tajik (legacy)"
+msgstr "Tajik (warisan)"
+#. Keyboard indicator for Sinhala layouts
#: ../rules/base.xml.in.h:751
-msgid "Tibetan (with ASCII numerals)"
-msgstr "Tibetan (with ASCII numerals)"
+msgid "si"
+msgstr "si"
#: ../rules/base.xml.in.h:752
-msgid "To the corresponding key in a Dvorak keyboard."
-msgstr "Ke tombol dalam papan ketik Dvorak."
+msgid "Sinhala (phonetic)"
+msgstr "Sinhala (fonetik)"
#: ../rules/base.xml.in.h:753
-msgid "To the corresponding key in a Qwerty keyboard."
-msgstr "Ke tombol dalam papan ketik Qwerty."
+msgid "Tamil (Sri Lanka, Unicode)"
+msgstr "Tamil (Sri Lanka, Unicode)"
#: ../rules/base.xml.in.h:754
-msgid "Toggle PointerKeys with Shift + NumLock."
-msgstr "Jungkitkan PointerKeys dengan Shift + NumLock."
-
-#: ../rules/base.xml.in.h:755
-msgid "Toshiba Satellite S3000"
-msgstr "Toshiba Satellite S3000"
+msgid "Tamil (Sri Lanka, TAB Typewriter)"
+msgstr "Tamil (Sri Lanka, Mesin Tik TAB)"
+#. Keyboard indicator for Thai layouts
#: ../rules/base.xml.in.h:756
-msgid "Trust Direct Access Keyboard"
-msgstr "Trust Direct Access Keyboard"
+msgid "th"
+msgstr "th"
#: ../rules/base.xml.in.h:757
-msgid "Trust Slimline"
-msgstr "Trust Slimline"
+msgid "Thai"
+msgstr "Thailand"
#: ../rules/base.xml.in.h:758
-msgid "Trust Wireless Keyboard Classic"
-msgstr "Trust Wireless Keyboard Classic"
+msgid "Thai (TIS-820.2538)"
+msgstr "Thailand (TIS-820.2538)"
#: ../rules/base.xml.in.h:759
-msgid "Tswana"
-msgstr "Tswana"
+msgid "Thai (Pattachote)"
+msgstr "Thailand (Pattachote)"
+
+#. Keyboard indicator for Turkish layouts
+#: ../rules/base.xml.in.h:761 ../rules/base.extras.xml.in.h:119
+msgid "tr"
+msgstr "tr"
-#: ../rules/base.xml.in.h:760
+#: ../rules/base.xml.in.h:762 ../rules/base.extras.xml.in.h:120
msgid "Turkish"
msgstr "Turki"
-#: ../rules/base.xml.in.h:761
-msgid "Turkish (Alt-Q)"
-msgstr "Turki (Alt-Q)"
-
-#: ../rules/base.xml.in.h:762
+#: ../rules/base.xml.in.h:763
msgid "Turkish (F)"
msgstr "Turki (F)"
-#: ../rules/base.xml.in.h:763
-msgid "Turkish (Sun dead keys)"
-msgstr "Turki (tombol mati Sun)"
-
#: ../rules/base.xml.in.h:764
-msgid "Turkish (international with dead keys)"
-msgstr "Turki (internasional dengan tombol mati)"
+msgid "Turkish (Alt-Q)"
+msgstr "Turki (Alt-Q)"
#: ../rules/base.xml.in.h:765
-msgid "Turkmen"
-msgstr "Turkmen"
+msgid "Turkish (Sun dead keys)"
+msgstr "Turki (tombol mati Sun)"
#: ../rules/base.xml.in.h:766
-msgid "Turkmen (Alt-Q)"
-msgstr "Turkmen (Alt-Q)"
+msgid "Kurdish (Turkey, Latin Q)"
+msgstr "Kurdi (Turki, Latin Q)"
#: ../rules/base.xml.in.h:767
-msgid "TypeMatrix EZ-Reach 2020"
-msgstr "TypeMatrix EZ-Reach 2020"
+msgid "Kurdish (Turkey, F)"
+msgstr "Kurdi (Turki, F)"
#: ../rules/base.xml.in.h:768
-msgid "TypeMatrix EZ-Reach 2030 PS2"
-msgstr "TypeMatrix EZ-Reach 2030 PS2"
+msgid "Kurdish (Turkey, Latin Alt-Q)"
+msgstr "Kurdi (Turki, Latin Alt-Q)"
#: ../rules/base.xml.in.h:769
-msgid "TypeMatrix EZ-Reach 2030 USB"
-msgstr "TypeMatrix EZ-Reach 2030 USB"
-
-#: ../rules/base.xml.in.h:770
-msgid "TypeMatrix EZ-Reach 2030 USB (102/105:EU mode)"
-msgstr "TypeMatrix EZ-Reach 2030 USB (mode 102/105:EU)"
+msgid "Turkish (international with dead keys)"
+msgstr "Turki (internasional dengan tombol mati)"
-#: ../rules/base.xml.in.h:771
-msgid "TypeMatrix EZ-Reach 2030 USB (106:JP mode)"
-msgstr "TypeMatrix EZ-Reach 2030 USB (mode 106:JP)"
+#. Keyboard indicator for Crimean Tatar layouts
+#: ../rules/base.xml.in.h:771 ../rules/base.extras.xml.in.h:48
+msgid "crh"
+msgstr "crh"
#: ../rules/base.xml.in.h:772
-msgid "Udmurt"
-msgstr "Udmurt"
+msgid "Crimean Tatar (Turkish Q)"
+msgstr "Crimean Tatar (Turkish Q)"
#: ../rules/base.xml.in.h:773
-msgid "Ukrainian"
-msgstr "Ukraina"
+msgid "Crimean Tatar (Turkish F)"
+msgstr "Crimean Tatar (Turkish F)"
#: ../rules/base.xml.in.h:774
-msgid "Ukrainian (WinKeys)"
-msgstr "Ukraina (WinKeys)"
+msgid "Crimean Tatar (Turkish Alt-Q)"
+msgstr "Crimean Tatar (Turkish Alt-Q)"
#: ../rules/base.xml.in.h:775
-msgid "Ukrainian (homophonic)"
-msgstr "Ukraina (homofonik)"
+msgid "Taiwanese"
+msgstr "Taiwan"
#: ../rules/base.xml.in.h:776
-msgid "Ukrainian (legacy)"
-msgstr "Ukraina (legacy)"
-
-#: ../rules/base.xml.in.h:777
-msgid "Ukrainian (phonetic)"
-msgstr "Ukraina (fonetik)"
+msgid "Taiwanese (indigenous)"
+msgstr "Taiwan (asli)"
+#. Keyboard indicator for Saisiyat layouts
#: ../rules/base.xml.in.h:778
-msgid "Ukrainian (standard RSTU)"
-msgstr "Ukraina (standard RSTU)"
+msgid "xsy"
+msgstr "xsy"
#: ../rules/base.xml.in.h:779
-msgid "Ukrainian (typewriter)"
-msgstr "Ukraina (mesin tik)"
-
-#: ../rules/base.xml.in.h:780
-msgid "Unicode additions (arrows and math operators)"
-msgstr "Tambahan unicode (panah dan operator matematika)"
+msgid "Saisiyat (Taiwan)"
+msgstr "Saisiyat (Taiwan)"
-#: ../rules/base.xml.in.h:781
-msgid "Unicode additions (arrows and math operators). Math operators on default level"
-msgstr "Tambahan unicode (panah dan operator matematika). Operator matematika pada level standar"
+#. Keyboard indicator for Ukranian layouts
+#: ../rules/base.xml.in.h:781 ../rules/base.extras.xml.in.h:122
+msgid "uk"
+msgstr "uk"
-#: ../rules/base.xml.in.h:782
-msgid "Unitek KB-1925"
-msgstr "Unitek KB-1925"
+#: ../rules/base.xml.in.h:782 ../rules/base.extras.xml.in.h:123
+msgid "Ukrainian"
+msgstr "Ukraina"
#: ../rules/base.xml.in.h:783
-msgid "Urdu (Pakistan)"
-msgstr "Urdu (Pakistan)"
+msgid "Ukrainian (phonetic)"
+msgstr "Ukraina (fonetik)"
#: ../rules/base.xml.in.h:784
-msgid "Urdu (Pakistan, CRULP)"
-msgstr "Urdu (Pakistan, CRULP)"
+msgid "Ukrainian (typewriter)"
+msgstr "Ukraina (mesin tik)"
#: ../rules/base.xml.in.h:785
-msgid "Urdu (Pakistan, NLA)"
-msgstr "Urdu (Pakistan, NLA)"
+msgid "Ukrainian (WinKeys)"
+msgstr "Ukraina (WinKeys)"
#: ../rules/base.xml.in.h:786
-msgid "Urdu (WinKeys)"
-msgstr "Urdu (WinKeys)"
+msgid "Ukrainian (legacy)"
+msgstr "Ukraina (legacy)"
#: ../rules/base.xml.in.h:787
-msgid "Urdu (alternative phonetic)"
-msgstr "Urdu (fonetik alternatif)"
+msgid "Ukrainian (standard RSTU)"
+msgstr "Ukraina (standard RSTU)"
#: ../rules/base.xml.in.h:788
-msgid "Urdu (phonetic)"
-msgstr "Urdu (fonetik)"
+msgid "Russian (Ukraine, standard RSTU)"
+msgstr "Rusia (Ukraina, standar RSTU)"
#: ../rules/base.xml.in.h:789
-msgid "Use keyboard LED to show alternative layout"
-msgstr "Gunakan papan ketik LED untuk menunjukkan layout alternatif"
+msgid "Ukrainian (homophonic)"
+msgstr "Ukraina (homofonik)"
-#: ../rules/base.xml.in.h:790
-msgid "Using space key to input non-breakable space character"
-msgstr "Menggunakan spasi untuk input karakter spasi yang tidak pecah"
+#: ../rules/base.xml.in.h:790 ../rules/base.extras.xml.in.h:125
+msgid "English (UK)"
+msgstr "Inggris (Britania)"
#: ../rules/base.xml.in.h:791
-msgid "Usual space at any level"
-msgstr "Tombol spasi biasa pada semua level"
+msgid "English (UK, extended WinKeys)"
+msgstr "Inggris (Britania, Winkeys diperluas)"
#: ../rules/base.xml.in.h:792
-msgid "Uyghur"
-msgstr "Uyghur"
+msgid "English (UK, international with dead keys)"
+msgstr "Inggris (Britania, internasional dengan tombol mati)"
#: ../rules/base.xml.in.h:793
-msgid "Uzbek"
-msgstr "Uzbek"
+msgid "English (UK, Dvorak)"
+msgstr "Inggris (Britania, Dvorak)"
#: ../rules/base.xml.in.h:794
-msgid "Uzbek (Afghanistan)"
-msgstr "Uzbek (Afghanistan)"
+msgid "English (UK, Dvorak with UK punctuation)"
+msgstr "Inggris (Britania, Dvorak dengan pungtuasi Britania)"
#: ../rules/base.xml.in.h:795
-msgid "Uzbek (Afghanistan, OLPC)"
-msgstr "Uzbek (Afghanistan, OLPC)"
+msgid "English (UK, Macintosh)"
+msgstr "Inggris (Britania, Macintosh)"
#: ../rules/base.xml.in.h:796
-msgid "Uzbek (Latin)"
-msgstr "Uzbek (Latin)"
+msgid "English (UK, Macintosh international)"
+msgstr "Inggris (Britania, Macintosh internasional)"
#: ../rules/base.xml.in.h:797
-msgid "Vietnamese"
-msgstr "Vietnam"
+msgid "English (UK, Colemak)"
+msgstr "Inggris (UK, Colemak)"
#: ../rules/base.xml.in.h:798
-msgid "ViewSonic KU-306 Internet Keyboard"
-msgstr "Papan Ketik Internet ViewSonic KU-306"
+msgid "Uzbek"
+msgstr "Uzbek"
#: ../rules/base.xml.in.h:799
-msgid "Wang 724 keypad with Unicode additions (arrows and math operators)"
-msgstr "Wang 724 keypad dengan tambahan Unicode (panah and operator matematika)"
-
-#: ../rules/base.xml.in.h:800
-msgid "Wang 724 keypad with Unicode additions (arrows and math operators). Math operators on default level"
-msgstr "Wang 724 keypad dengan tambahan Unicode (panah and operator matematika). Operator matematika pada level standar"
+msgid "Uzbek (Latin)"
+msgstr "Uzbek (Latin)"
+#. Keyboard indicator for Vietnamese layouts
#: ../rules/base.xml.in.h:801
-msgid "Winbook Model XP5"
-msgstr "Winbook Model XP5"
+msgid "vi"
+msgstr "vi"
#: ../rules/base.xml.in.h:802
-msgid "Wolof"
-msgstr "Wolof"
-
-#: ../rules/base.xml.in.h:803
-msgid "Yahoo! Internet Keyboard"
-msgstr "Papan Ketik Internet Yahoo!"
+msgid "Vietnamese"
+msgstr "Vietnam"
-#: ../rules/base.xml.in.h:804
-msgid "Yakut"
-msgstr "Yakut"
+#. Keyboard indicator for Korean layouts
+#: ../rules/base.xml.in.h:804 ../rules/base.extras.xml.in.h:127
+msgid "ko"
+msgstr "ko"
-#: ../rules/base.xml.in.h:805
-msgid "Yoruba"
-msgstr "Yoruba"
+#: ../rules/base.xml.in.h:805 ../rules/base.extras.xml.in.h:128
+msgid "Korean"
+msgstr "Korea"
#: ../rules/base.xml.in.h:806
-msgid "Zero-width non-joiner character at second level"
-msgstr "Karakter non-penggabung lebar-nol pada level kedua"
+msgid "Korean (101/104 key compatible)"
+msgstr "Korea (kompatibel dengan 101/104 tombol)"
#: ../rules/base.xml.in.h:807
-msgid "Zero-width non-joiner character at second level, non-breakable space character at third level"
-msgstr "Karakter non-penggabung lebar-nol pada level kedua, karakter spasi non-dilepaskan pada level ketiga"
-
-#: ../rules/base.xml.in.h:808
-msgid "Zero-width non-joiner character at second level, non-breakable space character at third level, nothing at fourth level"
-msgstr "Karakter non-penggabung lebar-nol pada level kedua, karakter spasi non-dilepaskan pada level ketiga, tak ada di level keempat"
+msgid "Japanese (PC-98xx Series)"
+msgstr "Jepang (Seri PC-98xx)"
+#. Keyboard indicator for Irish layouts
#: ../rules/base.xml.in.h:809
-msgid "Zero-width non-joiner character at second level, non-breakable space character at third level, thin non-breakable space at fourth level"
-msgstr "Karakter non-penggabung lebar-nol pada level ketiga, karakter spasi non-dilepaskan pada level ketiga, spasi non-dilepaskan tipis pada level keempat"
+msgid "ie"
+msgstr "ie"
#: ../rules/base.xml.in.h:810
-msgid "Zero-width non-joiner character at second level, non-breakable space character at third level, zero-width joiner at fourth level"
-msgstr "Karakter non-penggabung lebar-nol pada level kedua, karakter spasi non-dilepaskan pada level ketiga, penggabung lebar-nol pada level keempat"
+msgid "Irish"
+msgstr "Irlandia"
#: ../rules/base.xml.in.h:811
-msgid "Zero-width non-joiner character at second level, zero-width joiner character at third level"
-msgstr "Karakter non-penggabung lebar nol pada level kedua, karakter penggabung lebar-nol pada level ketiga"
+msgid "CloGaelach"
+msgstr "CloGaelach"
#: ../rules/base.xml.in.h:812
-msgid "Zero-width non-joiner character at second level, zero-width joiner character at third level, non-breakable space character at fourth level"
-msgstr "Karakter non-penggabung pada level kedua, karakter penggabung lebar-nol pada level ketiga, karakter spasi non-dilepaskan pada level keempat"
+msgid "Irish (UnicodeExpert)"
+msgstr "Irlandia (UnicodeExpert)"
#: ../rules/base.xml.in.h:813
-msgid "Zero-width non-joiner character at third level, zero-width joiner at fourth level"
-msgstr "Karakter non-penggabung lebar-nol pada level ketiga, penggabung lebar-nol pada level keempat"
+msgid "Ogham"
+msgstr "Ogham"
+
+#: ../rules/base.xml.in.h:814
+msgid "Ogham (IS434)"
+msgstr "Ogham (IS434)"
-#. Keyboard indicator for Akan layouts
#: ../rules/base.xml.in.h:815
-msgid "ak"
-msgstr "ak"
+msgid "Urdu (Pakistan)"
+msgstr "Urdu (Pakistan)"
+
+#: ../rules/base.xml.in.h:816
+msgid "Urdu (Pakistan, CRULP)"
+msgstr "Urdu (Pakistan, CRULP)"
-#. Keyboard indicator for Amharic layouts
#: ../rules/base.xml.in.h:817
-msgid "am"
-msgstr "am"
+msgid "Urdu (Pakistan, NLA)"
+msgstr "Urdu (Pakistan, NLA)"
-#. Keyboard indicator for Arabic layouts
-#: ../rules/base.xml.in.h:819
-msgid "ar"
-msgstr "ar"
+#: ../rules/base.xml.in.h:818
+msgid "Arabic (Pakistan)"
+msgstr "Arab (Pakistan)"
+
+#. Keyboard indicator for Sindhi layouts
+#: ../rules/base.xml.in.h:820
+msgid "sd"
+msgstr "sd"
-#. Keyboard indicator for Avatime layouts
#: ../rules/base.xml.in.h:821
-msgid "avn"
-msgstr "avn"
+msgid "Sindhi"
+msgstr "Sindhi"
-#. Keyboard indicator for Azerbaijani layouts
+#. Keyboard indicator for Dhivehi layouts
#: ../rules/base.xml.in.h:823
-msgid "az"
-msgstr "az"
+msgid "dv"
+msgstr "dv"
+
+#: ../rules/base.xml.in.h:824
+msgid "Dhivehi"
+msgstr "Dhivehi"
-#. Keyboard indicator for Belgian layouts
#: ../rules/base.xml.in.h:825
-msgid "be"
-msgstr "be"
+msgid "English (South Africa)"
+msgstr "Inggris (Afrika Selatan)"
-#. Keyboard indicator for Berber layouts
+#. Keyboard indicator for Esperanto layouts
#: ../rules/base.xml.in.h:827
-msgid "ber"
-msgstr "ber"
+msgid "eo"
+msgstr "eo"
+
+#: ../rules/base.xml.in.h:828
+msgid "Esperanto"
+msgstr "Esperanto"
-#. Keyboard indicator for Bulgarian layouts
#: ../rules/base.xml.in.h:829
-msgid "bg"
-msgstr "bg"
+msgid "Esperanto (displaced semicolon and quote, obsolete)"
+msgstr "Esperanto (titik koma dan tanda kutip tergeser, kuno)"
-#. Keyboard indicator for Bambara layouts
+#. Keyboard indicator for Nepali layouts
#: ../rules/base.xml.in.h:831
-msgid "bm"
-msgstr "bm"
+msgid "ne"
+msgstr "ne"
+
+#: ../rules/base.xml.in.h:832
+msgid "Nepali"
+msgstr "Nepal"
-#. Keyboard indicator for Bengali layouts
#: ../rules/base.xml.in.h:833
-msgid "bn"
-msgstr "bn"
+msgid "English (Nigeria)"
+msgstr "Inggris (Nigeria)"
-#. Keyboard indicator for Braille layouts
+#. Keyboard indicator for Igbo layouts
#: ../rules/base.xml.in.h:835
-msgid "brl"
-msgstr "brl"
+msgid "ig"
+msgstr "ig"
-#. Keyboard indicator for Bosnian layouts
-#: ../rules/base.xml.in.h:837
-msgid "bs"
-msgstr "bs"
+#: ../rules/base.xml.in.h:836
+msgid "Igbo"
+msgstr "Igbo"
+
+#. Keyboard indicator for Yoruba layouts
+#: ../rules/base.xml.in.h:838
+msgid "yo"
+msgstr "yo"
-#. Keyboard indicator for Belarusian layouts
#: ../rules/base.xml.in.h:839
-msgid "by"
-msgstr "by"
+msgid "Yoruba"
+msgstr "Yoruba"
-#. Keyboard indicator for Catalan layouts
+#. Keyboard indicator for Amharic layouts
#: ../rules/base.xml.in.h:841
-msgid "ca"
-msgstr "ca"
+msgid "am"
+msgstr "am"
-#. Keyboard indicator for Cherokee layouts
-#: ../rules/base.xml.in.h:843
-msgid "chr"
-msgstr "chr"
+#: ../rules/base.xml.in.h:842
+msgid "Amharic"
+msgstr "Amharic"
+
+#. Keyboard indicator for Wolof layouts
+#: ../rules/base.xml.in.h:844
+msgid "wo"
+msgstr "wo"
-#. Keyboard indicator for Cameroon layouts
#: ../rules/base.xml.in.h:845
-msgid "cm"
-msgstr "cm"
+msgid "Wolof"
+msgstr "Wolof"
-#. Keyboard indicator for Crimean Tatar layouts
-#: ../rules/base.xml.in.h:847 ../rules/base.extras.xml.in.h:38
-msgid "crh"
-msgstr "crh"
+#. Keyboard indicator for Braille layouts
+#: ../rules/base.xml.in.h:847
+msgid "brl"
+msgstr "brl"
+
+#: ../rules/base.xml.in.h:848
+msgid "Braille"
+msgstr "Braille"
-#. Keyboard indicator for Chech layouts
#: ../rules/base.xml.in.h:849
-msgid "cs"
-msgstr "cs"
+msgid "Braille (left hand)"
+msgstr "Braille (tangan kiri)"
-#. Keyboard indicator for Danish layouts
-#: ../rules/base.xml.in.h:851
-msgid "da"
-msgstr "da"
+#: ../rules/base.xml.in.h:850
+msgid "Braille (right hand)"
+msgstr "Braille (tangan kanan)"
-#. Keyboard indicator for German layouts
-#: ../rules/base.xml.in.h:853 ../rules/base.extras.xml.in.h:39
-msgid "de"
-msgstr "de"
+#. Keyboard indicator for Turkmen layouts
+#: ../rules/base.xml.in.h:852
+msgid "tk"
+msgstr "tk"
-#. Keyboard indicator for Dhivehi layouts
-#: ../rules/base.xml.in.h:855
-msgid "dv"
-msgstr "dv"
+#: ../rules/base.xml.in.h:853
+msgid "Turkmen"
+msgstr "Turkmen"
+
+#: ../rules/base.xml.in.h:854
+msgid "Turkmen (Alt-Q)"
+msgstr "Turkmen (Alt-Q)"
+
+#. Keyboard indicator for Bambara layouts
+#: ../rules/base.xml.in.h:856
+msgid "bm"
+msgstr "bm"
-#. Keyboard indicator for Dzongkha layouts
#: ../rules/base.xml.in.h:857
-msgid "dz"
-msgstr "dz"
+msgid "Bambara"
+msgstr "Bambara"
+
+#: ../rules/base.xml.in.h:858
+msgid "French (Mali, alternative)"
+msgstr "Perancis (Mali, alternatif)"
-#. Keyboard indicator for Ewe layouts
#: ../rules/base.xml.in.h:859
-msgid "ee"
-msgstr "ee"
+msgid "English (Mali, US Macintosh)"
+msgstr "Inggris (Mali, Macintosh AS)"
-#. Keyboard indicator for English layouts
-#: ../rules/base.xml.in.h:861 ../rules/base.extras.xml.in.h:40
-msgid "en"
-msgstr "en"
+#: ../rules/base.xml.in.h:860
+msgid "English (Mali, US international)"
+msgstr "Inggris (Mali, Internasional AS)"
+
+#. Keyboard indicator for Swahili layouts
+#: ../rules/base.xml.in.h:862
+msgid "sw"
+msgstr "sw"
-#. Keyboard indicator for Esperanto layouts
#: ../rules/base.xml.in.h:863
-msgid "eo"
-msgstr "eo"
+msgid "Swahili (Tanzania)"
+msgstr "Swahili (Tanzania)"
+
+#: ../rules/base.xml.in.h:864
+msgid "Swahili (Kenya)"
+msgstr "Swahili (Kenya)"
-#. Keyboard indicator for Spanish layouts
#: ../rules/base.xml.in.h:865
-msgid "es"
-msgstr "es"
+msgid "Kikuyu"
+msgstr "Kikuyu"
-#. Keyboard indicator for Estonian layouts
+#. Keyboard indicator for Tswana layouts
#: ../rules/base.xml.in.h:867
-msgid "et"
-msgstr "et"
+msgid "tn"
+msgstr "tn"
-#. Keyboard indicator for Persian layouts
-#: ../rules/base.xml.in.h:869 ../rules/base.extras.xml.in.h:41
-msgid "fa"
-msgstr "fa"
+#: ../rules/base.xml.in.h:868
+msgid "Tswana"
+msgstr "Tswana"
+
+#. Keyboard indicator for Filipino layouts
+#: ../rules/base.xml.in.h:870
+msgid "ph"
+msgstr "ph"
-#. Keyboard indicator for Fula layouts
#: ../rules/base.xml.in.h:871
-msgid "ff"
-msgstr "ff"
+msgid "Filipino"
+msgstr "Filipina"
+
+#: ../rules/base.xml.in.h:872
+msgid "Filipino (QWERTY Baybayin)"
+msgstr "Filipina (QWERTY Baybayin)"
-#. Keyboard indicator for Finnish layouts
#: ../rules/base.xml.in.h:873
-msgid "fi"
-msgstr "fi"
+msgid "Filipino (Capewell-Dvorak Latin)"
+msgstr "Filipina (Capewell-Dvorak Latin)"
+
+#: ../rules/base.xml.in.h:874
+msgid "Filipino (Capewell-Dvorak Baybayin)"
+msgstr "Filipina (Capewell-Dvorak Baybayin)"
-#. Keyboard indicator for Faroese layouts
#: ../rules/base.xml.in.h:875
-msgid "fo"
-msgstr "fo"
+msgid "Filipino (Capewell-QWERF 2006 Latin)"
+msgstr "Filipina (Capewell-QWERF 2006 Latin)"
-#. Keyboard indicator for French layouts
-#: ../rules/base.xml.in.h:877 ../rules/base.extras.xml.in.h:42
-msgid "fr"
-msgstr "fr"
+#: ../rules/base.xml.in.h:876
+msgid "Filipino (Capewell-QWERF 2006 Baybayin)"
+msgstr "Filipina (Capewell-QWERF 2006 Baybayin)"
+
+#: ../rules/base.xml.in.h:877
+msgid "Filipino (Colemak Latin)"
+msgstr "Filipina (Colemak Latin)"
+
+#: ../rules/base.xml.in.h:878
+msgid "Filipino (Colemak Baybayin)"
+msgstr "Filipina (Colemak Baybayin)"
-#. Keyboard indicator for Ga layouts
#: ../rules/base.xml.in.h:879
-msgid "gaa"
-msgstr "gaa"
+msgid "Filipino (Dvorak Latin)"
+msgstr "Filipina (Dvorak Latin)"
+
+#: ../rules/base.xml.in.h:880
+msgid "Filipino (Dvorak Baybayin)"
+msgstr "Filipina (Dvorak Baybayin)"
-#. Keyboard indicator for Greek layouts
#: ../rules/base.xml.in.h:881
-msgid "gr"
-msgstr "gr"
+msgid "md"
+msgstr "md"
+
+#: ../rules/base.xml.in.h:882
+msgid "Moldavian"
+msgstr "Moldavia"
-#. Keyboard indicator for Gujarati layouts
#: ../rules/base.xml.in.h:883
-msgid "gu"
-msgstr "gu"
+msgid "gag"
+msgstr "gag"
+
+#: ../rules/base.xml.in.h:884
+msgid "Moldavian (Gagauz)"
+msgstr "Moldavia (Gagauz)"
-#. Keyboard indicator for Hausa layouts
#: ../rules/base.xml.in.h:885
-msgid "ha"
-msgstr "ha"
+msgid "Switching to another layout"
+msgstr "Bertukar ke tata letak lain"
+
+#: ../rules/base.xml.in.h:886
+msgid "Right Alt (while pressed)"
+msgstr "Alt Kanan (ketika ditekan)"
-#. Keyboard indicator for Hebrew layouts
#: ../rules/base.xml.in.h:887
-msgid "he"
-msgstr "he"
+msgid "Left Alt (while pressed)"
+msgstr "Alt Kiri (ketika ditekan)"
+
+#: ../rules/base.xml.in.h:888
+msgid "Left Win (while pressed)"
+msgstr "Win Kiri (ketika ditekan)"
-#. Keyboard indicator for Hindi layouts
#: ../rules/base.xml.in.h:889
-msgid "hi"
-msgstr "hi"
+msgid "Right Win (while pressed)"
+msgstr "Win Kanan (ketika ditekan)"
+
+#: ../rules/base.xml.in.h:890
+msgid "Any Win key (while pressed)"
+msgstr "Tombol Win apapun (ketika ditekan)"
-#. Keyboard indicator for Croatian layouts
#: ../rules/base.xml.in.h:891
-msgid "hr"
-msgstr "hr"
+msgid "Caps Lock (while pressed), Alt+Caps Lock does the original capslock action"
+msgstr "Caps Lock (ketika ditekan), Alt+Caps Lock melakukan aksi capslock asli"
+
+#: ../rules/base.xml.in.h:892
+msgid "Right Ctrl (while pressed)"
+msgstr "Ctrl Kanan (ketika ditekan)"
-#. Keyboard indicator for Hungarian layouts
#: ../rules/base.xml.in.h:893
-msgid "hu"
-msgstr "hu"
+msgid "Right Alt"
+msgstr "Alt Kanan"
-#. Keyboard indicator for Armenian layouts
-#: ../rules/base.xml.in.h:895 ../rules/base.extras.xml.in.h:43
-msgid "hy"
-msgstr "hy"
+#: ../rules/base.xml.in.h:894
+msgid "Left Alt"
+msgstr "Alt Kiri"
+
+#: ../rules/base.xml.in.h:895
+msgid "Caps Lock"
+msgstr "Caps Lock"
+
+#: ../rules/base.xml.in.h:896
+msgid "Shift+Caps Lock"
+msgstr "Shift+Caps Lock"
-#. Keyboard indicator for Irish layouts
#: ../rules/base.xml.in.h:897
-msgid "ie"
-msgstr "ie"
+msgid "Caps Lock (to first layout), Shift+Caps Lock (to last layout)"
+msgstr "Caps Lock (ke tata letak pertama), Shift+Caps Lock (ke tata letak terakhir)"
+
+#: ../rules/base.xml.in.h:898
+msgid "Left Win (to first layout), Right Win/Menu (to last layout)"
+msgstr "Win Kiri (ke tata letak pertama), Win/Menu Kanan (ke tata letak terakhir)"
-#. Keyboard indicator for Igbo layouts
#: ../rules/base.xml.in.h:899
-msgid "ig"
-msgstr "ig"
+msgid "Left Ctrl (to first layout), Right Ctrl (to last layout)"
+msgstr "Ctrl Kiri (ke tata letak pertama), Ctrl Kanan (ke tata letak terakhir)"
+
+#: ../rules/base.xml.in.h:900
+msgid "Alt+Caps Lock"
+msgstr "Tombol Alt+Caps"
-#. Keyboard indicator for Inuktikut layouts
#: ../rules/base.xml.in.h:901
-msgid "ike"
-msgstr "ike"
+msgid "Both Shift keys together"
+msgstr "Kedua tombol Shift bersama"
+
+#: ../rules/base.xml.in.h:902
+msgid "Both Alt keys together"
+msgstr "Kedua tombol Alt bersama"
-#. Keyboard indicator for Indian layouts
#: ../rules/base.xml.in.h:903
-msgid "in"
-msgstr "in"
+msgid "Both Ctrl keys together"
+msgstr "Kedua tombol Ctrl bersama"
+
+#: ../rules/base.xml.in.h:904
+msgid "Ctrl+Shift"
+msgstr "Ctrl+Shift"
-#. Keyboard indicator for Icelandic layouts
#: ../rules/base.xml.in.h:905
-msgid "is"
-msgstr "is"
+msgid "Left Ctrl+Left Shift"
+msgstr "Ctrl Kiri+Shift Kiri"
+
+#: ../rules/base.xml.in.h:906
+msgid "Right Ctrl+Right Shift"
+msgstr "Ctrl Kanan+Shift Kanan"
-#. Keyboard indicator for Italian layouts
#: ../rules/base.xml.in.h:907
-msgid "it"
-msgstr "it"
+msgid "Alt+Ctrl"
+msgstr "Alt+Ctrl"
+
+#: ../rules/base.xml.in.h:908
+msgid "Alt+Shift"
+msgstr "Alt+Shift"
-#. Keyboard indicator for Japanese layouts
#: ../rules/base.xml.in.h:909
-msgid "ja"
-msgstr "ja"
+msgid "Left Alt+Left Shift"
+msgstr "Alt Kiri+Shift Kiri"
+
+#: ../rules/base.xml.in.h:910
+msgid "Alt+Space"
+msgstr "Alt+Space"
-#. Keyboard indicator for Georgian layouts
#: ../rules/base.xml.in.h:911
-msgid "ka"
-msgstr "ka"
+msgid "Menu"
+msgstr "Menu"
+
+#: ../rules/base.xml.in.h:912
+msgid "Left Win"
+msgstr "Win Kiri"
-#. Keyboard indicator for Kikuyu layouts
#: ../rules/base.xml.in.h:913
-msgid "ki"
-msgstr "ki"
+msgid "Right Win"
+msgstr "Win Kanan"
+
+#: ../rules/base.xml.in.h:914
+msgid "Left Shift"
+msgstr "Shift Kiri"
-#. Keyboard indicator for Kazakh layouts
#: ../rules/base.xml.in.h:915
-msgid "kk"
-msgstr "kk"
+msgid "Right Shift"
+msgstr "Shift Kanan"
+
+#: ../rules/base.xml.in.h:916
+msgid "Left Ctrl"
+msgstr "Ctrl Kiri"
-#. Keyboard indicator for Khmer layouts
#: ../rules/base.xml.in.h:917
-msgid "km"
-msgstr "km"
+msgid "Right Ctrl"
+msgstr "Ctrl Kanan"
+
+#: ../rules/base.xml.in.h:918
+msgid "Scroll Lock"
+msgstr "Scroll Lock"
-#. Keyboard indicator for Kannada layouts
#: ../rules/base.xml.in.h:919
-msgid "kn"
-msgstr "kn"
+msgid "LeftCtrl+LeftWin (to first layout), RightCtrl+Menu (to second layout)"
+msgstr "Ctrl Kiri+Win Kiri (ke tata letak pertama), Ctrl Kanan+Menu (ke tata letak kedua)"
+
+#: ../rules/base.xml.in.h:920
+msgid "Key to choose 3rd level"
+msgstr "Tekan Menu Kiri untuk memilih level 3"
-#. Keyboard indicator for Korean layouts
#: ../rules/base.xml.in.h:921
-msgid "ko"
-msgstr "ko"
+msgid "Any Win key"
+msgstr "Tombol Win apapun"
+
+#: ../rules/base.xml.in.h:922
+msgid "Any Alt key"
+msgstr "Tombol Alt apapun"
-#. Keyboard indicator for Kurdish layouts
#: ../rules/base.xml.in.h:923
-msgid "ku"
-msgstr "ku"
+msgid "Right Alt, Shift+Right Alt key is Compose"
+msgstr "Alt Kanan, Shift+Right Alt adalah Compose"
+
+#: ../rules/base.xml.in.h:924
+msgid "Right Alt key never chooses 3rd level"
+msgstr "Alt Kanan tidak pernah memilih level 3"
-#. Keyboard indicator for Lao layouts
#: ../rules/base.xml.in.h:925
-msgid "lo"
-msgstr "lo"
+msgid "Enter on keypad"
+msgstr "Enter pada keypad"
-#. Keyboard indicator for Lithuanian layouts
-#: ../rules/base.xml.in.h:927 ../rules/base.extras.xml.in.h:45
-msgid "lt"
-msgstr "lt"
+#: ../rules/base.xml.in.h:926
+msgid "Backslash"
+msgstr "Backslash"
-#. Keyboard indicator for Latvian layouts
-#: ../rules/base.xml.in.h:929 ../rules/base.extras.xml.in.h:46
-msgid "lv"
-msgstr "lv"
+#: ../rules/base.xml.in.h:927
+msgid "&lt;Less/Greater&gt;"
+msgstr "&lt;Lebih Kecil/Lebih Besar&gt;"
+
+#: ../rules/base.xml.in.h:928
+msgid "Caps Lock chooses 3rd level, acts as onetime lock when pressed together with another 3rd-level-chooser"
+msgstr "Caps Lock memilih level ketiga, berfungsi sebagai kunci sekali jika ditekan bersamaan dengan pemilih-level-ketiga lainnya"
+
+#: ../rules/base.xml.in.h:929
+msgid "Backslash chooses 3rd level, acts as onetime lock when pressed together with another 3rd-level-chooser"
+msgstr "Backslash memilih level ketiga, berfungsi sebagai kunci sekali jika ditekan bersamaan dengan pemilih-level-ketiga lainnya"
+
+#: ../rules/base.xml.in.h:930
+msgid "&lt;Less/Greater&gt; chooses 3rd level, acts as onetime lock when pressed together with another 3rd-level-chooser"
+msgstr "&lt;Lebih Kecil/Lebih Besar&gt; memilih level ke-3, berfungsi sebagai kunci sekali jika ditekan bersamaan dengan pemilih-level-ke-3 lainnya"
-#. Keyboard indicator for Maori layouts
#: ../rules/base.xml.in.h:931
-msgid "mi"
-msgstr "mi"
+msgid "Ctrl key position"
+msgstr "Posisi tombol Ctrl"
+
+#: ../rules/base.xml.in.h:932
+msgid "Caps Lock as Ctrl"
+msgstr "Caps Lock sebagai Ctrl"
-#. Keyboard indicator for Macedonian layouts
#: ../rules/base.xml.in.h:933
-msgid "mk"
-msgstr "mk"
+msgid "Left Ctrl as Meta"
+msgstr "Ctrl Kiri sebagai Meta"
+
+#: ../rules/base.xml.in.h:934
+msgid "Swap Ctrl and Caps Lock"
+msgstr "Tukar Ctrl dan Caps Lock"
-#. Keyboard indicator for Malayalam layouts
#: ../rules/base.xml.in.h:935
-msgid "ml"
-msgstr "ml"
+msgid "At left of 'A'"
+msgstr "Di sebelah kiri 'A'"
+
+#: ../rules/base.xml.in.h:936
+msgid "At bottom left"
+msgstr "Di kiri bawah"
-#. Keyboard indicator for Mongolian layouts
#: ../rules/base.xml.in.h:937
-msgid "mn"
-msgstr "mn"
+msgid "Right Ctrl as Right Alt"
+msgstr "Ctrl Kanan bertindak seperti Alt Kanan"
+
+#: ../rules/base.xml.in.h:938
+msgid "Menu as Right Ctrl"
+msgstr "Menu sebagai Ctrl Kanan"
-#. Keyboard indicator for Maltese layouts
#: ../rules/base.xml.in.h:939
-msgid "mt"
-msgstr "mt"
+msgid "Right Alt as Right Ctrl"
+msgstr "Alt Kanan sebagai Ctrl Kanan"
+
+#: ../rules/base.xml.in.h:940
+msgid "Swap Left Alt key with Left Ctrl key"
+msgstr "Tukar tombol Alt Kiri dengan tombol Ctrl Kiri"
-#. Keyboard indicator for Burmese layouts
#: ../rules/base.xml.in.h:941
-msgid "my"
-msgstr "my"
+msgid "Swap Left Win key with Left Ctrl key"
+msgstr "Tukar tombol Win Kiri dengan tombol Ctrl Kiri"
+
+#: ../rules/base.xml.in.h:942
+msgid "Left Alt as Ctrl, Left Ctrl as Win, Left Win as Alt"
+msgstr "Alt Kiri adalah Ctrl, CTrl Kiri adalan Win, Win Kiri adalah Alt"
-#. Keyboard indicator for Nepali layouts
#: ../rules/base.xml.in.h:943
-msgid "ne"
-msgstr "ne"
+msgid "Use keyboard LED to show alternative layout"
+msgstr "Gunakan papan ketik LED untuk menunjukkan layout alternatif"
+
+#: ../rules/base.xml.in.h:944
+msgid "Num Lock"
+msgstr "Num Lock"
-#. Keyboard indicator for Dutch layouts
#: ../rules/base.xml.in.h:945
-msgid "nl"
-msgstr "nl"
+msgid "Layout of numeric keypad"
+msgstr "Tata letak keypad numerik"
+
+#: ../rules/base.xml.in.h:946
+msgid "Legacy"
+msgstr "Legacy"
-#. Keyboard indicator for Norwegian layouts
#: ../rules/base.xml.in.h:947
-msgid "no"
-msgstr "no"
+msgid "Unicode additions (arrows and math operators)"
+msgstr "Tambahan unicode (panah dan operator matematika)"
+
+#: ../rules/base.xml.in.h:948
+msgid "Unicode additions (arrows and math operators; math operators on default level)"
+msgstr "Tambahan unicode (panah dan operator matematika; operator matematika pada level baku)"
-#. Keyboard indicator for Oriya layouts
#: ../rules/base.xml.in.h:949
-msgid "or"
-msgstr "or"
+msgid "Legacy Wang 724"
+msgstr "Legacy Wang 724"
+
+#: ../rules/base.xml.in.h:950
+msgid "Wang 724 keypad with Unicode additions (arrows and math operators)"
+msgstr "Wang 724 keypad dengan tambahan Unicode (panah and operator matematika)"
-#. Keyboard indicator for Punjabi layouts
#: ../rules/base.xml.in.h:951
-msgid "pa"
-msgstr "pa"
+msgid "Wang 724 keypad with Unicode additions (arrows and math operators; math operators on default level)"
+msgstr "Wang 724 keypad dengan tambahan Unicode (panah and operator matematika; operator matematika pada level baku)"
+
+#: ../rules/base.xml.in.h:952
+msgid "Hexadecimal"
+msgstr "Heksadesimal"
-#. Keyboard indicator for Filipino layouts
#: ../rules/base.xml.in.h:953
-msgid "ph"
-msgstr "ph"
+msgid "ATM/phone-style"
+msgstr "Gaya ATM/telepon"
-#. Keyboard indicator for Polish layouts
-#: ../rules/base.xml.in.h:955 ../rules/base.extras.xml.in.h:47
-msgid "pl"
-msgstr "pl"
+#: ../rules/base.xml.in.h:954
+msgid "Numeric keypad delete key behaviour"
+msgstr "Keypad numerik menghapus perilaku tombol"
-#. Keyboard indicator for Pashto layouts
+#: ../rules/base.xml.in.h:955
+msgid "Legacy key with dot"
+msgstr "Tombol Legacy dengan titik"
+
+#. Actually, with KP_SEPARATOR, as the old keypad(comma)
#: ../rules/base.xml.in.h:957
-msgid "ps"
-msgstr "ps"
+msgid "Legacy key with comma"
+msgstr "Tombol Legacy dengan koma"
+
+#: ../rules/base.xml.in.h:958
+msgid "Four-level key with dot"
+msgstr "Tombol empat-level dengan titik"
-#. Keyboard indicator for Portuguese layouts
#: ../rules/base.xml.in.h:959
-msgid "pt"
-msgstr "pt"
+msgid "Four-level key with dot, Latin-9 only"
+msgstr "Tombol empat-level dengan titik, hanya Latin-9"
-#. Keyboard indicator for Romanian layouts
-#: ../rules/base.xml.in.h:961 ../rules/base.extras.xml.in.h:48
-msgid "ro"
-msgstr "ro"
+#: ../rules/base.xml.in.h:960
+msgid "Four-level key with comma"
+msgstr "Tombol empat-level dengan koma"
-#. Keyboard indicator for Russian layouts
-#: ../rules/base.xml.in.h:963 ../rules/base.extras.xml.in.h:49
-msgid "ru"
-msgstr "ru"
+#: ../rules/base.xml.in.h:961
+msgid "Four-level key with momayyez"
+msgstr "Tombol empat level dengan momayyez"
+
+#. This assumes the KP_ abstract symbols are actually useful for some apps
+#. The description needs to be rewritten
+#: ../rules/base.xml.in.h:964
+msgid "Four-level key with abstract separators"
+msgstr "Tombol empat-level dengan pemisah abstrak"
-#. Keyboard indicator for Sindhi layouts
#: ../rules/base.xml.in.h:965
-msgid "sd"
-msgstr "sd"
+msgid "Semicolon on third level"
+msgstr "Titik koma pada level ketiga"
+
+#: ../rules/base.xml.in.h:966
+msgid "Caps Lock key behavior"
+msgstr "Perilaku tombol Caps Lock"
-#. Keyboard indicator for Sinhala layouts
#: ../rules/base.xml.in.h:967
-msgid "si"
-msgstr "si"
+msgid "Caps Lock uses internal capitalization; Shift \"pauses\" Caps Lock"
+msgstr "Caps Lock menggunakan kapitalisasi internal. Shift \"mengistirahatkan\" Caps Lock"
+
+#: ../rules/base.xml.in.h:968
+msgid "Caps Lock uses internal capitalization; Shift doesn't affect Caps Lock"
+msgstr "Caps Lock menggunakan kapitalisasi internal. Shift tidak mempengaruhi Caps Lock"
-#. Keyboard indicator for Slovak layouts
#: ../rules/base.xml.in.h:969
-msgid "sk"
-msgstr "sk"
+msgid "Caps Lock acts as Shift with locking; Shift \"pauses\" Caps Lock"
+msgstr "Caps Lock bertindak sebagai Shift dengan penguncian; Shift \"mengistirahatkan\" Caps Lock"
+
+#: ../rules/base.xml.in.h:970
+msgid "Caps Lock acts as Shift with locking; Shift doesn't affect Caps Lock"
+msgstr "Caps Lock bertindak sebagai Shift dengan penguncian; Shift tidak mempengaruhi Caps Lock"
-#. Keyboard indicator for Slovenian layouts
#: ../rules/base.xml.in.h:971
-msgid "sl"
-msgstr "sl"
+msgid "Caps Lock toggles normal capitalization of alphabetic characters"
+msgstr "Caps Lock mengubah huruf besar normal atau karakter secara alfabetis"
+
+#: ../rules/base.xml.in.h:972
+msgid "Make Caps Lock an additional Num Lock"
+msgstr "Buat Caps Lock sebagai tambahan Num Lock"
-#. Keyboard indicator for Albanian layouts
#: ../rules/base.xml.in.h:973
-msgid "sq"
-msgstr "sq"
+msgid "Swap ESC and Caps Lock"
+msgstr "Tukar ESC dan Caps Lock"
-#. Keyboard indicator for Serbian layouts
-#: ../rules/base.xml.in.h:975 ../rules/base.extras.xml.in.h:51
-msgid "sr"
-msgstr "sr"
+#: ../rules/base.xml.in.h:974
+msgid "Make Caps Lock an additional ESC"
+msgstr "Buat Caps Lock sebagai tambahan ESC"
+
+#: ../rules/base.xml.in.h:975
+msgid "Make Caps Lock an additional Backspace"
+msgstr "Buat Caps Lock sebagai tambahan Backspace"
+
+#: ../rules/base.xml.in.h:976
+msgid "Make Caps Lock an additional Super"
+msgstr "Buat Caps Lock sebagai tambahan Super"
-#. Keyboard indicator for Swedish layouts
#: ../rules/base.xml.in.h:977
-msgid "sv"
-msgstr "sv"
+msgid "Make Caps Lock an additional Hyper"
+msgstr "Buat Caps Lock sebagai tambahan Hiper"
+
+#: ../rules/base.xml.in.h:978
+msgid "Caps Lock toggles ShiftLock (affects all keys)"
+msgstr "Caps Lock menjungkitkan ShiftLock (mempengaruhi semua tombol)"
-#. Keyboard indicator for Swahili layouts
#: ../rules/base.xml.in.h:979
-msgid "sw"
-msgstr "sw"
+msgid "Caps Lock is disabled"
+msgstr "Caps Lock dinonaktifkan"
+
+#: ../rules/base.xml.in.h:980
+msgid "Make Caps Lock an additional Ctrl"
+msgstr "Buat Caps Lock sebagai Ctrl tambahan"
-#. Keyboard indicator for Syriac layouts
#: ../rules/base.xml.in.h:981
-msgid "syc"
-msgstr "syc"
+msgid "Alt/Win key behavior"
+msgstr "Tindakan Tombol Alt/Win "
+
+#: ../rules/base.xml.in.h:982
+msgid "Add the standard behavior to Menu key"
+msgstr "Tambah tindakan standar pada tombol Menu"
-#. Keyboard indicator for Tamil layouts
#: ../rules/base.xml.in.h:983
-msgid "ta"
-msgstr "ta"
+msgid "Alt and Meta are on Alt keys"
+msgstr "Alt dan Meta pada tombol Alt"
+
+#: ../rules/base.xml.in.h:984
+msgid "Alt is mapped to Win keys (and the usual Alt keys)"
+msgstr "Alt dipetakan ke tombol Win (dan tombol Alt yang biasa)"
-#. Keyboard indicator for Telugu layouts
#: ../rules/base.xml.in.h:985
-msgid "te"
-msgstr "te"
+msgid "Ctrl is mapped to Win keys (and the usual Ctrl keys)"
+msgstr "Ctrl dipetakan ke tombol Win (dan tombol Ctrl yang biasa)"
+
+#: ../rules/base.xml.in.h:986
+msgid "Ctrl is mapped to Alt keys, Alt is mapped to Win keys"
+msgstr "Ctrl dipetakan ke tombol Alt, Alt dipetakan ke tombol Win"
-#. Keyboard indicator for Tajik layouts
#: ../rules/base.xml.in.h:987
-msgid "tg"
-msgstr "tg"
+msgid "Meta is mapped to Win keys"
+msgstr "Meta dipetakan ke tombol Win"
+
+#: ../rules/base.xml.in.h:988
+msgid "Meta is mapped to Left Win"
+msgstr "Meta dipetakan ke tombol Win Kiri"
-#. Keyboard indicator for Thai layouts
#: ../rules/base.xml.in.h:989
-msgid "th"
-msgstr "th"
+msgid "Hyper is mapped to Win-keys"
+msgstr "Hiper dipetakan ke tombol Win"
+
+#: ../rules/base.xml.in.h:990
+msgid "Alt is mapped to Right Win, Super to Menu"
+msgstr "Alt dipetakan ke Win Kanan, Super ke Menu"
-#. Keyboard indicator for Turkmen layouts
#: ../rules/base.xml.in.h:991
-msgid "tk"
-msgstr "tk"
+msgid "Alt is swapped with Win"
+msgstr "Alt ditukar dengan Win"
+
+#: ../rules/base.xml.in.h:992
+msgid "Position of Compose key"
+msgstr "Posisi tombol Compose"
-#. Keyboard indicator for Tswana layouts
#: ../rules/base.xml.in.h:993
-msgid "tn"
-msgstr "tn"
+msgid "3rd level of Left Win"
+msgstr "Tingkat 3 dari Win Kiri"
+
+#: ../rules/base.xml.in.h:994
+msgid "3rd level of Right Win"
+msgstr "Tingkat 3 dari Win Kanan"
-#. Keyboard indicator for Turkish layouts
#: ../rules/base.xml.in.h:995
-msgid "tr"
-msgstr "tr"
+msgid "3rd level of Menu"
+msgstr "Tingkat 3 dari Menu"
+
+#: ../rules/base.xml.in.h:996
+msgid "3rd level of Left Ctrl"
+msgstr "Tingkat 3 dari Ctrl Kiri"
-#. Keyboard indicator for Ukranian layouts
#: ../rules/base.xml.in.h:997
-msgid "uk"
-msgstr "uk"
+msgid "3rd level of Right Ctrl"
+msgstr "Tingkat 3 dari Ctrl Kanan"
+
+#: ../rules/base.xml.in.h:998
+msgid "3rd level of Caps Lock"
+msgstr "Tingkat 3 dari Caps Lock"
-#. Keyboard indicator for Urdu layouts
#: ../rules/base.xml.in.h:999
-msgid "ur"
-msgstr "ur"
+msgid "3rd level of &lt;Less/Greater&gt;"
+msgstr "Tingkat 3 dari &lt;Lebih Kecil/Lebih Besar&gt;"
+
+#: ../rules/base.xml.in.h:1000
+msgid "Pause"
+msgstr "Pause"
-#. Keyboard indicator for Uzbek layouts
#: ../rules/base.xml.in.h:1001
-msgid "uz"
-msgstr "uz"
+msgid "PrtSc"
+msgstr "PrtSc"
+
+#: ../rules/base.xml.in.h:1002
+msgid "Miscellaneous compatibility options"
+msgstr "Pilihan kompabilitas lain-lain"
-#. Keyboard indicator for Vietnamese layouts
#: ../rules/base.xml.in.h:1003
-msgid "vi"
-msgstr "vi"
+msgid "Default numeric keypad keys"
+msgstr "Tombol angka keypad standar"
+
+#: ../rules/base.xml.in.h:1004
+msgid "Numeric keypad keys always enter digits (as in Mac OS)"
+msgstr "Keypad numerik selalu memasukkan digit (seperti dalam Mac OS)"
-#. Keyboard indicator for Wolof layouts
#: ../rules/base.xml.in.h:1005
-msgid "wo"
-msgstr "wo"
+msgid "Shift with numeric keypad keys works as in MS Windows"
+msgstr "Shit dengan keypad numerik bekerja sesuai pada MS Windows"
+
+#: ../rules/base.xml.in.h:1006
+msgid "Shift does not cancel Num Lock, chooses 3rd level instead"
+msgstr "Shift tidak membatalkan Num Lock, lebih memilih level ketiga"
-#. Keyboard indicator for Saisiyat layouts
#: ../rules/base.xml.in.h:1007
-msgid "xsy"
-msgstr "xsy"
+msgid "Special keys (Ctrl+Alt+&lt;key&gt;) handled in a server"
+msgstr "Tombol spesial (Ctrl+Alt+&lt;key&gt;) ditangani pada server"
+
+#: ../rules/base.xml.in.h:1008
+msgid "Apple Aluminium Keyboard: emulate PC keys (Print, Scroll Lock, Pause, Num Lock)"
+msgstr "Papan Ketik Aluminium Apple: mengemulasi tombol PC (Print, Scroll_Lock, Pause, Num Lock)"
-#. Keyboard indicator for Yoruba layouts
#: ../rules/base.xml.in.h:1009
-msgid "yo"
-msgstr "yo"
+msgid "Shift cancels Caps Lock"
+msgstr "Shift membatalkan Caps Lock"
+
+#: ../rules/base.xml.in.h:1010
+msgid "Enable extra typographic characters"
+msgstr "Aktifkan karakter tipografi ekstra"
-#. Keyboard indicator for Taiwanese layouts
#: ../rules/base.xml.in.h:1011
-msgid "zh"
-msgstr "zh"
+msgid "Both Shift keys together toggle Caps Lock"
+msgstr "Kedua tombol Shift bersamaan menjungkitkan Caps Lock"
-#: ../rules/base.extras.xml.in.h:1
-msgid "APL Keyboard Symbols"
-msgstr "Simbol Papan Tik APL"
+#: ../rules/base.xml.in.h:1012
+msgid "Both Shift keys together activate Caps Lock, one Shift key deactivates"
+msgstr "Kedua tombol Shift bersamaan mengaktifkan Caps Lock, satu tombol Shift mematikannya"
-#: ../rules/base.extras.xml.in.h:3
-msgid "Armenian (OLPC phonetic)"
-msgstr "Armenia (fonetik OLPC)"
+#: ../rules/base.xml.in.h:1013
+msgid "Both Shift keys together toggle ShiftLock"
+msgstr "Kedua tombol Shift bersamaan menjungkitkan ShiftLock"
-#: ../rules/base.extras.xml.in.h:4
-msgid "Atsina"
-msgstr "Atsina"
+#: ../rules/base.xml.in.h:1014
+msgid "Shift + NumLock toggles PointerKeys"
+msgstr "Shift + NumLock menjungkitkan PointerKeys"
+
+#: ../rules/base.xml.in.h:1015
+msgid "Allow breaking grabs with keyboard actions (warning: security risk)"
+msgstr "Izinkan memecah genggaman dengan aksi papan tik (peringatan: resiko keamanan)"
+
+#: ../rules/base.xml.in.h:1016
+msgid "Allow grab and window tree logging"
+msgstr "Izinkan pencatatan genggaman dan pohon jendela"
+
+#: ../rules/base.xml.in.h:1017
+msgid "Adding currency signs to certain keys"
+msgstr "Menambahkan tanda mata uang ke tombol tertentu"
+
+#: ../rules/base.xml.in.h:1018
+msgid "Euro on E"
+msgstr "Euro pada E"
+
+#: ../rules/base.xml.in.h:1019
+msgid "Euro on 2"
+msgstr "Euro pada 2"
+
+#: ../rules/base.xml.in.h:1020
+msgid "Euro on 4"
+msgstr "Euro pada 4"
+
+#: ../rules/base.xml.in.h:1021
+msgid "Euro on 5"
+msgstr "Euro pada 5"
+
+#: ../rules/base.xml.in.h:1022
+msgid "Rupee on 4"
+msgstr "Rupee pada 4"
+
+#: ../rules/base.xml.in.h:1023
+msgid "Key to choose 5th level"
+msgstr "Tombol untuk memilih level kelima"
+
+#: ../rules/base.xml.in.h:1024
+msgid "&lt;Less/Greater&gt; chooses 5th level, locks when pressed together with another 5th-level-chooser"
+msgstr "&lt;Lebih Kecil/Lebih Besar&gt; pilih level kelima, terkunci jika ditekan bersamaan dengan pemilih-level-kelima lainnya"
+
+#: ../rules/base.xml.in.h:1025
+msgid "Right Alt chooses 5th level, locks when pressed together with another 5th-level-chooser"
+msgstr "Alt kanan memilih level kelima, terkunci jika ditekan bersamaan dengan pemilih-level-kelima lainnya"
+
+#: ../rules/base.xml.in.h:1026
+msgid "Left Win chooses 5th level, locks when pressed together with another 5th-level-chooser"
+msgstr "Win kiri memilih level kelima, terkunci jika ditekan bersamaan dengan pemilih-level-kelima lainnya"
+
+#: ../rules/base.xml.in.h:1027
+msgid "Right Win chooses 5th level, locks when pressed together with another 5th-level-chooser"
+msgstr "Win kanan memilih level kelima, terkunci jika ditekan bersamaan dengan pemilih-level-kelima"
+
+#: ../rules/base.xml.in.h:1028
+msgid "Using space key to input non-breakable space character"
+msgstr "Menggunakan spasi untuk input karakter spasi yang tidak pecah"
+
+#: ../rules/base.xml.in.h:1029
+msgid "Usual space at any level"
+msgstr "Tombol spasi biasa pada semua level"
+
+#: ../rules/base.xml.in.h:1030
+msgid "Non-breakable space character at second level"
+msgstr "Karakter spasi yang tidak pecah pada level 2"
+
+#: ../rules/base.xml.in.h:1031
+msgid "Non-breakable space character at third level"
+msgstr "Karakter spasi yang tidak pecah pada level 3"
+
+#: ../rules/base.xml.in.h:1032
+msgid "Non-breakable space character at third level, nothing at fourth level"
+msgstr "Karakter spasi yang tidak pecah pada level 3, tidak ada pada level 4"
+
+#: ../rules/base.xml.in.h:1033
+msgid "Non-breakable space character at third level, thin non-breakable space character at fourth level"
+msgstr "Karakter spasi yang tidak pecah pada level 3, karakter spasi yang tidak pecah dan tipis pada level 4"
+
+#: ../rules/base.xml.in.h:1034
+msgid "Non-breakable space character at fourth level"
+msgstr "Karakter spasi yang tidak pecah pada level 4"
+
+#: ../rules/base.xml.in.h:1035
+msgid "Non-breakable space character at fourth level, thin non-breakable space character at sixth level"
+msgstr "Karakter spasi yang tidak pecah pada level 4, karakter spasi yang tidak pecah dan tipis pada level 6"
+
+#: ../rules/base.xml.in.h:1036
+msgid "Non-breakable space character at fourth level, thin non-breakable space character at sixth level (via Ctrl+Shift)"
+msgstr "Karakter spasi yang tidak pecah pada level 4, karakter spasi yang tidak pecah dan tipis pada level 6 (via Ctrl+Shift)"
+
+#: ../rules/base.xml.in.h:1037
+msgid "Zero-width non-joiner character at second level"
+msgstr "Karakter non-penggabung lebar-nol pada level kedua"
+
+#: ../rules/base.xml.in.h:1038
+msgid "Zero-width non-joiner character at second level, zero-width joiner character at third level"
+msgstr "Karakter non-penggabung lebar nol pada level kedua, karakter penggabung lebar-nol pada level ketiga"
+
+#: ../rules/base.xml.in.h:1039
+msgid "Zero-width non-joiner character at second level, zero-width joiner character at third level, non-breakable space character at fourth level"
+msgstr "Karakter non-penggabung pada level kedua, karakter penggabung lebar-nol pada level ketiga, karakter spasi non-dilepaskan pada level keempat"
+
+#: ../rules/base.xml.in.h:1040
+msgid "Zero-width non-joiner character at second level, non-breakable space character at third level"
+msgstr "Karakter non-penggabung lebar-nol pada level kedua, karakter spasi non-dilepaskan pada level ketiga"
+
+#: ../rules/base.xml.in.h:1041
+msgid "Zero-width non-joiner character at second level, non-breakable space character at third level, nothing at fourth level"
+msgstr "Karakter non-penggabung lebar-nol pada level kedua, karakter spasi non-dilepaskan pada level ketiga, tak ada di level keempat"
+
+#: ../rules/base.xml.in.h:1042
+msgid "Zero-width non-joiner character at second level, non-breakable space character at third level, zero-width joiner at fourth level"
+msgstr "Karakter non-penggabung lebar-nol pada level kedua, karakter spasi non-dilepaskan pada level ketiga, penggabung lebar-nol pada level keempat"
+
+#: ../rules/base.xml.in.h:1043
+msgid "Zero-width non-joiner character at second level, non-breakable space character at third level, thin non-breakable space at fourth level"
+msgstr "Karakter non-penggabung lebar-nol pada level ketiga, karakter spasi non-dilepaskan pada level ketiga, spasi non-dilepaskan tipis pada level keempat"
+
+#: ../rules/base.xml.in.h:1044
+msgid "Zero-width non-joiner character at third level, zero-width joiner at fourth level"
+msgstr "Karakter non-penggabung lebar-nol pada level ketiga, penggabung lebar-nol pada level keempat"
+
+#: ../rules/base.xml.in.h:1045
+msgid "Japanese keyboard options"
+msgstr "Pilihan papan ketik Jepang"
+
+#: ../rules/base.xml.in.h:1046
+msgid "Kana Lock key is locking"
+msgstr "Tombol Kana Lock terkunci"
+
+#: ../rules/base.xml.in.h:1047
+msgid "NICOLA-F style Backspace"
+msgstr "NICOLA-F style Backspace"
+
+#: ../rules/base.xml.in.h:1048
+msgid "Make Zenkaku Hankaku an additional ESC"
+msgstr "Buat Zenkaku Hankaku sebagai tambahan ESC"
+
+#: ../rules/base.xml.in.h:1049
+msgid "Adding Esperanto supersigned letters"
+msgstr "Menambah huruf supersigned Esperanto"
+
+#: ../rules/base.xml.in.h:1050
+msgid "To the corresponding key in a Qwerty layout"
+msgstr "Ke tombol terkait dalam tata letak Qwerty"
+
+#: ../rules/base.xml.in.h:1051
+msgid "To the corresponding key in a Dvorak layout"
+msgstr "Ke tombol terkait dalam tata letak Dvorak"
+
+#: ../rules/base.xml.in.h:1052
+msgid "To the corresponding key in a Colemak layout"
+msgstr "Ke tombol terkait dalam tata letak Colemak"
+
+#: ../rules/base.xml.in.h:1053
+msgid "Maintain key compatibility with old Solaris keycodes"
+msgstr "Memelihara kompatibilitas tombol dengan kode tombol Solaris tua"
+
+#: ../rules/base.xml.in.h:1054
+msgid "Sun Key compatibility"
+msgstr "Kompatibilitas Tombol Sun"
+
+#: ../rules/base.xml.in.h:1055
+msgid "Key sequence to kill the X server"
+msgstr "Sekuensi kunci untuk mematikan server X"
+
+#: ../rules/base.xml.in.h:1056
+msgid "Ctrl + Alt + Backspace"
+msgstr "Ctrl + Alt + Backspace"
+
+#: ../rules/base.extras.xml.in.h:1
+msgid "apl"
+msgstr "apl"
+
+#: ../rules/base.extras.xml.in.h:2
+msgid "APL keyboard symbols"
+msgstr "Simbol papan tik APL"
#: ../rules/base.extras.xml.in.h:5
-msgid "Avestan"
-msgstr "Avestan"
+msgid "kut"
+msgstr "kut"
#: ../rules/base.extras.xml.in.h:6
-msgid "Couer D'alene Salish"
-msgstr "Couer D'alene Salish"
+msgid "Kutenai"
+msgstr "Kutenai"
#: ../rules/base.extras.xml.in.h:7
-msgid "Crimean Tatar (Dobruja Q)"
-msgstr "Tatar Krimea (Dobruja Q)"
+msgid "shs"
+msgstr "shs"
-#: ../rules/base.extras.xml.in.h:9
-msgid "English (US, international AltGr Unicode combining)"
-msgstr "Inggris (AS, internasional AltGr menggabungkan Unicode)"
+#: ../rules/base.extras.xml.in.h:8
+msgid "Secwepemctsin"
+msgstr "Secwepemctsin"
-#: ../rules/base.extras.xml.in.h:10
-msgid "English (US, international AltGr Unicode combining, alternative)"
-msgstr "Inggris (AS, internasional (AltGr menggabungkan Unicode, alternatif)"
+#: ../rules/base.extras.xml.in.h:9
+msgid "Multilingual (Canada, Sun Type 6/7)"
+msgstr "Multibahasa (Kanada, Sun Tipe 6/7)"
-#: ../rules/base.extras.xml.in.h:13
+#: ../rules/base.extras.xml.in.h:12
msgid "German (US keyboard with German letters)"
msgstr "Jerman (papan tik AS dengan huruf Jerman)"
-#: ../rules/base.extras.xml.in.h:14
+#: ../rules/base.extras.xml.in.h:13
msgid "German (with Hungarian letters and no dead keys)"
msgstr "Jerman (dengan huruf Hungaria dan tanpa tombol mati)"
-#: ../rules/base.extras.xml.in.h:15
-msgid "Kutenai"
-msgstr "Kutenai"
+#: ../rules/base.extras.xml.in.h:14
+msgid "German (Sun Type 6/7)"
+msgstr "Jerman (Sun Tipe 6/7)"
#: ../rules/base.extras.xml.in.h:17
-msgid "Latvian (US Colemak)"
-msgstr "Latvia (Colemak AS)"
+msgid "Avestan"
+msgstr "Avestan"
-#: ../rules/base.extras.xml.in.h:18
-msgid "Latvian (US Colemak, apostrophe variant)"
-msgstr "Latvia (Colemak AS, varian apostrop)"
+#: ../rules/base.extras.xml.in.h:20
+msgid "Lithuanian (US Dvorak with Lithuanian letters)"
+msgstr "Lituania (Dvorak AS dengan huruf Lituania)"
+
+#: ../rules/base.extras.xml.in.h:21
+msgid "Lithuanian (Sun Type 6/7)"
+msgstr "Lithuania (Sun Tipe 6/7)"
-#: ../rules/base.extras.xml.in.h:19
+#: ../rules/base.extras.xml.in.h:24
msgid "Latvian (US Dvorak)"
msgstr "Latvia (Dvorak AS)"
-#: ../rules/base.extras.xml.in.h:20
+#: ../rules/base.extras.xml.in.h:25
msgid "Latvian (US Dvorak, Y variant)"
msgstr "Latvia (Dvorak AS, varian Y)"
-#: ../rules/base.extras.xml.in.h:21
+#: ../rules/base.extras.xml.in.h:26
msgid "Latvian (US Dvorak, minus variant)"
msgstr "Latvia (Dvorak AS, tanpa varian)"
-#: ../rules/base.extras.xml.in.h:22
+#: ../rules/base.extras.xml.in.h:27
msgid "Latvian (programmer US Dvorak)"
msgstr "Latvia (Dvorak AS pemrogram)"
-#: ../rules/base.extras.xml.in.h:23
+#: ../rules/base.extras.xml.in.h:28
msgid "Latvian (programmer US Dvorak, Y variant)"
msgstr "Latvia (Dvorak AS pemrogram, varian Y)"
-#: ../rules/base.extras.xml.in.h:24
+#: ../rules/base.extras.xml.in.h:29
msgid "Latvian (programmer US Dvorak, minus variant)"
msgstr "Latvia (Dvorak AS pemrogram, tanpa varian)"
-#: ../rules/base.extras.xml.in.h:26
-msgid "Lithuanian (US Dvorak with Lithuanian letters)"
-msgstr "Lituania (Dvorak AS dengan huruf Lituania)"
+#: ../rules/base.extras.xml.in.h:30
+msgid "Latvian (US Colemak)"
+msgstr "Latvia (Colemak AS)"
-#: ../rules/base.extras.xml.in.h:29
+#: ../rules/base.extras.xml.in.h:31
+msgid "Latvian (US Colemak, apostrophe variant)"
+msgstr "Latvia (Colemak AS, varian apostrop)"
+
+#: ../rules/base.extras.xml.in.h:32
+msgid "Latvian (Sun Type 6/7)"
+msgstr "Latvia (Sun Tipe 6/7)"
+
+#: ../rules/base.extras.xml.in.h:35
+msgid "English (US, international AltGr Unicode combining)"
+msgstr "Inggris (AS, internasional AltGr menggabungkan Unicode)"
+
+#: ../rules/base.extras.xml.in.h:36
+msgid "English (US, international AltGr Unicode combining, alternative)"
+msgstr "Inggris (AS, internasional (AltGr menggabungkan Unicode, alternatif)"
+
+#: ../rules/base.extras.xml.in.h:37
+msgid "Atsina"
+msgstr "Atsina"
+
+#: ../rules/base.extras.xml.in.h:38
+msgid "Coeur d'Alene Salish"
+msgstr "Couer d'Alene Salish"
+
+#: ../rules/base.extras.xml.in.h:39
+msgid "English (US, Sun Type 6/7)"
+msgstr "Inggris (AS, Sun Tipe 6/7)"
+
+#: ../rules/base.extras.xml.in.h:40
+msgid "English (Norman)"
+msgstr "Inggris (Norman)"
+
+#: ../rules/base.extras.xml.in.h:43
msgid "Polish (international with dead keys)"
msgstr "Polandia (internasional dengan tombol mati)"
-#: ../rules/base.extras.xml.in.h:31
+#: ../rules/base.extras.xml.in.h:44
+msgid "Polish (Colemak)"
+msgstr "Polandia (Colemak)"
+
+#: ../rules/base.extras.xml.in.h:45
+msgid "Polish (Sun Type 6/7)"
+msgstr "Polandia (Sun Tipe 6/7)"
+
+#: ../rules/base.extras.xml.in.h:49
+msgid "Crimean Tatar (Dobruja Q)"
+msgstr "Tatar Krimea (Dobruja Q)"
+
+#: ../rules/base.extras.xml.in.h:50
msgid "Romanian (ergonomic Touchtype)"
msgstr "Rumania (Touchtype ergonomis)"
-#: ../rules/base.extras.xml.in.h:33
+#: ../rules/base.extras.xml.in.h:51
+msgid "Romanian (Sun Type 6/7)"
+msgstr "Rumania (Sun Tipe 6/7)"
+
+#: ../rules/base.extras.xml.in.h:54
+msgid "Serbian (combining accents instead of dead keys)"
+msgstr "Serbia (menggabungkan aksen ketimbang tombol mati)"
+
+#: ../rules/base.extras.xml.in.h:57
msgid "Russian (with Ukrainian-Belorussian layout)"
msgstr "Russia (dengan tata letak Ukraina-Belarusia)"
-#: ../rules/base.extras.xml.in.h:34
-msgid "Secwepemctsin"
-msgstr "Secwepemctsin"
+#: ../rules/base.extras.xml.in.h:58
+msgid "Russian (Sun Type 6/7)"
+msgstr "Rusia (Sun Tipe 6/7)"
-#: ../rules/base.extras.xml.in.h:35
-msgid "Serbian"
-msgstr "Serbia"
+#: ../rules/base.extras.xml.in.h:61
+msgid "Armenian (OLPC phonetic)"
+msgstr "Armenia (fonetik OLPC)"
-#: ../rules/base.extras.xml.in.h:36
-msgid "Serbian (combining accents instead of dead keys)"
-msgstr "Serbia (menggabungkan aksen ketimbang tombol mati)"
+#: ../rules/base.extras.xml.in.h:64
+msgid "Hebrew (Biblical, SIL phonetic)"
+msgstr "Ibrani (Biblical, fonetik SIL)"
-#: ../rules/base.extras.xml.in.h:37
-msgid "apl"
-msgstr "apl"
+#: ../rules/base.extras.xml.in.h:67
+msgid "Arabic (Sun Type 6/7)"
+msgstr "Arab (Sun Tipe 6/7)"
-#: ../rules/base.extras.xml.in.h:44
-msgid "kut"
-msgstr "kut"
+#: ../rules/base.extras.xml.in.h:70
+msgid "Belgian (Sun Type 6/7)"
+msgstr "Belgia (Sun Tipe 6/7)"
-#: ../rules/base.extras.xml.in.h:50
-msgid "shs"
-msgstr "shs"
+#: ../rules/base.extras.xml.in.h:73
+msgid "Portuguese (Brazil, Sun Type 6/7)"
+msgstr "Portugis (Brasil, Sun Tipe 6/7)"
+
+#: ../rules/base.extras.xml.in.h:76
+msgid "Czech (Sun Type 6/7)"
+msgstr "Ceko (Sun Tipe 6/7)"
+
+#: ../rules/base.extras.xml.in.h:79
+msgid "Danish (Sun Type 6/7)"
+msgstr "Denmark (Sun Tipe 6/7)"
+
+#: ../rules/base.extras.xml.in.h:82
+msgid "Dutch (Sun Type 6/7)"
+msgstr "Belanda (Sun Tipe 6/7)"
+
+#: ../rules/base.extras.xml.in.h:85
+msgid "Estonian (Sun Type 6/7)"
+msgstr "Estonia (Sun Tipe 6/7)"
+
+#: ../rules/base.extras.xml.in.h:88
+msgid "Finnish (Sun Type 6/7)"
+msgstr "Finlandia (Sun Tipe 6/7)"
+
+#: ../rules/base.extras.xml.in.h:90
+msgid "French (Sun Type 6/7)"
+msgstr "Perancis (Sun Tipe 6/7)"
+
+#: ../rules/base.extras.xml.in.h:93
+msgid "Greek (Sun Type 6/7)"
+msgstr "Yunani (Sun Tipe 6/7)"
+
+#: ../rules/base.extras.xml.in.h:96
+msgid "Italian (Sun Type 6/7)"
+msgstr "Italia (Sun Tipe 6/7)"
+
+#: ../rules/base.extras.xml.in.h:99
+msgid "Japanese (Sun Type 6)"
+msgstr "Jepang (Sun Tipe 6)"
+
+#: ../rules/base.extras.xml.in.h:100
+msgid "Japanese (Sun Type 7 - pc compatible)"
+msgstr "Jepang (Sun Tipe 7 - kompatibel pc)"
+
+#: ../rules/base.extras.xml.in.h:101
+msgid "Japanese (Sun Type 7 - sun compatible)"
+msgstr "Jepang (Sun Tipe 7 - kompatibel sun)"
+
+#: ../rules/base.extras.xml.in.h:104
+msgid "Norwegian (Sun Type 6/7)"
+msgstr "Norwegia (Sun Tipe 6/7)"
+
+#: ../rules/base.extras.xml.in.h:106
+msgid "Portuguese (Sun Type 6/7)"
+msgstr "Portugis (Sun Tipe 6/7)"
+
+#: ../rules/base.extras.xml.in.h:109
+msgid "Slovak (Sun Type 6/7)"
+msgstr "Slowakia (Sun Tipe 6/7)"
+
+#: ../rules/base.extras.xml.in.h:112
+msgid "Spanish (Sun Type 6/7)"
+msgstr "Spanyol (Sun Tipe 6/7)"
+
+#: ../rules/base.extras.xml.in.h:115
+msgid "Swedish (Sun Type 6/7)"
+msgstr "Swedia (Sun Tipe 6/7)"
+
+#: ../rules/base.extras.xml.in.h:117
+msgid "German (Switzerland, Sun Type 6/7)"
+msgstr "Jerman (Swiss, Sun Tipe 6/7)"
+
+#: ../rules/base.extras.xml.in.h:118
+msgid "French (Switzerland, Sun Type 6/7)"
+msgstr "Perancis (Swiss, Sun Tipe 6/7)"
+
+#: ../rules/base.extras.xml.in.h:121
+msgid "Turkish (Sun Type 6/7)"
+msgstr "Turki (Sun Tipe 6/7)"
-#~ msgid "German (qwerty)"
-#~ msgstr "Jerman (qwerty)"
+#: ../rules/base.extras.xml.in.h:124
+msgid "Ukrainian (Sun Type 6/7)"
+msgstr "Ukraina (Sun Tipe 6/7)"
-#~ msgid "Japanese (Dvorak)"
-#~ msgstr "Jepang (Dvorak)"
+#: ../rules/base.extras.xml.in.h:126
+msgid "English (UK, Sun Type 6/7)"
+msgstr "Inggris (UK, Sun Tipe 6/7)"
-#~ msgid "Allow breaking grabs with keyboard actions (warning: security risk)"
-#~ msgstr "Ijinkan memecah genggaman dengan aksi papan tik (peringatan: resiko keamanan)"
+#: ../rules/base.extras.xml.in.h:129
+msgid "Korean (Sun Type 6/7)"
+msgstr "Korea (Sun Type 6/7)"
-#~ msgid "Hebrew (Biblical SIL)"
-#~ msgstr "Ibrani (SIL Biblical)"
+#~ msgid "Bengali"
+#~ msgstr "Bengali"
-#~ msgid "Biblical SIL phonetic"
-#~ msgstr "Fonetik SIL Biblical"
+#~ msgid "Portuguese (Brazil, nativo for Esperanto)"
+#~ msgstr "Portugis (Brasil, nativo untuk Esperanto)"
diff --git a/xorg-server/xkeyboard-config/po/nl.po b/xorg-server/xkeyboard-config/po/nl.po
index b85b6e609..61ee5012f 100644
--- a/xorg-server/xkeyboard-config/po/nl.po
+++ b/xorg-server/xkeyboard-config/po/nl.po
@@ -1,12 +1,13 @@
# Dutch translations for xkeyboard-config.
-# Copyright (C) 2013 Free Software Foundation, Inc.
+# Copyright (C) 2014 Free Software Foundation, Inc.
# This file is distributed under the same license as the xkeyboard-config package.
#
-# Three trains, two busses, one good shake.
+# “There's a big gang of penguins closing in,
+# with a mean look in their eyes...”
#
# Taco Witte <tcwitte@cs.uu.nl>, 2003, 2004, 2005, 2006.
# Tino Meinen <tino.meinen@gmail.com>, 2007, 2008, 2009, 2011, 2012.
-# Benno Schulenberg <benno@vertaalt.nl>, 2013.
+# Benno Schulenberg <benno@vertaalt.nl>, 2013, 2014.
# ------------------------------------------------------------------------------
# *** Vocabulair ***
# Caps Lock - CapsLock (vergrendelt Shift alleen voor lettertoetsen)
@@ -31,10 +32,10 @@
# ------------------------------------------------------------------------------
msgid ""
msgstr ""
-"Project-Id-Version: xkeyboard-config-2.9.91\n"
+"Project-Id-Version: xkeyboard-config-2.10.99\n"
"Report-Msgid-Bugs-To: svu@users.sourceforge.net\n"
-"POT-Creation-Date: 2013-09-14 14:41+0200\n"
-"PO-Revision-Date: 2013-09-15 09:44+0200\n"
+"POT-Creation-Date: 2014-01-15 01:12+0000\n"
+"PO-Revision-Date: 2014-01-15 14:15+0100\n"
"Last-Translator: Benno Schulenberg <benno@vertaalt.nl>\n"
"Language-Team: Dutch <vertaling@vrijschrift.org>\n"
"Language: nl\n"
@@ -845,7 +846,7 @@ msgid "English (programmer Dvorak)"
msgstr "Engels (programmeer-Dvorak)"
#. Keyboard indicator for Russian layouts
-#: ../rules/base.xml.in.h:203 ../rules/base.extras.xml.in.h:54
+#: ../rules/base.xml.in.h:203 ../rules/base.extras.xml.in.h:55
msgid "ru"
msgstr "ru"
@@ -869,6 +870,7 @@ msgstr "Engels (de delen-/vermenigvuldigen-toetsen schakelen de indeling)"
msgid "Serbo-Croatian (US)"
msgstr "Servo-Kroatisch (US)"
+# "Workman" is een toetsenbordindeling.
#: ../rules/base.xml.in.h:209
msgid "English (Workman)"
msgstr "Engels (Workman)"
@@ -917,11 +919,11 @@ msgid "Uzbek (Afghanistan, OLPC)"
msgstr "Oezbeeks (Afghanistan, OLPC)"
#. Keyboard indicator for Arabic layouts
-#: ../rules/base.xml.in.h:224 ../rules/base.extras.xml.in.h:64
+#: ../rules/base.xml.in.h:224 ../rules/base.extras.xml.in.h:65
msgid "ar"
msgstr "ar"
-#: ../rules/base.xml.in.h:225 ../rules/base.extras.xml.in.h:65
+#: ../rules/base.xml.in.h:225 ../rules/base.extras.xml.in.h:66
msgid "Arabic"
msgstr "Arabisch"
@@ -959,11 +961,11 @@ msgid "Albanian"
msgstr "Albanees"
#. Keyboard indicator for Armenian layouts
-#: ../rules/base.xml.in.h:236 ../rules/base.extras.xml.in.h:58
+#: ../rules/base.xml.in.h:236 ../rules/base.extras.xml.in.h:59
msgid "hy"
msgstr "hy"
-#: ../rules/base.xml.in.h:237 ../rules/base.extras.xml.in.h:59
+#: ../rules/base.xml.in.h:237 ../rules/base.extras.xml.in.h:60
msgid "Armenian"
msgstr "Armeens"
@@ -1039,11 +1041,11 @@ msgid "Belarusian (Latin)"
msgstr "Wit-Russisch (Latijns)"
#. Keyboard indicator for Belgian layouts
-#: ../rules/base.xml.in.h:259 ../rules/base.extras.xml.in.h:67
+#: ../rules/base.xml.in.h:259 ../rules/base.extras.xml.in.h:68
msgid "be"
msgstr "be"
-#: ../rules/base.xml.in.h:260 ../rules/base.extras.xml.in.h:68
+#: ../rules/base.xml.in.h:260 ../rules/base.extras.xml.in.h:69
msgid "Belgian"
msgstr "Belgisch"
@@ -1075,17 +1077,17 @@ msgstr "Belgisch (Sun dode toetsen)"
msgid "Belgian (Wang model 724 azerty)"
msgstr "Belgisch (Wang model 724 azerty)"
-#. Keyboard indicator for Bengali layouts
+#. Keyboard indicator for Bangla layouts
#: ../rules/base.xml.in.h:269
msgid "bn"
msgstr "bn"
#: ../rules/base.xml.in.h:270
-msgid "Bengali"
+msgid "Bangla"
msgstr "Bengaals"
#: ../rules/base.xml.in.h:271
-msgid "Bengali (Probhat)"
+msgid "Bangla (Probhat)"
msgstr "Bengaals (Probhat)"
#. Keyboard indicator for Indian layouts
@@ -1098,27 +1100,28 @@ msgid "Indian"
msgstr "Indisch"
#: ../rules/base.xml.in.h:275
-msgid "Bengali (India)"
+msgid "Bangla (India)"
msgstr "Bengaals (India)"
#: ../rules/base.xml.in.h:276
-msgid "Bengali (India, Probhat)"
+msgid "Bangla (India, Probhat)"
msgstr "Bengaals (India, Probhat)"
#: ../rules/base.xml.in.h:277
-msgid "Bengali (India, Baishakhi)"
+msgid "Bangla (India, Baishakhi)"
msgstr "Bengaals (India, Baishakhi)"
#: ../rules/base.xml.in.h:278
-msgid "Bengali (India, Bornona)"
+msgid "Bangla (India, Bornona)"
msgstr "Bengaals (India, Bornona)"
#: ../rules/base.xml.in.h:279
-msgid "Bengali (India, Uni Gitanjali)"
+msgid "Bangla (India, Uni Gitanjali)"
msgstr "Bengaals (India, Uni Gitanjali)"
+# "Baishakhi Inscript" is een toetsenbordindeling.
#: ../rules/base.xml.in.h:280
-msgid "Bengali (India, Baishakhi Inscript)"
+msgid "Bangla (India, Baishakhi Inscript)"
msgstr "Bengaals (India, Baishakhi Inscript)"
#. Keyboard indicator for Gujarati layouts
@@ -1307,11 +1310,11 @@ msgid "Bosnian (US keyboard with Bosnian letters)"
msgstr "Bosnisch (US-toetsenbord met Bosnische lettertekens)"
#. Keyboard indicator for Portuguese layouts
-#: ../rules/base.xml.in.h:336 ../rules/base.extras.xml.in.h:70
+#: ../rules/base.xml.in.h:336 ../rules/base.extras.xml.in.h:71
msgid "pt"
msgstr "pt"
-#: ../rules/base.xml.in.h:337 ../rules/base.extras.xml.in.h:71
+#: ../rules/base.xml.in.h:337 ../rules/base.extras.xml.in.h:72
msgid "Portuguese (Brazil)"
msgstr "Portugees (Brazilië)"
@@ -1323,17 +1326,18 @@ msgstr "Portugees (Brazilië, zonder dode toetsen)"
msgid "Portuguese (Brazil, Dvorak)"
msgstr "Portugees (Brazilië, Dvorak)"
+# Nativo is een soort indeling, net als Dvorak en Colemak.
#: ../rules/base.xml.in.h:340
-msgid "Portuguese (Brazil, nativo)"
+msgid "Portuguese (Brazil, Nativo)"
msgstr "Portugees (Brazilië, Nativo)"
#: ../rules/base.xml.in.h:341
-msgid "Portuguese (Brazil, nativo for US keyboards)"
+msgid "Portuguese (Brazil, Nativo for US keyboards)"
msgstr "Portugees (Brazilië, Nativo voor US-toetsenborden)"
#: ../rules/base.xml.in.h:342
-msgid "Portuguese (Brazil, nativo for Esperanto)"
-msgstr "Portugees (Brazilië, Nativo voor Esperanto)"
+msgid "Esperanto (Brazil, Nativo)"
+msgstr "Esperanto (Brazilië, Nativo)"
#. Keyboard indicator for Bulgarian layouts
#: ../rules/base.xml.in.h:344
@@ -1487,364 +1491,368 @@ msgid "Tibetan (with ASCII numerals)"
msgstr "Tibetaans (met ASCII-cijfers)"
#: ../rules/base.xml.in.h:386
+msgid "ug"
+msgstr "ug"
+
+#: ../rules/base.xml.in.h:387
msgid "Uyghur"
msgstr "Oeigoers"
#. Keyboard indicator for Croatian layouts
-#: ../rules/base.xml.in.h:388
+#: ../rules/base.xml.in.h:389
msgid "hr"
msgstr "hr"
-#: ../rules/base.xml.in.h:389
+#: ../rules/base.xml.in.h:390
msgid "Croatian"
msgstr "Kroatisch"
# Guillemets of ook quillemets zijn Franse aanhalingstekens.
# Dit is de "Nederlandse" en dit is de «Franse manier» van aanhalen.
-#: ../rules/base.xml.in.h:390
+#: ../rules/base.xml.in.h:391
msgid "Croatian (use guillemets for quotes)"
msgstr "Kroatisch (met Franse aanhalingstekens)"
-#: ../rules/base.xml.in.h:391
+#: ../rules/base.xml.in.h:392
msgid "Croatian (use Croatian digraphs)"
msgstr "Kroatisch (met Kroatische digrafen)"
-#: ../rules/base.xml.in.h:392
+#: ../rules/base.xml.in.h:393
msgid "Croatian (US keyboard with Croatian digraphs)"
msgstr "Kroatisch (US-toetsenbord met Kroatische digrafen)"
-#: ../rules/base.xml.in.h:393
+#: ../rules/base.xml.in.h:394
msgid "Croatian (US keyboard with Croatian letters)"
msgstr "Kroatisch (US-toetsenbord met Kroatische lettertekens)"
#. Keyboard indicator for Chech layouts
-#: ../rules/base.xml.in.h:395 ../rules/base.extras.xml.in.h:73
+#: ../rules/base.xml.in.h:396 ../rules/base.extras.xml.in.h:74
msgid "cs"
msgstr "cs"
-#: ../rules/base.xml.in.h:396 ../rules/base.extras.xml.in.h:74
+#: ../rules/base.xml.in.h:397 ../rules/base.extras.xml.in.h:75
msgid "Czech"
msgstr "Tsjechisch"
-#: ../rules/base.xml.in.h:397
+#: ../rules/base.xml.in.h:398
msgid "Czech (with &lt;\\|&gt; key)"
msgstr "Tsjechisch (met &lt;\\|&gt;-toets)"
-#: ../rules/base.xml.in.h:398
+#: ../rules/base.xml.in.h:399
msgid "Czech (qwerty)"
msgstr "Tsjechisch (qwerty)"
# XXX brede backslash/uitgebreide backslash -- wat is dit?
-#: ../rules/base.xml.in.h:399
+#: ../rules/base.xml.in.h:400
msgid "Czech (qwerty, extended Backslash)"
msgstr "Tsjechisch (qwerty, brede backslash-toets)"
-#: ../rules/base.xml.in.h:400
+#: ../rules/base.xml.in.h:401
msgid "Czech (UCW layout, accented letters only)"
msgstr "Tsjechisch (UCW-indeling, alleen lettertekens met accenten)"
# XXX CZ?
-#: ../rules/base.xml.in.h:401
+#: ../rules/base.xml.in.h:402
msgid "Czech (US Dvorak with CZ UCW support)"
msgstr "Tsjechisch (US Dvorak met Tsjechische UCW-ondersteuning)"
#. Keyboard indicator for Danish layouts
-#: ../rules/base.xml.in.h:403 ../rules/base.extras.xml.in.h:76
+#: ../rules/base.xml.in.h:404 ../rules/base.extras.xml.in.h:77
msgid "da"
msgstr "da"
-#: ../rules/base.xml.in.h:404 ../rules/base.extras.xml.in.h:77
+#: ../rules/base.xml.in.h:405 ../rules/base.extras.xml.in.h:78
msgid "Danish"
msgstr "Deens"
-#: ../rules/base.xml.in.h:405
+#: ../rules/base.xml.in.h:406
msgid "Danish (eliminate dead keys)"
msgstr "Deens (zonder dode toetsen)"
-#: ../rules/base.xml.in.h:406
+#: ../rules/base.xml.in.h:407
msgid "Danish (Macintosh)"
msgstr "Deens (Macintosh)"
-#: ../rules/base.xml.in.h:407
+#: ../rules/base.xml.in.h:408
msgid "Danish (Macintosh, eliminate dead keys)"
msgstr "Deens (Macintosh, zonder dode toetsen)"
-#: ../rules/base.xml.in.h:408
+#: ../rules/base.xml.in.h:409
msgid "Danish (Dvorak)"
msgstr "Deens (Dvorak)"
#. Keyboard indicator for Dutch layouts
-#: ../rules/base.xml.in.h:410 ../rules/base.extras.xml.in.h:79
+#: ../rules/base.xml.in.h:411 ../rules/base.extras.xml.in.h:80
msgid "nl"
msgstr "nl"
-#: ../rules/base.xml.in.h:411 ../rules/base.extras.xml.in.h:80
+#: ../rules/base.xml.in.h:412 ../rules/base.extras.xml.in.h:81
msgid "Dutch"
msgstr "Nederlands"
-#: ../rules/base.xml.in.h:412
+#: ../rules/base.xml.in.h:413
msgid "Dutch (Sun dead keys)"
msgstr "Nederlands (Sun dode toetsen)"
-#: ../rules/base.xml.in.h:413
+#: ../rules/base.xml.in.h:414
msgid "Dutch (Macintosh)"
msgstr "Nederlands (Macintosh)"
-#: ../rules/base.xml.in.h:414
+#: ../rules/base.xml.in.h:415
msgid "Dutch (standard)"
msgstr "Nederlands (standaard)"
#. Keyboard indicator for Dzongkha layouts
-#: ../rules/base.xml.in.h:416
+#: ../rules/base.xml.in.h:417
msgid "dz"
msgstr "dz"
# Dzongkha is een taal die is afgeleid van het oud-Tibetaans.
-#: ../rules/base.xml.in.h:417
+#: ../rules/base.xml.in.h:418
msgid "Dzongkha"
msgstr "Dzongkha"
#. Keyboard indicator for Estonian layouts
-#: ../rules/base.xml.in.h:419 ../rules/base.extras.xml.in.h:82
+#: ../rules/base.xml.in.h:420 ../rules/base.extras.xml.in.h:83
msgid "et"
msgstr "et"
# Estisch, de taal die ook Estlands of Ests wordt genoemd,
# heeft ongeveer 1 miljoen sprekers.
-#: ../rules/base.xml.in.h:420 ../rules/base.extras.xml.in.h:83
+#: ../rules/base.xml.in.h:421 ../rules/base.extras.xml.in.h:84
msgid "Estonian"
msgstr "Estisch"
-#: ../rules/base.xml.in.h:421
+#: ../rules/base.xml.in.h:422
msgid "Estonian (eliminate dead keys)"
msgstr "Estisch (zonder dode toetsen)"
-#: ../rules/base.xml.in.h:422
+#: ../rules/base.xml.in.h:423
msgid "Estonian (Dvorak)"
msgstr "Estisch (Dvorak)"
-#: ../rules/base.xml.in.h:423
+#: ../rules/base.xml.in.h:424
msgid "Estonian (US keyboard with Estonian letters)"
msgstr "Estisch (US-toetsenbord met Estische lettertekens)"
-#: ../rules/base.xml.in.h:424 ../rules/base.extras.xml.in.h:16
+#: ../rules/base.xml.in.h:425 ../rules/base.extras.xml.in.h:16
msgid "Persian"
msgstr "Persisch"
-#: ../rules/base.xml.in.h:425
+#: ../rules/base.xml.in.h:426
msgid "Persian (with Persian Keypad)"
msgstr "Persisch (met Persisch cijferblok)"
#. Keyboard indicator for Kurdish layouts
-#: ../rules/base.xml.in.h:427
+#: ../rules/base.xml.in.h:428
msgid "ku"
msgstr "ku"
-#: ../rules/base.xml.in.h:428
+#: ../rules/base.xml.in.h:429
msgid "Kurdish (Iran, Latin Q)"
msgstr "Koerdisch (Iran, Latijns Q)"
-#: ../rules/base.xml.in.h:429
+#: ../rules/base.xml.in.h:430
msgid "Kurdish (Iran, F)"
msgstr "Koerdisch (Iran, F)"
-#: ../rules/base.xml.in.h:430
+#: ../rules/base.xml.in.h:431
msgid "Kurdish (Iran, Latin Alt-Q)"
msgstr "Koerdisch (Iran, Latijns Alt-Q)"
-#: ../rules/base.xml.in.h:431
+#: ../rules/base.xml.in.h:432
msgid "Kurdish (Iran, Arabic-Latin)"
msgstr "Koerdisch (Iran, Arabisch-Latijns)"
-#: ../rules/base.xml.in.h:432
+#: ../rules/base.xml.in.h:433
msgid "Iraqi"
msgstr "Irakees"
-#: ../rules/base.xml.in.h:433
+#: ../rules/base.xml.in.h:434
msgid "Kurdish (Iraq, Latin Q)"
msgstr "Koerdisch (Irak, Latijns Q)"
-#: ../rules/base.xml.in.h:434
+#: ../rules/base.xml.in.h:435
msgid "Kurdish (Iraq, F)"
msgstr "Koerdisch (Irak, F)"
-#: ../rules/base.xml.in.h:435
+#: ../rules/base.xml.in.h:436
msgid "Kurdish (Iraq, Latin Alt-Q)"
msgstr "Koerdisch (Irak, Latijns Alt-Q)"
-#: ../rules/base.xml.in.h:436
+#: ../rules/base.xml.in.h:437
msgid "Kurdish (Iraq, Arabic-Latin)"
msgstr "Koerdisch (Irak, Arabisch-Latijns)"
#. Keyboard indicator for Faroese layouts
-#: ../rules/base.xml.in.h:438
+#: ../rules/base.xml.in.h:439
msgid "fo"
msgstr "fo"
-#: ../rules/base.xml.in.h:439
+#: ../rules/base.xml.in.h:440
msgid "Faroese"
msgstr "Faeröers"
-#: ../rules/base.xml.in.h:440
+#: ../rules/base.xml.in.h:441
msgid "Faroese (eliminate dead keys)"
msgstr "Faeröers (zonder dode toetsen)"
#. Keyboard indicator for Finnish layouts
-#: ../rules/base.xml.in.h:442 ../rules/base.extras.xml.in.h:85
+#: ../rules/base.xml.in.h:443 ../rules/base.extras.xml.in.h:86
msgid "fi"
msgstr "fi"
-#: ../rules/base.xml.in.h:443 ../rules/base.extras.xml.in.h:86
+#: ../rules/base.xml.in.h:444 ../rules/base.extras.xml.in.h:87
msgid "Finnish"
msgstr "Fins"
-#: ../rules/base.xml.in.h:444
+#: ../rules/base.xml.in.h:445
msgid "Finnish (classic)"
msgstr "Fins (klassiek)"
-#: ../rules/base.xml.in.h:445
+#: ../rules/base.xml.in.h:446
msgid "Finnish (classic, eliminate dead keys)"
msgstr "Fins (klassiek, zonder dode toetsen)"
-#: ../rules/base.xml.in.h:446
+#: ../rules/base.xml.in.h:447
msgid "Northern Saami (Finland)"
msgstr "Noord-Samisch (Finland)"
-#: ../rules/base.xml.in.h:447
+#: ../rules/base.xml.in.h:448
msgid "Finnish (Macintosh)"
msgstr "Fins (Macintosh)"
-#: ../rules/base.xml.in.h:448 ../rules/base.extras.xml.in.h:88
+#: ../rules/base.xml.in.h:449 ../rules/base.extras.xml.in.h:89
msgid "French"
msgstr "Frans"
-#: ../rules/base.xml.in.h:449
+#: ../rules/base.xml.in.h:450
msgid "French (eliminate dead keys)"
msgstr "Frans (zonder dode toetsen)"
-#: ../rules/base.xml.in.h:450
+#: ../rules/base.xml.in.h:451
msgid "French (Sun dead keys)"
msgstr "Frans (Sun dode toetsen)"
-#: ../rules/base.xml.in.h:451
+#: ../rules/base.xml.in.h:452
msgid "French (alternative)"
msgstr "Frans (alternatief)"
-#: ../rules/base.xml.in.h:452
+#: ../rules/base.xml.in.h:453
msgid "French (alternative, Latin-9 only)"
msgstr "Frans (alternatief, enkel Latin-9)"
-#: ../rules/base.xml.in.h:453
+#: ../rules/base.xml.in.h:454
msgid "French (alternative, eliminate dead keys)"
msgstr "Frans (alternatief, zonder dode toetsen)"
-#: ../rules/base.xml.in.h:454
+#: ../rules/base.xml.in.h:455
msgid "French (alternative, Sun dead keys)"
msgstr "Frans (alternatief, Sun dode toetsen)"
-#: ../rules/base.xml.in.h:455
+#: ../rules/base.xml.in.h:456
msgid "French (legacy, alternative)"
msgstr "Frans (historisch, alternatief)"
-#: ../rules/base.xml.in.h:456
+#: ../rules/base.xml.in.h:457
msgid "French (legacy, alternative, eliminate dead keys)"
msgstr "Frans (historisch, alternatief, zonder dode toetsen)"
-#: ../rules/base.xml.in.h:457
+#: ../rules/base.xml.in.h:458
msgid "French (legacy, alternative, Sun dead keys)"
msgstr "Frans (historisch, alternatief, Sun dode toetsen)"
-#: ../rules/base.xml.in.h:458
+#: ../rules/base.xml.in.h:459
msgid "French (Bepo, ergonomic, Dvorak way)"
msgstr "Frans (Bepo, ergonomisch, op Dvorak-wijze)"
-#: ../rules/base.xml.in.h:459
+#: ../rules/base.xml.in.h:460
msgid "French (Bepo, ergonomic, Dvorak way, Latin-9 only)"
msgstr "Frans (Bepo, ergonomisch, Dvorak-wijze, enkel Latin-9)"
-#: ../rules/base.xml.in.h:460
+#: ../rules/base.xml.in.h:461
msgid "French (Dvorak)"
msgstr "Frans (Dvorak)"
-#: ../rules/base.xml.in.h:461
+#: ../rules/base.xml.in.h:462
msgid "French (Macintosh)"
msgstr "Frans (Macintosh)"
-#: ../rules/base.xml.in.h:462
+#: ../rules/base.xml.in.h:463
msgid "French (Breton)"
msgstr "Frans (Bretons)"
-#: ../rules/base.xml.in.h:463
+#: ../rules/base.xml.in.h:464
msgid "Occitan"
msgstr "Occitaans"
-#: ../rules/base.xml.in.h:464
+#: ../rules/base.xml.in.h:465
msgid "Georgian (France, AZERTY Tskapo)"
msgstr "Georgisch (Frankrijk, AZERTY Tskapo)"
-#: ../rules/base.xml.in.h:465
+#: ../rules/base.xml.in.h:466
msgid "English (Ghana)"
msgstr "Engels (Ghana)"
-#: ../rules/base.xml.in.h:466
+#: ../rules/base.xml.in.h:467
msgid "English (Ghana, multilingual)"
msgstr "Engels (Ghana, meertalig)"
#. Keyboard indicator for Akan layouts
-#: ../rules/base.xml.in.h:468
+#: ../rules/base.xml.in.h:469
msgid "ak"
msgstr "ak"
-#: ../rules/base.xml.in.h:469
+#: ../rules/base.xml.in.h:470
msgid "Akan"
msgstr "Akaans"
#. Keyboard indicator for Ewe layouts
-#: ../rules/base.xml.in.h:471
+#: ../rules/base.xml.in.h:472
msgid "ee"
msgstr "ee"
-#: ../rules/base.xml.in.h:472
+#: ../rules/base.xml.in.h:473
msgid "Ewe"
msgstr "Ewe"
#. Keyboard indicator for Fula layouts
-#: ../rules/base.xml.in.h:474
+#: ../rules/base.xml.in.h:475
msgid "ff"
msgstr "ff"
-#: ../rules/base.xml.in.h:475
+#: ../rules/base.xml.in.h:476
msgid "Fula"
msgstr "Fula"
#. Keyboard indicator for Ga layouts
-#: ../rules/base.xml.in.h:477
+#: ../rules/base.xml.in.h:478
msgid "gaa"
msgstr "gaa"
-#: ../rules/base.xml.in.h:478
+#: ../rules/base.xml.in.h:479
msgid "Ga"
msgstr "Ga"
#. Keyboard indicator for Hausa layouts
-#: ../rules/base.xml.in.h:480
+#: ../rules/base.xml.in.h:481
msgid "ha"
msgstr "ha"
-#: ../rules/base.xml.in.h:481
+#: ../rules/base.xml.in.h:482
msgid "Hausa"
msgstr "Hausa"
#. Keyboard indicator for Avatime layouts
-#: ../rules/base.xml.in.h:483
+#: ../rules/base.xml.in.h:484
msgid "avn"
msgstr "avn"
-#: ../rules/base.xml.in.h:484
+#: ../rules/base.xml.in.h:485
msgid "Avatime"
msgstr "Avatime"
-#: ../rules/base.xml.in.h:485
+#: ../rules/base.xml.in.h:486
msgid "English (Ghana, GILLBT)"
msgstr "Engels (Ghana, GILLBT)"
@@ -1852,800 +1860,800 @@ msgstr "Engels (Ghana, GILLBT)"
# de Republiek Guinee, is grondwettelijk een presidentiële republiek in
# West-Afrika, gelegen aan de Atlantische Oceaan tussen Guinee-Bissau en
# Sierra Leone. De hoofdstad is Conakry.
-#: ../rules/base.xml.in.h:486
+#: ../rules/base.xml.in.h:487
msgid "French (Guinea)"
msgstr "Frans (Guinee)"
#. Keyboard indicator for Georgian layouts
-#: ../rules/base.xml.in.h:488
+#: ../rules/base.xml.in.h:489
msgid "ka"
msgstr "ka"
-#: ../rules/base.xml.in.h:489
+#: ../rules/base.xml.in.h:490
msgid "Georgian"
msgstr "Georgisch"
-#: ../rules/base.xml.in.h:490
+#: ../rules/base.xml.in.h:491
msgid "Georgian (ergonomic)"
msgstr "Georgisch (ergonomisch)"
-#: ../rules/base.xml.in.h:491
+#: ../rules/base.xml.in.h:492
msgid "Georgian (MESS)"
msgstr "Georgisch (MESS)"
-#: ../rules/base.xml.in.h:492
+#: ../rules/base.xml.in.h:493
msgid "Russian (Georgia)"
msgstr "Russisch (Georgisch)"
# Russisch (Georgisch)
-#: ../rules/base.xml.in.h:493
+#: ../rules/base.xml.in.h:494
msgid "Ossetian (Georgia)"
msgstr "Ossetisch (Georgië)"
-#: ../rules/base.xml.in.h:494 ../rules/base.extras.xml.in.h:11
+#: ../rules/base.xml.in.h:495 ../rules/base.extras.xml.in.h:11
msgid "German"
msgstr "Duits"
# acute - aigu (bijv. á)
-#: ../rules/base.xml.in.h:495
+#: ../rules/base.xml.in.h:496
msgid "German (dead acute)"
msgstr "Duits (dode aigu)"
# grave (bijv: à)
-#: ../rules/base.xml.in.h:496
+#: ../rules/base.xml.in.h:497
msgid "German (dead grave acute)"
msgstr "Duits (dode grave en aigu)"
-#: ../rules/base.xml.in.h:497
+#: ../rules/base.xml.in.h:498
msgid "German (eliminate dead keys)"
msgstr "Duits (zonder dode toetsen)"
-#: ../rules/base.xml.in.h:498
+#: ../rules/base.xml.in.h:499
msgid "German (T3)"
msgstr "Duits (T3)"
-#: ../rules/base.xml.in.h:499
+#: ../rules/base.xml.in.h:500
msgid "Romanian (Germany)"
msgstr "Roemeens (Duitsland)"
-#: ../rules/base.xml.in.h:500
+#: ../rules/base.xml.in.h:501
msgid "Romanian (Germany, eliminate dead keys)"
msgstr "Roemeens (Duitsland, zonder dode toetsen)"
-#: ../rules/base.xml.in.h:501
+#: ../rules/base.xml.in.h:502
msgid "German (Dvorak)"
msgstr "Duits (Dvorak)"
-#: ../rules/base.xml.in.h:502
+#: ../rules/base.xml.in.h:503
msgid "German (Sun dead keys)"
msgstr "Duits (Sun dode toetsen)"
-#: ../rules/base.xml.in.h:503
+#: ../rules/base.xml.in.h:504
msgid "German (Neo 2)"
msgstr "Duits (Neo 2)"
-#: ../rules/base.xml.in.h:504
+#: ../rules/base.xml.in.h:505
msgid "German (Macintosh)"
msgstr "Duits (Macintosh)"
-#: ../rules/base.xml.in.h:505
+#: ../rules/base.xml.in.h:506
msgid "German (Macintosh, eliminate dead keys)"
msgstr "Duits (Macintosh, zonder dode toetsen)"
# Het Nedersorbisch is de noordelijke versie van de in Brandenburg
# gesproken Sorbische taal.
# http://nl.wikipedia.org/wiki/Nedersorbisch
-#: ../rules/base.xml.in.h:506
+#: ../rules/base.xml.in.h:507
msgid "Lower Sorbian"
msgstr "Nedersorbisch"
-#: ../rules/base.xml.in.h:507
+#: ../rules/base.xml.in.h:508
msgid "Lower Sorbian (qwertz)"
msgstr "Nedersorbisch (qwertz)"
-#: ../rules/base.xml.in.h:508
+#: ../rules/base.xml.in.h:509
msgid "German (qwerty)"
msgstr "Duits (qwerty)"
-#: ../rules/base.xml.in.h:509
+#: ../rules/base.xml.in.h:510
msgid "Russian (Germany, phonetic)"
msgstr "Russisch (Duitsland, fonetisch)"
-#: ../rules/base.xml.in.h:510
+#: ../rules/base.xml.in.h:511
msgid "German (legacy)"
msgstr "Duits (historisch)"
#. Keyboard indicator for Greek layouts
-#: ../rules/base.xml.in.h:512 ../rules/base.extras.xml.in.h:90
+#: ../rules/base.xml.in.h:513 ../rules/base.extras.xml.in.h:91
msgid "gr"
msgstr "gr"
-#: ../rules/base.xml.in.h:513 ../rules/base.extras.xml.in.h:91
+#: ../rules/base.xml.in.h:514 ../rules/base.extras.xml.in.h:92
msgid "Greek"
msgstr "Grieks"
-#: ../rules/base.xml.in.h:514
+#: ../rules/base.xml.in.h:515
msgid "Greek (simple)"
msgstr "Grieks (eenvoudig)"
-#: ../rules/base.xml.in.h:515
+#: ../rules/base.xml.in.h:516
msgid "Greek (extended)"
msgstr "Grieks (uitgebreid)"
-#: ../rules/base.xml.in.h:516
+#: ../rules/base.xml.in.h:517
msgid "Greek (eliminate dead keys)"
msgstr "Grieks (zonder dode toetsen)"
-#: ../rules/base.xml.in.h:517
+#: ../rules/base.xml.in.h:518
msgid "Greek (polytonic)"
msgstr "Grieks (meertonig)"
#. Keyboard indicator for Hungarian layouts
-#: ../rules/base.xml.in.h:519
+#: ../rules/base.xml.in.h:520
msgid "hu"
msgstr "hu"
-#: ../rules/base.xml.in.h:520
+#: ../rules/base.xml.in.h:521
msgid "Hungarian"
msgstr "Hongaars"
-#: ../rules/base.xml.in.h:521
+#: ../rules/base.xml.in.h:522
msgid "Hungarian (standard)"
msgstr "Hongaars (standaard)"
-#: ../rules/base.xml.in.h:522
+#: ../rules/base.xml.in.h:523
msgid "Hungarian (eliminate dead keys)"
msgstr "Hongaars (zonder dode toetsen)"
-#: ../rules/base.xml.in.h:523
+#: ../rules/base.xml.in.h:524
msgid "Hungarian (qwerty)"
msgstr "Hongaars (qwerty)"
-#: ../rules/base.xml.in.h:524
+#: ../rules/base.xml.in.h:525
msgid "Hungarian (101/qwertz/comma/dead keys)"
msgstr "Hongaars (101/qwertz/komma/dode toetsen)"
-#: ../rules/base.xml.in.h:525
+#: ../rules/base.xml.in.h:526
msgid "Hungarian (101/qwertz/comma/eliminate dead keys)"
msgstr "Hongaars (101/qwertz/komma/zonder dode toetsen)"
-#: ../rules/base.xml.in.h:526
+#: ../rules/base.xml.in.h:527
msgid "Hungarian (101/qwertz/dot/dead keys)"
msgstr "Hongaars (101/qwertz/punt/dode toetsen)"
-#: ../rules/base.xml.in.h:527
+#: ../rules/base.xml.in.h:528
msgid "Hungarian (101/qwertz/dot/eliminate dead keys)"
msgstr "Hongaars (101/qwertz/punt/zonder dode toetsen)"
-#: ../rules/base.xml.in.h:528
+#: ../rules/base.xml.in.h:529
msgid "Hungarian (101/qwerty/comma/dead keys)"
msgstr "Hongaars (101/qwerty/komma/dode toetsen)"
-#: ../rules/base.xml.in.h:529
+#: ../rules/base.xml.in.h:530
msgid "Hungarian (101/qwerty/comma/eliminate dead keys)"
msgstr "Hongaars (101/qwerty/komma/zonder dode toetsen)"
-#: ../rules/base.xml.in.h:530
+#: ../rules/base.xml.in.h:531
msgid "Hungarian (101/qwerty/dot/dead keys)"
msgstr "Hongaars (101/qwerty/punt/dode toetsen)"
-#: ../rules/base.xml.in.h:531
+#: ../rules/base.xml.in.h:532
msgid "Hungarian (101/qwerty/dot/eliminate dead keys)"
msgstr "Hongaars (101/qwerty/punt/zonder dode toetsen)"
-#: ../rules/base.xml.in.h:532
+#: ../rules/base.xml.in.h:533
msgid "Hungarian (102/qwertz/comma/dead keys)"
msgstr "Hongaars (102/qwertz/komma/dode toetsen)"
-#: ../rules/base.xml.in.h:533
+#: ../rules/base.xml.in.h:534
msgid "Hungarian (102/qwertz/comma/eliminate dead keys)"
msgstr "Hongaars (102/qwertz/komma/zonder dode toetsen)"
-#: ../rules/base.xml.in.h:534
+#: ../rules/base.xml.in.h:535
msgid "Hungarian (102/qwertz/dot/dead keys)"
msgstr "Hongaars (102/qwertz/punt/dode toetsen)"
-#: ../rules/base.xml.in.h:535
+#: ../rules/base.xml.in.h:536
msgid "Hungarian (102/qwertz/dot/eliminate dead keys)"
msgstr "Hongaars (102/qwertz/punt/zonder dode toetsen)"
-#: ../rules/base.xml.in.h:536
+#: ../rules/base.xml.in.h:537
msgid "Hungarian (102/qwerty/comma/dead keys)"
msgstr "Hongaars (102/qwerty/komma/dode toetsen)"
-#: ../rules/base.xml.in.h:537
+#: ../rules/base.xml.in.h:538
msgid "Hungarian (102/qwerty/comma/eliminate dead keys)"
msgstr "Hongaars (102/qwerty/komma/zonder dode toetsen)"
-#: ../rules/base.xml.in.h:538
+#: ../rules/base.xml.in.h:539
msgid "Hungarian (102/qwerty/dot/dead keys)"
msgstr "Hongaars (102/qwerty/punt/dode toetsen)"
-#: ../rules/base.xml.in.h:539
+#: ../rules/base.xml.in.h:540
msgid "Hungarian (102/qwerty/dot/eliminate dead keys)"
msgstr "Hongaars (102/qwerty/punt/zonder dode toetsen)"
#. Keyboard indicator for Icelandic layouts
-#: ../rules/base.xml.in.h:541
+#: ../rules/base.xml.in.h:542
msgid "is"
msgstr "is"
-#: ../rules/base.xml.in.h:542
+#: ../rules/base.xml.in.h:543
msgid "Icelandic"
msgstr "IJslands"
-#: ../rules/base.xml.in.h:543
+#: ../rules/base.xml.in.h:544
msgid "Icelandic (Sun dead keys)"
msgstr "IJslands (Sun dode toetsen)"
-#: ../rules/base.xml.in.h:544
+#: ../rules/base.xml.in.h:545
msgid "Icelandic (eliminate dead keys)"
msgstr "IJslands (zonder dode toetsen)"
-#: ../rules/base.xml.in.h:545
+#: ../rules/base.xml.in.h:546
msgid "Icelandic (Macintosh)"
msgstr "IJslands (Macintosh)"
-#: ../rules/base.xml.in.h:546
+#: ../rules/base.xml.in.h:547
msgid "Icelandic (Dvorak)"
msgstr "IJslands (Dvorak)"
#. Keyboard indicator for Hebrew layouts
-#: ../rules/base.xml.in.h:548 ../rules/base.extras.xml.in.h:61
+#: ../rules/base.xml.in.h:549 ../rules/base.extras.xml.in.h:62
msgid "he"
msgstr "he"
-#: ../rules/base.xml.in.h:549 ../rules/base.extras.xml.in.h:62
+#: ../rules/base.xml.in.h:550 ../rules/base.extras.xml.in.h:63
msgid "Hebrew"
msgstr "Hebreeuws"
-#: ../rules/base.xml.in.h:550
+#: ../rules/base.xml.in.h:551
msgid "Hebrew (lyx)"
msgstr "Hebreeuws (lyx)"
-#: ../rules/base.xml.in.h:551
+#: ../rules/base.xml.in.h:552
msgid "Hebrew (phonetic)"
msgstr "Hebreeuws (fonetisch)"
-#: ../rules/base.xml.in.h:552
+#: ../rules/base.xml.in.h:553
msgid "Hebrew (Biblical, Tiro)"
msgstr "Hebreeuws (Bijbels, Tiro)"
#. Keyboard indicator for Italian layouts
-#: ../rules/base.xml.in.h:554 ../rules/base.extras.xml.in.h:93
+#: ../rules/base.xml.in.h:555 ../rules/base.extras.xml.in.h:94
msgid "it"
msgstr "it"
-#: ../rules/base.xml.in.h:555 ../rules/base.extras.xml.in.h:94
+#: ../rules/base.xml.in.h:556 ../rules/base.extras.xml.in.h:95
msgid "Italian"
msgstr "Italiaans"
-#: ../rules/base.xml.in.h:556
+#: ../rules/base.xml.in.h:557
msgid "Italian (eliminate dead keys)"
msgstr "Italiaans (zonder dode toetsen)"
-#: ../rules/base.xml.in.h:557
+#: ../rules/base.xml.in.h:558
msgid "Italian (Macintosh)"
msgstr "Italiaans (Macintosh)"
-#: ../rules/base.xml.in.h:558
+#: ../rules/base.xml.in.h:559
msgid "Italian (US keyboard with Italian letters)"
msgstr "Italiaans (US-toetsenbord met Italiaanse lettertekens)"
-#: ../rules/base.xml.in.h:559
+#: ../rules/base.xml.in.h:560
msgid "Georgian (Italy)"
msgstr "Georgisch (Italië)"
-#: ../rules/base.xml.in.h:560
+#: ../rules/base.xml.in.h:561
msgid "Italian (IBM 142)"
msgstr "Italiaans (IBM 142)"
#. Keyboard indicator for Japanese layouts
-#: ../rules/base.xml.in.h:562 ../rules/base.extras.xml.in.h:96
+#: ../rules/base.xml.in.h:563 ../rules/base.extras.xml.in.h:97
msgid "ja"
msgstr "ja"
-#: ../rules/base.xml.in.h:563 ../rules/base.extras.xml.in.h:97
+#: ../rules/base.xml.in.h:564 ../rules/base.extras.xml.in.h:98
msgid "Japanese"
msgstr "Japans"
-#: ../rules/base.xml.in.h:564
+#: ../rules/base.xml.in.h:565
msgid "Japanese (Kana)"
msgstr "Japans (Kana)"
-#: ../rules/base.xml.in.h:565
+#: ../rules/base.xml.in.h:566
msgid "Japanese (Kana 86)"
msgstr "Japans (Kana 86)"
-#: ../rules/base.xml.in.h:566
+#: ../rules/base.xml.in.h:567
msgid "Japanese (OADG 109A)"
msgstr "Japans (OADG 109A)"
-#: ../rules/base.xml.in.h:567
+#: ../rules/base.xml.in.h:568
msgid "Japanese (Macintosh)"
msgstr "Japans (Macintosh)"
-#: ../rules/base.xml.in.h:568
+#: ../rules/base.xml.in.h:569
msgid "Japanese (Dvorak)"
msgstr "Japans (Dvorak)"
#. Keyboard indicator for Kikuyu layouts
-#: ../rules/base.xml.in.h:570
+#: ../rules/base.xml.in.h:571
msgid "ki"
msgstr "ki"
-#: ../rules/base.xml.in.h:571
+#: ../rules/base.xml.in.h:572
msgid "Kyrgyz"
msgstr "Kirgizisch"
-#: ../rules/base.xml.in.h:572
+#: ../rules/base.xml.in.h:573
msgid "Kyrgyz (phonetic)"
msgstr "Kirgizisch (fonetisch)"
#. Keyboard indicator for Khmer layouts
-#: ../rules/base.xml.in.h:574
+#: ../rules/base.xml.in.h:575
msgid "km"
msgstr "km"
-#: ../rules/base.xml.in.h:575
+#: ../rules/base.xml.in.h:576
msgid "Khmer (Cambodia)"
msgstr "Khmer (Cambodja)"
#. Keyboard indicator for Kazakh layouts
-#: ../rules/base.xml.in.h:577
+#: ../rules/base.xml.in.h:578
msgid "kk"
msgstr "kk"
-#: ../rules/base.xml.in.h:578
+#: ../rules/base.xml.in.h:579
msgid "Kazakh"
msgstr "Kazachstaans"
-#: ../rules/base.xml.in.h:579
+#: ../rules/base.xml.in.h:580
msgid "Russian (Kazakhstan, with Kazakh)"
msgstr "Russisch (Kazachstans, met Kazachstaans)"
-#: ../rules/base.xml.in.h:580
+#: ../rules/base.xml.in.h:581
msgid "Kazakh (with Russian)"
msgstr "Kazachstaans (met Russisch)"
#. Keyboard indicator for Lao layouts
-#: ../rules/base.xml.in.h:582
+#: ../rules/base.xml.in.h:583
msgid "lo"
msgstr "lo"
-#: ../rules/base.xml.in.h:583
+#: ../rules/base.xml.in.h:584
msgid "Lao"
msgstr "Lao"
-#: ../rules/base.xml.in.h:584
+#: ../rules/base.xml.in.h:585
msgid "Lao (STEA proposed standard layout)"
msgstr "Lao (STEA voorgestelde standaard indeling)"
#. Keyboard indicator for Spanish layouts
-#: ../rules/base.xml.in.h:586 ../rules/base.extras.xml.in.h:109
+#: ../rules/base.xml.in.h:587 ../rules/base.extras.xml.in.h:110
msgid "es"
msgstr "es"
-#: ../rules/base.xml.in.h:587
+#: ../rules/base.xml.in.h:588
msgid "Spanish (Latin American)"
msgstr "Spaans (Latijns-Amerika)"
-#: ../rules/base.xml.in.h:588
+#: ../rules/base.xml.in.h:589
msgid "Spanish (Latin American, eliminate dead keys)"
msgstr "Spaans (Latijns-Amerika, zonder dode toetsen)"
-#: ../rules/base.xml.in.h:589
+#: ../rules/base.xml.in.h:590
msgid "Spanish (Latin American, include dead tilde)"
msgstr "Spaans (Latijns-Amerika, met dode tilde)"
-#: ../rules/base.xml.in.h:590
+#: ../rules/base.xml.in.h:591
msgid "Spanish (Latin American, Sun dead keys)"
msgstr "Spaans (Latijns-Amerika, Sun dode toetsen)"
#. Keyboard indicator for Lithuanian layouts
-#: ../rules/base.xml.in.h:592 ../rules/base.extras.xml.in.h:18
+#: ../rules/base.xml.in.h:593 ../rules/base.extras.xml.in.h:18
msgid "lt"
msgstr "lt"
-#: ../rules/base.xml.in.h:593 ../rules/base.extras.xml.in.h:19
+#: ../rules/base.xml.in.h:594 ../rules/base.extras.xml.in.h:19
msgid "Lithuanian"
msgstr "Litouws"
-#: ../rules/base.xml.in.h:594
+#: ../rules/base.xml.in.h:595
msgid "Lithuanian (standard)"
msgstr "Litouws (standaard)"
-#: ../rules/base.xml.in.h:595
+#: ../rules/base.xml.in.h:596
msgid "Lithuanian (US keyboard with Lithuanian letters)"
msgstr "Litouws (US-toetsenbord met Litouwse lettertekens)"
-#: ../rules/base.xml.in.h:596
+#: ../rules/base.xml.in.h:597
msgid "Lithuanian (IBM LST 1205-92)"
msgstr "Litouws (IBM LST 1205-92)"
-#: ../rules/base.xml.in.h:597
+#: ../rules/base.xml.in.h:598
msgid "Lithuanian (LEKP)"
msgstr "Litouws (LEKP)"
-#: ../rules/base.xml.in.h:598
+#: ../rules/base.xml.in.h:599
msgid "Lithuanian (LEKPa)"
msgstr "Litouws (LEKPa)"
#. Keyboard indicator for Latvian layouts
-#: ../rules/base.xml.in.h:600 ../rules/base.extras.xml.in.h:22
+#: ../rules/base.xml.in.h:601 ../rules/base.extras.xml.in.h:22
msgid "lv"
msgstr "lv"
-#: ../rules/base.xml.in.h:601 ../rules/base.extras.xml.in.h:23
+#: ../rules/base.xml.in.h:602 ../rules/base.extras.xml.in.h:23
msgid "Latvian"
msgstr "Lets"
-#: ../rules/base.xml.in.h:602
+#: ../rules/base.xml.in.h:603
msgid "Latvian (apostrophe variant)"
msgstr "Lets (apostrof-variant)"
-#: ../rules/base.xml.in.h:603
+#: ../rules/base.xml.in.h:604
msgid "Latvian (tilde variant)"
msgstr "Lets (tilde-variant)"
-#: ../rules/base.xml.in.h:604
+#: ../rules/base.xml.in.h:605
msgid "Latvian (F variant)"
msgstr "Lets (F-variant)"
-#: ../rules/base.xml.in.h:605
+#: ../rules/base.xml.in.h:606
msgid "Latvian (modern)"
msgstr "Lets (modern)"
-#: ../rules/base.xml.in.h:606
+#: ../rules/base.xml.in.h:607
msgid "Latvian (ergonomic, ŪGJRMV)"
msgstr "Lets (ergonomisch, ŪGJRMV)"
-#: ../rules/base.xml.in.h:607
+#: ../rules/base.xml.in.h:608
msgid "Latvian (adapted)"
msgstr "Lets (aangepast)"
#. Keyboard indicator for Maori layouts
-#: ../rules/base.xml.in.h:609
+#: ../rules/base.xml.in.h:610
msgid "mi"
msgstr "mi"
-#: ../rules/base.xml.in.h:610
+#: ../rules/base.xml.in.h:611
msgid "Maori"
msgstr "Maori"
#. Keyboard indicator for Serbian layouts
-#: ../rules/base.xml.in.h:612 ../rules/base.extras.xml.in.h:51
+#: ../rules/base.xml.in.h:613 ../rules/base.extras.xml.in.h:52
msgid "sr"
msgstr "sr"
# Montenegrijns is het Servo-Kroatische (Štokavische) dialect
# dat in Montenegro wordt gesproken.
-#: ../rules/base.xml.in.h:613
+#: ../rules/base.xml.in.h:614
msgid "Montenegrin"
msgstr "Montenegrijns"
-#: ../rules/base.xml.in.h:614
+#: ../rules/base.xml.in.h:615
msgid "Montenegrin (Cyrillic)"
msgstr "Montenegrijns (Cyrillisch)"
# verwisseld/gewisseld/omgewisseld
-#: ../rules/base.xml.in.h:615
+#: ../rules/base.xml.in.h:616
msgid "Montenegrin (Cyrillic, Z and ZHE swapped)"
msgstr "Montenegrijns (Cyrillisch, Z en ZHE omgewisseld)"
-#: ../rules/base.xml.in.h:616
+#: ../rules/base.xml.in.h:617
msgid "Montenegrin (Latin Unicode)"
msgstr "Montenegrijns (Latijns Unicode)"
-#: ../rules/base.xml.in.h:617
+#: ../rules/base.xml.in.h:618
msgid "Montenegrin (Latin qwerty)"
msgstr "Montenegrijns (Latijns qwerty)"
-#: ../rules/base.xml.in.h:618
+#: ../rules/base.xml.in.h:619
msgid "Montenegrin (Latin Unicode qwerty)"
msgstr "Montenegrijns (Latijns Unicode qwerty)"
# Guillemets (of ook quillemets) zijn Franse aanhalingstekens.
# Voorbeeld: "Nederlandse" en «Franse manier» van aanhalen.
-#: ../rules/base.xml.in.h:619
+#: ../rules/base.xml.in.h:620
msgid "Montenegrin (Cyrillic with guillemets)"
msgstr "Montenegrijns (Cyrillisch met Franse aanhalingstekens)"
-#: ../rules/base.xml.in.h:620
+#: ../rules/base.xml.in.h:621
msgid "Montenegrin (Latin with guillemets)"
msgstr "Montenegrijns (Latijns met Franse aanhalingstekens)"
#. Keyboard indicator for Macedonian layouts
-#: ../rules/base.xml.in.h:622
+#: ../rules/base.xml.in.h:623
msgid "mk"
msgstr "mk"
-#: ../rules/base.xml.in.h:623
+#: ../rules/base.xml.in.h:624
msgid "Macedonian"
msgstr "Macedonisch"
-#: ../rules/base.xml.in.h:624
+#: ../rules/base.xml.in.h:625
msgid "Macedonian (eliminate dead keys)"
msgstr "Macedonisch (zonder dode toetsen)"
#. Keyboard indicator for Maltese layouts
-#: ../rules/base.xml.in.h:626
+#: ../rules/base.xml.in.h:627
msgid "mt"
msgstr "mt"
-#: ../rules/base.xml.in.h:627
+#: ../rules/base.xml.in.h:628
msgid "Maltese"
msgstr "Maltees"
-#: ../rules/base.xml.in.h:628
+#: ../rules/base.xml.in.h:629
msgid "Maltese (with US layout)"
msgstr "Maltees (met US-indeling)"
#. Keyboard indicator for Mongolian layouts
-#: ../rules/base.xml.in.h:630
+#: ../rules/base.xml.in.h:631
msgid "mn"
msgstr "mn"
-#: ../rules/base.xml.in.h:631
+#: ../rules/base.xml.in.h:632
msgid "Mongolian"
msgstr "Mongools"
#. Keyboard indicator for Norwegian layouts
-#: ../rules/base.xml.in.h:633 ../rules/base.extras.xml.in.h:101
+#: ../rules/base.xml.in.h:634 ../rules/base.extras.xml.in.h:102
msgid "no"
msgstr "no"
-#: ../rules/base.xml.in.h:634 ../rules/base.extras.xml.in.h:102
+#: ../rules/base.xml.in.h:635 ../rules/base.extras.xml.in.h:103
msgid "Norwegian"
msgstr "Noors"
-#: ../rules/base.xml.in.h:635
+#: ../rules/base.xml.in.h:636
msgid "Norwegian (eliminate dead keys)"
msgstr "Noors (zonder dode toetsen)"
-#: ../rules/base.xml.in.h:636
+#: ../rules/base.xml.in.h:637
msgid "Norwegian (Dvorak)"
msgstr "Noors (Dvorak)"
-#: ../rules/base.xml.in.h:637
+#: ../rules/base.xml.in.h:638
msgid "Northern Saami (Norway)"
msgstr "Noord-Samisch (Noorwegen)"
-#: ../rules/base.xml.in.h:638
+#: ../rules/base.xml.in.h:639
msgid "Northern Saami (Norway, eliminate dead keys)"
msgstr "Noord-Samisch (Noorwegen, zonder dode toetsen)"
-#: ../rules/base.xml.in.h:639
+#: ../rules/base.xml.in.h:640
msgid "Norwegian (Macintosh)"
msgstr "Noors (Macintosh)"
-#: ../rules/base.xml.in.h:640
+#: ../rules/base.xml.in.h:641
msgid "Norwegian (Macintosh, eliminate dead keys)"
msgstr "Noors (Macintosh, zonder dode toetsen)"
-#: ../rules/base.xml.in.h:641
+#: ../rules/base.xml.in.h:642
msgid "Norwegian (Colemak)"
msgstr "Noors (Colemak)"
#. Keyboard indicator for Polish layouts
-#: ../rules/base.xml.in.h:643 ../rules/base.extras.xml.in.h:40
+#: ../rules/base.xml.in.h:644 ../rules/base.extras.xml.in.h:41
msgid "pl"
msgstr "pl"
-#: ../rules/base.xml.in.h:644 ../rules/base.extras.xml.in.h:41
+#: ../rules/base.xml.in.h:645 ../rules/base.extras.xml.in.h:42
msgid "Polish"
msgstr "Pools"
-#: ../rules/base.xml.in.h:645
+#: ../rules/base.xml.in.h:646
msgid "Polish (legacy)"
msgstr "Pools (historisch)"
-#: ../rules/base.xml.in.h:646
+#: ../rules/base.xml.in.h:647
msgid "Polish (qwertz)"
msgstr "Pools (qwertz)"
-#: ../rules/base.xml.in.h:647
+#: ../rules/base.xml.in.h:648
msgid "Polish (Dvorak)"
msgstr "Pools (Dvorak)"
-#: ../rules/base.xml.in.h:648
+#: ../rules/base.xml.in.h:649
msgid "Polish (Dvorak, Polish quotes on quotemark key)"
msgstr "Pools (Dvorak, Poolse aanhalingstekens op aanhalingstekentoets)"
-#: ../rules/base.xml.in.h:649
+#: ../rules/base.xml.in.h:650
msgid "Polish (Dvorak, Polish quotes on key 1)"
msgstr "Pools (Dvorak, Poolse aanhalingstekens op toets 1)"
-#: ../rules/base.xml.in.h:650
+#: ../rules/base.xml.in.h:651
msgid "Kashubian"
msgstr "Kasjoebisch"
-#: ../rules/base.xml.in.h:651
+#: ../rules/base.xml.in.h:652
msgid "Russian (Poland, phonetic Dvorak)"
msgstr "Russisch (Polen, fonetisch Dvorak)"
-#: ../rules/base.xml.in.h:652
+#: ../rules/base.xml.in.h:653
msgid "Polish (programmer Dvorak)"
msgstr "Pools (programmeer-Dvorak)"
-#: ../rules/base.xml.in.h:653 ../rules/base.extras.xml.in.h:104
+#: ../rules/base.xml.in.h:654 ../rules/base.extras.xml.in.h:105
msgid "Portuguese"
msgstr "Portugees"
-#: ../rules/base.xml.in.h:654
+#: ../rules/base.xml.in.h:655
msgid "Portuguese (eliminate dead keys)"
msgstr "Portugees (zonder dode toetsen)"
-#: ../rules/base.xml.in.h:655
+#: ../rules/base.xml.in.h:656
msgid "Portuguese (Sun dead keys)"
msgstr "Portugees (Sun dode toetsen)"
-#: ../rules/base.xml.in.h:656
+#: ../rules/base.xml.in.h:657
msgid "Portuguese (Macintosh)"
msgstr "Portugees (Macintosh)"
-#: ../rules/base.xml.in.h:657
+#: ../rules/base.xml.in.h:658
msgid "Portuguese (Macintosh, eliminate dead keys)"
msgstr "Portugees (Macintosh, zonder dode toetsen)"
-#: ../rules/base.xml.in.h:658
+#: ../rules/base.xml.in.h:659
msgid "Portuguese (Macintosh, Sun dead keys)"
msgstr "Portugees (Macintosh, Sun dode toetsen)"
# Nativo is een soort indeling, net als Dvorak en Colemak.
-#: ../rules/base.xml.in.h:659
+#: ../rules/base.xml.in.h:660
msgid "Portuguese (Nativo)"
msgstr "Portugees (Nativo)"
-#: ../rules/base.xml.in.h:660
+#: ../rules/base.xml.in.h:661
msgid "Portuguese (Nativo for US keyboards)"
msgstr "Portugees (Nativo voor US-toetsenborden)"
-#: ../rules/base.xml.in.h:661
+#: ../rules/base.xml.in.h:662
msgid "Esperanto (Portugal, Nativo)"
msgstr "Esperanto (Portugal, Nativo)"
#. Keyboard indicator for Romanian layouts
-#: ../rules/base.xml.in.h:663 ../rules/base.extras.xml.in.h:45
+#: ../rules/base.xml.in.h:664 ../rules/base.extras.xml.in.h:46
msgid "ro"
msgstr "ro"
-#: ../rules/base.xml.in.h:664 ../rules/base.extras.xml.in.h:46
+#: ../rules/base.xml.in.h:665 ../rules/base.extras.xml.in.h:47
msgid "Romanian"
msgstr "Roemeens"
-#: ../rules/base.xml.in.h:665
+#: ../rules/base.xml.in.h:666
msgid "Romanian (cedilla)"
msgstr "Roemeens (cedilla)"
-#: ../rules/base.xml.in.h:666
+#: ../rules/base.xml.in.h:667
msgid "Romanian (standard)"
msgstr "Roemeens (standaard)"
-#: ../rules/base.xml.in.h:667
+#: ../rules/base.xml.in.h:668
msgid "Romanian (standard cedilla)"
msgstr "Roemeens (standaard cedilla)"
-#: ../rules/base.xml.in.h:668
+#: ../rules/base.xml.in.h:669
msgid "Romanian (WinKeys)"
msgstr "Roemeens (Windows-toetsen)"
-#: ../rules/base.xml.in.h:669 ../rules/base.extras.xml.in.h:55
+#: ../rules/base.xml.in.h:670 ../rules/base.extras.xml.in.h:56
msgid "Russian"
msgstr "Russisch"
-#: ../rules/base.xml.in.h:670
+#: ../rules/base.xml.in.h:671
msgid "Russian (phonetic)"
msgstr "Russisch (fonetisch)"
-#: ../rules/base.xml.in.h:671
+#: ../rules/base.xml.in.h:672
msgid "Russian (phonetic WinKeys)"
msgstr "Russisch (fonetisch, Windows-toetsen)"
-#: ../rules/base.xml.in.h:672
+#: ../rules/base.xml.in.h:673
msgid "Russian (typewriter)"
msgstr "Russisch (typmachine)"
-#: ../rules/base.xml.in.h:673
+#: ../rules/base.xml.in.h:674
msgid "Russian (legacy)"
msgstr "Russisch (historisch)"
-#: ../rules/base.xml.in.h:674
+#: ../rules/base.xml.in.h:675
msgid "Russian (typewriter, legacy)"
msgstr "Russisch (typmachine, historisch)"
-#: ../rules/base.xml.in.h:675
+#: ../rules/base.xml.in.h:676
msgid "Tatar"
msgstr "Tatar"
-#: ../rules/base.xml.in.h:676
+#: ../rules/base.xml.in.h:677
msgid "Ossetian (legacy)"
msgstr "Ossetisch (historisch)"
-#: ../rules/base.xml.in.h:677
+#: ../rules/base.xml.in.h:678
msgid "Ossetian (WinKeys)"
msgstr "Ossetisch (Windows-toetsen)"
-#: ../rules/base.xml.in.h:678
+#: ../rules/base.xml.in.h:679
msgid "Chuvash"
msgstr "Tsjoevasjisch"
-#: ../rules/base.xml.in.h:679
+#: ../rules/base.xml.in.h:680
msgid "Chuvash (Latin)"
msgstr "Tsjoevasjisch (Latijns)"
-#: ../rules/base.xml.in.h:680
+#: ../rules/base.xml.in.h:681
msgid "Udmurt"
msgstr "Udmurts"
-#: ../rules/base.xml.in.h:681
+#: ../rules/base.xml.in.h:682
msgid "Komi"
msgstr "Komi"
# Het Jakoets is een Turkse taal met ongeveer 360 duizend sprekers.
-#: ../rules/base.xml.in.h:682
+#: ../rules/base.xml.in.h:683
msgid "Yakut"
msgstr "Jakoets"
-#: ../rules/base.xml.in.h:683
+#: ../rules/base.xml.in.h:684
msgid "Kalmyk"
msgstr "Kalmyk"
-#: ../rules/base.xml.in.h:684
+#: ../rules/base.xml.in.h:685
msgid "Russian (DOS)"
msgstr "Russisch (DOS)"
-#: ../rules/base.xml.in.h:685
+#: ../rules/base.xml.in.h:686
msgid "Russian (Macintosh)"
msgstr "Russisch (Macintosh)"
-#: ../rules/base.xml.in.h:686
+#: ../rules/base.xml.in.h:687
msgid "Serbian (Russia)"
msgstr "Servisch (Rusland)"
# Het Basjkiers is een Turkse taal, voornamelijk gesproken door de Basjkieren.
-#: ../rules/base.xml.in.h:687
+#: ../rules/base.xml.in.h:688
msgid "Bashkirian"
msgstr "Basjkiers"
-#: ../rules/base.xml.in.h:688
+#: ../rules/base.xml.in.h:689
msgid "Mari"
msgstr "Mari"
-#: ../rules/base.xml.in.h:689 ../rules/base.extras.xml.in.h:52
+#: ../rules/base.xml.in.h:690 ../rules/base.extras.xml.in.h:53
msgid "Serbian"
msgstr "Servisch"
# verwisseld/gewisseld/omgewisseld
-#: ../rules/base.xml.in.h:690
+#: ../rules/base.xml.in.h:691
msgid "Serbian (Cyrillic, Z and ZHE swapped)"
msgstr "Servisch (Cyrillisch, Z en ZHE omgewisseld)"
-#: ../rules/base.xml.in.h:691
+#: ../rules/base.xml.in.h:692
msgid "Serbian (Latin)"
msgstr "Servisch (Latijns)"
-#: ../rules/base.xml.in.h:692
+#: ../rules/base.xml.in.h:693
msgid "Serbian (Latin Unicode)"
msgstr "Servisch (Latijns Unicode)"
-#: ../rules/base.xml.in.h:693
+#: ../rules/base.xml.in.h:694
msgid "Serbian (Latin qwerty)"
msgstr "Servisch (Latijns qwerty)"
-#: ../rules/base.xml.in.h:694
+#: ../rules/base.xml.in.h:695
msgid "Serbian (Latin Unicode qwerty)"
msgstr "Servisch (Latijns Unicode qwerty)"
# Guillemets of ook quillemets zijn Franse aanhalingstekens.
# Dit is "Nederlands" en dit is de «Franse manier» van aanhalen.
-#: ../rules/base.xml.in.h:695
+#: ../rules/base.xml.in.h:696
msgid "Serbian (Cyrillic with guillemets)"
msgstr "Servisch (Cyrillisch met Franse aanhalingstekens)"
# Guillemets of ook quillemets zijn Franse aanhalingstekens.
# Dit is "Nederlands" en dit is de «Franse manier» van aanhalen.
-#: ../rules/base.xml.in.h:696
+#: ../rules/base.xml.in.h:697
msgid "Serbian (Latin with guillemets)"
msgstr "Servisch (Latijns met Franse aanhalingstekens)"
@@ -2654,764 +2662,764 @@ msgstr "Servisch (Latijns met Franse aanhalingstekens)"
# north-western Serbia (Bačka region) and eastern Croatia
# (therefore also called Yugoslavo-Ruthenian, Vojvodina-Ruthenian
# or Bačka-Ruthenian).
-#: ../rules/base.xml.in.h:697
-msgid "Pannonian Rusyn (homophonic)"
-msgstr "Pannonisch Rusyn (homophonisch)"
+#: ../rules/base.xml.in.h:698
+msgid "Pannonian Rusyn"
+msgstr "Pannonisch Rusyn"
#. Keyboard indicator for Slovenian layouts
-#: ../rules/base.xml.in.h:699
+#: ../rules/base.xml.in.h:700
msgid "sl"
msgstr "sl"
-#: ../rules/base.xml.in.h:700
+#: ../rules/base.xml.in.h:701
msgid "Slovenian"
msgstr "Sloveens"
-#: ../rules/base.xml.in.h:701
+#: ../rules/base.xml.in.h:702
msgid "Slovenian (use guillemets for quotes)"
msgstr "Sloveens (met Franse aanhalingstekens voor citaten)"
-#: ../rules/base.xml.in.h:702
+#: ../rules/base.xml.in.h:703
msgid "Slovenian (US keyboard with Slovenian letters)"
msgstr "Sloveens (US-toetsenbord met Sloveense lettertekens)"
#. Keyboard indicator for Slovak layouts
-#: ../rules/base.xml.in.h:704 ../rules/base.extras.xml.in.h:106
+#: ../rules/base.xml.in.h:705 ../rules/base.extras.xml.in.h:107
msgid "sk"
msgstr "sk"
-#: ../rules/base.xml.in.h:705 ../rules/base.extras.xml.in.h:107
+#: ../rules/base.xml.in.h:706 ../rules/base.extras.xml.in.h:108
msgid "Slovak"
msgstr "Slowaaks"
# XXX brede backslash/uitgebreide backslash
-#: ../rules/base.xml.in.h:706
+#: ../rules/base.xml.in.h:707
msgid "Slovak (extended Backslash)"
msgstr "Slowaaks (brede backslash-toets)"
-#: ../rules/base.xml.in.h:707
+#: ../rules/base.xml.in.h:708
msgid "Slovak (qwerty)"
msgstr "Slowaaks (qwerty)"
# XXX brede backslash/uitgebreide backslash
-#: ../rules/base.xml.in.h:708
+#: ../rules/base.xml.in.h:709
msgid "Slovak (qwerty, extended Backslash)"
msgstr "Slowaaks (qwerty, brede backslash-toets)"
-#: ../rules/base.xml.in.h:709 ../rules/base.extras.xml.in.h:110
+#: ../rules/base.xml.in.h:710 ../rules/base.extras.xml.in.h:111
msgid "Spanish"
msgstr "Spaans"
-#: ../rules/base.xml.in.h:710
+#: ../rules/base.xml.in.h:711
msgid "Spanish (eliminate dead keys)"
msgstr "Spaans (zonder dode toetsen)"
# inactieve/dode/latente
-#: ../rules/base.xml.in.h:711
+#: ../rules/base.xml.in.h:712
msgid "Spanish (include dead tilde)"
msgstr "Spaans (met dode tilde)"
-#: ../rules/base.xml.in.h:712
+#: ../rules/base.xml.in.h:713
msgid "Spanish (Sun dead keys)"
msgstr "Spaans (Sun dode toetsen)"
-#: ../rules/base.xml.in.h:713
+#: ../rules/base.xml.in.h:714
msgid "Spanish (Dvorak)"
msgstr "Spaans (Dvorak)"
-#: ../rules/base.xml.in.h:714
+#: ../rules/base.xml.in.h:715
msgid "Asturian (Spain, with bottom-dot H and bottom-dot L)"
msgstr "Asturisch (Spanje, met onderpunts H en onderpunts L)"
-#: ../rules/base.xml.in.h:715
+#: ../rules/base.xml.in.h:716
msgid "Catalan (Spain, with middle-dot L)"
msgstr "Catalaans (Spanje, met middenpunts L)"
-#: ../rules/base.xml.in.h:716
+#: ../rules/base.xml.in.h:717
msgid "Spanish (Macintosh)"
msgstr "Spaans (Macintosh)"
#. Keyboard indicator for Swedish layouts
-#: ../rules/base.xml.in.h:718 ../rules/base.extras.xml.in.h:112
+#: ../rules/base.xml.in.h:719 ../rules/base.extras.xml.in.h:113
msgid "sv"
msgstr "sv"
-#: ../rules/base.xml.in.h:719 ../rules/base.extras.xml.in.h:113
+#: ../rules/base.xml.in.h:720 ../rules/base.extras.xml.in.h:114
msgid "Swedish"
msgstr "Zweeds"
-#: ../rules/base.xml.in.h:720
+#: ../rules/base.xml.in.h:721
msgid "Swedish (eliminate dead keys)"
msgstr "Zweeds (zonder dode toetsen)"
-#: ../rules/base.xml.in.h:721
+#: ../rules/base.xml.in.h:722
msgid "Swedish (Dvorak)"
msgstr "Zweeds (Dvorak)"
-#: ../rules/base.xml.in.h:722
+#: ../rules/base.xml.in.h:723
msgid "Russian (Sweden, phonetic)"
msgstr "Russisch (Zweden, fonetisch)"
-#: ../rules/base.xml.in.h:723
+#: ../rules/base.xml.in.h:724
msgid "Russian (Sweden, phonetic, eliminate dead keys)"
msgstr "Russisch (Zweden, fonetisch, zonder dode toetsen)"
-#: ../rules/base.xml.in.h:724
+#: ../rules/base.xml.in.h:725
msgid "Northern Saami (Sweden)"
msgstr "Noord-Samisch (Zweden)"
-#: ../rules/base.xml.in.h:725
+#: ../rules/base.xml.in.h:726
msgid "Swedish (Macintosh)"
msgstr "Zweeds (Macintosh)"
-#: ../rules/base.xml.in.h:726
+#: ../rules/base.xml.in.h:727
msgid "Swedish (Svdvorak)"
msgstr "Zweeds (Svdvorak)"
-#: ../rules/base.xml.in.h:727
+#: ../rules/base.xml.in.h:728
msgid "Swedish Sign Language"
msgstr "Zweedse gebarentaal"
-#: ../rules/base.xml.in.h:728 ../rules/base.extras.xml.in.h:115
+#: ../rules/base.xml.in.h:729 ../rules/base.extras.xml.in.h:116
msgid "German (Switzerland)"
msgstr "Duits (Zwitserland)"
-#: ../rules/base.xml.in.h:729
+#: ../rules/base.xml.in.h:730
msgid "German (Switzerland, legacy)"
msgstr "Duits (Zwitserland, historisch)"
-#: ../rules/base.xml.in.h:730
+#: ../rules/base.xml.in.h:731
msgid "German (Switzerland, eliminate dead keys)"
msgstr "Duits (Zwitserland, zonder dode toetsen)"
-#: ../rules/base.xml.in.h:731
+#: ../rules/base.xml.in.h:732
msgid "German (Switzerland, Sun dead keys)"
msgstr "Duits (Zwitserland, Sun dode toetsen)"
-#: ../rules/base.xml.in.h:732
+#: ../rules/base.xml.in.h:733
msgid "French (Switzerland)"
msgstr "Frans (Zwitserland)"
-#: ../rules/base.xml.in.h:733
+#: ../rules/base.xml.in.h:734
msgid "French (Switzerland, eliminate dead keys)"
msgstr "Frans (Zwitserland, zonder dode toetsen)"
-#: ../rules/base.xml.in.h:734
+#: ../rules/base.xml.in.h:735
msgid "French (Switzerland, Sun dead keys)"
msgstr "Frans (Zwitserland, Sun dode toetsen)"
-#: ../rules/base.xml.in.h:735
+#: ../rules/base.xml.in.h:736
msgid "French (Switzerland, Macintosh)"
msgstr "Frans (Zwitserland, Macintosh)"
-#: ../rules/base.xml.in.h:736
+#: ../rules/base.xml.in.h:737
msgid "German (Switzerland, Macintosh)"
msgstr "Duits (Zwitserland, Macintosh)"
-#: ../rules/base.xml.in.h:737
+#: ../rules/base.xml.in.h:738
msgid "Arabic (Syria)"
msgstr "Arabisch (Syrië)"
#. Keyboard indicator for Syriac layouts
-#: ../rules/base.xml.in.h:739
+#: ../rules/base.xml.in.h:740
msgid "syc"
msgstr "syc"
-#: ../rules/base.xml.in.h:740
+#: ../rules/base.xml.in.h:741
msgid "Syriac"
msgstr "Syrisch"
-#: ../rules/base.xml.in.h:741
+#: ../rules/base.xml.in.h:742
msgid "Syriac (phonetic)"
msgstr "Syrisch (fonetisch)"
-#: ../rules/base.xml.in.h:742
+#: ../rules/base.xml.in.h:743
msgid "Kurdish (Syria, Latin Q)"
msgstr "Koerdisch (Syrië, Latijns Q)"
-#: ../rules/base.xml.in.h:743
+#: ../rules/base.xml.in.h:744
msgid "Kurdish (Syria, F)"
msgstr "Koerdisch (Syrië, F)"
-#: ../rules/base.xml.in.h:744
+#: ../rules/base.xml.in.h:745
msgid "Kurdish (Syria, Latin Alt-Q)"
msgstr "Koerdisch (Syrië, Latijns Alt-Q)"
#. Keyboard indicator for Tajik layouts
-#: ../rules/base.xml.in.h:746
+#: ../rules/base.xml.in.h:747
msgid "tg"
msgstr "tg"
# Het Tadzjieks of Tajiki.
-#: ../rules/base.xml.in.h:747
+#: ../rules/base.xml.in.h:748
msgid "Tajik"
msgstr "Tadzjieks"
-#: ../rules/base.xml.in.h:748
+#: ../rules/base.xml.in.h:749
msgid "Tajik (legacy)"
msgstr "Tadzjieks (historisch)"
#. Keyboard indicator for Sinhala layouts
-#: ../rules/base.xml.in.h:750
+#: ../rules/base.xml.in.h:751
msgid "si"
msgstr "si"
-#: ../rules/base.xml.in.h:751
+#: ../rules/base.xml.in.h:752
msgid "Sinhala (phonetic)"
msgstr "Singalees (fonetisch)"
-#: ../rules/base.xml.in.h:752
+#: ../rules/base.xml.in.h:753
msgid "Tamil (Sri Lanka, Unicode)"
msgstr "Tamil (Sri Lanka, Unicode)"
-#: ../rules/base.xml.in.h:753
+#: ../rules/base.xml.in.h:754
msgid "Tamil (Sri Lanka, TAB Typewriter)"
msgstr "Tamil (Sri Lanka, TAB-typmachine)"
#. Keyboard indicator for Thai layouts
-#: ../rules/base.xml.in.h:755
+#: ../rules/base.xml.in.h:756
msgid "th"
msgstr "th"
# Het Thai is de officiële taal van Thailand.
-#: ../rules/base.xml.in.h:756
+#: ../rules/base.xml.in.h:757
msgid "Thai"
msgstr "Thai"
-#: ../rules/base.xml.in.h:757
+#: ../rules/base.xml.in.h:758
msgid "Thai (TIS-820.2538)"
msgstr "Thai (TIS-820.2538)"
# Pattachote en Kedmanee zijn de twee toetsenbordindelingen voor Thai.
-#: ../rules/base.xml.in.h:758
+#: ../rules/base.xml.in.h:759
msgid "Thai (Pattachote)"
msgstr "Thai (Pattachote)"
#. Keyboard indicator for Turkish layouts
-#: ../rules/base.xml.in.h:760 ../rules/base.extras.xml.in.h:118
+#: ../rules/base.xml.in.h:761 ../rules/base.extras.xml.in.h:119
msgid "tr"
msgstr "tr"
-#: ../rules/base.xml.in.h:761 ../rules/base.extras.xml.in.h:119
+#: ../rules/base.xml.in.h:762 ../rules/base.extras.xml.in.h:120
msgid "Turkish"
msgstr "Turks"
-#: ../rules/base.xml.in.h:762
+#: ../rules/base.xml.in.h:763
msgid "Turkish (F)"
msgstr "Turks (F)"
-#: ../rules/base.xml.in.h:763
+#: ../rules/base.xml.in.h:764
msgid "Turkish (Alt-Q)"
msgstr "Turks (Alt-Q)"
-#: ../rules/base.xml.in.h:764
+#: ../rules/base.xml.in.h:765
msgid "Turkish (Sun dead keys)"
msgstr "Turks (Sun dode toetsen)"
-#: ../rules/base.xml.in.h:765
+#: ../rules/base.xml.in.h:766
msgid "Kurdish (Turkey, Latin Q)"
msgstr "Koerdisch (Turks, Latijns Q)"
-#: ../rules/base.xml.in.h:766
+#: ../rules/base.xml.in.h:767
msgid "Kurdish (Turkey, F)"
msgstr "Koerdisch (Turks, F)"
-#: ../rules/base.xml.in.h:767
+#: ../rules/base.xml.in.h:768
msgid "Kurdish (Turkey, Latin Alt-Q)"
msgstr "Koerdisch (Turks, Latijns Alt-Q)"
-#: ../rules/base.xml.in.h:768
+#: ../rules/base.xml.in.h:769
msgid "Turkish (international with dead keys)"
msgstr "Turks (internationaal, met dode toetsen)"
#. Keyboard indicator for Crimean Tatar layouts
-#: ../rules/base.xml.in.h:770 ../rules/base.extras.xml.in.h:47
+#: ../rules/base.xml.in.h:771 ../rules/base.extras.xml.in.h:48
msgid "crh"
msgstr "crh"
-#: ../rules/base.xml.in.h:771
+#: ../rules/base.xml.in.h:772
msgid "Crimean Tatar (Turkish Q)"
msgstr "Krim-Tataars (Turks Q)"
-#: ../rules/base.xml.in.h:772
+#: ../rules/base.xml.in.h:773
msgid "Crimean Tatar (Turkish F)"
msgstr "Krim-Tataars (Turks F)"
-#: ../rules/base.xml.in.h:773
+#: ../rules/base.xml.in.h:774
msgid "Crimean Tatar (Turkish Alt-Q)"
msgstr "Krim-Tataars (Turks Alt-Q)"
-#: ../rules/base.xml.in.h:774
+#: ../rules/base.xml.in.h:775
msgid "Taiwanese"
msgstr "Taiwanees"
-#: ../rules/base.xml.in.h:775
+#: ../rules/base.xml.in.h:776
msgid "Taiwanese (indigenous)"
msgstr "Taiwanees (oorspronkelijk)"
#. Keyboard indicator for Saisiyat layouts
-#: ../rules/base.xml.in.h:777
+#: ../rules/base.xml.in.h:778
msgid "xsy"
msgstr "xsy"
# Saisiyat, ook Saiset, Seisirat, Saisett, Saisiat, Saisiett, Saisirat,
# Saisyet, Saisyett, Amutoura of Bouiok.
-#: ../rules/base.xml.in.h:778
+#: ../rules/base.xml.in.h:779
msgid "Saisiyat (Taiwan)"
msgstr "Saisiyat (Taiwan)"
#. Keyboard indicator for Ukranian layouts
-#: ../rules/base.xml.in.h:780 ../rules/base.extras.xml.in.h:121
+#: ../rules/base.xml.in.h:781 ../rules/base.extras.xml.in.h:122
msgid "uk"
msgstr "uk"
-#: ../rules/base.xml.in.h:781 ../rules/base.extras.xml.in.h:122
+#: ../rules/base.xml.in.h:782 ../rules/base.extras.xml.in.h:123
msgid "Ukrainian"
msgstr "Oekraïens"
-#: ../rules/base.xml.in.h:782
+#: ../rules/base.xml.in.h:783
msgid "Ukrainian (phonetic)"
msgstr "Oekraïens (fonetisch)"
-#: ../rules/base.xml.in.h:783
+#: ../rules/base.xml.in.h:784
msgid "Ukrainian (typewriter)"
msgstr "Oekraïens (typmachine)"
-#: ../rules/base.xml.in.h:784
+#: ../rules/base.xml.in.h:785
msgid "Ukrainian (WinKeys)"
msgstr "Oekraïens (Windows-toetsen)"
-#: ../rules/base.xml.in.h:785
+#: ../rules/base.xml.in.h:786
msgid "Ukrainian (legacy)"
msgstr "Oekraïens (historisch)"
-#: ../rules/base.xml.in.h:786
+#: ../rules/base.xml.in.h:787
msgid "Ukrainian (standard RSTU)"
msgstr "Oekraïens (standaard RSTU)"
# Oekraïens (standaard RSTU).
-#: ../rules/base.xml.in.h:787
+#: ../rules/base.xml.in.h:788
msgid "Russian (Ukraine, standard RSTU)"
msgstr "Russisch (Oekraïne, standaard RSTU)"
# Pannonian Rusyn (руска бешеда) or simply Rusyn (or Ruthenian) is a Slavic language
# or dialect spoken by Pannonian Rusyns in north-western Serbia (Bačka region) and eastern
# Croatia (therefore also called Yugoslavo-Ruthenian, Vojvodina-Ruthenian or Bačka-Ruthenian).
-#: ../rules/base.xml.in.h:788
+#: ../rules/base.xml.in.h:789
msgid "Ukrainian (homophonic)"
msgstr "Oekraïens (homophonisch)"
-#: ../rules/base.xml.in.h:789 ../rules/base.extras.xml.in.h:124
+#: ../rules/base.xml.in.h:790 ../rules/base.extras.xml.in.h:125
msgid "English (UK)"
msgstr "Engels (UK)"
-#: ../rules/base.xml.in.h:790
+#: ../rules/base.xml.in.h:791
msgid "English (UK, extended WinKeys)"
msgstr "Engels (UK, uitgebreid Windows-toetsen)"
-#: ../rules/base.xml.in.h:791
+#: ../rules/base.xml.in.h:792
msgid "English (UK, international with dead keys)"
msgstr "Engels (UK, internationaal, met dode toetsen)"
-#: ../rules/base.xml.in.h:792
+#: ../rules/base.xml.in.h:793
msgid "English (UK, Dvorak)"
msgstr "Engels (UK, Dvorak)"
-#: ../rules/base.xml.in.h:793
+#: ../rules/base.xml.in.h:794
msgid "English (UK, Dvorak with UK punctuation)"
msgstr "Engels (UK, Dvorak met UK-leestekens)"
-#: ../rules/base.xml.in.h:794
+#: ../rules/base.xml.in.h:795
msgid "English (UK, Macintosh)"
msgstr "Engels (UK, Macintosh)"
-#: ../rules/base.xml.in.h:795
+#: ../rules/base.xml.in.h:796
msgid "English (UK, Macintosh international)"
msgstr "Engels (UK, Macintosh internationaal)"
-#: ../rules/base.xml.in.h:796
+#: ../rules/base.xml.in.h:797
msgid "English (UK, Colemak)"
msgstr "Engels (UK, Colemak)"
-#: ../rules/base.xml.in.h:797
+#: ../rules/base.xml.in.h:798
msgid "Uzbek"
msgstr "Oezbeeks"
-#: ../rules/base.xml.in.h:798
+#: ../rules/base.xml.in.h:799
msgid "Uzbek (Latin)"
msgstr "Oezbeeks (Latijns)"
#. Keyboard indicator for Vietnamese layouts
-#: ../rules/base.xml.in.h:800
+#: ../rules/base.xml.in.h:801
msgid "vi"
msgstr "vi"
-#: ../rules/base.xml.in.h:801
+#: ../rules/base.xml.in.h:802
msgid "Vietnamese"
msgstr "Viëtnamees"
#. Keyboard indicator for Korean layouts
-#: ../rules/base.xml.in.h:803 ../rules/base.extras.xml.in.h:126
+#: ../rules/base.xml.in.h:804 ../rules/base.extras.xml.in.h:127
msgid "ko"
msgstr "ko"
-#: ../rules/base.xml.in.h:804 ../rules/base.extras.xml.in.h:127
+#: ../rules/base.xml.in.h:805 ../rules/base.extras.xml.in.h:128
msgid "Korean"
msgstr "Koreaans"
-#: ../rules/base.xml.in.h:805
+#: ../rules/base.xml.in.h:806
msgid "Korean (101/104 key compatible)"
msgstr "Koreaans (101/104-toetsen compatibel)"
-#: ../rules/base.xml.in.h:806
+#: ../rules/base.xml.in.h:807
msgid "Japanese (PC-98xx Series)"
msgstr "Japans (PC-98xx serie)"
#. Keyboard indicator for Irish layouts
-#: ../rules/base.xml.in.h:808
+#: ../rules/base.xml.in.h:809
msgid "ie"
msgstr "ie"
-#: ../rules/base.xml.in.h:809
+#: ../rules/base.xml.in.h:810
msgid "Irish"
msgstr "Iers"
# Iers.
-#: ../rules/base.xml.in.h:810
+#: ../rules/base.xml.in.h:811
msgid "CloGaelach"
msgstr "CloGaelach"
-#: ../rules/base.xml.in.h:811
+#: ../rules/base.xml.in.h:812
msgid "Irish (UnicodeExpert)"
msgstr "Iers (UnicodeExpert)"
-#: ../rules/base.xml.in.h:812
+#: ../rules/base.xml.in.h:813
msgid "Ogham"
msgstr "Ogham"
# Iers (Ogham IS434).
-#: ../rules/base.xml.in.h:813
+#: ../rules/base.xml.in.h:814
msgid "Ogham (IS434)"
msgstr "Ogham (IS434)"
# Het Urdu, vroeger door Westerse taalkundigen vaak Hindoestani genoemd,
# is de officiële taal van Pakistan.
-#: ../rules/base.xml.in.h:814
+#: ../rules/base.xml.in.h:815
msgid "Urdu (Pakistan)"
msgstr "Urdu (Pakistan)"
-#: ../rules/base.xml.in.h:815
+#: ../rules/base.xml.in.h:816
msgid "Urdu (Pakistan, CRULP)"
msgstr "Urdu (Pakistan, CRULP)"
-#: ../rules/base.xml.in.h:816
+#: ../rules/base.xml.in.h:817
msgid "Urdu (Pakistan, NLA)"
msgstr "Urdu (Pakistan, NLA)"
-#: ../rules/base.xml.in.h:817
+#: ../rules/base.xml.in.h:818
msgid "Arabic (Pakistan)"
msgstr "Arabisch (Pakistan)"
#. Keyboard indicator for Sindhi layouts
-#: ../rules/base.xml.in.h:819
+#: ../rules/base.xml.in.h:820
msgid "sd"
msgstr "sd"
-#: ../rules/base.xml.in.h:820
+#: ../rules/base.xml.in.h:821
msgid "Sindhi"
msgstr "Sindhi"
#. Keyboard indicator for Dhivehi layouts
-#: ../rules/base.xml.in.h:822
+#: ../rules/base.xml.in.h:823
msgid "dv"
msgstr "dv"
-#: ../rules/base.xml.in.h:823
+#: ../rules/base.xml.in.h:824
msgid "Dhivehi"
msgstr "Dhivehi"
-#: ../rules/base.xml.in.h:824
+#: ../rules/base.xml.in.h:825
msgid "English (South Africa)"
msgstr "Engels (Zuid-Afrika)"
#. Keyboard indicator for Esperanto layouts
-#: ../rules/base.xml.in.h:826
+#: ../rules/base.xml.in.h:827
msgid "eo"
msgstr "eo"
-#: ../rules/base.xml.in.h:827
+#: ../rules/base.xml.in.h:828
msgid "Esperanto"
msgstr "Esperanto"
-#: ../rules/base.xml.in.h:828
+#: ../rules/base.xml.in.h:829
msgid "Esperanto (displaced semicolon and quote, obsolete)"
msgstr "Esperanto (puntkomma en aanhalingsteken op afwijkende plek, historisch)"
#. Keyboard indicator for Nepali layouts
-#: ../rules/base.xml.in.h:830
+#: ../rules/base.xml.in.h:831
msgid "ne"
msgstr "ne"
-#: ../rules/base.xml.in.h:831
+#: ../rules/base.xml.in.h:832
msgid "Nepali"
msgstr "Nepalees"
-#: ../rules/base.xml.in.h:832
+#: ../rules/base.xml.in.h:833
msgid "English (Nigeria)"
msgstr "Engels (Nigeria)"
#. Keyboard indicator for Igbo layouts
-#: ../rules/base.xml.in.h:834
+#: ../rules/base.xml.in.h:835
msgid "ig"
msgstr "ig"
-#: ../rules/base.xml.in.h:835
+#: ../rules/base.xml.in.h:836
msgid "Igbo"
msgstr "Igbo"
#. Keyboard indicator for Yoruba layouts
-#: ../rules/base.xml.in.h:837
+#: ../rules/base.xml.in.h:838
msgid "yo"
msgstr "yo"
# Het Yoruba is een Afrikaanse taal. Het is de taal van de Yoruba
# en wordt gesproken in Nigeria, Benin en Togo.
-#: ../rules/base.xml.in.h:838
+#: ../rules/base.xml.in.h:839
msgid "Yoruba"
msgstr "Yoruba"
#. Keyboard indicator for Amharic layouts
-#: ../rules/base.xml.in.h:840
+#: ../rules/base.xml.in.h:841
msgid "am"
msgstr "am"
# Het Amhaars is een Semitische taal die in Ethiopië gesproken wordt.
-#: ../rules/base.xml.in.h:841
+#: ../rules/base.xml.in.h:842
msgid "Amharic"
msgstr "Amhaars"
#. Keyboard indicator for Wolof layouts
-#: ../rules/base.xml.in.h:843
+#: ../rules/base.xml.in.h:844
msgid "wo"
msgstr "wo"
-#: ../rules/base.xml.in.h:844
+#: ../rules/base.xml.in.h:845
msgid "Wolof"
msgstr "Wolof"
#. Keyboard indicator for Braille layouts
-#: ../rules/base.xml.in.h:846
+#: ../rules/base.xml.in.h:847
msgid "brl"
msgstr "brl"
-#: ../rules/base.xml.in.h:847
+#: ../rules/base.xml.in.h:848
msgid "Braille"
msgstr "Braille"
-#: ../rules/base.xml.in.h:848
+#: ../rules/base.xml.in.h:849
msgid "Braille (left hand)"
msgstr "Braille (linkerhand)"
-#: ../rules/base.xml.in.h:849
+#: ../rules/base.xml.in.h:850
msgid "Braille (right hand)"
msgstr "Braille (rechterhand)"
#. Keyboard indicator for Turkmen layouts
-#: ../rules/base.xml.in.h:851
+#: ../rules/base.xml.in.h:852
msgid "tk"
msgstr "tk"
-#: ../rules/base.xml.in.h:852
+#: ../rules/base.xml.in.h:853
msgid "Turkmen"
msgstr "Turkmeens"
-#: ../rules/base.xml.in.h:853
+#: ../rules/base.xml.in.h:854
msgid "Turkmen (Alt-Q)"
msgstr "Turkmeens (Alt-Q)"
#. Keyboard indicator for Bambara layouts
-#: ../rules/base.xml.in.h:855
+#: ../rules/base.xml.in.h:856
msgid "bm"
msgstr "bm"
# Bambara, ook bekend onder de naam Bamanankan, is een Mande-taal die door meer
# dan zes miljoen mensen gesproken wordt, voornamelijk in Mali.
-#: ../rules/base.xml.in.h:856
+#: ../rules/base.xml.in.h:857
msgid "Bambara"
msgstr "Bambara"
-#: ../rules/base.xml.in.h:857
+#: ../rules/base.xml.in.h:858
msgid "French (Mali, alternative)"
msgstr "Frans (Mali, alternatief)"
-#: ../rules/base.xml.in.h:858
+#: ../rules/base.xml.in.h:859
msgid "English (Mali, US Macintosh)"
msgstr "Engels (Mali, US Macintosh)"
-#: ../rules/base.xml.in.h:859
+#: ../rules/base.xml.in.h:860
msgid "English (Mali, US international)"
msgstr "Engels (Mali, US internationaal)"
#. Keyboard indicator for Swahili layouts
-#: ../rules/base.xml.in.h:861
+#: ../rules/base.xml.in.h:862
msgid "sw"
msgstr "sw"
-#: ../rules/base.xml.in.h:862
+#: ../rules/base.xml.in.h:863
msgid "Swahili (Tanzania)"
msgstr "Swahili (Tanzania)"
-#: ../rules/base.xml.in.h:863
+#: ../rules/base.xml.in.h:864
msgid "Swahili (Kenya)"
msgstr "Swahili (Kenia)"
-#: ../rules/base.xml.in.h:864
+#: ../rules/base.xml.in.h:865
msgid "Kikuyu"
msgstr "Kikuyu"
#. Keyboard indicator for Tswana layouts
-#: ../rules/base.xml.in.h:866
+#: ../rules/base.xml.in.h:867
msgid "tn"
msgstr "tn"
# Tswana of Setswana is een Bantoetaal die wordt gesproken in Botswana.
# Andere benamingen voor Tswana zijn onder meer Sechuana en Beetjuans.
-#: ../rules/base.xml.in.h:867
+#: ../rules/base.xml.in.h:868
msgid "Tswana"
msgstr "Tswana"
#. Keyboard indicator for Filipino layouts
-#: ../rules/base.xml.in.h:869
+#: ../rules/base.xml.in.h:870
msgid "ph"
msgstr "ph"
# Het Filipijns (Filipino of Pilipino).
-#: ../rules/base.xml.in.h:870
+#: ../rules/base.xml.in.h:871
msgid "Filipino"
msgstr "Filipijns"
-#: ../rules/base.xml.in.h:871
+#: ../rules/base.xml.in.h:872
msgid "Filipino (QWERTY Baybayin)"
msgstr "Filipijns (QWERTY Baybayin)"
-#: ../rules/base.xml.in.h:872
+#: ../rules/base.xml.in.h:873
msgid "Filipino (Capewell-Dvorak Latin)"
msgstr "Filipijns (Capewell-Dvorak Latijns)"
-#: ../rules/base.xml.in.h:873
+#: ../rules/base.xml.in.h:874
msgid "Filipino (Capewell-Dvorak Baybayin)"
msgstr "Filipijns (Capewell-Dvorak Baybayin)"
-#: ../rules/base.xml.in.h:874
+#: ../rules/base.xml.in.h:875
msgid "Filipino (Capewell-QWERF 2006 Latin)"
msgstr "Filipijns (Capewell-QWERF 2006 Latijns)"
-#: ../rules/base.xml.in.h:875
+#: ../rules/base.xml.in.h:876
msgid "Filipino (Capewell-QWERF 2006 Baybayin)"
msgstr "Filipijns (Capewell-QWERF 2006 Baybayin)"
-#: ../rules/base.xml.in.h:876
+#: ../rules/base.xml.in.h:877
msgid "Filipino (Colemak Latin)"
msgstr "Filipijns (Colemak Latijns)"
-#: ../rules/base.xml.in.h:877
+#: ../rules/base.xml.in.h:878
msgid "Filipino (Colemak Baybayin)"
msgstr "Filipijns (Colemak Baybayin)"
-#: ../rules/base.xml.in.h:878
+#: ../rules/base.xml.in.h:879
msgid "Filipino (Dvorak Latin)"
msgstr "Filipijns (Dvorak Latijns)"
-#: ../rules/base.xml.in.h:879
+#: ../rules/base.xml.in.h:880
msgid "Filipino (Dvorak Baybayin)"
msgstr "Filipijns (Dvorak Baybayin)"
-#: ../rules/base.xml.in.h:880
+#: ../rules/base.xml.in.h:881
msgid "md"
msgstr "md"
-#: ../rules/base.xml.in.h:881
+#: ../rules/base.xml.in.h:882
msgid "Moldavian"
msgstr "Moldavisch"
-#: ../rules/base.xml.in.h:882
+#: ../rules/base.xml.in.h:883
msgid "gag"
msgstr "gag"
-#: ../rules/base.xml.in.h:883
+#: ../rules/base.xml.in.h:884
msgid "Moldavian (Gagauz)"
msgstr "Moldavisch (Gagauz)"
-#: ../rules/base.xml.in.h:884
+#: ../rules/base.xml.in.h:885
msgid "Switching to another layout"
msgstr "Overschakelen naar een andere indeling"
-#: ../rules/base.xml.in.h:885
+#: ../rules/base.xml.in.h:886
msgid "Right Alt (while pressed)"
msgstr "Rechter Alt-toets (ingedrukt gehouden)"
-#: ../rules/base.xml.in.h:886
+#: ../rules/base.xml.in.h:887
msgid "Left Alt (while pressed)"
msgstr "Linker Alt-toets (ingedrukt gehouden)"
-#: ../rules/base.xml.in.h:887
+#: ../rules/base.xml.in.h:888
msgid "Left Win (while pressed)"
msgstr "Linker Windows-toets (ingedrukt gehouden)"
-#: ../rules/base.xml.in.h:888
+#: ../rules/base.xml.in.h:889
msgid "Right Win (while pressed)"
msgstr "Rechter Windows-toets (ingedrukt gehouden)"
# Beide Win-toetsen wisselen de indeling gedurende het indrukken.
-#: ../rules/base.xml.in.h:889
+#: ../rules/base.xml.in.h:890
msgid "Any Win key (while pressed)"
msgstr "Elke Windows-toets (ingedrukt gehouden)"
# XXX -- what IS original capslock action?
-#: ../rules/base.xml.in.h:890
+#: ../rules/base.xml.in.h:891
msgid "Caps Lock (while pressed), Alt+Caps Lock does the original capslock action"
msgstr "CapsLock (ingedrukt gehouden); Alt+CapsLock geeft de oorspronkelijke caps-lock actie"
-#: ../rules/base.xml.in.h:891
+#: ../rules/base.xml.in.h:892
msgid "Right Ctrl (while pressed)"
msgstr "Rechter Ctrl-toets (ingedrukt gehouden)"
-#: ../rules/base.xml.in.h:892
+#: ../rules/base.xml.in.h:893
msgid "Right Alt"
msgstr "Rechter Alt-toets"
-#: ../rules/base.xml.in.h:893
+#: ../rules/base.xml.in.h:894
msgid "Left Alt"
msgstr "Linker Alt-toets"
-#: ../rules/base.xml.in.h:894
+#: ../rules/base.xml.in.h:895
msgid "Caps Lock"
msgstr "CapsLock"
-#: ../rules/base.xml.in.h:895
+#: ../rules/base.xml.in.h:896
msgid "Shift+Caps Lock"
msgstr "Shift + CapsLock"
# CapsLock wisselt naar de eerste indeling, Shift+CapsLock wisselt naar de laatste indeling.
-#: ../rules/base.xml.in.h:896
+#: ../rules/base.xml.in.h:897
msgid "Caps Lock (to first layout), Shift+Caps Lock (to last layout)"
msgstr "CapsLock (naar eerste indeling), Shift+CapsLock (naar laatste indeling)"
# Linker Win-toets wisselt naar de eerste indeling, rechter Win/Menu-toets wisselt naar de laatste indeling.
-#: ../rules/base.xml.in.h:897
+#: ../rules/base.xml.in.h:898
msgid "Left Win (to first layout), Right Win/Menu (to last layout)"
msgstr "Linker Windows-toets (naar eerste indeling), rechter Windows/Menu-toets (naar laatste indeling)"
# Linker Win-toets wisselt naar de eerste indeling, rechter Win/Menu-toets wisselt naar de laatste indeling.
-#: ../rules/base.xml.in.h:898
+#: ../rules/base.xml.in.h:899
msgid "Left Ctrl (to first layout), Right Ctrl (to last layout)"
msgstr "Linker Ctrl-toets (naar eerste indeling), rechter Ctrl-toets (naar laatste indeling)"
-#: ../rules/base.xml.in.h:899
+#: ../rules/base.xml.in.h:900
msgid "Alt+Caps Lock"
msgstr "Alt + CapsLock"
-#: ../rules/base.xml.in.h:900
+#: ../rules/base.xml.in.h:901
msgid "Both Shift keys together"
msgstr "Beide Shift-toetsen samen"
@@ -3419,554 +3427,570 @@ msgstr "Beide Shift-toetsen samen"
# "Beide Alt-toetsen samen verandert de groep."
#
# tezamen/samen/tegelijk
-#: ../rules/base.xml.in.h:901
+#: ../rules/base.xml.in.h:902
msgid "Both Alt keys together"
msgstr "Beide Alt-toetsen samen"
-#: ../rules/base.xml.in.h:902
+#: ../rules/base.xml.in.h:903
msgid "Both Ctrl keys together"
msgstr "Beide Ctrl-toetsen samen"
-#: ../rules/base.xml.in.h:903
+#: ../rules/base.xml.in.h:904
msgid "Ctrl+Shift"
msgstr "Ctrl + Shift"
# Linker Ctrl + Shift-toets
-#: ../rules/base.xml.in.h:904
+#: ../rules/base.xml.in.h:905
msgid "Left Ctrl+Left Shift"
msgstr "Linker Ctrl + linker Shift-toets"
# Rechter Ctrl + Shift-toets
-#: ../rules/base.xml.in.h:905
+#: ../rules/base.xml.in.h:906
msgid "Right Ctrl+Right Shift"
msgstr "Rechter Ctrl + rechter Shift-toets"
-#: ../rules/base.xml.in.h:906
+#: ../rules/base.xml.in.h:907
msgid "Alt+Ctrl"
msgstr "Alt + Ctrl"
-#: ../rules/base.xml.in.h:907
+#: ../rules/base.xml.in.h:908
msgid "Alt+Shift"
msgstr "Alt + Shift"
-#: ../rules/base.xml.in.h:908
+#: ../rules/base.xml.in.h:909
msgid "Left Alt+Left Shift"
msgstr "Linker Alt + linker Shift-toets"
-#: ../rules/base.xml.in.h:909
+#: ../rules/base.xml.in.h:910
msgid "Alt+Space"
msgstr "Alt + Spatie"
-#: ../rules/base.xml.in.h:910
+#: ../rules/base.xml.in.h:911
msgid "Menu"
msgstr "Menu"
-#: ../rules/base.xml.in.h:911
+#: ../rules/base.xml.in.h:912
msgid "Left Win"
msgstr "Linker Windows-toets"
-#: ../rules/base.xml.in.h:912
+#: ../rules/base.xml.in.h:913
msgid "Right Win"
msgstr "Rechter Windows-toets"
-#: ../rules/base.xml.in.h:913
+#: ../rules/base.xml.in.h:914
msgid "Left Shift"
msgstr "Linker Shift-toets"
-#: ../rules/base.xml.in.h:914
+#: ../rules/base.xml.in.h:915
msgid "Right Shift"
msgstr "Rechter Shift-toets"
-#: ../rules/base.xml.in.h:915
+#: ../rules/base.xml.in.h:916
msgid "Left Ctrl"
msgstr "Linker Ctrl-toets"
-#: ../rules/base.xml.in.h:916
+#: ../rules/base.xml.in.h:917
msgid "Right Ctrl"
msgstr "Rechter Ctrl-toets"
-#: ../rules/base.xml.in.h:917
+#: ../rules/base.xml.in.h:918
msgid "Scroll Lock"
msgstr "Scroll-Lock"
-#: ../rules/base.xml.in.h:918
+#: ../rules/base.xml.in.h:919
msgid "LeftCtrl+LeftWin (to first layout), RightCtrl+Menu (to second layout)"
msgstr "Linker Ctrl + linker Windows-toets (naar eerste indeling), rechter Ctrl + Menu-toets (naar tweede indeling)"
# aan te zetten/te kiezen/te selecteren/te krijgen/te bereiken
# 'to choose' is hier een slechte woordkeuze IMO
-#: ../rules/base.xml.in.h:919
+#: ../rules/base.xml.in.h:920
msgid "Key to choose 3rd level"
msgstr "Toegang tot het derde niveau"
-#: ../rules/base.xml.in.h:920
+#: ../rules/base.xml.in.h:921
msgid "Any Win key"
msgstr "Elke Windows-toets"
# Beide/Willekeurige/Een van de/Een/Elke
-#: ../rules/base.xml.in.h:921
+#: ../rules/base.xml.in.h:922
msgid "Any Alt key"
msgstr "Elke Alt-toets"
-#: ../rules/base.xml.in.h:922
+#: ../rules/base.xml.in.h:923
msgid "Right Alt, Shift+Right Alt key is Compose"
msgstr "Rechter Alt-toets (Shift + rechter Alt-toets is samensteltoets)"
-#: ../rules/base.xml.in.h:923
+#: ../rules/base.xml.in.h:924
msgid "Right Alt key never chooses 3rd level"
msgstr "Rechter Alt-toets geeft nooit het derde niveau"
-#: ../rules/base.xml.in.h:924
+#: ../rules/base.xml.in.h:925
msgid "Enter on keypad"
msgstr "Enter op cijferblok"
-#: ../rules/base.xml.in.h:925
+#: ../rules/base.xml.in.h:926
msgid "Backslash"
msgstr "Backslash"
-#: ../rules/base.xml.in.h:926
+#: ../rules/base.xml.in.h:927
msgid "&lt;Less/Greater&gt;"
msgstr "&lt;Kleiner dan/Groter dan&gt;"
-#: ../rules/base.xml.in.h:927
+#: ../rules/base.xml.in.h:928
msgid "Caps Lock chooses 3rd level, acts as onetime lock when pressed together with another 3rd-level-chooser"
msgstr "CapsLock, vergrendelt eenmalig samen met andere derdeniveaukiezer"
-#: ../rules/base.xml.in.h:928
+#: ../rules/base.xml.in.h:929
msgid "Backslash chooses 3rd level, acts as onetime lock when pressed together with another 3rd-level-chooser"
msgstr "Backslash, vergrendelt eenmalig samen met andere derdeniveaukiezer"
# locks - op slot gezet/blijvend/in stand houden
# latches - vergrendelt
-#: ../rules/base.xml.in.h:929
+#: ../rules/base.xml.in.h:930
msgid "&lt;Less/Greater&gt; chooses 3rd level, acts as onetime lock when pressed together with another 3rd-level-chooser"
msgstr "&lt;Kleiner dan/Groter dan&gt;, vergrendelt eenmalig samen met andere derdeniveaukiezer"
-#: ../rules/base.xml.in.h:930
+#: ../rules/base.xml.in.h:931
msgid "Ctrl key position"
msgstr "Positie van Ctrl-toets"
# Ctrl-toets is hier duidelijker
-#: ../rules/base.xml.in.h:931
+#: ../rules/base.xml.in.h:932
msgid "Caps Lock as Ctrl"
msgstr "CapsLock is Ctrl-toets"
# fungeert als/werkt als/is
-#: ../rules/base.xml.in.h:932
+#: ../rules/base.xml.in.h:933
msgid "Left Ctrl as Meta"
msgstr "Linker Ctrl is Meta-toets"
-#: ../rules/base.xml.in.h:933
+#: ../rules/base.xml.in.h:934
msgid "Swap Ctrl and Caps Lock"
msgstr "Ctrl en CapsLock omwisselen"
# Ctrl-toets links van ‘A’
-#: ../rules/base.xml.in.h:934
+#: ../rules/base.xml.in.h:935
msgid "At left of 'A'"
msgstr "Links van de A"
# "Ctrl-toets zit linksonder"
-#: ../rules/base.xml.in.h:935
+#: ../rules/base.xml.in.h:936
msgid "At bottom left"
msgstr "Linksonder"
# fungeert als/werkt als/is
-#: ../rules/base.xml.in.h:936
+#: ../rules/base.xml.in.h:937
msgid "Right Ctrl as Right Alt"
msgstr "Rechter Ctrl is rechter Alt-toets"
# fungeert als/werkt als/is
-#: ../rules/base.xml.in.h:937
+#: ../rules/base.xml.in.h:938
msgid "Menu as Right Ctrl"
msgstr "Menu is rechter Ctrl-toets"
# fungeert als/werkt als/is
-#: ../rules/base.xml.in.h:938
+#: ../rules/base.xml.in.h:939
msgid "Right Alt as Right Ctrl"
msgstr "Rechter Alt is rechter Ctrl-toets"
-#: ../rules/base.xml.in.h:939
+#: ../rules/base.xml.in.h:940
+msgid "Swap Left Alt key with Left Ctrl key"
+msgstr "Linker Alt- en linker Ctrl-toets omwisselen"
+
+#: ../rules/base.xml.in.h:941
+msgid "Swap Left Win key with Left Ctrl key"
+msgstr "Linker Windows- en linker Ctrl-toets omwisselen"
+
+#: ../rules/base.xml.in.h:942
+msgid "Left Alt as Ctrl, Left Ctrl as Win, Left Win as Alt"
+msgstr "Linker Alt is Ctrl, linker Ctrl is Windows-toets, linker Windows-toets is Alt"
+
+#: ../rules/base.xml.in.h:943
msgid "Use keyboard LED to show alternative layout"
msgstr "Toetsenbord-LED gebruiken om alternatieve indeling te tonen"
-#: ../rules/base.xml.in.h:940
+#: ../rules/base.xml.in.h:944
msgid "Num Lock"
msgstr "NumLock"
# dubbelop numeriek/cijfer
-#: ../rules/base.xml.in.h:941
+#: ../rules/base.xml.in.h:945
msgid "Layout of numeric keypad"
msgstr "Indeling van het cijferblok"
-#: ../rules/base.xml.in.h:942
+#: ../rules/base.xml.in.h:946
msgid "Legacy"
msgstr "Historisch"
-#: ../rules/base.xml.in.h:943
+#: ../rules/base.xml.in.h:947
msgid "Unicode additions (arrows and math operators)"
msgstr "Unicode-aanvullingen (pijlen en wiskundige operatoren)"
-#: ../rules/base.xml.in.h:944
+#: ../rules/base.xml.in.h:948
msgid "Unicode additions (arrows and math operators; math operators on default level)"
msgstr "Unicode-aanvullingen (pijlen en wiskundige operatoren; de laatste op standaardniveau)"
-#: ../rules/base.xml.in.h:945
+#: ../rules/base.xml.in.h:949
msgid "Legacy Wang 724"
msgstr "Historisch Wang 724"
-#: ../rules/base.xml.in.h:946
+#: ../rules/base.xml.in.h:950
msgid "Wang 724 keypad with Unicode additions (arrows and math operators)"
msgstr "Wang 724 cijferblok met Unicode-aanvullingen (pijlen en wiskundige operatoren)"
-#: ../rules/base.xml.in.h:947
+#: ../rules/base.xml.in.h:951
msgid "Wang 724 keypad with Unicode additions (arrows and math operators; math operators on default level)"
msgstr "Wang 724 cijferblok met Unicode aanvullingen (pijlen en wiskundige operatoren; de laatste op standaardniveau)"
-#: ../rules/base.xml.in.h:948
+#: ../rules/base.xml.in.h:952
msgid "Hexadecimal"
msgstr "Hexadecimaal"
-#: ../rules/base.xml.in.h:949
+#: ../rules/base.xml.in.h:953
msgid "ATM/phone-style"
msgstr "ATM/telefoonstijl"
# Op het cijferblok is de delete toets aangegeven met "Del", maar
# voor de duidelijkheid maar "Delete-toetsgedrag" van gemaakt.
-#: ../rules/base.xml.in.h:950
+#: ../rules/base.xml.in.h:954
msgid "Numeric keypad delete key behaviour"
msgstr "Gedrag van Delete-toets op cijferblok"
-#: ../rules/base.xml.in.h:951
+#: ../rules/base.xml.in.h:955
msgid "Legacy key with dot"
msgstr "Historisch met punt"
#. Actually, with KP_SEPARATOR, as the old keypad(comma)
-#: ../rules/base.xml.in.h:953
+#: ../rules/base.xml.in.h:957
msgid "Legacy key with comma"
msgstr "Historisch met komma"
-#: ../rules/base.xml.in.h:954
+#: ../rules/base.xml.in.h:958
msgid "Four-level key with dot"
msgstr "Vierniveaus-toets met punt"
-#: ../rules/base.xml.in.h:955
+#: ../rules/base.xml.in.h:959
msgid "Four-level key with dot, Latin-9 only"
msgstr "Vierniveaus-toets met punt, beperkt tot Latin-9"
-#: ../rules/base.xml.in.h:956
+#: ../rules/base.xml.in.h:960
msgid "Four-level key with comma"
msgstr "Vierniveaus-toets met komma"
-#: ../rules/base.xml.in.h:957
+#: ../rules/base.xml.in.h:961
msgid "Four-level key with momayyez"
msgstr "Vierniveaus-toets met momayyez"
#. This assumes the KP_ abstract symbols are actually useful for some apps
#. The description needs to be rewritten
-#: ../rules/base.xml.in.h:960
+#: ../rules/base.xml.in.h:964
msgid "Four-level key with abstract separators"
msgstr "Vierniveaus-toets met abstracte scheidingstekens"
-#: ../rules/base.xml.in.h:961
+#: ../rules/base.xml.in.h:965
msgid "Semicolon on third level"
msgstr "Puntkomma op derde niveau"
-#: ../rules/base.xml.in.h:962
+#: ../rules/base.xml.in.h:966
msgid "Caps Lock key behavior"
msgstr "Gedrag van CapsLock-toets"
-#: ../rules/base.xml.in.h:963
+#: ../rules/base.xml.in.h:967
msgid "Caps Lock uses internal capitalization; Shift \"pauses\" Caps Lock"
msgstr "CapsLock gebruikt interne conversie naar hoofdletters; Shift heft CapsLock tijdelijk op"
-#: ../rules/base.xml.in.h:964
+#: ../rules/base.xml.in.h:968
msgid "Caps Lock uses internal capitalization; Shift doesn't affect Caps Lock"
msgstr "CapsLock gebruikt interne conversie naar hoofdletters; Shift heft CapsLock niet op"
-#: ../rules/base.xml.in.h:965
+#: ../rules/base.xml.in.h:969
msgid "Caps Lock acts as Shift with locking; Shift \"pauses\" Caps Lock"
msgstr "CapsLock werkt als Shift met vergrendeling; Shift heft CapsLock tijdelijk op"
-#: ../rules/base.xml.in.h:966
+#: ../rules/base.xml.in.h:970
msgid "Caps Lock acts as Shift with locking; Shift doesn't affect Caps Lock"
msgstr "CapsLock werkt als Shift met vergrendeling; Shift heft CapsLock niet op"
# heeft alleen effect op/werkt alleen op/beïnvloedt alleen ~
# de alfabetische toetsen/
# bepaalt hoofdletters/kleine letters bij alfabetische tekens.<
-#: ../rules/base.xml.in.h:967
+#: ../rules/base.xml.in.h:971
msgid "Caps Lock toggles normal capitalization of alphabetic characters"
msgstr "CapsLock beïnvloedt alleen alfabetische tekens"
-#: ../rules/base.xml.in.h:968
+#: ../rules/base.xml.in.h:972
msgid "Make Caps Lock an additional Num Lock"
msgstr "Van CapsLock een extra NumLock maken"
-#: ../rules/base.xml.in.h:969
+#: ../rules/base.xml.in.h:973
msgid "Swap ESC and Caps Lock"
msgstr "Esc en CapsLock omwisselen"
# ESC-toets.
-#: ../rules/base.xml.in.h:970
+#: ../rules/base.xml.in.h:974
msgid "Make Caps Lock an additional ESC"
msgstr "Van CapsLock een extra ESC maken"
# Backspace-toets.
-#: ../rules/base.xml.in.h:971
+#: ../rules/base.xml.in.h:975
msgid "Make Caps Lock an additional Backspace"
msgstr "Van CapsLock een extra Backspace maken"
-#: ../rules/base.xml.in.h:972
+#: ../rules/base.xml.in.h:976
msgid "Make Caps Lock an additional Super"
msgstr "Van CapsLock een extra Super maken"
-#: ../rules/base.xml.in.h:973
+#: ../rules/base.xml.in.h:977
msgid "Make Caps Lock an additional Hyper"
msgstr "Van CapsLock een extra Hyper maken"
-#: ../rules/base.xml.in.h:974
+#: ../rules/base.xml.in.h:978
msgid "Caps Lock toggles ShiftLock (affects all keys)"
msgstr "CapsLock schakelt Shift-vergrendeling aan/uit (beïnvloedt alle toetsen)"
# heeft geen functie/geen effect
-#: ../rules/base.xml.in.h:975
+#: ../rules/base.xml.in.h:979
msgid "Caps Lock is disabled"
msgstr "CapsLock is uitgeschakeld"
# Ctrl-toets
-#: ../rules/base.xml.in.h:976
+#: ../rules/base.xml.in.h:980
msgid "Make Caps Lock an additional Ctrl"
msgstr "Van CapsLock een extra Ctrl maken"
-#: ../rules/base.xml.in.h:977
+#: ../rules/base.xml.in.h:981
msgid "Alt/Win key behavior"
msgstr "Gedrag van Alt/Windows-toetsen"
-#: ../rules/base.xml.in.h:978
+#: ../rules/base.xml.in.h:982
msgid "Add the standard behavior to Menu key"
msgstr "Het standaardgedrag toevoegen aan de Menu-toets"
-#: ../rules/base.xml.in.h:979
+#: ../rules/base.xml.in.h:983
msgid "Alt and Meta are on Alt keys"
msgstr "Alt en Meta zitten op de Alt-toetsen"
-#: ../rules/base.xml.in.h:980
+#: ../rules/base.xml.in.h:984
msgid "Alt is mapped to Win keys (and the usual Alt keys)"
msgstr "Alt zit op de Windows-toetsen (én op de gebruikelijke Alt-toetsen)"
-#: ../rules/base.xml.in.h:981
+#: ../rules/base.xml.in.h:985
msgid "Ctrl is mapped to Win keys (and the usual Ctrl keys)"
msgstr "Ctrl zit op de Windows-toetsen (én op de gebruikelijke Ctrl-toetsen)"
-#: ../rules/base.xml.in.h:982
+#: ../rules/base.xml.in.h:986
msgid "Ctrl is mapped to Alt keys, Alt is mapped to Win keys"
msgstr "Ctrl zit op de Alt-toetsen, Alt zit op de Windows-toetsen"
-#: ../rules/base.xml.in.h:983
+#: ../rules/base.xml.in.h:987
msgid "Meta is mapped to Win keys"
msgstr "Meta zit op de Windows-toetsen"
-#: ../rules/base.xml.in.h:984
+#: ../rules/base.xml.in.h:988
msgid "Meta is mapped to Left Win"
msgstr "Meta zit op de linker Windows-toets"
-#: ../rules/base.xml.in.h:985
+#: ../rules/base.xml.in.h:989
msgid "Hyper is mapped to Win-keys"
msgstr "Hyper zit op de Windows-toetsen"
# wordt afgebeeld op/zit op
# zit op is veel korter en is ook duidelijker
-#: ../rules/base.xml.in.h:986
+#: ../rules/base.xml.in.h:990
msgid "Alt is mapped to Right Win, Super to Menu"
msgstr "Alt zit op de rechter Windows-toets, Super op de Menu-toets"
-#: ../rules/base.xml.in.h:987
+#: ../rules/base.xml.in.h:991
msgid "Alt is swapped with Win"
msgstr "Alt- en Windows-toetsen omwisselen"
-#: ../rules/base.xml.in.h:988
+#: ../rules/base.xml.in.h:992
msgid "Position of Compose key"
msgstr "Positie van samensteltoets"
-#: ../rules/base.xml.in.h:989
+#: ../rules/base.xml.in.h:993
msgid "3rd level of Left Win"
msgstr "derde niveau van linker Windows-toets"
-#: ../rules/base.xml.in.h:990
+#: ../rules/base.xml.in.h:994
msgid "3rd level of Right Win"
msgstr "derde niveau van rechter Windows-toets"
-#: ../rules/base.xml.in.h:991
+#: ../rules/base.xml.in.h:995
msgid "3rd level of Menu"
msgstr "derde niveau van Menu"
-#: ../rules/base.xml.in.h:992
+#: ../rules/base.xml.in.h:996
msgid "3rd level of Left Ctrl"
msgstr "derde niveau van linker Ctrl-toets"
-#: ../rules/base.xml.in.h:993
+#: ../rules/base.xml.in.h:997
msgid "3rd level of Right Ctrl"
msgstr "derde niveau van rechter Ctrl-toets"
-#: ../rules/base.xml.in.h:994
+#: ../rules/base.xml.in.h:998
msgid "3rd level of Caps Lock"
msgstr "derde niveau van CapsLock"
-#: ../rules/base.xml.in.h:995
+#: ../rules/base.xml.in.h:999
msgid "3rd level of &lt;Less/Greater&gt;"
msgstr "derde niveau van &lt;Kleiner dan/Groter dan&gt;"
# De tekst op de Pause-toets is meestal "Pause".
-#: ../rules/base.xml.in.h:996
+#: ../rules/base.xml.in.h:1000
msgid "Pause"
msgstr "Pause"
-#: ../rules/base.xml.in.h:997
+#: ../rules/base.xml.in.h:1001
msgid "PrtSc"
msgstr "PrtSc"
-#: ../rules/base.xml.in.h:998
+#: ../rules/base.xml.in.h:1002
msgid "Miscellaneous compatibility options"
msgstr "Overige compatibiliteitsopties"
# dubbelop numeriek/cijfer
-#: ../rules/base.xml.in.h:999
+#: ../rules/base.xml.in.h:1003
msgid "Default numeric keypad keys"
msgstr "Standaard cijferblok-toetsen"
-#: ../rules/base.xml.in.h:1000
+#: ../rules/base.xml.in.h:1004
msgid "Numeric keypad keys always enter digits (as in Mac OS)"
msgstr "Cijferblok-toetsen geven altijd cijfers (net als bij Mac OS)"
-#: ../rules/base.xml.in.h:1001
+#: ../rules/base.xml.in.h:1005
msgid "Shift with numeric keypad keys works as in MS Windows"
msgstr "Shift met cijferblok-toetsen werkt zoals in MS Windows"
-#: ../rules/base.xml.in.h:1002
+#: ../rules/base.xml.in.h:1006
msgid "Shift does not cancel Num Lock, chooses 3rd level instead"
msgstr "Shift heft NumLock niet op, maar geeft juist het derde niveau"
-#: ../rules/base.xml.in.h:1003
+#: ../rules/base.xml.in.h:1007
msgid "Special keys (Ctrl+Alt+&lt;key&gt;) handled in a server"
msgstr "Speciale toetsen (Ctrl+Alt+&lt;toets&gt;) afgehandeld in een server"
-#: ../rules/base.xml.in.h:1004
+#: ../rules/base.xml.in.h:1008
msgid "Apple Aluminium Keyboard: emulate PC keys (Print, Scroll Lock, Pause, Num Lock)"
msgstr "Apple Aluminium-toetsenbord: PC-toetsen emuleren (Print, Scroll-Lock, Pause, NumLock)"
-#: ../rules/base.xml.in.h:1005
+#: ../rules/base.xml.in.h:1009
msgid "Shift cancels Caps Lock"
msgstr "Shift schakelt CapsLock uit"
-#: ../rules/base.xml.in.h:1006
+#: ../rules/base.xml.in.h:1010
msgid "Enable extra typographic characters"
msgstr "Extra typografische tekens aanzetten"
-#: ../rules/base.xml.in.h:1007
+#: ../rules/base.xml.in.h:1011
msgid "Both Shift keys together toggle Caps Lock"
msgstr "Beide Shift-toetsen samen schakelen CapsLock aan/uit"
-#: ../rules/base.xml.in.h:1008
+#: ../rules/base.xml.in.h:1012
msgid "Both Shift keys together activate Caps Lock, one Shift key deactivates"
msgstr "Beide Shift-toetsen samen zetten CapsLock aan, één Shift-toets zet uit"
-#: ../rules/base.xml.in.h:1009
+#: ../rules/base.xml.in.h:1013
msgid "Both Shift keys together toggle ShiftLock"
msgstr "Beide Shift-toetsen samen schakelen ShiftLock aan/uit"
# PointerKeys are the mouse emulation that XKB provides on the press of a key.
# (Test with Shift+NumLock, then the keypad will move the mouse around.)
-#: ../rules/base.xml.in.h:1010
+#: ../rules/base.xml.in.h:1014
msgid "Shift + NumLock toggles PointerKeys"
msgstr "Shift + NumLock schakelen 'muistoetsen' aan/uit"
# XXX -- what does "grab" mean?
-#: ../rules/base.xml.in.h:1011
+#: ../rules/base.xml.in.h:1015
msgid "Allow breaking grabs with keyboard actions (warning: security risk)"
msgstr "Het verbreken van 'grabs' via toetsenbord toestaan (veiligheidsrisico)"
-#: ../rules/base.xml.in.h:1012
+#: ../rules/base.xml.in.h:1016
+msgid "Allow grab and window tree logging"
+msgstr "Het loggen van 'grabs' en 'window trees' toestaan"
+
+#: ../rules/base.xml.in.h:1017
msgid "Adding currency signs to certain keys"
msgstr "Valutatekens aan bepaalde toetsen toevoegen"
-#: ../rules/base.xml.in.h:1013
+#: ../rules/base.xml.in.h:1018
msgid "Euro on E"
msgstr "Euroteken op E"
-#: ../rules/base.xml.in.h:1014
+#: ../rules/base.xml.in.h:1019
msgid "Euro on 2"
msgstr "Euroteken op 2"
-#: ../rules/base.xml.in.h:1015
+#: ../rules/base.xml.in.h:1020
msgid "Euro on 4"
msgstr "Euroteken op 4"
-#: ../rules/base.xml.in.h:1016
+#: ../rules/base.xml.in.h:1021
msgid "Euro on 5"
msgstr "Euroteken op 5"
-#: ../rules/base.xml.in.h:1017
+#: ../rules/base.xml.in.h:1022
msgid "Rupee on 4"
msgstr "Roepie op 4"
# aan te zetten/te kiezen/te selecteren/te krijgen
# 'to choose' is hier een slechte woordkeuze IMO
-#: ../rules/base.xml.in.h:1018
+#: ../rules/base.xml.in.h:1023
msgid "Key to choose 5th level"
msgstr "De toets om het vijde niveau te krijgen"
# locks - op slot gezet/blijvend/in stand houden
-#: ../rules/base.xml.in.h:1019
+#: ../rules/base.xml.in.h:1024
msgid "&lt;Less/Greater&gt; chooses 5th level, locks when pressed together with another 5th-level-chooser"
msgstr "&lt;Kleiner dan/Groter dan&gt; geeft vijfde niveau, en vergrendelt wanneer ingedrukt samen met andere vijfdeniveau-kiezer"
-#: ../rules/base.xml.in.h:1020
+#: ../rules/base.xml.in.h:1025
msgid "Right Alt chooses 5th level, locks when pressed together with another 5th-level-chooser"
msgstr "Rechter Alt-toets geeft vijfde niveau, en vergrendelt wanneer ingedrukt samen met andere vijfdeniveau-kiezer"
-#: ../rules/base.xml.in.h:1021
+#: ../rules/base.xml.in.h:1026
msgid "Left Win chooses 5th level, locks when pressed together with another 5th-level-chooser"
msgstr "Linker Windows-toets geeft vijfde niveau, en vergrendelt wanneer ingedrukt samen met andere vijfdeniveau-kiezer"
-#: ../rules/base.xml.in.h:1022
+#: ../rules/base.xml.in.h:1027
msgid "Right Win chooses 5th level, locks when pressed together with another 5th-level-chooser"
msgstr "Rechter Windows-toets geeft vijfde niveau, en vergrendelt wanneer ingedrukt samen met andere vijfdeniveau-kiezer"
-#: ../rules/base.xml.in.h:1023
+#: ../rules/base.xml.in.h:1028
msgid "Using space key to input non-breakable space character"
msgstr "Gebruik van spatiebalk voor het invoeren van harde (niet-afbrekende) spaties"
# Spatiebalk geeft de gebruikelijke spatie op elk niveau.
-#: ../rules/base.xml.in.h:1024
+#: ../rules/base.xml.in.h:1029
msgid "Usual space at any level"
msgstr "Gewone spatie op elk niveau"
-#: ../rules/base.xml.in.h:1025
+#: ../rules/base.xml.in.h:1030
msgid "Non-breakable space character at second level"
msgstr "Harde spatie op het tweede niveau"
-#: ../rules/base.xml.in.h:1026
+#: ../rules/base.xml.in.h:1031
msgid "Non-breakable space character at third level"
msgstr "Harde spatie op het derde niveau"
-#: ../rules/base.xml.in.h:1027
+#: ../rules/base.xml.in.h:1032
msgid "Non-breakable space character at third level, nothing at fourth level"
msgstr "Harde spatie op het derde niveau, niets op het vierde niveau"
-#: ../rules/base.xml.in.h:1028
+#: ../rules/base.xml.in.h:1033
msgid "Non-breakable space character at third level, thin non-breakable space character at fourth level"
msgstr "Harde spatie op het derde niveau, smalle harde spatie op het vierde niveau"
# Spatiebalk geeft harde spatie op het vierde niveau.
-#: ../rules/base.xml.in.h:1029
+#: ../rules/base.xml.in.h:1034
msgid "Non-breakable space character at fourth level"
msgstr "Harde spatie op het vierde niveau"
-#: ../rules/base.xml.in.h:1030
+#: ../rules/base.xml.in.h:1035
msgid "Non-breakable space character at fourth level, thin non-breakable space character at sixth level"
msgstr "Harde spatie op het vierde niveau, smalle harde spatie op het zesde niveau"
-#: ../rules/base.xml.in.h:1031
+#: ../rules/base.xml.in.h:1036
msgid "Non-breakable space character at fourth level, thin non-breakable space character at sixth level (via Ctrl+Shift)"
msgstr "Harde spatie op het vierde niveau, smalle harde spatie op het zesde niveau (via Ctrl+Shift)"
@@ -3980,85 +4004,85 @@ msgstr "Harde spatie op het vierde niveau, smalle harde spatie op het zesde nive
# Nulbreedte-losmaker/non-verbinder/non-verbindingsteken --
# losmaker is het duidelijkst, het maakt twee tekens los die
# anders verbonden zouden worden. (Tino)
-#: ../rules/base.xml.in.h:1032
+#: ../rules/base.xml.in.h:1037
msgid "Zero-width non-joiner character at second level"
msgstr "Nulbreedte-losmaker op het tweede niveau"
-#: ../rules/base.xml.in.h:1033
+#: ../rules/base.xml.in.h:1038
msgid "Zero-width non-joiner character at second level, zero-width joiner character at third level"
msgstr "Nulbreedte-losmaker op het tweede niveau, nulbreedte-verbinder op het derde niveau"
-#: ../rules/base.xml.in.h:1034
+#: ../rules/base.xml.in.h:1039
msgid "Zero-width non-joiner character at second level, zero-width joiner character at third level, non-breakable space character at fourth level"
msgstr "Nulbreedte-losmaker op het tweede niveau, nulbreedte-verbinder op het derde niveau, harde spatie op het vierde niveau"
-#: ../rules/base.xml.in.h:1035
+#: ../rules/base.xml.in.h:1040
msgid "Zero-width non-joiner character at second level, non-breakable space character at third level"
msgstr "Nulbreedte-losmaker op het tweede niveau, harde spatie op het derde niveau"
-#: ../rules/base.xml.in.h:1036
+#: ../rules/base.xml.in.h:1041
msgid "Zero-width non-joiner character at second level, non-breakable space character at third level, nothing at fourth level"
msgstr "Nulbreedte-losmaker op het tweede niveau, harde spatie op het derde niveau, niets op het vierde niveau"
-#: ../rules/base.xml.in.h:1037
+#: ../rules/base.xml.in.h:1042
msgid "Zero-width non-joiner character at second level, non-breakable space character at third level, zero-width joiner at fourth level"
msgstr "Nulbreedte-losmaker op het tweede niveau, harde spatie op het derde niveau, nulbreedte-verbinder op het vierde niveau"
-#: ../rules/base.xml.in.h:1038
+#: ../rules/base.xml.in.h:1043
msgid "Zero-width non-joiner character at second level, non-breakable space character at third level, thin non-breakable space at fourth level"
msgstr "Nulbreedte-losmaker op het tweede niveau, harde spatie op het derde niveau, smalle harde spatie op het vierde niveau"
-#: ../rules/base.xml.in.h:1039
+#: ../rules/base.xml.in.h:1044
msgid "Zero-width non-joiner character at third level, zero-width joiner at fourth level"
msgstr "Nulbreedte-losmaker op het derde niveau, nulbreedte-verbinder op het vierde niveau"
-#: ../rules/base.xml.in.h:1040
+#: ../rules/base.xml.in.h:1045
msgid "Japanese keyboard options"
msgstr "Japanse toetsenbordopties"
-#: ../rules/base.xml.in.h:1041
+#: ../rules/base.xml.in.h:1046
msgid "Kana Lock key is locking"
msgstr "Kana Lock-toets is vergrendelend"
-#: ../rules/base.xml.in.h:1042
+#: ../rules/base.xml.in.h:1047
msgid "NICOLA-F style Backspace"
msgstr "NICOLA-F-stijl backspace"
# De Zenkaku Hankaku toets converteert tussen volle breedte en half breedte karakters.
-#: ../rules/base.xml.in.h:1043
+#: ../rules/base.xml.in.h:1048
msgid "Make Zenkaku Hankaku an additional ESC"
msgstr "Van de Zenkaku Hankaku-toets een extra ESC-toets maken"
-#: ../rules/base.xml.in.h:1044
+#: ../rules/base.xml.in.h:1049
msgid "Adding Esperanto supersigned letters"
msgstr "Esperanto-letters met accenten toevoegen"
-#: ../rules/base.xml.in.h:1045
+#: ../rules/base.xml.in.h:1050
msgid "To the corresponding key in a Qwerty layout"
msgstr "Aan de gerelateerde toets in een Qwerty-indeling"
-#: ../rules/base.xml.in.h:1046
+#: ../rules/base.xml.in.h:1051
msgid "To the corresponding key in a Dvorak layout"
msgstr "Aan de gerelateerde toets in een Dvorak-indeling"
-#: ../rules/base.xml.in.h:1047
+#: ../rules/base.xml.in.h:1052
msgid "To the corresponding key in a Colemak layout"
msgstr "Aan de gerelateerde toets in een Colemak-indeling"
-#: ../rules/base.xml.in.h:1048
+#: ../rules/base.xml.in.h:1053
msgid "Maintain key compatibility with old Solaris keycodes"
msgstr "Toetscompatibiliteit behouden met oude Solaris-toetscodes"
-#: ../rules/base.xml.in.h:1049
+#: ../rules/base.xml.in.h:1054
msgid "Sun Key compatibility"
msgstr "Sun-toetsen-compatibiliteit"
# om zeep te helpen/af te breken/te stoppen/
-#: ../rules/base.xml.in.h:1050
+#: ../rules/base.xml.in.h:1055
msgid "Key sequence to kill the X server"
msgstr "Toetscombinatie om de X-server af te breken"
-#: ../rules/base.xml.in.h:1051
+#: ../rules/base.xml.in.h:1056
msgid "Ctrl + Alt + Backspace"
msgstr "Ctrl + Alt + Backspace"
@@ -4185,149 +4209,154 @@ msgstr "Cœur d'Alène Salish"
msgid "English (US, Sun Type 6/7)"
msgstr "Engels (US, Sun type 6/7)"
-#: ../rules/base.extras.xml.in.h:42
+# "Norman" is een toetsenbordindeling.
+#: ../rules/base.extras.xml.in.h:40
+msgid "English (Norman)"
+msgstr "Engels (Norman)"
+
+#: ../rules/base.extras.xml.in.h:43
msgid "Polish (international with dead keys)"
msgstr "Pools (internationaal, met dode toetsen)"
-#: ../rules/base.extras.xml.in.h:43
+#: ../rules/base.extras.xml.in.h:44
msgid "Polish (Colemak)"
msgstr "Pools (Colemak)"
-#: ../rules/base.extras.xml.in.h:44
+#: ../rules/base.extras.xml.in.h:45
msgid "Polish (Sun Type 6/7)"
msgstr "Pools (Sun type 6/7)"
# Krim-Tataars of Krim-Turks.
# http://nl.wikipedia.org/wiki/Krim-Tataars
-#: ../rules/base.extras.xml.in.h:48
+#: ../rules/base.extras.xml.in.h:49
msgid "Crimean Tatar (Dobruja Q)"
msgstr "Krim-Tataars (Dobruja Q)"
-#: ../rules/base.extras.xml.in.h:49
+#: ../rules/base.extras.xml.in.h:50
msgid "Romanian (ergonomic Touchtype)"
msgstr "Roemeens (ergonomisch Touchtype)"
-#: ../rules/base.extras.xml.in.h:50
+#: ../rules/base.extras.xml.in.h:51
msgid "Romanian (Sun Type 6/7)"
msgstr "Roemeens (Sun type 6/7)"
-#: ../rules/base.extras.xml.in.h:53
+#: ../rules/base.extras.xml.in.h:54
msgid "Serbian (combining accents instead of dead keys)"
msgstr "Servisch (Combinerende accenten in plaats van dode toetsen)"
-#: ../rules/base.extras.xml.in.h:56
+#: ../rules/base.extras.xml.in.h:57
msgid "Russian (with Ukrainian-Belorussian layout)"
msgstr "Russisch (met Oekraïens-Wit-Russische indeling)"
-#: ../rules/base.extras.xml.in.h:57
+#: ../rules/base.extras.xml.in.h:58
msgid "Russian (Sun Type 6/7)"
msgstr "Russisch (Sun type 6/7)"
-#: ../rules/base.extras.xml.in.h:60
+#: ../rules/base.extras.xml.in.h:61
msgid "Armenian (OLPC phonetic)"
msgstr "Armeens (OLPC, fonetisch)"
-#: ../rules/base.extras.xml.in.h:63
+#: ../rules/base.extras.xml.in.h:64
msgid "Hebrew (Biblical, SIL phonetic)"
msgstr "Hebreeuws (Bijbels, SIL-fonetisch)"
-#: ../rules/base.extras.xml.in.h:66
+#: ../rules/base.extras.xml.in.h:67
msgid "Arabic (Sun Type 6/7)"
msgstr "Arabisch (Sun type 6/7)"
-#: ../rules/base.extras.xml.in.h:69
+#: ../rules/base.extras.xml.in.h:70
msgid "Belgian (Sun Type 6/7)"
msgstr "Belgisch (Sun type 6/7)"
-#: ../rules/base.extras.xml.in.h:72
+#: ../rules/base.extras.xml.in.h:73
msgid "Portuguese (Brazil, Sun Type 6/7)"
msgstr "Portugees (Brazilië, Sun type 6/7)"
-#: ../rules/base.extras.xml.in.h:75
+#: ../rules/base.extras.xml.in.h:76
msgid "Czech (Sun Type 6/7)"
msgstr "Tsjechisch (Sun type 6/7)"
-#: ../rules/base.extras.xml.in.h:78
+#: ../rules/base.extras.xml.in.h:79
msgid "Danish (Sun Type 6/7)"
msgstr "Deens (Sun type 6/7)"
-#: ../rules/base.extras.xml.in.h:81
+#: ../rules/base.extras.xml.in.h:82
msgid "Dutch (Sun Type 6/7)"
msgstr "Nederlands (Sun type 6/7)"
-#: ../rules/base.extras.xml.in.h:84
+#: ../rules/base.extras.xml.in.h:85
msgid "Estonian (Sun Type 6/7)"
msgstr "Estisch (Sun type 6/7)"
-#: ../rules/base.extras.xml.in.h:87
+#: ../rules/base.extras.xml.in.h:88
msgid "Finnish (Sun Type 6/7)"
msgstr "Fins (Sun type 6/7)"
-#: ../rules/base.extras.xml.in.h:89
+#: ../rules/base.extras.xml.in.h:90
msgid "French (Sun Type 6/7)"
msgstr "Frans (Sun type 6/7)"
-#: ../rules/base.extras.xml.in.h:92
+#: ../rules/base.extras.xml.in.h:93
msgid "Greek (Sun Type 6/7)"
msgstr "Grieks (Sun type 6/7)"
-#: ../rules/base.extras.xml.in.h:95
+#: ../rules/base.extras.xml.in.h:96
msgid "Italian (Sun Type 6/7)"
msgstr "Italiaans (Sun type 6/7)"
-#: ../rules/base.extras.xml.in.h:98
+#: ../rules/base.extras.xml.in.h:99
msgid "Japanese (Sun Type 6)"
msgstr "Japans (Sun type 6/)"
-#: ../rules/base.extras.xml.in.h:99
+#: ../rules/base.extras.xml.in.h:100
msgid "Japanese (Sun Type 7 - pc compatible)"
msgstr "Japans (Sun type 7 - PC-compatibel)"
-#: ../rules/base.extras.xml.in.h:100
+#: ../rules/base.extras.xml.in.h:101
msgid "Japanese (Sun Type 7 - sun compatible)"
msgstr "Japans (Sun type 7 - Sun-compatibel)"
-#: ../rules/base.extras.xml.in.h:103
+#: ../rules/base.extras.xml.in.h:104
msgid "Norwegian (Sun Type 6/7)"
msgstr "Noors (Sun type 6/7)"
-#: ../rules/base.extras.xml.in.h:105
+#: ../rules/base.extras.xml.in.h:106
msgid "Portuguese (Sun Type 6/7)"
msgstr "Portugees (Sun type 6/7)"
-#: ../rules/base.extras.xml.in.h:108
+#: ../rules/base.extras.xml.in.h:109
msgid "Slovak (Sun Type 6/7)"
msgstr "Slowaaks (Sun type 6/7)"
-#: ../rules/base.extras.xml.in.h:111
+#: ../rules/base.extras.xml.in.h:112
msgid "Spanish (Sun Type 6/7)"
msgstr "Spaans (Sun type 6/7)"
-#: ../rules/base.extras.xml.in.h:114
+#: ../rules/base.extras.xml.in.h:115
msgid "Swedish (Sun Type 6/7)"
msgstr "Zweeds (Sun type 6/7)"
-#: ../rules/base.extras.xml.in.h:116
+#: ../rules/base.extras.xml.in.h:117
msgid "German (Switzerland, Sun Type 6/7)"
msgstr "Duits (Zwitserland, Sun type 6/7)"
-#: ../rules/base.extras.xml.in.h:117
+#: ../rules/base.extras.xml.in.h:118
msgid "French (Switzerland, Sun Type 6/7)"
msgstr "Frans (Zwitserland, Sun type 6/7)"
-#: ../rules/base.extras.xml.in.h:120
+#: ../rules/base.extras.xml.in.h:121
msgid "Turkish (Sun Type 6/7)"
msgstr "Turks (Sun type 6/7)"
-#: ../rules/base.extras.xml.in.h:123
+#: ../rules/base.extras.xml.in.h:124
msgid "Ukrainian (Sun Type 6/7)"
msgstr "Oekraïens (Sun type 6/7)"
-#: ../rules/base.extras.xml.in.h:125
+#: ../rules/base.extras.xml.in.h:126
msgid "English (UK, Sun Type 6/7)"
msgstr "Engels (UK, Sun type 6/7)"
-#: ../rules/base.extras.xml.in.h:128
+#: ../rules/base.extras.xml.in.h:129
msgid "Korean (Sun Type 6/7)"
msgstr "Koreaans (Sun type 6/7)"
@@ -4463,9 +4492,6 @@ msgstr "Koreaans (Sun type 6/7)"
#~ msgid "Myanmar"
#~ msgstr "Myanmar"
-#~ msgid "Nativo"
-#~ msgstr "Nativo"
-
#~ msgid "Netherlands"
#~ msgstr "Nederland"
@@ -4560,7 +4586,7 @@ msgstr "Koreaans (Sun type 6/7)"
#~ msgstr "qwertz"
#~ msgid "ACPI Standard"
-#~ msgstr "ACPI standaard"
+#~ msgstr "ACPI-standaard"
#~ msgid "Baltic+"
#~ msgstr "Baltisch+"
diff --git a/xorg-server/xkeyboard-config/po/pl.po b/xorg-server/xkeyboard-config/po/pl.po
index fcb4f678c..deb05f4c7 100644
--- a/xorg-server/xkeyboard-config/po/pl.po
+++ b/xorg-server/xkeyboard-config/po/pl.po
@@ -1,13 +1,13 @@
# Polish translation for xkeyboard-config.
# This file is distributed under the same license as the xkeyboard-config package.
-# Jakub Bogusz <qboosh@pld-linux.org>, 2009-2013.
+# Jakub Bogusz <qboosh@pld-linux.org>, 2009-2014.
#
msgid ""
msgstr ""
-"Project-Id-Version: xkeyboard-config 2.9.91\n"
+"Project-Id-Version: xkeyboard-config 2.10.99\n"
"Report-Msgid-Bugs-To: svu@users.sourceforge.net\n"
-"POT-Creation-Date: 2013-09-14 14:41+0200\n"
-"PO-Revision-Date: 2013-09-14 16:31+0200\n"
+"POT-Creation-Date: 2014-01-15 01:12+0000\n"
+"PO-Revision-Date: 2014-01-17 17:01+0100\n"
"Last-Translator: Jakub Bogusz <qboosh@pld-linux.org>\n"
"Language-Team: Polish <translation-team-pl@lists.sourceforge.net>\n"
"Language: pl\n"
@@ -814,7 +814,7 @@ msgid "English (programmer Dvorak)"
msgstr "Angielski (Dvoraka programisty)"
#. Keyboard indicator for Russian layouts
-#: ../rules/base.xml.in.h:203 ../rules/base.extras.xml.in.h:54
+#: ../rules/base.xml.in.h:203 ../rules/base.extras.xml.in.h:55
msgid "ru"
msgstr "ru"
@@ -886,11 +886,11 @@ msgid "Uzbek (Afghanistan, OLPC)"
msgstr "Uzbecki (Afganistan, OLPC)"
#. Keyboard indicator for Arabic layouts
-#: ../rules/base.xml.in.h:224 ../rules/base.extras.xml.in.h:64
+#: ../rules/base.xml.in.h:224 ../rules/base.extras.xml.in.h:65
msgid "ar"
msgstr "ar"
-#: ../rules/base.xml.in.h:225 ../rules/base.extras.xml.in.h:65
+#: ../rules/base.xml.in.h:225 ../rules/base.extras.xml.in.h:66
msgid "Arabic"
msgstr "Arabski"
@@ -928,11 +928,11 @@ msgid "Albanian"
msgstr "Albański"
#. Keyboard indicator for Armenian layouts
-#: ../rules/base.xml.in.h:236 ../rules/base.extras.xml.in.h:58
+#: ../rules/base.xml.in.h:236 ../rules/base.extras.xml.in.h:59
msgid "hy"
msgstr "hy"
-#: ../rules/base.xml.in.h:237 ../rules/base.extras.xml.in.h:59
+#: ../rules/base.xml.in.h:237 ../rules/base.extras.xml.in.h:60
msgid "Armenian"
msgstr "Armeński"
@@ -1008,11 +1008,11 @@ msgid "Belarusian (Latin)"
msgstr "Białoruski (łaciński)"
#. Keyboard indicator for Belgian layouts
-#: ../rules/base.xml.in.h:259 ../rules/base.extras.xml.in.h:67
+#: ../rules/base.xml.in.h:259 ../rules/base.extras.xml.in.h:68
msgid "be"
msgstr "be"
-#: ../rules/base.xml.in.h:260 ../rules/base.extras.xml.in.h:68
+#: ../rules/base.xml.in.h:260 ../rules/base.extras.xml.in.h:69
msgid "Belgian"
msgstr "Belgijski"
@@ -1044,17 +1044,17 @@ msgstr "Belgijski (klawisze akcentów Suna)"
msgid "Belgian (Wang model 724 azerty)"
msgstr "Belgijski (Wang model 724 AZERTY)"
-#. Keyboard indicator for Bengali layouts
+#. Keyboard indicator for Bangla layouts
#: ../rules/base.xml.in.h:269
msgid "bn"
msgstr "bn"
#: ../rules/base.xml.in.h:270
-msgid "Bengali"
+msgid "Bangla"
msgstr "Bengalski"
#: ../rules/base.xml.in.h:271
-msgid "Bengali (Probhat)"
+msgid "Bangla (Probhat)"
msgstr "Bengalski (Probhat)"
#. Keyboard indicator for Indian layouts
@@ -1067,27 +1067,27 @@ msgid "Indian"
msgstr "Indyjski"
#: ../rules/base.xml.in.h:275
-msgid "Bengali (India)"
+msgid "Bangla (India)"
msgstr "Bengalski (Indie)"
#: ../rules/base.xml.in.h:276
-msgid "Bengali (India, Probhat)"
+msgid "Bangla (India, Probhat)"
msgstr "Bengalski (Indie, Probhat)"
#: ../rules/base.xml.in.h:277
-msgid "Bengali (India, Baishakhi)"
+msgid "Bangla (India, Baishakhi)"
msgstr "Bengalski (Indie, Baishakhi)"
#: ../rules/base.xml.in.h:278
-msgid "Bengali (India, Bornona)"
+msgid "Bangla (India, Bornona)"
msgstr "Bengalski (Indie, Bornona)"
#: ../rules/base.xml.in.h:279
-msgid "Bengali (India, Uni Gitanjali)"
+msgid "Bangla (India, Uni Gitanjali)"
msgstr "Bengalski (Indie, Uni Gitanjali)"
#: ../rules/base.xml.in.h:280
-msgid "Bengali (India, Baishakhi Inscript)"
+msgid "Bangla (India, Baishakhi Inscript)"
msgstr "Bengalski (Indie, Baishakhi Inscript)"
#. Keyboard indicator for Gujarati layouts
@@ -1271,11 +1271,11 @@ msgid "Bosnian (US keyboard with Bosnian letters)"
msgstr "Bośniacki (klawiatura US z literami bośniackimi)"
#. Keyboard indicator for Portuguese layouts
-#: ../rules/base.xml.in.h:336 ../rules/base.extras.xml.in.h:70
+#: ../rules/base.xml.in.h:336 ../rules/base.extras.xml.in.h:71
msgid "pt"
msgstr "pt"
-#: ../rules/base.xml.in.h:337 ../rules/base.extras.xml.in.h:71
+#: ../rules/base.xml.in.h:337 ../rules/base.extras.xml.in.h:72
msgid "Portuguese (Brazil)"
msgstr "Portugalski (Brazylia)"
@@ -1288,16 +1288,16 @@ msgid "Portuguese (Brazil, Dvorak)"
msgstr "Portugalski (Brazylia, Dvoraka)"
#: ../rules/base.xml.in.h:340
-msgid "Portuguese (Brazil, nativo)"
-msgstr "Portugalski (Brazylia, nativo)"
+msgid "Portuguese (Brazil, Nativo)"
+msgstr "Portugalski (Brazylia, Nativo)"
#: ../rules/base.xml.in.h:341
-msgid "Portuguese (Brazil, nativo for US keyboards)"
-msgstr "Portugalski (Brazylia, nativo dla klawiatur US)"
+msgid "Portuguese (Brazil, Nativo for US keyboards)"
+msgstr "Portugalski (Brazylia, Nativo dla klawiatur US)"
#: ../rules/base.xml.in.h:342
-msgid "Portuguese (Brazil, nativo for Esperanto)"
-msgstr "Portugalski (Brazylia, nativo dla esperanto)"
+msgid "Esperanto (Brazil, Nativo)"
+msgstr "Esperanto (Brazylia, Nativo)"
#. Keyboard indicator for Bulgarian layouts
#: ../rules/base.xml.in.h:344
@@ -1451,2462 +1451,2482 @@ msgid "Tibetan (with ASCII numerals)"
msgstr "Tybetański (z liczbami ASCII)"
#: ../rules/base.xml.in.h:386
+msgid "ug"
+msgstr "ug"
+
+#: ../rules/base.xml.in.h:387
msgid "Uyghur"
msgstr "Ujgurski"
#. Keyboard indicator for Croatian layouts
-#: ../rules/base.xml.in.h:388
+#: ../rules/base.xml.in.h:389
msgid "hr"
msgstr "hr"
-#: ../rules/base.xml.in.h:389
+#: ../rules/base.xml.in.h:390
msgid "Croatian"
msgstr "Chorwacki"
-#: ../rules/base.xml.in.h:390
+#: ../rules/base.xml.in.h:391
msgid "Croatian (use guillemets for quotes)"
msgstr "Chorwacki (z użyciem cudzysłowów do cytowania)"
-#: ../rules/base.xml.in.h:391
+#: ../rules/base.xml.in.h:392
msgid "Croatian (use Croatian digraphs)"
msgstr "Chorwacki (z użyciem dwuznaków chorwackich)"
-#: ../rules/base.xml.in.h:392
+#: ../rules/base.xml.in.h:393
msgid "Croatian (US keyboard with Croatian digraphs)"
msgstr "Chorwacki (klawiatura US z dwuznakami chorwackimi)"
-#: ../rules/base.xml.in.h:393
+#: ../rules/base.xml.in.h:394
msgid "Croatian (US keyboard with Croatian letters)"
msgstr "Chorwacki (klawiatura US z literami chorwackimi)"
#. Keyboard indicator for Chech layouts
-#: ../rules/base.xml.in.h:395 ../rules/base.extras.xml.in.h:73
+#: ../rules/base.xml.in.h:396 ../rules/base.extras.xml.in.h:74
msgid "cs"
msgstr "cs"
-#: ../rules/base.xml.in.h:396 ../rules/base.extras.xml.in.h:74
+#: ../rules/base.xml.in.h:397 ../rules/base.extras.xml.in.h:75
msgid "Czech"
msgstr "Czeski"
-#: ../rules/base.xml.in.h:397
+#: ../rules/base.xml.in.h:398
msgid "Czech (with &lt;\\|&gt; key)"
msgstr "Czeski (z klawiszem &lt;\\|&gt;)"
-#: ../rules/base.xml.in.h:398
+#: ../rules/base.xml.in.h:399
msgid "Czech (qwerty)"
msgstr "Czeski (QWERTY)"
-#: ../rules/base.xml.in.h:399
+#: ../rules/base.xml.in.h:400
msgid "Czech (qwerty, extended Backslash)"
msgstr "Czeski (QWERTY, rozszerzony Backslash)"
-#: ../rules/base.xml.in.h:400
+#: ../rules/base.xml.in.h:401
msgid "Czech (UCW layout, accented letters only)"
msgstr "Czeski (układ UCW - tylko litery akcentowane)"
-#: ../rules/base.xml.in.h:401
+#: ../rules/base.xml.in.h:402
msgid "Czech (US Dvorak with CZ UCW support)"
msgstr "Czeski (US Dvoraka z obsługą CZ UCW)"
#. Keyboard indicator for Danish layouts
-#: ../rules/base.xml.in.h:403 ../rules/base.extras.xml.in.h:76
+#: ../rules/base.xml.in.h:404 ../rules/base.extras.xml.in.h:77
msgid "da"
msgstr "da"
-#: ../rules/base.xml.in.h:404 ../rules/base.extras.xml.in.h:77
+#: ../rules/base.xml.in.h:405 ../rules/base.extras.xml.in.h:78
msgid "Danish"
msgstr "Duński"
-#: ../rules/base.xml.in.h:405
+#: ../rules/base.xml.in.h:406
msgid "Danish (eliminate dead keys)"
msgstr "Duński (bez klawiszy akcentów)"
-#: ../rules/base.xml.in.h:406
+#: ../rules/base.xml.in.h:407
msgid "Danish (Macintosh)"
msgstr "Duński (Macintosh)"
-#: ../rules/base.xml.in.h:407
+#: ../rules/base.xml.in.h:408
msgid "Danish (Macintosh, eliminate dead keys)"
msgstr "Duński (Macintosh, bez klawiszy akcentów)"
-#: ../rules/base.xml.in.h:408
+#: ../rules/base.xml.in.h:409
msgid "Danish (Dvorak)"
msgstr "Duński (Dvoraka)"
#. Keyboard indicator for Dutch layouts
-#: ../rules/base.xml.in.h:410 ../rules/base.extras.xml.in.h:79
+#: ../rules/base.xml.in.h:411 ../rules/base.extras.xml.in.h:80
msgid "nl"
msgstr "nl"
-#: ../rules/base.xml.in.h:411 ../rules/base.extras.xml.in.h:80
+#: ../rules/base.xml.in.h:412 ../rules/base.extras.xml.in.h:81
msgid "Dutch"
msgstr "Holenderski"
-#: ../rules/base.xml.in.h:412
+#: ../rules/base.xml.in.h:413
msgid "Dutch (Sun dead keys)"
msgstr "Holenderski (klawisze akcentów Suna)"
-#: ../rules/base.xml.in.h:413
+#: ../rules/base.xml.in.h:414
msgid "Dutch (Macintosh)"
msgstr "Holenderski (Macintosh)"
-#: ../rules/base.xml.in.h:414
+#: ../rules/base.xml.in.h:415
msgid "Dutch (standard)"
msgstr "Holenderski (standardowy)"
#. Keyboard indicator for Dzongkha layouts
-#: ../rules/base.xml.in.h:416
+#: ../rules/base.xml.in.h:417
msgid "dz"
msgstr "dz"
-#: ../rules/base.xml.in.h:417
+#: ../rules/base.xml.in.h:418
msgid "Dzongkha"
msgstr "Dzongka"
#. Keyboard indicator for Estonian layouts
-#: ../rules/base.xml.in.h:419 ../rules/base.extras.xml.in.h:82
+#: ../rules/base.xml.in.h:420 ../rules/base.extras.xml.in.h:83
msgid "et"
msgstr "et"
-#: ../rules/base.xml.in.h:420 ../rules/base.extras.xml.in.h:83
+#: ../rules/base.xml.in.h:421 ../rules/base.extras.xml.in.h:84
msgid "Estonian"
msgstr "Estoński"
-#: ../rules/base.xml.in.h:421
+#: ../rules/base.xml.in.h:422
msgid "Estonian (eliminate dead keys)"
msgstr "Estoński (bez klawiszy akcentów)"
-#: ../rules/base.xml.in.h:422
+#: ../rules/base.xml.in.h:423
msgid "Estonian (Dvorak)"
msgstr "Estoński (Dvoraka)"
-#: ../rules/base.xml.in.h:423
+#: ../rules/base.xml.in.h:424
msgid "Estonian (US keyboard with Estonian letters)"
msgstr "Estoński (klawiatura US z literami estońskimi)"
-#: ../rules/base.xml.in.h:424 ../rules/base.extras.xml.in.h:16
+#: ../rules/base.xml.in.h:425 ../rules/base.extras.xml.in.h:16
msgid "Persian"
msgstr "Perski"
-#: ../rules/base.xml.in.h:425
+#: ../rules/base.xml.in.h:426
msgid "Persian (with Persian Keypad)"
msgstr "Perski (z perską klawiaturą numeryczną)"
#. Keyboard indicator for Kurdish layouts
-#: ../rules/base.xml.in.h:427
+#: ../rules/base.xml.in.h:428
msgid "ku"
msgstr "ku"
-#: ../rules/base.xml.in.h:428
+#: ../rules/base.xml.in.h:429
msgid "Kurdish (Iran, Latin Q)"
msgstr "Kurdyjski (Iran, łaciński Q)"
-#: ../rules/base.xml.in.h:429
+#: ../rules/base.xml.in.h:430
msgid "Kurdish (Iran, F)"
msgstr "Kurdyjski (Iran, F)"
-#: ../rules/base.xml.in.h:430
+#: ../rules/base.xml.in.h:431
msgid "Kurdish (Iran, Latin Alt-Q)"
msgstr "Kurdyjski (Iran, łaciński Alt-Q)"
-#: ../rules/base.xml.in.h:431
+#: ../rules/base.xml.in.h:432
msgid "Kurdish (Iran, Arabic-Latin)"
msgstr "Kurdyjski (Iran, arabsko-łaciński)"
-#: ../rules/base.xml.in.h:432
+#: ../rules/base.xml.in.h:433
msgid "Iraqi"
msgstr "Iracki"
-#: ../rules/base.xml.in.h:433
+#: ../rules/base.xml.in.h:434
msgid "Kurdish (Iraq, Latin Q)"
msgstr "Kurdyjski (Irak, łaciński Q)"
-#: ../rules/base.xml.in.h:434
+#: ../rules/base.xml.in.h:435
msgid "Kurdish (Iraq, F)"
msgstr "Kurdyjski (Irak, F)"
-#: ../rules/base.xml.in.h:435
+#: ../rules/base.xml.in.h:436
msgid "Kurdish (Iraq, Latin Alt-Q)"
msgstr "Kurdyjski (Irak, łaciński Alt-Q)"
-#: ../rules/base.xml.in.h:436
+#: ../rules/base.xml.in.h:437
msgid "Kurdish (Iraq, Arabic-Latin)"
msgstr "Kurdyjski (Irak, arabsko-łaciński)"
#. Keyboard indicator for Faroese layouts
-#: ../rules/base.xml.in.h:438
+#: ../rules/base.xml.in.h:439
msgid "fo"
msgstr "fo"
-#: ../rules/base.xml.in.h:439
+#: ../rules/base.xml.in.h:440
msgid "Faroese"
msgstr "Farerski"
-#: ../rules/base.xml.in.h:440
+#: ../rules/base.xml.in.h:441
msgid "Faroese (eliminate dead keys)"
msgstr "Farerski (bez klawiszy akcentów)"
#. Keyboard indicator for Finnish layouts
-#: ../rules/base.xml.in.h:442 ../rules/base.extras.xml.in.h:85
+#: ../rules/base.xml.in.h:443 ../rules/base.extras.xml.in.h:86
msgid "fi"
msgstr "fi"
-#: ../rules/base.xml.in.h:443 ../rules/base.extras.xml.in.h:86
+#: ../rules/base.xml.in.h:444 ../rules/base.extras.xml.in.h:87
msgid "Finnish"
msgstr "Fiński"
-#: ../rules/base.xml.in.h:444
+#: ../rules/base.xml.in.h:445
msgid "Finnish (classic)"
msgstr "Fiński (klasyczny)"
-#: ../rules/base.xml.in.h:445
+#: ../rules/base.xml.in.h:446
msgid "Finnish (classic, eliminate dead keys)"
msgstr "Fiński (klasyczny, bez klawiszy akcentów)"
-#: ../rules/base.xml.in.h:446
+#: ../rules/base.xml.in.h:447
msgid "Northern Saami (Finland)"
msgstr "Północnolapoński (Finlandia)"
-#: ../rules/base.xml.in.h:447
+#: ../rules/base.xml.in.h:448
msgid "Finnish (Macintosh)"
msgstr "Fiński (Macintosh)"
-#: ../rules/base.xml.in.h:448 ../rules/base.extras.xml.in.h:88
+#: ../rules/base.xml.in.h:449 ../rules/base.extras.xml.in.h:89
msgid "French"
msgstr "Francuski"
-#: ../rules/base.xml.in.h:449
+#: ../rules/base.xml.in.h:450
msgid "French (eliminate dead keys)"
msgstr "Francuski (bez klawiszy akcentów)"
-#: ../rules/base.xml.in.h:450
+#: ../rules/base.xml.in.h:451
msgid "French (Sun dead keys)"
msgstr "Francuski (klawisze akcentów Suna)"
-#: ../rules/base.xml.in.h:451
+#: ../rules/base.xml.in.h:452
msgid "French (alternative)"
msgstr "Francuski (alternatywny)"
-#: ../rules/base.xml.in.h:452
+#: ../rules/base.xml.in.h:453
msgid "French (alternative, Latin-9 only)"
msgstr "Francuski (alternatywny, tylko Latin-9)"
-#: ../rules/base.xml.in.h:453
+#: ../rules/base.xml.in.h:454
msgid "French (alternative, eliminate dead keys)"
msgstr "Francuski (alternatywny, bez klawiszy akcentów)"
-#: ../rules/base.xml.in.h:454
+#: ../rules/base.xml.in.h:455
msgid "French (alternative, Sun dead keys)"
msgstr "Francuski (alternatywny, klawisze akcentów Suna)"
-#: ../rules/base.xml.in.h:455
+#: ../rules/base.xml.in.h:456
msgid "French (legacy, alternative)"
msgstr "Francuski (stary, alternatywny)"
-#: ../rules/base.xml.in.h:456
+#: ../rules/base.xml.in.h:457
msgid "French (legacy, alternative, eliminate dead keys)"
msgstr "Francuski (stary alternatywny, bez klawiszy akcentów)"
-#: ../rules/base.xml.in.h:457
+#: ../rules/base.xml.in.h:458
msgid "French (legacy, alternative, Sun dead keys)"
msgstr "Francuski (stary alternatywny, klawisze akcentów Suna)"
-#: ../rules/base.xml.in.h:458
+#: ../rules/base.xml.in.h:459
msgid "French (Bepo, ergonomic, Dvorak way)"
msgstr "Francuski (Bepo, ergonomiczny, w stylu Dvoraka)"
-#: ../rules/base.xml.in.h:459
+#: ../rules/base.xml.in.h:460
msgid "French (Bepo, ergonomic, Dvorak way, Latin-9 only)"
msgstr "Francuski (Bepo, ergonomiczny, w stylu Dvoraka, tylko Latin-9)"
-#: ../rules/base.xml.in.h:460
+#: ../rules/base.xml.in.h:461
msgid "French (Dvorak)"
msgstr "Francuski (Dvoraka)"
-#: ../rules/base.xml.in.h:461
+#: ../rules/base.xml.in.h:462
msgid "French (Macintosh)"
msgstr "Francuski (Macintosh)"
-#: ../rules/base.xml.in.h:462
+#: ../rules/base.xml.in.h:463
msgid "French (Breton)"
msgstr "Francuski (bretoński)"
-#: ../rules/base.xml.in.h:463
+#: ../rules/base.xml.in.h:464
msgid "Occitan"
msgstr "Okcytański"
-#: ../rules/base.xml.in.h:464
+#: ../rules/base.xml.in.h:465
msgid "Georgian (France, AZERTY Tskapo)"
msgstr "Gruziński (Francja, AZERTY Tskapo)"
-#: ../rules/base.xml.in.h:465
+#: ../rules/base.xml.in.h:466
msgid "English (Ghana)"
msgstr "Angielski (Ghana)"
-#: ../rules/base.xml.in.h:466
+#: ../rules/base.xml.in.h:467
msgid "English (Ghana, multilingual)"
msgstr "Angielski (Ghana, wielojęzyczny)"
#. Keyboard indicator for Akan layouts
-#: ../rules/base.xml.in.h:468
+#: ../rules/base.xml.in.h:469
msgid "ak"
msgstr "ak"
-#: ../rules/base.xml.in.h:469
+#: ../rules/base.xml.in.h:470
msgid "Akan"
msgstr "Akan"
#. Keyboard indicator for Ewe layouts
-#: ../rules/base.xml.in.h:471
+#: ../rules/base.xml.in.h:472
msgid "ee"
msgstr "ee"
-#: ../rules/base.xml.in.h:472
+#: ../rules/base.xml.in.h:473
msgid "Ewe"
msgstr "Ewe"
#. Keyboard indicator for Fula layouts
-#: ../rules/base.xml.in.h:474
+#: ../rules/base.xml.in.h:475
msgid "ff"
msgstr "ff"
-#: ../rules/base.xml.in.h:475
+#: ../rules/base.xml.in.h:476
msgid "Fula"
msgstr "Fulani"
#. Keyboard indicator for Ga layouts
-#: ../rules/base.xml.in.h:477
+#: ../rules/base.xml.in.h:478
msgid "gaa"
msgstr "gaa"
-#: ../rules/base.xml.in.h:478
+#: ../rules/base.xml.in.h:479
msgid "Ga"
msgstr "Ga"
#. Keyboard indicator for Hausa layouts
-#: ../rules/base.xml.in.h:480
+#: ../rules/base.xml.in.h:481
msgid "ha"
msgstr "ha"
-#: ../rules/base.xml.in.h:481
+#: ../rules/base.xml.in.h:482
msgid "Hausa"
msgstr "Hausa"
#. Keyboard indicator for Avatime layouts
-#: ../rules/base.xml.in.h:483
+#: ../rules/base.xml.in.h:484
msgid "avn"
msgstr "avn"
-#: ../rules/base.xml.in.h:484
+#: ../rules/base.xml.in.h:485
msgid "Avatime"
msgstr "Avatime"
-#: ../rules/base.xml.in.h:485
+#: ../rules/base.xml.in.h:486
msgid "English (Ghana, GILLBT)"
msgstr "Angielski (Ghana, GILLBT)"
-#: ../rules/base.xml.in.h:486
+#: ../rules/base.xml.in.h:487
msgid "French (Guinea)"
msgstr "Francuski (Gwinea)"
#. Keyboard indicator for Georgian layouts
-#: ../rules/base.xml.in.h:488
+#: ../rules/base.xml.in.h:489
msgid "ka"
msgstr "ka"
-#: ../rules/base.xml.in.h:489
+#: ../rules/base.xml.in.h:490
msgid "Georgian"
msgstr "Gruziński"
-#: ../rules/base.xml.in.h:490
+#: ../rules/base.xml.in.h:491
msgid "Georgian (ergonomic)"
msgstr "Gruziński (ergonomiczny)"
-#: ../rules/base.xml.in.h:491
+#: ../rules/base.xml.in.h:492
msgid "Georgian (MESS)"
msgstr "Gruziński (MESS)"
-#: ../rules/base.xml.in.h:492
+#: ../rules/base.xml.in.h:493
msgid "Russian (Georgia)"
msgstr "Rosyjski (gruziński)"
-#: ../rules/base.xml.in.h:493
+#: ../rules/base.xml.in.h:494
msgid "Ossetian (Georgia)"
msgstr "Osetyjski (Gruzja)"
-#: ../rules/base.xml.in.h:494 ../rules/base.extras.xml.in.h:11
+#: ../rules/base.xml.in.h:495 ../rules/base.extras.xml.in.h:11
msgid "German"
msgstr "Niemiecki"
-#: ../rules/base.xml.in.h:495
+#: ../rules/base.xml.in.h:496
msgid "German (dead acute)"
msgstr "Niemiecki (akcent ostry)"
-#: ../rules/base.xml.in.h:496
+#: ../rules/base.xml.in.h:497
msgid "German (dead grave acute)"
msgstr "Niemiecki (akcent gravis)"
-#: ../rules/base.xml.in.h:497
+#: ../rules/base.xml.in.h:498
msgid "German (eliminate dead keys)"
msgstr "Niemiecki (bez klawiszy akcentów)"
-#: ../rules/base.xml.in.h:498
+#: ../rules/base.xml.in.h:499
msgid "German (T3)"
msgstr "Niemiecki (T3)"
-#: ../rules/base.xml.in.h:499
+#: ../rules/base.xml.in.h:500
msgid "Romanian (Germany)"
msgstr "Rumuński (Niemcy)"
-#: ../rules/base.xml.in.h:500
+#: ../rules/base.xml.in.h:501
msgid "Romanian (Germany, eliminate dead keys)"
msgstr "Rumuński (Niemcy, bez klawiszy akcentów)"
-#: ../rules/base.xml.in.h:501
+#: ../rules/base.xml.in.h:502
msgid "German (Dvorak)"
msgstr "Niemiecki (Dvoraka)"
-#: ../rules/base.xml.in.h:502
+#: ../rules/base.xml.in.h:503
msgid "German (Sun dead keys)"
msgstr "Niemiecki (klawisze akcentów Suna)"
-#: ../rules/base.xml.in.h:503
+#: ../rules/base.xml.in.h:504
msgid "German (Neo 2)"
msgstr "Niemiecki (Neo 2)"
-#: ../rules/base.xml.in.h:504
+#: ../rules/base.xml.in.h:505
msgid "German (Macintosh)"
msgstr "Niemiecki (Macintosh)"
-#: ../rules/base.xml.in.h:505
+#: ../rules/base.xml.in.h:506
msgid "German (Macintosh, eliminate dead keys)"
msgstr "Niemiecki (Macintosh, bez klawiszy akcentów)"
-#: ../rules/base.xml.in.h:506
+#: ../rules/base.xml.in.h:507
msgid "Lower Sorbian"
msgstr "Dolnołużycki"
-#: ../rules/base.xml.in.h:507
+#: ../rules/base.xml.in.h:508
msgid "Lower Sorbian (qwertz)"
msgstr "Dolnołużycki (QWERTZ)"
-#: ../rules/base.xml.in.h:508
+#: ../rules/base.xml.in.h:509
msgid "German (qwerty)"
msgstr "Niemiecki (QWERTY)"
-#: ../rules/base.xml.in.h:509
+#: ../rules/base.xml.in.h:510
msgid "Russian (Germany, phonetic)"
msgstr "Rosyjski (Niemcy, fonetyczny)"
-#: ../rules/base.xml.in.h:510
+#: ../rules/base.xml.in.h:511
msgid "German (legacy)"
msgstr "Niemiecki (stary)"
#. Keyboard indicator for Greek layouts
-#: ../rules/base.xml.in.h:512 ../rules/base.extras.xml.in.h:90
+#: ../rules/base.xml.in.h:513 ../rules/base.extras.xml.in.h:91
msgid "gr"
msgstr "gr"
-#: ../rules/base.xml.in.h:513 ../rules/base.extras.xml.in.h:91
+#: ../rules/base.xml.in.h:514 ../rules/base.extras.xml.in.h:92
msgid "Greek"
msgstr "Grecki"
-#: ../rules/base.xml.in.h:514
+#: ../rules/base.xml.in.h:515
msgid "Greek (simple)"
msgstr "Grecki (prosty)"
-#: ../rules/base.xml.in.h:515
+#: ../rules/base.xml.in.h:516
msgid "Greek (extended)"
msgstr "Grecki (rozszerzony)"
-#: ../rules/base.xml.in.h:516
+#: ../rules/base.xml.in.h:517
msgid "Greek (eliminate dead keys)"
msgstr "Grecki (bez klawiszy akcentów)"
-#: ../rules/base.xml.in.h:517
+#: ../rules/base.xml.in.h:518
msgid "Greek (polytonic)"
msgstr "Grecki (politoniczny)"
#. Keyboard indicator for Hungarian layouts
-#: ../rules/base.xml.in.h:519
+#: ../rules/base.xml.in.h:520
msgid "hu"
msgstr "hu"
-#: ../rules/base.xml.in.h:520
+#: ../rules/base.xml.in.h:521
msgid "Hungarian"
msgstr "Węgierski"
-#: ../rules/base.xml.in.h:521
+#: ../rules/base.xml.in.h:522
msgid "Hungarian (standard)"
msgstr "Węgierski (standardowy)"
-#: ../rules/base.xml.in.h:522
+#: ../rules/base.xml.in.h:523
msgid "Hungarian (eliminate dead keys)"
msgstr "Węgierski (bez klawiszy akcentów)"
-#: ../rules/base.xml.in.h:523
+#: ../rules/base.xml.in.h:524
msgid "Hungarian (qwerty)"
msgstr "Węgierski (QWERTY)"
-#: ../rules/base.xml.in.h:524
+#: ../rules/base.xml.in.h:525
msgid "Hungarian (101/qwertz/comma/dead keys)"
msgstr "Węgierski (101/QWERTZ/przecinek/klawisze akcentów)"
-#: ../rules/base.xml.in.h:525
+#: ../rules/base.xml.in.h:526
msgid "Hungarian (101/qwertz/comma/eliminate dead keys)"
msgstr "Węgierski (101/QWERTZ/przecinek/bez klawiszy akcentów)"
-#: ../rules/base.xml.in.h:526
+#: ../rules/base.xml.in.h:527
msgid "Hungarian (101/qwertz/dot/dead keys)"
msgstr "Węgierski (101/QWERTZ/kropka/klawisze akcentów)"
-#: ../rules/base.xml.in.h:527
+#: ../rules/base.xml.in.h:528
msgid "Hungarian (101/qwertz/dot/eliminate dead keys)"
msgstr "Węgierski (101/QWERTZ/kropka/bez klawiszy akcentów)"
-#: ../rules/base.xml.in.h:528
+#: ../rules/base.xml.in.h:529
msgid "Hungarian (101/qwerty/comma/dead keys)"
msgstr "Węgierski (101/QWERTY/przecinek/klawisze akcentów)"
-#: ../rules/base.xml.in.h:529
+#: ../rules/base.xml.in.h:530
msgid "Hungarian (101/qwerty/comma/eliminate dead keys)"
msgstr "Węgierski (101/QWERTY/przecinek/bez klawiszy akcentów)"
-#: ../rules/base.xml.in.h:530
+#: ../rules/base.xml.in.h:531
msgid "Hungarian (101/qwerty/dot/dead keys)"
msgstr "Węgierski (101/QWERTY/kropka/klawisze akcentów)"
-#: ../rules/base.xml.in.h:531
+#: ../rules/base.xml.in.h:532
msgid "Hungarian (101/qwerty/dot/eliminate dead keys)"
msgstr "Węgierski (101/QWERTY/kropka/bez klawiszy akcentów)"
-#: ../rules/base.xml.in.h:532
+#: ../rules/base.xml.in.h:533
msgid "Hungarian (102/qwertz/comma/dead keys)"
msgstr "Węgierski (102/QWERTZ/przecinek/klawisze akcentów)"
-#: ../rules/base.xml.in.h:533
+#: ../rules/base.xml.in.h:534
msgid "Hungarian (102/qwertz/comma/eliminate dead keys)"
msgstr "Węgierski (102/QWERTZ/przecinek/bez klawiszy akcentów)"
-#: ../rules/base.xml.in.h:534
+#: ../rules/base.xml.in.h:535
msgid "Hungarian (102/qwertz/dot/dead keys)"
msgstr "Węgierski (102/QWERTZ/kropka/klawisze akcentów)"
-#: ../rules/base.xml.in.h:535
+#: ../rules/base.xml.in.h:536
msgid "Hungarian (102/qwertz/dot/eliminate dead keys)"
msgstr "Węgierski (102/QWERTZ/kropka/bez klawiszy akcentów)"
-#: ../rules/base.xml.in.h:536
+#: ../rules/base.xml.in.h:537
msgid "Hungarian (102/qwerty/comma/dead keys)"
msgstr "Węgierski (102/QWERTY/przecinek/klawisze akcentów)"
-#: ../rules/base.xml.in.h:537
+#: ../rules/base.xml.in.h:538
msgid "Hungarian (102/qwerty/comma/eliminate dead keys)"
msgstr "Węgierski (102/QWERTY/przecinek/bez klawiszy akcentów)"
-#: ../rules/base.xml.in.h:538
+#: ../rules/base.xml.in.h:539
msgid "Hungarian (102/qwerty/dot/dead keys)"
msgstr "Węgierski (102/QWERTY/kropka/klawisze akcentów)"
-#: ../rules/base.xml.in.h:539
+#: ../rules/base.xml.in.h:540
msgid "Hungarian (102/qwerty/dot/eliminate dead keys)"
msgstr "Węgierski (102/QWERTY/kropka/bez klawiszy akcentów)"
#. Keyboard indicator for Icelandic layouts
-#: ../rules/base.xml.in.h:541
+#: ../rules/base.xml.in.h:542
msgid "is"
msgstr "is"
-#: ../rules/base.xml.in.h:542
+#: ../rules/base.xml.in.h:543
msgid "Icelandic"
msgstr "Islandzki"
-#: ../rules/base.xml.in.h:543
+#: ../rules/base.xml.in.h:544
msgid "Icelandic (Sun dead keys)"
msgstr "Islandzki (klawisze akcentów Suna)"
-#: ../rules/base.xml.in.h:544
+#: ../rules/base.xml.in.h:545
msgid "Icelandic (eliminate dead keys)"
msgstr "Islandzki (bez klawiszy akcentów)"
-#: ../rules/base.xml.in.h:545
+#: ../rules/base.xml.in.h:546
msgid "Icelandic (Macintosh)"
msgstr "Islandzki (Macintosh)"
-#: ../rules/base.xml.in.h:546
+#: ../rules/base.xml.in.h:547
msgid "Icelandic (Dvorak)"
msgstr "Islandzki (Dvoraka)"
#. Keyboard indicator for Hebrew layouts
-#: ../rules/base.xml.in.h:548 ../rules/base.extras.xml.in.h:61
+#: ../rules/base.xml.in.h:549 ../rules/base.extras.xml.in.h:62
msgid "he"
msgstr "he"
-#: ../rules/base.xml.in.h:549 ../rules/base.extras.xml.in.h:62
+#: ../rules/base.xml.in.h:550 ../rules/base.extras.xml.in.h:63
msgid "Hebrew"
msgstr "Hebrajski"
-#: ../rules/base.xml.in.h:550
+#: ../rules/base.xml.in.h:551
msgid "Hebrew (lyx)"
msgstr "Hebrajski (lyx)"
-#: ../rules/base.xml.in.h:551
+#: ../rules/base.xml.in.h:552
msgid "Hebrew (phonetic)"
msgstr "Hebrajski (fonetyczny)"
-#: ../rules/base.xml.in.h:552
+#: ../rules/base.xml.in.h:553
msgid "Hebrew (Biblical, Tiro)"
msgstr "Hebrajski (biblijny, Tiro)"
#. Keyboard indicator for Italian layouts
-#: ../rules/base.xml.in.h:554 ../rules/base.extras.xml.in.h:93
+#: ../rules/base.xml.in.h:555 ../rules/base.extras.xml.in.h:94
msgid "it"
msgstr "it"
-#: ../rules/base.xml.in.h:555 ../rules/base.extras.xml.in.h:94
+#: ../rules/base.xml.in.h:556 ../rules/base.extras.xml.in.h:95
msgid "Italian"
msgstr "Włoski"
-#: ../rules/base.xml.in.h:556
+#: ../rules/base.xml.in.h:557
msgid "Italian (eliminate dead keys)"
msgstr "Włoski (bez klawiszy akcentów)"
-#: ../rules/base.xml.in.h:557
+#: ../rules/base.xml.in.h:558
msgid "Italian (Macintosh)"
msgstr "Włoski (Macintosh)"
-#: ../rules/base.xml.in.h:558
+#: ../rules/base.xml.in.h:559
msgid "Italian (US keyboard with Italian letters)"
msgstr "Włoski (klawiatura US z literami włoskimi)"
-#: ../rules/base.xml.in.h:559
+#: ../rules/base.xml.in.h:560
msgid "Georgian (Italy)"
msgstr "Gruziński (Włochy)"
-#: ../rules/base.xml.in.h:560
+#: ../rules/base.xml.in.h:561
msgid "Italian (IBM 142)"
msgstr "Włoski (IBM 142)"
#. Keyboard indicator for Japanese layouts
-#: ../rules/base.xml.in.h:562 ../rules/base.extras.xml.in.h:96
+#: ../rules/base.xml.in.h:563 ../rules/base.extras.xml.in.h:97
msgid "ja"
msgstr "ja"
-#: ../rules/base.xml.in.h:563 ../rules/base.extras.xml.in.h:97
+#: ../rules/base.xml.in.h:564 ../rules/base.extras.xml.in.h:98
msgid "Japanese"
msgstr "Japoński"
-#: ../rules/base.xml.in.h:564
+#: ../rules/base.xml.in.h:565
msgid "Japanese (Kana)"
msgstr "Japoński (Kana)"
-#: ../rules/base.xml.in.h:565
+#: ../rules/base.xml.in.h:566
msgid "Japanese (Kana 86)"
msgstr "Japoński (Kana 86)"
-#: ../rules/base.xml.in.h:566
+#: ../rules/base.xml.in.h:567
msgid "Japanese (OADG 109A)"
msgstr "Japoński (OADG 109A)"
-#: ../rules/base.xml.in.h:567
+#: ../rules/base.xml.in.h:568
msgid "Japanese (Macintosh)"
msgstr "Japoński (Macintosh)"
-#: ../rules/base.xml.in.h:568
+#: ../rules/base.xml.in.h:569
msgid "Japanese (Dvorak)"
msgstr "Japoński (Dvoraka)"
#. Keyboard indicator for Kikuyu layouts
-#: ../rules/base.xml.in.h:570
+#: ../rules/base.xml.in.h:571
msgid "ki"
msgstr "ki"
-#: ../rules/base.xml.in.h:571
+#: ../rules/base.xml.in.h:572
msgid "Kyrgyz"
msgstr "Kirgiski"
-#: ../rules/base.xml.in.h:572
+#: ../rules/base.xml.in.h:573
msgid "Kyrgyz (phonetic)"
msgstr "Kirgiski (fonetyczny)"
#. Keyboard indicator for Khmer layouts
-#: ../rules/base.xml.in.h:574
+#: ../rules/base.xml.in.h:575
msgid "km"
msgstr "km"
-#: ../rules/base.xml.in.h:575
+#: ../rules/base.xml.in.h:576
msgid "Khmer (Cambodia)"
msgstr "Khmerski (Kambodża)"
#. Keyboard indicator for Kazakh layouts
-#: ../rules/base.xml.in.h:577
+#: ../rules/base.xml.in.h:578
msgid "kk"
msgstr "kk"
-#: ../rules/base.xml.in.h:578
+#: ../rules/base.xml.in.h:579
msgid "Kazakh"
msgstr "Kazaski"
-#: ../rules/base.xml.in.h:579
+#: ../rules/base.xml.in.h:580
msgid "Russian (Kazakhstan, with Kazakh)"
msgstr "Rosyjski (Kazahstan, z kazaskim)"
-#: ../rules/base.xml.in.h:580
+#: ../rules/base.xml.in.h:581
msgid "Kazakh (with Russian)"
msgstr "Kazaski (z rosyjskim)"
#. Keyboard indicator for Lao layouts
-#: ../rules/base.xml.in.h:582
+#: ../rules/base.xml.in.h:583
msgid "lo"
msgstr "lo"
-#: ../rules/base.xml.in.h:583
+#: ../rules/base.xml.in.h:584
msgid "Lao"
msgstr "Laotański"
-#: ../rules/base.xml.in.h:584
+#: ../rules/base.xml.in.h:585
msgid "Lao (STEA proposed standard layout)"
msgstr "Laotański (proponowany układ standardowy STEA)"
#. Keyboard indicator for Spanish layouts
-#: ../rules/base.xml.in.h:586 ../rules/base.extras.xml.in.h:109
+#: ../rules/base.xml.in.h:587 ../rules/base.extras.xml.in.h:110
msgid "es"
msgstr "es"
-#: ../rules/base.xml.in.h:587
+#: ../rules/base.xml.in.h:588
msgid "Spanish (Latin American)"
msgstr "Hiszpański (Ameryka Łacińska)"
-#: ../rules/base.xml.in.h:588
+#: ../rules/base.xml.in.h:589
msgid "Spanish (Latin American, eliminate dead keys)"
msgstr "Hiszpański (Ameryka Łacińska, bez klawiszy akcentów)"
-#: ../rules/base.xml.in.h:589
+#: ../rules/base.xml.in.h:590
msgid "Spanish (Latin American, include dead tilde)"
msgstr "Hiszpański (Ameryka Łacińska, ze znakiem tyldy)"
-#: ../rules/base.xml.in.h:590
+#: ../rules/base.xml.in.h:591
msgid "Spanish (Latin American, Sun dead keys)"
msgstr "Hiszpański (Ameryka Łacińska, klawisze akcentów Suna)"
#. Keyboard indicator for Lithuanian layouts
-#: ../rules/base.xml.in.h:592 ../rules/base.extras.xml.in.h:18
+#: ../rules/base.xml.in.h:593 ../rules/base.extras.xml.in.h:18
msgid "lt"
msgstr "lt"
-#: ../rules/base.xml.in.h:593 ../rules/base.extras.xml.in.h:19
+#: ../rules/base.xml.in.h:594 ../rules/base.extras.xml.in.h:19
msgid "Lithuanian"
msgstr "Litewski"
-#: ../rules/base.xml.in.h:594
+#: ../rules/base.xml.in.h:595
msgid "Lithuanian (standard)"
msgstr "Litewski (standardowy)"
-#: ../rules/base.xml.in.h:595
+#: ../rules/base.xml.in.h:596
msgid "Lithuanian (US keyboard with Lithuanian letters)"
msgstr "Litewski (klawiatura US z literami litewskimi)"
-#: ../rules/base.xml.in.h:596
+#: ../rules/base.xml.in.h:597
msgid "Lithuanian (IBM LST 1205-92)"
msgstr "Litewski (IBM LST 1205-92)"
-#: ../rules/base.xml.in.h:597
+#: ../rules/base.xml.in.h:598
msgid "Lithuanian (LEKP)"
msgstr "Litewski (LEKP)"
-#: ../rules/base.xml.in.h:598
+#: ../rules/base.xml.in.h:599
msgid "Lithuanian (LEKPa)"
msgstr "Litewski (LEKPa)"
#. Keyboard indicator for Latvian layouts
-#: ../rules/base.xml.in.h:600 ../rules/base.extras.xml.in.h:22
+#: ../rules/base.xml.in.h:601 ../rules/base.extras.xml.in.h:22
msgid "lv"
msgstr "lv"
-#: ../rules/base.xml.in.h:601 ../rules/base.extras.xml.in.h:23
+#: ../rules/base.xml.in.h:602 ../rules/base.extras.xml.in.h:23
msgid "Latvian"
msgstr "Łotewski"
-#: ../rules/base.xml.in.h:602
+#: ../rules/base.xml.in.h:603
msgid "Latvian (apostrophe variant)"
msgstr "Łotewski (wariant z apostrofem)"
-#: ../rules/base.xml.in.h:603
+#: ../rules/base.xml.in.h:604
msgid "Latvian (tilde variant)"
msgstr "Łotewski (wariant z tyldą)"
-#: ../rules/base.xml.in.h:604
+#: ../rules/base.xml.in.h:605
msgid "Latvian (F variant)"
msgstr "Łotewski (wariant F)"
-#: ../rules/base.xml.in.h:605
+#: ../rules/base.xml.in.h:606
msgid "Latvian (modern)"
msgstr "Łotewski (współczesny)"
-#: ../rules/base.xml.in.h:606
+#: ../rules/base.xml.in.h:607
msgid "Latvian (ergonomic, ŪGJRMV)"
msgstr "Łotewski (ergonomiczny ŪGJRMV)"
-#: ../rules/base.xml.in.h:607
+#: ../rules/base.xml.in.h:608
msgid "Latvian (adapted)"
msgstr "Łotewski (zaadaptowany)"
#. Keyboard indicator for Maori layouts
-#: ../rules/base.xml.in.h:609
+#: ../rules/base.xml.in.h:610
msgid "mi"
msgstr "mi"
-#: ../rules/base.xml.in.h:610
+#: ../rules/base.xml.in.h:611
msgid "Maori"
msgstr "Maoryski"
#. Keyboard indicator for Serbian layouts
-#: ../rules/base.xml.in.h:612 ../rules/base.extras.xml.in.h:51
+#: ../rules/base.xml.in.h:613 ../rules/base.extras.xml.in.h:52
msgid "sr"
msgstr "sr"
-#: ../rules/base.xml.in.h:613
+#: ../rules/base.xml.in.h:614
msgid "Montenegrin"
msgstr "Czarnogórski"
-#: ../rules/base.xml.in.h:614
+#: ../rules/base.xml.in.h:615
msgid "Montenegrin (Cyrillic)"
msgstr "Czarnogórski (cyrylicki)"
-#: ../rules/base.xml.in.h:615
+#: ../rules/base.xml.in.h:616
msgid "Montenegrin (Cyrillic, Z and ZHE swapped)"
msgstr "Czarnogórski (cyrylicki, zamienione Z i Ż)"
-#: ../rules/base.xml.in.h:616
+#: ../rules/base.xml.in.h:617
msgid "Montenegrin (Latin Unicode)"
msgstr "Czarnogórski (łaciński unikodowy)"
-#: ../rules/base.xml.in.h:617
+#: ../rules/base.xml.in.h:618
msgid "Montenegrin (Latin qwerty)"
msgstr "Czarnogórski (łaciński QWERTY)"
-#: ../rules/base.xml.in.h:618
+#: ../rules/base.xml.in.h:619
msgid "Montenegrin (Latin Unicode qwerty)"
msgstr "Czarnogórski (łaciński unikodowy QWERTY)"
-#: ../rules/base.xml.in.h:619
+#: ../rules/base.xml.in.h:620
msgid "Montenegrin (Cyrillic with guillemets)"
msgstr "Czarnogórski (cyrylicki z cudzysłowami)"
-#: ../rules/base.xml.in.h:620
+#: ../rules/base.xml.in.h:621
msgid "Montenegrin (Latin with guillemets)"
msgstr "Czarnogórski (łaciński z cudzysłowami)"
#. Keyboard indicator for Macedonian layouts
-#: ../rules/base.xml.in.h:622
+#: ../rules/base.xml.in.h:623
msgid "mk"
msgstr "mk"
-#: ../rules/base.xml.in.h:623
+#: ../rules/base.xml.in.h:624
msgid "Macedonian"
msgstr "Macedoński"
-#: ../rules/base.xml.in.h:624
+#: ../rules/base.xml.in.h:625
msgid "Macedonian (eliminate dead keys)"
msgstr "Macedoński (bez klawiszy akcentów)"
#. Keyboard indicator for Maltese layouts
-#: ../rules/base.xml.in.h:626
+#: ../rules/base.xml.in.h:627
msgid "mt"
msgstr "mt"
-#: ../rules/base.xml.in.h:627
+#: ../rules/base.xml.in.h:628
msgid "Maltese"
msgstr "Maltański"
-#: ../rules/base.xml.in.h:628
+#: ../rules/base.xml.in.h:629
msgid "Maltese (with US layout)"
msgstr "Maltański (z układem US)"
#. Keyboard indicator for Mongolian layouts
-#: ../rules/base.xml.in.h:630
+#: ../rules/base.xml.in.h:631
msgid "mn"
msgstr "mn"
-#: ../rules/base.xml.in.h:631
+#: ../rules/base.xml.in.h:632
msgid "Mongolian"
msgstr "Mongolski"
#. Keyboard indicator for Norwegian layouts
-#: ../rules/base.xml.in.h:633 ../rules/base.extras.xml.in.h:101
+#: ../rules/base.xml.in.h:634 ../rules/base.extras.xml.in.h:102
msgid "no"
msgstr "no"
-#: ../rules/base.xml.in.h:634 ../rules/base.extras.xml.in.h:102
+#: ../rules/base.xml.in.h:635 ../rules/base.extras.xml.in.h:103
msgid "Norwegian"
msgstr "Norweski"
-#: ../rules/base.xml.in.h:635
+#: ../rules/base.xml.in.h:636
msgid "Norwegian (eliminate dead keys)"
msgstr "Norweski (bez klawiszy akcentów)"
-#: ../rules/base.xml.in.h:636
+#: ../rules/base.xml.in.h:637
msgid "Norwegian (Dvorak)"
msgstr "Norweski (Dvoraka)"
-#: ../rules/base.xml.in.h:637
+#: ../rules/base.xml.in.h:638
msgid "Northern Saami (Norway)"
msgstr "Północnolapoński (Norwegia)"
-#: ../rules/base.xml.in.h:638
+#: ../rules/base.xml.in.h:639
msgid "Northern Saami (Norway, eliminate dead keys)"
msgstr "Północnolapoński (Norwegia, bez klawiszy akcentów)"
-#: ../rules/base.xml.in.h:639
+#: ../rules/base.xml.in.h:640
msgid "Norwegian (Macintosh)"
msgstr "Norweski (Macintosh)"
-#: ../rules/base.xml.in.h:640
+#: ../rules/base.xml.in.h:641
msgid "Norwegian (Macintosh, eliminate dead keys)"
msgstr "Norweski (Macintosh, bez klawiszy akcentów)"
-#: ../rules/base.xml.in.h:641
+#: ../rules/base.xml.in.h:642
msgid "Norwegian (Colemak)"
msgstr "Norweski (Colemak)"
#. Keyboard indicator for Polish layouts
-#: ../rules/base.xml.in.h:643 ../rules/base.extras.xml.in.h:40
+#: ../rules/base.xml.in.h:644 ../rules/base.extras.xml.in.h:41
msgid "pl"
msgstr "pl"
-#: ../rules/base.xml.in.h:644 ../rules/base.extras.xml.in.h:41
+#: ../rules/base.xml.in.h:645 ../rules/base.extras.xml.in.h:42
msgid "Polish"
msgstr "Polski"
-#: ../rules/base.xml.in.h:645
+#: ../rules/base.xml.in.h:646
msgid "Polish (legacy)"
msgstr "Polski (stary)"
-#: ../rules/base.xml.in.h:646
+#: ../rules/base.xml.in.h:647
msgid "Polish (qwertz)"
msgstr "Polski (QWERTZ)"
-#: ../rules/base.xml.in.h:647
+#: ../rules/base.xml.in.h:648
msgid "Polish (Dvorak)"
msgstr "Polski (Dvoraka)"
-#: ../rules/base.xml.in.h:648
+#: ../rules/base.xml.in.h:649
msgid "Polish (Dvorak, Polish quotes on quotemark key)"
msgstr "Polski (Dvoraka, polskie cudzysłowy pod klawiszem cudzysłowu)"
-#: ../rules/base.xml.in.h:649
+#: ../rules/base.xml.in.h:650
msgid "Polish (Dvorak, Polish quotes on key 1)"
msgstr "Polski (Dvoraka, polskie cudzysłowy pod klawiszem 1)"
-#: ../rules/base.xml.in.h:650
+#: ../rules/base.xml.in.h:651
msgid "Kashubian"
msgstr "Kaszubski"
-#: ../rules/base.xml.in.h:651
+#: ../rules/base.xml.in.h:652
msgid "Russian (Poland, phonetic Dvorak)"
msgstr "Rosyjski (Polska, fonetyczny Dvoraka)"
-#: ../rules/base.xml.in.h:652
+#: ../rules/base.xml.in.h:653
msgid "Polish (programmer Dvorak)"
msgstr "Polski (Dvoraka programisty)"
-#: ../rules/base.xml.in.h:653 ../rules/base.extras.xml.in.h:104
+#: ../rules/base.xml.in.h:654 ../rules/base.extras.xml.in.h:105
msgid "Portuguese"
msgstr "Portugalski"
-#: ../rules/base.xml.in.h:654
+#: ../rules/base.xml.in.h:655
msgid "Portuguese (eliminate dead keys)"
msgstr "Portugalski (bez klawiszy akcentów)"
-#: ../rules/base.xml.in.h:655
+#: ../rules/base.xml.in.h:656
msgid "Portuguese (Sun dead keys)"
msgstr "Portugalski (klawisze akcentów Suna)"
-#: ../rules/base.xml.in.h:656
+#: ../rules/base.xml.in.h:657
msgid "Portuguese (Macintosh)"
msgstr "Portugalski (Macintosh)"
-#: ../rules/base.xml.in.h:657
+#: ../rules/base.xml.in.h:658
msgid "Portuguese (Macintosh, eliminate dead keys)"
msgstr "Portugalski (Macintosh, bez klawiszy akcentów)"
-#: ../rules/base.xml.in.h:658
+#: ../rules/base.xml.in.h:659
msgid "Portuguese (Macintosh, Sun dead keys)"
msgstr "Portugalski (Macintosh, klawisze akcentów Suna)"
-#: ../rules/base.xml.in.h:659
+#: ../rules/base.xml.in.h:660
msgid "Portuguese (Nativo)"
-msgstr "Portugalski (nativo)"
+msgstr "Portugalski (Nativo)"
-#: ../rules/base.xml.in.h:660
+#: ../rules/base.xml.in.h:661
msgid "Portuguese (Nativo for US keyboards)"
msgstr "Portugalski (Nativo dla klawiatur US)"
-#: ../rules/base.xml.in.h:661
+#: ../rules/base.xml.in.h:662
msgid "Esperanto (Portugal, Nativo)"
msgstr "Esperanto (Portugalia, Nativo)"
#. Keyboard indicator for Romanian layouts
-#: ../rules/base.xml.in.h:663 ../rules/base.extras.xml.in.h:45
+#: ../rules/base.xml.in.h:664 ../rules/base.extras.xml.in.h:46
msgid "ro"
msgstr "ro"
-#: ../rules/base.xml.in.h:664 ../rules/base.extras.xml.in.h:46
+#: ../rules/base.xml.in.h:665 ../rules/base.extras.xml.in.h:47
msgid "Romanian"
msgstr "Rumuński"
-#: ../rules/base.xml.in.h:665
+#: ../rules/base.xml.in.h:666
msgid "Romanian (cedilla)"
msgstr "Rumuński (cedilla)"
-#: ../rules/base.xml.in.h:666
+#: ../rules/base.xml.in.h:667
msgid "Romanian (standard)"
msgstr "Rumuński (standardowy)"
-#: ../rules/base.xml.in.h:667
+#: ../rules/base.xml.in.h:668
msgid "Romanian (standard cedilla)"
msgstr "Rumuński (standardowy cedilla)"
-#: ../rules/base.xml.in.h:668
+#: ../rules/base.xml.in.h:669
msgid "Romanian (WinKeys)"
msgstr "Rumuński (klawisze Win)"
-#: ../rules/base.xml.in.h:669 ../rules/base.extras.xml.in.h:55
+#: ../rules/base.xml.in.h:670 ../rules/base.extras.xml.in.h:56
msgid "Russian"
msgstr "Rosyjski"
-#: ../rules/base.xml.in.h:670
+#: ../rules/base.xml.in.h:671
msgid "Russian (phonetic)"
msgstr "Rosyjski (fonetyczny)"
-#: ../rules/base.xml.in.h:671
+#: ../rules/base.xml.in.h:672
msgid "Russian (phonetic WinKeys)"
msgstr "Rosyjski (fonetyczny, klawisze Win)"
-#: ../rules/base.xml.in.h:672
+#: ../rules/base.xml.in.h:673
msgid "Russian (typewriter)"
msgstr "Rosyjski (maszynistki)"
-#: ../rules/base.xml.in.h:673
+#: ../rules/base.xml.in.h:674
msgid "Russian (legacy)"
msgstr "Rosyjski (stary)"
-#: ../rules/base.xml.in.h:674
+#: ../rules/base.xml.in.h:675
msgid "Russian (typewriter, legacy)"
msgstr "Rosyjski (maszynistki, stary)"
-#: ../rules/base.xml.in.h:675
+#: ../rules/base.xml.in.h:676
msgid "Tatar"
msgstr "Tatarski"
-#: ../rules/base.xml.in.h:676
+#: ../rules/base.xml.in.h:677
msgid "Ossetian (legacy)"
msgstr "Osetyjski (stary)"
-#: ../rules/base.xml.in.h:677
+#: ../rules/base.xml.in.h:678
msgid "Ossetian (WinKeys)"
msgstr "Osetyjski (klawisze Win)"
-#: ../rules/base.xml.in.h:678
+#: ../rules/base.xml.in.h:679
msgid "Chuvash"
msgstr "Czuwaski"
-#: ../rules/base.xml.in.h:679
+#: ../rules/base.xml.in.h:680
msgid "Chuvash (Latin)"
msgstr "Czuwaski (łaciński)"
-#: ../rules/base.xml.in.h:680
+#: ../rules/base.xml.in.h:681
msgid "Udmurt"
msgstr "Udmurcki"
-#: ../rules/base.xml.in.h:681
+#: ../rules/base.xml.in.h:682
msgid "Komi"
msgstr "Komi"
-#: ../rules/base.xml.in.h:682
+#: ../rules/base.xml.in.h:683
msgid "Yakut"
msgstr "Jakucki"
-#: ../rules/base.xml.in.h:683
+#: ../rules/base.xml.in.h:684
msgid "Kalmyk"
msgstr "Kałmucki"
-#: ../rules/base.xml.in.h:684
+#: ../rules/base.xml.in.h:685
msgid "Russian (DOS)"
msgstr "Rosyjski (DOS)"
-#: ../rules/base.xml.in.h:685
+#: ../rules/base.xml.in.h:686
msgid "Russian (Macintosh)"
msgstr "Rosyjski (Macintosh)"
-#: ../rules/base.xml.in.h:686
+#: ../rules/base.xml.in.h:687
msgid "Serbian (Russia)"
msgstr "Serbski (Rosja)"
-#: ../rules/base.xml.in.h:687
+#: ../rules/base.xml.in.h:688
msgid "Bashkirian"
msgstr "Baszkirski"
-#: ../rules/base.xml.in.h:688
+#: ../rules/base.xml.in.h:689
msgid "Mari"
msgstr "Maryjski"
-#: ../rules/base.xml.in.h:689 ../rules/base.extras.xml.in.h:52
+#: ../rules/base.xml.in.h:690 ../rules/base.extras.xml.in.h:53
msgid "Serbian"
msgstr "Serbski"
-#: ../rules/base.xml.in.h:690
+#: ../rules/base.xml.in.h:691
msgid "Serbian (Cyrillic, Z and ZHE swapped)"
msgstr "Serbski (cyrylicki, zamienione Z i Ż)"
-#: ../rules/base.xml.in.h:691
+#: ../rules/base.xml.in.h:692
msgid "Serbian (Latin)"
msgstr "Serbski (łaciński)"
-#: ../rules/base.xml.in.h:692
+#: ../rules/base.xml.in.h:693
msgid "Serbian (Latin Unicode)"
msgstr "Serbski (łaciński unikodowy)"
-#: ../rules/base.xml.in.h:693
+#: ../rules/base.xml.in.h:694
msgid "Serbian (Latin qwerty)"
msgstr "Serbski (łaciński QWERTY)"
-#: ../rules/base.xml.in.h:694
+#: ../rules/base.xml.in.h:695
msgid "Serbian (Latin Unicode qwerty)"
msgstr "Serbski (łaciński unikodowy QWERTY)"
-#: ../rules/base.xml.in.h:695
+#: ../rules/base.xml.in.h:696
msgid "Serbian (Cyrillic with guillemets)"
msgstr "Serbski (cyrylicki z cudzysłowami)"
-#: ../rules/base.xml.in.h:696
+#: ../rules/base.xml.in.h:697
msgid "Serbian (Latin with guillemets)"
msgstr "Serbski (łaciński z cudzysłowami)"
-#: ../rules/base.xml.in.h:697
-msgid "Pannonian Rusyn (homophonic)"
-msgstr "Pannońskorusiński (homofoniczny)"
+#: ../rules/base.xml.in.h:698
+msgid "Pannonian Rusyn"
+msgstr "Pannońskorusiński"
#. Keyboard indicator for Slovenian layouts
-#: ../rules/base.xml.in.h:699
+#: ../rules/base.xml.in.h:700
msgid "sl"
msgstr "sl"
-#: ../rules/base.xml.in.h:700
+#: ../rules/base.xml.in.h:701
msgid "Slovenian"
msgstr "Słoweński"
-#: ../rules/base.xml.in.h:701
+#: ../rules/base.xml.in.h:702
msgid "Slovenian (use guillemets for quotes)"
msgstr "Słoweński (używanie cudzysłowów do cytowania)"
-#: ../rules/base.xml.in.h:702
+#: ../rules/base.xml.in.h:703
msgid "Slovenian (US keyboard with Slovenian letters)"
msgstr "Słoweński (klawiatura US z literami słoweńskimi)"
#. Keyboard indicator for Slovak layouts
-#: ../rules/base.xml.in.h:704 ../rules/base.extras.xml.in.h:106
+#: ../rules/base.xml.in.h:705 ../rules/base.extras.xml.in.h:107
msgid "sk"
msgstr "sk"
-#: ../rules/base.xml.in.h:705 ../rules/base.extras.xml.in.h:107
+#: ../rules/base.xml.in.h:706 ../rules/base.extras.xml.in.h:108
msgid "Slovak"
msgstr "Słowacki"
-#: ../rules/base.xml.in.h:706
+#: ../rules/base.xml.in.h:707
msgid "Slovak (extended Backslash)"
msgstr "Słowacki (rozszerzony backslash)"
-#: ../rules/base.xml.in.h:707
+#: ../rules/base.xml.in.h:708
msgid "Slovak (qwerty)"
msgstr "Słowacki (QWERTY)"
-#: ../rules/base.xml.in.h:708
+#: ../rules/base.xml.in.h:709
msgid "Slovak (qwerty, extended Backslash)"
msgstr "Słowacki (QWERTY, rozszerzony Backslash)"
-#: ../rules/base.xml.in.h:709 ../rules/base.extras.xml.in.h:110
+#: ../rules/base.xml.in.h:710 ../rules/base.extras.xml.in.h:111
msgid "Spanish"
msgstr "Hiszpański"
-#: ../rules/base.xml.in.h:710
+#: ../rules/base.xml.in.h:711
msgid "Spanish (eliminate dead keys)"
msgstr "Hiszpański (bez klawiszy akcentów)"
-#: ../rules/base.xml.in.h:711
+#: ../rules/base.xml.in.h:712
msgid "Spanish (include dead tilde)"
msgstr "Hiszpański (ze znakiem tyldy)"
-#: ../rules/base.xml.in.h:712
+#: ../rules/base.xml.in.h:713
msgid "Spanish (Sun dead keys)"
msgstr "Hiszpański (klawisze akcentów Suna)"
-#: ../rules/base.xml.in.h:713
+#: ../rules/base.xml.in.h:714
msgid "Spanish (Dvorak)"
msgstr "Hiszpański (Dvoraka)"
-#: ../rules/base.xml.in.h:714
+#: ../rules/base.xml.in.h:715
msgid "Asturian (Spain, with bottom-dot H and bottom-dot L)"
msgstr "Asturski (hiszpański, z H i L z dolną kropką)"
-#: ../rules/base.xml.in.h:715
+#: ../rules/base.xml.in.h:716
msgid "Catalan (Spain, with middle-dot L)"
msgstr "Kataloński (hiszpański, z L ze środkową kropką)"
-#: ../rules/base.xml.in.h:716
+#: ../rules/base.xml.in.h:717
msgid "Spanish (Macintosh)"
msgstr "Hiszpański (Macintosh)"
#. Keyboard indicator for Swedish layouts
-#: ../rules/base.xml.in.h:718 ../rules/base.extras.xml.in.h:112
+#: ../rules/base.xml.in.h:719 ../rules/base.extras.xml.in.h:113
msgid "sv"
msgstr "sv"
-#: ../rules/base.xml.in.h:719 ../rules/base.extras.xml.in.h:113
+#: ../rules/base.xml.in.h:720 ../rules/base.extras.xml.in.h:114
msgid "Swedish"
msgstr "Szwedzki"
-#: ../rules/base.xml.in.h:720
+#: ../rules/base.xml.in.h:721
msgid "Swedish (eliminate dead keys)"
msgstr "Szwedzki (bez klawiszy akcentów)"
-#: ../rules/base.xml.in.h:721
+#: ../rules/base.xml.in.h:722
msgid "Swedish (Dvorak)"
msgstr "Szwedzki (Dvoraka)"
-#: ../rules/base.xml.in.h:722
+#: ../rules/base.xml.in.h:723
msgid "Russian (Sweden, phonetic)"
msgstr "Rosyjski (Szwecja, fonetyczny)"
-#: ../rules/base.xml.in.h:723
+#: ../rules/base.xml.in.h:724
msgid "Russian (Sweden, phonetic, eliminate dead keys)"
msgstr "Rosyjski (Szwecja, fonetyczny, bez klawiszy akcentów)"
-#: ../rules/base.xml.in.h:724
+#: ../rules/base.xml.in.h:725
msgid "Northern Saami (Sweden)"
msgstr "Północnolapoński (Szwecja)"
-#: ../rules/base.xml.in.h:725
+#: ../rules/base.xml.in.h:726
msgid "Swedish (Macintosh)"
msgstr "Szwedzki (Macintosh)"
-#: ../rules/base.xml.in.h:726
+#: ../rules/base.xml.in.h:727
msgid "Swedish (Svdvorak)"
msgstr "Szwedzki (Svdvorak)"
-#: ../rules/base.xml.in.h:727
+#: ../rules/base.xml.in.h:728
msgid "Swedish Sign Language"
msgstr "Szwedzki migowy"
-#: ../rules/base.xml.in.h:728 ../rules/base.extras.xml.in.h:115
+#: ../rules/base.xml.in.h:729 ../rules/base.extras.xml.in.h:116
msgid "German (Switzerland)"
msgstr "Niemiecki (Szwajcaria)"
-#: ../rules/base.xml.in.h:729
+#: ../rules/base.xml.in.h:730
msgid "German (Switzerland, legacy)"
msgstr "Niemiecki (Szwajcaria, stary)"
-#: ../rules/base.xml.in.h:730
+#: ../rules/base.xml.in.h:731
msgid "German (Switzerland, eliminate dead keys)"
msgstr "Niemiecki (Szwajcaria, bez klawiszy akcentów)"
-#: ../rules/base.xml.in.h:731
+#: ../rules/base.xml.in.h:732
msgid "German (Switzerland, Sun dead keys)"
msgstr "Niemiecki (Szwajcaria, klawisze akcentów Suna)"
-#: ../rules/base.xml.in.h:732
+#: ../rules/base.xml.in.h:733
msgid "French (Switzerland)"
msgstr "Francuski (Szwajcaria)"
-#: ../rules/base.xml.in.h:733
+#: ../rules/base.xml.in.h:734
msgid "French (Switzerland, eliminate dead keys)"
msgstr "Francuski (Szwajcaria, bez klawiszy akcentów)"
-#: ../rules/base.xml.in.h:734
+#: ../rules/base.xml.in.h:735
msgid "French (Switzerland, Sun dead keys)"
msgstr "Francuski (Szwajcaria, klawisze akcentów Suna)"
-#: ../rules/base.xml.in.h:735
+#: ../rules/base.xml.in.h:736
msgid "French (Switzerland, Macintosh)"
msgstr "Francuski (Szwajcaria, Macintosh)"
-#: ../rules/base.xml.in.h:736
+#: ../rules/base.xml.in.h:737
msgid "German (Switzerland, Macintosh)"
msgstr "Niemiecki (Szwajcaria, Macintosh)"
-#: ../rules/base.xml.in.h:737
+#: ../rules/base.xml.in.h:738
msgid "Arabic (Syria)"
msgstr "Arabski (syryjski)"
#. Keyboard indicator for Syriac layouts
-#: ../rules/base.xml.in.h:739
+#: ../rules/base.xml.in.h:740
msgid "syc"
msgstr "syc"
-#: ../rules/base.xml.in.h:740
+#: ../rules/base.xml.in.h:741
msgid "Syriac"
msgstr "Syryjski"
-#: ../rules/base.xml.in.h:741
+#: ../rules/base.xml.in.h:742
msgid "Syriac (phonetic)"
msgstr "Syryjski (fonetyczny)"
-#: ../rules/base.xml.in.h:742
+#: ../rules/base.xml.in.h:743
msgid "Kurdish (Syria, Latin Q)"
msgstr "Kurdyjski (Syria, łaciński Q)"
-#: ../rules/base.xml.in.h:743
+#: ../rules/base.xml.in.h:744
msgid "Kurdish (Syria, F)"
msgstr "Kurdyjski (Syria, F)"
-#: ../rules/base.xml.in.h:744
+#: ../rules/base.xml.in.h:745
msgid "Kurdish (Syria, Latin Alt-Q)"
msgstr "Kurdyjski (Syria, łaciński Alt-Q)"
#. Keyboard indicator for Tajik layouts
-#: ../rules/base.xml.in.h:746
+#: ../rules/base.xml.in.h:747
msgid "tg"
msgstr "tg"
-#: ../rules/base.xml.in.h:747
+#: ../rules/base.xml.in.h:748
msgid "Tajik"
msgstr "Tadżycki"
-#: ../rules/base.xml.in.h:748
+#: ../rules/base.xml.in.h:749
msgid "Tajik (legacy)"
msgstr "Tadżycki (stary)"
#. Keyboard indicator for Sinhala layouts
-#: ../rules/base.xml.in.h:750
+#: ../rules/base.xml.in.h:751
msgid "si"
msgstr "si"
-#: ../rules/base.xml.in.h:751
+#: ../rules/base.xml.in.h:752
msgid "Sinhala (phonetic)"
msgstr "Syngaleski (fonetyczny)"
-#: ../rules/base.xml.in.h:752
+#: ../rules/base.xml.in.h:753
msgid "Tamil (Sri Lanka, Unicode)"
msgstr "Tamilski (Sri Lanka, unikodowy)"
-#: ../rules/base.xml.in.h:753
+#: ../rules/base.xml.in.h:754
msgid "Tamil (Sri Lanka, TAB Typewriter)"
msgstr "Tamilski (Sri Lanka, maszynistki TAB)"
#. Keyboard indicator for Thai layouts
-#: ../rules/base.xml.in.h:755
+#: ../rules/base.xml.in.h:756
msgid "th"
msgstr "th"
-#: ../rules/base.xml.in.h:756
+#: ../rules/base.xml.in.h:757
msgid "Thai"
msgstr "Tajski"
-#: ../rules/base.xml.in.h:757
+#: ../rules/base.xml.in.h:758
msgid "Thai (TIS-820.2538)"
msgstr "Tajski (TIS-820.2538)"
-#: ../rules/base.xml.in.h:758
+#: ../rules/base.xml.in.h:759
msgid "Thai (Pattachote)"
msgstr "Tajski (Pattachote)"
#. Keyboard indicator for Turkish layouts
-#: ../rules/base.xml.in.h:760 ../rules/base.extras.xml.in.h:118
+#: ../rules/base.xml.in.h:761 ../rules/base.extras.xml.in.h:119
msgid "tr"
msgstr "tr"
-#: ../rules/base.xml.in.h:761 ../rules/base.extras.xml.in.h:119
+#: ../rules/base.xml.in.h:762 ../rules/base.extras.xml.in.h:120
msgid "Turkish"
msgstr "Turecki"
-#: ../rules/base.xml.in.h:762
+#: ../rules/base.xml.in.h:763
msgid "Turkish (F)"
msgstr "Turecki (F)"
-#: ../rules/base.xml.in.h:763
+#: ../rules/base.xml.in.h:764
msgid "Turkish (Alt-Q)"
msgstr "Turecki (Alt-Q)"
-#: ../rules/base.xml.in.h:764
+#: ../rules/base.xml.in.h:765
msgid "Turkish (Sun dead keys)"
msgstr "Turecki (klawisze akcentów Suna)"
-#: ../rules/base.xml.in.h:765
+#: ../rules/base.xml.in.h:766
msgid "Kurdish (Turkey, Latin Q)"
msgstr "Kurdyjski (Turcja, łaciński Q)"
-#: ../rules/base.xml.in.h:766
+#: ../rules/base.xml.in.h:767
msgid "Kurdish (Turkey, F)"
msgstr "Kurdyjski (Turcja, F)"
-#: ../rules/base.xml.in.h:767
+#: ../rules/base.xml.in.h:768
msgid "Kurdish (Turkey, Latin Alt-Q)"
msgstr "Kurdyjski (Turcja, łaciński Alt-Q)"
-#: ../rules/base.xml.in.h:768
+#: ../rules/base.xml.in.h:769
msgid "Turkish (international with dead keys)"
msgstr "Turecki (międzynarodowy z klawiszami akcentów)"
#. Keyboard indicator for Crimean Tatar layouts
-#: ../rules/base.xml.in.h:770 ../rules/base.extras.xml.in.h:47
+#: ../rules/base.xml.in.h:771 ../rules/base.extras.xml.in.h:48
msgid "crh"
msgstr "crh"
-#: ../rules/base.xml.in.h:771
+#: ../rules/base.xml.in.h:772
msgid "Crimean Tatar (Turkish Q)"
msgstr "Krymskotatarski (turecki Q)"
-#: ../rules/base.xml.in.h:772
+#: ../rules/base.xml.in.h:773
msgid "Crimean Tatar (Turkish F)"
msgstr "Krymskotatarski (turecki F)"
-#: ../rules/base.xml.in.h:773
+#: ../rules/base.xml.in.h:774
msgid "Crimean Tatar (Turkish Alt-Q)"
msgstr "Krymskotatarski (turecki Alt-Q)"
-#: ../rules/base.xml.in.h:774
+#: ../rules/base.xml.in.h:775
msgid "Taiwanese"
msgstr "Tajwański"
-#: ../rules/base.xml.in.h:775
+#: ../rules/base.xml.in.h:776
msgid "Taiwanese (indigenous)"
msgstr "Tajwański (autochtoniczny)"
#. Keyboard indicator for Saisiyat layouts
-#: ../rules/base.xml.in.h:777
+#: ../rules/base.xml.in.h:778
msgid "xsy"
msgstr "xsy"
-#: ../rules/base.xml.in.h:778
+#: ../rules/base.xml.in.h:779
msgid "Saisiyat (Taiwan)"
msgstr "Saisiyat (Tajwan)"
#. Keyboard indicator for Ukranian layouts
-#: ../rules/base.xml.in.h:780 ../rules/base.extras.xml.in.h:121
+#: ../rules/base.xml.in.h:781 ../rules/base.extras.xml.in.h:122
msgid "uk"
msgstr "uk"
-#: ../rules/base.xml.in.h:781 ../rules/base.extras.xml.in.h:122
+#: ../rules/base.xml.in.h:782 ../rules/base.extras.xml.in.h:123
msgid "Ukrainian"
msgstr "Ukraiński"
-#: ../rules/base.xml.in.h:782
+#: ../rules/base.xml.in.h:783
msgid "Ukrainian (phonetic)"
msgstr "Ukraiński (fonetyczny)"
-#: ../rules/base.xml.in.h:783
+#: ../rules/base.xml.in.h:784
msgid "Ukrainian (typewriter)"
msgstr "Ukraiński (maszynistki)"
-#: ../rules/base.xml.in.h:784
+#: ../rules/base.xml.in.h:785
msgid "Ukrainian (WinKeys)"
msgstr "Ukraiński (klawisze Win)"
-#: ../rules/base.xml.in.h:785
+#: ../rules/base.xml.in.h:786
msgid "Ukrainian (legacy)"
msgstr "Ukraiński (stary)"
-#: ../rules/base.xml.in.h:786
+#: ../rules/base.xml.in.h:787
msgid "Ukrainian (standard RSTU)"
msgstr "Ukraiński (standardowy RSTU)"
-#: ../rules/base.xml.in.h:787
+#: ../rules/base.xml.in.h:788
msgid "Russian (Ukraine, standard RSTU)"
msgstr "Rosyjski (Ukraina, standardowy RSTU)"
-#: ../rules/base.xml.in.h:788
+#: ../rules/base.xml.in.h:789
msgid "Ukrainian (homophonic)"
msgstr "Ukraiński (homofoniczny)"
-#: ../rules/base.xml.in.h:789 ../rules/base.extras.xml.in.h:124
+#: ../rules/base.xml.in.h:790 ../rules/base.extras.xml.in.h:125
msgid "English (UK)"
msgstr "Angielski (Wielka Brytania)"
-#: ../rules/base.xml.in.h:790
+#: ../rules/base.xml.in.h:791
msgid "English (UK, extended WinKeys)"
msgstr "Angielski (Wielka Brytania, rozszerzone klawisze Win)"
-#: ../rules/base.xml.in.h:791
+#: ../rules/base.xml.in.h:792
msgid "English (UK, international with dead keys)"
msgstr "Angielski (Wielka Brytania, międzynarodowy z klawiszami akcentów)"
-#: ../rules/base.xml.in.h:792
+#: ../rules/base.xml.in.h:793
msgid "English (UK, Dvorak)"
msgstr "Angielski (Wielka Brytania, Dvoraka)"
-#: ../rules/base.xml.in.h:793
+#: ../rules/base.xml.in.h:794
msgid "English (UK, Dvorak with UK punctuation)"
msgstr "Angielski (Wielka Brytania, Dvoraka z brytyjskimi znakami przestankowymi)"
-#: ../rules/base.xml.in.h:794
+#: ../rules/base.xml.in.h:795
msgid "English (UK, Macintosh)"
msgstr "Angielski (Wielka Brytania, Macintosh)"
-#: ../rules/base.xml.in.h:795
+#: ../rules/base.xml.in.h:796
msgid "English (UK, Macintosh international)"
msgstr "Angielski (Wielka Brytania, międzynarodowy Macintosh)"
-#: ../rules/base.xml.in.h:796
+#: ../rules/base.xml.in.h:797
msgid "English (UK, Colemak)"
msgstr "Angielski (Wielka Brytania, Colemak)"
-#: ../rules/base.xml.in.h:797
+#: ../rules/base.xml.in.h:798
msgid "Uzbek"
msgstr "Uzbecki"
-#: ../rules/base.xml.in.h:798
+#: ../rules/base.xml.in.h:799
msgid "Uzbek (Latin)"
msgstr "Uzbecki (łaciński)"
#. Keyboard indicator for Vietnamese layouts
-#: ../rules/base.xml.in.h:800
+#: ../rules/base.xml.in.h:801
msgid "vi"
msgstr "vi"
-#: ../rules/base.xml.in.h:801
+#: ../rules/base.xml.in.h:802
msgid "Vietnamese"
msgstr "Wietnamski"
#. Keyboard indicator for Korean layouts
-#: ../rules/base.xml.in.h:803 ../rules/base.extras.xml.in.h:126
+#: ../rules/base.xml.in.h:804 ../rules/base.extras.xml.in.h:127
msgid "ko"
msgstr "ko"
-#: ../rules/base.xml.in.h:804 ../rules/base.extras.xml.in.h:127
+#: ../rules/base.xml.in.h:805 ../rules/base.extras.xml.in.h:128
msgid "Korean"
msgstr "Koreański"
-#: ../rules/base.xml.in.h:805
+#: ../rules/base.xml.in.h:806
msgid "Korean (101/104 key compatible)"
msgstr "Koreański (kompatybilny ze 101/104 klawiszami)"
-#: ../rules/base.xml.in.h:806
+#: ../rules/base.xml.in.h:807
msgid "Japanese (PC-98xx Series)"
msgstr "Japoński (serie PC-98xx)"
#. Keyboard indicator for Irish layouts
-#: ../rules/base.xml.in.h:808
+#: ../rules/base.xml.in.h:809
msgid "ie"
msgstr "ie"
-#: ../rules/base.xml.in.h:809
+#: ../rules/base.xml.in.h:810
msgid "Irish"
msgstr "Irlandzki"
-#: ../rules/base.xml.in.h:810
+#: ../rules/base.xml.in.h:811
msgid "CloGaelach"
msgstr "Irlandzki gaelicki"
-#: ../rules/base.xml.in.h:811
+#: ../rules/base.xml.in.h:812
msgid "Irish (UnicodeExpert)"
msgstr "Irlandzki (UnicodeExpert)"
-#: ../rules/base.xml.in.h:812
+#: ../rules/base.xml.in.h:813
msgid "Ogham"
msgstr "Ogamiczny"
-#: ../rules/base.xml.in.h:813
+#: ../rules/base.xml.in.h:814
msgid "Ogham (IS434)"
msgstr "Ogamiczny (IS434)"
-#: ../rules/base.xml.in.h:814
+#: ../rules/base.xml.in.h:815
msgid "Urdu (Pakistan)"
msgstr "Urdu (Pakistan)"
-#: ../rules/base.xml.in.h:815
+#: ../rules/base.xml.in.h:816
msgid "Urdu (Pakistan, CRULP)"
msgstr "Urdu (Pakistan, CRULP)"
-#: ../rules/base.xml.in.h:816
+#: ../rules/base.xml.in.h:817
msgid "Urdu (Pakistan, NLA)"
msgstr "Urdu (Pakistan, NLA)"
-#: ../rules/base.xml.in.h:817
+#: ../rules/base.xml.in.h:818
msgid "Arabic (Pakistan)"
msgstr "Arabski (pakistański)"
#. Keyboard indicator for Sindhi layouts
-#: ../rules/base.xml.in.h:819
+#: ../rules/base.xml.in.h:820
msgid "sd"
msgstr "sd"
-#: ../rules/base.xml.in.h:820
+#: ../rules/base.xml.in.h:821
msgid "Sindhi"
msgstr "Sindhi"
#. Keyboard indicator for Dhivehi layouts
-#: ../rules/base.xml.in.h:822
+#: ../rules/base.xml.in.h:823
msgid "dv"
msgstr "dv"
-#: ../rules/base.xml.in.h:823
+#: ../rules/base.xml.in.h:824
msgid "Dhivehi"
msgstr "Malediwski"
-#: ../rules/base.xml.in.h:824
+#: ../rules/base.xml.in.h:825
msgid "English (South Africa)"
msgstr "Angielski (Afryka Południowa)"
#. Keyboard indicator for Esperanto layouts
-#: ../rules/base.xml.in.h:826
+#: ../rules/base.xml.in.h:827
msgid "eo"
msgstr "eo"
-#: ../rules/base.xml.in.h:827
+#: ../rules/base.xml.in.h:828
msgid "Esperanto"
msgstr "Esperancki"
-#: ../rules/base.xml.in.h:828
+#: ../rules/base.xml.in.h:829
msgid "Esperanto (displaced semicolon and quote, obsolete)"
msgstr "Esperanto (zamieniony średnik i apostrof, przestarzałe)"
#. Keyboard indicator for Nepali layouts
-#: ../rules/base.xml.in.h:830
+#: ../rules/base.xml.in.h:831
msgid "ne"
msgstr "ne"
-#: ../rules/base.xml.in.h:831
+#: ../rules/base.xml.in.h:832
msgid "Nepali"
msgstr "Nepalski"
-#: ../rules/base.xml.in.h:832
+#: ../rules/base.xml.in.h:833
msgid "English (Nigeria)"
msgstr "Angielski (Nigeria)"
#. Keyboard indicator for Igbo layouts
-#: ../rules/base.xml.in.h:834
+#: ../rules/base.xml.in.h:835
msgid "ig"
msgstr "ig"
-#: ../rules/base.xml.in.h:835
+#: ../rules/base.xml.in.h:836
msgid "Igbo"
msgstr "Ibo"
#. Keyboard indicator for Yoruba layouts
-#: ../rules/base.xml.in.h:837
+#: ../rules/base.xml.in.h:838
msgid "yo"
msgstr "yo"
-#: ../rules/base.xml.in.h:838
+#: ../rules/base.xml.in.h:839
msgid "Yoruba"
msgstr "Joruba"
#. Keyboard indicator for Amharic layouts
-#: ../rules/base.xml.in.h:840
+#: ../rules/base.xml.in.h:841
msgid "am"
msgstr "am"
-#: ../rules/base.xml.in.h:841
+#: ../rules/base.xml.in.h:842
msgid "Amharic"
msgstr "Amharski"
#. Keyboard indicator for Wolof layouts
-#: ../rules/base.xml.in.h:843
+#: ../rules/base.xml.in.h:844
msgid "wo"
msgstr "wo"
-#: ../rules/base.xml.in.h:844
+#: ../rules/base.xml.in.h:845
msgid "Wolof"
msgstr "Wolof"
#. Keyboard indicator for Braille layouts
-#: ../rules/base.xml.in.h:846
+#: ../rules/base.xml.in.h:847
msgid "brl"
msgstr "brl"
-#: ../rules/base.xml.in.h:847
+#: ../rules/base.xml.in.h:848
msgid "Braille"
msgstr "Braille'a"
-#: ../rules/base.xml.in.h:848
+#: ../rules/base.xml.in.h:849
msgid "Braille (left hand)"
msgstr "Braille (leworęczny)"
-#: ../rules/base.xml.in.h:849
+#: ../rules/base.xml.in.h:850
msgid "Braille (right hand)"
msgstr "Braille (praworęczny)"
#. Keyboard indicator for Turkmen layouts
-#: ../rules/base.xml.in.h:851
+#: ../rules/base.xml.in.h:852
msgid "tk"
msgstr "tk"
-#: ../rules/base.xml.in.h:852
+#: ../rules/base.xml.in.h:853
msgid "Turkmen"
msgstr "Turkmeński"
-#: ../rules/base.xml.in.h:853
+#: ../rules/base.xml.in.h:854
msgid "Turkmen (Alt-Q)"
msgstr "Turkmeński (Alt-Q)"
#. Keyboard indicator for Bambara layouts
-#: ../rules/base.xml.in.h:855
+#: ../rules/base.xml.in.h:856
msgid "bm"
msgstr "bm"
-#: ../rules/base.xml.in.h:856
+#: ../rules/base.xml.in.h:857
msgid "Bambara"
msgstr "Bambara"
-#: ../rules/base.xml.in.h:857
+#: ../rules/base.xml.in.h:858
msgid "French (Mali, alternative)"
msgstr "Francuski (Mali, alternatywny)"
-#: ../rules/base.xml.in.h:858
+#: ../rules/base.xml.in.h:859
msgid "English (Mali, US Macintosh)"
msgstr "Angielski (Mali, USA - Macintosh)"
-#: ../rules/base.xml.in.h:859
+#: ../rules/base.xml.in.h:860
msgid "English (Mali, US international)"
msgstr "Angielski (Mali, międzynarodowy USA)"
#. Keyboard indicator for Swahili layouts
-#: ../rules/base.xml.in.h:861
+#: ../rules/base.xml.in.h:862
msgid "sw"
msgstr "sw"
-#: ../rules/base.xml.in.h:862
+#: ../rules/base.xml.in.h:863
msgid "Swahili (Tanzania)"
msgstr "Suahili (Tanzania)"
-#: ../rules/base.xml.in.h:863
+#: ../rules/base.xml.in.h:864
msgid "Swahili (Kenya)"
msgstr "Suahili (Kenia)"
-#: ../rules/base.xml.in.h:864
+#: ../rules/base.xml.in.h:865
msgid "Kikuyu"
msgstr "Kikiju"
#. Keyboard indicator for Tswana layouts
-#: ../rules/base.xml.in.h:866
+#: ../rules/base.xml.in.h:867
msgid "tn"
msgstr "tn"
-#: ../rules/base.xml.in.h:867
+#: ../rules/base.xml.in.h:868
msgid "Tswana"
msgstr "Tswana"
#. Keyboard indicator for Filipino layouts
-#: ../rules/base.xml.in.h:869
+#: ../rules/base.xml.in.h:870
msgid "ph"
msgstr "ph"
-#: ../rules/base.xml.in.h:870
+#: ../rules/base.xml.in.h:871
msgid "Filipino"
msgstr "Filipiński"
-#: ../rules/base.xml.in.h:871
+#: ../rules/base.xml.in.h:872
msgid "Filipino (QWERTY Baybayin)"
msgstr "Filipino (baybain QWERTY)"
-#: ../rules/base.xml.in.h:872
+#: ../rules/base.xml.in.h:873
msgid "Filipino (Capewell-Dvorak Latin)"
msgstr "Filipiński (łaciński Capewella-Dvoraka)"
-#: ../rules/base.xml.in.h:873
+#: ../rules/base.xml.in.h:874
msgid "Filipino (Capewell-Dvorak Baybayin)"
msgstr "Filipiński (baybayin Capewella-Dvoraka)"
-#: ../rules/base.xml.in.h:874
+#: ../rules/base.xml.in.h:875
msgid "Filipino (Capewell-QWERF 2006 Latin)"
msgstr "Filipiński (łaciński Capewella-QWERF 2006)"
-#: ../rules/base.xml.in.h:875
+#: ../rules/base.xml.in.h:876
msgid "Filipino (Capewell-QWERF 2006 Baybayin)"
msgstr "Filipiński (baybayin Capewella-QWERF 2006)"
-#: ../rules/base.xml.in.h:876
+#: ../rules/base.xml.in.h:877
msgid "Filipino (Colemak Latin)"
msgstr "Filipiński (łaciński Colemak)"
-#: ../rules/base.xml.in.h:877
+#: ../rules/base.xml.in.h:878
msgid "Filipino (Colemak Baybayin)"
msgstr "Filipiński (baybain Colemak)"
-#: ../rules/base.xml.in.h:878
+#: ../rules/base.xml.in.h:879
msgid "Filipino (Dvorak Latin)"
msgstr "Filipiński (łaciński Dvoraka)"
-#: ../rules/base.xml.in.h:879
+#: ../rules/base.xml.in.h:880
msgid "Filipino (Dvorak Baybayin)"
msgstr "Filipiński (baybain Dvoraka)"
-#: ../rules/base.xml.in.h:880
+#: ../rules/base.xml.in.h:881
msgid "md"
msgstr "md"
-#: ../rules/base.xml.in.h:881
+#: ../rules/base.xml.in.h:882
msgid "Moldavian"
msgstr "Mołdawski"
-#: ../rules/base.xml.in.h:882
+#: ../rules/base.xml.in.h:883
msgid "gag"
msgstr "gag"
-#: ../rules/base.xml.in.h:883
+#: ../rules/base.xml.in.h:884
msgid "Moldavian (Gagauz)"
msgstr "Mołdawski (gagauski)"
-#: ../rules/base.xml.in.h:884
+#: ../rules/base.xml.in.h:885
msgid "Switching to another layout"
msgstr "Przełączenie na inny układ"
-#: ../rules/base.xml.in.h:885
+#: ../rules/base.xml.in.h:886
msgid "Right Alt (while pressed)"
msgstr "Prawy Alt (wciśnięty)"
-#: ../rules/base.xml.in.h:886
+#: ../rules/base.xml.in.h:887
msgid "Left Alt (while pressed)"
msgstr "Lewy Alt (wciśnięty)"
-#: ../rules/base.xml.in.h:887
+#: ../rules/base.xml.in.h:888
msgid "Left Win (while pressed)"
msgstr "Lewy Win (wciśnięty)"
-#: ../rules/base.xml.in.h:888
+#: ../rules/base.xml.in.h:889
msgid "Right Win (while pressed)"
msgstr "Prawy Win (wciśnięty)"
-#: ../rules/base.xml.in.h:889
+#: ../rules/base.xml.in.h:890
msgid "Any Win key (while pressed)"
msgstr "Dowolny klawisz Win (wciśnięty)"
-#: ../rules/base.xml.in.h:890
+#: ../rules/base.xml.in.h:891
msgid "Caps Lock (while pressed), Alt+Caps Lock does the original capslock action"
msgstr "CapsLock (wciśnięty), Alt+CapsLock działa jak zwykły CapsLock"
-#: ../rules/base.xml.in.h:891
+#: ../rules/base.xml.in.h:892
msgid "Right Ctrl (while pressed)"
msgstr "Prawy Ctrl (wciśnięty)"
-#: ../rules/base.xml.in.h:892
+#: ../rules/base.xml.in.h:893
msgid "Right Alt"
msgstr "Prawy Alt"
-#: ../rules/base.xml.in.h:893
+#: ../rules/base.xml.in.h:894
msgid "Left Alt"
msgstr "Lewy Alt"
-#: ../rules/base.xml.in.h:894
+#: ../rules/base.xml.in.h:895
msgid "Caps Lock"
msgstr "CapsLock"
-#: ../rules/base.xml.in.h:895
+#: ../rules/base.xml.in.h:896
msgid "Shift+Caps Lock"
msgstr "Shift+CapsLock"
-#: ../rules/base.xml.in.h:896
+#: ../rules/base.xml.in.h:897
msgid "Caps Lock (to first layout), Shift+Caps Lock (to last layout)"
msgstr "CapsLock (do pierwszego układu), Shift+CapsLock (do ostatniego układu)"
-#: ../rules/base.xml.in.h:897
+#: ../rules/base.xml.in.h:898
msgid "Left Win (to first layout), Right Win/Menu (to last layout)"
msgstr "Lewy Win (do pierwszego układu), prawy Win/Menu (do ostatniego układu)"
-#: ../rules/base.xml.in.h:898
+#: ../rules/base.xml.in.h:899
msgid "Left Ctrl (to first layout), Right Ctrl (to last layout)"
msgstr "Lewy Ctrl (do pierwszego układu), prawy Ctrl (do ostatniego układu)"
-#: ../rules/base.xml.in.h:899
+#: ../rules/base.xml.in.h:900
msgid "Alt+Caps Lock"
msgstr "Alt+CapsLock"
-#: ../rules/base.xml.in.h:900
+#: ../rules/base.xml.in.h:901
msgid "Both Shift keys together"
msgstr "Oba klawisze Shift naraz"
-#: ../rules/base.xml.in.h:901
+#: ../rules/base.xml.in.h:902
msgid "Both Alt keys together"
msgstr "Oba klawisze Alt naraz"
-#: ../rules/base.xml.in.h:902
+#: ../rules/base.xml.in.h:903
msgid "Both Ctrl keys together"
msgstr "Oba klawisze Ctrl naraz"
-#: ../rules/base.xml.in.h:903
+#: ../rules/base.xml.in.h:904
msgid "Ctrl+Shift"
msgstr "Ctrl+Shift"
-#: ../rules/base.xml.in.h:904
+#: ../rules/base.xml.in.h:905
msgid "Left Ctrl+Left Shift"
msgstr "Lewy Ctrl+lewy Shift"
-#: ../rules/base.xml.in.h:905
+#: ../rules/base.xml.in.h:906
msgid "Right Ctrl+Right Shift"
msgstr "Prawy Ctrl+prawy Shift"
-#: ../rules/base.xml.in.h:906
+#: ../rules/base.xml.in.h:907
msgid "Alt+Ctrl"
msgstr "Alt+Ctrl"
-#: ../rules/base.xml.in.h:907
+#: ../rules/base.xml.in.h:908
msgid "Alt+Shift"
msgstr "Alt+Shift"
-#: ../rules/base.xml.in.h:908
+#: ../rules/base.xml.in.h:909
msgid "Left Alt+Left Shift"
msgstr "Lewy Alt+lewy Shift"
-#: ../rules/base.xml.in.h:909
+#: ../rules/base.xml.in.h:910
msgid "Alt+Space"
msgstr "Alt+Spacja"
-#: ../rules/base.xml.in.h:910
+#: ../rules/base.xml.in.h:911
msgid "Menu"
msgstr "Menu"
-#: ../rules/base.xml.in.h:911
+#: ../rules/base.xml.in.h:912
msgid "Left Win"
msgstr "Lewy Win"
-#: ../rules/base.xml.in.h:912
+#: ../rules/base.xml.in.h:913
msgid "Right Win"
msgstr "Prawy Win"
-#: ../rules/base.xml.in.h:913
+#: ../rules/base.xml.in.h:914
msgid "Left Shift"
msgstr "Lewy Shift"
-#: ../rules/base.xml.in.h:914
+#: ../rules/base.xml.in.h:915
msgid "Right Shift"
msgstr "Prawy Shift"
-#: ../rules/base.xml.in.h:915
+#: ../rules/base.xml.in.h:916
msgid "Left Ctrl"
msgstr "Lewy Ctrl"
-#: ../rules/base.xml.in.h:916
+#: ../rules/base.xml.in.h:917
msgid "Right Ctrl"
msgstr "Prawy Ctrl"
-#: ../rules/base.xml.in.h:917
+#: ../rules/base.xml.in.h:918
msgid "Scroll Lock"
msgstr "ScrollLock"
-#: ../rules/base.xml.in.h:918
+#: ../rules/base.xml.in.h:919
msgid "LeftCtrl+LeftWin (to first layout), RightCtrl+Menu (to second layout)"
msgstr "Lewy Ctrl+lewy Win (do pierwszego układu), prawy Ctrl+Menu (do drugiego układu)"
-#: ../rules/base.xml.in.h:919
+#: ../rules/base.xml.in.h:920
msgid "Key to choose 3rd level"
msgstr "Klawisz wybierający poziom 3."
-#: ../rules/base.xml.in.h:920
+#: ../rules/base.xml.in.h:921
msgid "Any Win key"
msgstr "Dowolny klawisz Win"
-#: ../rules/base.xml.in.h:921
+#: ../rules/base.xml.in.h:922
msgid "Any Alt key"
msgstr "Dowolny klawisz Alt"
-#: ../rules/base.xml.in.h:922
+#: ../rules/base.xml.in.h:923
msgid "Right Alt, Shift+Right Alt key is Compose"
msgstr "Prawy Alt, Shift+prawy Alt jako Compose"
-#: ../rules/base.xml.in.h:923
+#: ../rules/base.xml.in.h:924
msgid "Right Alt key never chooses 3rd level"
msgstr "Prawy Alt nigdy nie wybierający poziomu 3."
-#: ../rules/base.xml.in.h:924
+#: ../rules/base.xml.in.h:925
msgid "Enter on keypad"
msgstr "Enter na klawiaturze numerycznej"
-#: ../rules/base.xml.in.h:925
+#: ../rules/base.xml.in.h:926
msgid "Backslash"
msgstr "Backslash"
-#: ../rules/base.xml.in.h:926
+#: ../rules/base.xml.in.h:927
msgid "&lt;Less/Greater&gt;"
msgstr "&lt;Mniejsze/Większe&gt;"
-#: ../rules/base.xml.in.h:927
+#: ../rules/base.xml.in.h:928
msgid "Caps Lock chooses 3rd level, acts as onetime lock when pressed together with another 3rd-level-chooser"
msgstr "CapsLock wybiera poziom 3., jednorazowo blokuje przy naciśnięciu z innym klawiszem wybierającym poziom 3."
-#: ../rules/base.xml.in.h:928
+#: ../rules/base.xml.in.h:929
msgid "Backslash chooses 3rd level, acts as onetime lock when pressed together with another 3rd-level-chooser"
msgstr "Odwrotny ukośnik wybiera poziom 3., jednorazowo blokuje przy naciśnięciu z innym klawiszem wybierającym poziom 3."
-#: ../rules/base.xml.in.h:929
+#: ../rules/base.xml.in.h:930
msgid "&lt;Less/Greater&gt; chooses 3rd level, acts as onetime lock when pressed together with another 3rd-level-chooser"
msgstr "&lt;Mniejsze/Większe&gt; wybiera poziom 3., jednorazowo blokuje przy naciśnięciu z innym klawiszem wybierającym poziom 3."
-#: ../rules/base.xml.in.h:930
+#: ../rules/base.xml.in.h:931
msgid "Ctrl key position"
msgstr "Położenie klawisza Ctrl"
-#: ../rules/base.xml.in.h:931
+#: ../rules/base.xml.in.h:932
msgid "Caps Lock as Ctrl"
msgstr "CapsLock jako Ctrl"
-#: ../rules/base.xml.in.h:932
+#: ../rules/base.xml.in.h:933
msgid "Left Ctrl as Meta"
msgstr "Lewy Ctrl jako Meta"
-#: ../rules/base.xml.in.h:933
+#: ../rules/base.xml.in.h:934
msgid "Swap Ctrl and Caps Lock"
msgstr "Zamiana Ctrl i CapsLocka"
-#: ../rules/base.xml.in.h:934
+#: ../rules/base.xml.in.h:935
msgid "At left of 'A'"
msgstr "Z lewej 'A'"
-#: ../rules/base.xml.in.h:935
+#: ../rules/base.xml.in.h:936
msgid "At bottom left"
msgstr "W lewym dolnym rogu"
-#: ../rules/base.xml.in.h:936
+#: ../rules/base.xml.in.h:937
msgid "Right Ctrl as Right Alt"
msgstr "Prawy Ctrl jako prawy Alt"
-#: ../rules/base.xml.in.h:937
+#: ../rules/base.xml.in.h:938
msgid "Menu as Right Ctrl"
msgstr "Menu jako prawy Ctrl"
-#: ../rules/base.xml.in.h:938
+#: ../rules/base.xml.in.h:939
msgid "Right Alt as Right Ctrl"
msgstr "Prawy Alt jako prawy Ctrl"
-#: ../rules/base.xml.in.h:939
+#: ../rules/base.xml.in.h:940
+msgid "Swap Left Alt key with Left Ctrl key"
+msgstr "Zamiana lewego Alta z lewym Ctrl"
+
+#: ../rules/base.xml.in.h:941
+msgid "Swap Left Win key with Left Ctrl key"
+msgstr "Zamiana lewego Win z lewym Ctrl"
+
+#: ../rules/base.xml.in.h:942
+msgid "Left Alt as Ctrl, Left Ctrl as Win, Left Win as Alt"
+msgstr "Lewy Alt jako Ctrl, lewy Ctrl jako Win, lewy Win jako Alt"
+
+#: ../rules/base.xml.in.h:943
msgid "Use keyboard LED to show alternative layout"
msgstr "Używanie diody na klawiaturze do sygnalizacji układu alternatywnego"
-#: ../rules/base.xml.in.h:940
+#: ../rules/base.xml.in.h:944
msgid "Num Lock"
msgstr "NumLock"
-#: ../rules/base.xml.in.h:941
+#: ../rules/base.xml.in.h:945
msgid "Layout of numeric keypad"
msgstr "Układ klawiatury numerycznej"
-#: ../rules/base.xml.in.h:942
+#: ../rules/base.xml.in.h:946
msgid "Legacy"
msgstr "Stary"
-#: ../rules/base.xml.in.h:943
+#: ../rules/base.xml.in.h:947
msgid "Unicode additions (arrows and math operators)"
msgstr "Dodatki Unicode (strzałki i symbole matematyczne)"
-#: ../rules/base.xml.in.h:944
+#: ../rules/base.xml.in.h:948
msgid "Unicode additions (arrows and math operators; math operators on default level)"
msgstr "Dodatki Unicode (strzałki i symbole matematyczne; symbole matematyczne na poziomie domyślnym)"
-#: ../rules/base.xml.in.h:945
+#: ../rules/base.xml.in.h:949
msgid "Legacy Wang 724"
msgstr "Legacy Wang 724"
-#: ../rules/base.xml.in.h:946
+#: ../rules/base.xml.in.h:950
msgid "Wang 724 keypad with Unicode additions (arrows and math operators)"
msgstr "Klawiatura numeryczna Wang 724 z dodatkami Unicode (strzałki i symbole matematyczne)"
-#: ../rules/base.xml.in.h:947
+#: ../rules/base.xml.in.h:951
msgid "Wang 724 keypad with Unicode additions (arrows and math operators; math operators on default level)"
msgstr "Klawiatura numeryczna Wang 724 z dodatkami Unicode (strzałki i symbole matematyczne; symbole matematyczne na poziomie domyślnym)"
-#: ../rules/base.xml.in.h:948
+#: ../rules/base.xml.in.h:952
msgid "Hexadecimal"
msgstr "Szesnastkowy"
-#: ../rules/base.xml.in.h:949
+#: ../rules/base.xml.in.h:953
msgid "ATM/phone-style"
msgstr "ATM/telefoniczna"
-#: ../rules/base.xml.in.h:950
+#: ../rules/base.xml.in.h:954
msgid "Numeric keypad delete key behaviour"
msgstr "Zachowanie klawisza Delete na klawiaturze numerycznej"
-#: ../rules/base.xml.in.h:951
+#: ../rules/base.xml.in.h:955
msgid "Legacy key with dot"
msgstr "Klawisz tradycyjny z kropką"
#. Actually, with KP_SEPARATOR, as the old keypad(comma)
-#: ../rules/base.xml.in.h:953
+#: ../rules/base.xml.in.h:957
msgid "Legacy key with comma"
msgstr "Klawisz tradycyjny z przecinkiem"
-#: ../rules/base.xml.in.h:954
+#: ../rules/base.xml.in.h:958
msgid "Four-level key with dot"
msgstr "Klawisz czterofunkcyjny z kropką"
-#: ../rules/base.xml.in.h:955
+#: ../rules/base.xml.in.h:959
msgid "Four-level key with dot, Latin-9 only"
msgstr "Klawisz czterofunkcyjny z kropką, tylko Latin-9"
-#: ../rules/base.xml.in.h:956
+#: ../rules/base.xml.in.h:960
msgid "Four-level key with comma"
msgstr "Klawisz czterofunkcyjny z przecinkiem"
-#: ../rules/base.xml.in.h:957
+#: ../rules/base.xml.in.h:961
msgid "Four-level key with momayyez"
msgstr "Klawisz czterofunkcyjny ze znakiem momayyez"
#. This assumes the KP_ abstract symbols are actually useful for some apps
#. The description needs to be rewritten
-#: ../rules/base.xml.in.h:960
+#: ../rules/base.xml.in.h:964
msgid "Four-level key with abstract separators"
msgstr "Klawisz czterofunkcyjny z abstrakcyjnymi separatorami"
-#: ../rules/base.xml.in.h:961
+#: ../rules/base.xml.in.h:965
msgid "Semicolon on third level"
msgstr "Średnik na poziomie 3."
-#: ../rules/base.xml.in.h:962
+#: ../rules/base.xml.in.h:966
msgid "Caps Lock key behavior"
msgstr "Zachowanie klawisza CapsLock"
-#: ../rules/base.xml.in.h:963
+#: ../rules/base.xml.in.h:967
msgid "Caps Lock uses internal capitalization; Shift \"pauses\" Caps Lock"
msgstr "CapsLock używa wewnętrznej zmiany rozmiaru liter; Shift wstrzymuje CapsLock"
-#: ../rules/base.xml.in.h:964
+#: ../rules/base.xml.in.h:968
msgid "Caps Lock uses internal capitalization; Shift doesn't affect Caps Lock"
msgstr "CapsLock używa wewnętrznej zmiany rozmiaru liter; Shift nie wpływa na CapsLock"
-#: ../rules/base.xml.in.h:965
+#: ../rules/base.xml.in.h:969
msgid "Caps Lock acts as Shift with locking; Shift \"pauses\" Caps Lock"
msgstr "CapsLock działa jako Shift z blokadą; Shift wstrzymuje CapsLock"
-#: ../rules/base.xml.in.h:966
+#: ../rules/base.xml.in.h:970
msgid "Caps Lock acts as Shift with locking; Shift doesn't affect Caps Lock"
msgstr "CapsLock działa jako Shift z blokadą; Shift nie wpływa na CapsLock"
-#: ../rules/base.xml.in.h:967
+#: ../rules/base.xml.in.h:971
msgid "Caps Lock toggles normal capitalization of alphabetic characters"
msgstr "CapsLock przełącza wielkość znaków alfabetycznych"
-#: ../rules/base.xml.in.h:968
+#: ../rules/base.xml.in.h:972
msgid "Make Caps Lock an additional Num Lock"
msgstr "CapsLock jako dodatkowy NumLock"
-#: ../rules/base.xml.in.h:969
+#: ../rules/base.xml.in.h:973
msgid "Swap ESC and Caps Lock"
msgstr "Zamiana Esc i CapsLocka"
-#: ../rules/base.xml.in.h:970
+#: ../rules/base.xml.in.h:974
msgid "Make Caps Lock an additional ESC"
msgstr "CapsLock jako dodatkowy Esc"
-#: ../rules/base.xml.in.h:971
+#: ../rules/base.xml.in.h:975
msgid "Make Caps Lock an additional Backspace"
msgstr "CapsLock jako dodatkowy Backspace"
-#: ../rules/base.xml.in.h:972
+#: ../rules/base.xml.in.h:976
msgid "Make Caps Lock an additional Super"
msgstr "CapsLock jako dodatkowy Super"
-#: ../rules/base.xml.in.h:973
+#: ../rules/base.xml.in.h:977
msgid "Make Caps Lock an additional Hyper"
msgstr "CapsLock jako dodatkowy Hyper"
-#: ../rules/base.xml.in.h:974
+#: ../rules/base.xml.in.h:978
msgid "Caps Lock toggles ShiftLock (affects all keys)"
msgstr "CapsLock przełącza ShiftLock (wpływając na wszystkie klawisze)"
-#: ../rules/base.xml.in.h:975
+#: ../rules/base.xml.in.h:979
msgid "Caps Lock is disabled"
msgstr "CapsLock wyłączony"
-#: ../rules/base.xml.in.h:976
+#: ../rules/base.xml.in.h:980
msgid "Make Caps Lock an additional Ctrl"
msgstr "CapsLock jako dodatkowy Ctrl"
-#: ../rules/base.xml.in.h:977
+#: ../rules/base.xml.in.h:981
msgid "Alt/Win key behavior"
msgstr "Zachowanie klawiszy Alt/Win"
-#: ../rules/base.xml.in.h:978
+#: ../rules/base.xml.in.h:982
msgid "Add the standard behavior to Menu key"
msgstr "Dodanie standardowego działania klawisza Menu"
-#: ../rules/base.xml.in.h:979
+#: ../rules/base.xml.in.h:983
msgid "Alt and Meta are on Alt keys"
msgstr "Alt i Meta pod klawiszami Alt"
-#: ../rules/base.xml.in.h:980
+#: ../rules/base.xml.in.h:984
msgid "Alt is mapped to Win keys (and the usual Alt keys)"
msgstr "Alt pod klawiszami Win (oraz zwykłymi klawiszami Alt)"
-#: ../rules/base.xml.in.h:981
+#: ../rules/base.xml.in.h:985
msgid "Ctrl is mapped to Win keys (and the usual Ctrl keys)"
msgstr "Ctrl pod klawiszami Win (oraz zwykłymi klawiszami Ctrl)"
-#: ../rules/base.xml.in.h:982
+#: ../rules/base.xml.in.h:986
msgid "Ctrl is mapped to Alt keys, Alt is mapped to Win keys"
msgstr "Ctrl pod klawiszami Alt, Alt pod klawiszami Win"
-#: ../rules/base.xml.in.h:983
+#: ../rules/base.xml.in.h:987
msgid "Meta is mapped to Win keys"
msgstr "Meta pod klawiszami Win"
-#: ../rules/base.xml.in.h:984
+#: ../rules/base.xml.in.h:988
msgid "Meta is mapped to Left Win"
msgstr "Meta pod lewym Win"
-#: ../rules/base.xml.in.h:985
+#: ../rules/base.xml.in.h:989
msgid "Hyper is mapped to Win-keys"
msgstr "Hyper pod klawiszami Win"
-#: ../rules/base.xml.in.h:986
+#: ../rules/base.xml.in.h:990
msgid "Alt is mapped to Right Win, Super to Menu"
msgstr "Alt pod prawym Win, Super pod Menu"
-#: ../rules/base.xml.in.h:987
+#: ../rules/base.xml.in.h:991
msgid "Alt is swapped with Win"
msgstr "Lewy zamieniony z Win"
-#: ../rules/base.xml.in.h:988
+#: ../rules/base.xml.in.h:992
msgid "Position of Compose key"
msgstr "Położenie klawisza Compose"
-#: ../rules/base.xml.in.h:989
+#: ../rules/base.xml.in.h:993
msgid "3rd level of Left Win"
msgstr "Pozion 3. lewego klawisza Win"
-#: ../rules/base.xml.in.h:990
+#: ../rules/base.xml.in.h:994
msgid "3rd level of Right Win"
msgstr "Pozion 3. prawego klawisza Win"
-#: ../rules/base.xml.in.h:991
+#: ../rules/base.xml.in.h:995
msgid "3rd level of Menu"
msgstr "Poziom 3. klawisza Menu"
-#: ../rules/base.xml.in.h:992
+#: ../rules/base.xml.in.h:996
msgid "3rd level of Left Ctrl"
msgstr "Poziom 3. lewego klawisza Ctrl"
-#: ../rules/base.xml.in.h:993
+#: ../rules/base.xml.in.h:997
msgid "3rd level of Right Ctrl"
msgstr "Poziom 3. prawego klawisza Ctrl"
-#: ../rules/base.xml.in.h:994
+#: ../rules/base.xml.in.h:998
msgid "3rd level of Caps Lock"
msgstr "Poziom 3. klawisza Caps Lock"
-#: ../rules/base.xml.in.h:995
+#: ../rules/base.xml.in.h:999
msgid "3rd level of &lt;Less/Greater&gt;"
msgstr "Poziom 3. klawisza &lt;Mniejsze/Większe&gt;"
-#: ../rules/base.xml.in.h:996
+#: ../rules/base.xml.in.h:1000
msgid "Pause"
msgstr "Pauza"
-#: ../rules/base.xml.in.h:997
+#: ../rules/base.xml.in.h:1001
msgid "PrtSc"
msgstr "PrtSc"
-#: ../rules/base.xml.in.h:998
+#: ../rules/base.xml.in.h:1002
msgid "Miscellaneous compatibility options"
msgstr "Różne opcje kompatybilności"
-#: ../rules/base.xml.in.h:999
+#: ../rules/base.xml.in.h:1003
msgid "Default numeric keypad keys"
msgstr "Domyślne klawisze klawiatury numerycznej"
-#: ../rules/base.xml.in.h:1000
+#: ../rules/base.xml.in.h:1004
msgid "Numeric keypad keys always enter digits (as in Mac OS)"
msgstr "Klawiatura numeryczna zawsze prowadza cyfry (jak w Mac OS)"
-#: ../rules/base.xml.in.h:1001
+#: ../rules/base.xml.in.h:1005
msgid "Shift with numeric keypad keys works as in MS Windows"
msgstr "Shift z klawiaturą numeryczną działą jak pod MS Windows"
-#: ../rules/base.xml.in.h:1002
+#: ../rules/base.xml.in.h:1006
msgid "Shift does not cancel Num Lock, chooses 3rd level instead"
msgstr "Shift nie anuluje NumLocka, wybiera poziom 3."
-#: ../rules/base.xml.in.h:1003
+#: ../rules/base.xml.in.h:1007
msgid "Special keys (Ctrl+Alt+&lt;key&gt;) handled in a server"
msgstr "Klawisze specjalne (Ctrl+Alt+&lt;klawisz&gt;) obsługiwane przez serwer"
-#: ../rules/base.xml.in.h:1004
+#: ../rules/base.xml.in.h:1008
msgid "Apple Aluminium Keyboard: emulate PC keys (Print, Scroll Lock, Pause, Num Lock)"
msgstr "Apple Aluminium Keyboard: emulacja klawiszy PC (Print, ScrollLock, Pause, NumLock)"
-#: ../rules/base.xml.in.h:1005
+#: ../rules/base.xml.in.h:1009
msgid "Shift cancels Caps Lock"
msgstr "Shift anuluje CapsLock"
-#: ../rules/base.xml.in.h:1006
+#: ../rules/base.xml.in.h:1010
msgid "Enable extra typographic characters"
msgstr "Włączenie dodatkowych znaków typograficznych"
-#: ../rules/base.xml.in.h:1007
+#: ../rules/base.xml.in.h:1011
msgid "Both Shift keys together toggle Caps Lock"
msgstr "Oba klawisze Shift naraz przełączają CapsLock"
-#: ../rules/base.xml.in.h:1008
+#: ../rules/base.xml.in.h:1012
msgid "Both Shift keys together activate Caps Lock, one Shift key deactivates"
msgstr "Oba klawisze Shift naraz włączają CapsLock, jeden Shift wyłącza"
-#: ../rules/base.xml.in.h:1009
+#: ../rules/base.xml.in.h:1013
msgid "Both Shift keys together toggle ShiftLock"
msgstr "Oba klawisze Shift naraz przełączają ShiftLock"
-#: ../rules/base.xml.in.h:1010
+#: ../rules/base.xml.in.h:1014
msgid "Shift + NumLock toggles PointerKeys"
msgstr "Shift + NumLock przełącza klawisze kursorów"
-#: ../rules/base.xml.in.h:1011
+#: ../rules/base.xml.in.h:1015
msgid "Allow breaking grabs with keyboard actions (warning: security risk)"
msgstr "Akcje klawiatury mogą przełamywać przechwytywanie (uwaga: zagrożenie bezpieczeństwa)"
-#: ../rules/base.xml.in.h:1012
+#: ../rules/base.xml.in.h:1016
+msgid "Allow grab and window tree logging"
+msgstr "Możliwe przechwytywanie i logowanie drzewa okien"
+
+#: ../rules/base.xml.in.h:1017
msgid "Adding currency signs to certain keys"
msgstr "Dodanie znaków walut do pewnych klawiszy"
-#: ../rules/base.xml.in.h:1013
+#: ../rules/base.xml.in.h:1018
msgid "Euro on E"
msgstr "Euro pod E"
-#: ../rules/base.xml.in.h:1014
+#: ../rules/base.xml.in.h:1019
msgid "Euro on 2"
msgstr "Euro pod 2"
-#: ../rules/base.xml.in.h:1015
+#: ../rules/base.xml.in.h:1020
msgid "Euro on 4"
msgstr "Euro pod 4"
-#: ../rules/base.xml.in.h:1016
+#: ../rules/base.xml.in.h:1021
msgid "Euro on 5"
msgstr "Euro pod 5"
-#: ../rules/base.xml.in.h:1017
+#: ../rules/base.xml.in.h:1022
msgid "Rupee on 4"
msgstr "Rupia pod 4"
-#: ../rules/base.xml.in.h:1018
+#: ../rules/base.xml.in.h:1023
msgid "Key to choose 5th level"
msgstr "Klawisz wybierający poziom 5."
-#: ../rules/base.xml.in.h:1019
+#: ../rules/base.xml.in.h:1024
msgid "&lt;Less/Greater&gt; chooses 5th level, locks when pressed together with another 5th-level-chooser"
msgstr "&lt;Mniejsze/Większe&gt; wybiera poziom 5., blokuje przy naciśnięciu z innym klawiszem wybierającym poziom 5."
-#: ../rules/base.xml.in.h:1020
+#: ../rules/base.xml.in.h:1025
msgid "Right Alt chooses 5th level, locks when pressed together with another 5th-level-chooser"
msgstr "Prawy Alt wybiera poziom 5., blokuje przy naciśnięciu z innym klawiszem wybierającym poziom 5."
-#: ../rules/base.xml.in.h:1021
+#: ../rules/base.xml.in.h:1026
msgid "Left Win chooses 5th level, locks when pressed together with another 5th-level-chooser"
msgstr "Lewy Win wybiera poziom 5., blokuje przy naciśnięciu z innym klawiszem wybierającym poziom 5."
-#: ../rules/base.xml.in.h:1022
+#: ../rules/base.xml.in.h:1027
msgid "Right Win chooses 5th level, locks when pressed together with another 5th-level-chooser"
msgstr "Prawy Win wybiera poziom 5., blokuje przy naciśnięciu z innym klawiszem wybierającym poziom 5."
-#: ../rules/base.xml.in.h:1023
+#: ../rules/base.xml.in.h:1028
msgid "Using space key to input non-breakable space character"
msgstr "Używanie klawisza spacji do wprowadzania znaku niełamliwej spacji"
-#: ../rules/base.xml.in.h:1024
+#: ../rules/base.xml.in.h:1029
msgid "Usual space at any level"
msgstr "Zwykła spacja na dowolnym poziomie"
-#: ../rules/base.xml.in.h:1025
+#: ../rules/base.xml.in.h:1030
msgid "Non-breakable space character at second level"
msgstr "Znak niełamliwej spacji na poziomie 2."
-#: ../rules/base.xml.in.h:1026
+#: ../rules/base.xml.in.h:1031
msgid "Non-breakable space character at third level"
msgstr "Znak niełamliwej spacji na poziomie 3."
-#: ../rules/base.xml.in.h:1027
+#: ../rules/base.xml.in.h:1032
msgid "Non-breakable space character at third level, nothing at fourth level"
msgstr "Znak niełamliwej spacji na poziomie 3., nic na poziomie 4."
-#: ../rules/base.xml.in.h:1028
+#: ../rules/base.xml.in.h:1033
msgid "Non-breakable space character at third level, thin non-breakable space character at fourth level"
msgstr "Znak niełamliwej spacji na poziomie 3., wąskiej niełamliwej spacji na poziomie 4."
-#: ../rules/base.xml.in.h:1029
+#: ../rules/base.xml.in.h:1034
msgid "Non-breakable space character at fourth level"
msgstr "Znak niełamliwej spacji na poziomie 4."
-#: ../rules/base.xml.in.h:1030
+#: ../rules/base.xml.in.h:1035
msgid "Non-breakable space character at fourth level, thin non-breakable space character at sixth level"
msgstr "Znak niełamliwej spacji na poziomie 4., wąskiej niełamliwej spacji na poziomie 6."
-#: ../rules/base.xml.in.h:1031
+#: ../rules/base.xml.in.h:1036
msgid "Non-breakable space character at fourth level, thin non-breakable space character at sixth level (via Ctrl+Shift)"
msgstr "Znak niełamliwej spacji na poziomie 4., wąskiej niełamliwej spacji na poziomie 6. (z Ctrl+Shift)"
-#: ../rules/base.xml.in.h:1032
+#: ../rules/base.xml.in.h:1037
msgid "Zero-width non-joiner character at second level"
msgstr "Znak rozdzielający zerowej szerokości na poziomie 2."
-#: ../rules/base.xml.in.h:1033
+#: ../rules/base.xml.in.h:1038
msgid "Zero-width non-joiner character at second level, zero-width joiner character at third level"
msgstr "Znak rozdzielający zerowej szerokości na poziomie 2., znak łączący zerowej szerokości na poziomie 3."
-#: ../rules/base.xml.in.h:1034
+#: ../rules/base.xml.in.h:1039
msgid "Zero-width non-joiner character at second level, zero-width joiner character at third level, non-breakable space character at fourth level"
msgstr "Znak rozdzielający zerowej szerokości na poziomie 2., znak łączący zerowej szerokości na poziomie 3., znak niełamliwej spacji na poziomie 4."
-#: ../rules/base.xml.in.h:1035
+#: ../rules/base.xml.in.h:1040
msgid "Zero-width non-joiner character at second level, non-breakable space character at third level"
msgstr "Znak rozdzielający zerowej szerokości na poziomie 2., znak niełamliwej spacji na poziomie 3."
-#: ../rules/base.xml.in.h:1036
+#: ../rules/base.xml.in.h:1041
msgid "Zero-width non-joiner character at second level, non-breakable space character at third level, nothing at fourth level"
msgstr "Znak rozdzielający zerowej szerokości na poziomie 2., znak niełamliwej spacji na poziomie 3., nic na poziomie 4."
-#: ../rules/base.xml.in.h:1037
+#: ../rules/base.xml.in.h:1042
msgid "Zero-width non-joiner character at second level, non-breakable space character at third level, zero-width joiner at fourth level"
msgstr "Znak rozdzielający zerowej szerokości na poziomie 2., znak niełamliwej spacji na poziomie 3., znak łączący zerowej szerokości na poziomie 4."
-#: ../rules/base.xml.in.h:1038
+#: ../rules/base.xml.in.h:1043
msgid "Zero-width non-joiner character at second level, non-breakable space character at third level, thin non-breakable space at fourth level"
msgstr "Znak rozdzielający zerowej szerokości na poziomie 2., znak niełamliwej spacji na poziomie 3., wąskiej niełamliwej spacji na poziomie 4."
-#: ../rules/base.xml.in.h:1039
+#: ../rules/base.xml.in.h:1044
msgid "Zero-width non-joiner character at third level, zero-width joiner at fourth level"
msgstr "Znak rozdzielający zerowej szerokości na poziomie 3., znak łączący zerowej szerokości na poziomie 4."
-#: ../rules/base.xml.in.h:1040
+#: ../rules/base.xml.in.h:1045
msgid "Japanese keyboard options"
msgstr "Opcje klawiatury japońskiej"
-#: ../rules/base.xml.in.h:1041
+#: ../rules/base.xml.in.h:1046
msgid "Kana Lock key is locking"
msgstr "Blokujący klawisz Kana Lock"
-#: ../rules/base.xml.in.h:1042
+#: ../rules/base.xml.in.h:1047
msgid "NICOLA-F style Backspace"
msgstr "Backspace w stylu NICOLA-F"
-#: ../rules/base.xml.in.h:1043
+#: ../rules/base.xml.in.h:1048
msgid "Make Zenkaku Hankaku an additional ESC"
msgstr "Zenkaku Hankaku jako dodatkowy Esc"
-#: ../rules/base.xml.in.h:1044
+#: ../rules/base.xml.in.h:1049
msgid "Adding Esperanto supersigned letters"
msgstr "Dodanie akcentów Esperanto (supersigno)"
-#: ../rules/base.xml.in.h:1045
+#: ../rules/base.xml.in.h:1050
msgid "To the corresponding key in a Qwerty layout"
msgstr "Pod odpowiednimi klawiszami wg układu QWERTY"
-#: ../rules/base.xml.in.h:1046
+#: ../rules/base.xml.in.h:1051
msgid "To the corresponding key in a Dvorak layout"
msgstr "Pod odpowiednimi klawiszami wg układu Dvoraka"
-#: ../rules/base.xml.in.h:1047
+#: ../rules/base.xml.in.h:1052
msgid "To the corresponding key in a Colemak layout"
msgstr "Pod odpowiednimi klawiszami wg układu Colemak"
-#: ../rules/base.xml.in.h:1048
+#: ../rules/base.xml.in.h:1053
msgid "Maintain key compatibility with old Solaris keycodes"
msgstr "Zachowanie zgodności klawiszy ze starymi kodami Solarisa"
-#: ../rules/base.xml.in.h:1049
+#: ../rules/base.xml.in.h:1054
msgid "Sun Key compatibility"
msgstr "Zgodność klawiszy z Sunem"
-#: ../rules/base.xml.in.h:1050
+#: ../rules/base.xml.in.h:1055
msgid "Key sequence to kill the X server"
msgstr "Sekwencja klawiszy zabijająca serwer X"
-#: ../rules/base.xml.in.h:1051
+#: ../rules/base.xml.in.h:1056
msgid "Ctrl + Alt + Backspace"
msgstr "Ctrl + Alt + Backspace"
@@ -4018,146 +4038,150 @@ msgstr "Coeur d'Alene Salish"
msgid "English (US, Sun Type 6/7)"
msgstr "Angielski (USA, Sun Type 6/7)"
-#: ../rules/base.extras.xml.in.h:42
+#: ../rules/base.extras.xml.in.h:40
+msgid "English (Norman)"
+msgstr "Angielski (Normana)"
+
+#: ../rules/base.extras.xml.in.h:43
msgid "Polish (international with dead keys)"
msgstr "Polski (międzynarodowy z klawiszami akcentów)"
-#: ../rules/base.extras.xml.in.h:43
+#: ../rules/base.extras.xml.in.h:44
msgid "Polish (Colemak)"
msgstr "Polski (Colemak)"
-#: ../rules/base.extras.xml.in.h:44
+#: ../rules/base.extras.xml.in.h:45
msgid "Polish (Sun Type 6/7)"
msgstr "Polski (Sun Type 6/7)"
-#: ../rules/base.extras.xml.in.h:48
+#: ../rules/base.extras.xml.in.h:49
msgid "Crimean Tatar (Dobruja Q)"
msgstr "Krymskotatarski (Dobruja Q)"
-#: ../rules/base.extras.xml.in.h:49
+#: ../rules/base.extras.xml.in.h:50
msgid "Romanian (ergonomic Touchtype)"
msgstr "Rumuński (ergonomiczny Touchtype)"
-#: ../rules/base.extras.xml.in.h:50
+#: ../rules/base.extras.xml.in.h:51
msgid "Romanian (Sun Type 6/7)"
msgstr "Rumuński (Sun Type 6/7)"
-#: ../rules/base.extras.xml.in.h:53
+#: ../rules/base.extras.xml.in.h:54
msgid "Serbian (combining accents instead of dead keys)"
msgstr "Serbski (łączenie akcentów zamiast klawiszy akcentów)"
-#: ../rules/base.extras.xml.in.h:56
+#: ../rules/base.extras.xml.in.h:57
msgid "Russian (with Ukrainian-Belorussian layout)"
msgstr "Rosyjski (z układem ukraińsko-białoruskim)"
-#: ../rules/base.extras.xml.in.h:57
+#: ../rules/base.extras.xml.in.h:58
msgid "Russian (Sun Type 6/7)"
msgstr "Rosyjski (Sun Type 6/7)"
-#: ../rules/base.extras.xml.in.h:60
+#: ../rules/base.extras.xml.in.h:61
msgid "Armenian (OLPC phonetic)"
msgstr "Armeński (fonetyczny OLPC)"
-#: ../rules/base.extras.xml.in.h:63
+#: ../rules/base.extras.xml.in.h:64
msgid "Hebrew (Biblical, SIL phonetic)"
msgstr "Hebrajski (biblijny, fonetyczny SIL)"
-#: ../rules/base.extras.xml.in.h:66
+#: ../rules/base.extras.xml.in.h:67
msgid "Arabic (Sun Type 6/7)"
msgstr "Arabski (Sun Type 6/7)"
-#: ../rules/base.extras.xml.in.h:69
+#: ../rules/base.extras.xml.in.h:70
msgid "Belgian (Sun Type 6/7)"
msgstr "Belgijski (Sun Type 6/7)"
-#: ../rules/base.extras.xml.in.h:72
+#: ../rules/base.extras.xml.in.h:73
msgid "Portuguese (Brazil, Sun Type 6/7)"
msgstr "Portugalski (Brazylia, Sun Type 6/7)"
-#: ../rules/base.extras.xml.in.h:75
+#: ../rules/base.extras.xml.in.h:76
msgid "Czech (Sun Type 6/7)"
msgstr "Czeski (Sun Type 6/7)"
-#: ../rules/base.extras.xml.in.h:78
+#: ../rules/base.extras.xml.in.h:79
msgid "Danish (Sun Type 6/7)"
msgstr "Duński (Sun Type 6/7)"
-#: ../rules/base.extras.xml.in.h:81
+#: ../rules/base.extras.xml.in.h:82
msgid "Dutch (Sun Type 6/7)"
msgstr "Holenderski (Sun Type 6/7)"
-#: ../rules/base.extras.xml.in.h:84
+#: ../rules/base.extras.xml.in.h:85
msgid "Estonian (Sun Type 6/7)"
msgstr "Estoński (Sun Type 6/7)"
-#: ../rules/base.extras.xml.in.h:87
+#: ../rules/base.extras.xml.in.h:88
msgid "Finnish (Sun Type 6/7)"
msgstr "Fiński (Sun Type 6/7)"
-#: ../rules/base.extras.xml.in.h:89
+#: ../rules/base.extras.xml.in.h:90
msgid "French (Sun Type 6/7)"
msgstr "Francuski (Sun Type 6/7)"
-#: ../rules/base.extras.xml.in.h:92
+#: ../rules/base.extras.xml.in.h:93
msgid "Greek (Sun Type 6/7)"
msgstr "Grecki (Sun Type 6/7)"
-#: ../rules/base.extras.xml.in.h:95
+#: ../rules/base.extras.xml.in.h:96
msgid "Italian (Sun Type 6/7)"
msgstr "Włoski (Sun Type 6/7)"
-#: ../rules/base.extras.xml.in.h:98
+#: ../rules/base.extras.xml.in.h:99
msgid "Japanese (Sun Type 6)"
msgstr "Japoński (Sun Type 6)"
-#: ../rules/base.extras.xml.in.h:99
+#: ../rules/base.extras.xml.in.h:100
msgid "Japanese (Sun Type 7 - pc compatible)"
msgstr "Japoński (Sun Type 7 - kompatybilny z PC)"
-#: ../rules/base.extras.xml.in.h:100
+#: ../rules/base.extras.xml.in.h:101
msgid "Japanese (Sun Type 7 - sun compatible)"
msgstr "Japoński (Sun Type 7 - kompatybilny z Sunem)"
-#: ../rules/base.extras.xml.in.h:103
+#: ../rules/base.extras.xml.in.h:104
msgid "Norwegian (Sun Type 6/7)"
msgstr "Norweski (Sun Type 6/7)"
-#: ../rules/base.extras.xml.in.h:105
+#: ../rules/base.extras.xml.in.h:106
msgid "Portuguese (Sun Type 6/7)"
msgstr "Portugalski (Sun Type 6/7)"
-#: ../rules/base.extras.xml.in.h:108
+#: ../rules/base.extras.xml.in.h:109
msgid "Slovak (Sun Type 6/7)"
msgstr "Słowacki (Sun Type 6/7)"
-#: ../rules/base.extras.xml.in.h:111
+#: ../rules/base.extras.xml.in.h:112
msgid "Spanish (Sun Type 6/7)"
msgstr "Hiszpański (Sun Type 6/7)"
-#: ../rules/base.extras.xml.in.h:114
+#: ../rules/base.extras.xml.in.h:115
msgid "Swedish (Sun Type 6/7)"
msgstr "Szwedzki (Sun Type 6/7)"
-#: ../rules/base.extras.xml.in.h:116
+#: ../rules/base.extras.xml.in.h:117
msgid "German (Switzerland, Sun Type 6/7)"
msgstr "Niemiecki (Szwajcaria, Sun Type 6/7)"
-#: ../rules/base.extras.xml.in.h:117
+#: ../rules/base.extras.xml.in.h:118
msgid "French (Switzerland, Sun Type 6/7)"
msgstr "Francuski (Szwajcaria, Sun Type 6/7)"
-#: ../rules/base.extras.xml.in.h:120
+#: ../rules/base.extras.xml.in.h:121
msgid "Turkish (Sun Type 6/7)"
msgstr "Turecki (Sun Type 6/7)"
-#: ../rules/base.extras.xml.in.h:123
+#: ../rules/base.extras.xml.in.h:124
msgid "Ukrainian (Sun Type 6/7)"
msgstr "Ukraiński (Sun Type 6/7)"
-#: ../rules/base.extras.xml.in.h:125
+#: ../rules/base.extras.xml.in.h:126
msgid "English (UK, Sun Type 6/7)"
msgstr "Angielski (USA, Sun Type 6/7)"
-#: ../rules/base.extras.xml.in.h:128
+#: ../rules/base.extras.xml.in.h:129
msgid "Korean (Sun Type 6/7)"
msgstr "Koreański (Sun Type 6/7)"
diff --git a/xorg-server/xkeyboard-config/po/pt_BR.po b/xorg-server/xkeyboard-config/po/pt_BR.po
index 53be57077..c5331d532 100644
--- a/xorg-server/xkeyboard-config/po/pt_BR.po
+++ b/xorg-server/xkeyboard-config/po/pt_BR.po
@@ -1,15 +1,15 @@
# Brazilian Portuguese translation for xkeyboard-config
-# Copyright (c) 2013 Canonical Ltd, and Rosetta Contributors 2013
+# Copyright (c) 2014 Canonical Ltd, and Rosetta Contributors 2014
# This file is distributed under the same license as the xkeyboard-config package.
# Gabriell Nascimento <gabriellhrn@gmail.com>, 2012.
-# Enrico Nicoletto <liverig@gmail.com>, 2013.
+# Enrico Nicoletto <liverig@gmail.com>, 2013, 2014.
#
msgid ""
msgstr ""
-"Project-Id-Version: xkeyboard-config 2.9.91\n"
+"Project-Id-Version: xkeyboard-config 2.10.99\n"
"Report-Msgid-Bugs-To: svu@users.sourceforge.net\n"
-"POT-Creation-Date: 2013-09-14 14:41+0200\n"
-"PO-Revision-Date: 2013-09-14 20:48-0300\n"
+"POT-Creation-Date: 2014-01-15 01:12+0000\n"
+"PO-Revision-Date: 2014-01-15 09:43-0300\n"
"Last-Translator: Enrico Nicoletto <liverig@gmail.com>\n"
"Language-Team: Brazilian Portuguese <ldpbr-translation@lists.sourceforge.net>\n"
"Language: pt_BR\n"
@@ -17,7 +17,7 @@ msgstr ""
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"X-Launchpad-Export-Date: 2012-09-01 07:16+0000\n"
-"X-Generator: Poedit 1.5.7\n"
+"X-Generator: Poedit 1.6.3\n"
#: ../rules/base.xml.in.h:1
msgid "Generic 101-key PC"
@@ -818,7 +818,7 @@ msgid "English (programmer Dvorak)"
msgstr "Inglês (Dvorak para programador)"
#. Keyboard indicator for Russian layouts
-#: ../rules/base.xml.in.h:203 ../rules/base.extras.xml.in.h:54
+#: ../rules/base.xml.in.h:203 ../rules/base.extras.xml.in.h:55
msgid "ru"
msgstr "ru"
@@ -890,11 +890,11 @@ msgid "Uzbek (Afghanistan, OLPC)"
msgstr "Uzbeque (Afeganistão, OLPC)"
#. Keyboard indicator for Arabic layouts
-#: ../rules/base.xml.in.h:224 ../rules/base.extras.xml.in.h:64
+#: ../rules/base.xml.in.h:224 ../rules/base.extras.xml.in.h:65
msgid "ar"
msgstr "ar"
-#: ../rules/base.xml.in.h:225 ../rules/base.extras.xml.in.h:65
+#: ../rules/base.xml.in.h:225 ../rules/base.extras.xml.in.h:66
msgid "Arabic"
msgstr "Árabe"
@@ -932,11 +932,11 @@ msgid "Albanian"
msgstr "Albanês"
#. Keyboard indicator for Armenian layouts
-#: ../rules/base.xml.in.h:236 ../rules/base.extras.xml.in.h:58
+#: ../rules/base.xml.in.h:236 ../rules/base.extras.xml.in.h:59
msgid "hy"
msgstr "hy"
-#: ../rules/base.xml.in.h:237 ../rules/base.extras.xml.in.h:59
+#: ../rules/base.xml.in.h:237 ../rules/base.extras.xml.in.h:60
msgid "Armenian"
msgstr "Armênio"
@@ -1012,11 +1012,11 @@ msgid "Belarusian (Latin)"
msgstr "Bielorrusso (latino)"
#. Keyboard indicator for Belgian layouts
-#: ../rules/base.xml.in.h:259 ../rules/base.extras.xml.in.h:67
+#: ../rules/base.xml.in.h:259 ../rules/base.extras.xml.in.h:68
msgid "be"
msgstr "be"
-#: ../rules/base.xml.in.h:260 ../rules/base.extras.xml.in.h:68
+#: ../rules/base.xml.in.h:260 ../rules/base.extras.xml.in.h:69
msgid "Belgian"
msgstr "Belga"
@@ -1048,17 +1048,17 @@ msgstr "Belga (Teclas mortas da Sun)"
msgid "Belgian (Wang model 724 azerty)"
msgstr "Belga (Wang modelo 724 azerty)"
-#. Keyboard indicator for Bengali layouts
+#. Keyboard indicator for Bangla layouts
#: ../rules/base.xml.in.h:269
msgid "bn"
msgstr "bn"
#: ../rules/base.xml.in.h:270
-msgid "Bengali"
+msgid "Bangla"
msgstr "Bengali"
#: ../rules/base.xml.in.h:271
-msgid "Bengali (Probhat)"
+msgid "Bangla (Probhat)"
msgstr "Bengali (Probhat)"
#. Keyboard indicator for Indian layouts
@@ -1071,27 +1071,27 @@ msgid "Indian"
msgstr "Indiano"
#: ../rules/base.xml.in.h:275
-msgid "Bengali (India)"
+msgid "Bangla (India)"
msgstr "Bengali (Índia)"
#: ../rules/base.xml.in.h:276
-msgid "Bengali (India, Probhat)"
+msgid "Bangla (India, Probhat)"
msgstr "Bengali (Índia, Probhat)"
#: ../rules/base.xml.in.h:277
-msgid "Bengali (India, Baishakhi)"
+msgid "Bangla (India, Baishakhi)"
msgstr "Bengali (Índia, Baishakhi)"
#: ../rules/base.xml.in.h:278
-msgid "Bengali (India, Bornona)"
+msgid "Bangla (India, Bornona)"
msgstr "Bengali (Índia, Bornona)"
#: ../rules/base.xml.in.h:279
-msgid "Bengali (India, Uni Gitanjali)"
+msgid "Bangla (India, Uni Gitanjali)"
msgstr "Bengali (Índia, Uni Gitanjali)"
#: ../rules/base.xml.in.h:280
-msgid "Bengali (India, Baishakhi Inscript)"
+msgid "Bangla (India, Baishakhi Inscript)"
msgstr "Bengali (Índia, Baishakhi Inscript)"
#. Keyboard indicator for Gujarati layouts
@@ -1275,11 +1275,11 @@ msgid "Bosnian (US keyboard with Bosnian letters)"
msgstr "Bósnio (Teclado EUA com letras bósnias)"
#. Keyboard indicator for Portuguese layouts
-#: ../rules/base.xml.in.h:336 ../rules/base.extras.xml.in.h:70
+#: ../rules/base.xml.in.h:336 ../rules/base.extras.xml.in.h:71
msgid "pt"
msgstr "pt"
-#: ../rules/base.xml.in.h:337 ../rules/base.extras.xml.in.h:71
+#: ../rules/base.xml.in.h:337 ../rules/base.extras.xml.in.h:72
msgid "Portuguese (Brazil)"
msgstr "Português (Brasil)"
@@ -1292,16 +1292,16 @@ msgid "Portuguese (Brazil, Dvorak)"
msgstr "Portuguese (Brasil, Dvorak)"
#: ../rules/base.xml.in.h:340
-msgid "Portuguese (Brazil, nativo)"
+msgid "Portuguese (Brazil, Nativo)"
msgstr "Português (Brasil, nativo)"
#: ../rules/base.xml.in.h:341
-msgid "Portuguese (Brazil, nativo for US keyboards)"
+msgid "Portuguese (Brazil, Nativo for US keyboards)"
msgstr "Português (Brasil, nativo para teclados americanos)"
#: ../rules/base.xml.in.h:342
-msgid "Portuguese (Brazil, nativo for Esperanto)"
-msgstr "Português (Brasil, nativo para Esperanto)"
+msgid "Esperanto (Brazil, Nativo)"
+msgstr "Esperanto (Brasil, nativo)"
#. Keyboard indicator for Bulgarian layouts
#: ../rules/base.xml.in.h:344
@@ -1455,2462 +1455,2483 @@ msgid "Tibetan (with ASCII numerals)"
msgstr "Tibetano (com númerais ASCII)"
#: ../rules/base.xml.in.h:386
+msgid "ug"
+msgstr "ug"
+
+#: ../rules/base.xml.in.h:387
msgid "Uyghur"
msgstr "Uigur"
#. Keyboard indicator for Croatian layouts
-#: ../rules/base.xml.in.h:388
+#: ../rules/base.xml.in.h:389
msgid "hr"
msgstr "hr"
-#: ../rules/base.xml.in.h:389
+#: ../rules/base.xml.in.h:390
msgid "Croatian"
msgstr "Croata"
-#: ../rules/base.xml.in.h:390
+#: ../rules/base.xml.in.h:391
msgid "Croatian (use guillemets for quotes)"
msgstr "Croata (utilizar aspas para citações)"
-#: ../rules/base.xml.in.h:391
+#: ../rules/base.xml.in.h:392
msgid "Croatian (use Croatian digraphs)"
msgstr "Croata (utilizar dígrafos croatas)"
-#: ../rules/base.xml.in.h:392
+#: ../rules/base.xml.in.h:393
msgid "Croatian (US keyboard with Croatian digraphs)"
msgstr "Croata (Teclado EUA com digráfos croatas)"
-#: ../rules/base.xml.in.h:393
+#: ../rules/base.xml.in.h:394
msgid "Croatian (US keyboard with Croatian letters)"
msgstr "Croata (Teclado EUA com letras croatas)"
#. Keyboard indicator for Chech layouts
-#: ../rules/base.xml.in.h:395 ../rules/base.extras.xml.in.h:73
+#: ../rules/base.xml.in.h:396 ../rules/base.extras.xml.in.h:74
msgid "cs"
msgstr "cs"
-#: ../rules/base.xml.in.h:396 ../rules/base.extras.xml.in.h:74
+#: ../rules/base.xml.in.h:397 ../rules/base.extras.xml.in.h:75
msgid "Czech"
msgstr "Tchéco"
-#: ../rules/base.xml.in.h:397
+#: ../rules/base.xml.in.h:398
msgid "Czech (with &lt;\\|&gt; key)"
msgstr "Tcheco (com a tecla &lt;\\|&gt;)"
-#: ../rules/base.xml.in.h:398
+#: ../rules/base.xml.in.h:399
msgid "Czech (qwerty)"
msgstr "Tcheco (qwerty)"
-#: ../rules/base.xml.in.h:399
+#: ../rules/base.xml.in.h:400
msgid "Czech (qwerty, extended Backslash)"
msgstr "Tcheco (qwerty, barra invertida extendida)"
-#: ../rules/base.xml.in.h:400
+#: ../rules/base.xml.in.h:401
msgid "Czech (UCW layout, accented letters only)"
msgstr "Tcheco (leiaute UCW, apenas letras acentuadas)"
-#: ../rules/base.xml.in.h:401
+#: ../rules/base.xml.in.h:402
msgid "Czech (US Dvorak with CZ UCW support)"
msgstr "Tcheco (Dvorak americano com suporte CZ UCW)"
#. Keyboard indicator for Danish layouts
-#: ../rules/base.xml.in.h:403 ../rules/base.extras.xml.in.h:76
+#: ../rules/base.xml.in.h:404 ../rules/base.extras.xml.in.h:77
msgid "da"
msgstr "da"
-#: ../rules/base.xml.in.h:404 ../rules/base.extras.xml.in.h:77
+#: ../rules/base.xml.in.h:405 ../rules/base.extras.xml.in.h:78
msgid "Danish"
msgstr "Dinamarquês"
-#: ../rules/base.xml.in.h:405
+#: ../rules/base.xml.in.h:406
msgid "Danish (eliminate dead keys)"
msgstr "Dinamarquês (sem teclas mortas)"
-#: ../rules/base.xml.in.h:406
+#: ../rules/base.xml.in.h:407
msgid "Danish (Macintosh)"
msgstr "Dinamarquês (Macintosh)"
-#: ../rules/base.xml.in.h:407
+#: ../rules/base.xml.in.h:408
msgid "Danish (Macintosh, eliminate dead keys)"
msgstr "Dinamarquês (Macintosh, eliminar teclas mortas)"
-#: ../rules/base.xml.in.h:408
+#: ../rules/base.xml.in.h:409
msgid "Danish (Dvorak)"
msgstr "Dinamarquês (Dvorak)"
#. Keyboard indicator for Dutch layouts
-#: ../rules/base.xml.in.h:410 ../rules/base.extras.xml.in.h:79
+#: ../rules/base.xml.in.h:411 ../rules/base.extras.xml.in.h:80
msgid "nl"
msgstr "nl"
-#: ../rules/base.xml.in.h:411 ../rules/base.extras.xml.in.h:80
+#: ../rules/base.xml.in.h:412 ../rules/base.extras.xml.in.h:81
msgid "Dutch"
msgstr "Holandês"
-#: ../rules/base.xml.in.h:412
+#: ../rules/base.xml.in.h:413
msgid "Dutch (Sun dead keys)"
msgstr "Holandês (Teclas mortas da Sun)"
-#: ../rules/base.xml.in.h:413
+#: ../rules/base.xml.in.h:414
msgid "Dutch (Macintosh)"
msgstr "Holandês (Macintosh)"
-#: ../rules/base.xml.in.h:414
+#: ../rules/base.xml.in.h:415
msgid "Dutch (standard)"
msgstr "Holandês (padrão)"
#. Keyboard indicator for Dzongkha layouts
-#: ../rules/base.xml.in.h:416
+#: ../rules/base.xml.in.h:417
msgid "dz"
msgstr "dz"
-#: ../rules/base.xml.in.h:417
+#: ../rules/base.xml.in.h:418
msgid "Dzongkha"
msgstr "Dzongkha"
#. Keyboard indicator for Estonian layouts
-#: ../rules/base.xml.in.h:419 ../rules/base.extras.xml.in.h:82
+#: ../rules/base.xml.in.h:420 ../rules/base.extras.xml.in.h:83
msgid "et"
msgstr "et"
-#: ../rules/base.xml.in.h:420 ../rules/base.extras.xml.in.h:83
+#: ../rules/base.xml.in.h:421 ../rules/base.extras.xml.in.h:84
msgid "Estonian"
msgstr "Estônio"
-#: ../rules/base.xml.in.h:421
+#: ../rules/base.xml.in.h:422
msgid "Estonian (eliminate dead keys)"
msgstr "Estoniano (sem teclas mortas)"
-#: ../rules/base.xml.in.h:422
+#: ../rules/base.xml.in.h:423
msgid "Estonian (Dvorak)"
msgstr "Estoniano (Dvorak)"
-#: ../rules/base.xml.in.h:423
+#: ../rules/base.xml.in.h:424
msgid "Estonian (US keyboard with Estonian letters)"
msgstr "Estoniano (teclado EUA com letras estonianas)"
-#: ../rules/base.xml.in.h:424 ../rules/base.extras.xml.in.h:16
+#: ../rules/base.xml.in.h:425 ../rules/base.extras.xml.in.h:16
msgid "Persian"
msgstr "Persa"
-#: ../rules/base.xml.in.h:425
+#: ../rules/base.xml.in.h:426
msgid "Persian (with Persian Keypad)"
msgstr "Persa (com teclado númerico persa)"
#. Keyboard indicator for Kurdish layouts
-#: ../rules/base.xml.in.h:427
+#: ../rules/base.xml.in.h:428
msgid "ku"
msgstr "ku"
-#: ../rules/base.xml.in.h:428
+#: ../rules/base.xml.in.h:429
msgid "Kurdish (Iran, Latin Q)"
msgstr "Curdo (Irã, Q latino)"
-#: ../rules/base.xml.in.h:429
+#: ../rules/base.xml.in.h:430
msgid "Kurdish (Iran, F)"
msgstr "Curdo (Irã, F)"
-#: ../rules/base.xml.in.h:430
+#: ../rules/base.xml.in.h:431
msgid "Kurdish (Iran, Latin Alt-Q)"
msgstr "Curdo (Irã, latino Alt-Q)"
-#: ../rules/base.xml.in.h:431
+#: ../rules/base.xml.in.h:432
msgid "Kurdish (Iran, Arabic-Latin)"
msgstr "Curdo (Irã, Arábico-Latino)"
-#: ../rules/base.xml.in.h:432
+#: ../rules/base.xml.in.h:433
msgid "Iraqi"
msgstr "Iraqui"
-#: ../rules/base.xml.in.h:433
+#: ../rules/base.xml.in.h:434
msgid "Kurdish (Iraq, Latin Q)"
msgstr "Curdo (Irã, Q latino)"
-#: ../rules/base.xml.in.h:434
+#: ../rules/base.xml.in.h:435
msgid "Kurdish (Iraq, F)"
msgstr "Curdo (Iraque, F)"
-#: ../rules/base.xml.in.h:435
+#: ../rules/base.xml.in.h:436
msgid "Kurdish (Iraq, Latin Alt-Q)"
msgstr "Curdo (Iraque, alt-Q latino)"
-#: ../rules/base.xml.in.h:436
+#: ../rules/base.xml.in.h:437
msgid "Kurdish (Iraq, Arabic-Latin)"
msgstr "Curdo (Iraque, Arábico-Latino)"
#. Keyboard indicator for Faroese layouts
-#: ../rules/base.xml.in.h:438
+#: ../rules/base.xml.in.h:439
msgid "fo"
msgstr "fo"
-#: ../rules/base.xml.in.h:439
+#: ../rules/base.xml.in.h:440
msgid "Faroese"
msgstr "Faroês"
-#: ../rules/base.xml.in.h:440
+#: ../rules/base.xml.in.h:441
msgid "Faroese (eliminate dead keys)"
msgstr "Feroês (sem teclas mortas)"
#. Keyboard indicator for Finnish layouts
-#: ../rules/base.xml.in.h:442 ../rules/base.extras.xml.in.h:85
+#: ../rules/base.xml.in.h:443 ../rules/base.extras.xml.in.h:86
msgid "fi"
msgstr "fi"
-#: ../rules/base.xml.in.h:443 ../rules/base.extras.xml.in.h:86
+#: ../rules/base.xml.in.h:444 ../rules/base.extras.xml.in.h:87
msgid "Finnish"
msgstr "Finlandês"
-#: ../rules/base.xml.in.h:444
+#: ../rules/base.xml.in.h:445
msgid "Finnish (classic)"
msgstr "Finlandês (clássico)"
-#: ../rules/base.xml.in.h:445
+#: ../rules/base.xml.in.h:446
msgid "Finnish (classic, eliminate dead keys)"
msgstr "Finlandês (clássico, sem teclas mortas)"
-#: ../rules/base.xml.in.h:446
+#: ../rules/base.xml.in.h:447
msgid "Northern Saami (Finland)"
msgstr "Lapão setentrional (Finlândia)"
-#: ../rules/base.xml.in.h:447
+#: ../rules/base.xml.in.h:448
msgid "Finnish (Macintosh)"
msgstr "Finlandês (Macintosh)"
-#: ../rules/base.xml.in.h:448 ../rules/base.extras.xml.in.h:88
+#: ../rules/base.xml.in.h:449 ../rules/base.extras.xml.in.h:89
msgid "French"
msgstr "Francês"
-#: ../rules/base.xml.in.h:449
+#: ../rules/base.xml.in.h:450
msgid "French (eliminate dead keys)"
msgstr "Francês (sem teclas mortas)"
-#: ../rules/base.xml.in.h:450
+#: ../rules/base.xml.in.h:451
msgid "French (Sun dead keys)"
msgstr "Francês (Teclas mortas da Sun)"
-#: ../rules/base.xml.in.h:451
+#: ../rules/base.xml.in.h:452
msgid "French (alternative)"
msgstr "Francês (alternativo)"
-#: ../rules/base.xml.in.h:452
+#: ../rules/base.xml.in.h:453
msgid "French (alternative, Latin-9 only)"
msgstr "Francês (alternativo, apenas Latin-9)"
-#: ../rules/base.xml.in.h:453
+#: ../rules/base.xml.in.h:454
msgid "French (alternative, eliminate dead keys)"
msgstr "Francês (alternativo, sem teclas mortas)"
-#: ../rules/base.xml.in.h:454
+#: ../rules/base.xml.in.h:455
msgid "French (alternative, Sun dead keys)"
msgstr "Francês (alternativo, com teclas mortas da Sun)"
-#: ../rules/base.xml.in.h:455
+#: ../rules/base.xml.in.h:456
msgid "French (legacy, alternative)"
msgstr "Francês (legado, alternativo)"
-#: ../rules/base.xml.in.h:456
+#: ../rules/base.xml.in.h:457
msgid "French (legacy, alternative, eliminate dead keys)"
msgstr "Francês (legado, alternativo, eliminar teclas mortas)"
-#: ../rules/base.xml.in.h:457
+#: ../rules/base.xml.in.h:458
msgid "French (legacy, alternative, Sun dead keys)"
msgstr "Francês (legado, alternativo, teclas mortas da Sun)"
-#: ../rules/base.xml.in.h:458
+#: ../rules/base.xml.in.h:459
msgid "French (Bepo, ergonomic, Dvorak way)"
msgstr "Francês (Bepó, ergonômico, Dvorak)"
-#: ../rules/base.xml.in.h:459
+#: ../rules/base.xml.in.h:460
msgid "French (Bepo, ergonomic, Dvorak way, Latin-9 only)"
msgstr "Francês (Bepó, ergonômico, modo Dvorak, apenas Latin-9)"
-#: ../rules/base.xml.in.h:460
+#: ../rules/base.xml.in.h:461
msgid "French (Dvorak)"
msgstr "Francês (Dvorak)"
-#: ../rules/base.xml.in.h:461
+#: ../rules/base.xml.in.h:462
msgid "French (Macintosh)"
msgstr "Francês (Macintosh)"
-#: ../rules/base.xml.in.h:462
+#: ../rules/base.xml.in.h:463
msgid "French (Breton)"
msgstr "Francês (Bretão)"
-#: ../rules/base.xml.in.h:463
+#: ../rules/base.xml.in.h:464
msgid "Occitan"
msgstr "Occitano"
-#: ../rules/base.xml.in.h:464
+#: ../rules/base.xml.in.h:465
msgid "Georgian (France, AZERTY Tskapo)"
msgstr "Georgiano (França, AZERTY Tskapo)"
-#: ../rules/base.xml.in.h:465
+#: ../rules/base.xml.in.h:466
msgid "English (Ghana)"
msgstr "Inglês (Gana)"
-#: ../rules/base.xml.in.h:466
+#: ../rules/base.xml.in.h:467
msgid "English (Ghana, multilingual)"
msgstr "Inglês (Gana, multilíngue)"
#. Keyboard indicator for Akan layouts
-#: ../rules/base.xml.in.h:468
+#: ../rules/base.xml.in.h:469
msgid "ak"
msgstr "ak"
-#: ../rules/base.xml.in.h:469
+#: ../rules/base.xml.in.h:470
msgid "Akan"
msgstr "Akan"
#. Keyboard indicator for Ewe layouts
-#: ../rules/base.xml.in.h:471
+#: ../rules/base.xml.in.h:472
msgid "ee"
msgstr "ee"
-#: ../rules/base.xml.in.h:472
+#: ../rules/base.xml.in.h:473
msgid "Ewe"
msgstr "Ewe"
#. Keyboard indicator for Fula layouts
-#: ../rules/base.xml.in.h:474
+#: ../rules/base.xml.in.h:475
msgid "ff"
msgstr "ff"
-#: ../rules/base.xml.in.h:475
+#: ../rules/base.xml.in.h:476
msgid "Fula"
msgstr "Fula"
#. Keyboard indicator for Ga layouts
-#: ../rules/base.xml.in.h:477
+#: ../rules/base.xml.in.h:478
msgid "gaa"
msgstr "gaa"
-#: ../rules/base.xml.in.h:478
+#: ../rules/base.xml.in.h:479
msgid "Ga"
msgstr "Ga"
#. Keyboard indicator for Hausa layouts
-#: ../rules/base.xml.in.h:480
+#: ../rules/base.xml.in.h:481
msgid "ha"
msgstr "ha"
-#: ../rules/base.xml.in.h:481
+#: ../rules/base.xml.in.h:482
msgid "Hausa"
msgstr "Hausa"
#. Keyboard indicator for Avatime layouts
-#: ../rules/base.xml.in.h:483
+#: ../rules/base.xml.in.h:484
msgid "avn"
msgstr "avn"
-#: ../rules/base.xml.in.h:484
+#: ../rules/base.xml.in.h:485
msgid "Avatime"
msgstr "Avatime"
-#: ../rules/base.xml.in.h:485
+#: ../rules/base.xml.in.h:486
msgid "English (Ghana, GILLBT)"
msgstr "Inglês (Gana, GILLBT)"
-#: ../rules/base.xml.in.h:486
+#: ../rules/base.xml.in.h:487
msgid "French (Guinea)"
msgstr "Francês (Guiné)"
#. Keyboard indicator for Georgian layouts
-#: ../rules/base.xml.in.h:488
+#: ../rules/base.xml.in.h:489
msgid "ka"
msgstr "ka"
-#: ../rules/base.xml.in.h:489
+#: ../rules/base.xml.in.h:490
msgid "Georgian"
msgstr "Georgiano"
-#: ../rules/base.xml.in.h:490
+#: ../rules/base.xml.in.h:491
msgid "Georgian (ergonomic)"
msgstr "Georgiano (ergonômico)"
-#: ../rules/base.xml.in.h:491
+#: ../rules/base.xml.in.h:492
msgid "Georgian (MESS)"
msgstr "Georgiano (MESS)"
-#: ../rules/base.xml.in.h:492
+#: ../rules/base.xml.in.h:493
msgid "Russian (Georgia)"
msgstr "Russo (Geórgia)"
-#: ../rules/base.xml.in.h:493
+#: ../rules/base.xml.in.h:494
msgid "Ossetian (Georgia)"
msgstr "Osseto (Geórgia)"
-#: ../rules/base.xml.in.h:494 ../rules/base.extras.xml.in.h:11
+#: ../rules/base.xml.in.h:495 ../rules/base.extras.xml.in.h:11
msgid "German"
msgstr "Alemão"
-#: ../rules/base.xml.in.h:495
+#: ../rules/base.xml.in.h:496
msgid "German (dead acute)"
msgstr "Alemão (com acento agudo)"
-#: ../rules/base.xml.in.h:496
+#: ../rules/base.xml.in.h:497
msgid "German (dead grave acute)"
msgstr "Alemão (com acentos grave e agudo)"
-#: ../rules/base.xml.in.h:497
+#: ../rules/base.xml.in.h:498
msgid "German (eliminate dead keys)"
msgstr "Alemão (sem teclas mortas)"
-#: ../rules/base.xml.in.h:498
+#: ../rules/base.xml.in.h:499
msgid "German (T3)"
msgstr "Alemão (T3)"
-#: ../rules/base.xml.in.h:499
+#: ../rules/base.xml.in.h:500
msgid "Romanian (Germany)"
msgstr "Romeno (Alemanha)"
-#: ../rules/base.xml.in.h:500
+#: ../rules/base.xml.in.h:501
msgid "Romanian (Germany, eliminate dead keys)"
msgstr "Romeno (Alemanha, eliminar teclas mortas)"
-#: ../rules/base.xml.in.h:501
+#: ../rules/base.xml.in.h:502
msgid "German (Dvorak)"
msgstr "Alemão (Dvorak)"
-#: ../rules/base.xml.in.h:502
+#: ../rules/base.xml.in.h:503
msgid "German (Sun dead keys)"
msgstr "Alemão (Teclas mortas da Sun)"
-#: ../rules/base.xml.in.h:503
+#: ../rules/base.xml.in.h:504
msgid "German (Neo 2)"
msgstr "Alemão (Neo 2)"
-#: ../rules/base.xml.in.h:504
+#: ../rules/base.xml.in.h:505
msgid "German (Macintosh)"
msgstr "Alemão (Macintosh)"
-#: ../rules/base.xml.in.h:505
+#: ../rules/base.xml.in.h:506
msgid "German (Macintosh, eliminate dead keys)"
msgstr "Alemão (Macintosh, eliminar teclas mortas)"
-#: ../rules/base.xml.in.h:506
+#: ../rules/base.xml.in.h:507
msgid "Lower Sorbian"
msgstr "Baixo Sorábio"
-#: ../rules/base.xml.in.h:507
+#: ../rules/base.xml.in.h:508
msgid "Lower Sorbian (qwertz)"
msgstr "Baixo Sorábio (qwertz)"
-#: ../rules/base.xml.in.h:508
+#: ../rules/base.xml.in.h:509
msgid "German (qwerty)"
msgstr "Alemão (qwerty)"
-#: ../rules/base.xml.in.h:509
+#: ../rules/base.xml.in.h:510
msgid "Russian (Germany, phonetic)"
msgstr "Russo (Alemanha, fonético)"
-#: ../rules/base.xml.in.h:510
+#: ../rules/base.xml.in.h:511
msgid "German (legacy)"
msgstr "Alemão (legado)"
#. Keyboard indicator for Greek layouts
-#: ../rules/base.xml.in.h:512 ../rules/base.extras.xml.in.h:90
+#: ../rules/base.xml.in.h:513 ../rules/base.extras.xml.in.h:91
msgid "gr"
msgstr "gr"
-#: ../rules/base.xml.in.h:513 ../rules/base.extras.xml.in.h:91
+#: ../rules/base.xml.in.h:514 ../rules/base.extras.xml.in.h:92
msgid "Greek"
msgstr "Grego"
-#: ../rules/base.xml.in.h:514
+#: ../rules/base.xml.in.h:515
msgid "Greek (simple)"
msgstr "Grego (simplificado)"
-#: ../rules/base.xml.in.h:515
+#: ../rules/base.xml.in.h:516
msgid "Greek (extended)"
msgstr "Grego (estendido)"
-#: ../rules/base.xml.in.h:516
+#: ../rules/base.xml.in.h:517
msgid "Greek (eliminate dead keys)"
msgstr "Grego (sem teclas mortas)"
-#: ../rules/base.xml.in.h:517
+#: ../rules/base.xml.in.h:518
msgid "Greek (polytonic)"
msgstr "Grego (politônico)"
#. Keyboard indicator for Hungarian layouts
-#: ../rules/base.xml.in.h:519
+#: ../rules/base.xml.in.h:520
msgid "hu"
msgstr "hu"
-#: ../rules/base.xml.in.h:520
+#: ../rules/base.xml.in.h:521
msgid "Hungarian"
msgstr "Húngaro"
-#: ../rules/base.xml.in.h:521
+#: ../rules/base.xml.in.h:522
msgid "Hungarian (standard)"
msgstr "Húngaro (padrão)"
-#: ../rules/base.xml.in.h:522
+#: ../rules/base.xml.in.h:523
msgid "Hungarian (eliminate dead keys)"
msgstr "Húngaro (sem teclas mortas)"
-#: ../rules/base.xml.in.h:523
+#: ../rules/base.xml.in.h:524
msgid "Hungarian (qwerty)"
msgstr "Húngaro (qwerty)"
-#: ../rules/base.xml.in.h:524
+#: ../rules/base.xml.in.h:525
msgid "Hungarian (101/qwertz/comma/dead keys)"
msgstr "Húngaro (101 teclas, qwertz, com vírgula e teclas mortas)"
-#: ../rules/base.xml.in.h:525
+#: ../rules/base.xml.in.h:526
msgid "Hungarian (101/qwertz/comma/eliminate dead keys)"
msgstr "Húngaro (101 teclas, qwertz, com vírgula e sem teclas mortas)"
-#: ../rules/base.xml.in.h:526
+#: ../rules/base.xml.in.h:527
msgid "Hungarian (101/qwertz/dot/dead keys)"
msgstr "Húngaro (101 teclas, qwertz, com ponto e teclas mortas)"
-#: ../rules/base.xml.in.h:527
+#: ../rules/base.xml.in.h:528
msgid "Hungarian (101/qwertz/dot/eliminate dead keys)"
msgstr "Húngaro (101 teclas, qwertz, com ponto e sem teclas mortas)"
-#: ../rules/base.xml.in.h:528
+#: ../rules/base.xml.in.h:529
msgid "Hungarian (101/qwerty/comma/dead keys)"
msgstr "Húngaro (101 teclas, qwerty, com vírgula e teclas mortas)"
-#: ../rules/base.xml.in.h:529
+#: ../rules/base.xml.in.h:530
msgid "Hungarian (101/qwerty/comma/eliminate dead keys)"
msgstr "Húngaro (101 teclas, qwerty, com vírgula e sem teclas mortas)"
-#: ../rules/base.xml.in.h:530
+#: ../rules/base.xml.in.h:531
msgid "Hungarian (101/qwerty/dot/dead keys)"
msgstr "Húngaro (101 teclas, qwerty, com ponto e teclas mortas)"
-#: ../rules/base.xml.in.h:531
+#: ../rules/base.xml.in.h:532
msgid "Hungarian (101/qwerty/dot/eliminate dead keys)"
msgstr "Húngaro (101 teclas, qwerty, com ponto e sem teclas mortas)"
-#: ../rules/base.xml.in.h:532
+#: ../rules/base.xml.in.h:533
msgid "Hungarian (102/qwertz/comma/dead keys)"
msgstr "Húngaro (102 teclas, qwertz, com vírgula e teclas mortas)"
-#: ../rules/base.xml.in.h:533
+#: ../rules/base.xml.in.h:534
msgid "Hungarian (102/qwertz/comma/eliminate dead keys)"
msgstr "Húngaro (102 teclas, qwertz, com vírgula e sem teclas mortas)"
-#: ../rules/base.xml.in.h:534
+#: ../rules/base.xml.in.h:535
msgid "Hungarian (102/qwertz/dot/dead keys)"
msgstr "Húngaro (102 teclas, qwertz, com ponto e teclas mortas)"
-#: ../rules/base.xml.in.h:535
+#: ../rules/base.xml.in.h:536
msgid "Hungarian (102/qwertz/dot/eliminate dead keys)"
msgstr "Húngaro (102 teclas, qwertz, com ponto e sem teclas mortas)"
-#: ../rules/base.xml.in.h:536
+#: ../rules/base.xml.in.h:537
msgid "Hungarian (102/qwerty/comma/dead keys)"
msgstr "Húngaro (102 teclas, qwerty, com vírgula e teclas mortas)"
-#: ../rules/base.xml.in.h:537
+#: ../rules/base.xml.in.h:538
msgid "Hungarian (102/qwerty/comma/eliminate dead keys)"
msgstr "Húngaro (102 teclas, qwerty, com vírgula e sem teclas mortas)"
-#: ../rules/base.xml.in.h:538
+#: ../rules/base.xml.in.h:539
msgid "Hungarian (102/qwerty/dot/dead keys)"
msgstr "Húngaro (102 teclas, qwerty, com ponto e teclas mortas)"
-#: ../rules/base.xml.in.h:539
+#: ../rules/base.xml.in.h:540
msgid "Hungarian (102/qwerty/dot/eliminate dead keys)"
msgstr "Húngaro (102 teclas, qwerty, com ponto e sem teclas mortas)"
#. Keyboard indicator for Icelandic layouts
-#: ../rules/base.xml.in.h:541
+#: ../rules/base.xml.in.h:542
msgid "is"
msgstr "is"
-#: ../rules/base.xml.in.h:542
+#: ../rules/base.xml.in.h:543
msgid "Icelandic"
msgstr "Islandês"
-#: ../rules/base.xml.in.h:543
+#: ../rules/base.xml.in.h:544
msgid "Icelandic (Sun dead keys)"
msgstr "Islandês (Teclas mortas da Sun)"
-#: ../rules/base.xml.in.h:544
+#: ../rules/base.xml.in.h:545
msgid "Icelandic (eliminate dead keys)"
msgstr "Islandês (sem teclas mortas)"
-#: ../rules/base.xml.in.h:545
+#: ../rules/base.xml.in.h:546
msgid "Icelandic (Macintosh)"
msgstr "Islandês (Macintosh)"
-#: ../rules/base.xml.in.h:546
+#: ../rules/base.xml.in.h:547
msgid "Icelandic (Dvorak)"
msgstr "Islandês (Dvorak)"
#. Keyboard indicator for Hebrew layouts
-#: ../rules/base.xml.in.h:548 ../rules/base.extras.xml.in.h:61
+#: ../rules/base.xml.in.h:549 ../rules/base.extras.xml.in.h:62
msgid "he"
msgstr "he"
-#: ../rules/base.xml.in.h:549 ../rules/base.extras.xml.in.h:62
+#: ../rules/base.xml.in.h:550 ../rules/base.extras.xml.in.h:63
msgid "Hebrew"
msgstr "Hebraico"
-#: ../rules/base.xml.in.h:550
+#: ../rules/base.xml.in.h:551
msgid "Hebrew (lyx)"
msgstr "Hebraico (lyx)"
-#: ../rules/base.xml.in.h:551
+#: ../rules/base.xml.in.h:552
msgid "Hebrew (phonetic)"
msgstr "Hebraico (fonético)"
-#: ../rules/base.xml.in.h:552
+#: ../rules/base.xml.in.h:553
msgid "Hebrew (Biblical, Tiro)"
msgstr "Hebraico (Bíblico, Tiro)"
#. Keyboard indicator for Italian layouts
-#: ../rules/base.xml.in.h:554 ../rules/base.extras.xml.in.h:93
+#: ../rules/base.xml.in.h:555 ../rules/base.extras.xml.in.h:94
msgid "it"
msgstr "it"
-#: ../rules/base.xml.in.h:555 ../rules/base.extras.xml.in.h:94
+#: ../rules/base.xml.in.h:556 ../rules/base.extras.xml.in.h:95
msgid "Italian"
msgstr "Italiano"
-#: ../rules/base.xml.in.h:556
+#: ../rules/base.xml.in.h:557
msgid "Italian (eliminate dead keys)"
msgstr "Italiano (sem teclas mortas)"
-#: ../rules/base.xml.in.h:557
+#: ../rules/base.xml.in.h:558
msgid "Italian (Macintosh)"
msgstr "Italiano (Macintosh)"
-#: ../rules/base.xml.in.h:558
+#: ../rules/base.xml.in.h:559
msgid "Italian (US keyboard with Italian letters)"
msgstr "Italiano (Teclado EUA com letras italianas)"
-#: ../rules/base.xml.in.h:559
+#: ../rules/base.xml.in.h:560
msgid "Georgian (Italy)"
msgstr "Georgiano (Itália)"
-#: ../rules/base.xml.in.h:560
+#: ../rules/base.xml.in.h:561
msgid "Italian (IBM 142)"
msgstr "Italiano (IBM 142)"
#. Keyboard indicator for Japanese layouts
-#: ../rules/base.xml.in.h:562 ../rules/base.extras.xml.in.h:96
+#: ../rules/base.xml.in.h:563 ../rules/base.extras.xml.in.h:97
msgid "ja"
msgstr "ja"
-#: ../rules/base.xml.in.h:563 ../rules/base.extras.xml.in.h:97
+#: ../rules/base.xml.in.h:564 ../rules/base.extras.xml.in.h:98
msgid "Japanese"
msgstr "Japonês"
-#: ../rules/base.xml.in.h:564
+#: ../rules/base.xml.in.h:565
msgid "Japanese (Kana)"
msgstr "Japonês (Kana)"
-#: ../rules/base.xml.in.h:565
+#: ../rules/base.xml.in.h:566
msgid "Japanese (Kana 86)"
msgstr "Japonês (Kana 86)"
-#: ../rules/base.xml.in.h:566
+#: ../rules/base.xml.in.h:567
msgid "Japanese (OADG 109A)"
msgstr "Japonês (OADG 109A)"
-#: ../rules/base.xml.in.h:567
+#: ../rules/base.xml.in.h:568
msgid "Japanese (Macintosh)"
msgstr "Japonês (Macintosh)"
-#: ../rules/base.xml.in.h:568
+#: ../rules/base.xml.in.h:569
msgid "Japanese (Dvorak)"
msgstr "Japonês (Dvorak)"
#. Keyboard indicator for Kikuyu layouts
-#: ../rules/base.xml.in.h:570
+#: ../rules/base.xml.in.h:571
msgid "ki"
msgstr "ki"
-#: ../rules/base.xml.in.h:571
+#: ../rules/base.xml.in.h:572
msgid "Kyrgyz"
msgstr "Quirguistão"
-#: ../rules/base.xml.in.h:572
+#: ../rules/base.xml.in.h:573
msgid "Kyrgyz (phonetic)"
msgstr "Quirguiz (fonético)"
#. Keyboard indicator for Khmer layouts
-#: ../rules/base.xml.in.h:574
+#: ../rules/base.xml.in.h:575
msgid "km"
msgstr "km"
-#: ../rules/base.xml.in.h:575
+#: ../rules/base.xml.in.h:576
msgid "Khmer (Cambodia)"
msgstr "Cambojano (Camboja)"
#. Keyboard indicator for Kazakh layouts
-#: ../rules/base.xml.in.h:577
+#: ../rules/base.xml.in.h:578
msgid "kk"
msgstr "kk"
-#: ../rules/base.xml.in.h:578
+#: ../rules/base.xml.in.h:579
msgid "Kazakh"
msgstr "Cazaque"
-#: ../rules/base.xml.in.h:579
+#: ../rules/base.xml.in.h:580
msgid "Russian (Kazakhstan, with Kazakh)"
msgstr "Russo (Cazaquistão, com cazaque)"
-#: ../rules/base.xml.in.h:580
+#: ../rules/base.xml.in.h:581
msgid "Kazakh (with Russian)"
msgstr "Cazaque (com Russo)"
#. Keyboard indicator for Lao layouts
-#: ../rules/base.xml.in.h:582
+#: ../rules/base.xml.in.h:583
msgid "lo"
msgstr "lo"
-#: ../rules/base.xml.in.h:583
+#: ../rules/base.xml.in.h:584
msgid "Lao"
msgstr "Laociano"
-#: ../rules/base.xml.in.h:584
+#: ../rules/base.xml.in.h:585
msgid "Lao (STEA proposed standard layout)"
msgstr "Laociano (padrão de teclado proposto pela STEA)"
#. Keyboard indicator for Spanish layouts
-#: ../rules/base.xml.in.h:586 ../rules/base.extras.xml.in.h:109
+#: ../rules/base.xml.in.h:587 ../rules/base.extras.xml.in.h:110
msgid "es"
msgstr "es"
-#: ../rules/base.xml.in.h:587
+#: ../rules/base.xml.in.h:588
msgid "Spanish (Latin American)"
msgstr "Espanhol (América Latina)"
-#: ../rules/base.xml.in.h:588
+#: ../rules/base.xml.in.h:589
msgid "Spanish (Latin American, eliminate dead keys)"
msgstr "Espanhol (América Latina, sem teclas mortas)"
-#: ../rules/base.xml.in.h:589
+#: ../rules/base.xml.in.h:590
msgid "Spanish (Latin American, include dead tilde)"
msgstr "Espanhol (América Latina, com tecla til)"
-#: ../rules/base.xml.in.h:590
+#: ../rules/base.xml.in.h:591
msgid "Spanish (Latin American, Sun dead keys)"
msgstr "Espanhol (América Latina, teclas mortas da Sun)"
#. Keyboard indicator for Lithuanian layouts
-#: ../rules/base.xml.in.h:592 ../rules/base.extras.xml.in.h:18
+#: ../rules/base.xml.in.h:593 ../rules/base.extras.xml.in.h:18
msgid "lt"
msgstr "lt"
-#: ../rules/base.xml.in.h:593 ../rules/base.extras.xml.in.h:19
+#: ../rules/base.xml.in.h:594 ../rules/base.extras.xml.in.h:19
msgid "Lithuanian"
msgstr "Lituânio"
-#: ../rules/base.xml.in.h:594
+#: ../rules/base.xml.in.h:595
msgid "Lithuanian (standard)"
msgstr "Lituano (padrão)"
-#: ../rules/base.xml.in.h:595
+#: ../rules/base.xml.in.h:596
msgid "Lithuanian (US keyboard with Lithuanian letters)"
msgstr "Lituano (Teclado EUA com letras lituanas)"
-#: ../rules/base.xml.in.h:596
+#: ../rules/base.xml.in.h:597
msgid "Lithuanian (IBM LST 1205-92)"
msgstr "Lituano (IBM LST 1205-92)"
-#: ../rules/base.xml.in.h:597
+#: ../rules/base.xml.in.h:598
msgid "Lithuanian (LEKP)"
msgstr "Lituano (LEKP)"
-#: ../rules/base.xml.in.h:598
+#: ../rules/base.xml.in.h:599
msgid "Lithuanian (LEKPa)"
msgstr "Lituano (LEKPa)"
#. Keyboard indicator for Latvian layouts
-#: ../rules/base.xml.in.h:600 ../rules/base.extras.xml.in.h:22
+#: ../rules/base.xml.in.h:601 ../rules/base.extras.xml.in.h:22
msgid "lv"
msgstr "lv"
-#: ../rules/base.xml.in.h:601 ../rules/base.extras.xml.in.h:23
+#: ../rules/base.xml.in.h:602 ../rules/base.extras.xml.in.h:23
msgid "Latvian"
msgstr "Letão"
-#: ../rules/base.xml.in.h:602
+#: ../rules/base.xml.in.h:603
msgid "Latvian (apostrophe variant)"
msgstr "Letão (variação com apóstrofes)"
-#: ../rules/base.xml.in.h:603
+#: ../rules/base.xml.in.h:604
msgid "Latvian (tilde variant)"
msgstr "Letão (variante com til)"
-#: ../rules/base.xml.in.h:604
+#: ../rules/base.xml.in.h:605
msgid "Latvian (F variant)"
msgstr "Letão (F variante)"
-#: ../rules/base.xml.in.h:605
+#: ../rules/base.xml.in.h:606
msgid "Latvian (modern)"
msgstr "Letão (moderno)"
-#: ../rules/base.xml.in.h:606
+#: ../rules/base.xml.in.h:607
msgid "Latvian (ergonomic, ŪGJRMV)"
msgstr "Letão (ergonômico, ŪGJRMV)"
-#: ../rules/base.xml.in.h:607
+#: ../rules/base.xml.in.h:608
msgid "Latvian (adapted)"
msgstr "Letão (adaptado)"
#. Keyboard indicator for Maori layouts
-#: ../rules/base.xml.in.h:609
+#: ../rules/base.xml.in.h:610
msgid "mi"
msgstr "mi"
-#: ../rules/base.xml.in.h:610
+#: ../rules/base.xml.in.h:611
msgid "Maori"
msgstr "Maori"
#. Keyboard indicator for Serbian layouts
-#: ../rules/base.xml.in.h:612 ../rules/base.extras.xml.in.h:51
+#: ../rules/base.xml.in.h:613 ../rules/base.extras.xml.in.h:52
msgid "sr"
msgstr "sr"
-#: ../rules/base.xml.in.h:613
+#: ../rules/base.xml.in.h:614
msgid "Montenegrin"
msgstr "Montenegrino"
-#: ../rules/base.xml.in.h:614
+#: ../rules/base.xml.in.h:615
msgid "Montenegrin (Cyrillic)"
msgstr "Montenegrino (Cirílico)"
-#: ../rules/base.xml.in.h:615
+#: ../rules/base.xml.in.h:616
msgid "Montenegrin (Cyrillic, Z and ZHE swapped)"
msgstr "Montenegrino (Cirílico, Z and ZHE invertidos)"
-#: ../rules/base.xml.in.h:616
+#: ../rules/base.xml.in.h:617
msgid "Montenegrin (Latin Unicode)"
msgstr "Montenegrino (Unicode latino)"
-#: ../rules/base.xml.in.h:617
+#: ../rules/base.xml.in.h:618
msgid "Montenegrin (Latin qwerty)"
msgstr "Montenegrino (qwerty latino)"
-#: ../rules/base.xml.in.h:618
+#: ../rules/base.xml.in.h:619
msgid "Montenegrin (Latin Unicode qwerty)"
msgstr "Montenegrino (Qwerty Unicode latino)"
-#: ../rules/base.xml.in.h:619
+#: ../rules/base.xml.in.h:620
msgid "Montenegrin (Cyrillic with guillemets)"
msgstr "Montenegrino (Cirílico com aspas angulares)"
-#: ../rules/base.xml.in.h:620
+#: ../rules/base.xml.in.h:621
msgid "Montenegrin (Latin with guillemets)"
msgstr "Montenegrino (Latino com aspas angulares)"
#. Keyboard indicator for Macedonian layouts
-#: ../rules/base.xml.in.h:622
+#: ../rules/base.xml.in.h:623
msgid "mk"
msgstr "mk"
-#: ../rules/base.xml.in.h:623
+#: ../rules/base.xml.in.h:624
msgid "Macedonian"
msgstr "Macedônio"
-#: ../rules/base.xml.in.h:624
+#: ../rules/base.xml.in.h:625
msgid "Macedonian (eliminate dead keys)"
msgstr "Macedoniano (sem teclas mortas)"
#. Keyboard indicator for Maltese layouts
-#: ../rules/base.xml.in.h:626
+#: ../rules/base.xml.in.h:627
msgid "mt"
msgstr "mt"
-#: ../rules/base.xml.in.h:627
+#: ../rules/base.xml.in.h:628
msgid "Maltese"
msgstr "Maltês"
-#: ../rules/base.xml.in.h:628
+#: ../rules/base.xml.in.h:629
msgid "Maltese (with US layout)"
msgstr "Maltês (Teclado EUA)"
#. Keyboard indicator for Mongolian layouts
-#: ../rules/base.xml.in.h:630
+#: ../rules/base.xml.in.h:631
msgid "mn"
msgstr "mn"
-#: ../rules/base.xml.in.h:631
+#: ../rules/base.xml.in.h:632
msgid "Mongolian"
msgstr "Mongol"
#. Keyboard indicator for Norwegian layouts
-#: ../rules/base.xml.in.h:633 ../rules/base.extras.xml.in.h:101
+#: ../rules/base.xml.in.h:634 ../rules/base.extras.xml.in.h:102
msgid "no"
msgstr "no"
-#: ../rules/base.xml.in.h:634 ../rules/base.extras.xml.in.h:102
+#: ../rules/base.xml.in.h:635 ../rules/base.extras.xml.in.h:103
msgid "Norwegian"
msgstr "Norueguês"
-#: ../rules/base.xml.in.h:635
+#: ../rules/base.xml.in.h:636
msgid "Norwegian (eliminate dead keys)"
msgstr "Norueguês (sem teclas mortas)"
-#: ../rules/base.xml.in.h:636
+#: ../rules/base.xml.in.h:637
msgid "Norwegian (Dvorak)"
msgstr "Norueguês (Dvorak)"
-#: ../rules/base.xml.in.h:637
+#: ../rules/base.xml.in.h:638
msgid "Northern Saami (Norway)"
msgstr "Lapão setentrional (Noruega)"
-#: ../rules/base.xml.in.h:638
+#: ../rules/base.xml.in.h:639
msgid "Northern Saami (Norway, eliminate dead keys)"
msgstr "Lapão setentrional (Noruega, eliminar teclas mortas)"
-#: ../rules/base.xml.in.h:639
+#: ../rules/base.xml.in.h:640
msgid "Norwegian (Macintosh)"
msgstr "Norueguês (Macintosh)"
-#: ../rules/base.xml.in.h:640
+#: ../rules/base.xml.in.h:641
msgid "Norwegian (Macintosh, eliminate dead keys)"
msgstr "Norueguês (Macintosh, eliminar teclas mortas)"
-#: ../rules/base.xml.in.h:641
+#: ../rules/base.xml.in.h:642
msgid "Norwegian (Colemak)"
msgstr "Norueguês (Colemak)"
#. Keyboard indicator for Polish layouts
-#: ../rules/base.xml.in.h:643 ../rules/base.extras.xml.in.h:40
+#: ../rules/base.xml.in.h:644 ../rules/base.extras.xml.in.h:41
msgid "pl"
msgstr "pl"
-#: ../rules/base.xml.in.h:644 ../rules/base.extras.xml.in.h:41
+#: ../rules/base.xml.in.h:645 ../rules/base.extras.xml.in.h:42
msgid "Polish"
msgstr "Polonês"
-#: ../rules/base.xml.in.h:645
+#: ../rules/base.xml.in.h:646
msgid "Polish (legacy)"
msgstr "Polonês (legado)"
-#: ../rules/base.xml.in.h:646
+#: ../rules/base.xml.in.h:647
msgid "Polish (qwertz)"
msgstr "Polonês (qwertz)"
-#: ../rules/base.xml.in.h:647
+#: ../rules/base.xml.in.h:648
msgid "Polish (Dvorak)"
msgstr "Polonês (Dvorak)"
-#: ../rules/base.xml.in.h:648
+#: ../rules/base.xml.in.h:649
msgid "Polish (Dvorak, Polish quotes on quotemark key)"
msgstr "Polonês (Dvorak, aspas polonesas na tecla de aspas)"
-#: ../rules/base.xml.in.h:649
+#: ../rules/base.xml.in.h:650
msgid "Polish (Dvorak, Polish quotes on key 1)"
msgstr "Polonês (Dvorak, aspas polonesas na tecla 1)"
-#: ../rules/base.xml.in.h:650
+#: ../rules/base.xml.in.h:651
msgid "Kashubian"
msgstr "Kashubian"
-#: ../rules/base.xml.in.h:651
+#: ../rules/base.xml.in.h:652
msgid "Russian (Poland, phonetic Dvorak)"
msgstr "Russo (Polônia, Dvorak fonético)"
-#: ../rules/base.xml.in.h:652
+#: ../rules/base.xml.in.h:653
msgid "Polish (programmer Dvorak)"
msgstr "Polonês (Dvorak para programador)"
-#: ../rules/base.xml.in.h:653 ../rules/base.extras.xml.in.h:104
+#: ../rules/base.xml.in.h:654 ../rules/base.extras.xml.in.h:105
msgid "Portuguese"
msgstr "Português"
-#: ../rules/base.xml.in.h:654
+#: ../rules/base.xml.in.h:655
msgid "Portuguese (eliminate dead keys)"
msgstr "Português (sem teclas mortas)"
-#: ../rules/base.xml.in.h:655
+#: ../rules/base.xml.in.h:656
msgid "Portuguese (Sun dead keys)"
msgstr "Português (Teclas mortas da Sun)"
-#: ../rules/base.xml.in.h:656
+#: ../rules/base.xml.in.h:657
msgid "Portuguese (Macintosh)"
msgstr "Português (Macintosh)"
-#: ../rules/base.xml.in.h:657
+#: ../rules/base.xml.in.h:658
msgid "Portuguese (Macintosh, eliminate dead keys)"
msgstr "Português (Macintosh, eliminar teclas mortas)"
-#: ../rules/base.xml.in.h:658
+#: ../rules/base.xml.in.h:659
msgid "Portuguese (Macintosh, Sun dead keys)"
msgstr "Português (Macintosh, teclas mortas da Sun)"
-#: ../rules/base.xml.in.h:659
+#: ../rules/base.xml.in.h:660
msgid "Portuguese (Nativo)"
msgstr "Português (Nativo)"
-#: ../rules/base.xml.in.h:660
+#: ../rules/base.xml.in.h:661
msgid "Portuguese (Nativo for US keyboards)"
msgstr "Português (Nativo para teclados americanos)"
-#: ../rules/base.xml.in.h:661
+#: ../rules/base.xml.in.h:662
msgid "Esperanto (Portugal, Nativo)"
msgstr "Esperanto (Portugal, Nativo)"
#. Keyboard indicator for Romanian layouts
-#: ../rules/base.xml.in.h:663 ../rules/base.extras.xml.in.h:45
+#: ../rules/base.xml.in.h:664 ../rules/base.extras.xml.in.h:46
msgid "ro"
msgstr "ro"
-#: ../rules/base.xml.in.h:664 ../rules/base.extras.xml.in.h:46
+#: ../rules/base.xml.in.h:665 ../rules/base.extras.xml.in.h:47
msgid "Romanian"
msgstr "Romênio"
-#: ../rules/base.xml.in.h:665
+#: ../rules/base.xml.in.h:666
msgid "Romanian (cedilla)"
msgstr "Romeno (com cedilha)"
-#: ../rules/base.xml.in.h:666
+#: ../rules/base.xml.in.h:667
msgid "Romanian (standard)"
msgstr "Romeno (padrão)"
-#: ../rules/base.xml.in.h:667
+#: ../rules/base.xml.in.h:668
msgid "Romanian (standard cedilla)"
msgstr "Romeno (padrão, com cedilha)"
-#: ../rules/base.xml.in.h:668
+#: ../rules/base.xml.in.h:669
msgid "Romanian (WinKeys)"
msgstr "Romeno (teclas Windows)"
-#: ../rules/base.xml.in.h:669 ../rules/base.extras.xml.in.h:55
+#: ../rules/base.xml.in.h:670 ../rules/base.extras.xml.in.h:56
msgid "Russian"
msgstr "Russo"
-#: ../rules/base.xml.in.h:670
+#: ../rules/base.xml.in.h:671
msgid "Russian (phonetic)"
msgstr "Russo (fonético)"
-#: ../rules/base.xml.in.h:671
+#: ../rules/base.xml.in.h:672
msgid "Russian (phonetic WinKeys)"
msgstr "Russo (fonético com teclas Windows)"
-#: ../rules/base.xml.in.h:672
+#: ../rules/base.xml.in.h:673
msgid "Russian (typewriter)"
msgstr "Russo (máquina de escrever)"
-#: ../rules/base.xml.in.h:673
+#: ../rules/base.xml.in.h:674
msgid "Russian (legacy)"
msgstr "Russo (legado)"
-#: ../rules/base.xml.in.h:674
+#: ../rules/base.xml.in.h:675
msgid "Russian (typewriter, legacy)"
msgstr "Russo (máquina de escrever, legado)"
-#: ../rules/base.xml.in.h:675
+#: ../rules/base.xml.in.h:676
msgid "Tatar"
msgstr "Tátar"
-#: ../rules/base.xml.in.h:676
+#: ../rules/base.xml.in.h:677
msgid "Ossetian (legacy)"
msgstr "Osseto (legado)"
-#: ../rules/base.xml.in.h:677
+#: ../rules/base.xml.in.h:678
msgid "Ossetian (WinKeys)"
msgstr "Osseto (WinKeys)"
-#: ../rules/base.xml.in.h:678
+#: ../rules/base.xml.in.h:679
msgid "Chuvash"
msgstr "Tchuvache"
-#: ../rules/base.xml.in.h:679
+#: ../rules/base.xml.in.h:680
msgid "Chuvash (Latin)"
msgstr "Tchuvache (Latino)"
-#: ../rules/base.xml.in.h:680
+#: ../rules/base.xml.in.h:681
msgid "Udmurt"
msgstr "Udmurt"
-#: ../rules/base.xml.in.h:681
+#: ../rules/base.xml.in.h:682
msgid "Komi"
msgstr "Komi"
-#: ../rules/base.xml.in.h:682
+#: ../rules/base.xml.in.h:683
msgid "Yakut"
msgstr "Yakut"
-#: ../rules/base.xml.in.h:683
+#: ../rules/base.xml.in.h:684
msgid "Kalmyk"
msgstr "Kalmyk"
-#: ../rules/base.xml.in.h:684
+#: ../rules/base.xml.in.h:685
msgid "Russian (DOS)"
msgstr "Russo (DOS)"
-#: ../rules/base.xml.in.h:685
+#: ../rules/base.xml.in.h:686
msgid "Russian (Macintosh)"
msgstr "Russo (Macintosh)"
-#: ../rules/base.xml.in.h:686
+#: ../rules/base.xml.in.h:687
msgid "Serbian (Russia)"
msgstr "Sérvio (Rússia)"
-#: ../rules/base.xml.in.h:687
+#: ../rules/base.xml.in.h:688
msgid "Bashkirian"
msgstr "Bashkirian"
-#: ../rules/base.xml.in.h:688
+#: ../rules/base.xml.in.h:689
msgid "Mari"
msgstr "Mari"
-#: ../rules/base.xml.in.h:689 ../rules/base.extras.xml.in.h:52
+#: ../rules/base.xml.in.h:690 ../rules/base.extras.xml.in.h:53
msgid "Serbian"
msgstr "Sérvio"
-#: ../rules/base.xml.in.h:690
+#: ../rules/base.xml.in.h:691
msgid "Serbian (Cyrillic, Z and ZHE swapped)"
msgstr "Sérvio (Cirílico, Z e ZHE trocados)"
-#: ../rules/base.xml.in.h:691
+#: ../rules/base.xml.in.h:692
msgid "Serbian (Latin)"
msgstr "Sérvio (Latino)"
-#: ../rules/base.xml.in.h:692
+#: ../rules/base.xml.in.h:693
msgid "Serbian (Latin Unicode)"
msgstr "Sérvio (Latino Unicode)"
-#: ../rules/base.xml.in.h:693
+#: ../rules/base.xml.in.h:694
msgid "Serbian (Latin qwerty)"
msgstr "Sérvio (qwerty, Latino)"
-#: ../rules/base.xml.in.h:694
+#: ../rules/base.xml.in.h:695
msgid "Serbian (Latin Unicode qwerty)"
msgstr "Sérvio (qwerty, Latino Unicode)"
-#: ../rules/base.xml.in.h:695
+#: ../rules/base.xml.in.h:696
msgid "Serbian (Cyrillic with guillemets)"
msgstr "Sérvio (Cirílico com guillemets)"
-#: ../rules/base.xml.in.h:696
+#: ../rules/base.xml.in.h:697
msgid "Serbian (Latin with guillemets)"
msgstr "Sérvio (Latin com aspas angulares)"
-#: ../rules/base.xml.in.h:697
-msgid "Pannonian Rusyn (homophonic)"
-msgstr "Ruteno (homofônico)"
+# http://pt.wikipedia.org/wiki/Rusins --Enrico
+#: ../rules/base.xml.in.h:698
+msgid "Pannonian Rusyn"
+msgstr "Rusins da Panônia"
#. Keyboard indicator for Slovenian layouts
-#: ../rules/base.xml.in.h:699
+#: ../rules/base.xml.in.h:700
msgid "sl"
msgstr "sl"
-#: ../rules/base.xml.in.h:700
+#: ../rules/base.xml.in.h:701
msgid "Slovenian"
msgstr "Esloveno"
-#: ../rules/base.xml.in.h:701
+#: ../rules/base.xml.in.h:702
msgid "Slovenian (use guillemets for quotes)"
msgstr "Esloveno (utilizar aspas para citações)"
-#: ../rules/base.xml.in.h:702
+#: ../rules/base.xml.in.h:703
msgid "Slovenian (US keyboard with Slovenian letters)"
msgstr "Esloveno (teclado US com letras eslovenas)"
#. Keyboard indicator for Slovak layouts
-#: ../rules/base.xml.in.h:704 ../rules/base.extras.xml.in.h:106
+#: ../rules/base.xml.in.h:705 ../rules/base.extras.xml.in.h:107
msgid "sk"
msgstr "sk"
-#: ../rules/base.xml.in.h:705 ../rules/base.extras.xml.in.h:107
+#: ../rules/base.xml.in.h:706 ../rules/base.extras.xml.in.h:108
msgid "Slovak"
msgstr "Eslovaco"
-#: ../rules/base.xml.in.h:706
+#: ../rules/base.xml.in.h:707
msgid "Slovak (extended Backslash)"
msgstr "Eslovaco (barra invertida extendida)"
-#: ../rules/base.xml.in.h:707
+#: ../rules/base.xml.in.h:708
msgid "Slovak (qwerty)"
msgstr "Eslováquio (qwerty)"
-#: ../rules/base.xml.in.h:708
+#: ../rules/base.xml.in.h:709
msgid "Slovak (qwerty, extended Backslash)"
msgstr "Eslovaco (qwerty, barra invertida extendida)"
-#: ../rules/base.xml.in.h:709 ../rules/base.extras.xml.in.h:110
+#: ../rules/base.xml.in.h:710 ../rules/base.extras.xml.in.h:111
msgid "Spanish"
msgstr "Espanhol"
-#: ../rules/base.xml.in.h:710
+#: ../rules/base.xml.in.h:711
msgid "Spanish (eliminate dead keys)"
msgstr "Espanhol (sem teclas mortas)"
-#: ../rules/base.xml.in.h:711
+#: ../rules/base.xml.in.h:712
msgid "Spanish (include dead tilde)"
msgstr "Espanhol (com tecla til)"
-#: ../rules/base.xml.in.h:712
+#: ../rules/base.xml.in.h:713
msgid "Spanish (Sun dead keys)"
msgstr "Espanhol (Teclas mortas da Sun)"
-#: ../rules/base.xml.in.h:713
+#: ../rules/base.xml.in.h:714
msgid "Spanish (Dvorak)"
msgstr "Espanhol (Dvorak)"
-#: ../rules/base.xml.in.h:714
+#: ../rules/base.xml.in.h:715
msgid "Asturian (Spain, with bottom-dot H and bottom-dot L)"
msgstr "Asturiano (Espanha, com ponto inferior no H e ponto inferior no L)"
-#: ../rules/base.xml.in.h:715
+#: ../rules/base.xml.in.h:716
msgid "Catalan (Spain, with middle-dot L)"
msgstr "Catalão (Espanha, com ponto mediano entre o L)"
-#: ../rules/base.xml.in.h:716
+#: ../rules/base.xml.in.h:717
msgid "Spanish (Macintosh)"
msgstr "Espanhol (Macintosh)"
#. Keyboard indicator for Swedish layouts
-#: ../rules/base.xml.in.h:718 ../rules/base.extras.xml.in.h:112
+#: ../rules/base.xml.in.h:719 ../rules/base.extras.xml.in.h:113
msgid "sv"
msgstr "sv"
-#: ../rules/base.xml.in.h:719 ../rules/base.extras.xml.in.h:113
+#: ../rules/base.xml.in.h:720 ../rules/base.extras.xml.in.h:114
msgid "Swedish"
msgstr "Suéco"
-#: ../rules/base.xml.in.h:720
+#: ../rules/base.xml.in.h:721
msgid "Swedish (eliminate dead keys)"
msgstr "Sueco (sem teclas mortas)"
-#: ../rules/base.xml.in.h:721
+#: ../rules/base.xml.in.h:722
msgid "Swedish (Dvorak)"
msgstr "Sueco (Dvorak)"
-#: ../rules/base.xml.in.h:722
+#: ../rules/base.xml.in.h:723
msgid "Russian (Sweden, phonetic)"
msgstr "Russo (Suécia, fonético)"
-#: ../rules/base.xml.in.h:723
+#: ../rules/base.xml.in.h:724
msgid "Russian (Sweden, phonetic, eliminate dead keys)"
msgstr "Russo (Suécia, fonético, sem teclas mortas)"
-#: ../rules/base.xml.in.h:724
+#: ../rules/base.xml.in.h:725
msgid "Northern Saami (Sweden)"
msgstr "Lapão setentrional (Suécia)"
-#: ../rules/base.xml.in.h:725
+#: ../rules/base.xml.in.h:726
msgid "Swedish (Macintosh)"
msgstr "Sueco (Macintosh)"
-#: ../rules/base.xml.in.h:726
+#: ../rules/base.xml.in.h:727
msgid "Swedish (Svdvorak)"
msgstr "Sueco (Svdvorak)"
-#: ../rules/base.xml.in.h:727
+#: ../rules/base.xml.in.h:728
msgid "Swedish Sign Language"
msgstr "Língua de sinais sueca"
-#: ../rules/base.xml.in.h:728 ../rules/base.extras.xml.in.h:115
+#: ../rules/base.xml.in.h:729 ../rules/base.extras.xml.in.h:116
msgid "German (Switzerland)"
msgstr "Alemão (Suíça)"
-#: ../rules/base.xml.in.h:729
+#: ../rules/base.xml.in.h:730
msgid "German (Switzerland, legacy)"
msgstr "Alemão (Suíça, legado)"
-#: ../rules/base.xml.in.h:730
+#: ../rules/base.xml.in.h:731
msgid "German (Switzerland, eliminate dead keys)"
msgstr "Alemão (Suiça, sem teclas mortas)"
-#: ../rules/base.xml.in.h:731
+#: ../rules/base.xml.in.h:732
msgid "German (Switzerland, Sun dead keys)"
msgstr "Alemão (Suiça, com teclas mortas da Sun)"
-#: ../rules/base.xml.in.h:732
+#: ../rules/base.xml.in.h:733
msgid "French (Switzerland)"
msgstr "Francês (Suíça)"
-#: ../rules/base.xml.in.h:733
+#: ../rules/base.xml.in.h:734
msgid "French (Switzerland, eliminate dead keys)"
msgstr "Francês (Suíça, sem teclas mortas)"
-#: ../rules/base.xml.in.h:734
+#: ../rules/base.xml.in.h:735
msgid "French (Switzerland, Sun dead keys)"
msgstr "Francês (Suíça, com teclas mortas da Sun)"
-#: ../rules/base.xml.in.h:735
+#: ../rules/base.xml.in.h:736
msgid "French (Switzerland, Macintosh)"
msgstr "Francês (Suíça, Macintosh)"
-#: ../rules/base.xml.in.h:736
+#: ../rules/base.xml.in.h:737
msgid "German (Switzerland, Macintosh)"
msgstr "Alemão (Suíça, Macintosh)"
-#: ../rules/base.xml.in.h:737
+#: ../rules/base.xml.in.h:738
msgid "Arabic (Syria)"
msgstr "Árabe (Síria)"
#. Keyboard indicator for Syriac layouts
-#: ../rules/base.xml.in.h:739
+#: ../rules/base.xml.in.h:740
msgid "syc"
msgstr "syc"
-#: ../rules/base.xml.in.h:740
+#: ../rules/base.xml.in.h:741
msgid "Syriac"
msgstr "Sírio"
-#: ../rules/base.xml.in.h:741
+#: ../rules/base.xml.in.h:742
msgid "Syriac (phonetic)"
msgstr "Sírio (fonético)"
-#: ../rules/base.xml.in.h:742
+#: ../rules/base.xml.in.h:743
msgid "Kurdish (Syria, Latin Q)"
msgstr "Curdo (Síria, Q latino)"
-#: ../rules/base.xml.in.h:743
+#: ../rules/base.xml.in.h:744
msgid "Kurdish (Syria, F)"
msgstr "Curdo (Síria, F)"
-#: ../rules/base.xml.in.h:744
+#: ../rules/base.xml.in.h:745
msgid "Kurdish (Syria, Latin Alt-Q)"
msgstr "Curdo (Síria, alt-Q latino)"
#. Keyboard indicator for Tajik layouts
-#: ../rules/base.xml.in.h:746
+#: ../rules/base.xml.in.h:747
msgid "tg"
msgstr "tg"
-#: ../rules/base.xml.in.h:747
+#: ../rules/base.xml.in.h:748
msgid "Tajik"
msgstr "Tadjique"
-#: ../rules/base.xml.in.h:748
+#: ../rules/base.xml.in.h:749
msgid "Tajik (legacy)"
msgstr "Tadjique (legado)"
#. Keyboard indicator for Sinhala layouts
-#: ../rules/base.xml.in.h:750
+#: ../rules/base.xml.in.h:751
msgid "si"
msgstr "si"
-#: ../rules/base.xml.in.h:751
+#: ../rules/base.xml.in.h:752
msgid "Sinhala (phonetic)"
msgstr "Sinhala (fonética)"
-#: ../rules/base.xml.in.h:752
+#: ../rules/base.xml.in.h:753
msgid "Tamil (Sri Lanka, Unicode)"
msgstr "Tâmil (Sri Lanka, Unicode)"
-#: ../rules/base.xml.in.h:753
+#: ../rules/base.xml.in.h:754
msgid "Tamil (Sri Lanka, TAB Typewriter)"
msgstr "Tâmil (Sri Lanka, máquina de escrever TAB)"
#. Keyboard indicator for Thai layouts
-#: ../rules/base.xml.in.h:755
+#: ../rules/base.xml.in.h:756
msgid "th"
msgstr "th"
-#: ../rules/base.xml.in.h:756
+#: ../rules/base.xml.in.h:757
msgid "Thai"
msgstr "Tailandês"
-#: ../rules/base.xml.in.h:757
+#: ../rules/base.xml.in.h:758
msgid "Thai (TIS-820.2538)"
msgstr "Tailandês (TIS-820.2538)"
-#: ../rules/base.xml.in.h:758
+#: ../rules/base.xml.in.h:759
msgid "Thai (Pattachote)"
msgstr "Tailandês (Pattachote)"
#. Keyboard indicator for Turkish layouts
-#: ../rules/base.xml.in.h:760 ../rules/base.extras.xml.in.h:118
+#: ../rules/base.xml.in.h:761 ../rules/base.extras.xml.in.h:119
msgid "tr"
msgstr "tr"
-#: ../rules/base.xml.in.h:761 ../rules/base.extras.xml.in.h:119
+#: ../rules/base.xml.in.h:762 ../rules/base.extras.xml.in.h:120
msgid "Turkish"
msgstr "Turco"
-#: ../rules/base.xml.in.h:762
+#: ../rules/base.xml.in.h:763
msgid "Turkish (F)"
msgstr "Turco (F)"
-#: ../rules/base.xml.in.h:763
+#: ../rules/base.xml.in.h:764
msgid "Turkish (Alt-Q)"
msgstr "Turco (Alt-Q)"
-#: ../rules/base.xml.in.h:764
+#: ../rules/base.xml.in.h:765
msgid "Turkish (Sun dead keys)"
msgstr "Turco (Teclas mortas da Sun)"
-#: ../rules/base.xml.in.h:765
+#: ../rules/base.xml.in.h:766
msgid "Kurdish (Turkey, Latin Q)"
msgstr "Curdo (Turquia, Q latino)"
-#: ../rules/base.xml.in.h:766
+#: ../rules/base.xml.in.h:767
msgid "Kurdish (Turkey, F)"
msgstr "Curdo (Turquia, F)"
-#: ../rules/base.xml.in.h:767
+#: ../rules/base.xml.in.h:768
msgid "Kurdish (Turkey, Latin Alt-Q)"
msgstr "Curdo (Turquia, alt-Q latino)"
-#: ../rules/base.xml.in.h:768
+#: ../rules/base.xml.in.h:769
msgid "Turkish (international with dead keys)"
msgstr "Turco (internacional com teclas mortas)"
#. Keyboard indicator for Crimean Tatar layouts
-#: ../rules/base.xml.in.h:770 ../rules/base.extras.xml.in.h:47
+#: ../rules/base.xml.in.h:771 ../rules/base.extras.xml.in.h:48
msgid "crh"
msgstr "crh"
-#: ../rules/base.xml.in.h:771
+#: ../rules/base.xml.in.h:772
msgid "Crimean Tatar (Turkish Q)"
msgstr "Crimean Tatar (Turkish Q)"
-#: ../rules/base.xml.in.h:772
+#: ../rules/base.xml.in.h:773
msgid "Crimean Tatar (Turkish F)"
msgstr "Crimean Tatar (Turkish F)"
-#: ../rules/base.xml.in.h:773
+#: ../rules/base.xml.in.h:774
msgid "Crimean Tatar (Turkish Alt-Q)"
msgstr "Crimean Tatar (Turkish Alt-Q)"
-#: ../rules/base.xml.in.h:774
+#: ../rules/base.xml.in.h:775
msgid "Taiwanese"
msgstr "Taiwanês"
-#: ../rules/base.xml.in.h:775
+#: ../rules/base.xml.in.h:776
msgid "Taiwanese (indigenous)"
msgstr "Taiwanês (indígena)"
#. Keyboard indicator for Saisiyat layouts
-#: ../rules/base.xml.in.h:777
+#: ../rules/base.xml.in.h:778
msgid "xsy"
msgstr "xsy"
-#: ../rules/base.xml.in.h:778
+#: ../rules/base.xml.in.h:779
msgid "Saisiyat (Taiwan)"
msgstr "Saisiat (Taiwan)"
#. Keyboard indicator for Ukranian layouts
-#: ../rules/base.xml.in.h:780 ../rules/base.extras.xml.in.h:121
+#: ../rules/base.xml.in.h:781 ../rules/base.extras.xml.in.h:122
msgid "uk"
msgstr "uk"
-#: ../rules/base.xml.in.h:781 ../rules/base.extras.xml.in.h:122
+#: ../rules/base.xml.in.h:782 ../rules/base.extras.xml.in.h:123
msgid "Ukrainian"
msgstr "Ucraniano"
-#: ../rules/base.xml.in.h:782
+#: ../rules/base.xml.in.h:783
msgid "Ukrainian (phonetic)"
msgstr "Ucraniano (fonético)"
-#: ../rules/base.xml.in.h:783
+#: ../rules/base.xml.in.h:784
msgid "Ukrainian (typewriter)"
msgstr "Ucraniano (Máquina de escrever)"
-#: ../rules/base.xml.in.h:784
+#: ../rules/base.xml.in.h:785
msgid "Ukrainian (WinKeys)"
msgstr "Ucraniano (teclas Windows)"
-#: ../rules/base.xml.in.h:785
+#: ../rules/base.xml.in.h:786
msgid "Ukrainian (legacy)"
msgstr "Ucraniano (legado)"
-#: ../rules/base.xml.in.h:786
+#: ../rules/base.xml.in.h:787
msgid "Ukrainian (standard RSTU)"
msgstr "Ucraniano (padrão RSTU)"
-#: ../rules/base.xml.in.h:787
+#: ../rules/base.xml.in.h:788
msgid "Russian (Ukraine, standard RSTU)"
msgstr "Russo (Ucrânia, RSTU padrão)"
-#: ../rules/base.xml.in.h:788
+#: ../rules/base.xml.in.h:789
msgid "Ukrainian (homophonic)"
msgstr "Ucraniano (homofônico)"
-#: ../rules/base.xml.in.h:789 ../rules/base.extras.xml.in.h:124
+#: ../rules/base.xml.in.h:790 ../rules/base.extras.xml.in.h:125
msgid "English (UK)"
msgstr "Inglês (Reino Unido)"
-#: ../rules/base.xml.in.h:790
+#: ../rules/base.xml.in.h:791
msgid "English (UK, extended WinKeys)"
msgstr "Inglês (Reino Unido, WinKeys estendidas)"
-#: ../rules/base.xml.in.h:791
+#: ../rules/base.xml.in.h:792
msgid "English (UK, international with dead keys)"
msgstr "Inglês (Reino Unido, internacional com teclas mortas)"
-#: ../rules/base.xml.in.h:792
+#: ../rules/base.xml.in.h:793
msgid "English (UK, Dvorak)"
msgstr "Inglês (Reino Unido, Dvorak)"
-#: ../rules/base.xml.in.h:793
+#: ../rules/base.xml.in.h:794
msgid "English (UK, Dvorak with UK punctuation)"
msgstr "Inglês (Reino Unido, Dvorak com pontuação do Reino Unido)"
-#: ../rules/base.xml.in.h:794
+#: ../rules/base.xml.in.h:795
msgid "English (UK, Macintosh)"
msgstr "Inglês (Reino Unido, Macintosh)"
-#: ../rules/base.xml.in.h:795
+#: ../rules/base.xml.in.h:796
msgid "English (UK, Macintosh international)"
msgstr "Inglês (Reino Unido, Macintosh internacional)"
-#: ../rules/base.xml.in.h:796
+#: ../rules/base.xml.in.h:797
msgid "English (UK, Colemak)"
msgstr "Inglês (Reino Unido, Colemak)"
-#: ../rules/base.xml.in.h:797
+#: ../rules/base.xml.in.h:798
msgid "Uzbek"
msgstr "Uzbeque"
-#: ../rules/base.xml.in.h:798
+#: ../rules/base.xml.in.h:799
msgid "Uzbek (Latin)"
msgstr "Uzbeque (Latino)"
#. Keyboard indicator for Vietnamese layouts
-#: ../rules/base.xml.in.h:800
+#: ../rules/base.xml.in.h:801
msgid "vi"
msgstr "vi"
-#: ../rules/base.xml.in.h:801
+#: ../rules/base.xml.in.h:802
msgid "Vietnamese"
msgstr "Vietnamês"
#. Keyboard indicator for Korean layouts
-#: ../rules/base.xml.in.h:803 ../rules/base.extras.xml.in.h:126
+#: ../rules/base.xml.in.h:804 ../rules/base.extras.xml.in.h:127
msgid "ko"
msgstr "ko"
-#: ../rules/base.xml.in.h:804 ../rules/base.extras.xml.in.h:127
+#: ../rules/base.xml.in.h:805 ../rules/base.extras.xml.in.h:128
msgid "Korean"
msgstr "Coreano"
-#: ../rules/base.xml.in.h:805
+#: ../rules/base.xml.in.h:806
msgid "Korean (101/104 key compatible)"
msgstr "Coreano (compatível com 101/104 teclas)"
-#: ../rules/base.xml.in.h:806
+#: ../rules/base.xml.in.h:807
msgid "Japanese (PC-98xx Series)"
msgstr "Japonês (PC-98xx Series)"
#. Keyboard indicator for Irish layouts
-#: ../rules/base.xml.in.h:808
+#: ../rules/base.xml.in.h:809
msgid "ie"
msgstr "ie"
-#: ../rules/base.xml.in.h:809
+#: ../rules/base.xml.in.h:810
msgid "Irish"
msgstr "Irlandês"
-#: ../rules/base.xml.in.h:810
+#: ../rules/base.xml.in.h:811
msgid "CloGaelach"
msgstr "CloGaelach"
-#: ../rules/base.xml.in.h:811
+#: ../rules/base.xml.in.h:812
msgid "Irish (UnicodeExpert)"
msgstr "Irlandês (UnicodeExpert)"
-#: ../rules/base.xml.in.h:812
+#: ../rules/base.xml.in.h:813
msgid "Ogham"
msgstr "Ogam"
-#: ../rules/base.xml.in.h:813
+#: ../rules/base.xml.in.h:814
msgid "Ogham (IS434)"
msgstr "Ogham (IS434)"
-#: ../rules/base.xml.in.h:814
+#: ../rules/base.xml.in.h:815
msgid "Urdu (Pakistan)"
msgstr "Urdu (Paquistão)"
-#: ../rules/base.xml.in.h:815
+#: ../rules/base.xml.in.h:816
msgid "Urdu (Pakistan, CRULP)"
msgstr "Urdu (Paquistão, CRULP)"
-#: ../rules/base.xml.in.h:816
+#: ../rules/base.xml.in.h:817
msgid "Urdu (Pakistan, NLA)"
msgstr "Urdu (Paquistão, NLA)"
-#: ../rules/base.xml.in.h:817
+#: ../rules/base.xml.in.h:818
msgid "Arabic (Pakistan)"
msgstr "Árabe (Paquistão)"
#. Keyboard indicator for Sindhi layouts
-#: ../rules/base.xml.in.h:819
+#: ../rules/base.xml.in.h:820
msgid "sd"
msgstr "sd"
-#: ../rules/base.xml.in.h:820
+#: ../rules/base.xml.in.h:821
msgid "Sindhi"
msgstr "Síndi"
#. Keyboard indicator for Dhivehi layouts
-#: ../rules/base.xml.in.h:822
+#: ../rules/base.xml.in.h:823
msgid "dv"
msgstr "dv"
-#: ../rules/base.xml.in.h:823
+#: ../rules/base.xml.in.h:824
msgid "Dhivehi"
msgstr "Dhivehi"
-#: ../rules/base.xml.in.h:824
+#: ../rules/base.xml.in.h:825
msgid "English (South Africa)"
msgstr "Inglês (África do Sul)"
#. Keyboard indicator for Esperanto layouts
-#: ../rules/base.xml.in.h:826
+#: ../rules/base.xml.in.h:827
msgid "eo"
msgstr "eo"
-#: ../rules/base.xml.in.h:827
+#: ../rules/base.xml.in.h:828
msgid "Esperanto"
msgstr "Esperanto"
-#: ../rules/base.xml.in.h:828
+#: ../rules/base.xml.in.h:829
msgid "Esperanto (displaced semicolon and quote, obsolete)"
msgstr "Esperanto (ponto-e-vírgula e aspas deslocadas, obsoleto)"
#. Keyboard indicator for Nepali layouts
-#: ../rules/base.xml.in.h:830
+#: ../rules/base.xml.in.h:831
msgid "ne"
msgstr "ne"
-#: ../rules/base.xml.in.h:831
+#: ../rules/base.xml.in.h:832
msgid "Nepali"
msgstr "Nepalês"
-#: ../rules/base.xml.in.h:832
+#: ../rules/base.xml.in.h:833
msgid "English (Nigeria)"
msgstr "Inglês (Nigéria)"
#. Keyboard indicator for Igbo layouts
-#: ../rules/base.xml.in.h:834
+#: ../rules/base.xml.in.h:835
msgid "ig"
msgstr "ig"
-#: ../rules/base.xml.in.h:835
+#: ../rules/base.xml.in.h:836
msgid "Igbo"
msgstr "igbo"
#. Keyboard indicator for Yoruba layouts
-#: ../rules/base.xml.in.h:837
+#: ../rules/base.xml.in.h:838
msgid "yo"
msgstr "yo"
-#: ../rules/base.xml.in.h:838
+#: ../rules/base.xml.in.h:839
msgid "Yoruba"
msgstr "Iorubá"
#. Keyboard indicator for Amharic layouts
-#: ../rules/base.xml.in.h:840
+#: ../rules/base.xml.in.h:841
msgid "am"
msgstr "am"
-#: ../rules/base.xml.in.h:841
+#: ../rules/base.xml.in.h:842
msgid "Amharic"
msgstr "Amárico"
#. Keyboard indicator for Wolof layouts
-#: ../rules/base.xml.in.h:843
+#: ../rules/base.xml.in.h:844
msgid "wo"
msgstr "wo"
-#: ../rules/base.xml.in.h:844
+#: ../rules/base.xml.in.h:845
msgid "Wolof"
msgstr "Wolof"
#. Keyboard indicator for Braille layouts
-#: ../rules/base.xml.in.h:846
+#: ../rules/base.xml.in.h:847
msgid "brl"
msgstr "brl"
-#: ../rules/base.xml.in.h:847
+#: ../rules/base.xml.in.h:848
msgid "Braille"
msgstr "Braile"
-#: ../rules/base.xml.in.h:848
+#: ../rules/base.xml.in.h:849
msgid "Braille (left hand)"
msgstr "Braille (canhoto)"
-#: ../rules/base.xml.in.h:849
+#: ../rules/base.xml.in.h:850
msgid "Braille (right hand)"
msgstr "Braille (destro)"
#. Keyboard indicator for Turkmen layouts
-#: ../rules/base.xml.in.h:851
+#: ../rules/base.xml.in.h:852
msgid "tk"
msgstr "tk"
-#: ../rules/base.xml.in.h:852
+#: ../rules/base.xml.in.h:853
msgid "Turkmen"
msgstr "Turcomano"
-#: ../rules/base.xml.in.h:853
+#: ../rules/base.xml.in.h:854
msgid "Turkmen (Alt-Q)"
msgstr "Turcomano (Alt-Q)"
#. Keyboard indicator for Bambara layouts
-#: ../rules/base.xml.in.h:855
+#: ../rules/base.xml.in.h:856
msgid "bm"
msgstr "bm"
-#: ../rules/base.xml.in.h:856
+#: ../rules/base.xml.in.h:857
msgid "Bambara"
msgstr "Bambara"
-#: ../rules/base.xml.in.h:857
+#: ../rules/base.xml.in.h:858
msgid "French (Mali, alternative)"
msgstr "Francês (Mali, alternativo)"
-#: ../rules/base.xml.in.h:858
+#: ../rules/base.xml.in.h:859
msgid "English (Mali, US Macintosh)"
msgstr "Inglês (Mali, US Macintosh)"
-#: ../rules/base.xml.in.h:859
+#: ../rules/base.xml.in.h:860
msgid "English (Mali, US international)"
msgstr "Inglês (Mali, US internacional)"
#. Keyboard indicator for Swahili layouts
-#: ../rules/base.xml.in.h:861
+#: ../rules/base.xml.in.h:862
msgid "sw"
msgstr "sw"
-#: ../rules/base.xml.in.h:862
+#: ../rules/base.xml.in.h:863
msgid "Swahili (Tanzania)"
msgstr "Suaíli (Tanzânia)"
-#: ../rules/base.xml.in.h:863
+#: ../rules/base.xml.in.h:864
msgid "Swahili (Kenya)"
msgstr "Suaíli (Quênia)"
-#: ../rules/base.xml.in.h:864
+#: ../rules/base.xml.in.h:865
msgid "Kikuyu"
msgstr "Kikuyu"
#. Keyboard indicator for Tswana layouts
-#: ../rules/base.xml.in.h:866
+#: ../rules/base.xml.in.h:867
msgid "tn"
msgstr "tn"
-#: ../rules/base.xml.in.h:867
+#: ../rules/base.xml.in.h:868
msgid "Tswana"
msgstr "Tswana"
#. Keyboard indicator for Filipino layouts
-#: ../rules/base.xml.in.h:869
+#: ../rules/base.xml.in.h:870
msgid "ph"
msgstr "ph"
-#: ../rules/base.xml.in.h:870
+#: ../rules/base.xml.in.h:871
msgid "Filipino"
msgstr "Filipino"
-#: ../rules/base.xml.in.h:871
+#: ../rules/base.xml.in.h:872
msgid "Filipino (QWERTY Baybayin)"
msgstr "Filipino (QWERTY baybayin)"
-#: ../rules/base.xml.in.h:872
+#: ../rules/base.xml.in.h:873
msgid "Filipino (Capewell-Dvorak Latin)"
msgstr "Filipino (Capewell-Dvorak latino)"
-#: ../rules/base.xml.in.h:873
+#: ../rules/base.xml.in.h:874
msgid "Filipino (Capewell-Dvorak Baybayin)"
msgstr "Filipino (Capewell-Dvorak Baybayin)"
-#: ../rules/base.xml.in.h:874
+#: ../rules/base.xml.in.h:875
msgid "Filipino (Capewell-QWERF 2006 Latin)"
msgstr "Filipino (Capewell-QWERF 2006 latino)"
-#: ../rules/base.xml.in.h:875
+#: ../rules/base.xml.in.h:876
msgid "Filipino (Capewell-QWERF 2006 Baybayin)"
msgstr "Filipino (Capewell-QWERF 2006 baybayin)"
-#: ../rules/base.xml.in.h:876
+#: ../rules/base.xml.in.h:877
msgid "Filipino (Colemak Latin)"
msgstr "Filipino (Colemak latino)"
-#: ../rules/base.xml.in.h:877
+#: ../rules/base.xml.in.h:878
msgid "Filipino (Colemak Baybayin)"
msgstr "Filipino (Colemak baybayin)"
-#: ../rules/base.xml.in.h:878
+#: ../rules/base.xml.in.h:879
msgid "Filipino (Dvorak Latin)"
msgstr "Filipino (Dvorak latino)"
-#: ../rules/base.xml.in.h:879
+#: ../rules/base.xml.in.h:880
msgid "Filipino (Dvorak Baybayin)"
msgstr "Filipino (Dvorak Baybayin)"
-#: ../rules/base.xml.in.h:880
+#: ../rules/base.xml.in.h:881
msgid "md"
msgstr "md"
-#: ../rules/base.xml.in.h:881
+#: ../rules/base.xml.in.h:882
msgid "Moldavian"
msgstr "Moldávio"
-#: ../rules/base.xml.in.h:882
+#: ../rules/base.xml.in.h:883
msgid "gag"
msgstr "gag"
-#: ../rules/base.xml.in.h:883
+#: ../rules/base.xml.in.h:884
msgid "Moldavian (Gagauz)"
msgstr "Moldávio (Gagauz)"
-#: ../rules/base.xml.in.h:884
+#: ../rules/base.xml.in.h:885
msgid "Switching to another layout"
msgstr "Alternando para outra disposição"
-#: ../rules/base.xml.in.h:885
+#: ../rules/base.xml.in.h:886
msgid "Right Alt (while pressed)"
msgstr "Alt Direito (quando pressionado)"
-#: ../rules/base.xml.in.h:886
+#: ../rules/base.xml.in.h:887
msgid "Left Alt (while pressed)"
msgstr "Alt Esquerdo (quando pressionado)"
-#: ../rules/base.xml.in.h:887
+#: ../rules/base.xml.in.h:888
msgid "Left Win (while pressed)"
msgstr "Win Esquerdo (quando pressionado)"
-#: ../rules/base.xml.in.h:888
+#: ../rules/base.xml.in.h:889
msgid "Right Win (while pressed)"
msgstr "Win Direito (quando pressionado)"
-#: ../rules/base.xml.in.h:889
+#: ../rules/base.xml.in.h:890
msgid "Any Win key (while pressed)"
msgstr "Qualquer tecla Windows (quando pressionada)"
-#: ../rules/base.xml.in.h:890
+#: ../rules/base.xml.in.h:891
msgid "Caps Lock (while pressed), Alt+Caps Lock does the original capslock action"
msgstr "Caps Lock (quando pressionada), Alt+Caps Lock faz a ação capslock original"
-#: ../rules/base.xml.in.h:891
+#: ../rules/base.xml.in.h:892
msgid "Right Ctrl (while pressed)"
msgstr "Ctrl Direito (quando pressionado)"
-#: ../rules/base.xml.in.h:892
+#: ../rules/base.xml.in.h:893
msgid "Right Alt"
msgstr "Alt direito"
-#: ../rules/base.xml.in.h:893
+#: ../rules/base.xml.in.h:894
msgid "Left Alt"
msgstr "Alt Esquerdo"
-#: ../rules/base.xml.in.h:894
+#: ../rules/base.xml.in.h:895
msgid "Caps Lock"
msgstr "Caps Lock"
-#: ../rules/base.xml.in.h:895
+#: ../rules/base.xml.in.h:896
msgid "Shift+Caps Lock"
msgstr "Shift+Caps Lock"
-#: ../rules/base.xml.in.h:896
+#: ../rules/base.xml.in.h:897
msgid "Caps Lock (to first layout), Shift+Caps Lock (to last layout)"
msgstr "Caps Lock (para a primeira disposição), Shift+Caps Lock (para a última disposição)"
-#: ../rules/base.xml.in.h:897
+#: ../rules/base.xml.in.h:898
msgid "Left Win (to first layout), Right Win/Menu (to last layout)"
msgstr "Win Esquerdo (para primeiro leiaute), Win Direito/Menu (para último leiaute)"
-#: ../rules/base.xml.in.h:898
+#: ../rules/base.xml.in.h:899
msgid "Left Ctrl (to first layout), Right Ctrl (to last layout)"
msgstr "Ctrl Esquerdo (para primeiro leiaute), Ctrl Direito (para último leiaute)"
-#: ../rules/base.xml.in.h:899
+#: ../rules/base.xml.in.h:900
msgid "Alt+Caps Lock"
msgstr "Alt+Caps Lock"
-#: ../rules/base.xml.in.h:900
+#: ../rules/base.xml.in.h:901
msgid "Both Shift keys together"
msgstr "Ambas teclas Shift juntas"
-#: ../rules/base.xml.in.h:901
+#: ../rules/base.xml.in.h:902
msgid "Both Alt keys together"
msgstr "Ambas teclas Alt juntas"
-#: ../rules/base.xml.in.h:902
+#: ../rules/base.xml.in.h:903
msgid "Both Ctrl keys together"
msgstr "Ambas teclas Ctrl juntas"
-#: ../rules/base.xml.in.h:903
+#: ../rules/base.xml.in.h:904
msgid "Ctrl+Shift"
msgstr "Ctrl+Shift"
-#: ../rules/base.xml.in.h:904
+#: ../rules/base.xml.in.h:905
msgid "Left Ctrl+Left Shift"
msgstr "Ctrl Esquerdo+Shift Esquerdo"
-#: ../rules/base.xml.in.h:905
+#: ../rules/base.xml.in.h:906
msgid "Right Ctrl+Right Shift"
msgstr "Ctrl da Direita+Shift da Direita"
-#: ../rules/base.xml.in.h:906
+#: ../rules/base.xml.in.h:907
msgid "Alt+Ctrl"
msgstr "Alt+Ctrl"
-#: ../rules/base.xml.in.h:907
+#: ../rules/base.xml.in.h:908
msgid "Alt+Shift"
msgstr "Alt+Shift"
-#: ../rules/base.xml.in.h:908
+#: ../rules/base.xml.in.h:909
msgid "Left Alt+Left Shift"
msgstr "Alt da esquerda + Shift da esquerda"
-#: ../rules/base.xml.in.h:909
+#: ../rules/base.xml.in.h:910
msgid "Alt+Space"
msgstr "Alt+Espaço"
-#: ../rules/base.xml.in.h:910
+#: ../rules/base.xml.in.h:911
msgid "Menu"
msgstr "Menu"
-#: ../rules/base.xml.in.h:911
+#: ../rules/base.xml.in.h:912
msgid "Left Win"
msgstr "Win Esquerdo"
-#: ../rules/base.xml.in.h:912
+#: ../rules/base.xml.in.h:913
msgid "Right Win"
msgstr "Win Direito"
-#: ../rules/base.xml.in.h:913
+#: ../rules/base.xml.in.h:914
msgid "Left Shift"
msgstr "Shift Esquerdo"
-#: ../rules/base.xml.in.h:914
+#: ../rules/base.xml.in.h:915
msgid "Right Shift"
msgstr "Shift direito"
-#: ../rules/base.xml.in.h:915
+#: ../rules/base.xml.in.h:916
msgid "Left Ctrl"
msgstr "Ctrl Esquerdo"
-#: ../rules/base.xml.in.h:916
+#: ../rules/base.xml.in.h:917
msgid "Right Ctrl"
msgstr "Ctrl Direito"
-#: ../rules/base.xml.in.h:917
+#: ../rules/base.xml.in.h:918
msgid "Scroll Lock"
msgstr "Scroll Lock"
-#: ../rules/base.xml.in.h:918
+#: ../rules/base.xml.in.h:919
msgid "LeftCtrl+LeftWin (to first layout), RightCtrl+Menu (to second layout)"
msgstr "CtrlEsquerdo+WinEsquerdo (para primeira disposição), CrtlDireito+Menu (para segunda disposição)"
-#: ../rules/base.xml.in.h:919
+#: ../rules/base.xml.in.h:920
msgid "Key to choose 3rd level"
msgstr "Tecla para escolher terceiro nível"
-#: ../rules/base.xml.in.h:920
+#: ../rules/base.xml.in.h:921
msgid "Any Win key"
msgstr "Qualquer tecla Windows"
-#: ../rules/base.xml.in.h:921
+#: ../rules/base.xml.in.h:922
msgid "Any Alt key"
msgstr "Qualquer tecla Alt"
-#: ../rules/base.xml.in.h:922
+#: ../rules/base.xml.in.h:923
msgid "Right Alt, Shift+Right Alt key is Compose"
msgstr "Alt direito, Shift+Alt direito é tecla de composição"
-#: ../rules/base.xml.in.h:923
+#: ../rules/base.xml.in.h:924
msgid "Right Alt key never chooses 3rd level"
msgstr "Tecla Alt Direita nunca escolhe terceiro nível"
-#: ../rules/base.xml.in.h:924
+#: ../rules/base.xml.in.h:925
msgid "Enter on keypad"
msgstr "Enter no teclado numérico"
-#: ../rules/base.xml.in.h:925
+#: ../rules/base.xml.in.h:926
msgid "Backslash"
msgstr "Barra invertida"
-#: ../rules/base.xml.in.h:926
+#: ../rules/base.xml.in.h:927
msgid "&lt;Less/Greater&gt;"
msgstr "&lt;Menor que/Maior que&gt;"
-#: ../rules/base.xml.in.h:927
+#: ../rules/base.xml.in.h:928
msgid "Caps Lock chooses 3rd level, acts as onetime lock when pressed together with another 3rd-level-chooser"
msgstr "Caps lock escolhe o 3º nível, atua como bloqueio de uma única vez, quando pressionada em conjunto com outra escolha de 3º nível"
-#: ../rules/base.xml.in.h:928
+#: ../rules/base.xml.in.h:929
msgid "Backslash chooses 3rd level, acts as onetime lock when pressed together with another 3rd-level-chooser"
msgstr "Barra invertida escolhe o 3º nível, atua como bloqueio de uma única vez, quando pressionada em conjunto com outra escolha de 3º nível"
-#: ../rules/base.xml.in.h:929
+#: ../rules/base.xml.in.h:930
msgid "&lt;Less/Greater&gt; chooses 3rd level, acts as onetime lock when pressed together with another 3rd-level-chooser"
msgstr "&lt;Less/Greater&gt; escolhe o 3º nível, atua como bloqueio de uma única vez, quando pressionadas em conjunto com outra escolha de 3º nível"
-#: ../rules/base.xml.in.h:930
+#: ../rules/base.xml.in.h:931
msgid "Ctrl key position"
msgstr "Posição da tecla Ctrl"
-#: ../rules/base.xml.in.h:931
+#: ../rules/base.xml.in.h:932
msgid "Caps Lock as Ctrl"
msgstr "Caps Lock como Ctrl"
-#: ../rules/base.xml.in.h:932
+#: ../rules/base.xml.in.h:933
msgid "Left Ctrl as Meta"
msgstr "Ctrl da esquerda como Meta"
-#: ../rules/base.xml.in.h:933
+#: ../rules/base.xml.in.h:934
msgid "Swap Ctrl and Caps Lock"
msgstr "Trocar o Ctrl e o Caps Lock"
-#: ../rules/base.xml.in.h:934
+#: ../rules/base.xml.in.h:935
msgid "At left of 'A'"
msgstr "À esquerda de 'A'"
-#: ../rules/base.xml.in.h:935
+#: ../rules/base.xml.in.h:936
msgid "At bottom left"
msgstr "Na parte inferior esquerda"
-#: ../rules/base.xml.in.h:936
+#: ../rules/base.xml.in.h:937
msgid "Right Ctrl as Right Alt"
msgstr "Ctrl Direito como Alt Direito"
-#: ../rules/base.xml.in.h:937
+#: ../rules/base.xml.in.h:938
msgid "Menu as Right Ctrl"
msgstr "Menu como Ctrl da direita"
-#: ../rules/base.xml.in.h:938
+#: ../rules/base.xml.in.h:939
msgid "Right Alt as Right Ctrl"
msgstr "Alt da direita como Ctrl da direita"
-#: ../rules/base.xml.in.h:939
+#: ../rules/base.xml.in.h:940
+msgid "Swap Left Alt key with Left Ctrl key"
+msgstr "Alternar a tecla Alt esquerda com a tecla Ctrl esquerda"
+
+#: ../rules/base.xml.in.h:941
+msgid "Swap Left Win key with Left Ctrl key"
+msgstr "Alternar a tecla Win esquerda com a tecla Ctrl esquerda"
+
+#: ../rules/base.xml.in.h:942
+msgid "Left Alt as Ctrl, Left Ctrl as Win, Left Win as Alt"
+msgstr "Alt esquerdo como Ctrl, Ctrl esquerdo como Win, Win esquerdo como Alt"
+
+#: ../rules/base.xml.in.h:943
msgid "Use keyboard LED to show alternative layout"
msgstr "Usar LEDs do teclado para mostrar disposição alternativa"
-#: ../rules/base.xml.in.h:940
+#: ../rules/base.xml.in.h:944
msgid "Num Lock"
msgstr "Num Lock"
-#: ../rules/base.xml.in.h:941
+#: ../rules/base.xml.in.h:945
msgid "Layout of numeric keypad"
msgstr "Disposição das teclas do teclado numérico"
-#: ../rules/base.xml.in.h:942
+#: ../rules/base.xml.in.h:946
msgid "Legacy"
msgstr "Legado"
-#: ../rules/base.xml.in.h:943
+#: ../rules/base.xml.in.h:947
msgid "Unicode additions (arrows and math operators)"
msgstr "Adições Unicode (setas e operadores matemáticos)"
-#: ../rules/base.xml.in.h:944
+#: ../rules/base.xml.in.h:948
msgid "Unicode additions (arrows and math operators; math operators on default level)"
msgstr "Adições Unicode (setas e operadores matemáticos; operadores matemáticos no nível padrão)"
-#: ../rules/base.xml.in.h:945
+#: ../rules/base.xml.in.h:949
msgid "Legacy Wang 724"
msgstr "Legado Wang 724"
-#: ../rules/base.xml.in.h:946
+#: ../rules/base.xml.in.h:950
msgid "Wang 724 keypad with Unicode additions (arrows and math operators)"
msgstr "Teclado Wang 724 keypad com adições Unicode (setas e operadores matemáticos)"
-#: ../rules/base.xml.in.h:947
+#: ../rules/base.xml.in.h:951
msgid "Wang 724 keypad with Unicode additions (arrows and math operators; math operators on default level)"
msgstr "Teclado Wang 724 keypad com adições Unicode (setas e operadores matemáticos; operadores matemáticos no nível padrão)"
-#: ../rules/base.xml.in.h:948
+#: ../rules/base.xml.in.h:952
msgid "Hexadecimal"
msgstr "Hexadecimal"
-#: ../rules/base.xml.in.h:949
+#: ../rules/base.xml.in.h:953
msgid "ATM/phone-style"
msgstr "ATM/estilo-telefone"
-#: ../rules/base.xml.in.h:950
+#: ../rules/base.xml.in.h:954
msgid "Numeric keypad delete key behaviour"
msgstr "Teclado numérico elimina comportamento chave"
-#: ../rules/base.xml.in.h:951
+#: ../rules/base.xml.in.h:955
msgid "Legacy key with dot"
msgstr "Legado com tecla ponto"
#. Actually, with KP_SEPARATOR, as the old keypad(comma)
-#: ../rules/base.xml.in.h:953
+#: ../rules/base.xml.in.h:957
msgid "Legacy key with comma"
msgstr "Legado com tecla vírgula"
-#: ../rules/base.xml.in.h:954
+#: ../rules/base.xml.in.h:958
msgid "Four-level key with dot"
msgstr "Chave de quatro níveis com ponto"
-#: ../rules/base.xml.in.h:955
+#: ../rules/base.xml.in.h:959
msgid "Four-level key with dot, Latin-9 only"
msgstr "Tecla de quarto nível com ponto, apenas Latin-9"
-#: ../rules/base.xml.in.h:956
+#: ../rules/base.xml.in.h:960
msgid "Four-level key with comma"
msgstr "Chave de quatro níveis com vírgula"
-#: ../rules/base.xml.in.h:957
+#: ../rules/base.xml.in.h:961
msgid "Four-level key with momayyez"
msgstr "Tecla de quarto nível com momayyez"
#. This assumes the KP_ abstract symbols are actually useful for some apps
#. The description needs to be rewritten
-#: ../rules/base.xml.in.h:960
+#: ../rules/base.xml.in.h:964
msgid "Four-level key with abstract separators"
msgstr "Chave de quatro níveis com separadores abstratos"
-#: ../rules/base.xml.in.h:961
+#: ../rules/base.xml.in.h:965
msgid "Semicolon on third level"
msgstr "Ponto-e-vírgula no terceiro nível"
-#: ../rules/base.xml.in.h:962
+#: ../rules/base.xml.in.h:966
msgid "Caps Lock key behavior"
msgstr "Comportamento da tecla Caps Lock"
-#: ../rules/base.xml.in.h:963
+#: ../rules/base.xml.in.h:967
msgid "Caps Lock uses internal capitalization; Shift \"pauses\" Caps Lock"
msgstr "Caps Lock usa caixa alta interna; Shift \"pausa\" o Caps Lock"
-#: ../rules/base.xml.in.h:964
+#: ../rules/base.xml.in.h:968
msgid "Caps Lock uses internal capitalization; Shift doesn't affect Caps Lock"
msgstr "Caps Lock usa caixa alta interna. Shift não afeta o Caps Lock"
-#: ../rules/base.xml.in.h:965
+#: ../rules/base.xml.in.h:969
msgid "Caps Lock acts as Shift with locking; Shift \"pauses\" Caps Lock"
msgstr "Caps Lock funciona como Shift com trava; Shift \"pausa\" a tecla Caps Lock"
-#: ../rules/base.xml.in.h:966
+#: ../rules/base.xml.in.h:970
msgid "Caps Lock acts as Shift with locking; Shift doesn't affect Caps Lock"
msgstr "Caps Lock funciona como Shift com trava; Shift não afeta a tecla Caps Lock"
-#: ../rules/base.xml.in.h:967
+#: ../rules/base.xml.in.h:971
msgid "Caps Lock toggles normal capitalization of alphabetic characters"
msgstr "Caps Lock alterna o uso normal de maiúsculas dos caracteres alfabéticos"
-#: ../rules/base.xml.in.h:968
+#: ../rules/base.xml.in.h:972
msgid "Make Caps Lock an additional Num Lock"
msgstr "Fazer do Caps Lock um Num Lock adicional"
-#: ../rules/base.xml.in.h:969
+#: ../rules/base.xml.in.h:973
msgid "Swap ESC and Caps Lock"
msgstr "Trocar o Esc e o Caps Lock"
-#: ../rules/base.xml.in.h:970
+#: ../rules/base.xml.in.h:974
msgid "Make Caps Lock an additional ESC"
msgstr "Fazer do Caps Lock um Esc adicional"
-#: ../rules/base.xml.in.h:971
+#: ../rules/base.xml.in.h:975
msgid "Make Caps Lock an additional Backspace"
msgstr "Fazer do Caps Lock um Backspace adicional"
-#: ../rules/base.xml.in.h:972
+#: ../rules/base.xml.in.h:976
msgid "Make Caps Lock an additional Super"
msgstr "Fazer do Caps Lock um Super adicional"
-#: ../rules/base.xml.in.h:973
+#: ../rules/base.xml.in.h:977
msgid "Make Caps Lock an additional Hyper"
msgstr "Tornar o Caps Lock uma adição à Hyper"
-#: ../rules/base.xml.in.h:974
+#: ../rules/base.xml.in.h:978
msgid "Caps Lock toggles ShiftLock (affects all keys)"
msgstr "Caps Lock alterna ShiftLock (todas as teclas são afetadas)"
-#: ../rules/base.xml.in.h:975
+#: ../rules/base.xml.in.h:979
msgid "Caps Lock is disabled"
msgstr "Caps Lock está desabilitada"
-#: ../rules/base.xml.in.h:976
+#: ../rules/base.xml.in.h:980
msgid "Make Caps Lock an additional Ctrl"
msgstr "Fazer do Caps Lock um Ctrl adicional"
-#: ../rules/base.xml.in.h:977
+#: ../rules/base.xml.in.h:981
msgid "Alt/Win key behavior"
msgstr "Comportamento da tecla Alt/Win"
-#: ../rules/base.xml.in.h:978
+#: ../rules/base.xml.in.h:982
msgid "Add the standard behavior to Menu key"
msgstr "Adicionar o comportamento padrão a tecla Menu"
-#: ../rules/base.xml.in.h:979
+#: ../rules/base.xml.in.h:983
msgid "Alt and Meta are on Alt keys"
msgstr "Alt e Meta estão nas teclas Alt"
-#: ../rules/base.xml.in.h:980
+#: ../rules/base.xml.in.h:984
msgid "Alt is mapped to Win keys (and the usual Alt keys)"
msgstr "Alt está mapeado à teclas Win (e as habituais teclas Alt)"
-#: ../rules/base.xml.in.h:981
+#: ../rules/base.xml.in.h:985
msgid "Ctrl is mapped to Win keys (and the usual Ctrl keys)"
msgstr "Ctrl está mapeado para teclas Win (e as habituais teclas Ctrl)"
-#: ../rules/base.xml.in.h:982
+#: ../rules/base.xml.in.h:986
msgid "Ctrl is mapped to Alt keys, Alt is mapped to Win keys"
msgstr "Ctrl está mapeado para teclas Alt, Alt está mapeado para teclas Win"
-#: ../rules/base.xml.in.h:983
+#: ../rules/base.xml.in.h:987
msgid "Meta is mapped to Win keys"
msgstr "Meta está mapeado para teclas Win"
-#: ../rules/base.xml.in.h:984
+#: ../rules/base.xml.in.h:988
msgid "Meta is mapped to Left Win"
msgstr "Meta está mapeado para Win esquerdo"
-#: ../rules/base.xml.in.h:985
+#: ../rules/base.xml.in.h:989
msgid "Hyper is mapped to Win-keys"
msgstr "Hyper está mapeado para teclas Win"
-#: ../rules/base.xml.in.h:986
+#: ../rules/base.xml.in.h:990
msgid "Alt is mapped to Right Win, Super to Menu"
msgstr "Alt está mapeado para Win Direito, Super para Menu"
-#: ../rules/base.xml.in.h:987
+#: ../rules/base.xml.in.h:991
msgid "Alt is swapped with Win"
msgstr "Alt é trocado por Win"
-#: ../rules/base.xml.in.h:988
+#: ../rules/base.xml.in.h:992
msgid "Position of Compose key"
msgstr "Posição da tecla de composição"
-#: ../rules/base.xml.in.h:989
+#: ../rules/base.xml.in.h:993
msgid "3rd level of Left Win"
msgstr "Terceiro nível de Win esquerdo"
-#: ../rules/base.xml.in.h:990
+#: ../rules/base.xml.in.h:994
msgid "3rd level of Right Win"
msgstr "Terceiro nível de Win direito"
-#: ../rules/base.xml.in.h:991
+#: ../rules/base.xml.in.h:995
msgid "3rd level of Menu"
msgstr "Terceiro nível de Menu"
-#: ../rules/base.xml.in.h:992
+#: ../rules/base.xml.in.h:996
msgid "3rd level of Left Ctrl"
msgstr "Terceiro nível de Ctrl esquerdo"
-#: ../rules/base.xml.in.h:993
+#: ../rules/base.xml.in.h:997
msgid "3rd level of Right Ctrl"
msgstr "Terceiro nível de Ctrl direito"
-#: ../rules/base.xml.in.h:994
+#: ../rules/base.xml.in.h:998
msgid "3rd level of Caps Lock"
msgstr "Terceiro nível de Caps Lock"
-#: ../rules/base.xml.in.h:995
+#: ../rules/base.xml.in.h:999
msgid "3rd level of &lt;Less/Greater&gt;"
msgstr "Terceiro nível de &lt;Menor que/Maior que&gt;"
-#: ../rules/base.xml.in.h:996
+#: ../rules/base.xml.in.h:1000
msgid "Pause"
msgstr "Pausa"
-#: ../rules/base.xml.in.h:997
+#: ../rules/base.xml.in.h:1001
msgid "PrtSc"
msgstr "PrtSc"
-#: ../rules/base.xml.in.h:998
+#: ../rules/base.xml.in.h:1002
msgid "Miscellaneous compatibility options"
msgstr "Opções variadas de compatibilidade"
-#: ../rules/base.xml.in.h:999
+#: ../rules/base.xml.in.h:1003
msgid "Default numeric keypad keys"
msgstr "Pré-definição das teclas do teclado numérico"
-#: ../rules/base.xml.in.h:1000
+#: ../rules/base.xml.in.h:1004
msgid "Numeric keypad keys always enter digits (as in Mac OS)"
msgstr "Teclas do teclado numérico sempre introduzem dígitos (como no Mac OS)"
-#: ../rules/base.xml.in.h:1001
+#: ../rules/base.xml.in.h:1005
msgid "Shift with numeric keypad keys works as in MS Windows"
msgstr "Shift com teclas do teclado numérico funciona como no MS Windows"
-#: ../rules/base.xml.in.h:1002
+#: ../rules/base.xml.in.h:1006
msgid "Shift does not cancel Num Lock, chooses 3rd level instead"
msgstr "Shift não cancela o Num Lock, mas escolhe o 3º nível"
-#: ../rules/base.xml.in.h:1003
+#: ../rules/base.xml.in.h:1007
msgid "Special keys (Ctrl+Alt+&lt;key&gt;) handled in a server"
msgstr "Teclas especiais (Ctrl+Alt+&lt;key&gt;) tratadas em um servidor"
-#: ../rules/base.xml.in.h:1004
+#: ../rules/base.xml.in.h:1008
msgid "Apple Aluminium Keyboard: emulate PC keys (Print, Scroll Lock, Pause, Num Lock)"
msgstr "Teclado Apple Aluminium: emular teclas de PC (Print, Scroll Lock, Pause, Num Lock)"
-#: ../rules/base.xml.in.h:1005
+#: ../rules/base.xml.in.h:1009
msgid "Shift cancels Caps Lock"
msgstr "Shift cancela o Caps Lock"
-#: ../rules/base.xml.in.h:1006
+#: ../rules/base.xml.in.h:1010
msgid "Enable extra typographic characters"
msgstr "Habilitar caracteres tipográficos extras"
-#: ../rules/base.xml.in.h:1007
+#: ../rules/base.xml.in.h:1011
msgid "Both Shift keys together toggle Caps Lock"
msgstr "Ambas as teclas Shift juntas alternam o Caps Lock"
-#: ../rules/base.xml.in.h:1008
+#: ../rules/base.xml.in.h:1012
msgid "Both Shift keys together activate Caps Lock, one Shift key deactivates"
msgstr "Ambas as teclas Shift juntas ativam o Caps Lock, uma tecla Shift desativa"
-#: ../rules/base.xml.in.h:1009
+#: ../rules/base.xml.in.h:1013
msgid "Both Shift keys together toggle ShiftLock"
msgstr "Ambas as teclas Shift juntas alternam o Shift Lock"
-#: ../rules/base.xml.in.h:1010
+#: ../rules/base.xml.in.h:1014
msgid "Shift + NumLock toggles PointerKeys"
msgstr "Shift + NumLock alterna teclas de ponteiro"
-#: ../rules/base.xml.in.h:1011
+#: ../rules/base.xml.in.h:1015
msgid "Allow breaking grabs with keyboard actions (warning: security risk)"
msgstr "Permitir ganho de quebra com as ações do teclado (aviso: risco de segurança)"
-#: ../rules/base.xml.in.h:1012
+#: ../rules/base.xml.in.h:1016
+msgid "Allow grab and window tree logging"
+msgstr "Permitir o registro e captura da árvore de janela"
+
+#: ../rules/base.xml.in.h:1017
msgid "Adding currency signs to certain keys"
msgstr "Acrescentar sinal de unidade monetária a certas teclas"
-#: ../rules/base.xml.in.h:1013
+#: ../rules/base.xml.in.h:1018
msgid "Euro on E"
msgstr "Euro no E"
-#: ../rules/base.xml.in.h:1014
+#: ../rules/base.xml.in.h:1019
msgid "Euro on 2"
msgstr "Euro no 2"
-#: ../rules/base.xml.in.h:1015
+#: ../rules/base.xml.in.h:1020
msgid "Euro on 4"
msgstr "Euro no 4"
-#: ../rules/base.xml.in.h:1016
+#: ../rules/base.xml.in.h:1021
msgid "Euro on 5"
msgstr "Euro no 5"
-#: ../rules/base.xml.in.h:1017
+#: ../rules/base.xml.in.h:1022
msgid "Rupee on 4"
msgstr "Rupia no 4"
-#: ../rules/base.xml.in.h:1018
+#: ../rules/base.xml.in.h:1023
msgid "Key to choose 5th level"
msgstr "Tecla para escolher o 5º nível"
-#: ../rules/base.xml.in.h:1019
+#: ../rules/base.xml.in.h:1024
msgid "&lt;Less/Greater&gt; chooses 5th level, locks when pressed together with another 5th-level-chooser"
msgstr "&lt;Menor que/Maior que&gt; escolhe 5º nível, bloqueia quando pressionada junto com outra tecla de 5º nível"
-#: ../rules/base.xml.in.h:1020
+#: ../rules/base.xml.in.h:1025
msgid "Right Alt chooses 5th level, locks when pressed together with another 5th-level-chooser"
msgstr "Alt direito escolhe quinto nível, bloqueia quando pressionado com outro escolhedor de 5º nível"
-#: ../rules/base.xml.in.h:1021
+#: ../rules/base.xml.in.h:1026
msgid "Left Win chooses 5th level, locks when pressed together with another 5th-level-chooser"
msgstr "Win esquerdo escolhe 5º nível, bloqueia quando pressionada junto com outro escolhedor de 5º nível"
-#: ../rules/base.xml.in.h:1022
+#: ../rules/base.xml.in.h:1027
msgid "Right Win chooses 5th level, locks when pressed together with another 5th-level-chooser"
msgstr "Win direito escolhe quinto nível, bloqueia quando pressionado com outro escolhedor de 5º nível"
-#: ../rules/base.xml.in.h:1023
+#: ../rules/base.xml.in.h:1028
msgid "Using space key to input non-breakable space character"
msgstr "Usar a tecla de espaco para inserir caractere de espaço sem quebra de linha"
-#: ../rules/base.xml.in.h:1024
+#: ../rules/base.xml.in.h:1029
msgid "Usual space at any level"
msgstr "Espaço normal em qualquer nível"
-#: ../rules/base.xml.in.h:1025
+#: ../rules/base.xml.in.h:1030
msgid "Non-breakable space character at second level"
msgstr "Caractere de espaço sem quebra de linha no segundo nível."
-#: ../rules/base.xml.in.h:1026
+#: ../rules/base.xml.in.h:1031
msgid "Non-breakable space character at third level"
msgstr "Caractere de espaço sem quebra de linha no terceiro nível."
-#: ../rules/base.xml.in.h:1027
+#: ../rules/base.xml.in.h:1032
msgid "Non-breakable space character at third level, nothing at fourth level"
msgstr "Caractere de espaço sem quebra de linha no terceiro nível, nada no quarto nível."
-#: ../rules/base.xml.in.h:1028
+#: ../rules/base.xml.in.h:1033
msgid "Non-breakable space character at third level, thin non-breakable space character at fourth level"
msgstr "Caractere de espaço não quebrável no terceiro nível, caractere de espaço não quebrável fino no quarto nível"
-#: ../rules/base.xml.in.h:1029
+#: ../rules/base.xml.in.h:1034
msgid "Non-breakable space character at fourth level"
msgstr "Caractere de espaço sem quebra de linha no quarto nível."
-#: ../rules/base.xml.in.h:1030
+#: ../rules/base.xml.in.h:1035
msgid "Non-breakable space character at fourth level, thin non-breakable space character at sixth level"
msgstr "Caractere de espaço não quebrável no quarto nível, caractere de espaço não quebrável fino no sexto nível"
-#: ../rules/base.xml.in.h:1031
+#: ../rules/base.xml.in.h:1036
msgid "Non-breakable space character at fourth level, thin non-breakable space character at sixth level (via Ctrl+Shift)"
msgstr "Caractere de espaço não quebrável no quarto nível, caractere de espaço não quebrável fino no sexto nível (via Ctrl+Shift)"
-#: ../rules/base.xml.in.h:1032
+#: ../rules/base.xml.in.h:1037
msgid "Zero-width non-joiner character at second level"
msgstr "Separação de tamanho nulo no segundo nível"
-#: ../rules/base.xml.in.h:1033
+#: ../rules/base.xml.in.h:1038
msgid "Zero-width non-joiner character at second level, zero-width joiner character at third level"
msgstr "Separação de tamanho nulo no segundo nível, união de tamanho nulo no terceiro nível"
-#: ../rules/base.xml.in.h:1034
+#: ../rules/base.xml.in.h:1039
msgid "Zero-width non-joiner character at second level, zero-width joiner character at third level, non-breakable space character at fourth level"
msgstr "Separação de tamanho nulo no segundo nível, união de tamanho nulo no terceiro nível, caractere de espaço não quebrável no quarto nível"
-#: ../rules/base.xml.in.h:1035
+#: ../rules/base.xml.in.h:1040
msgid "Zero-width non-joiner character at second level, non-breakable space character at third level"
msgstr "Separação de tamanho nulo no segundo nível, caractere de espaço não quebrável no terceiro nível"
-#: ../rules/base.xml.in.h:1036
+#: ../rules/base.xml.in.h:1041
msgid "Zero-width non-joiner character at second level, non-breakable space character at third level, nothing at fourth level"
msgstr "Separação de tamanho nulo no segundo nível, caractere de espaço não quebrável no terceiro nível, nada no quarto nível"
-#: ../rules/base.xml.in.h:1037
+#: ../rules/base.xml.in.h:1042
msgid "Zero-width non-joiner character at second level, non-breakable space character at third level, zero-width joiner at fourth level"
msgstr "Separação de tamanho nulo no segundo nível, caractere de espaço não quebrável no terceiro nível, união de tamanho nulo no quarto nível"
-#: ../rules/base.xml.in.h:1038
+#: ../rules/base.xml.in.h:1043
msgid "Zero-width non-joiner character at second level, non-breakable space character at third level, thin non-breakable space at fourth level"
msgstr "Separação de tamanho nulo no segundo nível, caractere de espaço não quebrável no terceiro nível, espaço não quebrável fino no quarto nível"
-#: ../rules/base.xml.in.h:1039
+#: ../rules/base.xml.in.h:1044
msgid "Zero-width non-joiner character at third level, zero-width joiner at fourth level"
msgstr "Separação de tamanho nulo no terceiro nível, união de tamanho nulo no quarto nível"
-#: ../rules/base.xml.in.h:1040
+#: ../rules/base.xml.in.h:1045
msgid "Japanese keyboard options"
msgstr "Teclado Japonês opcional"
-#: ../rules/base.xml.in.h:1041
+#: ../rules/base.xml.in.h:1046
msgid "Kana Lock key is locking"
msgstr "Tecla Kana Lock está bloqueando"
-#: ../rules/base.xml.in.h:1042
+#: ../rules/base.xml.in.h:1047
msgid "NICOLA-F style Backspace"
msgstr "NICOLA-F estilo Backspace"
-#: ../rules/base.xml.in.h:1043
+#: ../rules/base.xml.in.h:1048
msgid "Make Zenkaku Hankaku an additional ESC"
msgstr "Fazer Zenkaku Hankaku um ESC adicional"
-#: ../rules/base.xml.in.h:1044
+#: ../rules/base.xml.in.h:1049
msgid "Adding Esperanto supersigned letters"
msgstr "Adicionando letras diacríticas Esperanto"
-#: ../rules/base.xml.in.h:1045
+#: ../rules/base.xml.in.h:1050
msgid "To the corresponding key in a Qwerty layout"
msgstr "Para a tecla correspondente em uma disposição Qwerty."
-#: ../rules/base.xml.in.h:1046
+#: ../rules/base.xml.in.h:1051
msgid "To the corresponding key in a Dvorak layout"
msgstr "Para a tecla correspondente em uma disposição Dvorak."
-#: ../rules/base.xml.in.h:1047
+#: ../rules/base.xml.in.h:1052
msgid "To the corresponding key in a Colemak layout"
msgstr "Para a tecla correspondente em uma disposição Colemak."
-#: ../rules/base.xml.in.h:1048
+#: ../rules/base.xml.in.h:1053
msgid "Maintain key compatibility with old Solaris keycodes"
msgstr "Mantém compatibilidade de teclas com antigos código de teclas Solaris"
-#: ../rules/base.xml.in.h:1049
+#: ../rules/base.xml.in.h:1054
msgid "Sun Key compatibility"
msgstr "Compatibilidade com teclas Sun"
-#: ../rules/base.xml.in.h:1050
+#: ../rules/base.xml.in.h:1055
msgid "Key sequence to kill the X server"
msgstr "Sequência de teclas para matar o servidor X"
-#: ../rules/base.xml.in.h:1051
+#: ../rules/base.xml.in.h:1056
msgid "Ctrl + Alt + Backspace"
msgstr "Ctrl + Alt + Backspace"
@@ -4022,150 +4043,160 @@ msgstr "Salish de Coeur d'Alene"
msgid "English (US, Sun Type 6/7)"
msgstr "Inglês (EUA, Sun tipo 6/7)"
-#: ../rules/base.extras.xml.in.h:42
+#: ../rules/base.extras.xml.in.h:40
+msgid "English (Norman)"
+msgstr "Inglês (Normando)"
+
+#: ../rules/base.extras.xml.in.h:43
msgid "Polish (international with dead keys)"
msgstr "Polonês (internacional com teclas mortas)"
-#: ../rules/base.extras.xml.in.h:43
+#: ../rules/base.extras.xml.in.h:44
msgid "Polish (Colemak)"
msgstr "Polonês (Colemak)"
-#: ../rules/base.extras.xml.in.h:44
+#: ../rules/base.extras.xml.in.h:45
msgid "Polish (Sun Type 6/7)"
msgstr "Polonês (Sun tipo 6/7)"
-#: ../rules/base.extras.xml.in.h:48
+#: ../rules/base.extras.xml.in.h:49
msgid "Crimean Tatar (Dobruja Q)"
msgstr "Tártaro da Crimeia (Dobruja Q)"
-#: ../rules/base.extras.xml.in.h:49
+#: ../rules/base.extras.xml.in.h:50
msgid "Romanian (ergonomic Touchtype)"
msgstr "Romeno (Touchtype ergonômico)"
-#: ../rules/base.extras.xml.in.h:50
+#: ../rules/base.extras.xml.in.h:51
msgid "Romanian (Sun Type 6/7)"
msgstr "Romeno (Sun tipo 6/7)"
-#: ../rules/base.extras.xml.in.h:53
+#: ../rules/base.extras.xml.in.h:54
msgid "Serbian (combining accents instead of dead keys)"
msgstr "Sérvio (acentos de combinação em vez de teclas mortas)"
-#: ../rules/base.extras.xml.in.h:56
+#: ../rules/base.extras.xml.in.h:57
msgid "Russian (with Ukrainian-Belorussian layout)"
msgstr "Russo (com padrão Ucrânia-Bielorrússia)"
-#: ../rules/base.extras.xml.in.h:57
+#: ../rules/base.extras.xml.in.h:58
msgid "Russian (Sun Type 6/7)"
msgstr "Russo (Sun tipo 6/7)"
-#: ../rules/base.extras.xml.in.h:60
+#: ../rules/base.extras.xml.in.h:61
msgid "Armenian (OLPC phonetic)"
msgstr "Armênio (OLPC fonético)"
-#: ../rules/base.extras.xml.in.h:63
+#: ../rules/base.extras.xml.in.h:64
msgid "Hebrew (Biblical, SIL phonetic)"
msgstr "Hebraico (Bíblico, fonética SIL)"
-#: ../rules/base.extras.xml.in.h:66
+#: ../rules/base.extras.xml.in.h:67
msgid "Arabic (Sun Type 6/7)"
msgstr "Árabe (Sun tipo 6/7)"
-#: ../rules/base.extras.xml.in.h:69
+#: ../rules/base.extras.xml.in.h:70
msgid "Belgian (Sun Type 6/7)"
msgstr "Belga (Sun tipo 6/7)"
-#: ../rules/base.extras.xml.in.h:72
+#: ../rules/base.extras.xml.in.h:73
msgid "Portuguese (Brazil, Sun Type 6/7)"
msgstr "Português (Brasil, Sun tipo 6/7)"
-#: ../rules/base.extras.xml.in.h:75
+#: ../rules/base.extras.xml.in.h:76
msgid "Czech (Sun Type 6/7)"
msgstr "Tcheco (Sun tipo 6/7)"
-#: ../rules/base.extras.xml.in.h:78
+#: ../rules/base.extras.xml.in.h:79
msgid "Danish (Sun Type 6/7)"
msgstr "Dinamarquês (Sun tipo 6/7)"
-#: ../rules/base.extras.xml.in.h:81
+#: ../rules/base.extras.xml.in.h:82
msgid "Dutch (Sun Type 6/7)"
msgstr "Holandês (Sun tipo 6/7)"
-#: ../rules/base.extras.xml.in.h:84
+#: ../rules/base.extras.xml.in.h:85
msgid "Estonian (Sun Type 6/7)"
msgstr "Estoniano (Sun tipo 6/7)"
-#: ../rules/base.extras.xml.in.h:87
+#: ../rules/base.extras.xml.in.h:88
msgid "Finnish (Sun Type 6/7)"
msgstr "Finlandês (Sun tipo 6/7)"
-#: ../rules/base.extras.xml.in.h:89
+#: ../rules/base.extras.xml.in.h:90
msgid "French (Sun Type 6/7)"
msgstr "Francês (Sun tipo 6/7)"
-#: ../rules/base.extras.xml.in.h:92
+#: ../rules/base.extras.xml.in.h:93
msgid "Greek (Sun Type 6/7)"
msgstr "Grego (Sun tipo 6/7)"
-#: ../rules/base.extras.xml.in.h:95
+#: ../rules/base.extras.xml.in.h:96
msgid "Italian (Sun Type 6/7)"
msgstr "Italiano (Sun tipo 6/7)"
-#: ../rules/base.extras.xml.in.h:98
+#: ../rules/base.extras.xml.in.h:99
msgid "Japanese (Sun Type 6)"
msgstr "Japonês (Sun tipo 6)"
-#: ../rules/base.extras.xml.in.h:99
+#: ../rules/base.extras.xml.in.h:100
msgid "Japanese (Sun Type 7 - pc compatible)"
msgstr "Japonês (Sun tipo 7 - compatível com pc)"
-#: ../rules/base.extras.xml.in.h:100
+#: ../rules/base.extras.xml.in.h:101
msgid "Japanese (Sun Type 7 - sun compatible)"
msgstr "Japonês (Sun tipo 7 - compatível com Sun)"
-#: ../rules/base.extras.xml.in.h:103
+#: ../rules/base.extras.xml.in.h:104
msgid "Norwegian (Sun Type 6/7)"
msgstr "Norueguês (Sun tipo 6/7)"
-#: ../rules/base.extras.xml.in.h:105
+#: ../rules/base.extras.xml.in.h:106
msgid "Portuguese (Sun Type 6/7)"
msgstr "Português (Sun tipo 6/7)"
-#: ../rules/base.extras.xml.in.h:108
+#: ../rules/base.extras.xml.in.h:109
msgid "Slovak (Sun Type 6/7)"
msgstr "Eslovaco (Sun tipo 6/7)"
-#: ../rules/base.extras.xml.in.h:111
+#: ../rules/base.extras.xml.in.h:112
msgid "Spanish (Sun Type 6/7)"
msgstr "Espanhol (Sun tipo 6/7)"
-#: ../rules/base.extras.xml.in.h:114
+#: ../rules/base.extras.xml.in.h:115
msgid "Swedish (Sun Type 6/7)"
msgstr "Sueco (Sun tipo 6/7)"
-#: ../rules/base.extras.xml.in.h:116
+#: ../rules/base.extras.xml.in.h:117
msgid "German (Switzerland, Sun Type 6/7)"
msgstr "Alemão (Suiça, Sun tipo 6/7)"
-#: ../rules/base.extras.xml.in.h:117
+#: ../rules/base.extras.xml.in.h:118
msgid "French (Switzerland, Sun Type 6/7)"
msgstr "Francês (Suíça, Sun tipo 6/7)"
-#: ../rules/base.extras.xml.in.h:120
+#: ../rules/base.extras.xml.in.h:121
msgid "Turkish (Sun Type 6/7)"
msgstr "Turco (Sun tipo 6/7)"
-#: ../rules/base.extras.xml.in.h:123
+#: ../rules/base.extras.xml.in.h:124
msgid "Ukrainian (Sun Type 6/7)"
msgstr "Ucraniano (Sun tipo 6/7)"
-#: ../rules/base.extras.xml.in.h:125
+#: ../rules/base.extras.xml.in.h:126
msgid "English (UK, Sun Type 6/7)"
msgstr "Inglês (Reino Unido, Sun tipo 6/7)"
-#: ../rules/base.extras.xml.in.h:128
+#: ../rules/base.extras.xml.in.h:129
msgid "Korean (Sun Type 6/7)"
msgstr "Coreano (Sun tipo 6/7)"
+#~ msgid "Bengali"
+#~ msgstr "Bengali"
+
+#~ msgid "Portuguese (Brazil, nativo for Esperanto)"
+#~ msgstr "Português (Brasil, nativo para Esperanto)"
+
#~ msgid "English (layout toggle on multiply/divide key)"
#~ msgstr "Inglês (Mudando disposição nas teclas de divisão e multiplicação)"
diff --git a/xorg-server/xkeyboard-config/po/ru.po b/xorg-server/xkeyboard-config/po/ru.po
index c4cec2fc7..e2f686fdf 100644
--- a/xorg-server/xkeyboard-config/po/ru.po
+++ b/xorg-server/xkeyboard-config/po/ru.po
@@ -7,14 +7,14 @@
# Nickolay V. Shmyrev <nshmyrev@yandex.ru>, 2006.
# Misha Shnurapet <zayzayats@yandex.ru>, 2010.
# ChALkeR <chalkerx@gmail.com>, 2010.
-# Yuri Kozlov <yuray@komyakino.ru>, 2009, 2010, 2011, 2012, 2013.
+# Yuri Kozlov <yuray@komyakino.ru>, 2009, 2010, 2011, 2012, 2013, 2014.
# Pavel Maryanov <acid@jack.kiev.ua>, 2011.
msgid ""
msgstr ""
-"Project-Id-Version: xkeyboard-config 2.9.91\n"
+"Project-Id-Version: xkeyboard-config 2.10.99\n"
"Report-Msgid-Bugs-To: svu@users.sourceforge.net\n"
-"POT-Creation-Date: 2013-09-14 14:41+0200\n"
-"PO-Revision-Date: 2013-09-15 09:51+0400\n"
+"POT-Creation-Date: 2014-01-15 01:12+0000\n"
+"PO-Revision-Date: 2014-01-15 19:29+0400\n"
"Last-Translator: Yuri Kozlov <yuray@komyakino.ru>\n"
"Language-Team: Russian <gnu@mx.ru>\n"
"Language: ru\n"
@@ -796,34 +796,34 @@ msgstr "Английская (Коулмак)"
#: ../rules/base.xml.in.h:195
msgid "English (Dvorak)"
-msgstr "Английская (Дворак)"
+msgstr "Английская (дворак)"
#: ../rules/base.xml.in.h:196
msgid "English (Dvorak, international with dead keys)"
-msgstr "Английская (Дворак, международная с спец. клавишами)"
+msgstr "Английская (дворак, международная с спец. клавишами)"
#: ../rules/base.xml.in.h:197
msgid "English (Dvorak alternative international no dead keys)"
-msgstr "Английская (Дворак альтернативная международная без спец. клавиш)"
+msgstr "Английская (дворак альтернативная международная без спец. клавиш)"
#: ../rules/base.xml.in.h:198
msgid "English (left handed Dvorak)"
-msgstr "Английская (Дворак под левую руку)"
+msgstr "Английская (дворак под левую руку)"
#: ../rules/base.xml.in.h:199
msgid "English (right handed Dvorak)"
-msgstr "Английская (Дворак под правую руку)"
+msgstr "Английская (дворак под правую руку)"
#: ../rules/base.xml.in.h:200
msgid "English (classic Dvorak)"
-msgstr "Английская (классическая Дворак)"
+msgstr "Английская (классическая дворак)"
#: ../rules/base.xml.in.h:201
msgid "English (programmer Dvorak)"
-msgstr "Английская (Дворак для программистов)"
+msgstr "Английская (дворак для программистов)"
#. Keyboard indicator for Russian layouts
-#: ../rules/base.xml.in.h:203 ../rules/base.extras.xml.in.h:54
+#: ../rules/base.xml.in.h:203 ../rules/base.extras.xml.in.h:55
msgid "ru"
msgstr "ru"
@@ -895,11 +895,11 @@ msgid "Uzbek (Afghanistan, OLPC)"
msgstr "Узбекская (Афганистан, OLPC)"
#. Keyboard indicator for Arabic layouts
-#: ../rules/base.xml.in.h:224 ../rules/base.extras.xml.in.h:64
+#: ../rules/base.xml.in.h:224 ../rules/base.extras.xml.in.h:65
msgid "ar"
msgstr "ar"
-#: ../rules/base.xml.in.h:225 ../rules/base.extras.xml.in.h:65
+#: ../rules/base.xml.in.h:225 ../rules/base.extras.xml.in.h:66
msgid "Arabic"
msgstr "Арабская"
@@ -937,11 +937,11 @@ msgid "Albanian"
msgstr "Албанская"
#. Keyboard indicator for Armenian layouts
-#: ../rules/base.xml.in.h:236 ../rules/base.extras.xml.in.h:58
+#: ../rules/base.xml.in.h:236 ../rules/base.extras.xml.in.h:59
msgid "hy"
msgstr "hy"
-#: ../rules/base.xml.in.h:237 ../rules/base.extras.xml.in.h:59
+#: ../rules/base.xml.in.h:237 ../rules/base.extras.xml.in.h:60
msgid "Armenian"
msgstr "Армянская"
@@ -1017,11 +1017,11 @@ msgid "Belarusian (Latin)"
msgstr "Белорусская (латиница)"
#. Keyboard indicator for Belgian layouts
-#: ../rules/base.xml.in.h:259 ../rules/base.extras.xml.in.h:67
+#: ../rules/base.xml.in.h:259 ../rules/base.extras.xml.in.h:68
msgid "be"
msgstr "be"
-#: ../rules/base.xml.in.h:260 ../rules/base.extras.xml.in.h:68
+#: ../rules/base.xml.in.h:260 ../rules/base.extras.xml.in.h:69
msgid "Belgian"
msgstr "Бельгийская"
@@ -1053,18 +1053,18 @@ msgstr "Бельгийская (спец. клавиши (dead keys) Sun)"
msgid "Belgian (Wang model 724 azerty)"
msgstr "Бельгийская (Wang model 724 azerty)"
-#. Keyboard indicator for Bengali layouts
+#. Keyboard indicator for Bangla layouts
#: ../rules/base.xml.in.h:269
msgid "bn"
msgstr "bn"
#: ../rules/base.xml.in.h:270
-msgid "Bengali"
+msgid "Bangla"
msgstr "Бенгальская"
#: ../rules/base.xml.in.h:271
-msgid "Bengali (Probhat)"
-msgstr "Бенгальская (Индия, Probhat)"
+msgid "Bangla (Probhat)"
+msgstr "Бенгальская (пробхат)"
#. Keyboard indicator for Indian layouts
#: ../rules/base.xml.in.h:273
@@ -1076,28 +1076,28 @@ msgid "Indian"
msgstr "Индийская"
#: ../rules/base.xml.in.h:275
-msgid "Bengali (India)"
+msgid "Bangla (India)"
msgstr "Бенгальская (Индия)"
#: ../rules/base.xml.in.h:276
-msgid "Bengali (India, Probhat)"
-msgstr "Бенгальская (Индия, Probhat)"
+msgid "Bangla (India, Probhat)"
+msgstr "Бенгальская (Индия, пробхат)"
#: ../rules/base.xml.in.h:277
-msgid "Bengali (India, Baishakhi)"
-msgstr "Бенгальская (Индия, Baishakhi)"
+msgid "Bangla (India, Baishakhi)"
+msgstr "Бенгальская (Индия, байшакхи)"
#: ../rules/base.xml.in.h:278
-msgid "Bengali (India, Bornona)"
-msgstr "Бенгальская (Индия, Bornona)"
+msgid "Bangla (India, Bornona)"
+msgstr "Бенгальская (Индия, борона)"
#: ../rules/base.xml.in.h:279
-msgid "Bengali (India, Uni Gitanjali)"
-msgstr "Бенгальская (Индия, Uni Gitanjali)"
+msgid "Bangla (India, Uni Gitanjali)"
+msgstr "Бенгальская (Индия, юни-гитанжали)"
#: ../rules/base.xml.in.h:280
-msgid "Bengali (India, Baishakhi Inscript)"
-msgstr "Бенгальская (Индия, письменность Baishakhi)"
+msgid "Bangla (India, Baishakhi Inscript)"
+msgstr "Бенгальская (Индия, письменность байшакхи)"
#. Keyboard indicator for Gujarati layouts
#: ../rules/base.xml.in.h:282
@@ -1280,11 +1280,11 @@ msgid "Bosnian (US keyboard with Bosnian letters)"
msgstr "Боснийская (клавиатура США с боснийскими буквами)"
#. Keyboard indicator for Portuguese layouts
-#: ../rules/base.xml.in.h:336 ../rules/base.extras.xml.in.h:70
+#: ../rules/base.xml.in.h:336 ../rules/base.extras.xml.in.h:71
msgid "pt"
msgstr "pt"
-#: ../rules/base.xml.in.h:337 ../rules/base.extras.xml.in.h:71
+#: ../rules/base.xml.in.h:337 ../rules/base.extras.xml.in.h:72
msgid "Portuguese (Brazil)"
msgstr "Португальская (Бразилия)"
@@ -1294,19 +1294,19 @@ msgstr "Португальская (Бразилия, без спец. клав
#: ../rules/base.xml.in.h:339
msgid "Portuguese (Brazil, Dvorak)"
-msgstr "Португальская (Бразилия, Дворак)"
+msgstr "Португальская (Бразилия, дворак)"
#: ../rules/base.xml.in.h:340
-msgid "Portuguese (Brazil, nativo)"
-msgstr "Португальская (Бразилия, nativo)"
+msgid "Portuguese (Brazil, Nativo)"
+msgstr "Португальская (Бразилия, навито)"
#: ../rules/base.xml.in.h:341
-msgid "Portuguese (Brazil, nativo for US keyboards)"
-msgstr "Португальская (Бразилия, nativo для клавиатур US)"
+msgid "Portuguese (Brazil, Nativo for US keyboards)"
+msgstr "Португальская (Бразилия, навито для клавиатур US)"
#: ../rules/base.xml.in.h:342
-msgid "Portuguese (Brazil, nativo for Esperanto)"
-msgstr "Португальская (Бразилия, nativo для эсперанто)"
+msgid "Esperanto (Brazil, Nativo)"
+msgstr "Эсперанто (Бразилия, навито)"
#. Keyboard indicator for Bulgarian layouts
#: ../rules/base.xml.in.h:344
@@ -1390,7 +1390,7 @@ msgstr "Камерунская многоязыковая (azerty)"
#: ../rules/base.xml.in.h:366
msgid "Cameroon Multilingual (Dvorak)"
-msgstr "Камерунская многоязыковая (Дворак)"
+msgstr "Камерунская многоязыковая (дворак)"
#. Keyboard indicator for Burmese layouts
#: ../rules/base.xml.in.h:368
@@ -1407,7 +1407,7 @@ msgstr "Французская (Канада)"
#: ../rules/base.xml.in.h:371
msgid "French (Canada, Dvorak)"
-msgstr "Французская (Канада, Дворак)"
+msgstr "Французская (Канада, дворак)"
#: ../rules/base.xml.in.h:372
msgid "French (Canada, legacy)"
@@ -1460,2462 +1460,2482 @@ msgid "Tibetan (with ASCII numerals)"
msgstr "Тибетская (с цифрами ASCII)"
#: ../rules/base.xml.in.h:386
+msgid "ug"
+msgstr "ug"
+
+#: ../rules/base.xml.in.h:387
msgid "Uyghur"
msgstr "Уйгурская"
#. Keyboard indicator for Croatian layouts
-#: ../rules/base.xml.in.h:388
+#: ../rules/base.xml.in.h:389
msgid "hr"
msgstr "hr"
-#: ../rules/base.xml.in.h:389
+#: ../rules/base.xml.in.h:390
msgid "Croatian"
msgstr "Хорватская"
-#: ../rules/base.xml.in.h:390
+#: ../rules/base.xml.in.h:391
msgid "Croatian (use guillemets for quotes)"
msgstr "Хорватская (используются кавычки ёлочки как кавычки)"
-#: ../rules/base.xml.in.h:391
+#: ../rules/base.xml.in.h:392
msgid "Croatian (use Croatian digraphs)"
msgstr "Хорватская (используются хорватские диграфы)"
-#: ../rules/base.xml.in.h:392
+#: ../rules/base.xml.in.h:393
msgid "Croatian (US keyboard with Croatian digraphs)"
msgstr "Хорватская (клавиатура США с хорватскими диграфами)"
-#: ../rules/base.xml.in.h:393
+#: ../rules/base.xml.in.h:394
msgid "Croatian (US keyboard with Croatian letters)"
msgstr "Хорватская (клавиатура США с хорватскими буквами)"
#. Keyboard indicator for Chech layouts
-#: ../rules/base.xml.in.h:395 ../rules/base.extras.xml.in.h:73
+#: ../rules/base.xml.in.h:396 ../rules/base.extras.xml.in.h:74
msgid "cs"
msgstr "cs"
-#: ../rules/base.xml.in.h:396 ../rules/base.extras.xml.in.h:74
+#: ../rules/base.xml.in.h:397 ../rules/base.extras.xml.in.h:75
msgid "Czech"
msgstr "Чешская"
-#: ../rules/base.xml.in.h:397
+#: ../rules/base.xml.in.h:398
msgid "Czech (with &lt;\\|&gt; key)"
msgstr "Чешская (с клавишей &lt;\\|&gt;)"
-#: ../rules/base.xml.in.h:398
+#: ../rules/base.xml.in.h:399
msgid "Czech (qwerty)"
msgstr "Чешская (qwerty)"
-#: ../rules/base.xml.in.h:399
+#: ../rules/base.xml.in.h:400
msgid "Czech (qwerty, extended Backslash)"
msgstr "Чешская (qwerty, расширенные функции Backslash)"
-#: ../rules/base.xml.in.h:400
+#: ../rules/base.xml.in.h:401
msgid "Czech (UCW layout, accented letters only)"
msgstr "Чешская (раскладка UCW, только символы акцентов)"
-#: ../rules/base.xml.in.h:401
+#: ../rules/base.xml.in.h:402
msgid "Czech (US Dvorak with CZ UCW support)"
-msgstr "Чешская (Дворак США с поддержкой CZ UCW)"
+msgstr "Чешская (дворак США с поддержкой CZ UCW)"
#. Keyboard indicator for Danish layouts
-#: ../rules/base.xml.in.h:403 ../rules/base.extras.xml.in.h:76
+#: ../rules/base.xml.in.h:404 ../rules/base.extras.xml.in.h:77
msgid "da"
msgstr "da"
-#: ../rules/base.xml.in.h:404 ../rules/base.extras.xml.in.h:77
+#: ../rules/base.xml.in.h:405 ../rules/base.extras.xml.in.h:78
msgid "Danish"
msgstr "Датская"
-#: ../rules/base.xml.in.h:405
+#: ../rules/base.xml.in.h:406
msgid "Danish (eliminate dead keys)"
msgstr "Датская (без спец. клавиш (dead keys))"
-#: ../rules/base.xml.in.h:406
+#: ../rules/base.xml.in.h:407
msgid "Danish (Macintosh)"
msgstr "Датская (Macintosh)"
-#: ../rules/base.xml.in.h:407
+#: ../rules/base.xml.in.h:408
msgid "Danish (Macintosh, eliminate dead keys)"
msgstr "Датская (Macintosh, без спец. клавиш (dead keys))"
-#: ../rules/base.xml.in.h:408
+#: ../rules/base.xml.in.h:409
msgid "Danish (Dvorak)"
-msgstr "Датская (Дворак)"
+msgstr "Датская (дворак)"
#. Keyboard indicator for Dutch layouts
-#: ../rules/base.xml.in.h:410 ../rules/base.extras.xml.in.h:79
+#: ../rules/base.xml.in.h:411 ../rules/base.extras.xml.in.h:80
msgid "nl"
msgstr "nl"
-#: ../rules/base.xml.in.h:411 ../rules/base.extras.xml.in.h:80
+#: ../rules/base.xml.in.h:412 ../rules/base.extras.xml.in.h:81
msgid "Dutch"
msgstr "Голландская"
-#: ../rules/base.xml.in.h:412
+#: ../rules/base.xml.in.h:413
msgid "Dutch (Sun dead keys)"
msgstr "Голландская (спец. клавиши (dead keys) Sun)"
-#: ../rules/base.xml.in.h:413
+#: ../rules/base.xml.in.h:414
msgid "Dutch (Macintosh)"
msgstr "Голландская (Macintosh)"
-#: ../rules/base.xml.in.h:414
+#: ../rules/base.xml.in.h:415
msgid "Dutch (standard)"
msgstr "Голландская (стандартная)"
#. Keyboard indicator for Dzongkha layouts
-#: ../rules/base.xml.in.h:416
+#: ../rules/base.xml.in.h:417
msgid "dz"
msgstr "dz"
-#: ../rules/base.xml.in.h:417
+#: ../rules/base.xml.in.h:418
msgid "Dzongkha"
msgstr "Дзонг-кэ (dz"
#. Keyboard indicator for Estonian layouts
-#: ../rules/base.xml.in.h:419 ../rules/base.extras.xml.in.h:82
+#: ../rules/base.xml.in.h:420 ../rules/base.extras.xml.in.h:83
msgid "et"
msgstr "et"
-#: ../rules/base.xml.in.h:420 ../rules/base.extras.xml.in.h:83
+#: ../rules/base.xml.in.h:421 ../rules/base.extras.xml.in.h:84
msgid "Estonian"
msgstr "Эстонская"
-#: ../rules/base.xml.in.h:421
+#: ../rules/base.xml.in.h:422
msgid "Estonian (eliminate dead keys)"
msgstr "Эстонская (без спец. клавиш (dead keys))"
-#: ../rules/base.xml.in.h:422
+#: ../rules/base.xml.in.h:423
msgid "Estonian (Dvorak)"
-msgstr "Эстонская (Дворак)"
+msgstr "Эстонская (дворак)"
-#: ../rules/base.xml.in.h:423
+#: ../rules/base.xml.in.h:424
msgid "Estonian (US keyboard with Estonian letters)"
msgstr "Эстонская (клавиатура США с эстонскими буквами)"
-#: ../rules/base.xml.in.h:424 ../rules/base.extras.xml.in.h:16
+#: ../rules/base.xml.in.h:425 ../rules/base.extras.xml.in.h:16
msgid "Persian"
msgstr "Персидская"
-#: ../rules/base.xml.in.h:425
+#: ../rules/base.xml.in.h:426
msgid "Persian (with Persian Keypad)"
msgstr "Персидская (с персидской доп. панелью)"
#. Keyboard indicator for Kurdish layouts
-#: ../rules/base.xml.in.h:427
+#: ../rules/base.xml.in.h:428
msgid "ku"
msgstr "ku"
-#: ../rules/base.xml.in.h:428
+#: ../rules/base.xml.in.h:429
msgid "Kurdish (Iran, Latin Q)"
msgstr "Курдская (Иран, латинская Q)"
-#: ../rules/base.xml.in.h:429
+#: ../rules/base.xml.in.h:430
msgid "Kurdish (Iran, F)"
msgstr "Курдская (Иран, F)"
-#: ../rules/base.xml.in.h:430
+#: ../rules/base.xml.in.h:431
msgid "Kurdish (Iran, Latin Alt-Q)"
msgstr "Курдская (Иран, латинская Alt-Q)"
-#: ../rules/base.xml.in.h:431
+#: ../rules/base.xml.in.h:432
msgid "Kurdish (Iran, Arabic-Latin)"
msgstr "Курдская (Иран, арабо-латинская)"
-#: ../rules/base.xml.in.h:432
+#: ../rules/base.xml.in.h:433
msgid "Iraqi"
msgstr "Иракская"
-#: ../rules/base.xml.in.h:433
+#: ../rules/base.xml.in.h:434
msgid "Kurdish (Iraq, Latin Q)"
msgstr "Курдская (Ирак, латинская Q)"
-#: ../rules/base.xml.in.h:434
+#: ../rules/base.xml.in.h:435
msgid "Kurdish (Iraq, F)"
msgstr "Курдская (Ирак, F)"
-#: ../rules/base.xml.in.h:435
+#: ../rules/base.xml.in.h:436
msgid "Kurdish (Iraq, Latin Alt-Q)"
msgstr "Курдская (Ирак, латинская alt-Q)"
-#: ../rules/base.xml.in.h:436
+#: ../rules/base.xml.in.h:437
msgid "Kurdish (Iraq, Arabic-Latin)"
msgstr "Курдская (Ирак, арабо-латинская)"
#. Keyboard indicator for Faroese layouts
-#: ../rules/base.xml.in.h:438
+#: ../rules/base.xml.in.h:439
msgid "fo"
msgstr "fo"
-#: ../rules/base.xml.in.h:439
+#: ../rules/base.xml.in.h:440
msgid "Faroese"
msgstr "Фарерская"
-#: ../rules/base.xml.in.h:440
+#: ../rules/base.xml.in.h:441
msgid "Faroese (eliminate dead keys)"
msgstr "Фарерская (без спец. клавиш (dead keys))"
#. Keyboard indicator for Finnish layouts
-#: ../rules/base.xml.in.h:442 ../rules/base.extras.xml.in.h:85
+#: ../rules/base.xml.in.h:443 ../rules/base.extras.xml.in.h:86
msgid "fi"
msgstr "fi"
-#: ../rules/base.xml.in.h:443 ../rules/base.extras.xml.in.h:86
+#: ../rules/base.xml.in.h:444 ../rules/base.extras.xml.in.h:87
msgid "Finnish"
msgstr "Финская"
-#: ../rules/base.xml.in.h:444
+#: ../rules/base.xml.in.h:445
msgid "Finnish (classic)"
msgstr "Финская (классическая)"
-#: ../rules/base.xml.in.h:445
+#: ../rules/base.xml.in.h:446
msgid "Finnish (classic, eliminate dead keys)"
msgstr "Финская (классическая, без спец. клавиш (dead keys))"
-#: ../rules/base.xml.in.h:446
+#: ../rules/base.xml.in.h:447
msgid "Northern Saami (Finland)"
msgstr "Северная Саамская (Финляндия)"
-#: ../rules/base.xml.in.h:447
+#: ../rules/base.xml.in.h:448
msgid "Finnish (Macintosh)"
msgstr "Финская (Macintosh)"
-#: ../rules/base.xml.in.h:448 ../rules/base.extras.xml.in.h:88
+#: ../rules/base.xml.in.h:449 ../rules/base.extras.xml.in.h:89
msgid "French"
msgstr "Французская"
-#: ../rules/base.xml.in.h:449
+#: ../rules/base.xml.in.h:450
msgid "French (eliminate dead keys)"
msgstr "Французская (без спец. клавиш (dead keys))"
-#: ../rules/base.xml.in.h:450
+#: ../rules/base.xml.in.h:451
msgid "French (Sun dead keys)"
msgstr "Французская (со спец. клавишами (dead keys) Sun)"
-#: ../rules/base.xml.in.h:451
+#: ../rules/base.xml.in.h:452
msgid "French (alternative)"
msgstr "Французская (альтернативная)"
-#: ../rules/base.xml.in.h:452
+#: ../rules/base.xml.in.h:453
msgid "French (alternative, Latin-9 only)"
msgstr "Французская (альтернативная, только Latin-9)"
-#: ../rules/base.xml.in.h:453
+#: ../rules/base.xml.in.h:454
msgid "French (alternative, eliminate dead keys)"
msgstr "Французская (альтернативная, без спец. клавиш (dead keys))"
-#: ../rules/base.xml.in.h:454
+#: ../rules/base.xml.in.h:455
msgid "French (alternative, Sun dead keys)"
msgstr "Французская (альтернативная, спец. клавиши (dead keys) Sun)"
-#: ../rules/base.xml.in.h:455
+#: ../rules/base.xml.in.h:456
msgid "French (legacy, alternative)"
msgstr "Французская (устаревшая, альтернативная)"
-#: ../rules/base.xml.in.h:456
+#: ../rules/base.xml.in.h:457
msgid "French (legacy, alternative, eliminate dead keys)"
msgstr "Французская (устаревшая, альтернативная, без спец. клавиш (dead keys))"
-#: ../rules/base.xml.in.h:457
+#: ../rules/base.xml.in.h:458
msgid "French (legacy, alternative, Sun dead keys)"
msgstr "Французская (устаревшая, альтернативная, с спец. клавишами (dead keys) Sun)"
-#: ../rules/base.xml.in.h:458
+#: ../rules/base.xml.in.h:459
msgid "French (Bepo, ergonomic, Dvorak way)"
-msgstr "Французская (Бепо, эргономичная, похожая на Дворак)"
+msgstr "Французская (Бепо, эргономичная, похожа на дворак)"
-#: ../rules/base.xml.in.h:459
+#: ../rules/base.xml.in.h:460
msgid "French (Bepo, ergonomic, Dvorak way, Latin-9 only)"
-msgstr "Французская (Бепо, эргономичная, похожая на Дворак, только Latin-9)"
+msgstr "Французская (Бепо, эргономичная, похожа на дворак, только Latin-9)"
-#: ../rules/base.xml.in.h:460
+#: ../rules/base.xml.in.h:461
msgid "French (Dvorak)"
-msgstr "Французская (Дворак)"
+msgstr "Французская (дворак)"
-#: ../rules/base.xml.in.h:461
+#: ../rules/base.xml.in.h:462
msgid "French (Macintosh)"
msgstr "Французская (Macintosh)"
-#: ../rules/base.xml.in.h:462
+#: ../rules/base.xml.in.h:463
msgid "French (Breton)"
msgstr "Французская (бретонская)"
-#: ../rules/base.xml.in.h:463
+#: ../rules/base.xml.in.h:464
msgid "Occitan"
msgstr "Окситанский"
-#: ../rules/base.xml.in.h:464
+#: ../rules/base.xml.in.h:465
msgid "Georgian (France, AZERTY Tskapo)"
msgstr "Грузинская (Франция, AZERTY Tskapo)"
-#: ../rules/base.xml.in.h:465
+#: ../rules/base.xml.in.h:466
msgid "English (Ghana)"
msgstr "Английская (Гана)"
-#: ../rules/base.xml.in.h:466
+#: ../rules/base.xml.in.h:467
msgid "English (Ghana, multilingual)"
msgstr "Английская (Гана, международная)"
#. Keyboard indicator for Akan layouts
-#: ../rules/base.xml.in.h:468
+#: ../rules/base.xml.in.h:469
msgid "ak"
msgstr "ak"
-#: ../rules/base.xml.in.h:469
+#: ../rules/base.xml.in.h:470
msgid "Akan"
msgstr "Аканская"
#. Keyboard indicator for Ewe layouts
-#: ../rules/base.xml.in.h:471
+#: ../rules/base.xml.in.h:472
msgid "ee"
msgstr "ee"
-#: ../rules/base.xml.in.h:472
+#: ../rules/base.xml.in.h:473
msgid "Ewe"
msgstr "Ewe"
#. Keyboard indicator for Fula layouts
-#: ../rules/base.xml.in.h:474
+#: ../rules/base.xml.in.h:475
msgid "ff"
msgstr "ff"
-#: ../rules/base.xml.in.h:475
+#: ../rules/base.xml.in.h:476
msgid "Fula"
msgstr "Фулайская"
#. Keyboard indicator for Ga layouts
-#: ../rules/base.xml.in.h:477
+#: ../rules/base.xml.in.h:478
msgid "gaa"
msgstr "gaa"
-#: ../rules/base.xml.in.h:478
+#: ../rules/base.xml.in.h:479
msgid "Ga"
msgstr "Гайская"
#. Keyboard indicator for Hausa layouts
-#: ../rules/base.xml.in.h:480
+#: ../rules/base.xml.in.h:481
msgid "ha"
msgstr "ha"
-#: ../rules/base.xml.in.h:481
+#: ../rules/base.xml.in.h:482
msgid "Hausa"
msgstr "Хауза"
#. Keyboard indicator for Avatime layouts
-#: ../rules/base.xml.in.h:483
+#: ../rules/base.xml.in.h:484
msgid "avn"
msgstr "avn"
-#: ../rules/base.xml.in.h:484
+#: ../rules/base.xml.in.h:485
msgid "Avatime"
msgstr "Аватайм"
-#: ../rules/base.xml.in.h:485
+#: ../rules/base.xml.in.h:486
msgid "English (Ghana, GILLBT)"
msgstr "Английская (Гана, GILLBT)"
-#: ../rules/base.xml.in.h:486
+#: ../rules/base.xml.in.h:487
msgid "French (Guinea)"
msgstr "Французская (Гвинея)"
#. Keyboard indicator for Georgian layouts
-#: ../rules/base.xml.in.h:488
+#: ../rules/base.xml.in.h:489
msgid "ka"
msgstr "ka"
-#: ../rules/base.xml.in.h:489
+#: ../rules/base.xml.in.h:490
msgid "Georgian"
msgstr "Грузинская"
-#: ../rules/base.xml.in.h:490
+#: ../rules/base.xml.in.h:491
msgid "Georgian (ergonomic)"
msgstr "Georgian (эргономичная)"
-#: ../rules/base.xml.in.h:491
+#: ../rules/base.xml.in.h:492
msgid "Georgian (MESS)"
msgstr "Грузинская (MESS)"
-#: ../rules/base.xml.in.h:492
+#: ../rules/base.xml.in.h:493
msgid "Russian (Georgia)"
msgstr "Русская (Грузия)"
-#: ../rules/base.xml.in.h:493
+#: ../rules/base.xml.in.h:494
msgid "Ossetian (Georgia)"
msgstr "Осетинская (Грузия)"
-#: ../rules/base.xml.in.h:494 ../rules/base.extras.xml.in.h:11
+#: ../rules/base.xml.in.h:495 ../rules/base.extras.xml.in.h:11
msgid "German"
msgstr "Немецкая"
-#: ../rules/base.xml.in.h:495
+#: ../rules/base.xml.in.h:496
msgid "German (dead acute)"
msgstr "Немецкая (с акутом (dead acute))"
-#: ../rules/base.xml.in.h:496
+#: ../rules/base.xml.in.h:497
msgid "German (dead grave acute)"
msgstr "Немецкая (с dead grave acute)"
-#: ../rules/base.xml.in.h:497
+#: ../rules/base.xml.in.h:498
msgid "German (eliminate dead keys)"
msgstr "Немецкая (без спец. клавиш (dead keys))"
-#: ../rules/base.xml.in.h:498
+#: ../rules/base.xml.in.h:499
msgid "German (T3)"
msgstr "Немецкая (T3)"
-#: ../rules/base.xml.in.h:499
+#: ../rules/base.xml.in.h:500
msgid "Romanian (Germany)"
msgstr "Румынская (Германия)"
-#: ../rules/base.xml.in.h:500
+#: ../rules/base.xml.in.h:501
msgid "Romanian (Germany, eliminate dead keys)"
msgstr "Румынская (Германия, без спец. клавиш (dead keys))"
-#: ../rules/base.xml.in.h:501
+#: ../rules/base.xml.in.h:502
msgid "German (Dvorak)"
-msgstr "Немецкая (Дворак)"
+msgstr "Немецкая (дворак)"
-#: ../rules/base.xml.in.h:502
+#: ../rules/base.xml.in.h:503
msgid "German (Sun dead keys)"
msgstr "Немецкая (со спец. клавишами (dead keys) Sun)"
-#: ../rules/base.xml.in.h:503
+#: ../rules/base.xml.in.h:504
msgid "German (Neo 2)"
msgstr "Немецкая (Neo 2)"
-#: ../rules/base.xml.in.h:504
+#: ../rules/base.xml.in.h:505
msgid "German (Macintosh)"
msgstr "Немецкая (Macintosh)"
-#: ../rules/base.xml.in.h:505
+#: ../rules/base.xml.in.h:506
msgid "German (Macintosh, eliminate dead keys)"
msgstr "Немецкая (Macintosh, без спец. клавиш (dead keys))"
-#: ../rules/base.xml.in.h:506
+#: ../rules/base.xml.in.h:507
msgid "Lower Sorbian"
msgstr "Нижнелужицкая"
-#: ../rules/base.xml.in.h:507
+#: ../rules/base.xml.in.h:508
msgid "Lower Sorbian (qwertz)"
msgstr "Нижнелужицкая (qwertz)"
-#: ../rules/base.xml.in.h:508
+#: ../rules/base.xml.in.h:509
msgid "German (qwerty)"
msgstr "Немецкая (qwerty)"
-#: ../rules/base.xml.in.h:509
+#: ../rules/base.xml.in.h:510
msgid "Russian (Germany, phonetic)"
msgstr "Русская (Германия, фонетическая)"
-#: ../rules/base.xml.in.h:510
+#: ../rules/base.xml.in.h:511
msgid "German (legacy)"
msgstr "Немецкая (устаревшая)"
#. Keyboard indicator for Greek layouts
-#: ../rules/base.xml.in.h:512 ../rules/base.extras.xml.in.h:90
+#: ../rules/base.xml.in.h:513 ../rules/base.extras.xml.in.h:91
msgid "gr"
msgstr "gr"
-#: ../rules/base.xml.in.h:513 ../rules/base.extras.xml.in.h:91
+#: ../rules/base.xml.in.h:514 ../rules/base.extras.xml.in.h:92
msgid "Greek"
msgstr "Греческая"
-#: ../rules/base.xml.in.h:514
+#: ../rules/base.xml.in.h:515
msgid "Greek (simple)"
msgstr "Греческая (простая)"
-#: ../rules/base.xml.in.h:515
+#: ../rules/base.xml.in.h:516
msgid "Greek (extended)"
msgstr "Греческая (расширенная)"
-#: ../rules/base.xml.in.h:516
+#: ../rules/base.xml.in.h:517
msgid "Greek (eliminate dead keys)"
msgstr "Греческая (без спец. клавиш (dead keys))"
-#: ../rules/base.xml.in.h:517
+#: ../rules/base.xml.in.h:518
msgid "Greek (polytonic)"
msgstr "Греческая (полифоническая)"
#. Keyboard indicator for Hungarian layouts
-#: ../rules/base.xml.in.h:519
+#: ../rules/base.xml.in.h:520
msgid "hu"
msgstr "hu"
-#: ../rules/base.xml.in.h:520
+#: ../rules/base.xml.in.h:521
msgid "Hungarian"
msgstr "Венгерская"
-#: ../rules/base.xml.in.h:521
+#: ../rules/base.xml.in.h:522
msgid "Hungarian (standard)"
msgstr "Венгерская (стандартная)"
-#: ../rules/base.xml.in.h:522
+#: ../rules/base.xml.in.h:523
msgid "Hungarian (eliminate dead keys)"
msgstr "Венгерская (без спец. клавиш (dead keys))"
-#: ../rules/base.xml.in.h:523
+#: ../rules/base.xml.in.h:524
msgid "Hungarian (qwerty)"
msgstr "Венгерская (qwerty)"
-#: ../rules/base.xml.in.h:524
+#: ../rules/base.xml.in.h:525
msgid "Hungarian (101/qwertz/comma/dead keys)"
msgstr "Венгерская (101/qwertz/запятая/спец. клавиши (dead keys))"
-#: ../rules/base.xml.in.h:525
+#: ../rules/base.xml.in.h:526
msgid "Hungarian (101/qwertz/comma/eliminate dead keys)"
msgstr "Венгерская (101/qwertz/запятая/без спец. клавиш (dead keys))"
-#: ../rules/base.xml.in.h:526
+#: ../rules/base.xml.in.h:527
msgid "Hungarian (101/qwertz/dot/dead keys)"
msgstr "Венгерская (101/qwertz/точка/спец. клавиши (dead keys))"
-#: ../rules/base.xml.in.h:527
+#: ../rules/base.xml.in.h:528
msgid "Hungarian (101/qwertz/dot/eliminate dead keys)"
msgstr "Венгерская (101/qwertz/точка/без спец. клавиш (dead keys))"
-#: ../rules/base.xml.in.h:528
+#: ../rules/base.xml.in.h:529
msgid "Hungarian (101/qwerty/comma/dead keys)"
msgstr "Венгерская (pc101/qwerty/запятая/спец. клавиши (dead keys))"
-#: ../rules/base.xml.in.h:529
+#: ../rules/base.xml.in.h:530
msgid "Hungarian (101/qwerty/comma/eliminate dead keys)"
msgstr "Венгерская (pc101/qwerty/запятая/без спец. клавиш (dead keys))"
-#: ../rules/base.xml.in.h:530
+#: ../rules/base.xml.in.h:531
msgid "Hungarian (101/qwerty/dot/dead keys)"
msgstr "Венгерская (pc101/qwerty/точка/спец. клавиши (dead keys))"
-#: ../rules/base.xml.in.h:531
+#: ../rules/base.xml.in.h:532
msgid "Hungarian (101/qwerty/dot/eliminate dead keys)"
msgstr "Венгерская (pc101/qwerty/точка/без спец. клавиш (dead keys))"
-#: ../rules/base.xml.in.h:532
+#: ../rules/base.xml.in.h:533
msgid "Hungarian (102/qwertz/comma/dead keys)"
msgstr "Венгерская (102/qwertz/запятая/спец. клавиши (dead keys))"
-#: ../rules/base.xml.in.h:533
+#: ../rules/base.xml.in.h:534
msgid "Hungarian (102/qwertz/comma/eliminate dead keys)"
msgstr "Венгерская (102/qwertz/запятая/без спец. клавиш (dead keys))"
-#: ../rules/base.xml.in.h:534
+#: ../rules/base.xml.in.h:535
msgid "Hungarian (102/qwertz/dot/dead keys)"
msgstr "Венгерская (102/qwertz/точка/спец. клавиши (dead keys))"
-#: ../rules/base.xml.in.h:535
+#: ../rules/base.xml.in.h:536
msgid "Hungarian (102/qwertz/dot/eliminate dead keys)"
msgstr "Венгерская (102/qwertz/точка/без спец. клавиш (dead keys))"
-#: ../rules/base.xml.in.h:536
+#: ../rules/base.xml.in.h:537
msgid "Hungarian (102/qwerty/comma/dead keys)"
msgstr "Венгерская (102/qwerty/запятая/спец. клавиши (dead keys))"
-#: ../rules/base.xml.in.h:537
+#: ../rules/base.xml.in.h:538
msgid "Hungarian (102/qwerty/comma/eliminate dead keys)"
msgstr "Венгерская (102/qwerty/запятая/без спец. клавиш (dead keys))"
-#: ../rules/base.xml.in.h:538
+#: ../rules/base.xml.in.h:539
msgid "Hungarian (102/qwerty/dot/dead keys)"
msgstr "Венгерская (102/qwerty/точка/спец. клавиши (dead keys))"
-#: ../rules/base.xml.in.h:539
+#: ../rules/base.xml.in.h:540
msgid "Hungarian (102/qwerty/dot/eliminate dead keys)"
msgstr "Венгерская (102/qwerty/точка/без спец. клавиш (dead keys))"
#. Keyboard indicator for Icelandic layouts
-#: ../rules/base.xml.in.h:541
+#: ../rules/base.xml.in.h:542
msgid "is"
msgstr "is"
-#: ../rules/base.xml.in.h:542
+#: ../rules/base.xml.in.h:543
msgid "Icelandic"
msgstr "Исландская"
-#: ../rules/base.xml.in.h:543
+#: ../rules/base.xml.in.h:544
msgid "Icelandic (Sun dead keys)"
msgstr "Исландская (спец. клавиши (dead keys) Sun)"
-#: ../rules/base.xml.in.h:544
+#: ../rules/base.xml.in.h:545
msgid "Icelandic (eliminate dead keys)"
msgstr "Исландская (без спец. клавиш (dead keys))"
-#: ../rules/base.xml.in.h:545
+#: ../rules/base.xml.in.h:546
msgid "Icelandic (Macintosh)"
msgstr "Исландская (Macintosh)"
-#: ../rules/base.xml.in.h:546
+#: ../rules/base.xml.in.h:547
msgid "Icelandic (Dvorak)"
-msgstr "Исландская (Дворак)"
+msgstr "Исландская (дворак)"
#. Keyboard indicator for Hebrew layouts
-#: ../rules/base.xml.in.h:548 ../rules/base.extras.xml.in.h:61
+#: ../rules/base.xml.in.h:549 ../rules/base.extras.xml.in.h:62
msgid "he"
msgstr "he"
-#: ../rules/base.xml.in.h:549 ../rules/base.extras.xml.in.h:62
+#: ../rules/base.xml.in.h:550 ../rules/base.extras.xml.in.h:63
msgid "Hebrew"
msgstr "Иврит"
-#: ../rules/base.xml.in.h:550
+#: ../rules/base.xml.in.h:551
msgid "Hebrew (lyx)"
msgstr "Иврит (lyx)"
-#: ../rules/base.xml.in.h:551
+#: ../rules/base.xml.in.h:552
msgid "Hebrew (phonetic)"
msgstr "Иврит (фонетическая)"
-#: ../rules/base.xml.in.h:552
+#: ../rules/base.xml.in.h:553
msgid "Hebrew (Biblical, Tiro)"
msgstr "Иврит (библейский, Tiro)"
#. Keyboard indicator for Italian layouts
-#: ../rules/base.xml.in.h:554 ../rules/base.extras.xml.in.h:93
+#: ../rules/base.xml.in.h:555 ../rules/base.extras.xml.in.h:94
msgid "it"
msgstr "it"
-#: ../rules/base.xml.in.h:555 ../rules/base.extras.xml.in.h:94
+#: ../rules/base.xml.in.h:556 ../rules/base.extras.xml.in.h:95
msgid "Italian"
msgstr "Итальянская"
-#: ../rules/base.xml.in.h:556
+#: ../rules/base.xml.in.h:557
msgid "Italian (eliminate dead keys)"
msgstr "Итальянская (без спец. клавиш (dead keys))"
-#: ../rules/base.xml.in.h:557
+#: ../rules/base.xml.in.h:558
msgid "Italian (Macintosh)"
msgstr "Итальянская (Macintosh)"
-#: ../rules/base.xml.in.h:558
+#: ../rules/base.xml.in.h:559
msgid "Italian (US keyboard with Italian letters)"
msgstr "Итальянская (клавиатура США с итальянскими буквами)"
-#: ../rules/base.xml.in.h:559
+#: ../rules/base.xml.in.h:560
msgid "Georgian (Italy)"
msgstr "Грузинская (Италия)"
-#: ../rules/base.xml.in.h:560
+#: ../rules/base.xml.in.h:561
msgid "Italian (IBM 142)"
msgstr "Итальянская (IBM 142)"
#. Keyboard indicator for Japanese layouts
-#: ../rules/base.xml.in.h:562 ../rules/base.extras.xml.in.h:96
+#: ../rules/base.xml.in.h:563 ../rules/base.extras.xml.in.h:97
msgid "ja"
msgstr "ja"
-#: ../rules/base.xml.in.h:563 ../rules/base.extras.xml.in.h:97
+#: ../rules/base.xml.in.h:564 ../rules/base.extras.xml.in.h:98
msgid "Japanese"
msgstr "Японская"
-#: ../rules/base.xml.in.h:564
+#: ../rules/base.xml.in.h:565
msgid "Japanese (Kana)"
msgstr "Японская (Кана)"
-#: ../rules/base.xml.in.h:565
+#: ../rules/base.xml.in.h:566
msgid "Japanese (Kana 86)"
msgstr "Японская (Кана 86)"
-#: ../rules/base.xml.in.h:566
+#: ../rules/base.xml.in.h:567
msgid "Japanese (OADG 109A)"
msgstr "Японская (OADG 109A)"
-#: ../rules/base.xml.in.h:567
+#: ../rules/base.xml.in.h:568
msgid "Japanese (Macintosh)"
msgstr "Японская (Macintosh)"
-#: ../rules/base.xml.in.h:568
+#: ../rules/base.xml.in.h:569
msgid "Japanese (Dvorak)"
-msgstr "Японская (Дворак)"
+msgstr "Японская (дворак)"
#. Keyboard indicator for Kikuyu layouts
-#: ../rules/base.xml.in.h:570
+#: ../rules/base.xml.in.h:571
msgid "ki"
msgstr "ki"
-#: ../rules/base.xml.in.h:571
+#: ../rules/base.xml.in.h:572
msgid "Kyrgyz"
msgstr "Киргизская"
-#: ../rules/base.xml.in.h:572
+#: ../rules/base.xml.in.h:573
msgid "Kyrgyz (phonetic)"
msgstr "Киргизская (фонетическая)"
#. Keyboard indicator for Khmer layouts
-#: ../rules/base.xml.in.h:574
+#: ../rules/base.xml.in.h:575
msgid "km"
msgstr "km"
-#: ../rules/base.xml.in.h:575
+#: ../rules/base.xml.in.h:576
msgid "Khmer (Cambodia)"
msgstr "Кхмерская (Камбоджа)"
#. Keyboard indicator for Kazakh layouts
-#: ../rules/base.xml.in.h:577
+#: ../rules/base.xml.in.h:578
msgid "kk"
msgstr "kk"
-#: ../rules/base.xml.in.h:578
+#: ../rules/base.xml.in.h:579
msgid "Kazakh"
msgstr "Казахская"
-#: ../rules/base.xml.in.h:579
+#: ../rules/base.xml.in.h:580
msgid "Russian (Kazakhstan, with Kazakh)"
msgstr "Русская (Казахстан, с казахской)"
-#: ../rules/base.xml.in.h:580
+#: ../rules/base.xml.in.h:581
msgid "Kazakh (with Russian)"
msgstr "Казахская (с русским)"
#. Keyboard indicator for Lao layouts
-#: ../rules/base.xml.in.h:582
+#: ../rules/base.xml.in.h:583
msgid "lo"
msgstr "lo"
-#: ../rules/base.xml.in.h:583
+#: ../rules/base.xml.in.h:584
msgid "Lao"
msgstr "Лаосская"
-#: ../rules/base.xml.in.h:584
+#: ../rules/base.xml.in.h:585
msgid "Lao (STEA proposed standard layout)"
msgstr "Лаосская (стандартная раскладка, предложенная STEA)"
#. Keyboard indicator for Spanish layouts
-#: ../rules/base.xml.in.h:586 ../rules/base.extras.xml.in.h:109
+#: ../rules/base.xml.in.h:587 ../rules/base.extras.xml.in.h:110
msgid "es"
msgstr "es"
-#: ../rules/base.xml.in.h:587
+#: ../rules/base.xml.in.h:588
msgid "Spanish (Latin American)"
msgstr "Испанская (латиноамериканская)"
-#: ../rules/base.xml.in.h:588
+#: ../rules/base.xml.in.h:589
msgid "Spanish (Latin American, eliminate dead keys)"
msgstr "Испанская (латиноамериканская, без спец. клавиш (dead keys))"
-#: ../rules/base.xml.in.h:589
+#: ../rules/base.xml.in.h:590
msgid "Spanish (Latin American, include dead tilde)"
msgstr "Испанская (латиноамериканская, с dead tilde)"
-#: ../rules/base.xml.in.h:590
+#: ../rules/base.xml.in.h:591
msgid "Spanish (Latin American, Sun dead keys)"
msgstr "Испанская (латиноамериканская, с спец. клавишами (dead keys) Sun)"
#. Keyboard indicator for Lithuanian layouts
-#: ../rules/base.xml.in.h:592 ../rules/base.extras.xml.in.h:18
+#: ../rules/base.xml.in.h:593 ../rules/base.extras.xml.in.h:18
msgid "lt"
msgstr "lt"
-#: ../rules/base.xml.in.h:593 ../rules/base.extras.xml.in.h:19
+#: ../rules/base.xml.in.h:594 ../rules/base.extras.xml.in.h:19
msgid "Lithuanian"
msgstr "Литовская"
-#: ../rules/base.xml.in.h:594
+#: ../rules/base.xml.in.h:595
msgid "Lithuanian (standard)"
msgstr "Литовская (стандартная)"
-#: ../rules/base.xml.in.h:595
+#: ../rules/base.xml.in.h:596
msgid "Lithuanian (US keyboard with Lithuanian letters)"
msgstr "Литовская (клавиатура США с литовскими буквами)"
-#: ../rules/base.xml.in.h:596
+#: ../rules/base.xml.in.h:597
msgid "Lithuanian (IBM LST 1205-92)"
msgstr "Литовская (IBM LST 1205-92)"
-#: ../rules/base.xml.in.h:597
+#: ../rules/base.xml.in.h:598
msgid "Lithuanian (LEKP)"
msgstr "Литовская (LEKP)"
-#: ../rules/base.xml.in.h:598
+#: ../rules/base.xml.in.h:599
msgid "Lithuanian (LEKPa)"
msgstr "Литовская (LEKPa)"
#. Keyboard indicator for Latvian layouts
-#: ../rules/base.xml.in.h:600 ../rules/base.extras.xml.in.h:22
+#: ../rules/base.xml.in.h:601 ../rules/base.extras.xml.in.h:22
msgid "lv"
msgstr "lv"
-#: ../rules/base.xml.in.h:601 ../rules/base.extras.xml.in.h:23
+#: ../rules/base.xml.in.h:602 ../rules/base.extras.xml.in.h:23
msgid "Latvian"
msgstr "Латышская"
-#: ../rules/base.xml.in.h:602
+#: ../rules/base.xml.in.h:603
msgid "Latvian (apostrophe variant)"
msgstr "Латышская (вариант с апострофом)"
-#: ../rules/base.xml.in.h:603
+#: ../rules/base.xml.in.h:604
msgid "Latvian (tilde variant)"
msgstr "Латышская (вариант с тильдой)"
-#: ../rules/base.xml.in.h:604
+#: ../rules/base.xml.in.h:605
msgid "Latvian (F variant)"
msgstr "Латышская (вариант с F)"
-#: ../rules/base.xml.in.h:605
+#: ../rules/base.xml.in.h:606
msgid "Latvian (modern)"
msgstr "Латышская (современная)"
-#: ../rules/base.xml.in.h:606
+#: ../rules/base.xml.in.h:607
msgid "Latvian (ergonomic, ŪGJRMV)"
msgstr "Латышская (эргономичная, ŪGJRMV)"
-#: ../rules/base.xml.in.h:607
+#: ../rules/base.xml.in.h:608
msgid "Latvian (adapted)"
msgstr "Латышская (адаптированная)"
#. Keyboard indicator for Maori layouts
-#: ../rules/base.xml.in.h:609
+#: ../rules/base.xml.in.h:610
msgid "mi"
msgstr "mi"
-#: ../rules/base.xml.in.h:610
+#: ../rules/base.xml.in.h:611
msgid "Maori"
msgstr "Маори"
#. Keyboard indicator for Serbian layouts
-#: ../rules/base.xml.in.h:612 ../rules/base.extras.xml.in.h:51
+#: ../rules/base.xml.in.h:613 ../rules/base.extras.xml.in.h:52
msgid "sr"
msgstr "sr"
-#: ../rules/base.xml.in.h:613
+#: ../rules/base.xml.in.h:614
msgid "Montenegrin"
msgstr "Черногорская"
-#: ../rules/base.xml.in.h:614
+#: ../rules/base.xml.in.h:615
msgid "Montenegrin (Cyrillic)"
msgstr "Черногорская (кириллица)"
-#: ../rules/base.xml.in.h:615
+#: ../rules/base.xml.in.h:616
msgid "Montenegrin (Cyrillic, Z and ZHE swapped)"
msgstr "Черногорская (кириллица, З и Ж переставлены местами)"
-#: ../rules/base.xml.in.h:616
+#: ../rules/base.xml.in.h:617
msgid "Montenegrin (Latin Unicode)"
msgstr "Черногорская (латинская юникодная)"
-#: ../rules/base.xml.in.h:617
+#: ../rules/base.xml.in.h:618
msgid "Montenegrin (Latin qwerty)"
msgstr "Черногорская (латинская qwerty)"
-#: ../rules/base.xml.in.h:618
+#: ../rules/base.xml.in.h:619
msgid "Montenegrin (Latin Unicode qwerty)"
msgstr "Черногорская (латинская юникодная qwerty)"
-#: ../rules/base.xml.in.h:619
+#: ../rules/base.xml.in.h:620
msgid "Montenegrin (Cyrillic with guillemets)"
msgstr "Черногорская (кириллица с кавычками ёлочками)"
-#: ../rules/base.xml.in.h:620
+#: ../rules/base.xml.in.h:621
msgid "Montenegrin (Latin with guillemets)"
msgstr "Черногорская (латинская с кавычками ёлочками)"
#. Keyboard indicator for Macedonian layouts
-#: ../rules/base.xml.in.h:622
+#: ../rules/base.xml.in.h:623
msgid "mk"
msgstr "mk"
-#: ../rules/base.xml.in.h:623
+#: ../rules/base.xml.in.h:624
msgid "Macedonian"
msgstr "Македонская"
-#: ../rules/base.xml.in.h:624
+#: ../rules/base.xml.in.h:625
msgid "Macedonian (eliminate dead keys)"
msgstr "Македонская (без спец. клавиш (dead keys))"
#. Keyboard indicator for Maltese layouts
-#: ../rules/base.xml.in.h:626
+#: ../rules/base.xml.in.h:627
msgid "mt"
msgstr "mt"
-#: ../rules/base.xml.in.h:627
+#: ../rules/base.xml.in.h:628
msgid "Maltese"
msgstr "Мальтийская"
-#: ../rules/base.xml.in.h:628
+#: ../rules/base.xml.in.h:629
msgid "Maltese (with US layout)"
msgstr "Мальтийская (с раскладкой США)"
#. Keyboard indicator for Mongolian layouts
-#: ../rules/base.xml.in.h:630
+#: ../rules/base.xml.in.h:631
msgid "mn"
msgstr "mn"
-#: ../rules/base.xml.in.h:631
+#: ../rules/base.xml.in.h:632
msgid "Mongolian"
msgstr "Монгольская"
#. Keyboard indicator for Norwegian layouts
-#: ../rules/base.xml.in.h:633 ../rules/base.extras.xml.in.h:101
+#: ../rules/base.xml.in.h:634 ../rules/base.extras.xml.in.h:102
msgid "no"
msgstr "no"
-#: ../rules/base.xml.in.h:634 ../rules/base.extras.xml.in.h:102
+#: ../rules/base.xml.in.h:635 ../rules/base.extras.xml.in.h:103
msgid "Norwegian"
msgstr "Норвежская"
-#: ../rules/base.xml.in.h:635
+#: ../rules/base.xml.in.h:636
msgid "Norwegian (eliminate dead keys)"
msgstr "Норвежская (без спец. клавиш (dead keys))"
-#: ../rules/base.xml.in.h:636
+#: ../rules/base.xml.in.h:637
msgid "Norwegian (Dvorak)"
-msgstr "Норвежская (Дворак)"
+msgstr "Норвежская (дворак)"
-#: ../rules/base.xml.in.h:637
+#: ../rules/base.xml.in.h:638
msgid "Northern Saami (Norway)"
msgstr "Северная Саамская (Норвегия)"
-#: ../rules/base.xml.in.h:638
+#: ../rules/base.xml.in.h:639
msgid "Northern Saami (Norway, eliminate dead keys)"
msgstr "Северная Саамская (Норвегия, без спец. клавиш (dead keys))"
-#: ../rules/base.xml.in.h:639
+#: ../rules/base.xml.in.h:640
msgid "Norwegian (Macintosh)"
msgstr "Норвежская (Macintosh)"
-#: ../rules/base.xml.in.h:640
+#: ../rules/base.xml.in.h:641
msgid "Norwegian (Macintosh, eliminate dead keys)"
msgstr "Норвежская (Macintosh, без спец. клавиш (dead keys))"
-#: ../rules/base.xml.in.h:641
+#: ../rules/base.xml.in.h:642
msgid "Norwegian (Colemak)"
msgstr "Норвежская (Коулмак)"
#. Keyboard indicator for Polish layouts
-#: ../rules/base.xml.in.h:643 ../rules/base.extras.xml.in.h:40
+#: ../rules/base.xml.in.h:644 ../rules/base.extras.xml.in.h:41
msgid "pl"
msgstr "pl"
-#: ../rules/base.xml.in.h:644 ../rules/base.extras.xml.in.h:41
+#: ../rules/base.xml.in.h:645 ../rules/base.extras.xml.in.h:42
msgid "Polish"
msgstr "Польская"
-#: ../rules/base.xml.in.h:645
+#: ../rules/base.xml.in.h:646
msgid "Polish (legacy)"
msgstr "Польская (устаревшая)"
-#: ../rules/base.xml.in.h:646
+#: ../rules/base.xml.in.h:647
msgid "Polish (qwertz)"
msgstr "Польская (qwertz)"
-#: ../rules/base.xml.in.h:647
+#: ../rules/base.xml.in.h:648
msgid "Polish (Dvorak)"
-msgstr "Польская (Дворак)"
+msgstr "Польская (дворак)"
-#: ../rules/base.xml.in.h:648
+#: ../rules/base.xml.in.h:649
msgid "Polish (Dvorak, Polish quotes on quotemark key)"
-msgstr "Польская (Дворак, польские кавычки на клавишах с кавычками)"
+msgstr "Польская (дворак, польские кавычки на клавишах с кавычками)"
-#: ../rules/base.xml.in.h:649
+#: ../rules/base.xml.in.h:650
msgid "Polish (Dvorak, Polish quotes on key 1)"
-msgstr "Польская (Дворак, польские кавычки на клавише 1)"
+msgstr "Польская (дворак, польские кавычки на клавише 1)"
-#: ../rules/base.xml.in.h:650
+#: ../rules/base.xml.in.h:651
msgid "Kashubian"
msgstr "Кашубская"
-#: ../rules/base.xml.in.h:651
+#: ../rules/base.xml.in.h:652
msgid "Russian (Poland, phonetic Dvorak)"
-msgstr "Русский (Польша, фонетический Дворак)"
+msgstr "Русский (Польша, фонетический дворак)"
-#: ../rules/base.xml.in.h:652
+#: ../rules/base.xml.in.h:653
msgid "Polish (programmer Dvorak)"
-msgstr "Польская (Дворак для программистов)"
+msgstr "Польская (дворак для программистов)"
-#: ../rules/base.xml.in.h:653 ../rules/base.extras.xml.in.h:104
+#: ../rules/base.xml.in.h:654 ../rules/base.extras.xml.in.h:105
msgid "Portuguese"
msgstr "Португальская"
-#: ../rules/base.xml.in.h:654
+#: ../rules/base.xml.in.h:655
msgid "Portuguese (eliminate dead keys)"
msgstr "Португальская (без спец. клавиш (dead keys))"
-#: ../rules/base.xml.in.h:655
+#: ../rules/base.xml.in.h:656
msgid "Portuguese (Sun dead keys)"
msgstr "Португальская (спец. клавиши (dead keys) Sun)"
-#: ../rules/base.xml.in.h:656
+#: ../rules/base.xml.in.h:657
msgid "Portuguese (Macintosh)"
msgstr "Португальская (Macintosh)"
-#: ../rules/base.xml.in.h:657
+#: ../rules/base.xml.in.h:658
msgid "Portuguese (Macintosh, eliminate dead keys)"
msgstr "Португальская (Macintosh, без спец. клавиш (dead keys))"
-#: ../rules/base.xml.in.h:658
+#: ../rules/base.xml.in.h:659
msgid "Portuguese (Macintosh, Sun dead keys)"
msgstr "Португальская (Macintosh, спец. клавиши (dead keys) Sun)"
-#: ../rules/base.xml.in.h:659
+#: ../rules/base.xml.in.h:660
msgid "Portuguese (Nativo)"
msgstr "Португальская (Nativo)"
-#: ../rules/base.xml.in.h:660
+#: ../rules/base.xml.in.h:661
msgid "Portuguese (Nativo for US keyboards)"
msgstr "Португальская (Nativo для клавиатур US)"
-#: ../rules/base.xml.in.h:661
+#: ../rules/base.xml.in.h:662
msgid "Esperanto (Portugal, Nativo)"
msgstr "Эсперанто (Португалия, Nativo)"
#. Keyboard indicator for Romanian layouts
-#: ../rules/base.xml.in.h:663 ../rules/base.extras.xml.in.h:45
+#: ../rules/base.xml.in.h:664 ../rules/base.extras.xml.in.h:46
msgid "ro"
msgstr "ro"
-#: ../rules/base.xml.in.h:664 ../rules/base.extras.xml.in.h:46
+#: ../rules/base.xml.in.h:665 ../rules/base.extras.xml.in.h:47
msgid "Romanian"
msgstr "Румынская"
-#: ../rules/base.xml.in.h:665
+#: ../rules/base.xml.in.h:666
msgid "Romanian (cedilla)"
msgstr "Румынская (седиль)"
-#: ../rules/base.xml.in.h:666
+#: ../rules/base.xml.in.h:667
msgid "Romanian (standard)"
msgstr "Румынская (стандартная)"
-#: ../rules/base.xml.in.h:667
+#: ../rules/base.xml.in.h:668
msgid "Romanian (standard cedilla)"
msgstr "Румынская (стандартная седиль)"
-#: ../rules/base.xml.in.h:668
+#: ../rules/base.xml.in.h:669
msgid "Romanian (WinKeys)"
msgstr "Румынская (клавиши Win)"
-#: ../rules/base.xml.in.h:669 ../rules/base.extras.xml.in.h:55
+#: ../rules/base.xml.in.h:670 ../rules/base.extras.xml.in.h:56
msgid "Russian"
msgstr "Русская"
-#: ../rules/base.xml.in.h:670
+#: ../rules/base.xml.in.h:671
msgid "Russian (phonetic)"
msgstr "Русская (фонетическая)"
-#: ../rules/base.xml.in.h:671
+#: ../rules/base.xml.in.h:672
msgid "Russian (phonetic WinKeys)"
msgstr "Русская (фонетическая с клавишами Win)"
-#: ../rules/base.xml.in.h:672
+#: ../rules/base.xml.in.h:673
msgid "Russian (typewriter)"
msgstr "Русская (печатная машинка)"
-#: ../rules/base.xml.in.h:673
+#: ../rules/base.xml.in.h:674
msgid "Russian (legacy)"
msgstr "Русская (устаревшая)"
-#: ../rules/base.xml.in.h:674
+#: ../rules/base.xml.in.h:675
msgid "Russian (typewriter, legacy)"
msgstr "Русская (печатная машинка, устаревшая)"
-#: ../rules/base.xml.in.h:675
+#: ../rules/base.xml.in.h:676
msgid "Tatar"
msgstr "Татарская"
-#: ../rules/base.xml.in.h:676
+#: ../rules/base.xml.in.h:677
msgid "Ossetian (legacy)"
msgstr "Осетинская (устаревшая)"
-#: ../rules/base.xml.in.h:677
+#: ../rules/base.xml.in.h:678
msgid "Ossetian (WinKeys)"
msgstr "Осетинская (с клавишами Win)"
-#: ../rules/base.xml.in.h:678
+#: ../rules/base.xml.in.h:679
msgid "Chuvash"
msgstr "Чувашия"
-#: ../rules/base.xml.in.h:679
+#: ../rules/base.xml.in.h:680
msgid "Chuvash (Latin)"
msgstr "Чувашская (латиница)"
-#: ../rules/base.xml.in.h:680
+#: ../rules/base.xml.in.h:681
msgid "Udmurt"
msgstr "Удмуртская"
-#: ../rules/base.xml.in.h:681
+#: ../rules/base.xml.in.h:682
msgid "Komi"
msgstr "Коми"
-#: ../rules/base.xml.in.h:682
+#: ../rules/base.xml.in.h:683
msgid "Yakut"
msgstr "Якутская"
-#: ../rules/base.xml.in.h:683
+#: ../rules/base.xml.in.h:684
msgid "Kalmyk"
msgstr "Калмыцкая"
-#: ../rules/base.xml.in.h:684
+#: ../rules/base.xml.in.h:685
msgid "Russian (DOS)"
msgstr "Русская (DOS)"
-#: ../rules/base.xml.in.h:685
+#: ../rules/base.xml.in.h:686
msgid "Russian (Macintosh)"
msgstr "Русская (Macintosh)"
-#: ../rules/base.xml.in.h:686
+#: ../rules/base.xml.in.h:687
msgid "Serbian (Russia)"
msgstr "Сербская (Россия)"
-#: ../rules/base.xml.in.h:687
+#: ../rules/base.xml.in.h:688
msgid "Bashkirian"
msgstr "Башкирская"
-#: ../rules/base.xml.in.h:688
+#: ../rules/base.xml.in.h:689
msgid "Mari"
msgstr "Марийская"
-#: ../rules/base.xml.in.h:689 ../rules/base.extras.xml.in.h:52
+#: ../rules/base.xml.in.h:690 ../rules/base.extras.xml.in.h:53
msgid "Serbian"
msgstr "Сербская"
-#: ../rules/base.xml.in.h:690
+#: ../rules/base.xml.in.h:691
msgid "Serbian (Cyrillic, Z and ZHE swapped)"
msgstr "Сербская (кириллица, З и Ж переставлены местами)"
-#: ../rules/base.xml.in.h:691
+#: ../rules/base.xml.in.h:692
msgid "Serbian (Latin)"
msgstr "Сербская (латинская)"
-#: ../rules/base.xml.in.h:692
+#: ../rules/base.xml.in.h:693
msgid "Serbian (Latin Unicode)"
msgstr "Сербская (латинская юникодная)"
-#: ../rules/base.xml.in.h:693
+#: ../rules/base.xml.in.h:694
msgid "Serbian (Latin qwerty)"
msgstr "Сербская (латинская qwerty)"
-#: ../rules/base.xml.in.h:694
+#: ../rules/base.xml.in.h:695
msgid "Serbian (Latin Unicode qwerty)"
msgstr "Сербская (латинская юникодная qwerty)"
-#: ../rules/base.xml.in.h:695
+#: ../rules/base.xml.in.h:696
msgid "Serbian (Cyrillic with guillemets)"
msgstr "Сербская (кириллица с кавычками ёлочками)"
-#: ../rules/base.xml.in.h:696
+#: ../rules/base.xml.in.h:697
msgid "Serbian (Latin with guillemets)"
msgstr "Сербская (латинская с кавычками ёлочками)"
-#: ../rules/base.xml.in.h:697
-msgid "Pannonian Rusyn (homophonic)"
-msgstr "Паннонская русинская (омофоническая)"
+#: ../rules/base.xml.in.h:698
+msgid "Pannonian Rusyn"
+msgstr "Паннонская русинская"
#. Keyboard indicator for Slovenian layouts
-#: ../rules/base.xml.in.h:699
+#: ../rules/base.xml.in.h:700
msgid "sl"
msgstr "sl"
-#: ../rules/base.xml.in.h:700
+#: ../rules/base.xml.in.h:701
msgid "Slovenian"
msgstr "Словенская"
-#: ../rules/base.xml.in.h:701
+#: ../rules/base.xml.in.h:702
msgid "Slovenian (use guillemets for quotes)"
msgstr "Словенская (используются кавычки ёлочки как кавычки)"
-#: ../rules/base.xml.in.h:702
+#: ../rules/base.xml.in.h:703
msgid "Slovenian (US keyboard with Slovenian letters)"
msgstr "Словенская (клавиатура США с словенскими буквами)"
#. Keyboard indicator for Slovak layouts
-#: ../rules/base.xml.in.h:704 ../rules/base.extras.xml.in.h:106
+#: ../rules/base.xml.in.h:705 ../rules/base.extras.xml.in.h:107
msgid "sk"
msgstr "sk"
-#: ../rules/base.xml.in.h:705 ../rules/base.extras.xml.in.h:107
+#: ../rules/base.xml.in.h:706 ../rules/base.extras.xml.in.h:108
msgid "Slovak"
msgstr "Словацкая"
-#: ../rules/base.xml.in.h:706
+#: ../rules/base.xml.in.h:707
msgid "Slovak (extended Backslash)"
msgstr "Словацкая (расширенные функции Backslash)"
-#: ../rules/base.xml.in.h:707
+#: ../rules/base.xml.in.h:708
msgid "Slovak (qwerty)"
msgstr "Словацкая (qwerty)"
-#: ../rules/base.xml.in.h:708
+#: ../rules/base.xml.in.h:709
msgid "Slovak (qwerty, extended Backslash)"
msgstr "Словацкая (qwerty, расширенные функции Backslash)"
-#: ../rules/base.xml.in.h:709 ../rules/base.extras.xml.in.h:110
+#: ../rules/base.xml.in.h:710 ../rules/base.extras.xml.in.h:111
msgid "Spanish"
msgstr "Испанская"
-#: ../rules/base.xml.in.h:710
+#: ../rules/base.xml.in.h:711
msgid "Spanish (eliminate dead keys)"
msgstr "Испанская (без спец. клавиш (dead keys))"
-#: ../rules/base.xml.in.h:711
+#: ../rules/base.xml.in.h:712
msgid "Spanish (include dead tilde)"
msgstr "Испанская (с dead tilde)"
-#: ../rules/base.xml.in.h:712
+#: ../rules/base.xml.in.h:713
msgid "Spanish (Sun dead keys)"
msgstr "Испанская (с спец. клавишами (dead keys) Sun)"
-#: ../rules/base.xml.in.h:713
+#: ../rules/base.xml.in.h:714
msgid "Spanish (Dvorak)"
-msgstr "Испанская (Дворак)"
+msgstr "Испанская (дворак)"
-#: ../rules/base.xml.in.h:714
+#: ../rules/base.xml.in.h:715
msgid "Asturian (Spain, with bottom-dot H and bottom-dot L)"
msgstr "Астурлеонская (испанский вариант с нижними точками у H и L)"
-#: ../rules/base.xml.in.h:715
+#: ../rules/base.xml.in.h:716
msgid "Catalan (Spain, with middle-dot L)"
msgstr "Каталонская (испанский вариант с точкой в L посередине)"
-#: ../rules/base.xml.in.h:716
+#: ../rules/base.xml.in.h:717
msgid "Spanish (Macintosh)"
msgstr "Испанская (Macintosh)"
#. Keyboard indicator for Swedish layouts
-#: ../rules/base.xml.in.h:718 ../rules/base.extras.xml.in.h:112
+#: ../rules/base.xml.in.h:719 ../rules/base.extras.xml.in.h:113
msgid "sv"
msgstr "sv"
-#: ../rules/base.xml.in.h:719 ../rules/base.extras.xml.in.h:113
+#: ../rules/base.xml.in.h:720 ../rules/base.extras.xml.in.h:114
msgid "Swedish"
msgstr "Шведская"
-#: ../rules/base.xml.in.h:720
+#: ../rules/base.xml.in.h:721
msgid "Swedish (eliminate dead keys)"
msgstr "Шведская (без спец. клавиш (dead keys))"
-#: ../rules/base.xml.in.h:721
+#: ../rules/base.xml.in.h:722
msgid "Swedish (Dvorak)"
-msgstr "Шведская (Дворак)"
+msgstr "Шведская (дворак)"
-#: ../rules/base.xml.in.h:722
+#: ../rules/base.xml.in.h:723
msgid "Russian (Sweden, phonetic)"
msgstr "Русская (Швеция, фонетическая)"
-#: ../rules/base.xml.in.h:723
+#: ../rules/base.xml.in.h:724
msgid "Russian (Sweden, phonetic, eliminate dead keys)"
msgstr "Русская (Швеция, фонетическая, без спец. клавиш (dead keys))"
-#: ../rules/base.xml.in.h:724
+#: ../rules/base.xml.in.h:725
msgid "Northern Saami (Sweden)"
msgstr "Северная Саамская (Швеция)"
-#: ../rules/base.xml.in.h:725
+#: ../rules/base.xml.in.h:726
msgid "Swedish (Macintosh)"
msgstr "Шведская (Macintosh)"
-#: ../rules/base.xml.in.h:726
+#: ../rules/base.xml.in.h:727
msgid "Swedish (Svdvorak)"
msgstr "Шведская (Svdvorak)"
-#: ../rules/base.xml.in.h:727
+#: ../rules/base.xml.in.h:728
msgid "Swedish Sign Language"
msgstr "Шведский язык жестов"
-#: ../rules/base.xml.in.h:728 ../rules/base.extras.xml.in.h:115
+#: ../rules/base.xml.in.h:729 ../rules/base.extras.xml.in.h:116
msgid "German (Switzerland)"
msgstr "Немецкая (Швейцария)"
-#: ../rules/base.xml.in.h:729
+#: ../rules/base.xml.in.h:730
msgid "German (Switzerland, legacy)"
msgstr "Немецкая (Швейцария, устаревшая)"
-#: ../rules/base.xml.in.h:730
+#: ../rules/base.xml.in.h:731
msgid "German (Switzerland, eliminate dead keys)"
msgstr "Немецкая (Швейцария, без спец. клавиш (dead keys))"
-#: ../rules/base.xml.in.h:731
+#: ../rules/base.xml.in.h:732
msgid "German (Switzerland, Sun dead keys)"
msgstr "Немецкая (Швейцария, с спец. клавишами (dead keys) Sun)"
-#: ../rules/base.xml.in.h:732
+#: ../rules/base.xml.in.h:733
msgid "French (Switzerland)"
msgstr "Французская (Швейцария)"
-#: ../rules/base.xml.in.h:733
+#: ../rules/base.xml.in.h:734
msgid "French (Switzerland, eliminate dead keys)"
msgstr "Французская (Швейцария, без спец. клавиш (dead keys))"
-#: ../rules/base.xml.in.h:734
+#: ../rules/base.xml.in.h:735
msgid "French (Switzerland, Sun dead keys)"
msgstr "Французская (Швейцария, спец. клавиши (dead keys) Sun)"
-#: ../rules/base.xml.in.h:735
+#: ../rules/base.xml.in.h:736
msgid "French (Switzerland, Macintosh)"
msgstr "Французская (Швейцария, Macintosh)"
-#: ../rules/base.xml.in.h:736
+#: ../rules/base.xml.in.h:737
msgid "German (Switzerland, Macintosh)"
msgstr "Немецкая (Швейцария, Macintosh)"
-#: ../rules/base.xml.in.h:737
+#: ../rules/base.xml.in.h:738
msgid "Arabic (Syria)"
msgstr "Арабская (Сирия)"
#. Keyboard indicator for Syriac layouts
-#: ../rules/base.xml.in.h:739
+#: ../rules/base.xml.in.h:740
msgid "syc"
msgstr "syc"
-#: ../rules/base.xml.in.h:740
+#: ../rules/base.xml.in.h:741
msgid "Syriac"
msgstr "Сирийская"
-#: ../rules/base.xml.in.h:741
+#: ../rules/base.xml.in.h:742
msgid "Syriac (phonetic)"
msgstr "Сирийская (фонетическая)"
-#: ../rules/base.xml.in.h:742
+#: ../rules/base.xml.in.h:743
msgid "Kurdish (Syria, Latin Q)"
msgstr "Курдская (Сирия, латинская Q)"
-#: ../rules/base.xml.in.h:743
+#: ../rules/base.xml.in.h:744
msgid "Kurdish (Syria, F)"
msgstr "Курдская (Сирия, F)"
-#: ../rules/base.xml.in.h:744
+#: ../rules/base.xml.in.h:745
msgid "Kurdish (Syria, Latin Alt-Q)"
msgstr "Курдская (Сирия, латинская Alt-Q)"
#. Keyboard indicator for Tajik layouts
-#: ../rules/base.xml.in.h:746
+#: ../rules/base.xml.in.h:747
msgid "tg"
msgstr "tg"
-#: ../rules/base.xml.in.h:747
+#: ../rules/base.xml.in.h:748
msgid "Tajik"
msgstr "Таджикская"
-#: ../rules/base.xml.in.h:748
+#: ../rules/base.xml.in.h:749
msgid "Tajik (legacy)"
msgstr "Таджикская (устаревшая)"
#. Keyboard indicator for Sinhala layouts
-#: ../rules/base.xml.in.h:750
+#: ../rules/base.xml.in.h:751
msgid "si"
msgstr "si"
-#: ../rules/base.xml.in.h:751
+#: ../rules/base.xml.in.h:752
msgid "Sinhala (phonetic)"
msgstr "Сингальская (фонетическая)"
-#: ../rules/base.xml.in.h:752
+#: ../rules/base.xml.in.h:753
msgid "Tamil (Sri Lanka, Unicode)"
msgstr "Тамильская (Шри-Ланка, юникодная)"
-#: ../rules/base.xml.in.h:753
+#: ../rules/base.xml.in.h:754
msgid "Tamil (Sri Lanka, TAB Typewriter)"
msgstr "Тамильская (Шри-Ланка, печатная машинка TAB)"
#. Keyboard indicator for Thai layouts
-#: ../rules/base.xml.in.h:755
+#: ../rules/base.xml.in.h:756
msgid "th"
msgstr "th"
-#: ../rules/base.xml.in.h:756
+#: ../rules/base.xml.in.h:757
msgid "Thai"
msgstr "Тайская"
-#: ../rules/base.xml.in.h:757
+#: ../rules/base.xml.in.h:758
msgid "Thai (TIS-820.2538)"
msgstr "Тайская (TIS-820.2538)"
-#: ../rules/base.xml.in.h:758
+#: ../rules/base.xml.in.h:759
msgid "Thai (Pattachote)"
msgstr "Тайская (паттачотская)"
#. Keyboard indicator for Turkish layouts
-#: ../rules/base.xml.in.h:760 ../rules/base.extras.xml.in.h:118
+#: ../rules/base.xml.in.h:761 ../rules/base.extras.xml.in.h:119
msgid "tr"
msgstr "tr"
-#: ../rules/base.xml.in.h:761 ../rules/base.extras.xml.in.h:119
+#: ../rules/base.xml.in.h:762 ../rules/base.extras.xml.in.h:120
msgid "Turkish"
msgstr "Турецкая"
-#: ../rules/base.xml.in.h:762
+#: ../rules/base.xml.in.h:763
msgid "Turkish (F)"
msgstr "Турецкая (F)"
-#: ../rules/base.xml.in.h:763
+#: ../rules/base.xml.in.h:764
msgid "Turkish (Alt-Q)"
msgstr "Турецкая (Alt-Q)"
-#: ../rules/base.xml.in.h:764
+#: ../rules/base.xml.in.h:765
msgid "Turkish (Sun dead keys)"
msgstr "Турецкая (со спец. клавишами (dead keys) Sun)"
-#: ../rules/base.xml.in.h:765
+#: ../rules/base.xml.in.h:766
msgid "Kurdish (Turkey, Latin Q)"
msgstr "Курдская (Турция, латинская Q)"
-#: ../rules/base.xml.in.h:766
+#: ../rules/base.xml.in.h:767
msgid "Kurdish (Turkey, F)"
msgstr "Курдская (Турция, F)"
-#: ../rules/base.xml.in.h:767
+#: ../rules/base.xml.in.h:768
msgid "Kurdish (Turkey, Latin Alt-Q)"
msgstr "Курдская (Турция, латинская Alt-Q)"
-#: ../rules/base.xml.in.h:768
+#: ../rules/base.xml.in.h:769
msgid "Turkish (international with dead keys)"
msgstr "Турецкая (международная со спец. клавишами)"
#. Keyboard indicator for Crimean Tatar layouts
-#: ../rules/base.xml.in.h:770 ../rules/base.extras.xml.in.h:47
+#: ../rules/base.xml.in.h:771 ../rules/base.extras.xml.in.h:48
msgid "crh"
msgstr "crh"
-#: ../rules/base.xml.in.h:771
+#: ../rules/base.xml.in.h:772
msgid "Crimean Tatar (Turkish Q)"
msgstr "Крымско-татарская (турецкая Q)"
-#: ../rules/base.xml.in.h:772
+#: ../rules/base.xml.in.h:773
msgid "Crimean Tatar (Turkish F)"
msgstr "Крымско-татарская (турецкая F)"
-#: ../rules/base.xml.in.h:773
+#: ../rules/base.xml.in.h:774
msgid "Crimean Tatar (Turkish Alt-Q)"
msgstr "Крымско-татарская (турецкая Alt-Q)"
-#: ../rules/base.xml.in.h:774
+#: ../rules/base.xml.in.h:775
msgid "Taiwanese"
msgstr "Тайваньская"
-#: ../rules/base.xml.in.h:775
+#: ../rules/base.xml.in.h:776
msgid "Taiwanese (indigenous)"
msgstr "Тайваньская (туземная)"
#. Keyboard indicator for Saisiyat layouts
-#: ../rules/base.xml.in.h:777
+#: ../rules/base.xml.in.h:778
msgid "xsy"
msgstr "xsy"
-#: ../rules/base.xml.in.h:778
+#: ../rules/base.xml.in.h:779
msgid "Saisiyat (Taiwan)"
msgstr "Сайсьят (Тайвань)"
#. Keyboard indicator for Ukranian layouts
-#: ../rules/base.xml.in.h:780 ../rules/base.extras.xml.in.h:121
+#: ../rules/base.xml.in.h:781 ../rules/base.extras.xml.in.h:122
msgid "uk"
msgstr "uk"
-#: ../rules/base.xml.in.h:781 ../rules/base.extras.xml.in.h:122
+#: ../rules/base.xml.in.h:782 ../rules/base.extras.xml.in.h:123
msgid "Ukrainian"
msgstr "Украинская"
-#: ../rules/base.xml.in.h:782
+#: ../rules/base.xml.in.h:783
msgid "Ukrainian (phonetic)"
msgstr "Украинская (фонетическая)"
-#: ../rules/base.xml.in.h:783
+#: ../rules/base.xml.in.h:784
msgid "Ukrainian (typewriter)"
msgstr "Украинская (печатная машинка)"
-#: ../rules/base.xml.in.h:784
+#: ../rules/base.xml.in.h:785
msgid "Ukrainian (WinKeys)"
msgstr "Украинская (с клавишами Win)"
-#: ../rules/base.xml.in.h:785
+#: ../rules/base.xml.in.h:786
msgid "Ukrainian (legacy)"
msgstr "Украинская (устаревшая)"
-#: ../rules/base.xml.in.h:786
+#: ../rules/base.xml.in.h:787
msgid "Ukrainian (standard RSTU)"
msgstr "Украинская (стандартная RSTU)"
-#: ../rules/base.xml.in.h:787
+#: ../rules/base.xml.in.h:788
msgid "Russian (Ukraine, standard RSTU)"
msgstr "Русская (Украина, стандартная RSTU)"
-#: ../rules/base.xml.in.h:788
+#: ../rules/base.xml.in.h:789
msgid "Ukrainian (homophonic)"
msgstr "Украинская (омофоническая)"
-#: ../rules/base.xml.in.h:789 ../rules/base.extras.xml.in.h:124
+#: ../rules/base.xml.in.h:790 ../rules/base.extras.xml.in.h:125
msgid "English (UK)"
msgstr "Английская (Великобритания)"
-#: ../rules/base.xml.in.h:790
+#: ../rules/base.xml.in.h:791
msgid "English (UK, extended WinKeys)"
msgstr "Английская (Великобритания, расширенная клавишами Win)"
-#: ../rules/base.xml.in.h:791
+#: ../rules/base.xml.in.h:792
msgid "English (UK, international with dead keys)"
msgstr "Английская (Великобритания, международная с спец. клавишами (dead keys))"
-#: ../rules/base.xml.in.h:792
+#: ../rules/base.xml.in.h:793
msgid "English (UK, Dvorak)"
-msgstr "Английская (Великобритания, Дворак)"
+msgstr "Английская (Великобритания, дворак)"
-#: ../rules/base.xml.in.h:793
+#: ../rules/base.xml.in.h:794
msgid "English (UK, Dvorak with UK punctuation)"
-msgstr "Английская (Великобритания, Дворак с английской пунктуацией)"
+msgstr "Английская (Великобритания, дворак с английской пунктуацией)"
-#: ../rules/base.xml.in.h:794
+#: ../rules/base.xml.in.h:795
msgid "English (UK, Macintosh)"
msgstr "Английская (Великобритания, Macintosh)"
-#: ../rules/base.xml.in.h:795
+#: ../rules/base.xml.in.h:796
msgid "English (UK, Macintosh international)"
msgstr "Английская (Великобритания, Macintosh международная)"
-#: ../rules/base.xml.in.h:796
+#: ../rules/base.xml.in.h:797
msgid "English (UK, Colemak)"
msgstr "Английская (Великобритания, Коулмак)"
-#: ../rules/base.xml.in.h:797
+#: ../rules/base.xml.in.h:798
msgid "Uzbek"
msgstr "Узбекская"
-#: ../rules/base.xml.in.h:798
+#: ../rules/base.xml.in.h:799
msgid "Uzbek (Latin)"
msgstr "Узбекская (латинская)"
#. Keyboard indicator for Vietnamese layouts
-#: ../rules/base.xml.in.h:800
+#: ../rules/base.xml.in.h:801
msgid "vi"
msgstr "vi"
-#: ../rules/base.xml.in.h:801
+#: ../rules/base.xml.in.h:802
msgid "Vietnamese"
msgstr "Вьетнамская"
#. Keyboard indicator for Korean layouts
-#: ../rules/base.xml.in.h:803 ../rules/base.extras.xml.in.h:126
+#: ../rules/base.xml.in.h:804 ../rules/base.extras.xml.in.h:127
msgid "ko"
msgstr "ko"
-#: ../rules/base.xml.in.h:804 ../rules/base.extras.xml.in.h:127
+#: ../rules/base.xml.in.h:805 ../rules/base.extras.xml.in.h:128
msgid "Korean"
msgstr "Корейская"
-#: ../rules/base.xml.in.h:805
+#: ../rules/base.xml.in.h:806
msgid "Korean (101/104 key compatible)"
msgstr "Корейская (совместимая c 101/104 кнопочной)"
-#: ../rules/base.xml.in.h:806
+#: ../rules/base.xml.in.h:807
msgid "Japanese (PC-98xx Series)"
msgstr "Японская (PC-98xx Series)"
#. Keyboard indicator for Irish layouts
-#: ../rules/base.xml.in.h:808
+#: ../rules/base.xml.in.h:809
msgid "ie"
msgstr "ie"
-#: ../rules/base.xml.in.h:809
+#: ../rules/base.xml.in.h:810
msgid "Irish"
msgstr "Ирландская"
-#: ../rules/base.xml.in.h:810
+#: ../rules/base.xml.in.h:811
msgid "CloGaelach"
msgstr "CloGaelach"
-#: ../rules/base.xml.in.h:811
+#: ../rules/base.xml.in.h:812
msgid "Irish (UnicodeExpert)"
msgstr "Ирландская (UnicodeExpert)"
-#: ../rules/base.xml.in.h:812
+#: ../rules/base.xml.in.h:813
msgid "Ogham"
msgstr "Огхам"
-#: ../rules/base.xml.in.h:813
+#: ../rules/base.xml.in.h:814
msgid "Ogham (IS434)"
msgstr "Огхам (IS434)"
-#: ../rules/base.xml.in.h:814
+#: ../rules/base.xml.in.h:815
msgid "Urdu (Pakistan)"
msgstr "Урдская (Пакистан)"
-#: ../rules/base.xml.in.h:815
+#: ../rules/base.xml.in.h:816
msgid "Urdu (Pakistan, CRULP)"
msgstr "Урдская (Пакистан, CRULP)"
-#: ../rules/base.xml.in.h:816
+#: ../rules/base.xml.in.h:817
msgid "Urdu (Pakistan, NLA)"
msgstr "Урдская (Пакистан, NLA)"
-#: ../rules/base.xml.in.h:817
+#: ../rules/base.xml.in.h:818
msgid "Arabic (Pakistan)"
msgstr "Арабская (Пакистан)"
#. Keyboard indicator for Sindhi layouts
-#: ../rules/base.xml.in.h:819
+#: ../rules/base.xml.in.h:820
msgid "sd"
msgstr "sd"
-#: ../rules/base.xml.in.h:820
+#: ../rules/base.xml.in.h:821
msgid "Sindhi"
msgstr "Синдхи"
#. Keyboard indicator for Dhivehi layouts
-#: ../rules/base.xml.in.h:822
+#: ../rules/base.xml.in.h:823
msgid "dv"
msgstr "dv"
-#: ../rules/base.xml.in.h:823
+#: ../rules/base.xml.in.h:824
msgid "Dhivehi"
msgstr "Дивехи"
-#: ../rules/base.xml.in.h:824
+#: ../rules/base.xml.in.h:825
msgid "English (South Africa)"
msgstr "Английская (Южная Африка)"
#. Keyboard indicator for Esperanto layouts
-#: ../rules/base.xml.in.h:826
+#: ../rules/base.xml.in.h:827
msgid "eo"
msgstr "eo"
-#: ../rules/base.xml.in.h:827
+#: ../rules/base.xml.in.h:828
msgid "Esperanto"
msgstr "Эсперанто"
-#: ../rules/base.xml.in.h:828
+#: ../rules/base.xml.in.h:829
msgid "Esperanto (displaced semicolon and quote, obsolete)"
msgstr "Эсперанто (смещённые точка с запятой и кавычка, устарела)"
#. Keyboard indicator for Nepali layouts
-#: ../rules/base.xml.in.h:830
+#: ../rules/base.xml.in.h:831
msgid "ne"
msgstr "ne"
-#: ../rules/base.xml.in.h:831
+#: ../rules/base.xml.in.h:832
msgid "Nepali"
msgstr "Непальская"
-#: ../rules/base.xml.in.h:832
+#: ../rules/base.xml.in.h:833
msgid "English (Nigeria)"
msgstr "Английская (Нигерия)"
#. Keyboard indicator for Igbo layouts
-#: ../rules/base.xml.in.h:834
+#: ../rules/base.xml.in.h:835
msgid "ig"
msgstr "ig"
-#: ../rules/base.xml.in.h:835
+#: ../rules/base.xml.in.h:836
msgid "Igbo"
msgstr "Игбо"
#. Keyboard indicator for Yoruba layouts
-#: ../rules/base.xml.in.h:837
+#: ../rules/base.xml.in.h:838
msgid "yo"
msgstr "yo"
-#: ../rules/base.xml.in.h:838
+#: ../rules/base.xml.in.h:839
msgid "Yoruba"
msgstr "Йорубская"
#. Keyboard indicator for Amharic layouts
-#: ../rules/base.xml.in.h:840
+#: ../rules/base.xml.in.h:841
msgid "am"
msgstr "am"
-#: ../rules/base.xml.in.h:841
+#: ../rules/base.xml.in.h:842
msgid "Amharic"
msgstr "Амхарская"
#. Keyboard indicator for Wolof layouts
-#: ../rules/base.xml.in.h:843
+#: ../rules/base.xml.in.h:844
msgid "wo"
msgstr "wo"
-#: ../rules/base.xml.in.h:844
+#: ../rules/base.xml.in.h:845
msgid "Wolof"
msgstr "Волофская"
#. Keyboard indicator for Braille layouts
-#: ../rules/base.xml.in.h:846
+#: ../rules/base.xml.in.h:847
msgid "brl"
msgstr "brl"
-#: ../rules/base.xml.in.h:847
+#: ../rules/base.xml.in.h:848
msgid "Braille"
msgstr "Брайля"
-#: ../rules/base.xml.in.h:848
+#: ../rules/base.xml.in.h:849
msgid "Braille (left hand)"
msgstr "Брайля (под левую руку)"
-#: ../rules/base.xml.in.h:849
+#: ../rules/base.xml.in.h:850
msgid "Braille (right hand)"
msgstr "Брайля (под правую руку)"
#. Keyboard indicator for Turkmen layouts
-#: ../rules/base.xml.in.h:851
+#: ../rules/base.xml.in.h:852
msgid "tk"
msgstr "tk"
-#: ../rules/base.xml.in.h:852
+#: ../rules/base.xml.in.h:853
msgid "Turkmen"
msgstr "Туркменская"
-#: ../rules/base.xml.in.h:853
+#: ../rules/base.xml.in.h:854
msgid "Turkmen (Alt-Q)"
msgstr "Туркменская (Alt-Q)"
#. Keyboard indicator for Bambara layouts
-#: ../rules/base.xml.in.h:855
+#: ../rules/base.xml.in.h:856
msgid "bm"
msgstr "bm"
-#: ../rules/base.xml.in.h:856
+#: ../rules/base.xml.in.h:857
msgid "Bambara"
msgstr "Баманская"
-#: ../rules/base.xml.in.h:857
+#: ../rules/base.xml.in.h:858
msgid "French (Mali, alternative)"
msgstr "Французская (Мали, альтернативная)"
-#: ../rules/base.xml.in.h:858
+#: ../rules/base.xml.in.h:859
msgid "English (Mali, US Macintosh)"
msgstr "Английская (Мали, Macintosh США)"
-#: ../rules/base.xml.in.h:859
+#: ../rules/base.xml.in.h:860
msgid "English (Mali, US international)"
msgstr "Английская (Мали, международная США)"
#. Keyboard indicator for Swahili layouts
-#: ../rules/base.xml.in.h:861
+#: ../rules/base.xml.in.h:862
msgid "sw"
msgstr "sw"
-#: ../rules/base.xml.in.h:862
+#: ../rules/base.xml.in.h:863
msgid "Swahili (Tanzania)"
msgstr "Суахильская (Танзания)"
-#: ../rules/base.xml.in.h:863
+#: ../rules/base.xml.in.h:864
msgid "Swahili (Kenya)"
msgstr "Суахильская (Кения)"
-#: ../rules/base.xml.in.h:864
+#: ../rules/base.xml.in.h:865
msgid "Kikuyu"
msgstr "Кикуйу"
#. Keyboard indicator for Tswana layouts
-#: ../rules/base.xml.in.h:866
+#: ../rules/base.xml.in.h:867
msgid "tn"
msgstr "tn"
-#: ../rules/base.xml.in.h:867
+#: ../rules/base.xml.in.h:868
msgid "Tswana"
msgstr "Тсванская"
#. Keyboard indicator for Filipino layouts
-#: ../rules/base.xml.in.h:869
+#: ../rules/base.xml.in.h:870
msgid "ph"
msgstr "ph"
-#: ../rules/base.xml.in.h:870
+#: ../rules/base.xml.in.h:871
msgid "Filipino"
msgstr "Филиппинская"
-#: ../rules/base.xml.in.h:871
+#: ../rules/base.xml.in.h:872
msgid "Filipino (QWERTY Baybayin)"
msgstr "Филиппинская (QWERTY байбайинская)"
-#: ../rules/base.xml.in.h:872
+#: ../rules/base.xml.in.h:873
msgid "Filipino (Capewell-Dvorak Latin)"
-msgstr "Филиппинская (Кэйпвелл-Дворак латиница)"
+msgstr "Филиппинская (кэйпвелл-дворак латиница)"
-#: ../rules/base.xml.in.h:873
+#: ../rules/base.xml.in.h:874
msgid "Filipino (Capewell-Dvorak Baybayin)"
-msgstr "Филиппинская (Кэйпвелл-Дворак байбайинcкая)"
+msgstr "Филиппинская (кэйпвелл-дворак байбайинcкая)"
-#: ../rules/base.xml.in.h:874
+#: ../rules/base.xml.in.h:875
msgid "Filipino (Capewell-QWERF 2006 Latin)"
msgstr "Филиппинская (Кэйпвелл-QWERF 2006 латиница)"
-#: ../rules/base.xml.in.h:875
+#: ../rules/base.xml.in.h:876
msgid "Filipino (Capewell-QWERF 2006 Baybayin)"
msgstr "Филиппинская (Кэйпвелл-QWERF 2006 байбайинская)"
-#: ../rules/base.xml.in.h:876
+#: ../rules/base.xml.in.h:877
msgid "Filipino (Colemak Latin)"
msgstr "Филиппинская (Коулмак латиница)"
-#: ../rules/base.xml.in.h:877
+#: ../rules/base.xml.in.h:878
msgid "Filipino (Colemak Baybayin)"
msgstr "Филиппинская (Коулмак байбайинская)"
-#: ../rules/base.xml.in.h:878
+#: ../rules/base.xml.in.h:879
msgid "Filipino (Dvorak Latin)"
-msgstr "Филиппинская (Дворак латиница)"
+msgstr "Филиппинская (дворак латиница)"
-#: ../rules/base.xml.in.h:879
+#: ../rules/base.xml.in.h:880
msgid "Filipino (Dvorak Baybayin)"
-msgstr "Филиппинская (Дворак байбайинcкая)"
+msgstr "Филиппинская (дворак байбайинcкая)"
-#: ../rules/base.xml.in.h:880
+#: ../rules/base.xml.in.h:881
msgid "md"
msgstr "md"
-#: ../rules/base.xml.in.h:881
+#: ../rules/base.xml.in.h:882
msgid "Moldavian"
msgstr "Молдавская"
-#: ../rules/base.xml.in.h:882
+#: ../rules/base.xml.in.h:883
msgid "gag"
msgstr "gag"
-#: ../rules/base.xml.in.h:883
+#: ../rules/base.xml.in.h:884
msgid "Moldavian (Gagauz)"
msgstr "Молдавская (гагаузская)"
-#: ../rules/base.xml.in.h:884
+#: ../rules/base.xml.in.h:885
msgid "Switching to another layout"
msgstr "Переключение на другую раскладку"
-#: ../rules/base.xml.in.h:885
+#: ../rules/base.xml.in.h:886
msgid "Right Alt (while pressed)"
msgstr "Правая клавиша Alt (пока нажата)"
-#: ../rules/base.xml.in.h:886
+#: ../rules/base.xml.in.h:887
msgid "Left Alt (while pressed)"
msgstr "Левая клавиша Alt (пока нажата)"
-#: ../rules/base.xml.in.h:887
+#: ../rules/base.xml.in.h:888
msgid "Left Win (while pressed)"
msgstr "Левая клавиша Win (пока нажата)"
-#: ../rules/base.xml.in.h:888
+#: ../rules/base.xml.in.h:889
msgid "Right Win (while pressed)"
msgstr "Правая клавиша Win (пока нажата)"
-#: ../rules/base.xml.in.h:889
+#: ../rules/base.xml.in.h:890
msgid "Any Win key (while pressed)"
msgstr "Любая клавиша Win (на время нажатия)"
-#: ../rules/base.xml.in.h:890
+#: ../rules/base.xml.in.h:891
msgid "Caps Lock (while pressed), Alt+Caps Lock does the original capslock action"
msgstr "Caps Lock (пока нажата), Alt+Caps Lock выполняет первоначальную функцию capslock"
-#: ../rules/base.xml.in.h:891
+#: ../rules/base.xml.in.h:892
msgid "Right Ctrl (while pressed)"
msgstr "Правая клавиша Ctrl (пока нажата)"
-#: ../rules/base.xml.in.h:892
+#: ../rules/base.xml.in.h:893
msgid "Right Alt"
msgstr "Правая клавиша Alt"
-#: ../rules/base.xml.in.h:893
+#: ../rules/base.xml.in.h:894
msgid "Left Alt"
msgstr "Левая клавиша Alt"
-#: ../rules/base.xml.in.h:894
+#: ../rules/base.xml.in.h:895
msgid "Caps Lock"
msgstr "Caps Lock"
-#: ../rules/base.xml.in.h:895
+#: ../rules/base.xml.in.h:896
msgid "Shift+Caps Lock"
msgstr "Shift+Caps Lock"
-#: ../rules/base.xml.in.h:896
+#: ../rules/base.xml.in.h:897
msgid "Caps Lock (to first layout), Shift+Caps Lock (to last layout)"
msgstr "Caps Lock (на первую раскладку), Shift+Caps Lock (на последнюю раскладку)"
-#: ../rules/base.xml.in.h:897
+#: ../rules/base.xml.in.h:898
msgid "Left Win (to first layout), Right Win/Menu (to last layout)"
msgstr "Левая Win (на первую раскладку), Правая Win/Menu (на последнюю раскладку)"
-#: ../rules/base.xml.in.h:898
+#: ../rules/base.xml.in.h:899
msgid "Left Ctrl (to first layout), Right Ctrl (to last layout)"
msgstr "Левая Ctrl (на первую раскладку), Правая Ctrl (на последнюю раскладку)"
-#: ../rules/base.xml.in.h:899
+#: ../rules/base.xml.in.h:900
msgid "Alt+Caps Lock"
msgstr "Alt+Caps Lock"
-#: ../rules/base.xml.in.h:900
+#: ../rules/base.xml.in.h:901
msgid "Both Shift keys together"
msgstr "Обе клавиши Shift, нажатые вместе"
-#: ../rules/base.xml.in.h:901
+#: ../rules/base.xml.in.h:902
msgid "Both Alt keys together"
msgstr "Обе клавиши Alt, нажатые вместе"
-#: ../rules/base.xml.in.h:902
+#: ../rules/base.xml.in.h:903
msgid "Both Ctrl keys together"
msgstr "Обе клавиши Ctrl, нажатые вместе"
-#: ../rules/base.xml.in.h:903
+#: ../rules/base.xml.in.h:904
msgid "Ctrl+Shift"
msgstr "Ctrl+Shift"
-#: ../rules/base.xml.in.h:904
+#: ../rules/base.xml.in.h:905
msgid "Left Ctrl+Left Shift"
msgstr "Левая Ctrl+Левая Shift"
-#: ../rules/base.xml.in.h:905
+#: ../rules/base.xml.in.h:906
msgid "Right Ctrl+Right Shift"
msgstr "Правая Ctrl+Правая Shift"
-#: ../rules/base.xml.in.h:906
+#: ../rules/base.xml.in.h:907
msgid "Alt+Ctrl"
msgstr "Alt+Ctrl"
-#: ../rules/base.xml.in.h:907
+#: ../rules/base.xml.in.h:908
msgid "Alt+Shift"
msgstr "Alt+Shift"
-#: ../rules/base.xml.in.h:908
+#: ../rules/base.xml.in.h:909
msgid "Left Alt+Left Shift"
msgstr "Левая Alt+Левая Shift"
-#: ../rules/base.xml.in.h:909
+#: ../rules/base.xml.in.h:910
msgid "Alt+Space"
msgstr "Alt+Пробел"
-#: ../rules/base.xml.in.h:910
+#: ../rules/base.xml.in.h:911
msgid "Menu"
msgstr "Menu"
-#: ../rules/base.xml.in.h:911
+#: ../rules/base.xml.in.h:912
msgid "Left Win"
msgstr "Левая клавиша Win"
-#: ../rules/base.xml.in.h:912
+#: ../rules/base.xml.in.h:913
msgid "Right Win"
msgstr "Правая клавиша Win"
-#: ../rules/base.xml.in.h:913
+#: ../rules/base.xml.in.h:914
msgid "Left Shift"
msgstr "Левая клавиша Shift"
-#: ../rules/base.xml.in.h:914
+#: ../rules/base.xml.in.h:915
msgid "Right Shift"
msgstr "Правая клавиша Shift"
-#: ../rules/base.xml.in.h:915
+#: ../rules/base.xml.in.h:916
msgid "Left Ctrl"
msgstr "Левая клавиша Ctrl"
-#: ../rules/base.xml.in.h:916
+#: ../rules/base.xml.in.h:917
msgid "Right Ctrl"
msgstr "Правая клавиша Ctrl"
-#: ../rules/base.xml.in.h:917
+#: ../rules/base.xml.in.h:918
msgid "Scroll Lock"
msgstr "Scroll Lock"
-#: ../rules/base.xml.in.h:918
+#: ../rules/base.xml.in.h:919
msgid "LeftCtrl+LeftWin (to first layout), RightCtrl+Menu (to second layout)"
msgstr "Левая-Ctrl+Левая-Win (на первую раскладку), Правая-Ctrl+Menu (на вторую раскладку)"
-#: ../rules/base.xml.in.h:919
+#: ../rules/base.xml.in.h:920
msgid "Key to choose 3rd level"
msgstr "Клавиша для выбора 3-го ряда"
-#: ../rules/base.xml.in.h:920
+#: ../rules/base.xml.in.h:921
msgid "Any Win key"
msgstr "Любая клавиша Win"
-#: ../rules/base.xml.in.h:921
+#: ../rules/base.xml.in.h:922
msgid "Any Alt key"
msgstr "Любая клавиша Alt"
-#: ../rules/base.xml.in.h:922
+#: ../rules/base.xml.in.h:923
msgid "Right Alt, Shift+Right Alt key is Compose"
msgstr "Правая клавиша Alt, Shift и правая Alt вместе работают как Compose"
-#: ../rules/base.xml.in.h:923
+#: ../rules/base.xml.in.h:924
msgid "Right Alt key never chooses 3rd level"
msgstr "По правой клавише Alt никогда не выбирается третий ряд"
-#: ../rules/base.xml.in.h:924
+#: ../rules/base.xml.in.h:925
msgid "Enter on keypad"
msgstr "Enter на цифровой клавиатуре"
-#: ../rules/base.xml.in.h:925
+#: ../rules/base.xml.in.h:926
msgid "Backslash"
msgstr "Backslash"
-#: ../rules/base.xml.in.h:926
+#: ../rules/base.xml.in.h:927
msgid "&lt;Less/Greater&gt;"
msgstr "&lt;Меньше чем/Больше чем&gt;"
-#: ../rules/base.xml.in.h:927
+#: ../rules/base.xml.in.h:928
msgid "Caps Lock chooses 3rd level, acts as onetime lock when pressed together with another 3rd-level-chooser"
msgstr "Caps Lock выбирается 3-й ряд, действует как разовая блокировка при нажатии вместе с другим выборщиком-3-го-ряда"
-#: ../rules/base.xml.in.h:928
+#: ../rules/base.xml.in.h:929
msgid "Backslash chooses 3rd level, acts as onetime lock when pressed together with another 3rd-level-chooser"
msgstr "Backslash выбирается 3-й ряд, действует как разовая блокировка при нажатии вместе с другим выборщиком-3-го-ряда"
-#: ../rules/base.xml.in.h:929
+#: ../rules/base.xml.in.h:930
msgid "&lt;Less/Greater&gt; chooses 3rd level, acts as onetime lock when pressed together with another 3rd-level-chooser"
msgstr "&lt;Меньше чем/Больше чем&gt; выбирается 3-й ряд, действует как разовая блокировка при нажатии вместе с другим выборщиком-3-го-ряда"
-#: ../rules/base.xml.in.h:930
+#: ../rules/base.xml.in.h:931
msgid "Ctrl key position"
msgstr "Положение клавиши Ctrl"
-#: ../rules/base.xml.in.h:931
+#: ../rules/base.xml.in.h:932
msgid "Caps Lock as Ctrl"
msgstr "Caps Lock как Ctrl"
-#: ../rules/base.xml.in.h:932
+#: ../rules/base.xml.in.h:933
msgid "Left Ctrl as Meta"
msgstr "Левая клавиша Ctrl как Meta"
-#: ../rules/base.xml.in.h:933
+#: ../rules/base.xml.in.h:934
msgid "Swap Ctrl and Caps Lock"
msgstr "Поменять местами клавиши Ctrl и Caps Lock"
-#: ../rules/base.xml.in.h:934
+#: ../rules/base.xml.in.h:935
msgid "At left of 'A'"
msgstr "Слева от 'A'"
-#: ../rules/base.xml.in.h:935
+#: ../rules/base.xml.in.h:936
msgid "At bottom left"
msgstr "Снизу слева"
-#: ../rules/base.xml.in.h:936
+#: ../rules/base.xml.in.h:937
msgid "Right Ctrl as Right Alt"
msgstr "Правая клавиша Ctrl работает как правая клавиша Alt"
-#: ../rules/base.xml.in.h:937
+#: ../rules/base.xml.in.h:938
msgid "Menu as Right Ctrl"
msgstr "Menu как правая клавиша Ctrl"
-#: ../rules/base.xml.in.h:938
+#: ../rules/base.xml.in.h:939
msgid "Right Alt as Right Ctrl"
msgstr "Правая клавиша Alt как правая клавиша Ctrl"
-#: ../rules/base.xml.in.h:939
+#: ../rules/base.xml.in.h:940
+msgid "Swap Left Alt key with Left Ctrl key"
+msgstr "Левая клавиша Alt поменяна местами с левой клавишей Ctrl"
+
+#: ../rules/base.xml.in.h:941
+msgid "Swap Left Win key with Left Ctrl key"
+msgstr "Левая клавиша Win поменяна местами с левой клавишей Ctrl"
+
+#: ../rules/base.xml.in.h:942
+msgid "Left Alt as Ctrl, Left Ctrl as Win, Left Win as Alt"
+msgstr "Левая клавиша Alt как Ctrl, левая клавиша Ctrl как Win, левая клавиша Win как Alt"
+
+#: ../rules/base.xml.in.h:943
msgid "Use keyboard LED to show alternative layout"
msgstr "Использовать клавиатурные индикаторы для отображения дополнительных раскладок"
-#: ../rules/base.xml.in.h:940
+#: ../rules/base.xml.in.h:944
msgid "Num Lock"
msgstr "Num Lock"
-#: ../rules/base.xml.in.h:941
+#: ../rules/base.xml.in.h:945
msgid "Layout of numeric keypad"
msgstr "Раскладка цифровой клавиатуры"
-#: ../rules/base.xml.in.h:942
+#: ../rules/base.xml.in.h:946
msgid "Legacy"
msgstr "Legacy"
-#: ../rules/base.xml.in.h:943
+#: ../rules/base.xml.in.h:947
msgid "Unicode additions (arrows and math operators)"
msgstr "Дополнения юникода (стрелки и математические операторы)"
-#: ../rules/base.xml.in.h:944
+#: ../rules/base.xml.in.h:948
msgid "Unicode additions (arrows and math operators; math operators on default level)"
msgstr "Дополнения юникода (стрелки и математические операторы; математические операторы в ряду по умолчанию)"
-#: ../rules/base.xml.in.h:945
+#: ../rules/base.xml.in.h:949
msgid "Legacy Wang 724"
msgstr "Старая Wang 724"
-#: ../rules/base.xml.in.h:946
+#: ../rules/base.xml.in.h:950
msgid "Wang 724 keypad with Unicode additions (arrows and math operators)"
msgstr "Цифровая клавиатура Wang 724 с дополнениями юникода (стрелки и математические операторы)"
-#: ../rules/base.xml.in.h:947
+#: ../rules/base.xml.in.h:951
msgid "Wang 724 keypad with Unicode additions (arrows and math operators; math operators on default level)"
msgstr "Цифровая клавиатура Wang 724 с дополнениями юникода (стрелки и математические операторы; математические операторы в ряду по умолчанию)"
-#: ../rules/base.xml.in.h:948
+#: ../rules/base.xml.in.h:952
msgid "Hexadecimal"
msgstr "Шестнадцатеричная"
-#: ../rules/base.xml.in.h:949
+#: ../rules/base.xml.in.h:953
msgid "ATM/phone-style"
msgstr "В стиле банкоматной/телефонной"
-#: ../rules/base.xml.in.h:950
+#: ../rules/base.xml.in.h:954
msgid "Numeric keypad delete key behaviour"
msgstr "Функция клавиши Delete на цифровой клавиатуре"
-#: ../rules/base.xml.in.h:951
+#: ../rules/base.xml.in.h:955
msgid "Legacy key with dot"
msgstr "Клавиша Legacy с точкой"
#. Actually, with KP_SEPARATOR, as the old keypad(comma)
-#: ../rules/base.xml.in.h:953
+#: ../rules/base.xml.in.h:957
msgid "Legacy key with comma"
msgstr "Клавиша Legacy с запятой"
-#: ../rules/base.xml.in.h:954
+#: ../rules/base.xml.in.h:958
msgid "Four-level key with dot"
msgstr "Четырёх-рядная клавиша с точкой"
-#: ../rules/base.xml.in.h:955
+#: ../rules/base.xml.in.h:959
msgid "Four-level key with dot, Latin-9 only"
msgstr "Четырёх-рядная клавиша с точкой, только Latin-9"
-#: ../rules/base.xml.in.h:956
+#: ../rules/base.xml.in.h:960
msgid "Four-level key with comma"
msgstr "Четырёх-рядная клавиша с запятой"
-#: ../rules/base.xml.in.h:957
+#: ../rules/base.xml.in.h:961
msgid "Four-level key with momayyez"
msgstr "Четырёх-рядная клавиша с momayyez"
#. This assumes the KP_ abstract symbols are actually useful for some apps
#. The description needs to be rewritten
-#: ../rules/base.xml.in.h:960
+#: ../rules/base.xml.in.h:964
msgid "Four-level key with abstract separators"
msgstr "Четырёх-рядная клавиша с абстрактными разделителями"
-#: ../rules/base.xml.in.h:961
+#: ../rules/base.xml.in.h:965
msgid "Semicolon on third level"
msgstr "Точка с запятой в третьем ряду"
-#: ../rules/base.xml.in.h:962
+#: ../rules/base.xml.in.h:966
msgid "Caps Lock key behavior"
msgstr "Поведение клавиши Caps Lock"
-#: ../rules/base.xml.in.h:963
+#: ../rules/base.xml.in.h:967
msgid "Caps Lock uses internal capitalization; Shift \"pauses\" Caps Lock"
msgstr "Caps Lock включает внутреннюю капитализацию; Shift «приостанавливает» действие Caps Lock"
-#: ../rules/base.xml.in.h:964
+#: ../rules/base.xml.in.h:968
msgid "Caps Lock uses internal capitalization; Shift doesn't affect Caps Lock"
msgstr "Caps Lock включает внутреннюю капитализацию; Shift не влияет на Caps Lock"
-#: ../rules/base.xml.in.h:965
+#: ../rules/base.xml.in.h:969
msgid "Caps Lock acts as Shift with locking; Shift \"pauses\" Caps Lock"
msgstr "Caps Lock действует как Shift с блокировкой; Shift «приостанавливает» действие Caps Lock"
-#: ../rules/base.xml.in.h:966
+#: ../rules/base.xml.in.h:970
msgid "Caps Lock acts as Shift with locking; Shift doesn't affect Caps Lock"
msgstr "Caps Lock действует как Shift с блокировкой; Shift не влияет на Caps Lock"
-#: ../rules/base.xml.in.h:967
+#: ../rules/base.xml.in.h:971
msgid "Caps Lock toggles normal capitalization of alphabetic characters"
msgstr "Caps Lock переключает обычную капитализацию символов алфавита"
-#: ../rules/base.xml.in.h:968
+#: ../rules/base.xml.in.h:972
msgid "Make Caps Lock an additional Num Lock"
msgstr "Использовать Caps Lock как дополнительную клавишу Num Lock"
-#: ../rules/base.xml.in.h:969
+#: ../rules/base.xml.in.h:973
msgid "Swap ESC and Caps Lock"
msgstr "Поменять местами клавиши ESC и Caps Lock"
-#: ../rules/base.xml.in.h:970
+#: ../rules/base.xml.in.h:974
msgid "Make Caps Lock an additional ESC"
msgstr "Использовать Caps Lock как дополнительную клавишу ESC"
-#: ../rules/base.xml.in.h:971
+#: ../rules/base.xml.in.h:975
msgid "Make Caps Lock an additional Backspace"
msgstr "Использовать Caps Lock как дополнительную клавишу Backspace"
-#: ../rules/base.xml.in.h:972
+#: ../rules/base.xml.in.h:976
msgid "Make Caps Lock an additional Super"
msgstr "Использовать Caps Lock как дополнительную клавишу Super"
-#: ../rules/base.xml.in.h:973
+#: ../rules/base.xml.in.h:977
msgid "Make Caps Lock an additional Hyper"
msgstr "Использовать Caps Lock как дополнительную клавишу Hyper"
-#: ../rules/base.xml.in.h:974
+#: ../rules/base.xml.in.h:978
msgid "Caps Lock toggles ShiftLock (affects all keys)"
msgstr "Caps Lock переключает ShiftLock (действует сразу на все клавиши)"
-#: ../rules/base.xml.in.h:975
+#: ../rules/base.xml.in.h:979
msgid "Caps Lock is disabled"
msgstr "Caps Lock отключён"
-#: ../rules/base.xml.in.h:976
+#: ../rules/base.xml.in.h:980
msgid "Make Caps Lock an additional Ctrl"
msgstr "Использовать Caps Lock как дополнительную клавишу Ctrl"
-#: ../rules/base.xml.in.h:977
+#: ../rules/base.xml.in.h:981
msgid "Alt/Win key behavior"
msgstr "Поведение клавиши Alt/Win"
-#: ../rules/base.xml.in.h:978
+#: ../rules/base.xml.in.h:982
msgid "Add the standard behavior to Menu key"
msgstr "Добавить обыкновенное поведение на клавишу Menu"
-#: ../rules/base.xml.in.h:979
+#: ../rules/base.xml.in.h:983
msgid "Alt and Meta are on Alt keys"
msgstr "Alt и Meta на клавишах Alt"
-#: ../rules/base.xml.in.h:980
+#: ../rules/base.xml.in.h:984
msgid "Alt is mapped to Win keys (and the usual Alt keys)"
msgstr "Alt используется в качестве клавиш Win (и как обычный Alt)"
-#: ../rules/base.xml.in.h:981
+#: ../rules/base.xml.in.h:985
msgid "Ctrl is mapped to Win keys (and the usual Ctrl keys)"
msgstr "Ctrl используется в качестве клавиш Win (и как обычные клавиши Ctrl)"
-#: ../rules/base.xml.in.h:982
+#: ../rules/base.xml.in.h:986
msgid "Ctrl is mapped to Alt keys, Alt is mapped to Win keys"
msgstr "Ctrl используется в качестве клавиш Alt; Alt используется в качестве клавиш Win"
-#: ../rules/base.xml.in.h:983
+#: ../rules/base.xml.in.h:987
msgid "Meta is mapped to Win keys"
msgstr "Meta соответствует клавишам Win"
-#: ../rules/base.xml.in.h:984
+#: ../rules/base.xml.in.h:988
msgid "Meta is mapped to Left Win"
msgstr "Meta соответствует левой клавише Win"
-#: ../rules/base.xml.in.h:985
+#: ../rules/base.xml.in.h:989
msgid "Hyper is mapped to Win-keys"
msgstr "Hyper соответствует клавишам Win"
-#: ../rules/base.xml.in.h:986
+#: ../rules/base.xml.in.h:990
msgid "Alt is mapped to Right Win, Super to Menu"
msgstr "Alt соответствует правой клавише Win, а Super — Menu"
-#: ../rules/base.xml.in.h:987
+#: ../rules/base.xml.in.h:991
msgid "Alt is swapped with Win"
msgstr "Клавиша Alt поменяна местами с клавишей Win"
-#: ../rules/base.xml.in.h:988
+#: ../rules/base.xml.in.h:992
msgid "Position of Compose key"
msgstr "Положение клавиши Compose"
-#: ../rules/base.xml.in.h:989
+#: ../rules/base.xml.in.h:993
msgid "3rd level of Left Win"
msgstr "3-й ряд левой Win"
-#: ../rules/base.xml.in.h:990
+#: ../rules/base.xml.in.h:994
msgid "3rd level of Right Win"
msgstr "3-й ряд правой Win"
-#: ../rules/base.xml.in.h:991
+#: ../rules/base.xml.in.h:995
msgid "3rd level of Menu"
msgstr "3-й ряд Menu"
-#: ../rules/base.xml.in.h:992
+#: ../rules/base.xml.in.h:996
msgid "3rd level of Left Ctrl"
msgstr "3-й ряд левой Ctrl"
-#: ../rules/base.xml.in.h:993
+#: ../rules/base.xml.in.h:997
msgid "3rd level of Right Ctrl"
msgstr "3-й ряд правой Ctrl"
-#: ../rules/base.xml.in.h:994
+#: ../rules/base.xml.in.h:998
msgid "3rd level of Caps Lock"
msgstr "3-й ряд Caps Lock"
-#: ../rules/base.xml.in.h:995
+#: ../rules/base.xml.in.h:999
msgid "3rd level of &lt;Less/Greater&gt;"
msgstr "3-й ряд &lt;Меньше чем/Больше чем&gt;"
-#: ../rules/base.xml.in.h:996
+#: ../rules/base.xml.in.h:1000
msgid "Pause"
msgstr "Pause"
-#: ../rules/base.xml.in.h:997
+#: ../rules/base.xml.in.h:1001
msgid "PrtSc"
msgstr "PrtSc"
-#: ../rules/base.xml.in.h:998
+#: ../rules/base.xml.in.h:1002
msgid "Miscellaneous compatibility options"
msgstr "Разные параметры совместимости"
-#: ../rules/base.xml.in.h:999
+#: ../rules/base.xml.in.h:1003
msgid "Default numeric keypad keys"
msgstr "Клавиши цифровой клавиатуры по умолчанию"
-#: ../rules/base.xml.in.h:1000
+#: ../rules/base.xml.in.h:1004
msgid "Numeric keypad keys always enter digits (as in Mac OS)"
msgstr "С клавиш цифровой клавиатуры всегда вводятся цифры (как в Mac OS)"
-#: ../rules/base.xml.in.h:1001
+#: ../rules/base.xml.in.h:1005
msgid "Shift with numeric keypad keys works as in MS Windows"
msgstr "Клавиша Shift с клавишами цифровой клавиатуры работают также как в MS Windows"
-#: ../rules/base.xml.in.h:1002
+#: ../rules/base.xml.in.h:1006
msgid "Shift does not cancel Num Lock, chooses 3rd level instead"
msgstr "Shift не отменяет Num Lock, а выбирает третий ряд"
-#: ../rules/base.xml.in.h:1003
+#: ../rules/base.xml.in.h:1007
msgid "Special keys (Ctrl+Alt+&lt;key&gt;) handled in a server"
msgstr "Специальные клавиши (Ctrl+Alt+&lt;клв&gt;) обрабатываются сервером"
-#: ../rules/base.xml.in.h:1004
+#: ../rules/base.xml.in.h:1008
msgid "Apple Aluminium Keyboard: emulate PC keys (Print, Scroll Lock, Pause, Num Lock)"
msgstr "Алюминиевая клавиатура Apple: эмуляция клавиш ПК (Print, Scroll Lock, Pause, Num Lock)"
-#: ../rules/base.xml.in.h:1005
+#: ../rules/base.xml.in.h:1009
msgid "Shift cancels Caps Lock"
msgstr "Shift отменяет Caps Lock"
-#: ../rules/base.xml.in.h:1006
+#: ../rules/base.xml.in.h:1010
msgid "Enable extra typographic characters"
msgstr "Включить дополнительные типографские символы"
-#: ../rules/base.xml.in.h:1007
+#: ../rules/base.xml.in.h:1011
msgid "Both Shift keys together toggle Caps Lock"
msgstr "Обе клавиши Shift, нажатые вместе, переключают Caps Lock"
-#: ../rules/base.xml.in.h:1008
+#: ../rules/base.xml.in.h:1012
msgid "Both Shift keys together activate Caps Lock, one Shift key deactivates"
msgstr "Обе клавиши Shift, нажатые вместе, включают Caps Lock, одна клавиша Shift выключает"
-#: ../rules/base.xml.in.h:1009
+#: ../rules/base.xml.in.h:1013
msgid "Both Shift keys together toggle ShiftLock"
msgstr "Обе клавиши Shift, нажатые вместе, переключают ShiftLock"
-#: ../rules/base.xml.in.h:1010
+#: ../rules/base.xml.in.h:1014
msgid "Shift + NumLock toggles PointerKeys"
msgstr "Shift + NumLock переключают PointerKeys"
-#: ../rules/base.xml.in.h:1011
+#: ../rules/base.xml.in.h:1015
msgid "Allow breaking grabs with keyboard actions (warning: security risk)"
msgstr "Позволить прерывать захват с помощью клавиатуры (предупреждение: угроза безопасности)"
-#: ../rules/base.xml.in.h:1012
+#: ../rules/base.xml.in.h:1016
+msgid "Allow grab and window tree logging"
+msgstr "Позволить захват и протоколирование дерева окон"
+
+#: ../rules/base.xml.in.h:1017
msgid "Adding currency signs to certain keys"
msgstr "Добавление знаков валют к некоторым клавишам"
-#: ../rules/base.xml.in.h:1013
+#: ../rules/base.xml.in.h:1018
msgid "Euro on E"
msgstr "Символ евро на клавише E"
-#: ../rules/base.xml.in.h:1014
+#: ../rules/base.xml.in.h:1019
msgid "Euro on 2"
msgstr "Символ евро на клавише 2"
-#: ../rules/base.xml.in.h:1015
+#: ../rules/base.xml.in.h:1020
msgid "Euro on 4"
msgstr "Символ евро на клавише 4"
-#: ../rules/base.xml.in.h:1016
+#: ../rules/base.xml.in.h:1021
msgid "Euro on 5"
msgstr "Символ евро на клавише 5"
-#: ../rules/base.xml.in.h:1017
+#: ../rules/base.xml.in.h:1022
msgid "Rupee on 4"
msgstr "Символ рупии на клавише 4"
-#: ../rules/base.xml.in.h:1018
+#: ../rules/base.xml.in.h:1023
msgid "Key to choose 5th level"
msgstr "Клавиша для выбора 5-го ряда"
-#: ../rules/base.xml.in.h:1019
+#: ../rules/base.xml.in.h:1024
msgid "&lt;Less/Greater&gt; chooses 5th level, locks when pressed together with another 5th-level-chooser"
msgstr "По клавише &lt;Меньше чем/Больше чем&gt; выбирается 5-й ряд, блокируется при нажатии вместе с другим выборщиком-5-го-ряда"
-#: ../rules/base.xml.in.h:1020
+#: ../rules/base.xml.in.h:1025
msgid "Right Alt chooses 5th level, locks when pressed together with another 5th-level-chooser"
msgstr "По правой клавише Alt выбирается 5-й ряд, блокируется при нажатии вместе с другим выборщиком-5-го-ряда"
-#: ../rules/base.xml.in.h:1021
+#: ../rules/base.xml.in.h:1026
msgid "Left Win chooses 5th level, locks when pressed together with another 5th-level-chooser"
msgstr "По левой клавише Win выбирается 5-й ряд, блокирует, блокирует при нажатии вместе с другим выборщиком-5-го-ряда"
-#: ../rules/base.xml.in.h:1022
+#: ../rules/base.xml.in.h:1027
msgid "Right Win chooses 5th level, locks when pressed together with another 5th-level-chooser"
msgstr "По правой клавише Win выбирается 5-й ряд, блокируется при нажатии вместе с другим выборщиком-5-го-ряда"
-#: ../rules/base.xml.in.h:1023
+#: ../rules/base.xml.in.h:1028
msgid "Using space key to input non-breakable space character"
msgstr "Клавиша пробела используется для ввода символа неразрывного пробела"
-#: ../rules/base.xml.in.h:1024
+#: ../rules/base.xml.in.h:1029
msgid "Usual space at any level"
msgstr "Обычный пробел в любом ряду"
-#: ../rules/base.xml.in.h:1025
+#: ../rules/base.xml.in.h:1030
msgid "Non-breakable space character at second level"
msgstr "Символ неразрывного пробела во втором ряду"
-#: ../rules/base.xml.in.h:1026
+#: ../rules/base.xml.in.h:1031
msgid "Non-breakable space character at third level"
msgstr "Символ неразрывного пробела в третьем ряду"
-#: ../rules/base.xml.in.h:1027
+#: ../rules/base.xml.in.h:1032
msgid "Non-breakable space character at third level, nothing at fourth level"
msgstr "Символ неразрывного пробела в третьем ряду, ничего на четвёртом"
-#: ../rules/base.xml.in.h:1028
+#: ../rules/base.xml.in.h:1033
msgid "Non-breakable space character at third level, thin non-breakable space character at fourth level"
msgstr "Символ неразрывного пробела в третьем ряду, символ тонкого неразрывного пробела в четвёртом ряду"
-#: ../rules/base.xml.in.h:1029
+#: ../rules/base.xml.in.h:1034
msgid "Non-breakable space character at fourth level"
msgstr "Символ неразрывного пробела в четвёртом ряду"
-#: ../rules/base.xml.in.h:1030
+#: ../rules/base.xml.in.h:1035
msgid "Non-breakable space character at fourth level, thin non-breakable space character at sixth level"
msgstr "Символ неразрывного пробела в четвёртом ряду, символ тонкого неразрывного пробела в шестом ряду"
-#: ../rules/base.xml.in.h:1031
+#: ../rules/base.xml.in.h:1036
msgid "Non-breakable space character at fourth level, thin non-breakable space character at sixth level (via Ctrl+Shift)"
msgstr "Символ неразрывного пробела в четвёртом ряду, символ тонкого неразрывного пробела в шестом ряду (с помощью Ctrl+Shift)"
-#: ../rules/base.xml.in.h:1032
+#: ../rules/base.xml.in.h:1037
msgid "Zero-width non-joiner character at second level"
msgstr "Несвязывающий символ нулевой ширины во втором ряду"
-#: ../rules/base.xml.in.h:1033
+#: ../rules/base.xml.in.h:1038
msgid "Zero-width non-joiner character at second level, zero-width joiner character at third level"
msgstr "Несвязывающий символ нулевой ширины во втором ряду, связывающий символ нулевой ширины в третьем ряду"
-#: ../rules/base.xml.in.h:1034
+#: ../rules/base.xml.in.h:1039
msgid "Zero-width non-joiner character at second level, zero-width joiner character at third level, non-breakable space character at fourth level"
msgstr "Несвязывающий символ нулевой ширины во втором ряду, связывающий символ нулевой ширины в третьем ряду, символ неразрывного пробела в четвёртом ряду"
-#: ../rules/base.xml.in.h:1035
+#: ../rules/base.xml.in.h:1040
msgid "Zero-width non-joiner character at second level, non-breakable space character at third level"
msgstr "Несвязывающий символ нулевой ширины во втором ряду, символ неразрывного пробела в третьем ряду"
-#: ../rules/base.xml.in.h:1036
+#: ../rules/base.xml.in.h:1041
msgid "Zero-width non-joiner character at second level, non-breakable space character at third level, nothing at fourth level"
msgstr "Несвязывающий символ нулевой ширины во втором ряду, символ неразрывного пробела в третьем ряду, ничего в четвёртом"
-#: ../rules/base.xml.in.h:1037
+#: ../rules/base.xml.in.h:1042
msgid "Zero-width non-joiner character at second level, non-breakable space character at third level, zero-width joiner at fourth level"
msgstr "Несвязывающий символ нулевой ширины во втором ряду, символ неразрывного пробела в третьем ряду, связывающий символ нулевой ширины в четвёртом ряду"
-#: ../rules/base.xml.in.h:1038
+#: ../rules/base.xml.in.h:1043
msgid "Zero-width non-joiner character at second level, non-breakable space character at third level, thin non-breakable space at fourth level"
msgstr "Несвязывающий символ нулевой ширины во втором ряду, символ неразрывного пробела в третьем ряду, тонкий неразрывный пробел в четвёртом ряду"
-#: ../rules/base.xml.in.h:1039
+#: ../rules/base.xml.in.h:1044
msgid "Zero-width non-joiner character at third level, zero-width joiner at fourth level"
msgstr "Несвязывающий символ нулевой ширины в третьем ряду, связывающий символ нулевой ширины в четвёртом ряду"
-#: ../rules/base.xml.in.h:1040
+#: ../rules/base.xml.in.h:1045
msgid "Japanese keyboard options"
msgstr "Настройки японской клавиатуры"
-#: ../rules/base.xml.in.h:1041
+#: ../rules/base.xml.in.h:1046
msgid "Kana Lock key is locking"
msgstr "Кана блокируется клавишей Lock"
-#: ../rules/base.xml.in.h:1042
+#: ../rules/base.xml.in.h:1047
msgid "NICOLA-F style Backspace"
msgstr "Backspace в стиле NICOLA-F"
-#: ../rules/base.xml.in.h:1043
+#: ../rules/base.xml.in.h:1048
msgid "Make Zenkaku Hankaku an additional ESC"
msgstr "Использовать Zenkaku Hankaku как дополнительную клавишу ESC"
-#: ../rules/base.xml.in.h:1044
+#: ../rules/base.xml.in.h:1049
msgid "Adding Esperanto supersigned letters"
msgstr "Добавление букв эсперанто с надстрочными знаками"
-#: ../rules/base.xml.in.h:1045
+#: ../rules/base.xml.in.h:1050
msgid "To the corresponding key in a Qwerty layout"
msgstr "На соответствующую клавишу в раскладке Qwerty"
-#: ../rules/base.xml.in.h:1046
+#: ../rules/base.xml.in.h:1051
msgid "To the corresponding key in a Dvorak layout"
-msgstr "На соответствующую клавишу в раскладке Дворак"
+msgstr "На соответствующую клавишу в раскладке дворак"
-#: ../rules/base.xml.in.h:1047
+#: ../rules/base.xml.in.h:1052
msgid "To the corresponding key in a Colemak layout"
msgstr "На соответствующую клавишу в раскладке Коулмак"
-#: ../rules/base.xml.in.h:1048
+#: ../rules/base.xml.in.h:1053
msgid "Maintain key compatibility with old Solaris keycodes"
msgstr "Сохранить совместимость со старыми кодами клавиш Solaris"
-#: ../rules/base.xml.in.h:1049
+#: ../rules/base.xml.in.h:1054
msgid "Sun Key compatibility"
msgstr "Совместимость с клавишами Sun"
-#: ../rules/base.xml.in.h:1050
+#: ../rules/base.xml.in.h:1055
msgid "Key sequence to kill the X server"
msgstr "Комбинация клавиш для прерывания работы X-сервера"
-#: ../rules/base.xml.in.h:1051
+#: ../rules/base.xml.in.h:1056
msgid "Ctrl + Alt + Backspace"
msgstr "Ctrl + Alt + Backspace"
@@ -3965,7 +3985,7 @@ msgstr "Авестийская"
#: ../rules/base.extras.xml.in.h:20
msgid "Lithuanian (US Dvorak with Lithuanian letters)"
-msgstr "Литовская (Дворак США с литовскими буквами)"
+msgstr "Литовская (дворак США с литовскими буквами)"
#: ../rules/base.extras.xml.in.h:21
msgid "Lithuanian (Sun Type 6/7)"
@@ -3973,27 +3993,27 @@ msgstr "Литовская (Sun Type 6/7)"
#: ../rules/base.extras.xml.in.h:24
msgid "Latvian (US Dvorak)"
-msgstr "Латышская (Дворак США)"
+msgstr "Латышская (дворак США)"
#: ../rules/base.extras.xml.in.h:25
msgid "Latvian (US Dvorak, Y variant)"
-msgstr "Латышская (Дворак США, вариант с Y)"
+msgstr "Латышская (дворак США, вариант с Y)"
#: ../rules/base.extras.xml.in.h:26
msgid "Latvian (US Dvorak, minus variant)"
-msgstr "Латышская (Дворак США, вариант с минусом)"
+msgstr "Латышская (дворак США, вариант с минусом)"
#: ../rules/base.extras.xml.in.h:27
msgid "Latvian (programmer US Dvorak)"
-msgstr "Латышская (Дворак США для программистов)"
+msgstr "Латышская (дворак США для программистов)"
#: ../rules/base.extras.xml.in.h:28
msgid "Latvian (programmer US Dvorak, Y variant)"
-msgstr "Латышская (Дворак США для программистов, вариант с Y)"
+msgstr "Латышская (дворак США для программистов, вариант с Y)"
#: ../rules/base.extras.xml.in.h:29
msgid "Latvian (programmer US Dvorak, minus variant)"
-msgstr "Латышская (Дворак США для программистов, вариант с минусом)"
+msgstr "Латышская (дворак США для программистов, вариант с минусом)"
#: ../rules/base.extras.xml.in.h:30
msgid "Latvian (US Colemak)"
@@ -4027,150 +4047,160 @@ msgstr "Салишская Кёр-д’Ален"
msgid "English (US, Sun Type 6/7)"
msgstr "Английская (США, Sun Type 6/7)"
-#: ../rules/base.extras.xml.in.h:42
+#: ../rules/base.extras.xml.in.h:40
+msgid "English (Norman)"
+msgstr "Английская (нормандская)"
+
+#: ../rules/base.extras.xml.in.h:43
msgid "Polish (international with dead keys)"
msgstr "Польская (международная со спец. клавишами)"
-#: ../rules/base.extras.xml.in.h:43
+#: ../rules/base.extras.xml.in.h:44
msgid "Polish (Colemak)"
msgstr "Польская (Коулмак)"
-#: ../rules/base.extras.xml.in.h:44
+#: ../rules/base.extras.xml.in.h:45
msgid "Polish (Sun Type 6/7)"
msgstr "Польская (Sun Type 6/7)"
-#: ../rules/base.extras.xml.in.h:48
+#: ../rules/base.extras.xml.in.h:49
msgid "Crimean Tatar (Dobruja Q)"
msgstr "Крымско-татарская (Dobruja Q)"
-#: ../rules/base.extras.xml.in.h:49
+#: ../rules/base.extras.xml.in.h:50
msgid "Romanian (ergonomic Touchtype)"
msgstr "Румынская (эргономичная для слепой печати)"
-#: ../rules/base.extras.xml.in.h:50
+#: ../rules/base.extras.xml.in.h:51
msgid "Romanian (Sun Type 6/7)"
msgstr "Румынская (Sun Type 6/7)"
-#: ../rules/base.extras.xml.in.h:53
+#: ../rules/base.extras.xml.in.h:54
msgid "Serbian (combining accents instead of dead keys)"
msgstr "Сербская (объединённые надбуквенные знаки вместе спец. клавиш (dead keys))"
-#: ../rules/base.extras.xml.in.h:56
+#: ../rules/base.extras.xml.in.h:57
msgid "Russian (with Ukrainian-Belorussian layout)"
msgstr "Русская (с украинско-белорусской раскладкой)"
-#: ../rules/base.extras.xml.in.h:57
+#: ../rules/base.extras.xml.in.h:58
msgid "Russian (Sun Type 6/7)"
msgstr "Русская (Sun Type 6/7)"
-#: ../rules/base.extras.xml.in.h:60
+#: ../rules/base.extras.xml.in.h:61
msgid "Armenian (OLPC phonetic)"
msgstr "Армянская (фонетическая на OLPC)"
-#: ../rules/base.extras.xml.in.h:63
+#: ../rules/base.extras.xml.in.h:64
msgid "Hebrew (Biblical, SIL phonetic)"
msgstr "Иврит (Библейская, фонетическая SIL)"
-#: ../rules/base.extras.xml.in.h:66
+#: ../rules/base.extras.xml.in.h:67
msgid "Arabic (Sun Type 6/7)"
msgstr "Арабская (Sun Type 6/7)"
-#: ../rules/base.extras.xml.in.h:69
+#: ../rules/base.extras.xml.in.h:70
msgid "Belgian (Sun Type 6/7)"
msgstr "Бельгийская (Sun Type 6/7)"
-#: ../rules/base.extras.xml.in.h:72
+#: ../rules/base.extras.xml.in.h:73
msgid "Portuguese (Brazil, Sun Type 6/7)"
msgstr "Португальская (Бразилия, Sun Type 6/7)"
-#: ../rules/base.extras.xml.in.h:75
+#: ../rules/base.extras.xml.in.h:76
msgid "Czech (Sun Type 6/7)"
msgstr "Чешская (Sun Type 6/7)"
-#: ../rules/base.extras.xml.in.h:78
+#: ../rules/base.extras.xml.in.h:79
msgid "Danish (Sun Type 6/7)"
msgstr "Датская (Sun Type 6/7)"
-#: ../rules/base.extras.xml.in.h:81
+#: ../rules/base.extras.xml.in.h:82
msgid "Dutch (Sun Type 6/7)"
msgstr "Голландская (Sun Type 6/7)"
-#: ../rules/base.extras.xml.in.h:84
+#: ../rules/base.extras.xml.in.h:85
msgid "Estonian (Sun Type 6/7)"
msgstr "Эстонская (Sun Type 6/7)"
-#: ../rules/base.extras.xml.in.h:87
+#: ../rules/base.extras.xml.in.h:88
msgid "Finnish (Sun Type 6/7)"
msgstr "Финская (Sun Type 6/7)"
-#: ../rules/base.extras.xml.in.h:89
+#: ../rules/base.extras.xml.in.h:90
msgid "French (Sun Type 6/7)"
msgstr "Французская (Sun Type 6/7)"
-#: ../rules/base.extras.xml.in.h:92
+#: ../rules/base.extras.xml.in.h:93
msgid "Greek (Sun Type 6/7)"
msgstr "Греческая (Sun Type 6/7)"
-#: ../rules/base.extras.xml.in.h:95
+#: ../rules/base.extras.xml.in.h:96
msgid "Italian (Sun Type 6/7)"
msgstr "Итальянская (Sun Type 6/7)"
-#: ../rules/base.extras.xml.in.h:98
+#: ../rules/base.extras.xml.in.h:99
msgid "Japanese (Sun Type 6)"
msgstr "Японская (Sun Type 6)"
-#: ../rules/base.extras.xml.in.h:99
+#: ../rules/base.extras.xml.in.h:100
msgid "Japanese (Sun Type 7 - pc compatible)"
msgstr "Японская (Sun Type 7, совместимая с pc)"
-#: ../rules/base.extras.xml.in.h:100
+#: ../rules/base.extras.xml.in.h:101
msgid "Japanese (Sun Type 7 - sun compatible)"
msgstr "Японская (Sun Type 7, совместимая с sun)"
-#: ../rules/base.extras.xml.in.h:103
+#: ../rules/base.extras.xml.in.h:104
msgid "Norwegian (Sun Type 6/7)"
msgstr "Норвежская (Sun Type 6/7)"
-#: ../rules/base.extras.xml.in.h:105
+#: ../rules/base.extras.xml.in.h:106
msgid "Portuguese (Sun Type 6/7)"
msgstr "Португальская (Sun Type 6/7)"
-#: ../rules/base.extras.xml.in.h:108
+#: ../rules/base.extras.xml.in.h:109
msgid "Slovak (Sun Type 6/7)"
msgstr "Словацкая (Sun Type 6/7)"
-#: ../rules/base.extras.xml.in.h:111
+#: ../rules/base.extras.xml.in.h:112
msgid "Spanish (Sun Type 6/7)"
msgstr "Испанская (Sun Type 6/7)"
-#: ../rules/base.extras.xml.in.h:114
+#: ../rules/base.extras.xml.in.h:115
msgid "Swedish (Sun Type 6/7)"
msgstr "Шведская (Sun Type 6/7)"
-#: ../rules/base.extras.xml.in.h:116
+#: ../rules/base.extras.xml.in.h:117
msgid "German (Switzerland, Sun Type 6/7)"
msgstr "Немецкая (Швейцария, Sun Type 6/7)"
-#: ../rules/base.extras.xml.in.h:117
+#: ../rules/base.extras.xml.in.h:118
msgid "French (Switzerland, Sun Type 6/7)"
msgstr "Французская (Швейцария, Sun Type 6/7)"
-#: ../rules/base.extras.xml.in.h:120
+#: ../rules/base.extras.xml.in.h:121
msgid "Turkish (Sun Type 6/7)"
msgstr "Турецкая (Sun Type 6/7)"
-#: ../rules/base.extras.xml.in.h:123
+#: ../rules/base.extras.xml.in.h:124
msgid "Ukrainian (Sun Type 6/7)"
msgstr "Украинская (Sun Type 6/7)"
-#: ../rules/base.extras.xml.in.h:125
+#: ../rules/base.extras.xml.in.h:126
msgid "English (UK, Sun Type 6/7)"
msgstr "Английская (Великобритания, Sun Type 6/7)"
-#: ../rules/base.extras.xml.in.h:128
+#: ../rules/base.extras.xml.in.h:129
msgid "Korean (Sun Type 6/7)"
msgstr "Корейская (Sun Type 6/7)"
+#~ msgid "Bengali"
+#~ msgstr "Бенгальская"
+
+#~ msgid "Portuguese (Brazil, nativo for Esperanto)"
+#~ msgstr "Португальская (Бразилия, nativo для эсперанто)"
+
#~ msgid "English (layout toggle on multiply/divide key)"
#~ msgstr "Английская (переключение раскладки по клавише умножения/деления)"
@@ -4441,9 +4471,6 @@ msgstr "Корейская (Sun Type 6/7)"
#~ msgid "Aze"
#~ msgstr "Aze"
-#~ msgid "Bangladesh"
-#~ msgstr "Бангладеш"
-
#~ msgid "Bel"
#~ msgstr "Bel"
diff --git a/xorg-server/xkeyboard-config/po/uk.po b/xorg-server/xkeyboard-config/po/uk.po
index d01490d71..7326eb1f4 100644
--- a/xorg-server/xkeyboard-config/po/uk.po
+++ b/xorg-server/xkeyboard-config/po/uk.po
@@ -7,13 +7,13 @@
# Andriy Rysin <arysin@bcsii.com>, 2007, 2008.
# Andriy Rysin <arysin@gmail.com>, 2008.
# Maxim V. Dziumanenko <dziumanenko@gmail.com>, 2004-2011.
-# Yuri Chornoivan <yurchor@ukr.net>, 2011, 2012, 2013.
+# Yuri Chornoivan <yurchor@ukr.net>, 2011, 2012, 2013, 2014.
msgid ""
msgstr ""
-"Project-Id-Version: xkeyboard-config-2.9.91\n"
+"Project-Id-Version: xkeyboard-config-2.10.99\n"
"Report-Msgid-Bugs-To: svu@users.sourceforge.net\n"
-"POT-Creation-Date: 2013-09-14 14:41+0200\n"
-"PO-Revision-Date: 2013-09-14 16:08+0300\n"
+"POT-Creation-Date: 2014-01-15 01:12+0000\n"
+"PO-Revision-Date: 2014-01-15 16:54+0200\n"
"Last-Translator: Yuri Chornoivan <yurchor@ukr.net>\n"
"Language-Team: Ukrainian <translation-team-uk@lists.sourceforge.net>\n"
"Language: uk\n"
@@ -822,7 +822,7 @@ msgid "English (programmer Dvorak)"
msgstr "Англійська (програмістський Дворак)"
#. Keyboard indicator for Russian layouts
-#: ../rules/base.xml.in.h:203 ../rules/base.extras.xml.in.h:54
+#: ../rules/base.xml.in.h:203 ../rules/base.extras.xml.in.h:55
msgid "ru"
msgstr "ru"
@@ -894,11 +894,11 @@ msgid "Uzbek (Afghanistan, OLPC)"
msgstr "Узбецька (Афганістан, OLPC)"
#. Keyboard indicator for Arabic layouts
-#: ../rules/base.xml.in.h:224 ../rules/base.extras.xml.in.h:64
+#: ../rules/base.xml.in.h:224 ../rules/base.extras.xml.in.h:65
msgid "ar"
msgstr "ar"
-#: ../rules/base.xml.in.h:225 ../rules/base.extras.xml.in.h:65
+#: ../rules/base.xml.in.h:225 ../rules/base.extras.xml.in.h:66
msgid "Arabic"
msgstr "Арабська"
@@ -936,11 +936,11 @@ msgid "Albanian"
msgstr "Албанська"
#. Keyboard indicator for Armenian layouts
-#: ../rules/base.xml.in.h:236 ../rules/base.extras.xml.in.h:58
+#: ../rules/base.xml.in.h:236 ../rules/base.extras.xml.in.h:59
msgid "hy"
msgstr "hy"
-#: ../rules/base.xml.in.h:237 ../rules/base.extras.xml.in.h:59
+#: ../rules/base.xml.in.h:237 ../rules/base.extras.xml.in.h:60
msgid "Armenian"
msgstr "Вірменська"
@@ -1016,11 +1016,11 @@ msgid "Belarusian (Latin)"
msgstr "Білоруська (латиниця)"
#. Keyboard indicator for Belgian layouts
-#: ../rules/base.xml.in.h:259 ../rules/base.extras.xml.in.h:67
+#: ../rules/base.xml.in.h:259 ../rules/base.extras.xml.in.h:68
msgid "be"
msgstr "be"
-#: ../rules/base.xml.in.h:260 ../rules/base.extras.xml.in.h:68
+#: ../rules/base.xml.in.h:260 ../rules/base.extras.xml.in.h:69
msgid "Belgian"
msgstr "Бельгійська"
@@ -1052,17 +1052,17 @@ msgstr "Бельгійська (сліпі клавіші Sun)"
msgid "Belgian (Wang model 724 azerty)"
msgstr "Бельгійська (модель Wang 724, azerty)"
-#. Keyboard indicator for Bengali layouts
+#. Keyboard indicator for Bangla layouts
#: ../rules/base.xml.in.h:269
msgid "bn"
msgstr "bn"
#: ../rules/base.xml.in.h:270
-msgid "Bengali"
+msgid "Bangla"
msgstr "Бенгальська"
#: ../rules/base.xml.in.h:271
-msgid "Bengali (Probhat)"
+msgid "Bangla (Probhat)"
msgstr "Бенгальська (пробхат)"
#. Keyboard indicator for Indian layouts
@@ -1075,27 +1075,27 @@ msgid "Indian"
msgstr "Індійська"
#: ../rules/base.xml.in.h:275
-msgid "Bengali (India)"
+msgid "Bangla (India)"
msgstr "Бенгальська (Індія)"
#: ../rules/base.xml.in.h:276
-msgid "Bengali (India, Probhat)"
+msgid "Bangla (India, Probhat)"
msgstr "Бенгальська (Індія, пробхат)"
#: ../rules/base.xml.in.h:277
-msgid "Bengali (India, Baishakhi)"
+msgid "Bangla (India, Baishakhi)"
msgstr "Бенгальська (Індія, байшахі)"
#: ../rules/base.xml.in.h:278
-msgid "Bengali (India, Bornona)"
+msgid "Bangla (India, Bornona)"
msgstr "Бенгальська (Індія, борнона)"
#: ../rules/base.xml.in.h:279
-msgid "Bengali (India, Uni Gitanjali)"
+msgid "Bangla (India, Uni Gitanjali)"
msgstr "Бенгальська (Індія, уні гітанджалі)"
#: ../rules/base.xml.in.h:280
-msgid "Bengali (India, Baishakhi Inscript)"
+msgid "Bangla (India, Baishakhi Inscript)"
msgstr "Бенгальська (Індія, байшахі, індійські символи)"
#. Keyboard indicator for Gujarati layouts
@@ -1279,11 +1279,11 @@ msgid "Bosnian (US keyboard with Bosnian letters)"
msgstr "Боснійська (клавіатура США з боснійськими літерами)"
#. Keyboard indicator for Portuguese layouts
-#: ../rules/base.xml.in.h:336 ../rules/base.extras.xml.in.h:70
+#: ../rules/base.xml.in.h:336 ../rules/base.extras.xml.in.h:71
msgid "pt"
msgstr "pt"
-#: ../rules/base.xml.in.h:337 ../rules/base.extras.xml.in.h:71
+#: ../rules/base.xml.in.h:337 ../rules/base.extras.xml.in.h:72
msgid "Portuguese (Brazil)"
msgstr "Португальська (Бразилія)"
@@ -1296,16 +1296,16 @@ msgid "Portuguese (Brazil, Dvorak)"
msgstr "Португальська (Бразилія, Дворак)"
#: ../rules/base.xml.in.h:340
-msgid "Portuguese (Brazil, nativo)"
-msgstr "Португальська (Бразилія, nativo)"
+msgid "Portuguese (Brazil, Nativo)"
+msgstr "Португальська (Бразилія, Nativo)"
#: ../rules/base.xml.in.h:341
-msgid "Portuguese (Brazil, nativo for US keyboards)"
-msgstr "Португальська (Бразилія, nativo для клавіатур США)"
+msgid "Portuguese (Brazil, Nativo for US keyboards)"
+msgstr "Португальська (Бразилія, Nativo для американських клавіатур)"
#: ../rules/base.xml.in.h:342
-msgid "Portuguese (Brazil, nativo for Esperanto)"
-msgstr "Португальська (Бразилія, nativo для есперанто)"
+msgid "Esperanto (Brazil, Nativo)"
+msgstr "Есперанто (бразильська, Nativo)"
#. Keyboard indicator for Bulgarian layouts
#: ../rules/base.xml.in.h:344
@@ -1459,2462 +1459,2482 @@ msgid "Tibetan (with ASCII numerals)"
msgstr "Тибетська (з ASCII числами)"
#: ../rules/base.xml.in.h:386
+msgid "ug"
+msgstr "ug"
+
+#: ../rules/base.xml.in.h:387
msgid "Uyghur"
msgstr "Уйгурська"
#. Keyboard indicator for Croatian layouts
-#: ../rules/base.xml.in.h:388
+#: ../rules/base.xml.in.h:389
msgid "hr"
msgstr "hr"
-#: ../rules/base.xml.in.h:389
+#: ../rules/base.xml.in.h:390
msgid "Croatian"
msgstr "Хорватська"
-#: ../rules/base.xml.in.h:390
+#: ../rules/base.xml.in.h:391
msgid "Croatian (use guillemets for quotes)"
msgstr "Хорватська (кутові лапки)"
-#: ../rules/base.xml.in.h:391
+#: ../rules/base.xml.in.h:392
msgid "Croatian (use Croatian digraphs)"
msgstr "Хорватська (з хорватськими диграфами)"
-#: ../rules/base.xml.in.h:392
+#: ../rules/base.xml.in.h:393
msgid "Croatian (US keyboard with Croatian digraphs)"
msgstr "Хорватська (клавіатура США з хорватськими диграфами)"
-#: ../rules/base.xml.in.h:393
+#: ../rules/base.xml.in.h:394
msgid "Croatian (US keyboard with Croatian letters)"
msgstr "Хорватська (клавіатура США з хорватськими літерами)"
#. Keyboard indicator for Chech layouts
-#: ../rules/base.xml.in.h:395 ../rules/base.extras.xml.in.h:73
+#: ../rules/base.xml.in.h:396 ../rules/base.extras.xml.in.h:74
msgid "cs"
msgstr "cs"
-#: ../rules/base.xml.in.h:396 ../rules/base.extras.xml.in.h:74
+#: ../rules/base.xml.in.h:397 ../rules/base.extras.xml.in.h:75
msgid "Czech"
msgstr "Чеська"
-#: ../rules/base.xml.in.h:397
+#: ../rules/base.xml.in.h:398
msgid "Czech (with &lt;\\|&gt; key)"
msgstr "Чеська (з клавішею &lt;\\|&gt;)"
-#: ../rules/base.xml.in.h:398
+#: ../rules/base.xml.in.h:399
msgid "Czech (qwerty)"
msgstr "Чеська (qwerty)"
-#: ../rules/base.xml.in.h:399
+#: ../rules/base.xml.in.h:400
msgid "Czech (qwerty, extended Backslash)"
msgstr "Чеська (qwerty, розширені функції Backslash)"
-#: ../rules/base.xml.in.h:400
+#: ../rules/base.xml.in.h:401
msgid "Czech (UCW layout, accented letters only)"
msgstr "Чеська (UCW-розкладка, лише літери з акцентами)"
-#: ../rules/base.xml.in.h:401
+#: ../rules/base.xml.in.h:402
msgid "Czech (US Dvorak with CZ UCW support)"
msgstr "Чеська (Дворак-США з підтримкою CZ UCW)"
#. Keyboard indicator for Danish layouts
-#: ../rules/base.xml.in.h:403 ../rules/base.extras.xml.in.h:76
+#: ../rules/base.xml.in.h:404 ../rules/base.extras.xml.in.h:77
msgid "da"
msgstr "da"
-#: ../rules/base.xml.in.h:404 ../rules/base.extras.xml.in.h:77
+#: ../rules/base.xml.in.h:405 ../rules/base.extras.xml.in.h:78
msgid "Danish"
msgstr "Данська"
-#: ../rules/base.xml.in.h:405
+#: ../rules/base.xml.in.h:406
msgid "Danish (eliminate dead keys)"
msgstr "Данська (вимкнути сліпі клавіші)"
-#: ../rules/base.xml.in.h:406
+#: ../rules/base.xml.in.h:407
msgid "Danish (Macintosh)"
msgstr "Данська (Macintosh)"
-#: ../rules/base.xml.in.h:407
+#: ../rules/base.xml.in.h:408
msgid "Danish (Macintosh, eliminate dead keys)"
msgstr "Данська (Macintosh, вимкнути сліпі клавіші)"
-#: ../rules/base.xml.in.h:408
+#: ../rules/base.xml.in.h:409
msgid "Danish (Dvorak)"
msgstr "Данська (Дворака)"
#. Keyboard indicator for Dutch layouts
-#: ../rules/base.xml.in.h:410 ../rules/base.extras.xml.in.h:79
+#: ../rules/base.xml.in.h:411 ../rules/base.extras.xml.in.h:80
msgid "nl"
msgstr "nl"
-#: ../rules/base.xml.in.h:411 ../rules/base.extras.xml.in.h:80
+#: ../rules/base.xml.in.h:412 ../rules/base.extras.xml.in.h:81
msgid "Dutch"
msgstr "Голландська"
-#: ../rules/base.xml.in.h:412
+#: ../rules/base.xml.in.h:413
msgid "Dutch (Sun dead keys)"
msgstr "Голландська (сліпі клавіші Sun)"
-#: ../rules/base.xml.in.h:413
+#: ../rules/base.xml.in.h:414
msgid "Dutch (Macintosh)"
msgstr "Голландська (Macintosh)"
-#: ../rules/base.xml.in.h:414
+#: ../rules/base.xml.in.h:415
msgid "Dutch (standard)"
msgstr "Голландська (стандартна)"
#. Keyboard indicator for Dzongkha layouts
-#: ../rules/base.xml.in.h:416
+#: ../rules/base.xml.in.h:417
msgid "dz"
msgstr "dz"
-#: ../rules/base.xml.in.h:417
+#: ../rules/base.xml.in.h:418
msgid "Dzongkha"
msgstr "Дзонг-ке"
#. Keyboard indicator for Estonian layouts
-#: ../rules/base.xml.in.h:419 ../rules/base.extras.xml.in.h:82
+#: ../rules/base.xml.in.h:420 ../rules/base.extras.xml.in.h:83
msgid "et"
msgstr "et"
-#: ../rules/base.xml.in.h:420 ../rules/base.extras.xml.in.h:83
+#: ../rules/base.xml.in.h:421 ../rules/base.extras.xml.in.h:84
msgid "Estonian"
msgstr "Естонська"
-#: ../rules/base.xml.in.h:421
+#: ../rules/base.xml.in.h:422
msgid "Estonian (eliminate dead keys)"
msgstr "Естонська (вимкнути сліпі клавіші)"
-#: ../rules/base.xml.in.h:422
+#: ../rules/base.xml.in.h:423
msgid "Estonian (Dvorak)"
msgstr "Естонська (Дворака)"
-#: ../rules/base.xml.in.h:423
+#: ../rules/base.xml.in.h:424
msgid "Estonian (US keyboard with Estonian letters)"
msgstr "Естонська (клавіатура США з естонськими літерами)"
-#: ../rules/base.xml.in.h:424 ../rules/base.extras.xml.in.h:16
+#: ../rules/base.xml.in.h:425 ../rules/base.extras.xml.in.h:16
msgid "Persian"
msgstr "Перська"
-#: ../rules/base.xml.in.h:425
+#: ../rules/base.xml.in.h:426
msgid "Persian (with Persian Keypad)"
msgstr "Перська (з перською дод. панеллю)"
#. Keyboard indicator for Kurdish layouts
-#: ../rules/base.xml.in.h:427
+#: ../rules/base.xml.in.h:428
msgid "ku"
msgstr "ku"
-#: ../rules/base.xml.in.h:428
+#: ../rules/base.xml.in.h:429
msgid "Kurdish (Iran, Latin Q)"
msgstr "Курдська (Іран, латиниця Q)"
-#: ../rules/base.xml.in.h:429
+#: ../rules/base.xml.in.h:430
msgid "Kurdish (Iran, F)"
msgstr "Курдська (Іран, F)"
-#: ../rules/base.xml.in.h:430
+#: ../rules/base.xml.in.h:431
msgid "Kurdish (Iran, Latin Alt-Q)"
msgstr "Курдська (Іран, латиниця Alt-Q)"
-#: ../rules/base.xml.in.h:431
+#: ../rules/base.xml.in.h:432
msgid "Kurdish (Iran, Arabic-Latin)"
msgstr "Курдська (Іран, арабсько-латинська)"
-#: ../rules/base.xml.in.h:432
+#: ../rules/base.xml.in.h:433
msgid "Iraqi"
msgstr "Іракська"
-#: ../rules/base.xml.in.h:433
+#: ../rules/base.xml.in.h:434
msgid "Kurdish (Iraq, Latin Q)"
msgstr "Курдська (Ірак, латиниця Q)"
-#: ../rules/base.xml.in.h:434
+#: ../rules/base.xml.in.h:435
msgid "Kurdish (Iraq, F)"
msgstr "Курдська (Ірак, F)"
-#: ../rules/base.xml.in.h:435
+#: ../rules/base.xml.in.h:436
msgid "Kurdish (Iraq, Latin Alt-Q)"
msgstr "Курдська (Ірак, латиниця Alt-Q)"
-#: ../rules/base.xml.in.h:436
+#: ../rules/base.xml.in.h:437
msgid "Kurdish (Iraq, Arabic-Latin)"
msgstr "Курдська (Ірак, арабсько-латинська)"
#. Keyboard indicator for Faroese layouts
-#: ../rules/base.xml.in.h:438
+#: ../rules/base.xml.in.h:439
msgid "fo"
msgstr "fo"
-#: ../rules/base.xml.in.h:439
+#: ../rules/base.xml.in.h:440
msgid "Faroese"
msgstr "Фарерська"
-#: ../rules/base.xml.in.h:440
+#: ../rules/base.xml.in.h:441
msgid "Faroese (eliminate dead keys)"
msgstr "Фарерська (вимкнути сліпі клавіші)"
#. Keyboard indicator for Finnish layouts
-#: ../rules/base.xml.in.h:442 ../rules/base.extras.xml.in.h:85
+#: ../rules/base.xml.in.h:443 ../rules/base.extras.xml.in.h:86
msgid "fi"
msgstr "fi"
-#: ../rules/base.xml.in.h:443 ../rules/base.extras.xml.in.h:86
+#: ../rules/base.xml.in.h:444 ../rules/base.extras.xml.in.h:87
msgid "Finnish"
msgstr "Фінська"
-#: ../rules/base.xml.in.h:444
+#: ../rules/base.xml.in.h:445
msgid "Finnish (classic)"
msgstr "Фінська (класична)"
-#: ../rules/base.xml.in.h:445
+#: ../rules/base.xml.in.h:446
msgid "Finnish (classic, eliminate dead keys)"
msgstr "Фінська (класична, вимкнути сліпі клавіші)"
-#: ../rules/base.xml.in.h:446
+#: ../rules/base.xml.in.h:447
msgid "Northern Saami (Finland)"
msgstr "Північно-саамська (Фінляндія)"
-#: ../rules/base.xml.in.h:447
+#: ../rules/base.xml.in.h:448
msgid "Finnish (Macintosh)"
msgstr "Фінська (Macintosh)"
-#: ../rules/base.xml.in.h:448 ../rules/base.extras.xml.in.h:88
+#: ../rules/base.xml.in.h:449 ../rules/base.extras.xml.in.h:89
msgid "French"
msgstr "Французька"
-#: ../rules/base.xml.in.h:449
+#: ../rules/base.xml.in.h:450
msgid "French (eliminate dead keys)"
msgstr "Французька (вимкнути сліпі клавіші)"
-#: ../rules/base.xml.in.h:450
+#: ../rules/base.xml.in.h:451
msgid "French (Sun dead keys)"
msgstr "Французька (сліпі клавіші Sun)"
-#: ../rules/base.xml.in.h:451
+#: ../rules/base.xml.in.h:452
msgid "French (alternative)"
msgstr "Французька (альтернативна)"
-#: ../rules/base.xml.in.h:452
+#: ../rules/base.xml.in.h:453
msgid "French (alternative, Latin-9 only)"
msgstr "Французька (альтернативна, лише Latin-9)"
-#: ../rules/base.xml.in.h:453
+#: ../rules/base.xml.in.h:454
msgid "French (alternative, eliminate dead keys)"
msgstr "Французька (альтернативна, вимкнути сліпі клавіші)"
-#: ../rules/base.xml.in.h:454
+#: ../rules/base.xml.in.h:455
msgid "French (alternative, Sun dead keys)"
msgstr "Французька (альтернативна, сліпі клавіші Sun)"
-#: ../rules/base.xml.in.h:455
+#: ../rules/base.xml.in.h:456
msgid "French (legacy, alternative)"
msgstr "Французька (застаріла, альтернативна)"
-#: ../rules/base.xml.in.h:456
+#: ../rules/base.xml.in.h:457
msgid "French (legacy, alternative, eliminate dead keys)"
msgstr "Французька (застаріла, альтернативна, вимкнути сліпі клавіші)"
-#: ../rules/base.xml.in.h:457
+#: ../rules/base.xml.in.h:458
msgid "French (legacy, alternative, Sun dead keys)"
msgstr "Французька (застаріла, альтернативна, сліпі клавіші Sun)"
-#: ../rules/base.xml.in.h:458
+#: ../rules/base.xml.in.h:459
msgid "French (Bepo, ergonomic, Dvorak way)"
msgstr "Французька (Bepo, ергономічна, варіант Дворак)"
-#: ../rules/base.xml.in.h:459
+#: ../rules/base.xml.in.h:460
msgid "French (Bepo, ergonomic, Dvorak way, Latin-9 only)"
msgstr "Французька (Bepo, ергономічна, варіант Дворак, лише Latin-9)"
-#: ../rules/base.xml.in.h:460
+#: ../rules/base.xml.in.h:461
msgid "French (Dvorak)"
msgstr "Французька (Дворак)"
-#: ../rules/base.xml.in.h:461
+#: ../rules/base.xml.in.h:462
msgid "French (Macintosh)"
msgstr "Французька (Macintosh)"
-#: ../rules/base.xml.in.h:462
+#: ../rules/base.xml.in.h:463
msgid "French (Breton)"
msgstr "Французька (бретонська)"
-#: ../rules/base.xml.in.h:463
+#: ../rules/base.xml.in.h:464
msgid "Occitan"
msgstr "Окситанська"
-#: ../rules/base.xml.in.h:464
+#: ../rules/base.xml.in.h:465
msgid "Georgian (France, AZERTY Tskapo)"
msgstr "Грузинська (Франція, AZERTY Tskapo)"
-#: ../rules/base.xml.in.h:465
+#: ../rules/base.xml.in.h:466
msgid "English (Ghana)"
msgstr "Англійська (Гана)"
-#: ../rules/base.xml.in.h:466
+#: ../rules/base.xml.in.h:467
msgid "English (Ghana, multilingual)"
msgstr "Англійська (Гана, інтернаціональна)"
#. Keyboard indicator for Akan layouts
-#: ../rules/base.xml.in.h:468
+#: ../rules/base.xml.in.h:469
msgid "ak"
msgstr "ak"
-#: ../rules/base.xml.in.h:469
+#: ../rules/base.xml.in.h:470
msgid "Akan"
msgstr "Акан"
#. Keyboard indicator for Ewe layouts
-#: ../rules/base.xml.in.h:471
+#: ../rules/base.xml.in.h:472
msgid "ee"
msgstr "ee"
-#: ../rules/base.xml.in.h:472
+#: ../rules/base.xml.in.h:473
msgid "Ewe"
msgstr "Ewe"
#. Keyboard indicator for Fula layouts
-#: ../rules/base.xml.in.h:474
+#: ../rules/base.xml.in.h:475
msgid "ff"
msgstr "ff"
-#: ../rules/base.xml.in.h:475
+#: ../rules/base.xml.in.h:476
msgid "Fula"
msgstr "Фула"
#. Keyboard indicator for Ga layouts
-#: ../rules/base.xml.in.h:477
+#: ../rules/base.xml.in.h:478
msgid "gaa"
msgstr "gaa"
-#: ../rules/base.xml.in.h:478
+#: ../rules/base.xml.in.h:479
msgid "Ga"
msgstr "Га"
#. Keyboard indicator for Hausa layouts
-#: ../rules/base.xml.in.h:480
+#: ../rules/base.xml.in.h:481
msgid "ha"
msgstr "ha"
-#: ../rules/base.xml.in.h:481
+#: ../rules/base.xml.in.h:482
msgid "Hausa"
msgstr "Hausa"
#. Keyboard indicator for Avatime layouts
-#: ../rules/base.xml.in.h:483
+#: ../rules/base.xml.in.h:484
msgid "avn"
msgstr "avn"
-#: ../rules/base.xml.in.h:484
+#: ../rules/base.xml.in.h:485
msgid "Avatime"
msgstr "Аватіме"
-#: ../rules/base.xml.in.h:485
+#: ../rules/base.xml.in.h:486
msgid "English (Ghana, GILLBT)"
msgstr "Англійська (Гана, GILLBT)"
-#: ../rules/base.xml.in.h:486
+#: ../rules/base.xml.in.h:487
msgid "French (Guinea)"
msgstr "Французька (Гвінея)"
#. Keyboard indicator for Georgian layouts
-#: ../rules/base.xml.in.h:488
+#: ../rules/base.xml.in.h:489
msgid "ka"
msgstr "ka"
-#: ../rules/base.xml.in.h:489
+#: ../rules/base.xml.in.h:490
msgid "Georgian"
msgstr "Грузинська"
-#: ../rules/base.xml.in.h:490
+#: ../rules/base.xml.in.h:491
msgid "Georgian (ergonomic)"
msgstr "Грузинська (ергономічна)"
-#: ../rules/base.xml.in.h:491
+#: ../rules/base.xml.in.h:492
msgid "Georgian (MESS)"
msgstr "Грузинська (MESS)"
-#: ../rules/base.xml.in.h:492
+#: ../rules/base.xml.in.h:493
msgid "Russian (Georgia)"
msgstr "Російська (Грузія)"
-#: ../rules/base.xml.in.h:493
+#: ../rules/base.xml.in.h:494
msgid "Ossetian (Georgia)"
msgstr "Осетинська (Грузія)"
-#: ../rules/base.xml.in.h:494 ../rules/base.extras.xml.in.h:11
+#: ../rules/base.xml.in.h:495 ../rules/base.extras.xml.in.h:11
msgid "German"
msgstr "Німецька"
-#: ../rules/base.xml.in.h:495
+#: ../rules/base.xml.in.h:496
msgid "German (dead acute)"
msgstr "Німецька (сліпий акут)"
-#: ../rules/base.xml.in.h:496
+#: ../rules/base.xml.in.h:497
msgid "German (dead grave acute)"
msgstr "Німецька (сліпий наголос-акут)"
-#: ../rules/base.xml.in.h:497
+#: ../rules/base.xml.in.h:498
msgid "German (eliminate dead keys)"
msgstr "Німецька (вимкнути сліпі клавіші)"
-#: ../rules/base.xml.in.h:498
+#: ../rules/base.xml.in.h:499
msgid "German (T3)"
msgstr "Німецька (T3)"
-#: ../rules/base.xml.in.h:499
+#: ../rules/base.xml.in.h:500
msgid "Romanian (Germany)"
msgstr "Румунська (Німеччина)"
-#: ../rules/base.xml.in.h:500
+#: ../rules/base.xml.in.h:501
msgid "Romanian (Germany, eliminate dead keys)"
msgstr "Німецька (Німеччина, вимкнути сліпі клавіші)"
-#: ../rules/base.xml.in.h:501
+#: ../rules/base.xml.in.h:502
msgid "German (Dvorak)"
msgstr "Німецька (Дворак)"
-#: ../rules/base.xml.in.h:502
+#: ../rules/base.xml.in.h:503
msgid "German (Sun dead keys)"
msgstr "Німецька (сліпі клавіші Sun)"
-#: ../rules/base.xml.in.h:503
+#: ../rules/base.xml.in.h:504
msgid "German (Neo 2)"
msgstr "Німецька (Neo 2)"
-#: ../rules/base.xml.in.h:504
+#: ../rules/base.xml.in.h:505
msgid "German (Macintosh)"
msgstr "Німецька (Macintosh)"
-#: ../rules/base.xml.in.h:505
+#: ../rules/base.xml.in.h:506
msgid "German (Macintosh, eliminate dead keys)"
msgstr "Німецька (Macintosh, вимкнути сліпі клавіші)"
-#: ../rules/base.xml.in.h:506
+#: ../rules/base.xml.in.h:507
msgid "Lower Sorbian"
msgstr "Нижньолужицька"
-#: ../rules/base.xml.in.h:507
+#: ../rules/base.xml.in.h:508
msgid "Lower Sorbian (qwertz)"
msgstr "Нижньолужицька (qwertz)"
-#: ../rules/base.xml.in.h:508
+#: ../rules/base.xml.in.h:509
msgid "German (qwerty)"
msgstr "Німецька (qwerty)"
-#: ../rules/base.xml.in.h:509
+#: ../rules/base.xml.in.h:510
msgid "Russian (Germany, phonetic)"
msgstr "Російська (Німеччина, фонетична)"
-#: ../rules/base.xml.in.h:510
+#: ../rules/base.xml.in.h:511
msgid "German (legacy)"
msgstr "Німецька (застаріла)"
#. Keyboard indicator for Greek layouts
-#: ../rules/base.xml.in.h:512 ../rules/base.extras.xml.in.h:90
+#: ../rules/base.xml.in.h:513 ../rules/base.extras.xml.in.h:91
msgid "gr"
msgstr "gr"
-#: ../rules/base.xml.in.h:513 ../rules/base.extras.xml.in.h:91
+#: ../rules/base.xml.in.h:514 ../rules/base.extras.xml.in.h:92
msgid "Greek"
msgstr "Грецька"
-#: ../rules/base.xml.in.h:514
+#: ../rules/base.xml.in.h:515
msgid "Greek (simple)"
msgstr "Грецька (проста)"
-#: ../rules/base.xml.in.h:515
+#: ../rules/base.xml.in.h:516
msgid "Greek (extended)"
msgstr "Грецька (розширена)"
-#: ../rules/base.xml.in.h:516
+#: ../rules/base.xml.in.h:517
msgid "Greek (eliminate dead keys)"
msgstr "Грецька (вимкнути сліпі клавіші)"
-#: ../rules/base.xml.in.h:517
+#: ../rules/base.xml.in.h:518
msgid "Greek (polytonic)"
msgstr "Грецька (поліфонічна)"
#. Keyboard indicator for Hungarian layouts
-#: ../rules/base.xml.in.h:519
+#: ../rules/base.xml.in.h:520
msgid "hu"
msgstr "hu"
-#: ../rules/base.xml.in.h:520
+#: ../rules/base.xml.in.h:521
msgid "Hungarian"
msgstr "Угорська"
-#: ../rules/base.xml.in.h:521
+#: ../rules/base.xml.in.h:522
msgid "Hungarian (standard)"
msgstr "Угорська (стандартна)"
-#: ../rules/base.xml.in.h:522
+#: ../rules/base.xml.in.h:523
msgid "Hungarian (eliminate dead keys)"
msgstr "Угорська (вимкнути сліпі клавіші)"
-#: ../rules/base.xml.in.h:523
+#: ../rules/base.xml.in.h:524
msgid "Hungarian (qwerty)"
msgstr "Угорська (qwerty)"
-#: ../rules/base.xml.in.h:524
+#: ../rules/base.xml.in.h:525
msgid "Hungarian (101/qwertz/comma/dead keys)"
msgstr "Угорська (101/qwertz/кома/сліпі клавіші)"
-#: ../rules/base.xml.in.h:525
+#: ../rules/base.xml.in.h:526
msgid "Hungarian (101/qwertz/comma/eliminate dead keys)"
msgstr "Угорська (101/qwertz/крапка/вимкнути сліпі клавіші)"
-#: ../rules/base.xml.in.h:526
+#: ../rules/base.xml.in.h:527
msgid "Hungarian (101/qwertz/dot/dead keys)"
msgstr "Угорська (101/qwertz/крапка/сліпі клавіші)"
-#: ../rules/base.xml.in.h:527
+#: ../rules/base.xml.in.h:528
msgid "Hungarian (101/qwertz/dot/eliminate dead keys)"
msgstr "Угорська (101/qwertz/крапка/вимкнути сліпі клавіші)"
-#: ../rules/base.xml.in.h:528
+#: ../rules/base.xml.in.h:529
msgid "Hungarian (101/qwerty/comma/dead keys)"
msgstr "Угорська (101/qwerty/кома/сліпі клавіші)"
-#: ../rules/base.xml.in.h:529
+#: ../rules/base.xml.in.h:530
msgid "Hungarian (101/qwerty/comma/eliminate dead keys)"
msgstr "Угорська (101/qwerty/кома/вимкнути сліпі клавіші)"
-#: ../rules/base.xml.in.h:530
+#: ../rules/base.xml.in.h:531
msgid "Hungarian (101/qwerty/dot/dead keys)"
msgstr "Угорська (101/qwerty/крапка/сліпі клавіші)"
-#: ../rules/base.xml.in.h:531
+#: ../rules/base.xml.in.h:532
msgid "Hungarian (101/qwerty/dot/eliminate dead keys)"
msgstr "Угорська (101/qwerty/крапка/вимкнути сліпі клавіші)"
-#: ../rules/base.xml.in.h:532
+#: ../rules/base.xml.in.h:533
msgid "Hungarian (102/qwertz/comma/dead keys)"
msgstr "Угорська (102/qwertz/кома/сліпі клавіші)"
-#: ../rules/base.xml.in.h:533
+#: ../rules/base.xml.in.h:534
msgid "Hungarian (102/qwertz/comma/eliminate dead keys)"
msgstr "Угорська (102/qwertz/крапка/вимкнути сліпі клавіші)"
-#: ../rules/base.xml.in.h:534
+#: ../rules/base.xml.in.h:535
msgid "Hungarian (102/qwertz/dot/dead keys)"
msgstr "Угорська (102/qwertz/крапка/сліпі клавіші)"
-#: ../rules/base.xml.in.h:535
+#: ../rules/base.xml.in.h:536
msgid "Hungarian (102/qwertz/dot/eliminate dead keys)"
msgstr "Угорська (102/qwertz/крапка/вимкнути сліпі клавіші)"
-#: ../rules/base.xml.in.h:536
+#: ../rules/base.xml.in.h:537
msgid "Hungarian (102/qwerty/comma/dead keys)"
msgstr "Угорська (102/qwerty/кома/сліпі клавіші)"
-#: ../rules/base.xml.in.h:537
+#: ../rules/base.xml.in.h:538
msgid "Hungarian (102/qwerty/comma/eliminate dead keys)"
msgstr "Угорська (102/qwerty/кома/вимкнути сліпі клавіші)"
-#: ../rules/base.xml.in.h:538
+#: ../rules/base.xml.in.h:539
msgid "Hungarian (102/qwerty/dot/dead keys)"
msgstr "Угорська (102/qwerty/крапка/сліпі клавіші)"
-#: ../rules/base.xml.in.h:539
+#: ../rules/base.xml.in.h:540
msgid "Hungarian (102/qwerty/dot/eliminate dead keys)"
msgstr "Угорська (102/qwerty/крапка/вимкнути сліпі клавіші)"
#. Keyboard indicator for Icelandic layouts
-#: ../rules/base.xml.in.h:541
+#: ../rules/base.xml.in.h:542
msgid "is"
msgstr "is"
-#: ../rules/base.xml.in.h:542
+#: ../rules/base.xml.in.h:543
msgid "Icelandic"
msgstr "Ісландська"
-#: ../rules/base.xml.in.h:543
+#: ../rules/base.xml.in.h:544
msgid "Icelandic (Sun dead keys)"
msgstr "Ісландська (сліпі клавіші Sun)"
-#: ../rules/base.xml.in.h:544
+#: ../rules/base.xml.in.h:545
msgid "Icelandic (eliminate dead keys)"
msgstr "Ісландська (вимкнути сліпі клавіші)"
-#: ../rules/base.xml.in.h:545
+#: ../rules/base.xml.in.h:546
msgid "Icelandic (Macintosh)"
msgstr "Ісландська (Macintosh)"
-#: ../rules/base.xml.in.h:546
+#: ../rules/base.xml.in.h:547
msgid "Icelandic (Dvorak)"
msgstr "Ісландська (Дворак)"
#. Keyboard indicator for Hebrew layouts
-#: ../rules/base.xml.in.h:548 ../rules/base.extras.xml.in.h:61
+#: ../rules/base.xml.in.h:549 ../rules/base.extras.xml.in.h:62
msgid "he"
msgstr "he"
-#: ../rules/base.xml.in.h:549 ../rules/base.extras.xml.in.h:62
+#: ../rules/base.xml.in.h:550 ../rules/base.extras.xml.in.h:63
msgid "Hebrew"
msgstr "Іврит"
-#: ../rules/base.xml.in.h:550
+#: ../rules/base.xml.in.h:551
msgid "Hebrew (lyx)"
msgstr "Іврит (lyx)"
-#: ../rules/base.xml.in.h:551
+#: ../rules/base.xml.in.h:552
msgid "Hebrew (phonetic)"
msgstr "Іврит (фонетична)"
-#: ../rules/base.xml.in.h:552
+#: ../rules/base.xml.in.h:553
msgid "Hebrew (Biblical, Tiro)"
msgstr "Іврит (Біблейська, Tiro)"
#. Keyboard indicator for Italian layouts
-#: ../rules/base.xml.in.h:554 ../rules/base.extras.xml.in.h:93
+#: ../rules/base.xml.in.h:555 ../rules/base.extras.xml.in.h:94
msgid "it"
msgstr "it"
-#: ../rules/base.xml.in.h:555 ../rules/base.extras.xml.in.h:94
+#: ../rules/base.xml.in.h:556 ../rules/base.extras.xml.in.h:95
msgid "Italian"
msgstr "Італійська"
-#: ../rules/base.xml.in.h:556
+#: ../rules/base.xml.in.h:557
msgid "Italian (eliminate dead keys)"
msgstr "Італійська (вимкнути сліпі клавіші)"
-#: ../rules/base.xml.in.h:557
+#: ../rules/base.xml.in.h:558
msgid "Italian (Macintosh)"
msgstr "Італійська (Macintosh)"
-#: ../rules/base.xml.in.h:558
+#: ../rules/base.xml.in.h:559
msgid "Italian (US keyboard with Italian letters)"
msgstr "Італійська (клавіатура США з італійськими літерами)"
-#: ../rules/base.xml.in.h:559
+#: ../rules/base.xml.in.h:560
msgid "Georgian (Italy)"
msgstr "Грузинська (Італія)"
-#: ../rules/base.xml.in.h:560
+#: ../rules/base.xml.in.h:561
msgid "Italian (IBM 142)"
msgstr "Італійська (IBM 142)"
#. Keyboard indicator for Japanese layouts
-#: ../rules/base.xml.in.h:562 ../rules/base.extras.xml.in.h:96
+#: ../rules/base.xml.in.h:563 ../rules/base.extras.xml.in.h:97
msgid "ja"
msgstr "ja"
-#: ../rules/base.xml.in.h:563 ../rules/base.extras.xml.in.h:97
+#: ../rules/base.xml.in.h:564 ../rules/base.extras.xml.in.h:98
msgid "Japanese"
msgstr "Японська"
-#: ../rules/base.xml.in.h:564
+#: ../rules/base.xml.in.h:565
msgid "Japanese (Kana)"
msgstr "Японська (кана)"
-#: ../rules/base.xml.in.h:565
+#: ../rules/base.xml.in.h:566
msgid "Japanese (Kana 86)"
msgstr "Японська (кана 86)"
-#: ../rules/base.xml.in.h:566
+#: ../rules/base.xml.in.h:567
msgid "Japanese (OADG 109A)"
msgstr "Японська (OADG 109A)"
-#: ../rules/base.xml.in.h:567
+#: ../rules/base.xml.in.h:568
msgid "Japanese (Macintosh)"
msgstr "Японська (Macintosh)"
-#: ../rules/base.xml.in.h:568
+#: ../rules/base.xml.in.h:569
msgid "Japanese (Dvorak)"
msgstr "Японська (Дворак)"
#. Keyboard indicator for Kikuyu layouts
-#: ../rules/base.xml.in.h:570
+#: ../rules/base.xml.in.h:571
msgid "ki"
msgstr "ki"
-#: ../rules/base.xml.in.h:571
+#: ../rules/base.xml.in.h:572
msgid "Kyrgyz"
msgstr "Киргизька"
-#: ../rules/base.xml.in.h:572
+#: ../rules/base.xml.in.h:573
msgid "Kyrgyz (phonetic)"
msgstr "Киргизька (фонетична)"
#. Keyboard indicator for Khmer layouts
-#: ../rules/base.xml.in.h:574
+#: ../rules/base.xml.in.h:575
msgid "km"
msgstr "km"
-#: ../rules/base.xml.in.h:575
+#: ../rules/base.xml.in.h:576
msgid "Khmer (Cambodia)"
msgstr "Кхмерська (Камбоджа)"
#. Keyboard indicator for Kazakh layouts
-#: ../rules/base.xml.in.h:577
+#: ../rules/base.xml.in.h:578
msgid "kk"
msgstr "kk"
-#: ../rules/base.xml.in.h:578
+#: ../rules/base.xml.in.h:579
msgid "Kazakh"
msgstr "Казахська"
-#: ../rules/base.xml.in.h:579
+#: ../rules/base.xml.in.h:580
msgid "Russian (Kazakhstan, with Kazakh)"
msgstr "Російська (Казахстан, з казахською)"
-#: ../rules/base.xml.in.h:580
+#: ../rules/base.xml.in.h:581
msgid "Kazakh (with Russian)"
msgstr "Казахська (з російськими)"
#. Keyboard indicator for Lao layouts
-#: ../rules/base.xml.in.h:582
+#: ../rules/base.xml.in.h:583
msgid "lo"
msgstr "lo"
-#: ../rules/base.xml.in.h:583
+#: ../rules/base.xml.in.h:584
msgid "Lao"
msgstr "Лаоська"
-#: ../rules/base.xml.in.h:584
+#: ../rules/base.xml.in.h:585
msgid "Lao (STEA proposed standard layout)"
msgstr "Лаоська (стандартна розкладка, запропонована STEA)"
#. Keyboard indicator for Spanish layouts
-#: ../rules/base.xml.in.h:586 ../rules/base.extras.xml.in.h:109
+#: ../rules/base.xml.in.h:587 ../rules/base.extras.xml.in.h:110
msgid "es"
msgstr "es"
-#: ../rules/base.xml.in.h:587
+#: ../rules/base.xml.in.h:588
msgid "Spanish (Latin American)"
msgstr "Іспанська (латиноамериканська)"
-#: ../rules/base.xml.in.h:588
+#: ../rules/base.xml.in.h:589
msgid "Spanish (Latin American, eliminate dead keys)"
msgstr "Іспанська (латиноамериканська, вимкнути сліпі клавіші)"
-#: ../rules/base.xml.in.h:589
+#: ../rules/base.xml.in.h:590
msgid "Spanish (Latin American, include dead tilde)"
msgstr "Іспанська (латиноамериканська зі «спеціальною» тильдою)"
-#: ../rules/base.xml.in.h:590
+#: ../rules/base.xml.in.h:591
msgid "Spanish (Latin American, Sun dead keys)"
msgstr "Іспанська (латиноамериканська, сліпі клавіші Sun)"
#. Keyboard indicator for Lithuanian layouts
-#: ../rules/base.xml.in.h:592 ../rules/base.extras.xml.in.h:18
+#: ../rules/base.xml.in.h:593 ../rules/base.extras.xml.in.h:18
msgid "lt"
msgstr "lt"
-#: ../rules/base.xml.in.h:593 ../rules/base.extras.xml.in.h:19
+#: ../rules/base.xml.in.h:594 ../rules/base.extras.xml.in.h:19
msgid "Lithuanian"
msgstr "Литовська"
-#: ../rules/base.xml.in.h:594
+#: ../rules/base.xml.in.h:595
msgid "Lithuanian (standard)"
msgstr "Литовська (стандартна)"
-#: ../rules/base.xml.in.h:595
+#: ../rules/base.xml.in.h:596
msgid "Lithuanian (US keyboard with Lithuanian letters)"
msgstr "Литовська (клавіатура США, з литовськими літерами)"
-#: ../rules/base.xml.in.h:596
+#: ../rules/base.xml.in.h:597
msgid "Lithuanian (IBM LST 1205-92)"
msgstr "Литовська (IBM LST 1205-92)"
-#: ../rules/base.xml.in.h:597
+#: ../rules/base.xml.in.h:598
msgid "Lithuanian (LEKP)"
msgstr "Литовська (LEKP)"
-#: ../rules/base.xml.in.h:598
+#: ../rules/base.xml.in.h:599
msgid "Lithuanian (LEKPa)"
msgstr "Литовська (LEKPa)"
#. Keyboard indicator for Latvian layouts
-#: ../rules/base.xml.in.h:600 ../rules/base.extras.xml.in.h:22
+#: ../rules/base.xml.in.h:601 ../rules/base.extras.xml.in.h:22
msgid "lv"
msgstr "lv"
-#: ../rules/base.xml.in.h:601 ../rules/base.extras.xml.in.h:23
+#: ../rules/base.xml.in.h:602 ../rules/base.extras.xml.in.h:23
msgid "Latvian"
msgstr "Латвійська"
-#: ../rules/base.xml.in.h:602
+#: ../rules/base.xml.in.h:603
msgid "Latvian (apostrophe variant)"
msgstr "Латвійська (варіант з апострофом)"
-#: ../rules/base.xml.in.h:603
+#: ../rules/base.xml.in.h:604
msgid "Latvian (tilde variant)"
msgstr "Латвійська (варіант з тильдою)"
-#: ../rules/base.xml.in.h:604
+#: ../rules/base.xml.in.h:605
msgid "Latvian (F variant)"
msgstr "Латвійська (варіант з літерою F)"
-#: ../rules/base.xml.in.h:605
+#: ../rules/base.xml.in.h:606
msgid "Latvian (modern)"
msgstr "Латвійська (сучасна)"
-#: ../rules/base.xml.in.h:606
+#: ../rules/base.xml.in.h:607
msgid "Latvian (ergonomic, ŪGJRMV)"
msgstr "Латвійська (ергономічна, ŪGJRMV)"
-#: ../rules/base.xml.in.h:607
+#: ../rules/base.xml.in.h:608
msgid "Latvian (adapted)"
msgstr "Латвійська (адаптована)"
#. Keyboard indicator for Maori layouts
-#: ../rules/base.xml.in.h:609
+#: ../rules/base.xml.in.h:610
msgid "mi"
msgstr "mi"
-#: ../rules/base.xml.in.h:610
+#: ../rules/base.xml.in.h:611
msgid "Maori"
msgstr "Маорійська"
#. Keyboard indicator for Serbian layouts
-#: ../rules/base.xml.in.h:612 ../rules/base.extras.xml.in.h:51
+#: ../rules/base.xml.in.h:613 ../rules/base.extras.xml.in.h:52
msgid "sr"
msgstr "sr"
-#: ../rules/base.xml.in.h:613
+#: ../rules/base.xml.in.h:614
msgid "Montenegrin"
msgstr "Чорногорська"
-#: ../rules/base.xml.in.h:614
+#: ../rules/base.xml.in.h:615
msgid "Montenegrin (Cyrillic)"
msgstr "Чорногорська (кирилиця)"
-#: ../rules/base.xml.in.h:615
+#: ../rules/base.xml.in.h:616
msgid "Montenegrin (Cyrillic, Z and ZHE swapped)"
msgstr "Чорногорська (кирилиця, З та Ж поміняні місцями)"
-#: ../rules/base.xml.in.h:616
+#: ../rules/base.xml.in.h:617
msgid "Montenegrin (Latin Unicode)"
msgstr "Чорногорська (латиниця, Unicode)"
-#: ../rules/base.xml.in.h:617
+#: ../rules/base.xml.in.h:618
msgid "Montenegrin (Latin qwerty)"
msgstr "Чорногорська (латиниця, qwerty)"
-#: ../rules/base.xml.in.h:618
+#: ../rules/base.xml.in.h:619
msgid "Montenegrin (Latin Unicode qwerty)"
msgstr "Чорногорська (латиниця, Unicode, qwerty)"
-#: ../rules/base.xml.in.h:619
+#: ../rules/base.xml.in.h:620
msgid "Montenegrin (Cyrillic with guillemets)"
msgstr "Чорногорська (кирилиця з кутовими лапками)"
-#: ../rules/base.xml.in.h:620
+#: ../rules/base.xml.in.h:621
msgid "Montenegrin (Latin with guillemets)"
msgstr "Чорногорська (латиниця з кутовими лапками)"
#. Keyboard indicator for Macedonian layouts
-#: ../rules/base.xml.in.h:622
+#: ../rules/base.xml.in.h:623
msgid "mk"
msgstr "mk"
-#: ../rules/base.xml.in.h:623
+#: ../rules/base.xml.in.h:624
msgid "Macedonian"
msgstr "Македонська"
-#: ../rules/base.xml.in.h:624
+#: ../rules/base.xml.in.h:625
msgid "Macedonian (eliminate dead keys)"
msgstr "Македонська (вимкнути сліпі клавіші)"
#. Keyboard indicator for Maltese layouts
-#: ../rules/base.xml.in.h:626
+#: ../rules/base.xml.in.h:627
msgid "mt"
msgstr "mt"
-#: ../rules/base.xml.in.h:627
+#: ../rules/base.xml.in.h:628
msgid "Maltese"
msgstr "Мальтійська"
-#: ../rules/base.xml.in.h:628
+#: ../rules/base.xml.in.h:629
msgid "Maltese (with US layout)"
msgstr "Мальтійська (клавіатура з розкладкою США)"
#. Keyboard indicator for Mongolian layouts
-#: ../rules/base.xml.in.h:630
+#: ../rules/base.xml.in.h:631
msgid "mn"
msgstr "mn"
-#: ../rules/base.xml.in.h:631
+#: ../rules/base.xml.in.h:632
msgid "Mongolian"
msgstr "Монгольська"
#. Keyboard indicator for Norwegian layouts
-#: ../rules/base.xml.in.h:633 ../rules/base.extras.xml.in.h:101
+#: ../rules/base.xml.in.h:634 ../rules/base.extras.xml.in.h:102
msgid "no"
msgstr "no"
-#: ../rules/base.xml.in.h:634 ../rules/base.extras.xml.in.h:102
+#: ../rules/base.xml.in.h:635 ../rules/base.extras.xml.in.h:103
msgid "Norwegian"
msgstr "Норвезька"
-#: ../rules/base.xml.in.h:635
+#: ../rules/base.xml.in.h:636
msgid "Norwegian (eliminate dead keys)"
msgstr "Норвезька (вимкнути сліпі клавіші)"
-#: ../rules/base.xml.in.h:636
+#: ../rules/base.xml.in.h:637
msgid "Norwegian (Dvorak)"
msgstr "Норвезька (Дворак)"
-#: ../rules/base.xml.in.h:637
+#: ../rules/base.xml.in.h:638
msgid "Northern Saami (Norway)"
msgstr "Північно-саамська (Норвегія)"
-#: ../rules/base.xml.in.h:638
+#: ../rules/base.xml.in.h:639
msgid "Northern Saami (Norway, eliminate dead keys)"
msgstr "Північно-саамська (Норвегія, вимкнути сліпі клавіші)"
-#: ../rules/base.xml.in.h:639
+#: ../rules/base.xml.in.h:640
msgid "Norwegian (Macintosh)"
msgstr "Норвезька (Macintosh)"
-#: ../rules/base.xml.in.h:640
+#: ../rules/base.xml.in.h:641
msgid "Norwegian (Macintosh, eliminate dead keys)"
msgstr "Норвезька (Macintosh, вимкнути сліпі клавіші)"
-#: ../rules/base.xml.in.h:641
+#: ../rules/base.xml.in.h:642
msgid "Norwegian (Colemak)"
msgstr "Норвезька (Колемак)"
#. Keyboard indicator for Polish layouts
-#: ../rules/base.xml.in.h:643 ../rules/base.extras.xml.in.h:40
+#: ../rules/base.xml.in.h:644 ../rules/base.extras.xml.in.h:41
msgid "pl"
msgstr "pl"
-#: ../rules/base.xml.in.h:644 ../rules/base.extras.xml.in.h:41
+#: ../rules/base.xml.in.h:645 ../rules/base.extras.xml.in.h:42
msgid "Polish"
msgstr "Польська"
-#: ../rules/base.xml.in.h:645
+#: ../rules/base.xml.in.h:646
msgid "Polish (legacy)"
msgstr "Польська (застаріла)"
-#: ../rules/base.xml.in.h:646
+#: ../rules/base.xml.in.h:647
msgid "Polish (qwertz)"
msgstr "Польська (qwertz)"
-#: ../rules/base.xml.in.h:647
+#: ../rules/base.xml.in.h:648
msgid "Polish (Dvorak)"
msgstr "Польська (Дворак)"
-#: ../rules/base.xml.in.h:648
+#: ../rules/base.xml.in.h:649
msgid "Polish (Dvorak, Polish quotes on quotemark key)"
msgstr "Польська (Дворак, польські лапки на знаку лапки)"
-#: ../rules/base.xml.in.h:649
+#: ../rules/base.xml.in.h:650
msgid "Polish (Dvorak, Polish quotes on key 1)"
msgstr "Польська (Дворак, польські лапки на клавіші 1)"
-#: ../rules/base.xml.in.h:650
+#: ../rules/base.xml.in.h:651
msgid "Kashubian"
msgstr "Кашубська"
-#: ../rules/base.xml.in.h:651
+#: ../rules/base.xml.in.h:652
msgid "Russian (Poland, phonetic Dvorak)"
msgstr "Російська (Польща, фонетична Дворака)"
-#: ../rules/base.xml.in.h:652
+#: ../rules/base.xml.in.h:653
msgid "Polish (programmer Dvorak)"
msgstr "Польська (програмістський Дворак)"
-#: ../rules/base.xml.in.h:653 ../rules/base.extras.xml.in.h:104
+#: ../rules/base.xml.in.h:654 ../rules/base.extras.xml.in.h:105
msgid "Portuguese"
msgstr "Португальська"
-#: ../rules/base.xml.in.h:654
+#: ../rules/base.xml.in.h:655
msgid "Portuguese (eliminate dead keys)"
msgstr "Португальська (вимкнути сліпі клавіші)"
-#: ../rules/base.xml.in.h:655
+#: ../rules/base.xml.in.h:656
msgid "Portuguese (Sun dead keys)"
msgstr "Португальська (сліпі клавіші Sun)"
-#: ../rules/base.xml.in.h:656
+#: ../rules/base.xml.in.h:657
msgid "Portuguese (Macintosh)"
msgstr "Португальська (Macintosh)"
-#: ../rules/base.xml.in.h:657
+#: ../rules/base.xml.in.h:658
msgid "Portuguese (Macintosh, eliminate dead keys)"
msgstr "Португальська (Macintosh, вимкнути сліпі клавіші)"
-#: ../rules/base.xml.in.h:658
+#: ../rules/base.xml.in.h:659
msgid "Portuguese (Macintosh, Sun dead keys)"
msgstr "Португальська (Macintosh, сліпі клавіші Sun)"
-#: ../rules/base.xml.in.h:659
+#: ../rules/base.xml.in.h:660
msgid "Portuguese (Nativo)"
msgstr "Португальська (Nativo)"
-#: ../rules/base.xml.in.h:660
+#: ../rules/base.xml.in.h:661
msgid "Portuguese (Nativo for US keyboards)"
msgstr "Португальська (nativo для клавіатур США)"
-#: ../rules/base.xml.in.h:661
+#: ../rules/base.xml.in.h:662
msgid "Esperanto (Portugal, Nativo)"
msgstr "Есперанто (португальська, Nativo)"
#. Keyboard indicator for Romanian layouts
-#: ../rules/base.xml.in.h:663 ../rules/base.extras.xml.in.h:45
+#: ../rules/base.xml.in.h:664 ../rules/base.extras.xml.in.h:46
msgid "ro"
msgstr "ro"
-#: ../rules/base.xml.in.h:664 ../rules/base.extras.xml.in.h:46
+#: ../rules/base.xml.in.h:665 ../rules/base.extras.xml.in.h:47
msgid "Romanian"
msgstr "Румунська"
-#: ../rules/base.xml.in.h:665
+#: ../rules/base.xml.in.h:666
msgid "Romanian (cedilla)"
msgstr "Румунська (седиль)"
-#: ../rules/base.xml.in.h:666
+#: ../rules/base.xml.in.h:667
msgid "Romanian (standard)"
msgstr "Румунська (стандартна)"
-#: ../rules/base.xml.in.h:667
+#: ../rules/base.xml.in.h:668
msgid "Romanian (standard cedilla)"
msgstr "Румунська (стандартна седиль)"
-#: ../rules/base.xml.in.h:668
+#: ../rules/base.xml.in.h:669
msgid "Romanian (WinKeys)"
msgstr "Румунська (з клавішами Win)"
-#: ../rules/base.xml.in.h:669 ../rules/base.extras.xml.in.h:55
+#: ../rules/base.xml.in.h:670 ../rules/base.extras.xml.in.h:56
msgid "Russian"
msgstr "Російська"
-#: ../rules/base.xml.in.h:670
+#: ../rules/base.xml.in.h:671
msgid "Russian (phonetic)"
msgstr "Російська (фонетична)"
-#: ../rules/base.xml.in.h:671
+#: ../rules/base.xml.in.h:672
msgid "Russian (phonetic WinKeys)"
msgstr "Російська (фонетична з клавішами Win)"
-#: ../rules/base.xml.in.h:672
+#: ../rules/base.xml.in.h:673
msgid "Russian (typewriter)"
msgstr "Російська (машинопис)"
-#: ../rules/base.xml.in.h:673
+#: ../rules/base.xml.in.h:674
msgid "Russian (legacy)"
msgstr "Російська (застаріла)"
-#: ../rules/base.xml.in.h:674
+#: ../rules/base.xml.in.h:675
msgid "Russian (typewriter, legacy)"
msgstr "Російська (машинопис, застаріла)"
-#: ../rules/base.xml.in.h:675
+#: ../rules/base.xml.in.h:676
msgid "Tatar"
msgstr "Татарська"
-#: ../rules/base.xml.in.h:676
+#: ../rules/base.xml.in.h:677
msgid "Ossetian (legacy)"
msgstr "Осетинська (застаріла)"
-#: ../rules/base.xml.in.h:677
+#: ../rules/base.xml.in.h:678
msgid "Ossetian (WinKeys)"
msgstr "Осетинська (з клавішами Win)"
-#: ../rules/base.xml.in.h:678
+#: ../rules/base.xml.in.h:679
msgid "Chuvash"
msgstr "Чуваська"
-#: ../rules/base.xml.in.h:679
+#: ../rules/base.xml.in.h:680
msgid "Chuvash (Latin)"
msgstr "Чуваська (латиниця)"
-#: ../rules/base.xml.in.h:680
+#: ../rules/base.xml.in.h:681
msgid "Udmurt"
msgstr "Удмуртська"
-#: ../rules/base.xml.in.h:681
+#: ../rules/base.xml.in.h:682
msgid "Komi"
msgstr "Комі"
-#: ../rules/base.xml.in.h:682
+#: ../rules/base.xml.in.h:683
msgid "Yakut"
msgstr "Якутська"
-#: ../rules/base.xml.in.h:683
+#: ../rules/base.xml.in.h:684
msgid "Kalmyk"
msgstr "Калмицька"
-#: ../rules/base.xml.in.h:684
+#: ../rules/base.xml.in.h:685
msgid "Russian (DOS)"
msgstr "Російська (DOS)"
-#: ../rules/base.xml.in.h:685
+#: ../rules/base.xml.in.h:686
msgid "Russian (Macintosh)"
msgstr "Російська (Macintosh)"
-#: ../rules/base.xml.in.h:686
+#: ../rules/base.xml.in.h:687
msgid "Serbian (Russia)"
msgstr "Сербська (Росія)"
-#: ../rules/base.xml.in.h:687
+#: ../rules/base.xml.in.h:688
msgid "Bashkirian"
msgstr "Башкирська"
-#: ../rules/base.xml.in.h:688
+#: ../rules/base.xml.in.h:689
msgid "Mari"
msgstr "Марійська"
-#: ../rules/base.xml.in.h:689 ../rules/base.extras.xml.in.h:52
+#: ../rules/base.xml.in.h:690 ../rules/base.extras.xml.in.h:53
msgid "Serbian"
msgstr "Сербська"
-#: ../rules/base.xml.in.h:690
+#: ../rules/base.xml.in.h:691
msgid "Serbian (Cyrillic, Z and ZHE swapped)"
msgstr "Сербська (кирилиця, З та Ж поміняні місцями)"
-#: ../rules/base.xml.in.h:691
+#: ../rules/base.xml.in.h:692
msgid "Serbian (Latin)"
msgstr "Сербська (латиниця)"
-#: ../rules/base.xml.in.h:692
+#: ../rules/base.xml.in.h:693
msgid "Serbian (Latin Unicode)"
msgstr "Сербська (латиниця Unicode)"
-#: ../rules/base.xml.in.h:693
+#: ../rules/base.xml.in.h:694
msgid "Serbian (Latin qwerty)"
msgstr "Сербська (латиниця, qwerty)"
-#: ../rules/base.xml.in.h:694
+#: ../rules/base.xml.in.h:695
msgid "Serbian (Latin Unicode qwerty)"
msgstr "Сербська (латиниця, Unicode qwerty)"
-#: ../rules/base.xml.in.h:695
+#: ../rules/base.xml.in.h:696
msgid "Serbian (Cyrillic with guillemets)"
msgstr "Сербська (кирилиця з кутовими лапками)"
-#: ../rules/base.xml.in.h:696
+#: ../rules/base.xml.in.h:697
msgid "Serbian (Latin with guillemets)"
msgstr "Сербська (латиниця з кутовими лапками)"
-#: ../rules/base.xml.in.h:697
-msgid "Pannonian Rusyn (homophonic)"
-msgstr "Паннонська русинська (гомофонна)"
+#: ../rules/base.xml.in.h:698
+msgid "Pannonian Rusyn"
+msgstr "Паннонська русинська"
#. Keyboard indicator for Slovenian layouts
-#: ../rules/base.xml.in.h:699
+#: ../rules/base.xml.in.h:700
msgid "sl"
msgstr "sl"
-#: ../rules/base.xml.in.h:700
+#: ../rules/base.xml.in.h:701
msgid "Slovenian"
msgstr "Словенська"
-#: ../rules/base.xml.in.h:701
+#: ../rules/base.xml.in.h:702
msgid "Slovenian (use guillemets for quotes)"
msgstr "Словенська (кутові лапки)"
-#: ../rules/base.xml.in.h:702
+#: ../rules/base.xml.in.h:703
msgid "Slovenian (US keyboard with Slovenian letters)"
msgstr "Словенська (клавіатура США із словенськими літерами)"
#. Keyboard indicator for Slovak layouts
-#: ../rules/base.xml.in.h:704 ../rules/base.extras.xml.in.h:106
+#: ../rules/base.xml.in.h:705 ../rules/base.extras.xml.in.h:107
msgid "sk"
msgstr "sk"
-#: ../rules/base.xml.in.h:705 ../rules/base.extras.xml.in.h:107
+#: ../rules/base.xml.in.h:706 ../rules/base.extras.xml.in.h:108
msgid "Slovak"
msgstr "Словацька"
-#: ../rules/base.xml.in.h:706
+#: ../rules/base.xml.in.h:707
msgid "Slovak (extended Backslash)"
msgstr "Словацька (розширені функції Backslash)"
-#: ../rules/base.xml.in.h:707
+#: ../rules/base.xml.in.h:708
msgid "Slovak (qwerty)"
msgstr "Словацька (qwerty)"
-#: ../rules/base.xml.in.h:708
+#: ../rules/base.xml.in.h:709
msgid "Slovak (qwerty, extended Backslash)"
msgstr "Словацька (qwerty, розширені функції Backslash)"
-#: ../rules/base.xml.in.h:709 ../rules/base.extras.xml.in.h:110
+#: ../rules/base.xml.in.h:710 ../rules/base.extras.xml.in.h:111
msgid "Spanish"
msgstr "Іспанська"
-#: ../rules/base.xml.in.h:710
+#: ../rules/base.xml.in.h:711
msgid "Spanish (eliminate dead keys)"
msgstr "Іспанська (вимкнути сліпі клавіші)"
-#: ../rules/base.xml.in.h:711
+#: ../rules/base.xml.in.h:712
msgid "Spanish (include dead tilde)"
msgstr "Іспанська (зі «спеціальною» тильдою)"
-#: ../rules/base.xml.in.h:712
+#: ../rules/base.xml.in.h:713
msgid "Spanish (Sun dead keys)"
msgstr "Іспанська (сліпі клавіші Sun)"
-#: ../rules/base.xml.in.h:713
+#: ../rules/base.xml.in.h:714
msgid "Spanish (Dvorak)"
msgstr "Іспанська (Дворак)"
-#: ../rules/base.xml.in.h:714
+#: ../rules/base.xml.in.h:715
msgid "Asturian (Spain, with bottom-dot H and bottom-dot L)"
msgstr "Астурійська (Іспанія, з H та L з нижньою крапкою)"
-#: ../rules/base.xml.in.h:715
+#: ../rules/base.xml.in.h:716
msgid "Catalan (Spain, with middle-dot L)"
msgstr "Іспанська (Іспанія, варіант з L із середньою точкою)"
-#: ../rules/base.xml.in.h:716
+#: ../rules/base.xml.in.h:717
msgid "Spanish (Macintosh)"
msgstr "Іспанська (Macintosh)"
#. Keyboard indicator for Swedish layouts
-#: ../rules/base.xml.in.h:718 ../rules/base.extras.xml.in.h:112
+#: ../rules/base.xml.in.h:719 ../rules/base.extras.xml.in.h:113
msgid "sv"
msgstr "sv"
-#: ../rules/base.xml.in.h:719 ../rules/base.extras.xml.in.h:113
+#: ../rules/base.xml.in.h:720 ../rules/base.extras.xml.in.h:114
msgid "Swedish"
msgstr "Шведська"
-#: ../rules/base.xml.in.h:720
+#: ../rules/base.xml.in.h:721
msgid "Swedish (eliminate dead keys)"
msgstr "Шведська (вимкнути сліпі клавіші)"
-#: ../rules/base.xml.in.h:721
+#: ../rules/base.xml.in.h:722
msgid "Swedish (Dvorak)"
msgstr "Шведська (Дворак)"
-#: ../rules/base.xml.in.h:722
+#: ../rules/base.xml.in.h:723
msgid "Russian (Sweden, phonetic)"
msgstr "Російська (шведська, фонетична)"
-#: ../rules/base.xml.in.h:723
+#: ../rules/base.xml.in.h:724
msgid "Russian (Sweden, phonetic, eliminate dead keys)"
msgstr "Російська (шведська, фонетична, вимкнути сліпі клавіші)"
-#: ../rules/base.xml.in.h:724
+#: ../rules/base.xml.in.h:725
msgid "Northern Saami (Sweden)"
msgstr "Північно-саамська (Швеція)"
-#: ../rules/base.xml.in.h:725
+#: ../rules/base.xml.in.h:726
msgid "Swedish (Macintosh)"
msgstr "Шведська (Macintosh)"
-#: ../rules/base.xml.in.h:726
+#: ../rules/base.xml.in.h:727
msgid "Swedish (Svdvorak)"
msgstr "Шведська (Svdvorak)"
-#: ../rules/base.xml.in.h:727
+#: ../rules/base.xml.in.h:728
msgid "Swedish Sign Language"
msgstr "Шведська мова жестів"
-#: ../rules/base.xml.in.h:728 ../rules/base.extras.xml.in.h:115
+#: ../rules/base.xml.in.h:729 ../rules/base.extras.xml.in.h:116
msgid "German (Switzerland)"
msgstr "Німецька (Швейцарія)"
-#: ../rules/base.xml.in.h:729
+#: ../rules/base.xml.in.h:730
msgid "German (Switzerland, legacy)"
msgstr "Німецька (Швейцарія, застаріла)"
-#: ../rules/base.xml.in.h:730
+#: ../rules/base.xml.in.h:731
msgid "German (Switzerland, eliminate dead keys)"
msgstr "Німецька (Швейцарія, вимкнути сліпі клавіші)"
-#: ../rules/base.xml.in.h:731
+#: ../rules/base.xml.in.h:732
msgid "German (Switzerland, Sun dead keys)"
msgstr "Німецька (Швейцарія, сліпі клавіші Sun)"
-#: ../rules/base.xml.in.h:732
+#: ../rules/base.xml.in.h:733
msgid "French (Switzerland)"
msgstr "Французька (Швейцарія)"
-#: ../rules/base.xml.in.h:733
+#: ../rules/base.xml.in.h:734
msgid "French (Switzerland, eliminate dead keys)"
msgstr "Французька (Швейцарія, вимкнути сліпі клавіші)"
-#: ../rules/base.xml.in.h:734
+#: ../rules/base.xml.in.h:735
msgid "French (Switzerland, Sun dead keys)"
msgstr "Французька (Швейцарія, сліпі клавіші Sun)"
-#: ../rules/base.xml.in.h:735
+#: ../rules/base.xml.in.h:736
msgid "French (Switzerland, Macintosh)"
msgstr "Французька (Швейцарія, Macintosh)"
-#: ../rules/base.xml.in.h:736
+#: ../rules/base.xml.in.h:737
msgid "German (Switzerland, Macintosh)"
msgstr "Німецька (Швейцарія, Macintosh)"
-#: ../rules/base.xml.in.h:737
+#: ../rules/base.xml.in.h:738
msgid "Arabic (Syria)"
msgstr "Арабська (Сирія)"
#. Keyboard indicator for Syriac layouts
-#: ../rules/base.xml.in.h:739
+#: ../rules/base.xml.in.h:740
msgid "syc"
msgstr "syc"
-#: ../rules/base.xml.in.h:740
+#: ../rules/base.xml.in.h:741
msgid "Syriac"
msgstr "Сирійська"
-#: ../rules/base.xml.in.h:741
+#: ../rules/base.xml.in.h:742
msgid "Syriac (phonetic)"
msgstr "Сирійська (фонетична)"
-#: ../rules/base.xml.in.h:742
+#: ../rules/base.xml.in.h:743
msgid "Kurdish (Syria, Latin Q)"
msgstr "Курдська (Сирія, латиниця Q)"
-#: ../rules/base.xml.in.h:743
+#: ../rules/base.xml.in.h:744
msgid "Kurdish (Syria, F)"
msgstr "Курдська (Сирія, F)"
-#: ../rules/base.xml.in.h:744
+#: ../rules/base.xml.in.h:745
msgid "Kurdish (Syria, Latin Alt-Q)"
msgstr "Курдська (Сирія, латиниця Alt-Q)"
#. Keyboard indicator for Tajik layouts
-#: ../rules/base.xml.in.h:746
+#: ../rules/base.xml.in.h:747
msgid "tg"
msgstr "tg"
-#: ../rules/base.xml.in.h:747
+#: ../rules/base.xml.in.h:748
msgid "Tajik"
msgstr "Таджицька"
-#: ../rules/base.xml.in.h:748
+#: ../rules/base.xml.in.h:749
msgid "Tajik (legacy)"
msgstr "Таджицька (застаріла)"
#. Keyboard indicator for Sinhala layouts
-#: ../rules/base.xml.in.h:750
+#: ../rules/base.xml.in.h:751
msgid "si"
msgstr "si"
-#: ../rules/base.xml.in.h:751
+#: ../rules/base.xml.in.h:752
msgid "Sinhala (phonetic)"
msgstr "Сингальська (фонетична)"
-#: ../rules/base.xml.in.h:752
+#: ../rules/base.xml.in.h:753
msgid "Tamil (Sri Lanka, Unicode)"
msgstr "Тамільська (Шрі-Ланка, Unicode)"
-#: ../rules/base.xml.in.h:753
+#: ../rules/base.xml.in.h:754
msgid "Tamil (Sri Lanka, TAB Typewriter)"
msgstr "Тамільська (Шрі-Ланка, TAB, машинопис)"
#. Keyboard indicator for Thai layouts
-#: ../rules/base.xml.in.h:755
+#: ../rules/base.xml.in.h:756
msgid "th"
msgstr "th"
-#: ../rules/base.xml.in.h:756
+#: ../rules/base.xml.in.h:757
msgid "Thai"
msgstr "Тайська"
-#: ../rules/base.xml.in.h:757
+#: ../rules/base.xml.in.h:758
msgid "Thai (TIS-820.2538)"
msgstr "Тайська (TIS-820.2538)"
-#: ../rules/base.xml.in.h:758
+#: ../rules/base.xml.in.h:759
msgid "Thai (Pattachote)"
msgstr "Тайська (паттачот)"
#. Keyboard indicator for Turkish layouts
-#: ../rules/base.xml.in.h:760 ../rules/base.extras.xml.in.h:118
+#: ../rules/base.xml.in.h:761 ../rules/base.extras.xml.in.h:119
msgid "tr"
msgstr "tr"
-#: ../rules/base.xml.in.h:761 ../rules/base.extras.xml.in.h:119
+#: ../rules/base.xml.in.h:762 ../rules/base.extras.xml.in.h:120
msgid "Turkish"
msgstr "Турецька"
-#: ../rules/base.xml.in.h:762
+#: ../rules/base.xml.in.h:763
msgid "Turkish (F)"
msgstr "Турецька (F)"
-#: ../rules/base.xml.in.h:763
+#: ../rules/base.xml.in.h:764
msgid "Turkish (Alt-Q)"
msgstr "Турецька (Alt-Q)"
-#: ../rules/base.xml.in.h:764
+#: ../rules/base.xml.in.h:765
msgid "Turkish (Sun dead keys)"
msgstr "Турецька (сліпі клавіші Sun)"
-#: ../rules/base.xml.in.h:765
+#: ../rules/base.xml.in.h:766
msgid "Kurdish (Turkey, Latin Q)"
msgstr "Курдська (Туреччина, латиниця Q)"
-#: ../rules/base.xml.in.h:766
+#: ../rules/base.xml.in.h:767
msgid "Kurdish (Turkey, F)"
msgstr "Курдська (Туреччина, F)"
-#: ../rules/base.xml.in.h:767
+#: ../rules/base.xml.in.h:768
msgid "Kurdish (Turkey, Latin Alt-Q)"
msgstr "Курдська (Туреччина, латиниця Alt-Q)"
-#: ../rules/base.xml.in.h:768
+#: ../rules/base.xml.in.h:769
msgid "Turkish (international with dead keys)"
msgstr "Турецька (інтернаціональна зі сліпими клавішами)"
#. Keyboard indicator for Crimean Tatar layouts
-#: ../rules/base.xml.in.h:770 ../rules/base.extras.xml.in.h:47
+#: ../rules/base.xml.in.h:771 ../rules/base.extras.xml.in.h:48
msgid "crh"
msgstr "crh"
-#: ../rules/base.xml.in.h:771
+#: ../rules/base.xml.in.h:772
msgid "Crimean Tatar (Turkish Q)"
msgstr "Кримськотатарська (турецька Q)"
-#: ../rules/base.xml.in.h:772
+#: ../rules/base.xml.in.h:773
msgid "Crimean Tatar (Turkish F)"
msgstr "Кримськотатарська (турецька F)"
-#: ../rules/base.xml.in.h:773
+#: ../rules/base.xml.in.h:774
msgid "Crimean Tatar (Turkish Alt-Q)"
msgstr "Кримськотатарська (турецька Alt-Q)"
-#: ../rules/base.xml.in.h:774
+#: ../rules/base.xml.in.h:775
msgid "Taiwanese"
msgstr "Тайванська"
-#: ../rules/base.xml.in.h:775
+#: ../rules/base.xml.in.h:776
msgid "Taiwanese (indigenous)"
msgstr "Тайванська (місцева)"
#. Keyboard indicator for Saisiyat layouts
-#: ../rules/base.xml.in.h:777
+#: ../rules/base.xml.in.h:778
msgid "xsy"
msgstr "xsy"
-#: ../rules/base.xml.in.h:778
+#: ../rules/base.xml.in.h:779
msgid "Saisiyat (Taiwan)"
msgstr "Сайсіят (Тайвань)"
#. Keyboard indicator for Ukranian layouts
-#: ../rules/base.xml.in.h:780 ../rules/base.extras.xml.in.h:121
+#: ../rules/base.xml.in.h:781 ../rules/base.extras.xml.in.h:122
msgid "uk"
msgstr "uk"
-#: ../rules/base.xml.in.h:781 ../rules/base.extras.xml.in.h:122
+#: ../rules/base.xml.in.h:782 ../rules/base.extras.xml.in.h:123
msgid "Ukrainian"
msgstr "Українська"
-#: ../rules/base.xml.in.h:782
+#: ../rules/base.xml.in.h:783
msgid "Ukrainian (phonetic)"
msgstr "Українська (фонетична)"
-#: ../rules/base.xml.in.h:783
+#: ../rules/base.xml.in.h:784
msgid "Ukrainian (typewriter)"
msgstr "Українська (друкарська машинка)"
-#: ../rules/base.xml.in.h:784
+#: ../rules/base.xml.in.h:785
msgid "Ukrainian (WinKeys)"
msgstr "Українська (з клавішами Win)"
-#: ../rules/base.xml.in.h:785
+#: ../rules/base.xml.in.h:786
msgid "Ukrainian (legacy)"
msgstr "Українська (застаріла)"
-#: ../rules/base.xml.in.h:786
+#: ../rules/base.xml.in.h:787
msgid "Ukrainian (standard RSTU)"
msgstr "Українська (стандартна RSTU)"
-#: ../rules/base.xml.in.h:787
+#: ../rules/base.xml.in.h:788
msgid "Russian (Ukraine, standard RSTU)"
msgstr "Російська (Україна, стандартна RSTU)"
-#: ../rules/base.xml.in.h:788
+#: ../rules/base.xml.in.h:789
msgid "Ukrainian (homophonic)"
msgstr "Українська (гомофонна)"
-#: ../rules/base.xml.in.h:789 ../rules/base.extras.xml.in.h:124
+#: ../rules/base.xml.in.h:790 ../rules/base.extras.xml.in.h:125
msgid "English (UK)"
msgstr "Англійська (Великобританія)"
-#: ../rules/base.xml.in.h:790
+#: ../rules/base.xml.in.h:791
msgid "English (UK, extended WinKeys)"
msgstr "Англійська (Великобританія, розширена, з клавішами Win)"
-#: ../rules/base.xml.in.h:791
+#: ../rules/base.xml.in.h:792
msgid "English (UK, international with dead keys)"
msgstr "Англійська (Великобританія, інтернаціональна зі сліпими клавішами)"
-#: ../rules/base.xml.in.h:792
+#: ../rules/base.xml.in.h:793
msgid "English (UK, Dvorak)"
msgstr "Англійська (Великобританія, Дворак)"
-#: ../rules/base.xml.in.h:793
+#: ../rules/base.xml.in.h:794
msgid "English (UK, Dvorak with UK punctuation)"
msgstr "Англійська (Великобританія, Дворак з британською пунктуацією)"
-#: ../rules/base.xml.in.h:794
+#: ../rules/base.xml.in.h:795
msgid "English (UK, Macintosh)"
msgstr "Англійська (Великобританія, Macintosh)"
-#: ../rules/base.xml.in.h:795
+#: ../rules/base.xml.in.h:796
msgid "English (UK, Macintosh international)"
msgstr "Англійська (Великобританія, інтернаціональна Macintosh)"
-#: ../rules/base.xml.in.h:796
+#: ../rules/base.xml.in.h:797
msgid "English (UK, Colemak)"
msgstr "Англійська (США, Коулмак)"
-#: ../rules/base.xml.in.h:797
+#: ../rules/base.xml.in.h:798
msgid "Uzbek"
msgstr "Узбецька"
-#: ../rules/base.xml.in.h:798
+#: ../rules/base.xml.in.h:799
msgid "Uzbek (Latin)"
msgstr "Узбецька (латиниця)"
#. Keyboard indicator for Vietnamese layouts
-#: ../rules/base.xml.in.h:800
+#: ../rules/base.xml.in.h:801
msgid "vi"
msgstr "vi"
-#: ../rules/base.xml.in.h:801
+#: ../rules/base.xml.in.h:802
msgid "Vietnamese"
msgstr "В'єтнамська"
#. Keyboard indicator for Korean layouts
-#: ../rules/base.xml.in.h:803 ../rules/base.extras.xml.in.h:126
+#: ../rules/base.xml.in.h:804 ../rules/base.extras.xml.in.h:127
msgid "ko"
msgstr "ko"
-#: ../rules/base.xml.in.h:804 ../rules/base.extras.xml.in.h:127
+#: ../rules/base.xml.in.h:805 ../rules/base.extras.xml.in.h:128
msgid "Korean"
msgstr "Корейська"
-#: ../rules/base.xml.in.h:805
+#: ../rules/base.xml.in.h:806
msgid "Korean (101/104 key compatible)"
msgstr "Корейська (сумісна з 101/104 клавішною)"
-#: ../rules/base.xml.in.h:806
+#: ../rules/base.xml.in.h:807
msgid "Japanese (PC-98xx Series)"
msgstr "Японська (родина PC-98xx)"
#. Keyboard indicator for Irish layouts
-#: ../rules/base.xml.in.h:808
+#: ../rules/base.xml.in.h:809
msgid "ie"
msgstr "ie"
-#: ../rules/base.xml.in.h:809
+#: ../rules/base.xml.in.h:810
msgid "Irish"
msgstr "Ірландська"
-#: ../rules/base.xml.in.h:810
+#: ../rules/base.xml.in.h:811
msgid "CloGaelach"
msgstr "Гаельський шрифт"
-#: ../rules/base.xml.in.h:811
+#: ../rules/base.xml.in.h:812
msgid "Irish (UnicodeExpert)"
msgstr "Ірландська (UnicodeExpert)"
-#: ../rules/base.xml.in.h:812
+#: ../rules/base.xml.in.h:813
msgid "Ogham"
msgstr "Огам"
-#: ../rules/base.xml.in.h:813
+#: ../rules/base.xml.in.h:814
msgid "Ogham (IS434)"
msgstr "Огам (IS434)"
-#: ../rules/base.xml.in.h:814
+#: ../rules/base.xml.in.h:815
msgid "Urdu (Pakistan)"
msgstr "Урду (Пакистан)"
-#: ../rules/base.xml.in.h:815
+#: ../rules/base.xml.in.h:816
msgid "Urdu (Pakistan, CRULP)"
msgstr "Урду (Пакистан, CRULP)"
-#: ../rules/base.xml.in.h:816
+#: ../rules/base.xml.in.h:817
msgid "Urdu (Pakistan, NLA)"
msgstr "Урду (Пакистан, NLA)"
-#: ../rules/base.xml.in.h:817
+#: ../rules/base.xml.in.h:818
msgid "Arabic (Pakistan)"
msgstr "Арабська (Пакистан)"
#. Keyboard indicator for Sindhi layouts
-#: ../rules/base.xml.in.h:819
+#: ../rules/base.xml.in.h:820
msgid "sd"
msgstr "sd"
-#: ../rules/base.xml.in.h:820
+#: ../rules/base.xml.in.h:821
msgid "Sindhi"
msgstr "Синдхі"
#. Keyboard indicator for Dhivehi layouts
-#: ../rules/base.xml.in.h:822
+#: ../rules/base.xml.in.h:823
msgid "dv"
msgstr "dv"
-#: ../rules/base.xml.in.h:823
+#: ../rules/base.xml.in.h:824
msgid "Dhivehi"
msgstr "Мальдивська"
-#: ../rules/base.xml.in.h:824
+#: ../rules/base.xml.in.h:825
msgid "English (South Africa)"
msgstr "Англійська (ПАР)"
#. Keyboard indicator for Esperanto layouts
-#: ../rules/base.xml.in.h:826
+#: ../rules/base.xml.in.h:827
msgid "eo"
msgstr "eo"
-#: ../rules/base.xml.in.h:827
+#: ../rules/base.xml.in.h:828
msgid "Esperanto"
msgstr "Есперанто"
-#: ../rules/base.xml.in.h:828
+#: ../rules/base.xml.in.h:829
msgid "Esperanto (displaced semicolon and quote, obsolete)"
msgstr "Есперанто (посунута крапка з комою та лапки, застаріла)"
#. Keyboard indicator for Nepali layouts
-#: ../rules/base.xml.in.h:830
+#: ../rules/base.xml.in.h:831
msgid "ne"
msgstr "ne"
-#: ../rules/base.xml.in.h:831
+#: ../rules/base.xml.in.h:832
msgid "Nepali"
msgstr "Непальська"
-#: ../rules/base.xml.in.h:832
+#: ../rules/base.xml.in.h:833
msgid "English (Nigeria)"
msgstr "Англійська (Нігерія)"
#. Keyboard indicator for Igbo layouts
-#: ../rules/base.xml.in.h:834
+#: ../rules/base.xml.in.h:835
msgid "ig"
msgstr "ig"
-#: ../rules/base.xml.in.h:835
+#: ../rules/base.xml.in.h:836
msgid "Igbo"
msgstr "Igbo"
#. Keyboard indicator for Yoruba layouts
-#: ../rules/base.xml.in.h:837
+#: ../rules/base.xml.in.h:838
msgid "yo"
msgstr "yo"
-#: ../rules/base.xml.in.h:838
+#: ../rules/base.xml.in.h:839
msgid "Yoruba"
msgstr "Йоруба"
#. Keyboard indicator for Amharic layouts
-#: ../rules/base.xml.in.h:840
+#: ../rules/base.xml.in.h:841
msgid "am"
msgstr "am"
-#: ../rules/base.xml.in.h:841
+#: ../rules/base.xml.in.h:842
msgid "Amharic"
msgstr "Амхарська"
#. Keyboard indicator for Wolof layouts
-#: ../rules/base.xml.in.h:843
+#: ../rules/base.xml.in.h:844
msgid "wo"
msgstr "wo"
-#: ../rules/base.xml.in.h:844
+#: ../rules/base.xml.in.h:845
msgid "Wolof"
msgstr "Волоф"
#. Keyboard indicator for Braille layouts
-#: ../rules/base.xml.in.h:846
+#: ../rules/base.xml.in.h:847
msgid "brl"
msgstr "brl"
-#: ../rules/base.xml.in.h:847
+#: ../rules/base.xml.in.h:848
msgid "Braille"
msgstr "Брайля"
-#: ../rules/base.xml.in.h:848
+#: ../rules/base.xml.in.h:849
msgid "Braille (left hand)"
msgstr "Брайля (для шульги)"
-#: ../rules/base.xml.in.h:849
+#: ../rules/base.xml.in.h:850
msgid "Braille (right hand)"
msgstr "Брайль (для правші)"
#. Keyboard indicator for Turkmen layouts
-#: ../rules/base.xml.in.h:851
+#: ../rules/base.xml.in.h:852
msgid "tk"
msgstr "tk"
-#: ../rules/base.xml.in.h:852
+#: ../rules/base.xml.in.h:853
msgid "Turkmen"
msgstr "Туркменська"
-#: ../rules/base.xml.in.h:853
+#: ../rules/base.xml.in.h:854
msgid "Turkmen (Alt-Q)"
msgstr "Туркменська (Alt-Q)"
#. Keyboard indicator for Bambara layouts
-#: ../rules/base.xml.in.h:855
+#: ../rules/base.xml.in.h:856
msgid "bm"
msgstr "bm"
-#: ../rules/base.xml.in.h:856
+#: ../rules/base.xml.in.h:857
msgid "Bambara"
msgstr "Бамбара"
-#: ../rules/base.xml.in.h:857
+#: ../rules/base.xml.in.h:858
msgid "French (Mali, alternative)"
msgstr "Французька (Малі, альтернативна)"
-#: ../rules/base.xml.in.h:858
+#: ../rules/base.xml.in.h:859
msgid "English (Mali, US Macintosh)"
msgstr "Англійська (Малі, Macintosh США)"
-#: ../rules/base.xml.in.h:859
+#: ../rules/base.xml.in.h:860
msgid "English (Mali, US international)"
msgstr "Англійська (Малі, інтернаціональна США)"
#. Keyboard indicator for Swahili layouts
-#: ../rules/base.xml.in.h:861
+#: ../rules/base.xml.in.h:862
msgid "sw"
msgstr "sw"
-#: ../rules/base.xml.in.h:862
+#: ../rules/base.xml.in.h:863
msgid "Swahili (Tanzania)"
msgstr "Суахілі (Танзанія)"
-#: ../rules/base.xml.in.h:863
+#: ../rules/base.xml.in.h:864
msgid "Swahili (Kenya)"
msgstr "Суахілі (Кенія)"
-#: ../rules/base.xml.in.h:864
+#: ../rules/base.xml.in.h:865
msgid "Kikuyu"
msgstr "Кікуйю"
#. Keyboard indicator for Tswana layouts
-#: ../rules/base.xml.in.h:866
+#: ../rules/base.xml.in.h:867
msgid "tn"
msgstr "tn"
-#: ../rules/base.xml.in.h:867
+#: ../rules/base.xml.in.h:868
msgid "Tswana"
msgstr "Тсвана"
#. Keyboard indicator for Filipino layouts
-#: ../rules/base.xml.in.h:869
+#: ../rules/base.xml.in.h:870
msgid "ph"
msgstr "ph"
-#: ../rules/base.xml.in.h:870
+#: ../rules/base.xml.in.h:871
msgid "Filipino"
msgstr "Філіппінська"
-#: ../rules/base.xml.in.h:871
+#: ../rules/base.xml.in.h:872
msgid "Filipino (QWERTY Baybayin)"
msgstr "Філіппінська (QWERTY, байбаїн)"
-#: ../rules/base.xml.in.h:872
+#: ../rules/base.xml.in.h:873
msgid "Filipino (Capewell-Dvorak Latin)"
msgstr "Філіппінська (Кейпвелл-Дворак, латиниця)"
-#: ../rules/base.xml.in.h:873
+#: ../rules/base.xml.in.h:874
msgid "Filipino (Capewell-Dvorak Baybayin)"
msgstr "Філіппінська (Кейпвелл-Дворак, байбаїн)"
-#: ../rules/base.xml.in.h:874
+#: ../rules/base.xml.in.h:875
msgid "Filipino (Capewell-QWERF 2006 Latin)"
msgstr "Філіппінська (Кейпвелл-QWERF 2006, латиниця)"
-#: ../rules/base.xml.in.h:875
+#: ../rules/base.xml.in.h:876
msgid "Filipino (Capewell-QWERF 2006 Baybayin)"
msgstr "Філіппінська (Кейпвелл-QWERF 2006, байбаїн)"
-#: ../rules/base.xml.in.h:876
+#: ../rules/base.xml.in.h:877
msgid "Filipino (Colemak Latin)"
msgstr "Філіппінська (Коулмак, латиниця)"
-#: ../rules/base.xml.in.h:877
+#: ../rules/base.xml.in.h:878
msgid "Filipino (Colemak Baybayin)"
msgstr "Філіппінська (Коулмак, байбаїн)"
-#: ../rules/base.xml.in.h:878
+#: ../rules/base.xml.in.h:879
msgid "Filipino (Dvorak Latin)"
msgstr "Філіппінська (Дворак, латиниця)"
-#: ../rules/base.xml.in.h:879
+#: ../rules/base.xml.in.h:880
msgid "Filipino (Dvorak Baybayin)"
msgstr "Філіппінська (Дворат, байбаїн)"
-#: ../rules/base.xml.in.h:880
+#: ../rules/base.xml.in.h:881
msgid "md"
msgstr "md"
-#: ../rules/base.xml.in.h:881
+#: ../rules/base.xml.in.h:882
msgid "Moldavian"
msgstr "Молдавська"
-#: ../rules/base.xml.in.h:882
+#: ../rules/base.xml.in.h:883
msgid "gag"
msgstr "gag"
-#: ../rules/base.xml.in.h:883
+#: ../rules/base.xml.in.h:884
msgid "Moldavian (Gagauz)"
msgstr "Молдавська (гагаузька)"
-#: ../rules/base.xml.in.h:884
+#: ../rules/base.xml.in.h:885
msgid "Switching to another layout"
msgstr "Перемикання на іншу розкладку"
-#: ../rules/base.xml.in.h:885
+#: ../rules/base.xml.in.h:886
msgid "Right Alt (while pressed)"
msgstr "Права клавіша Alt (поки натиснена)"
-#: ../rules/base.xml.in.h:886
+#: ../rules/base.xml.in.h:887
msgid "Left Alt (while pressed)"
msgstr "Ліва клавіша Alt (поки натиснена)"
-#: ../rules/base.xml.in.h:887
+#: ../rules/base.xml.in.h:888
msgid "Left Win (while pressed)"
msgstr "Ліва клавіша Win (поки натиснута)"
-#: ../rules/base.xml.in.h:888
+#: ../rules/base.xml.in.h:889
msgid "Right Win (while pressed)"
msgstr "Права клавіша Win (поки натиснена)"
-#: ../rules/base.xml.in.h:889
+#: ../rules/base.xml.in.h:890
msgid "Any Win key (while pressed)"
msgstr "Будь-яка клавіша Win (на час натискання)"
-#: ../rules/base.xml.in.h:890
+#: ../rules/base.xml.in.h:891
msgid "Caps Lock (while pressed), Alt+Caps Lock does the original capslock action"
msgstr "Caps Lock (поки натиснена), Alt+Caps Lock виконує оригінальну функцію capslock"
-#: ../rules/base.xml.in.h:891
+#: ../rules/base.xml.in.h:892
msgid "Right Ctrl (while pressed)"
msgstr "Права клавіша Ctrl (поки натиснута)"
-#: ../rules/base.xml.in.h:892
+#: ../rules/base.xml.in.h:893
msgid "Right Alt"
msgstr "Права клавіша Alt"
-#: ../rules/base.xml.in.h:893
+#: ../rules/base.xml.in.h:894
msgid "Left Alt"
msgstr "Ліва клавіша Alt"
-#: ../rules/base.xml.in.h:894
+#: ../rules/base.xml.in.h:895
msgid "Caps Lock"
msgstr "Caps Lock"
-#: ../rules/base.xml.in.h:895
+#: ../rules/base.xml.in.h:896
msgid "Shift+Caps Lock"
msgstr "Shift+Caps Lock"
-#: ../rules/base.xml.in.h:896
+#: ../rules/base.xml.in.h:897
msgid "Caps Lock (to first layout), Shift+Caps Lock (to last layout)"
msgstr "Caps Lock (на першу розкладку), Shift+Caps Lock (на останню розкладку)"
-#: ../rules/base.xml.in.h:897
+#: ../rules/base.xml.in.h:898
msgid "Left Win (to first layout), Right Win/Menu (to last layout)"
msgstr "Ліва Win (на першу розкладку), Права Win/Menu (на останню розкладку)"
-#: ../rules/base.xml.in.h:898
+#: ../rules/base.xml.in.h:899
msgid "Left Ctrl (to first layout), Right Ctrl (to last layout)"
msgstr "Ліва Ctrl (на першу розкладку), Правий Ctrl (на останню розкладку)"
-#: ../rules/base.xml.in.h:899
+#: ../rules/base.xml.in.h:900
msgid "Alt+Caps Lock"
msgstr "Alt+Caps Lock"
-#: ../rules/base.xml.in.h:900
+#: ../rules/base.xml.in.h:901
msgid "Both Shift keys together"
msgstr "Обидві клавіші Shift разом"
-#: ../rules/base.xml.in.h:901
+#: ../rules/base.xml.in.h:902
msgid "Both Alt keys together"
msgstr "Обидві клавіші Alt разом"
-#: ../rules/base.xml.in.h:902
+#: ../rules/base.xml.in.h:903
msgid "Both Ctrl keys together"
msgstr "Обидві клавіші Ctrl разом"
-#: ../rules/base.xml.in.h:903
+#: ../rules/base.xml.in.h:904
msgid "Ctrl+Shift"
msgstr "Ctrl+Shift"
-#: ../rules/base.xml.in.h:904
+#: ../rules/base.xml.in.h:905
msgid "Left Ctrl+Left Shift"
msgstr "Лівий Ctrl+Лівий Shift"
-#: ../rules/base.xml.in.h:905
+#: ../rules/base.xml.in.h:906
msgid "Right Ctrl+Right Shift"
msgstr "Права Ctrl+Права Shift"
-#: ../rules/base.xml.in.h:906
+#: ../rules/base.xml.in.h:907
msgid "Alt+Ctrl"
msgstr "Alt+Ctrl"
-#: ../rules/base.xml.in.h:907
+#: ../rules/base.xml.in.h:908
msgid "Alt+Shift"
msgstr "Alt+Shift"
-#: ../rules/base.xml.in.h:908
+#: ../rules/base.xml.in.h:909
msgid "Left Alt+Left Shift"
msgstr "Лівий Alt+Лівий Shift"
-#: ../rules/base.xml.in.h:909
+#: ../rules/base.xml.in.h:910
msgid "Alt+Space"
msgstr "Alt+Пробіл"
-#: ../rules/base.xml.in.h:910
+#: ../rules/base.xml.in.h:911
msgid "Menu"
msgstr "Menu"
-#: ../rules/base.xml.in.h:911
+#: ../rules/base.xml.in.h:912
msgid "Left Win"
msgstr "Ліва клавіша Win"
-#: ../rules/base.xml.in.h:912
+#: ../rules/base.xml.in.h:913
msgid "Right Win"
msgstr "Права клавіша Win"
-#: ../rules/base.xml.in.h:913
+#: ../rules/base.xml.in.h:914
msgid "Left Shift"
msgstr "Ліва клавіша Shift"
-#: ../rules/base.xml.in.h:914
+#: ../rules/base.xml.in.h:915
msgid "Right Shift"
msgstr "Права клавіша Shift"
-#: ../rules/base.xml.in.h:915
+#: ../rules/base.xml.in.h:916
msgid "Left Ctrl"
msgstr "Ліва клавіша Ctrl"
-#: ../rules/base.xml.in.h:916
+#: ../rules/base.xml.in.h:917
msgid "Right Ctrl"
msgstr "Права клавіша Ctrl"
-#: ../rules/base.xml.in.h:917
+#: ../rules/base.xml.in.h:918
msgid "Scroll Lock"
msgstr "Scroll Lock"
-#: ../rules/base.xml.in.h:918
+#: ../rules/base.xml.in.h:919
msgid "LeftCtrl+LeftWin (to first layout), RightCtrl+Menu (to second layout)"
msgstr "Ліва Ctrl+ліва Win (на першу розкладку), правий Ctrl+Menu (на другу розкладку)"
-#: ../rules/base.xml.in.h:919
+#: ../rules/base.xml.in.h:920
msgid "Key to choose 3rd level"
msgstr "Клавіша для вибору 3-го ряду"
-#: ../rules/base.xml.in.h:920
+#: ../rules/base.xml.in.h:921
msgid "Any Win key"
msgstr "Будь-яка клавіша Win"
-#: ../rules/base.xml.in.h:921
+#: ../rules/base.xml.in.h:922
msgid "Any Alt key"
msgstr "Будь-яка клавіша Alt"
-#: ../rules/base.xml.in.h:922
+#: ../rules/base.xml.in.h:923
msgid "Right Alt, Shift+Right Alt key is Compose"
msgstr "Правий Alt, Shift+правий Alt діють як Compose"
-#: ../rules/base.xml.in.h:923
+#: ../rules/base.xml.in.h:924
msgid "Right Alt key never chooses 3rd level"
msgstr "Права клавіша Alt ніколи не обирає 3-й рівень"
-#: ../rules/base.xml.in.h:924
+#: ../rules/base.xml.in.h:925
msgid "Enter on keypad"
msgstr "Enter на цифровій клавіатурі"
-#: ../rules/base.xml.in.h:925
+#: ../rules/base.xml.in.h:926
msgid "Backslash"
msgstr "Зворотна риска"
-#: ../rules/base.xml.in.h:926
+#: ../rules/base.xml.in.h:927
msgid "&lt;Less/Greater&gt;"
msgstr "&lt;Менше ніж/Більше ніж&gt;"
-#: ../rules/base.xml.in.h:927
+#: ../rules/base.xml.in.h:928
msgid "Caps Lock chooses 3rd level, acts as onetime lock when pressed together with another 3rd-level-chooser"
msgstr "Caps Lock вибирає 3-ій рівень, одноразовий вибір регістру, якщо натиснути разом зі іншою комбінацією вибору 3-го рівня"
-#: ../rules/base.xml.in.h:928
+#: ../rules/base.xml.in.h:929
msgid "Backslash chooses 3rd level, acts as onetime lock when pressed together with another 3rd-level-chooser"
msgstr "Зворотна похила риска вибирає 3-ій рівень, одноразовий вибір регістру, якщо натиснути разом зі іншою комбінацією вибору 3-го рівня"
-#: ../rules/base.xml.in.h:929
+#: ../rules/base.xml.in.h:930
msgid "&lt;Less/Greater&gt; chooses 3rd level, acts as onetime lock when pressed together with another 3rd-level-chooser"
msgstr "&lt;Менше/Більше&gt; вибирає 3-ій рівень, одноразовий вибір регістру, якщо натиснути разом зі іншою комбінацією вибору 3-го рівня"
-#: ../rules/base.xml.in.h:930
+#: ../rules/base.xml.in.h:931
msgid "Ctrl key position"
msgstr "Розташування клавіші Ctrl"
-#: ../rules/base.xml.in.h:931
+#: ../rules/base.xml.in.h:932
msgid "Caps Lock as Ctrl"
msgstr "Caps Lock працює як Ctrl"
-#: ../rules/base.xml.in.h:932
+#: ../rules/base.xml.in.h:933
msgid "Left Ctrl as Meta"
msgstr "Ліва клавіша Ctrl як Meta"
-#: ../rules/base.xml.in.h:933
+#: ../rules/base.xml.in.h:934
msgid "Swap Ctrl and Caps Lock"
msgstr "Поміняти місцями клавіші Ctrl та Caps Lock"
-#: ../rules/base.xml.in.h:934
+#: ../rules/base.xml.in.h:935
msgid "At left of 'A'"
msgstr "Ліворуч від 'A'"
-#: ../rules/base.xml.in.h:935
+#: ../rules/base.xml.in.h:936
msgid "At bottom left"
msgstr "Знизу ліворуч"
-#: ../rules/base.xml.in.h:936
+#: ../rules/base.xml.in.h:937
msgid "Right Ctrl as Right Alt"
msgstr "Права клавіша Ctrl працює як права клавіша Alt"
-#: ../rules/base.xml.in.h:937
+#: ../rules/base.xml.in.h:938
msgid "Menu as Right Ctrl"
msgstr "Menu працює як права клавіша Ctrl"
-#: ../rules/base.xml.in.h:938
+#: ../rules/base.xml.in.h:939
msgid "Right Alt as Right Ctrl"
msgstr "Права клавіша Alt працює як права клавіша Ctrl"
-#: ../rules/base.xml.in.h:939
+#: ../rules/base.xml.in.h:940
+msgid "Swap Left Alt key with Left Ctrl key"
+msgstr "Поміняти місцями ліву клавішу Alt і ліву клавішу Ctrl"
+
+#: ../rules/base.xml.in.h:941
+msgid "Swap Left Win key with Left Ctrl key"
+msgstr "Поміняти місцями ліву клавішу Win і ліву клавішу Ctrl"
+
+#: ../rules/base.xml.in.h:942
+msgid "Left Alt as Ctrl, Left Ctrl as Win, Left Win as Alt"
+msgstr "Ліва клавіша Alt працює як Ctrl, ліва Ctrl — як Win, ліва Win — як Alt"
+
+#: ../rules/base.xml.in.h:943
msgid "Use keyboard LED to show alternative layout"
msgstr "Використовувати клавіатурні індикатори для індикації альтернативних розкладок"
-#: ../rules/base.xml.in.h:940
+#: ../rules/base.xml.in.h:944
msgid "Num Lock"
msgstr "Num Lock"
-#: ../rules/base.xml.in.h:941
+#: ../rules/base.xml.in.h:945
msgid "Layout of numeric keypad"
msgstr "Розкладка цифрової клавіатури"
-#: ../rules/base.xml.in.h:942
+#: ../rules/base.xml.in.h:946
msgid "Legacy"
msgstr "Застаріла"
-#: ../rules/base.xml.in.h:943
+#: ../rules/base.xml.in.h:947
msgid "Unicode additions (arrows and math operators)"
msgstr "Доповнення Unicode (стрілки та математичні оператори)"
-#: ../rules/base.xml.in.h:944
+#: ../rules/base.xml.in.h:948
msgid "Unicode additions (arrows and math operators; math operators on default level)"
msgstr "Доповнення Unicode (стрілки та математичні оператори; математичні оператори на типовому рівні)"
-#: ../rules/base.xml.in.h:945
+#: ../rules/base.xml.in.h:949
msgid "Legacy Wang 724"
msgstr "Стара Wang 724"
-#: ../rules/base.xml.in.h:946
+#: ../rules/base.xml.in.h:950
msgid "Wang 724 keypad with Unicode additions (arrows and math operators)"
msgstr "Клавіатура Wang 724 з доповненнями Unicode (стрілки та математичні оператори)"
-#: ../rules/base.xml.in.h:947
+#: ../rules/base.xml.in.h:951
msgid "Wang 724 keypad with Unicode additions (arrows and math operators; math operators on default level)"
msgstr "Клавіатура Wang 724 з доповненнями Unicode (стрілки та математичні оператори). Математичні операції на типовому рівні"
-#: ../rules/base.xml.in.h:948
+#: ../rules/base.xml.in.h:952
msgid "Hexadecimal"
msgstr "Шістнадцяткова"
-#: ../rules/base.xml.in.h:949
+#: ../rules/base.xml.in.h:953
msgid "ATM/phone-style"
msgstr "У стилі банкоматної/телефонної"
-#: ../rules/base.xml.in.h:950
+#: ../rules/base.xml.in.h:954
msgid "Numeric keypad delete key behaviour"
msgstr "Вибір поведінки клавіші del на цифровій клавіатурі"
-#: ../rules/base.xml.in.h:951
+#: ../rules/base.xml.in.h:955
msgid "Legacy key with dot"
msgstr "Застаріла клавіша з крапкою"
#. Actually, with KP_SEPARATOR, as the old keypad(comma)
-#: ../rules/base.xml.in.h:953
+#: ../rules/base.xml.in.h:957
msgid "Legacy key with comma"
msgstr "Застаріла клавіша з комою"
-#: ../rules/base.xml.in.h:954
+#: ../rules/base.xml.in.h:958
msgid "Four-level key with dot"
msgstr "Клавіша четвертого рівня з крапкою"
-#: ../rules/base.xml.in.h:955
+#: ../rules/base.xml.in.h:959
msgid "Four-level key with dot, Latin-9 only"
msgstr "Клавіша четвертого рівня з крапкою, обмежена Latin-9"
-#: ../rules/base.xml.in.h:956
+#: ../rules/base.xml.in.h:960
msgid "Four-level key with comma"
msgstr "Клавіша четвертого рівня з комою"
-#: ../rules/base.xml.in.h:957
+#: ../rules/base.xml.in.h:961
msgid "Four-level key with momayyez"
msgstr "Клавіша четвертого рівня з momayyez"
#. This assumes the KP_ abstract symbols are actually useful for some apps
#. The description needs to be rewritten
-#: ../rules/base.xml.in.h:960
+#: ../rules/base.xml.in.h:964
msgid "Four-level key with abstract separators"
msgstr "Клавіша четвертого рівня з абстрактним розділювачем "
-#: ../rules/base.xml.in.h:961
+#: ../rules/base.xml.in.h:965
msgid "Semicolon on third level"
msgstr "Крапка з комою на третьому рівні"
-#: ../rules/base.xml.in.h:962
+#: ../rules/base.xml.in.h:966
msgid "Caps Lock key behavior"
msgstr "Поведінка клавіші Caps Lock"
-#: ../rules/base.xml.in.h:963
+#: ../rules/base.xml.in.h:967
msgid "Caps Lock uses internal capitalization; Shift \"pauses\" Caps Lock"
msgstr "Caps Lock вмикає внутрішню капіталізацію. Shift призупиняє дію Caps Lock"
-#: ../rules/base.xml.in.h:964
+#: ../rules/base.xml.in.h:968
msgid "Caps Lock uses internal capitalization; Shift doesn't affect Caps Lock"
msgstr "Caps Lock вмикає внутрішню капіталізацію. Shift не впливає на Caps Lock"
-#: ../rules/base.xml.in.h:965
+#: ../rules/base.xml.in.h:969
msgid "Caps Lock acts as Shift with locking; Shift \"pauses\" Caps Lock"
msgstr "Caps Lock дія як Shift з блокуванням. Shift призупиняє дію Caps Lock"
-#: ../rules/base.xml.in.h:966
+#: ../rules/base.xml.in.h:970
msgid "Caps Lock acts as Shift with locking; Shift doesn't affect Caps Lock"
msgstr "Caps Lock діє як Shift з блокуванням. Shift не впливає на Caps Lock"
-#: ../rules/base.xml.in.h:967
+#: ../rules/base.xml.in.h:971
msgid "Caps Lock toggles normal capitalization of alphabetic characters"
msgstr "Caps Lock вмикає звичайну капіталізацію символів алфавіту"
-#: ../rules/base.xml.in.h:968
+#: ../rules/base.xml.in.h:972
msgid "Make Caps Lock an additional Num Lock"
msgstr "Caps Lock — додаткова клавіша Num Lock"
-#: ../rules/base.xml.in.h:969
+#: ../rules/base.xml.in.h:973
msgid "Swap ESC and Caps Lock"
msgstr "Поміняти місцями клавіші ESC та Caps Lock"
-#: ../rules/base.xml.in.h:970
+#: ../rules/base.xml.in.h:974
msgid "Make Caps Lock an additional ESC"
msgstr "Caps Lock — додаткова клавіша ESC"
-#: ../rules/base.xml.in.h:971
+#: ../rules/base.xml.in.h:975
msgid "Make Caps Lock an additional Backspace"
msgstr "Caps Lock — додаткова клавіша Backspace"
-#: ../rules/base.xml.in.h:972
+#: ../rules/base.xml.in.h:976
msgid "Make Caps Lock an additional Super"
msgstr "Caps Lock — додаткова клавіша Super"
-#: ../rules/base.xml.in.h:973
+#: ../rules/base.xml.in.h:977
msgid "Make Caps Lock an additional Hyper"
msgstr "Caps Lock — додаткова клавіша Hyper"
-#: ../rules/base.xml.in.h:974
+#: ../rules/base.xml.in.h:978
msgid "Caps Lock toggles ShiftLock (affects all keys)"
msgstr "Caps Lock перемикає Shift (діє одразу на всі клавіші)"
-#: ../rules/base.xml.in.h:975
+#: ../rules/base.xml.in.h:979
msgid "Caps Lock is disabled"
msgstr "Caps Lock вимкнено"
-#: ../rules/base.xml.in.h:976
+#: ../rules/base.xml.in.h:980
msgid "Make Caps Lock an additional Ctrl"
msgstr "Caps Lock — додаткова клавіша Ctrl"
-#: ../rules/base.xml.in.h:977
+#: ../rules/base.xml.in.h:981
msgid "Alt/Win key behavior"
msgstr "Поведінка клавіш Alt/Win"
-#: ../rules/base.xml.in.h:978
+#: ../rules/base.xml.in.h:982
msgid "Add the standard behavior to Menu key"
msgstr "Додати звичайну поведінку на клавішу Menu"
-#: ../rules/base.xml.in.h:979
+#: ../rules/base.xml.in.h:983
msgid "Alt and Meta are on Alt keys"
msgstr "Alt та Meta на клавішах Alt"
-#: ../rules/base.xml.in.h:980
+#: ../rules/base.xml.in.h:984
msgid "Alt is mapped to Win keys (and the usual Alt keys)"
msgstr "Alt використовуються як Win (і як звичайні Alt)"
-#: ../rules/base.xml.in.h:981
+#: ../rules/base.xml.in.h:985
msgid "Ctrl is mapped to Win keys (and the usual Ctrl keys)"
msgstr "Ctrl використовується як Win (і як звичайний Ctrl)"
-#: ../rules/base.xml.in.h:982
+#: ../rules/base.xml.in.h:986
msgid "Ctrl is mapped to Alt keys, Alt is mapped to Win keys"
msgstr "Ctrl використовується як клавіші Alt, Alt використовується як Win"
-#: ../rules/base.xml.in.h:983
+#: ../rules/base.xml.in.h:987
msgid "Meta is mapped to Win keys"
msgstr "Meta відповідає клавішам Win"
-#: ../rules/base.xml.in.h:984
+#: ../rules/base.xml.in.h:988
msgid "Meta is mapped to Left Win"
msgstr "Meta відповідає лівій клавіші Win"
-#: ../rules/base.xml.in.h:985
+#: ../rules/base.xml.in.h:989
msgid "Hyper is mapped to Win-keys"
msgstr "Hyper відповідає клавішам Win"
-#: ../rules/base.xml.in.h:986
+#: ../rules/base.xml.in.h:990
msgid "Alt is mapped to Right Win, Super to Menu"
msgstr "Клавіша Alt відповідає правій клавіші Win, а Super - клавіші Menu."
-#: ../rules/base.xml.in.h:987
+#: ../rules/base.xml.in.h:991
msgid "Alt is swapped with Win"
msgstr "Alt міняється з клавішею Win"
-#: ../rules/base.xml.in.h:988
+#: ../rules/base.xml.in.h:992
msgid "Position of Compose key"
msgstr "Розташування клавіші Compose"
-#: ../rules/base.xml.in.h:989
+#: ../rules/base.xml.in.h:993
msgid "3rd level of Left Win"
msgstr "3-ій рівень лівої Win"
-#: ../rules/base.xml.in.h:990
+#: ../rules/base.xml.in.h:994
msgid "3rd level of Right Win"
msgstr "3-ій рівень правої Win"
-#: ../rules/base.xml.in.h:991
+#: ../rules/base.xml.in.h:995
msgid "3rd level of Menu"
msgstr "3-ій рівень клавіші меню"
-#: ../rules/base.xml.in.h:992
+#: ../rules/base.xml.in.h:996
msgid "3rd level of Left Ctrl"
msgstr "3-ій рівень лівої Ctrl"
-#: ../rules/base.xml.in.h:993
+#: ../rules/base.xml.in.h:997
msgid "3rd level of Right Ctrl"
msgstr "3-ій рівень правої Ctrl"
-#: ../rules/base.xml.in.h:994
+#: ../rules/base.xml.in.h:998
msgid "3rd level of Caps Lock"
msgstr "3-ій рівень Caps Lock"
-#: ../rules/base.xml.in.h:995
+#: ../rules/base.xml.in.h:999
msgid "3rd level of &lt;Less/Greater&gt;"
msgstr "3-ій рівень &lt;Менше/Більше&gt;"
-#: ../rules/base.xml.in.h:996
+#: ../rules/base.xml.in.h:1000
msgid "Pause"
msgstr "Pause"
-#: ../rules/base.xml.in.h:997
+#: ../rules/base.xml.in.h:1001
msgid "PrtSc"
msgstr "PrtSc"
-#: ../rules/base.xml.in.h:998
+#: ../rules/base.xml.in.h:1002
msgid "Miscellaneous compatibility options"
msgstr "Різні параметри сумісності"
-#: ../rules/base.xml.in.h:999
+#: ../rules/base.xml.in.h:1003
msgid "Default numeric keypad keys"
msgstr "Типові клавіші цифрової клавіатури"
-#: ../rules/base.xml.in.h:1000
+#: ../rules/base.xml.in.h:1004
msgid "Numeric keypad keys always enter digits (as in Mac OS)"
msgstr "За допомогою цифрова клавіатура вводяться лише цифри (як у Mac OS)"
-#: ../rules/base.xml.in.h:1001
+#: ../rules/base.xml.in.h:1005
msgid "Shift with numeric keypad keys works as in MS Windows"
msgstr "Shift з цифровою клавіатурою працює як у Microsoft Windows"
-#: ../rules/base.xml.in.h:1002
+#: ../rules/base.xml.in.h:1006
msgid "Shift does not cancel Num Lock, chooses 3rd level instead"
msgstr "Shift не скасовує Num Lock, а вибирає третій рівень"
-#: ../rules/base.xml.in.h:1003
+#: ../rules/base.xml.in.h:1007
msgid "Special keys (Ctrl+Alt+&lt;key&gt;) handled in a server"
msgstr "Сліпі клавіші (Ctrl+Alt+&lt;key&gt;) обробляються на сервері"
-#: ../rules/base.xml.in.h:1004
+#: ../rules/base.xml.in.h:1008
msgid "Apple Aluminium Keyboard: emulate PC keys (Print, Scroll Lock, Pause, Num Lock)"
msgstr "Клавіатура Apple Aluminium (емуляція клавіш ПК: Print, Scroll Lock, Pause, Num Lock)"
-#: ../rules/base.xml.in.h:1005
+#: ../rules/base.xml.in.h:1009
msgid "Shift cancels Caps Lock"
msgstr "Shift скасовує Caps Lock"
-#: ../rules/base.xml.in.h:1006
+#: ../rules/base.xml.in.h:1010
msgid "Enable extra typographic characters"
msgstr "Увімкнути додаткові типографські символи"
-#: ../rules/base.xml.in.h:1007
+#: ../rules/base.xml.in.h:1011
msgid "Both Shift keys together toggle Caps Lock"
msgstr "Обидві клавіші Shift разом перемикають стан Caps Lock"
-#: ../rules/base.xml.in.h:1008
+#: ../rules/base.xml.in.h:1012
msgid "Both Shift keys together activate Caps Lock, one Shift key deactivates"
msgstr "Натискання обох клавіш Shift вмикають Caps Lock, одна клавіша Shift — вимикає"
-#: ../rules/base.xml.in.h:1009
+#: ../rules/base.xml.in.h:1013
msgid "Both Shift keys together toggle ShiftLock"
msgstr "Обидві клавіші Shift разом перемикають стан Shift"
-#: ../rules/base.xml.in.h:1010
+#: ../rules/base.xml.in.h:1014
msgid "Shift + NumLock toggles PointerKeys"
msgstr "Shift + NumLock перемикає PointerKeys"
-#: ../rules/base.xml.in.h:1011
+#: ../rules/base.xml.in.h:1015
msgid "Allow breaking grabs with keyboard actions (warning: security risk)"
msgstr "Дозволити скасування захоплення діями з клавіатури (увага: небезпечно)"
-#: ../rules/base.xml.in.h:1012
+#: ../rules/base.xml.in.h:1016
+msgid "Allow grab and window tree logging"
+msgstr "Дозволити захоплення і журналювання ієрархії вікон"
+
+#: ../rules/base.xml.in.h:1017
msgid "Adding currency signs to certain keys"
msgstr "Додавання знаків валюти до деяких клавіш"
-#: ../rules/base.xml.in.h:1013
+#: ../rules/base.xml.in.h:1018
msgid "Euro on E"
msgstr "Євро на E"
-#: ../rules/base.xml.in.h:1014
+#: ../rules/base.xml.in.h:1019
msgid "Euro on 2"
msgstr "Євро на 2"
-#: ../rules/base.xml.in.h:1015
+#: ../rules/base.xml.in.h:1020
msgid "Euro on 4"
msgstr "Євро на 4"
-#: ../rules/base.xml.in.h:1016
+#: ../rules/base.xml.in.h:1021
msgid "Euro on 5"
msgstr "Євро на 5"
-#: ../rules/base.xml.in.h:1017
+#: ../rules/base.xml.in.h:1022
msgid "Rupee on 4"
msgstr "Символ рупії на 4"
-#: ../rules/base.xml.in.h:1018
+#: ../rules/base.xml.in.h:1023
msgid "Key to choose 5th level"
msgstr "Клавіша для вибору 5-го ряду"
-#: ../rules/base.xml.in.h:1019
+#: ../rules/base.xml.in.h:1024
msgid "&lt;Less/Greater&gt; chooses 5th level, locks when pressed together with another 5th-level-chooser"
msgstr "&lt;Менше ніж/Більше ніж&gt; вибирає 5-ий рівень, фіксується, якщо натиснути разом зі іншою комбінацією вибору 5-го рівня"
-#: ../rules/base.xml.in.h:1020
+#: ../rules/base.xml.in.h:1025
msgid "Right Alt chooses 5th level, locks when pressed together with another 5th-level-chooser"
msgstr "Права клавіша Alt вибирає 5-ий рівень, фіксується, якщо натиснути разом зі іншою комбінацією вибору 5-го рівня"
-#: ../rules/base.xml.in.h:1021
+#: ../rules/base.xml.in.h:1026
msgid "Left Win chooses 5th level, locks when pressed together with another 5th-level-chooser"
msgstr "Ліва клавіша Win вибирає 5-ий рівень, фіксується, якщо натиснути разом зі іншою комбінацією вибору 5-го рівня"
-#: ../rules/base.xml.in.h:1022
+#: ../rules/base.xml.in.h:1027
msgid "Right Win chooses 5th level, locks when pressed together with another 5th-level-chooser"
msgstr "Права клавіша Win вибирає 5-ий рівень, фіксується, якщо натиснути разом зі іншою комбінацією вибору 5-го рівня"
-#: ../rules/base.xml.in.h:1023
+#: ../rules/base.xml.in.h:1028
msgid "Using space key to input non-breakable space character"
msgstr "Клавіша пробіл генерує символ нерозривного пробілу"
-#: ../rules/base.xml.in.h:1024
+#: ../rules/base.xml.in.h:1029
msgid "Usual space at any level"
msgstr "Звичайний пробіл на будь-якому рівні"
-#: ../rules/base.xml.in.h:1025
+#: ../rules/base.xml.in.h:1030
msgid "Non-breakable space character at second level"
msgstr "Символ нерозривного пробілу на другому рівні"
-#: ../rules/base.xml.in.h:1026
+#: ../rules/base.xml.in.h:1031
msgid "Non-breakable space character at third level"
msgstr "Символ нерозривного пробілу на третьому рівні"
-#: ../rules/base.xml.in.h:1027
+#: ../rules/base.xml.in.h:1032
msgid "Non-breakable space character at third level, nothing at fourth level"
msgstr "Символ нерозривного пробілу на третьому рівні, нічого на четвертому"
-#: ../rules/base.xml.in.h:1028
+#: ../rules/base.xml.in.h:1033
msgid "Non-breakable space character at third level, thin non-breakable space character at fourth level"
msgstr "Символ нерозривного пробілу на третьому рівні, символ тонкого нерозривного пробілу на четвертому рівні"
-#: ../rules/base.xml.in.h:1029
+#: ../rules/base.xml.in.h:1034
msgid "Non-breakable space character at fourth level"
msgstr "Символ нерозривного пробілу на четвертому рівні"
-#: ../rules/base.xml.in.h:1030
+#: ../rules/base.xml.in.h:1035
msgid "Non-breakable space character at fourth level, thin non-breakable space character at sixth level"
msgstr "Клавіша пробіл видає нерозривний пробіл на 4-му рівні, вузький нерозривний пробіл на 6-му рівні"
-#: ../rules/base.xml.in.h:1031
+#: ../rules/base.xml.in.h:1036
msgid "Non-breakable space character at fourth level, thin non-breakable space character at sixth level (via Ctrl+Shift)"
msgstr "Клавіша пробіл видає нерозривний пробіл на 4-му рівні, вузький нерозривний пробіл на 6-му рівні (через Ctrl+Shift)"
-#: ../rules/base.xml.in.h:1032
+#: ../rules/base.xml.in.h:1037
msgid "Zero-width non-joiner character at second level"
msgstr "Незв’язувальний символ нульової ширини на другому рівні"
-#: ../rules/base.xml.in.h:1033
+#: ../rules/base.xml.in.h:1038
msgid "Zero-width non-joiner character at second level, zero-width joiner character at third level"
msgstr "Незв’язувальний символ нульової ширини на другому рівні, зв’язувальний символ нульової ширини на третьому рівні"
-#: ../rules/base.xml.in.h:1034
+#: ../rules/base.xml.in.h:1039
msgid "Zero-width non-joiner character at second level, zero-width joiner character at third level, non-breakable space character at fourth level"
msgstr "Незв’язувальний символ нульової ширини на другому рівні, зв’язувальний символ нульової ширини на третьому рівні, символ нерозривного пробілу на четвертому рівні"
-#: ../rules/base.xml.in.h:1035
+#: ../rules/base.xml.in.h:1040
msgid "Zero-width non-joiner character at second level, non-breakable space character at third level"
msgstr "Незв’язувальний символ нульової ширини на другому рівні, нерозривний пробіл на третьому рівні"
-#: ../rules/base.xml.in.h:1036
+#: ../rules/base.xml.in.h:1041
msgid "Zero-width non-joiner character at second level, non-breakable space character at third level, nothing at fourth level"
msgstr "Незв’язувальний символ нульової ширини на другому рівні, нерозривний пробіл на третьому рівні, нічого на четвертому рівні"
-#: ../rules/base.xml.in.h:1037
+#: ../rules/base.xml.in.h:1042
msgid "Zero-width non-joiner character at second level, non-breakable space character at third level, zero-width joiner at fourth level"
msgstr "Незв’язувальний символ нульової ширини на другому рівні, символ нерозривного пробілу на третьому рівні, зв’язувальний символ нульової ширини на четвертому"
-#: ../rules/base.xml.in.h:1038
+#: ../rules/base.xml.in.h:1043
msgid "Zero-width non-joiner character at second level, non-breakable space character at third level, thin non-breakable space at fourth level"
msgstr "Незв’язувальний символ нульової ширини на другому рівні, нерозривний пробіл на третьому рівні, вузький нерозривний пробіл на четвертому рівні"
-#: ../rules/base.xml.in.h:1039
+#: ../rules/base.xml.in.h:1044
msgid "Zero-width non-joiner character at third level, zero-width joiner at fourth level"
msgstr "Незв’язувальний символ нульової ширини на третьому рівні, зв’язувальний символ нульової ширини на четвертому"
-#: ../rules/base.xml.in.h:1040
+#: ../rules/base.xml.in.h:1045
msgid "Japanese keyboard options"
msgstr "Параметри японської клавіатури"
-#: ../rules/base.xml.in.h:1041
+#: ../rules/base.xml.in.h:1046
msgid "Kana Lock key is locking"
msgstr "Клавіша Kana Lock фіксується"
-#: ../rules/base.xml.in.h:1042
+#: ../rules/base.xml.in.h:1047
msgid "NICOLA-F style Backspace"
msgstr "NICOLA-F style Backspace"
-#: ../rules/base.xml.in.h:1043
+#: ../rules/base.xml.in.h:1048
msgid "Make Zenkaku Hankaku an additional ESC"
msgstr "Клавіша повних/половинних форм — додаткова клавіша ESC"
-#: ../rules/base.xml.in.h:1044
+#: ../rules/base.xml.in.h:1049
msgid "Adding Esperanto supersigned letters"
msgstr "Додавання діакритичних знаків есперанто"
-#: ../rules/base.xml.in.h:1045
+#: ../rules/base.xml.in.h:1050
msgid "To the corresponding key in a Qwerty layout"
msgstr "На відповідну клавішу у розкладці Qwerty"
-#: ../rules/base.xml.in.h:1046
+#: ../rules/base.xml.in.h:1051
msgid "To the corresponding key in a Dvorak layout"
msgstr "На відповідну клавішу у розкладці Дворака"
-#: ../rules/base.xml.in.h:1047
+#: ../rules/base.xml.in.h:1052
msgid "To the corresponding key in a Colemak layout"
msgstr "На відповідну клавішу у розкладці Колемака"
-#: ../rules/base.xml.in.h:1048
+#: ../rules/base.xml.in.h:1053
msgid "Maintain key compatibility with old Solaris keycodes"
msgstr "Підтримувати сумісність клавіш з застарілими кодами клавіш Solaris"
-#: ../rules/base.xml.in.h:1049
+#: ../rules/base.xml.in.h:1054
msgid "Sun Key compatibility"
msgstr "Сумісність з кодами клавіш Sun"
-#: ../rules/base.xml.in.h:1050
+#: ../rules/base.xml.in.h:1055
msgid "Key sequence to kill the X server"
msgstr "Комбінація клавіш для переривання роботи X-сервера"
-#: ../rules/base.xml.in.h:1051
+#: ../rules/base.xml.in.h:1056
msgid "Ctrl + Alt + Backspace"
msgstr "Ctrl + Alt + Backspace"
@@ -4026,150 +4046,160 @@ msgstr "Салішська кер-д’ален"
msgid "English (US, Sun Type 6/7)"
msgstr "Англійська (США, Sun Type 6/7)"
-#: ../rules/base.extras.xml.in.h:42
+#: ../rules/base.extras.xml.in.h:40
+msgid "English (Norman)"
+msgstr "Англійська (Норман)"
+
+#: ../rules/base.extras.xml.in.h:43
msgid "Polish (international with dead keys)"
msgstr "Польська (інтернаціональна зі сліпими клавішами)"
-#: ../rules/base.extras.xml.in.h:43
+#: ../rules/base.extras.xml.in.h:44
msgid "Polish (Colemak)"
msgstr "Польська (Коулмак)"
-#: ../rules/base.extras.xml.in.h:44
+#: ../rules/base.extras.xml.in.h:45
msgid "Polish (Sun Type 6/7)"
msgstr "Польська (Sun Type 6/7)"
-#: ../rules/base.extras.xml.in.h:48
+#: ../rules/base.extras.xml.in.h:49
msgid "Crimean Tatar (Dobruja Q)"
msgstr "Кримськотатарська (Dobruja Q)"
-#: ../rules/base.extras.xml.in.h:49
+#: ../rules/base.extras.xml.in.h:50
msgid "Romanian (ergonomic Touchtype)"
msgstr "Румунська (ергономічна для друку наосліп)"
-#: ../rules/base.extras.xml.in.h:50
+#: ../rules/base.extras.xml.in.h:51
msgid "Romanian (Sun Type 6/7)"
msgstr "Румунська (Sun Type 6/7)"
-#: ../rules/base.extras.xml.in.h:53
+#: ../rules/base.extras.xml.in.h:54
msgid "Serbian (combining accents instead of dead keys)"
msgstr "Сербська (комбінації з акцентами замість сліпих клавіш)"
-#: ../rules/base.extras.xml.in.h:56
+#: ../rules/base.extras.xml.in.h:57
msgid "Russian (with Ukrainian-Belorussian layout)"
msgstr "Російська (з українсько-білоруською розкладкою)"
-#: ../rules/base.extras.xml.in.h:57
+#: ../rules/base.extras.xml.in.h:58
msgid "Russian (Sun Type 6/7)"
msgstr "Російська (Sun Type 6/7)"
-#: ../rules/base.extras.xml.in.h:60
+#: ../rules/base.extras.xml.in.h:61
msgid "Armenian (OLPC phonetic)"
msgstr "Вірменська (OLPC, фонетична)"
-#: ../rules/base.extras.xml.in.h:63
+#: ../rules/base.extras.xml.in.h:64
msgid "Hebrew (Biblical, SIL phonetic)"
msgstr "Іврит (біблійна, фонетична, SIL)"
-#: ../rules/base.extras.xml.in.h:66
+#: ../rules/base.extras.xml.in.h:67
msgid "Arabic (Sun Type 6/7)"
msgstr "Арабська (Sun Type 6/7)"
-#: ../rules/base.extras.xml.in.h:69
+#: ../rules/base.extras.xml.in.h:70
msgid "Belgian (Sun Type 6/7)"
msgstr "Бельгійська (Sun Type 6/7)"
-#: ../rules/base.extras.xml.in.h:72
+#: ../rules/base.extras.xml.in.h:73
msgid "Portuguese (Brazil, Sun Type 6/7)"
msgstr "Португальська (Бразилія, Sun Type 6/7)"
-#: ../rules/base.extras.xml.in.h:75
+#: ../rules/base.extras.xml.in.h:76
msgid "Czech (Sun Type 6/7)"
msgstr "Чеська (Sun Type 6/7)"
-#: ../rules/base.extras.xml.in.h:78
+#: ../rules/base.extras.xml.in.h:79
msgid "Danish (Sun Type 6/7)"
msgstr "Данська (Sun Type 6/7)"
-#: ../rules/base.extras.xml.in.h:81
+#: ../rules/base.extras.xml.in.h:82
msgid "Dutch (Sun Type 6/7)"
msgstr "Голландська (Sun Type 6/7)"
-#: ../rules/base.extras.xml.in.h:84
+#: ../rules/base.extras.xml.in.h:85
msgid "Estonian (Sun Type 6/7)"
msgstr "Естонська (Sun Type 6/7)"
-#: ../rules/base.extras.xml.in.h:87
+#: ../rules/base.extras.xml.in.h:88
msgid "Finnish (Sun Type 6/7)"
msgstr "Фінська (Sun Type 6/7)"
-#: ../rules/base.extras.xml.in.h:89
+#: ../rules/base.extras.xml.in.h:90
msgid "French (Sun Type 6/7)"
msgstr "Французька (Sun Type 6/7)"
-#: ../rules/base.extras.xml.in.h:92
+#: ../rules/base.extras.xml.in.h:93
msgid "Greek (Sun Type 6/7)"
msgstr "Грецька (Sun Type 6/7)"
-#: ../rules/base.extras.xml.in.h:95
+#: ../rules/base.extras.xml.in.h:96
msgid "Italian (Sun Type 6/7)"
msgstr "Італійська (Sun Type 6/7)"
-#: ../rules/base.extras.xml.in.h:98
+#: ../rules/base.extras.xml.in.h:99
msgid "Japanese (Sun Type 6)"
msgstr "Японська (Sun Type 6)"
-#: ../rules/base.extras.xml.in.h:99
+#: ../rules/base.extras.xml.in.h:100
msgid "Japanese (Sun Type 7 - pc compatible)"
msgstr "Японська (Sun Type 7, сумісна з ПК)"
-#: ../rules/base.extras.xml.in.h:100
+#: ../rules/base.extras.xml.in.h:101
msgid "Japanese (Sun Type 7 - sun compatible)"
msgstr "Японська (Sun Type 7, сумісна з комп’ютерами Sun)"
-#: ../rules/base.extras.xml.in.h:103
+#: ../rules/base.extras.xml.in.h:104
msgid "Norwegian (Sun Type 6/7)"
msgstr "Норвезька (Sun Type 6/7)"
-#: ../rules/base.extras.xml.in.h:105
+#: ../rules/base.extras.xml.in.h:106
msgid "Portuguese (Sun Type 6/7)"
msgstr "Португальська (Sun Type 6/7)"
-#: ../rules/base.extras.xml.in.h:108
+#: ../rules/base.extras.xml.in.h:109
msgid "Slovak (Sun Type 6/7)"
msgstr "Словацька (Sun Type 6/7)"
-#: ../rules/base.extras.xml.in.h:111
+#: ../rules/base.extras.xml.in.h:112
msgid "Spanish (Sun Type 6/7)"
msgstr "Іспанська (Sun Type 6/7)"
-#: ../rules/base.extras.xml.in.h:114
+#: ../rules/base.extras.xml.in.h:115
msgid "Swedish (Sun Type 6/7)"
msgstr "Шведська (Sun Type 6/7)"
-#: ../rules/base.extras.xml.in.h:116
+#: ../rules/base.extras.xml.in.h:117
msgid "German (Switzerland, Sun Type 6/7)"
msgstr "Німецька (Швейцарія, Sun Type 6/7)"
-#: ../rules/base.extras.xml.in.h:117
+#: ../rules/base.extras.xml.in.h:118
msgid "French (Switzerland, Sun Type 6/7)"
msgstr "Французька (Швейцарія, Sun Type 6/7)"
-#: ../rules/base.extras.xml.in.h:120
+#: ../rules/base.extras.xml.in.h:121
msgid "Turkish (Sun Type 6/7)"
msgstr "Турецька (Sun Type 6/7)"
-#: ../rules/base.extras.xml.in.h:123
+#: ../rules/base.extras.xml.in.h:124
msgid "Ukrainian (Sun Type 6/7)"
msgstr "Українська (Sun Type 6/7)"
-#: ../rules/base.extras.xml.in.h:125
+#: ../rules/base.extras.xml.in.h:126
msgid "English (UK, Sun Type 6/7)"
msgstr "Англійська (Великобританія, Sun Type 6/7)"
-#: ../rules/base.extras.xml.in.h:128
+#: ../rules/base.extras.xml.in.h:129
msgid "Korean (Sun Type 6/7)"
msgstr "Корейська (Sun Type 6/7)"
+#~ msgid "Bengali"
+#~ msgstr "Бенгальська"
+
+#~ msgid "Portuguese (Brazil, nativo for Esperanto)"
+#~ msgstr "Португальська (Бразилія, nativo для есперанто)"
+
#~ msgid "English (layout toggle on multiply/divide key)"
#~ msgstr "Англійська (перемикання розкладки клавішею «помножити/ділити»)"
diff --git a/xorg-server/xkeyboard-config/po/xkeyboard-config.pot b/xorg-server/xkeyboard-config/po/xkeyboard-config.pot
index 03bc1d527..3952a1efe 100644
--- a/xorg-server/xkeyboard-config/po/xkeyboard-config.pot
+++ b/xorg-server/xkeyboard-config/po/xkeyboard-config.pot
@@ -8,7 +8,7 @@ msgid ""
msgstr ""
"Project-Id-Version: PACKAGE VERSION\n"
"Report-Msgid-Bugs-To: svu@users.sourceforge.net\n"
-"POT-Creation-Date: 2013-09-30 22:59+0100\n"
+"POT-Creation-Date: 2014-01-15 01:12+0000\n"
"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
"Language-Team: LANGUAGE <LL@li.org>\n"
@@ -816,7 +816,7 @@ msgid "English (programmer Dvorak)"
msgstr ""
#. Keyboard indicator for Russian layouts
-#: ../rules/base.xml.in.h:203 ../rules/base.extras.xml.in.h:54
+#: ../rules/base.xml.in.h:203 ../rules/base.extras.xml.in.h:55
msgid "ru"
msgstr ""
@@ -888,11 +888,11 @@ msgid "Uzbek (Afghanistan, OLPC)"
msgstr ""
#. Keyboard indicator for Arabic layouts
-#: ../rules/base.xml.in.h:224 ../rules/base.extras.xml.in.h:64
+#: ../rules/base.xml.in.h:224 ../rules/base.extras.xml.in.h:65
msgid "ar"
msgstr ""
-#: ../rules/base.xml.in.h:225 ../rules/base.extras.xml.in.h:65
+#: ../rules/base.xml.in.h:225 ../rules/base.extras.xml.in.h:66
msgid "Arabic"
msgstr ""
@@ -930,11 +930,11 @@ msgid "Albanian"
msgstr ""
#. Keyboard indicator for Armenian layouts
-#: ../rules/base.xml.in.h:236 ../rules/base.extras.xml.in.h:58
+#: ../rules/base.xml.in.h:236 ../rules/base.extras.xml.in.h:59
msgid "hy"
msgstr ""
-#: ../rules/base.xml.in.h:237 ../rules/base.extras.xml.in.h:59
+#: ../rules/base.xml.in.h:237 ../rules/base.extras.xml.in.h:60
msgid "Armenian"
msgstr ""
@@ -1010,11 +1010,11 @@ msgid "Belarusian (Latin)"
msgstr ""
#. Keyboard indicator for Belgian layouts
-#: ../rules/base.xml.in.h:259 ../rules/base.extras.xml.in.h:67
+#: ../rules/base.xml.in.h:259 ../rules/base.extras.xml.in.h:68
msgid "be"
msgstr ""
-#: ../rules/base.xml.in.h:260 ../rules/base.extras.xml.in.h:68
+#: ../rules/base.xml.in.h:260 ../rules/base.extras.xml.in.h:69
msgid "Belgian"
msgstr ""
@@ -1046,17 +1046,17 @@ msgstr ""
msgid "Belgian (Wang model 724 azerty)"
msgstr ""
-#. Keyboard indicator for Bengali layouts
+#. Keyboard indicator for Bangla layouts
#: ../rules/base.xml.in.h:269
msgid "bn"
msgstr ""
#: ../rules/base.xml.in.h:270
-msgid "Bengali"
+msgid "Bangla"
msgstr ""
#: ../rules/base.xml.in.h:271
-msgid "Bengali (Probhat)"
+msgid "Bangla (Probhat)"
msgstr ""
#. Keyboard indicator for Indian layouts
@@ -1069,27 +1069,27 @@ msgid "Indian"
msgstr ""
#: ../rules/base.xml.in.h:275
-msgid "Bengali (India)"
+msgid "Bangla (India)"
msgstr ""
#: ../rules/base.xml.in.h:276
-msgid "Bengali (India, Probhat)"
+msgid "Bangla (India, Probhat)"
msgstr ""
#: ../rules/base.xml.in.h:277
-msgid "Bengali (India, Baishakhi)"
+msgid "Bangla (India, Baishakhi)"
msgstr ""
#: ../rules/base.xml.in.h:278
-msgid "Bengali (India, Bornona)"
+msgid "Bangla (India, Bornona)"
msgstr ""
#: ../rules/base.xml.in.h:279
-msgid "Bengali (India, Uni Gitanjali)"
+msgid "Bangla (India, Uni Gitanjali)"
msgstr ""
#: ../rules/base.xml.in.h:280
-msgid "Bengali (India, Baishakhi Inscript)"
+msgid "Bangla (India, Baishakhi Inscript)"
msgstr ""
#. Keyboard indicator for Gujarati layouts
@@ -1273,11 +1273,11 @@ msgid "Bosnian (US keyboard with Bosnian letters)"
msgstr ""
#. Keyboard indicator for Portuguese layouts
-#: ../rules/base.xml.in.h:336 ../rules/base.extras.xml.in.h:70
+#: ../rules/base.xml.in.h:336 ../rules/base.extras.xml.in.h:71
msgid "pt"
msgstr ""
-#: ../rules/base.xml.in.h:337 ../rules/base.extras.xml.in.h:71
+#: ../rules/base.xml.in.h:337 ../rules/base.extras.xml.in.h:72
msgid "Portuguese (Brazil)"
msgstr ""
@@ -1290,15 +1290,15 @@ msgid "Portuguese (Brazil, Dvorak)"
msgstr ""
#: ../rules/base.xml.in.h:340
-msgid "Portuguese (Brazil, nativo)"
+msgid "Portuguese (Brazil, Nativo)"
msgstr ""
#: ../rules/base.xml.in.h:341
-msgid "Portuguese (Brazil, nativo for US keyboards)"
+msgid "Portuguese (Brazil, Nativo for US keyboards)"
msgstr ""
#: ../rules/base.xml.in.h:342
-msgid "Portuguese (Brazil, nativo for Esperanto)"
+msgid "Esperanto (Brazil, Nativo)"
msgstr ""
#. Keyboard indicator for Bulgarian layouts
@@ -1453,2503 +1453,2523 @@ msgid "Tibetan (with ASCII numerals)"
msgstr ""
#: ../rules/base.xml.in.h:386
+msgid "ug"
+msgstr ""
+
+#: ../rules/base.xml.in.h:387
msgid "Uyghur"
msgstr ""
#. Keyboard indicator for Croatian layouts
-#: ../rules/base.xml.in.h:388
+#: ../rules/base.xml.in.h:389
msgid "hr"
msgstr ""
-#: ../rules/base.xml.in.h:389
+#: ../rules/base.xml.in.h:390
msgid "Croatian"
msgstr ""
-#: ../rules/base.xml.in.h:390
+#: ../rules/base.xml.in.h:391
msgid "Croatian (use guillemets for quotes)"
msgstr ""
-#: ../rules/base.xml.in.h:391
+#: ../rules/base.xml.in.h:392
msgid "Croatian (use Croatian digraphs)"
msgstr ""
-#: ../rules/base.xml.in.h:392
+#: ../rules/base.xml.in.h:393
msgid "Croatian (US keyboard with Croatian digraphs)"
msgstr ""
-#: ../rules/base.xml.in.h:393
+#: ../rules/base.xml.in.h:394
msgid "Croatian (US keyboard with Croatian letters)"
msgstr ""
#. Keyboard indicator for Chech layouts
-#: ../rules/base.xml.in.h:395 ../rules/base.extras.xml.in.h:73
+#: ../rules/base.xml.in.h:396 ../rules/base.extras.xml.in.h:74
msgid "cs"
msgstr ""
-#: ../rules/base.xml.in.h:396 ../rules/base.extras.xml.in.h:74
+#: ../rules/base.xml.in.h:397 ../rules/base.extras.xml.in.h:75
msgid "Czech"
msgstr ""
-#: ../rules/base.xml.in.h:397
+#: ../rules/base.xml.in.h:398
msgid "Czech (with &lt;\\|&gt; key)"
msgstr ""
-#: ../rules/base.xml.in.h:398
+#: ../rules/base.xml.in.h:399
msgid "Czech (qwerty)"
msgstr ""
-#: ../rules/base.xml.in.h:399
+#: ../rules/base.xml.in.h:400
msgid "Czech (qwerty, extended Backslash)"
msgstr ""
-#: ../rules/base.xml.in.h:400
+#: ../rules/base.xml.in.h:401
msgid "Czech (UCW layout, accented letters only)"
msgstr ""
-#: ../rules/base.xml.in.h:401
+#: ../rules/base.xml.in.h:402
msgid "Czech (US Dvorak with CZ UCW support)"
msgstr ""
#. Keyboard indicator for Danish layouts
-#: ../rules/base.xml.in.h:403 ../rules/base.extras.xml.in.h:76
+#: ../rules/base.xml.in.h:404 ../rules/base.extras.xml.in.h:77
msgid "da"
msgstr ""
-#: ../rules/base.xml.in.h:404 ../rules/base.extras.xml.in.h:77
+#: ../rules/base.xml.in.h:405 ../rules/base.extras.xml.in.h:78
msgid "Danish"
msgstr ""
-#: ../rules/base.xml.in.h:405
+#: ../rules/base.xml.in.h:406
msgid "Danish (eliminate dead keys)"
msgstr ""
-#: ../rules/base.xml.in.h:406
+#: ../rules/base.xml.in.h:407
msgid "Danish (Macintosh)"
msgstr ""
-#: ../rules/base.xml.in.h:407
+#: ../rules/base.xml.in.h:408
msgid "Danish (Macintosh, eliminate dead keys)"
msgstr ""
-#: ../rules/base.xml.in.h:408
+#: ../rules/base.xml.in.h:409
msgid "Danish (Dvorak)"
msgstr ""
#. Keyboard indicator for Dutch layouts
-#: ../rules/base.xml.in.h:410 ../rules/base.extras.xml.in.h:79
+#: ../rules/base.xml.in.h:411 ../rules/base.extras.xml.in.h:80
msgid "nl"
msgstr ""
-#: ../rules/base.xml.in.h:411 ../rules/base.extras.xml.in.h:80
+#: ../rules/base.xml.in.h:412 ../rules/base.extras.xml.in.h:81
msgid "Dutch"
msgstr ""
-#: ../rules/base.xml.in.h:412
+#: ../rules/base.xml.in.h:413
msgid "Dutch (Sun dead keys)"
msgstr ""
-#: ../rules/base.xml.in.h:413
+#: ../rules/base.xml.in.h:414
msgid "Dutch (Macintosh)"
msgstr ""
-#: ../rules/base.xml.in.h:414
+#: ../rules/base.xml.in.h:415
msgid "Dutch (standard)"
msgstr ""
#. Keyboard indicator for Dzongkha layouts
-#: ../rules/base.xml.in.h:416
+#: ../rules/base.xml.in.h:417
msgid "dz"
msgstr ""
-#: ../rules/base.xml.in.h:417
+#: ../rules/base.xml.in.h:418
msgid "Dzongkha"
msgstr ""
#. Keyboard indicator for Estonian layouts
-#: ../rules/base.xml.in.h:419 ../rules/base.extras.xml.in.h:82
+#: ../rules/base.xml.in.h:420 ../rules/base.extras.xml.in.h:83
msgid "et"
msgstr ""
-#: ../rules/base.xml.in.h:420 ../rules/base.extras.xml.in.h:83
+#: ../rules/base.xml.in.h:421 ../rules/base.extras.xml.in.h:84
msgid "Estonian"
msgstr ""
-#: ../rules/base.xml.in.h:421
+#: ../rules/base.xml.in.h:422
msgid "Estonian (eliminate dead keys)"
msgstr ""
-#: ../rules/base.xml.in.h:422
+#: ../rules/base.xml.in.h:423
msgid "Estonian (Dvorak)"
msgstr ""
-#: ../rules/base.xml.in.h:423
+#: ../rules/base.xml.in.h:424
msgid "Estonian (US keyboard with Estonian letters)"
msgstr ""
-#: ../rules/base.xml.in.h:424 ../rules/base.extras.xml.in.h:16
+#: ../rules/base.xml.in.h:425 ../rules/base.extras.xml.in.h:16
msgid "Persian"
msgstr ""
-#: ../rules/base.xml.in.h:425
+#: ../rules/base.xml.in.h:426
msgid "Persian (with Persian Keypad)"
msgstr ""
#. Keyboard indicator for Kurdish layouts
-#: ../rules/base.xml.in.h:427
+#: ../rules/base.xml.in.h:428
msgid "ku"
msgstr ""
-#: ../rules/base.xml.in.h:428
+#: ../rules/base.xml.in.h:429
msgid "Kurdish (Iran, Latin Q)"
msgstr ""
-#: ../rules/base.xml.in.h:429
+#: ../rules/base.xml.in.h:430
msgid "Kurdish (Iran, F)"
msgstr ""
-#: ../rules/base.xml.in.h:430
+#: ../rules/base.xml.in.h:431
msgid "Kurdish (Iran, Latin Alt-Q)"
msgstr ""
-#: ../rules/base.xml.in.h:431
+#: ../rules/base.xml.in.h:432
msgid "Kurdish (Iran, Arabic-Latin)"
msgstr ""
-#: ../rules/base.xml.in.h:432
+#: ../rules/base.xml.in.h:433
msgid "Iraqi"
msgstr ""
-#: ../rules/base.xml.in.h:433
+#: ../rules/base.xml.in.h:434
msgid "Kurdish (Iraq, Latin Q)"
msgstr ""
-#: ../rules/base.xml.in.h:434
+#: ../rules/base.xml.in.h:435
msgid "Kurdish (Iraq, F)"
msgstr ""
-#: ../rules/base.xml.in.h:435
+#: ../rules/base.xml.in.h:436
msgid "Kurdish (Iraq, Latin Alt-Q)"
msgstr ""
-#: ../rules/base.xml.in.h:436
+#: ../rules/base.xml.in.h:437
msgid "Kurdish (Iraq, Arabic-Latin)"
msgstr ""
#. Keyboard indicator for Faroese layouts
-#: ../rules/base.xml.in.h:438
+#: ../rules/base.xml.in.h:439
msgid "fo"
msgstr ""
-#: ../rules/base.xml.in.h:439
+#: ../rules/base.xml.in.h:440
msgid "Faroese"
msgstr ""
-#: ../rules/base.xml.in.h:440
+#: ../rules/base.xml.in.h:441
msgid "Faroese (eliminate dead keys)"
msgstr ""
#. Keyboard indicator for Finnish layouts
-#: ../rules/base.xml.in.h:442 ../rules/base.extras.xml.in.h:85
+#: ../rules/base.xml.in.h:443 ../rules/base.extras.xml.in.h:86
msgid "fi"
msgstr ""
-#: ../rules/base.xml.in.h:443 ../rules/base.extras.xml.in.h:86
+#: ../rules/base.xml.in.h:444 ../rules/base.extras.xml.in.h:87
msgid "Finnish"
msgstr ""
-#: ../rules/base.xml.in.h:444
+#: ../rules/base.xml.in.h:445
msgid "Finnish (classic)"
msgstr ""
-#: ../rules/base.xml.in.h:445
+#: ../rules/base.xml.in.h:446
msgid "Finnish (classic, eliminate dead keys)"
msgstr ""
-#: ../rules/base.xml.in.h:446
+#: ../rules/base.xml.in.h:447
msgid "Northern Saami (Finland)"
msgstr ""
-#: ../rules/base.xml.in.h:447
+#: ../rules/base.xml.in.h:448
msgid "Finnish (Macintosh)"
msgstr ""
-#: ../rules/base.xml.in.h:448 ../rules/base.extras.xml.in.h:88
+#: ../rules/base.xml.in.h:449 ../rules/base.extras.xml.in.h:89
msgid "French"
msgstr ""
-#: ../rules/base.xml.in.h:449
+#: ../rules/base.xml.in.h:450
msgid "French (eliminate dead keys)"
msgstr ""
-#: ../rules/base.xml.in.h:450
+#: ../rules/base.xml.in.h:451
msgid "French (Sun dead keys)"
msgstr ""
-#: ../rules/base.xml.in.h:451
+#: ../rules/base.xml.in.h:452
msgid "French (alternative)"
msgstr ""
-#: ../rules/base.xml.in.h:452
+#: ../rules/base.xml.in.h:453
msgid "French (alternative, Latin-9 only)"
msgstr ""
-#: ../rules/base.xml.in.h:453
+#: ../rules/base.xml.in.h:454
msgid "French (alternative, eliminate dead keys)"
msgstr ""
-#: ../rules/base.xml.in.h:454
+#: ../rules/base.xml.in.h:455
msgid "French (alternative, Sun dead keys)"
msgstr ""
-#: ../rules/base.xml.in.h:455
+#: ../rules/base.xml.in.h:456
msgid "French (legacy, alternative)"
msgstr ""
-#: ../rules/base.xml.in.h:456
+#: ../rules/base.xml.in.h:457
msgid "French (legacy, alternative, eliminate dead keys)"
msgstr ""
-#: ../rules/base.xml.in.h:457
+#: ../rules/base.xml.in.h:458
msgid "French (legacy, alternative, Sun dead keys)"
msgstr ""
-#: ../rules/base.xml.in.h:458
+#: ../rules/base.xml.in.h:459
msgid "French (Bepo, ergonomic, Dvorak way)"
msgstr ""
-#: ../rules/base.xml.in.h:459
+#: ../rules/base.xml.in.h:460
msgid "French (Bepo, ergonomic, Dvorak way, Latin-9 only)"
msgstr ""
-#: ../rules/base.xml.in.h:460
+#: ../rules/base.xml.in.h:461
msgid "French (Dvorak)"
msgstr ""
-#: ../rules/base.xml.in.h:461
+#: ../rules/base.xml.in.h:462
msgid "French (Macintosh)"
msgstr ""
-#: ../rules/base.xml.in.h:462
+#: ../rules/base.xml.in.h:463
msgid "French (Breton)"
msgstr ""
-#: ../rules/base.xml.in.h:463
+#: ../rules/base.xml.in.h:464
msgid "Occitan"
msgstr ""
-#: ../rules/base.xml.in.h:464
+#: ../rules/base.xml.in.h:465
msgid "Georgian (France, AZERTY Tskapo)"
msgstr ""
-#: ../rules/base.xml.in.h:465
+#: ../rules/base.xml.in.h:466
msgid "English (Ghana)"
msgstr ""
-#: ../rules/base.xml.in.h:466
+#: ../rules/base.xml.in.h:467
msgid "English (Ghana, multilingual)"
msgstr ""
#. Keyboard indicator for Akan layouts
-#: ../rules/base.xml.in.h:468
+#: ../rules/base.xml.in.h:469
msgid "ak"
msgstr ""
-#: ../rules/base.xml.in.h:469
+#: ../rules/base.xml.in.h:470
msgid "Akan"
msgstr ""
#. Keyboard indicator for Ewe layouts
-#: ../rules/base.xml.in.h:471
+#: ../rules/base.xml.in.h:472
msgid "ee"
msgstr ""
-#: ../rules/base.xml.in.h:472
+#: ../rules/base.xml.in.h:473
msgid "Ewe"
msgstr ""
#. Keyboard indicator for Fula layouts
-#: ../rules/base.xml.in.h:474
+#: ../rules/base.xml.in.h:475
msgid "ff"
msgstr ""
-#: ../rules/base.xml.in.h:475
+#: ../rules/base.xml.in.h:476
msgid "Fula"
msgstr ""
#. Keyboard indicator for Ga layouts
-#: ../rules/base.xml.in.h:477
+#: ../rules/base.xml.in.h:478
msgid "gaa"
msgstr ""
-#: ../rules/base.xml.in.h:478
+#: ../rules/base.xml.in.h:479
msgid "Ga"
msgstr ""
#. Keyboard indicator for Hausa layouts
-#: ../rules/base.xml.in.h:480
+#: ../rules/base.xml.in.h:481
msgid "ha"
msgstr ""
-#: ../rules/base.xml.in.h:481
+#: ../rules/base.xml.in.h:482
msgid "Hausa"
msgstr ""
#. Keyboard indicator for Avatime layouts
-#: ../rules/base.xml.in.h:483
+#: ../rules/base.xml.in.h:484
msgid "avn"
msgstr ""
-#: ../rules/base.xml.in.h:484
+#: ../rules/base.xml.in.h:485
msgid "Avatime"
msgstr ""
-#: ../rules/base.xml.in.h:485
+#: ../rules/base.xml.in.h:486
msgid "English (Ghana, GILLBT)"
msgstr ""
-#: ../rules/base.xml.in.h:486
+#: ../rules/base.xml.in.h:487
msgid "French (Guinea)"
msgstr ""
#. Keyboard indicator for Georgian layouts
-#: ../rules/base.xml.in.h:488
+#: ../rules/base.xml.in.h:489
msgid "ka"
msgstr ""
-#: ../rules/base.xml.in.h:489
+#: ../rules/base.xml.in.h:490
msgid "Georgian"
msgstr ""
-#: ../rules/base.xml.in.h:490
+#: ../rules/base.xml.in.h:491
msgid "Georgian (ergonomic)"
msgstr ""
-#: ../rules/base.xml.in.h:491
+#: ../rules/base.xml.in.h:492
msgid "Georgian (MESS)"
msgstr ""
-#: ../rules/base.xml.in.h:492
+#: ../rules/base.xml.in.h:493
msgid "Russian (Georgia)"
msgstr ""
-#: ../rules/base.xml.in.h:493
+#: ../rules/base.xml.in.h:494
msgid "Ossetian (Georgia)"
msgstr ""
-#: ../rules/base.xml.in.h:494 ../rules/base.extras.xml.in.h:11
+#: ../rules/base.xml.in.h:495 ../rules/base.extras.xml.in.h:11
msgid "German"
msgstr ""
-#: ../rules/base.xml.in.h:495
+#: ../rules/base.xml.in.h:496
msgid "German (dead acute)"
msgstr ""
-#: ../rules/base.xml.in.h:496
+#: ../rules/base.xml.in.h:497
msgid "German (dead grave acute)"
msgstr ""
-#: ../rules/base.xml.in.h:497
+#: ../rules/base.xml.in.h:498
msgid "German (eliminate dead keys)"
msgstr ""
-#: ../rules/base.xml.in.h:498
+#: ../rules/base.xml.in.h:499
msgid "German (T3)"
msgstr ""
-#: ../rules/base.xml.in.h:499
+#: ../rules/base.xml.in.h:500
msgid "Romanian (Germany)"
msgstr ""
-#: ../rules/base.xml.in.h:500
+#: ../rules/base.xml.in.h:501
msgid "Romanian (Germany, eliminate dead keys)"
msgstr ""
-#: ../rules/base.xml.in.h:501
+#: ../rules/base.xml.in.h:502
msgid "German (Dvorak)"
msgstr ""
-#: ../rules/base.xml.in.h:502
+#: ../rules/base.xml.in.h:503
msgid "German (Sun dead keys)"
msgstr ""
-#: ../rules/base.xml.in.h:503
+#: ../rules/base.xml.in.h:504
msgid "German (Neo 2)"
msgstr ""
-#: ../rules/base.xml.in.h:504
+#: ../rules/base.xml.in.h:505
msgid "German (Macintosh)"
msgstr ""
-#: ../rules/base.xml.in.h:505
+#: ../rules/base.xml.in.h:506
msgid "German (Macintosh, eliminate dead keys)"
msgstr ""
-#: ../rules/base.xml.in.h:506
+#: ../rules/base.xml.in.h:507
msgid "Lower Sorbian"
msgstr ""
-#: ../rules/base.xml.in.h:507
+#: ../rules/base.xml.in.h:508
msgid "Lower Sorbian (qwertz)"
msgstr ""
-#: ../rules/base.xml.in.h:508
+#: ../rules/base.xml.in.h:509
msgid "German (qwerty)"
msgstr ""
-#: ../rules/base.xml.in.h:509
+#: ../rules/base.xml.in.h:510
msgid "Russian (Germany, phonetic)"
msgstr ""
-#: ../rules/base.xml.in.h:510
+#: ../rules/base.xml.in.h:511
msgid "German (legacy)"
msgstr ""
#. Keyboard indicator for Greek layouts
-#: ../rules/base.xml.in.h:512 ../rules/base.extras.xml.in.h:90
+#: ../rules/base.xml.in.h:513 ../rules/base.extras.xml.in.h:91
msgid "gr"
msgstr ""
-#: ../rules/base.xml.in.h:513 ../rules/base.extras.xml.in.h:91
+#: ../rules/base.xml.in.h:514 ../rules/base.extras.xml.in.h:92
msgid "Greek"
msgstr ""
-#: ../rules/base.xml.in.h:514
+#: ../rules/base.xml.in.h:515
msgid "Greek (simple)"
msgstr ""
-#: ../rules/base.xml.in.h:515
+#: ../rules/base.xml.in.h:516
msgid "Greek (extended)"
msgstr ""
-#: ../rules/base.xml.in.h:516
+#: ../rules/base.xml.in.h:517
msgid "Greek (eliminate dead keys)"
msgstr ""
-#: ../rules/base.xml.in.h:517
+#: ../rules/base.xml.in.h:518
msgid "Greek (polytonic)"
msgstr ""
#. Keyboard indicator for Hungarian layouts
-#: ../rules/base.xml.in.h:519
+#: ../rules/base.xml.in.h:520
msgid "hu"
msgstr ""
-#: ../rules/base.xml.in.h:520
+#: ../rules/base.xml.in.h:521
msgid "Hungarian"
msgstr ""
-#: ../rules/base.xml.in.h:521
+#: ../rules/base.xml.in.h:522
msgid "Hungarian (standard)"
msgstr ""
-#: ../rules/base.xml.in.h:522
+#: ../rules/base.xml.in.h:523
msgid "Hungarian (eliminate dead keys)"
msgstr ""
-#: ../rules/base.xml.in.h:523
+#: ../rules/base.xml.in.h:524
msgid "Hungarian (qwerty)"
msgstr ""
-#: ../rules/base.xml.in.h:524
+#: ../rules/base.xml.in.h:525
msgid "Hungarian (101/qwertz/comma/dead keys)"
msgstr ""
-#: ../rules/base.xml.in.h:525
+#: ../rules/base.xml.in.h:526
msgid "Hungarian (101/qwertz/comma/eliminate dead keys)"
msgstr ""
-#: ../rules/base.xml.in.h:526
+#: ../rules/base.xml.in.h:527
msgid "Hungarian (101/qwertz/dot/dead keys)"
msgstr ""
-#: ../rules/base.xml.in.h:527
+#: ../rules/base.xml.in.h:528
msgid "Hungarian (101/qwertz/dot/eliminate dead keys)"
msgstr ""
-#: ../rules/base.xml.in.h:528
+#: ../rules/base.xml.in.h:529
msgid "Hungarian (101/qwerty/comma/dead keys)"
msgstr ""
-#: ../rules/base.xml.in.h:529
+#: ../rules/base.xml.in.h:530
msgid "Hungarian (101/qwerty/comma/eliminate dead keys)"
msgstr ""
-#: ../rules/base.xml.in.h:530
+#: ../rules/base.xml.in.h:531
msgid "Hungarian (101/qwerty/dot/dead keys)"
msgstr ""
-#: ../rules/base.xml.in.h:531
+#: ../rules/base.xml.in.h:532
msgid "Hungarian (101/qwerty/dot/eliminate dead keys)"
msgstr ""
-#: ../rules/base.xml.in.h:532
+#: ../rules/base.xml.in.h:533
msgid "Hungarian (102/qwertz/comma/dead keys)"
msgstr ""
-#: ../rules/base.xml.in.h:533
+#: ../rules/base.xml.in.h:534
msgid "Hungarian (102/qwertz/comma/eliminate dead keys)"
msgstr ""
-#: ../rules/base.xml.in.h:534
+#: ../rules/base.xml.in.h:535
msgid "Hungarian (102/qwertz/dot/dead keys)"
msgstr ""
-#: ../rules/base.xml.in.h:535
+#: ../rules/base.xml.in.h:536
msgid "Hungarian (102/qwertz/dot/eliminate dead keys)"
msgstr ""
-#: ../rules/base.xml.in.h:536
+#: ../rules/base.xml.in.h:537
msgid "Hungarian (102/qwerty/comma/dead keys)"
msgstr ""
-#: ../rules/base.xml.in.h:537
+#: ../rules/base.xml.in.h:538
msgid "Hungarian (102/qwerty/comma/eliminate dead keys)"
msgstr ""
-#: ../rules/base.xml.in.h:538
+#: ../rules/base.xml.in.h:539
msgid "Hungarian (102/qwerty/dot/dead keys)"
msgstr ""
-#: ../rules/base.xml.in.h:539
+#: ../rules/base.xml.in.h:540
msgid "Hungarian (102/qwerty/dot/eliminate dead keys)"
msgstr ""
#. Keyboard indicator for Icelandic layouts
-#: ../rules/base.xml.in.h:541
+#: ../rules/base.xml.in.h:542
msgid "is"
msgstr ""
-#: ../rules/base.xml.in.h:542
+#: ../rules/base.xml.in.h:543
msgid "Icelandic"
msgstr ""
-#: ../rules/base.xml.in.h:543
+#: ../rules/base.xml.in.h:544
msgid "Icelandic (Sun dead keys)"
msgstr ""
-#: ../rules/base.xml.in.h:544
+#: ../rules/base.xml.in.h:545
msgid "Icelandic (eliminate dead keys)"
msgstr ""
-#: ../rules/base.xml.in.h:545
+#: ../rules/base.xml.in.h:546
msgid "Icelandic (Macintosh)"
msgstr ""
-#: ../rules/base.xml.in.h:546
+#: ../rules/base.xml.in.h:547
msgid "Icelandic (Dvorak)"
msgstr ""
#. Keyboard indicator for Hebrew layouts
-#: ../rules/base.xml.in.h:548 ../rules/base.extras.xml.in.h:61
+#: ../rules/base.xml.in.h:549 ../rules/base.extras.xml.in.h:62
msgid "he"
msgstr ""
-#: ../rules/base.xml.in.h:549 ../rules/base.extras.xml.in.h:62
+#: ../rules/base.xml.in.h:550 ../rules/base.extras.xml.in.h:63
msgid "Hebrew"
msgstr ""
-#: ../rules/base.xml.in.h:550
+#: ../rules/base.xml.in.h:551
msgid "Hebrew (lyx)"
msgstr ""
-#: ../rules/base.xml.in.h:551
+#: ../rules/base.xml.in.h:552
msgid "Hebrew (phonetic)"
msgstr ""
-#: ../rules/base.xml.in.h:552
+#: ../rules/base.xml.in.h:553
msgid "Hebrew (Biblical, Tiro)"
msgstr ""
#. Keyboard indicator for Italian layouts
-#: ../rules/base.xml.in.h:554 ../rules/base.extras.xml.in.h:93
+#: ../rules/base.xml.in.h:555 ../rules/base.extras.xml.in.h:94
msgid "it"
msgstr ""
-#: ../rules/base.xml.in.h:555 ../rules/base.extras.xml.in.h:94
+#: ../rules/base.xml.in.h:556 ../rules/base.extras.xml.in.h:95
msgid "Italian"
msgstr ""
-#: ../rules/base.xml.in.h:556
+#: ../rules/base.xml.in.h:557
msgid "Italian (eliminate dead keys)"
msgstr ""
-#: ../rules/base.xml.in.h:557
+#: ../rules/base.xml.in.h:558
msgid "Italian (Macintosh)"
msgstr ""
-#: ../rules/base.xml.in.h:558
+#: ../rules/base.xml.in.h:559
msgid "Italian (US keyboard with Italian letters)"
msgstr ""
-#: ../rules/base.xml.in.h:559
+#: ../rules/base.xml.in.h:560
msgid "Georgian (Italy)"
msgstr ""
-#: ../rules/base.xml.in.h:560
+#: ../rules/base.xml.in.h:561
msgid "Italian (IBM 142)"
msgstr ""
#. Keyboard indicator for Japanese layouts
-#: ../rules/base.xml.in.h:562 ../rules/base.extras.xml.in.h:96
+#: ../rules/base.xml.in.h:563 ../rules/base.extras.xml.in.h:97
msgid "ja"
msgstr ""
-#: ../rules/base.xml.in.h:563 ../rules/base.extras.xml.in.h:97
+#: ../rules/base.xml.in.h:564 ../rules/base.extras.xml.in.h:98
msgid "Japanese"
msgstr ""
-#: ../rules/base.xml.in.h:564
+#: ../rules/base.xml.in.h:565
msgid "Japanese (Kana)"
msgstr ""
-#: ../rules/base.xml.in.h:565
+#: ../rules/base.xml.in.h:566
msgid "Japanese (Kana 86)"
msgstr ""
-#: ../rules/base.xml.in.h:566
+#: ../rules/base.xml.in.h:567
msgid "Japanese (OADG 109A)"
msgstr ""
-#: ../rules/base.xml.in.h:567
+#: ../rules/base.xml.in.h:568
msgid "Japanese (Macintosh)"
msgstr ""
-#: ../rules/base.xml.in.h:568
+#: ../rules/base.xml.in.h:569
msgid "Japanese (Dvorak)"
msgstr ""
#. Keyboard indicator for Kikuyu layouts
-#: ../rules/base.xml.in.h:570
+#: ../rules/base.xml.in.h:571
msgid "ki"
msgstr ""
-#: ../rules/base.xml.in.h:571
+#: ../rules/base.xml.in.h:572
msgid "Kyrgyz"
msgstr ""
-#: ../rules/base.xml.in.h:572
+#: ../rules/base.xml.in.h:573
msgid "Kyrgyz (phonetic)"
msgstr ""
#. Keyboard indicator for Khmer layouts
-#: ../rules/base.xml.in.h:574
+#: ../rules/base.xml.in.h:575
msgid "km"
msgstr ""
-#: ../rules/base.xml.in.h:575
+#: ../rules/base.xml.in.h:576
msgid "Khmer (Cambodia)"
msgstr ""
#. Keyboard indicator for Kazakh layouts
-#: ../rules/base.xml.in.h:577
+#: ../rules/base.xml.in.h:578
msgid "kk"
msgstr ""
-#: ../rules/base.xml.in.h:578
+#: ../rules/base.xml.in.h:579
msgid "Kazakh"
msgstr ""
-#: ../rules/base.xml.in.h:579
+#: ../rules/base.xml.in.h:580
msgid "Russian (Kazakhstan, with Kazakh)"
msgstr ""
-#: ../rules/base.xml.in.h:580
+#: ../rules/base.xml.in.h:581
msgid "Kazakh (with Russian)"
msgstr ""
#. Keyboard indicator for Lao layouts
-#: ../rules/base.xml.in.h:582
+#: ../rules/base.xml.in.h:583
msgid "lo"
msgstr ""
-#: ../rules/base.xml.in.h:583
+#: ../rules/base.xml.in.h:584
msgid "Lao"
msgstr ""
-#: ../rules/base.xml.in.h:584
+#: ../rules/base.xml.in.h:585
msgid "Lao (STEA proposed standard layout)"
msgstr ""
#. Keyboard indicator for Spanish layouts
-#: ../rules/base.xml.in.h:586 ../rules/base.extras.xml.in.h:109
+#: ../rules/base.xml.in.h:587 ../rules/base.extras.xml.in.h:110
msgid "es"
msgstr ""
-#: ../rules/base.xml.in.h:587
+#: ../rules/base.xml.in.h:588
msgid "Spanish (Latin American)"
msgstr ""
-#: ../rules/base.xml.in.h:588
+#: ../rules/base.xml.in.h:589
msgid "Spanish (Latin American, eliminate dead keys)"
msgstr ""
-#: ../rules/base.xml.in.h:589
+#: ../rules/base.xml.in.h:590
msgid "Spanish (Latin American, include dead tilde)"
msgstr ""
-#: ../rules/base.xml.in.h:590
+#: ../rules/base.xml.in.h:591
msgid "Spanish (Latin American, Sun dead keys)"
msgstr ""
#. Keyboard indicator for Lithuanian layouts
-#: ../rules/base.xml.in.h:592 ../rules/base.extras.xml.in.h:18
+#: ../rules/base.xml.in.h:593 ../rules/base.extras.xml.in.h:18
msgid "lt"
msgstr ""
-#: ../rules/base.xml.in.h:593 ../rules/base.extras.xml.in.h:19
+#: ../rules/base.xml.in.h:594 ../rules/base.extras.xml.in.h:19
msgid "Lithuanian"
msgstr ""
-#: ../rules/base.xml.in.h:594
+#: ../rules/base.xml.in.h:595
msgid "Lithuanian (standard)"
msgstr ""
-#: ../rules/base.xml.in.h:595
+#: ../rules/base.xml.in.h:596
msgid "Lithuanian (US keyboard with Lithuanian letters)"
msgstr ""
-#: ../rules/base.xml.in.h:596
+#: ../rules/base.xml.in.h:597
msgid "Lithuanian (IBM LST 1205-92)"
msgstr ""
-#: ../rules/base.xml.in.h:597
+#: ../rules/base.xml.in.h:598
msgid "Lithuanian (LEKP)"
msgstr ""
-#: ../rules/base.xml.in.h:598
+#: ../rules/base.xml.in.h:599
msgid "Lithuanian (LEKPa)"
msgstr ""
#. Keyboard indicator for Latvian layouts
-#: ../rules/base.xml.in.h:600 ../rules/base.extras.xml.in.h:22
+#: ../rules/base.xml.in.h:601 ../rules/base.extras.xml.in.h:22
msgid "lv"
msgstr ""
-#: ../rules/base.xml.in.h:601 ../rules/base.extras.xml.in.h:23
+#: ../rules/base.xml.in.h:602 ../rules/base.extras.xml.in.h:23
msgid "Latvian"
msgstr ""
-#: ../rules/base.xml.in.h:602
+#: ../rules/base.xml.in.h:603
msgid "Latvian (apostrophe variant)"
msgstr ""
-#: ../rules/base.xml.in.h:603
+#: ../rules/base.xml.in.h:604
msgid "Latvian (tilde variant)"
msgstr ""
-#: ../rules/base.xml.in.h:604
+#: ../rules/base.xml.in.h:605
msgid "Latvian (F variant)"
msgstr ""
-#: ../rules/base.xml.in.h:605
+#: ../rules/base.xml.in.h:606
msgid "Latvian (modern)"
msgstr ""
-#: ../rules/base.xml.in.h:606
+#: ../rules/base.xml.in.h:607
msgid "Latvian (ergonomic, ŪGJRMV)"
msgstr ""
-#: ../rules/base.xml.in.h:607
+#: ../rules/base.xml.in.h:608
msgid "Latvian (adapted)"
msgstr ""
#. Keyboard indicator for Maori layouts
-#: ../rules/base.xml.in.h:609
+#: ../rules/base.xml.in.h:610
msgid "mi"
msgstr ""
-#: ../rules/base.xml.in.h:610
+#: ../rules/base.xml.in.h:611
msgid "Maori"
msgstr ""
#. Keyboard indicator for Serbian layouts
-#: ../rules/base.xml.in.h:612 ../rules/base.extras.xml.in.h:51
+#: ../rules/base.xml.in.h:613 ../rules/base.extras.xml.in.h:52
msgid "sr"
msgstr ""
-#: ../rules/base.xml.in.h:613
+#: ../rules/base.xml.in.h:614
msgid "Montenegrin"
msgstr ""
-#: ../rules/base.xml.in.h:614
+#: ../rules/base.xml.in.h:615
msgid "Montenegrin (Cyrillic)"
msgstr ""
-#: ../rules/base.xml.in.h:615
+#: ../rules/base.xml.in.h:616
msgid "Montenegrin (Cyrillic, Z and ZHE swapped)"
msgstr ""
-#: ../rules/base.xml.in.h:616
+#: ../rules/base.xml.in.h:617
msgid "Montenegrin (Latin Unicode)"
msgstr ""
-#: ../rules/base.xml.in.h:617
+#: ../rules/base.xml.in.h:618
msgid "Montenegrin (Latin qwerty)"
msgstr ""
-#: ../rules/base.xml.in.h:618
+#: ../rules/base.xml.in.h:619
msgid "Montenegrin (Latin Unicode qwerty)"
msgstr ""
-#: ../rules/base.xml.in.h:619
+#: ../rules/base.xml.in.h:620
msgid "Montenegrin (Cyrillic with guillemets)"
msgstr ""
-#: ../rules/base.xml.in.h:620
+#: ../rules/base.xml.in.h:621
msgid "Montenegrin (Latin with guillemets)"
msgstr ""
#. Keyboard indicator for Macedonian layouts
-#: ../rules/base.xml.in.h:622
+#: ../rules/base.xml.in.h:623
msgid "mk"
msgstr ""
-#: ../rules/base.xml.in.h:623
+#: ../rules/base.xml.in.h:624
msgid "Macedonian"
msgstr ""
-#: ../rules/base.xml.in.h:624
+#: ../rules/base.xml.in.h:625
msgid "Macedonian (eliminate dead keys)"
msgstr ""
#. Keyboard indicator for Maltese layouts
-#: ../rules/base.xml.in.h:626
+#: ../rules/base.xml.in.h:627
msgid "mt"
msgstr ""
-#: ../rules/base.xml.in.h:627
+#: ../rules/base.xml.in.h:628
msgid "Maltese"
msgstr ""
-#: ../rules/base.xml.in.h:628
+#: ../rules/base.xml.in.h:629
msgid "Maltese (with US layout)"
msgstr ""
#. Keyboard indicator for Mongolian layouts
-#: ../rules/base.xml.in.h:630
+#: ../rules/base.xml.in.h:631
msgid "mn"
msgstr ""
-#: ../rules/base.xml.in.h:631
+#: ../rules/base.xml.in.h:632
msgid "Mongolian"
msgstr ""
#. Keyboard indicator for Norwegian layouts
-#: ../rules/base.xml.in.h:633 ../rules/base.extras.xml.in.h:101
+#: ../rules/base.xml.in.h:634 ../rules/base.extras.xml.in.h:102
msgid "no"
msgstr ""
-#: ../rules/base.xml.in.h:634 ../rules/base.extras.xml.in.h:102
+#: ../rules/base.xml.in.h:635 ../rules/base.extras.xml.in.h:103
msgid "Norwegian"
msgstr ""
-#: ../rules/base.xml.in.h:635
+#: ../rules/base.xml.in.h:636
msgid "Norwegian (eliminate dead keys)"
msgstr ""
-#: ../rules/base.xml.in.h:636
+#: ../rules/base.xml.in.h:637
msgid "Norwegian (Dvorak)"
msgstr ""
-#: ../rules/base.xml.in.h:637
+#: ../rules/base.xml.in.h:638
msgid "Northern Saami (Norway)"
msgstr ""
-#: ../rules/base.xml.in.h:638
+#: ../rules/base.xml.in.h:639
msgid "Northern Saami (Norway, eliminate dead keys)"
msgstr ""
-#: ../rules/base.xml.in.h:639
+#: ../rules/base.xml.in.h:640
msgid "Norwegian (Macintosh)"
msgstr ""
-#: ../rules/base.xml.in.h:640
+#: ../rules/base.xml.in.h:641
msgid "Norwegian (Macintosh, eliminate dead keys)"
msgstr ""
-#: ../rules/base.xml.in.h:641
+#: ../rules/base.xml.in.h:642
msgid "Norwegian (Colemak)"
msgstr ""
#. Keyboard indicator for Polish layouts
-#: ../rules/base.xml.in.h:643 ../rules/base.extras.xml.in.h:40
+#: ../rules/base.xml.in.h:644 ../rules/base.extras.xml.in.h:41
msgid "pl"
msgstr ""
-#: ../rules/base.xml.in.h:644 ../rules/base.extras.xml.in.h:41
+#: ../rules/base.xml.in.h:645 ../rules/base.extras.xml.in.h:42
msgid "Polish"
msgstr ""
-#: ../rules/base.xml.in.h:645
+#: ../rules/base.xml.in.h:646
msgid "Polish (legacy)"
msgstr ""
-#: ../rules/base.xml.in.h:646
+#: ../rules/base.xml.in.h:647
msgid "Polish (qwertz)"
msgstr ""
-#: ../rules/base.xml.in.h:647
+#: ../rules/base.xml.in.h:648
msgid "Polish (Dvorak)"
msgstr ""
-#: ../rules/base.xml.in.h:648
+#: ../rules/base.xml.in.h:649
msgid "Polish (Dvorak, Polish quotes on quotemark key)"
msgstr ""
-#: ../rules/base.xml.in.h:649
+#: ../rules/base.xml.in.h:650
msgid "Polish (Dvorak, Polish quotes on key 1)"
msgstr ""
-#: ../rules/base.xml.in.h:650
+#: ../rules/base.xml.in.h:651
msgid "Kashubian"
msgstr ""
-#: ../rules/base.xml.in.h:651
+#: ../rules/base.xml.in.h:652
msgid "Russian (Poland, phonetic Dvorak)"
msgstr ""
-#: ../rules/base.xml.in.h:652
+#: ../rules/base.xml.in.h:653
msgid "Polish (programmer Dvorak)"
msgstr ""
-#: ../rules/base.xml.in.h:653 ../rules/base.extras.xml.in.h:104
+#: ../rules/base.xml.in.h:654 ../rules/base.extras.xml.in.h:105
msgid "Portuguese"
msgstr ""
-#: ../rules/base.xml.in.h:654
+#: ../rules/base.xml.in.h:655
msgid "Portuguese (eliminate dead keys)"
msgstr ""
-#: ../rules/base.xml.in.h:655
+#: ../rules/base.xml.in.h:656
msgid "Portuguese (Sun dead keys)"
msgstr ""
-#: ../rules/base.xml.in.h:656
+#: ../rules/base.xml.in.h:657
msgid "Portuguese (Macintosh)"
msgstr ""
-#: ../rules/base.xml.in.h:657
+#: ../rules/base.xml.in.h:658
msgid "Portuguese (Macintosh, eliminate dead keys)"
msgstr ""
-#: ../rules/base.xml.in.h:658
+#: ../rules/base.xml.in.h:659
msgid "Portuguese (Macintosh, Sun dead keys)"
msgstr ""
-#: ../rules/base.xml.in.h:659
+#: ../rules/base.xml.in.h:660
msgid "Portuguese (Nativo)"
msgstr ""
-#: ../rules/base.xml.in.h:660
+#: ../rules/base.xml.in.h:661
msgid "Portuguese (Nativo for US keyboards)"
msgstr ""
-#: ../rules/base.xml.in.h:661
+#: ../rules/base.xml.in.h:662
msgid "Esperanto (Portugal, Nativo)"
msgstr ""
#. Keyboard indicator for Romanian layouts
-#: ../rules/base.xml.in.h:663 ../rules/base.extras.xml.in.h:45
+#: ../rules/base.xml.in.h:664 ../rules/base.extras.xml.in.h:46
msgid "ro"
msgstr ""
-#: ../rules/base.xml.in.h:664 ../rules/base.extras.xml.in.h:46
+#: ../rules/base.xml.in.h:665 ../rules/base.extras.xml.in.h:47
msgid "Romanian"
msgstr ""
-#: ../rules/base.xml.in.h:665
+#: ../rules/base.xml.in.h:666
msgid "Romanian (cedilla)"
msgstr ""
-#: ../rules/base.xml.in.h:666
+#: ../rules/base.xml.in.h:667
msgid "Romanian (standard)"
msgstr ""
-#: ../rules/base.xml.in.h:667
+#: ../rules/base.xml.in.h:668
msgid "Romanian (standard cedilla)"
msgstr ""
-#: ../rules/base.xml.in.h:668
+#: ../rules/base.xml.in.h:669
msgid "Romanian (WinKeys)"
msgstr ""
-#: ../rules/base.xml.in.h:669 ../rules/base.extras.xml.in.h:55
+#: ../rules/base.xml.in.h:670 ../rules/base.extras.xml.in.h:56
msgid "Russian"
msgstr ""
-#: ../rules/base.xml.in.h:670
+#: ../rules/base.xml.in.h:671
msgid "Russian (phonetic)"
msgstr ""
-#: ../rules/base.xml.in.h:671
+#: ../rules/base.xml.in.h:672
msgid "Russian (phonetic WinKeys)"
msgstr ""
-#: ../rules/base.xml.in.h:672
+#: ../rules/base.xml.in.h:673
msgid "Russian (typewriter)"
msgstr ""
-#: ../rules/base.xml.in.h:673
+#: ../rules/base.xml.in.h:674
msgid "Russian (legacy)"
msgstr ""
-#: ../rules/base.xml.in.h:674
+#: ../rules/base.xml.in.h:675
msgid "Russian (typewriter, legacy)"
msgstr ""
-#: ../rules/base.xml.in.h:675
+#: ../rules/base.xml.in.h:676
msgid "Tatar"
msgstr ""
-#: ../rules/base.xml.in.h:676
+#: ../rules/base.xml.in.h:677
msgid "Ossetian (legacy)"
msgstr ""
-#: ../rules/base.xml.in.h:677
+#: ../rules/base.xml.in.h:678
msgid "Ossetian (WinKeys)"
msgstr ""
-#: ../rules/base.xml.in.h:678
+#: ../rules/base.xml.in.h:679
msgid "Chuvash"
msgstr ""
-#: ../rules/base.xml.in.h:679
+#: ../rules/base.xml.in.h:680
msgid "Chuvash (Latin)"
msgstr ""
-#: ../rules/base.xml.in.h:680
+#: ../rules/base.xml.in.h:681
msgid "Udmurt"
msgstr ""
-#: ../rules/base.xml.in.h:681
+#: ../rules/base.xml.in.h:682
msgid "Komi"
msgstr ""
-#: ../rules/base.xml.in.h:682
+#: ../rules/base.xml.in.h:683
msgid "Yakut"
msgstr ""
-#: ../rules/base.xml.in.h:683
+#: ../rules/base.xml.in.h:684
msgid "Kalmyk"
msgstr ""
-#: ../rules/base.xml.in.h:684
+#: ../rules/base.xml.in.h:685
msgid "Russian (DOS)"
msgstr ""
-#: ../rules/base.xml.in.h:685
+#: ../rules/base.xml.in.h:686
msgid "Russian (Macintosh)"
msgstr ""
-#: ../rules/base.xml.in.h:686
+#: ../rules/base.xml.in.h:687
msgid "Serbian (Russia)"
msgstr ""
-#: ../rules/base.xml.in.h:687
+#: ../rules/base.xml.in.h:688
msgid "Bashkirian"
msgstr ""
-#: ../rules/base.xml.in.h:688
+#: ../rules/base.xml.in.h:689
msgid "Mari"
msgstr ""
-#: ../rules/base.xml.in.h:689 ../rules/base.extras.xml.in.h:52
+#: ../rules/base.xml.in.h:690 ../rules/base.extras.xml.in.h:53
msgid "Serbian"
msgstr ""
-#: ../rules/base.xml.in.h:690
+#: ../rules/base.xml.in.h:691
msgid "Serbian (Cyrillic, Z and ZHE swapped)"
msgstr ""
-#: ../rules/base.xml.in.h:691
+#: ../rules/base.xml.in.h:692
msgid "Serbian (Latin)"
msgstr ""
-#: ../rules/base.xml.in.h:692
+#: ../rules/base.xml.in.h:693
msgid "Serbian (Latin Unicode)"
msgstr ""
-#: ../rules/base.xml.in.h:693
+#: ../rules/base.xml.in.h:694
msgid "Serbian (Latin qwerty)"
msgstr ""
-#: ../rules/base.xml.in.h:694
+#: ../rules/base.xml.in.h:695
msgid "Serbian (Latin Unicode qwerty)"
msgstr ""
-#: ../rules/base.xml.in.h:695
+#: ../rules/base.xml.in.h:696
msgid "Serbian (Cyrillic with guillemets)"
msgstr ""
-#: ../rules/base.xml.in.h:696
+#: ../rules/base.xml.in.h:697
msgid "Serbian (Latin with guillemets)"
msgstr ""
-#: ../rules/base.xml.in.h:697
-msgid "Pannonian Rusyn (homophonic)"
+#: ../rules/base.xml.in.h:698
+msgid "Pannonian Rusyn"
msgstr ""
#. Keyboard indicator for Slovenian layouts
-#: ../rules/base.xml.in.h:699
+#: ../rules/base.xml.in.h:700
msgid "sl"
msgstr ""
-#: ../rules/base.xml.in.h:700
+#: ../rules/base.xml.in.h:701
msgid "Slovenian"
msgstr ""
-#: ../rules/base.xml.in.h:701
+#: ../rules/base.xml.in.h:702
msgid "Slovenian (use guillemets for quotes)"
msgstr ""
-#: ../rules/base.xml.in.h:702
+#: ../rules/base.xml.in.h:703
msgid "Slovenian (US keyboard with Slovenian letters)"
msgstr ""
#. Keyboard indicator for Slovak layouts
-#: ../rules/base.xml.in.h:704 ../rules/base.extras.xml.in.h:106
+#: ../rules/base.xml.in.h:705 ../rules/base.extras.xml.in.h:107
msgid "sk"
msgstr ""
-#: ../rules/base.xml.in.h:705 ../rules/base.extras.xml.in.h:107
+#: ../rules/base.xml.in.h:706 ../rules/base.extras.xml.in.h:108
msgid "Slovak"
msgstr ""
-#: ../rules/base.xml.in.h:706
+#: ../rules/base.xml.in.h:707
msgid "Slovak (extended Backslash)"
msgstr ""
-#: ../rules/base.xml.in.h:707
+#: ../rules/base.xml.in.h:708
msgid "Slovak (qwerty)"
msgstr ""
-#: ../rules/base.xml.in.h:708
+#: ../rules/base.xml.in.h:709
msgid "Slovak (qwerty, extended Backslash)"
msgstr ""
-#: ../rules/base.xml.in.h:709 ../rules/base.extras.xml.in.h:110
+#: ../rules/base.xml.in.h:710 ../rules/base.extras.xml.in.h:111
msgid "Spanish"
msgstr ""
-#: ../rules/base.xml.in.h:710
+#: ../rules/base.xml.in.h:711
msgid "Spanish (eliminate dead keys)"
msgstr ""
-#: ../rules/base.xml.in.h:711
+#: ../rules/base.xml.in.h:712
msgid "Spanish (include dead tilde)"
msgstr ""
-#: ../rules/base.xml.in.h:712
+#: ../rules/base.xml.in.h:713
msgid "Spanish (Sun dead keys)"
msgstr ""
-#: ../rules/base.xml.in.h:713
+#: ../rules/base.xml.in.h:714
msgid "Spanish (Dvorak)"
msgstr ""
-#: ../rules/base.xml.in.h:714
+#: ../rules/base.xml.in.h:715
msgid "Asturian (Spain, with bottom-dot H and bottom-dot L)"
msgstr ""
-#: ../rules/base.xml.in.h:715
+#: ../rules/base.xml.in.h:716
msgid "Catalan (Spain, with middle-dot L)"
msgstr ""
-#: ../rules/base.xml.in.h:716
+#: ../rules/base.xml.in.h:717
msgid "Spanish (Macintosh)"
msgstr ""
#. Keyboard indicator for Swedish layouts
-#: ../rules/base.xml.in.h:718 ../rules/base.extras.xml.in.h:112
+#: ../rules/base.xml.in.h:719 ../rules/base.extras.xml.in.h:113
msgid "sv"
msgstr ""
-#: ../rules/base.xml.in.h:719 ../rules/base.extras.xml.in.h:113
+#: ../rules/base.xml.in.h:720 ../rules/base.extras.xml.in.h:114
msgid "Swedish"
msgstr ""
-#: ../rules/base.xml.in.h:720
+#: ../rules/base.xml.in.h:721
msgid "Swedish (eliminate dead keys)"
msgstr ""
-#: ../rules/base.xml.in.h:721
+#: ../rules/base.xml.in.h:722
msgid "Swedish (Dvorak)"
msgstr ""
-#: ../rules/base.xml.in.h:722
+#: ../rules/base.xml.in.h:723
msgid "Russian (Sweden, phonetic)"
msgstr ""
-#: ../rules/base.xml.in.h:723
+#: ../rules/base.xml.in.h:724
msgid "Russian (Sweden, phonetic, eliminate dead keys)"
msgstr ""
-#: ../rules/base.xml.in.h:724
+#: ../rules/base.xml.in.h:725
msgid "Northern Saami (Sweden)"
msgstr ""
-#: ../rules/base.xml.in.h:725
+#: ../rules/base.xml.in.h:726
msgid "Swedish (Macintosh)"
msgstr ""
-#: ../rules/base.xml.in.h:726
+#: ../rules/base.xml.in.h:727
msgid "Swedish (Svdvorak)"
msgstr ""
-#: ../rules/base.xml.in.h:727
+#: ../rules/base.xml.in.h:728
msgid "Swedish Sign Language"
msgstr ""
-#: ../rules/base.xml.in.h:728 ../rules/base.extras.xml.in.h:115
+#: ../rules/base.xml.in.h:729 ../rules/base.extras.xml.in.h:116
msgid "German (Switzerland)"
msgstr ""
-#: ../rules/base.xml.in.h:729
+#: ../rules/base.xml.in.h:730
msgid "German (Switzerland, legacy)"
msgstr ""
-#: ../rules/base.xml.in.h:730
+#: ../rules/base.xml.in.h:731
msgid "German (Switzerland, eliminate dead keys)"
msgstr ""
-#: ../rules/base.xml.in.h:731
+#: ../rules/base.xml.in.h:732
msgid "German (Switzerland, Sun dead keys)"
msgstr ""
-#: ../rules/base.xml.in.h:732
+#: ../rules/base.xml.in.h:733
msgid "French (Switzerland)"
msgstr ""
-#: ../rules/base.xml.in.h:733
+#: ../rules/base.xml.in.h:734
msgid "French (Switzerland, eliminate dead keys)"
msgstr ""
-#: ../rules/base.xml.in.h:734
+#: ../rules/base.xml.in.h:735
msgid "French (Switzerland, Sun dead keys)"
msgstr ""
-#: ../rules/base.xml.in.h:735
+#: ../rules/base.xml.in.h:736
msgid "French (Switzerland, Macintosh)"
msgstr ""
-#: ../rules/base.xml.in.h:736
+#: ../rules/base.xml.in.h:737
msgid "German (Switzerland, Macintosh)"
msgstr ""
-#: ../rules/base.xml.in.h:737
+#: ../rules/base.xml.in.h:738
msgid "Arabic (Syria)"
msgstr ""
#. Keyboard indicator for Syriac layouts
-#: ../rules/base.xml.in.h:739
+#: ../rules/base.xml.in.h:740
msgid "syc"
msgstr ""
-#: ../rules/base.xml.in.h:740
+#: ../rules/base.xml.in.h:741
msgid "Syriac"
msgstr ""
-#: ../rules/base.xml.in.h:741
+#: ../rules/base.xml.in.h:742
msgid "Syriac (phonetic)"
msgstr ""
-#: ../rules/base.xml.in.h:742
+#: ../rules/base.xml.in.h:743
msgid "Kurdish (Syria, Latin Q)"
msgstr ""
-#: ../rules/base.xml.in.h:743
+#: ../rules/base.xml.in.h:744
msgid "Kurdish (Syria, F)"
msgstr ""
-#: ../rules/base.xml.in.h:744
+#: ../rules/base.xml.in.h:745
msgid "Kurdish (Syria, Latin Alt-Q)"
msgstr ""
#. Keyboard indicator for Tajik layouts
-#: ../rules/base.xml.in.h:746
+#: ../rules/base.xml.in.h:747
msgid "tg"
msgstr ""
-#: ../rules/base.xml.in.h:747
+#: ../rules/base.xml.in.h:748
msgid "Tajik"
msgstr ""
-#: ../rules/base.xml.in.h:748
+#: ../rules/base.xml.in.h:749
msgid "Tajik (legacy)"
msgstr ""
#. Keyboard indicator for Sinhala layouts
-#: ../rules/base.xml.in.h:750
+#: ../rules/base.xml.in.h:751
msgid "si"
msgstr ""
-#: ../rules/base.xml.in.h:751
+#: ../rules/base.xml.in.h:752
msgid "Sinhala (phonetic)"
msgstr ""
-#: ../rules/base.xml.in.h:752
+#: ../rules/base.xml.in.h:753
msgid "Tamil (Sri Lanka, Unicode)"
msgstr ""
-#: ../rules/base.xml.in.h:753
+#: ../rules/base.xml.in.h:754
msgid "Tamil (Sri Lanka, TAB Typewriter)"
msgstr ""
#. Keyboard indicator for Thai layouts
-#: ../rules/base.xml.in.h:755
+#: ../rules/base.xml.in.h:756
msgid "th"
msgstr ""
-#: ../rules/base.xml.in.h:756
+#: ../rules/base.xml.in.h:757
msgid "Thai"
msgstr ""
-#: ../rules/base.xml.in.h:757
+#: ../rules/base.xml.in.h:758
msgid "Thai (TIS-820.2538)"
msgstr ""
-#: ../rules/base.xml.in.h:758
+#: ../rules/base.xml.in.h:759
msgid "Thai (Pattachote)"
msgstr ""
#. Keyboard indicator for Turkish layouts
-#: ../rules/base.xml.in.h:760 ../rules/base.extras.xml.in.h:118
+#: ../rules/base.xml.in.h:761 ../rules/base.extras.xml.in.h:119
msgid "tr"
msgstr ""
-#: ../rules/base.xml.in.h:761 ../rules/base.extras.xml.in.h:119
+#: ../rules/base.xml.in.h:762 ../rules/base.extras.xml.in.h:120
msgid "Turkish"
msgstr ""
-#: ../rules/base.xml.in.h:762
+#: ../rules/base.xml.in.h:763
msgid "Turkish (F)"
msgstr ""
-#: ../rules/base.xml.in.h:763
+#: ../rules/base.xml.in.h:764
msgid "Turkish (Alt-Q)"
msgstr ""
-#: ../rules/base.xml.in.h:764
+#: ../rules/base.xml.in.h:765
msgid "Turkish (Sun dead keys)"
msgstr ""
-#: ../rules/base.xml.in.h:765
+#: ../rules/base.xml.in.h:766
msgid "Kurdish (Turkey, Latin Q)"
msgstr ""
-#: ../rules/base.xml.in.h:766
+#: ../rules/base.xml.in.h:767
msgid "Kurdish (Turkey, F)"
msgstr ""
-#: ../rules/base.xml.in.h:767
+#: ../rules/base.xml.in.h:768
msgid "Kurdish (Turkey, Latin Alt-Q)"
msgstr ""
-#: ../rules/base.xml.in.h:768
+#: ../rules/base.xml.in.h:769
msgid "Turkish (international with dead keys)"
msgstr ""
#. Keyboard indicator for Crimean Tatar layouts
-#: ../rules/base.xml.in.h:770 ../rules/base.extras.xml.in.h:47
+#: ../rules/base.xml.in.h:771 ../rules/base.extras.xml.in.h:48
msgid "crh"
msgstr ""
-#: ../rules/base.xml.in.h:771
+#: ../rules/base.xml.in.h:772
msgid "Crimean Tatar (Turkish Q)"
msgstr ""
-#: ../rules/base.xml.in.h:772
+#: ../rules/base.xml.in.h:773
msgid "Crimean Tatar (Turkish F)"
msgstr ""
-#: ../rules/base.xml.in.h:773
+#: ../rules/base.xml.in.h:774
msgid "Crimean Tatar (Turkish Alt-Q)"
msgstr ""
-#: ../rules/base.xml.in.h:774
+#: ../rules/base.xml.in.h:775
msgid "Taiwanese"
msgstr ""
-#: ../rules/base.xml.in.h:775
+#: ../rules/base.xml.in.h:776
msgid "Taiwanese (indigenous)"
msgstr ""
#. Keyboard indicator for Saisiyat layouts
-#: ../rules/base.xml.in.h:777
+#: ../rules/base.xml.in.h:778
msgid "xsy"
msgstr ""
-#: ../rules/base.xml.in.h:778
+#: ../rules/base.xml.in.h:779
msgid "Saisiyat (Taiwan)"
msgstr ""
#. Keyboard indicator for Ukranian layouts
-#: ../rules/base.xml.in.h:780 ../rules/base.extras.xml.in.h:121
+#: ../rules/base.xml.in.h:781 ../rules/base.extras.xml.in.h:122
msgid "uk"
msgstr ""
-#: ../rules/base.xml.in.h:781 ../rules/base.extras.xml.in.h:122
+#: ../rules/base.xml.in.h:782 ../rules/base.extras.xml.in.h:123
msgid "Ukrainian"
msgstr ""
-#: ../rules/base.xml.in.h:782
+#: ../rules/base.xml.in.h:783
msgid "Ukrainian (phonetic)"
msgstr ""
-#: ../rules/base.xml.in.h:783
+#: ../rules/base.xml.in.h:784
msgid "Ukrainian (typewriter)"
msgstr ""
-#: ../rules/base.xml.in.h:784
+#: ../rules/base.xml.in.h:785
msgid "Ukrainian (WinKeys)"
msgstr ""
-#: ../rules/base.xml.in.h:785
+#: ../rules/base.xml.in.h:786
msgid "Ukrainian (legacy)"
msgstr ""
-#: ../rules/base.xml.in.h:786
+#: ../rules/base.xml.in.h:787
msgid "Ukrainian (standard RSTU)"
msgstr ""
-#: ../rules/base.xml.in.h:787
+#: ../rules/base.xml.in.h:788
msgid "Russian (Ukraine, standard RSTU)"
msgstr ""
-#: ../rules/base.xml.in.h:788
+#: ../rules/base.xml.in.h:789
msgid "Ukrainian (homophonic)"
msgstr ""
-#: ../rules/base.xml.in.h:789 ../rules/base.extras.xml.in.h:124
+#: ../rules/base.xml.in.h:790 ../rules/base.extras.xml.in.h:125
msgid "English (UK)"
msgstr ""
-#: ../rules/base.xml.in.h:790
+#: ../rules/base.xml.in.h:791
msgid "English (UK, extended WinKeys)"
msgstr ""
-#: ../rules/base.xml.in.h:791
+#: ../rules/base.xml.in.h:792
msgid "English (UK, international with dead keys)"
msgstr ""
-#: ../rules/base.xml.in.h:792
+#: ../rules/base.xml.in.h:793
msgid "English (UK, Dvorak)"
msgstr ""
-#: ../rules/base.xml.in.h:793
+#: ../rules/base.xml.in.h:794
msgid "English (UK, Dvorak with UK punctuation)"
msgstr ""
-#: ../rules/base.xml.in.h:794
+#: ../rules/base.xml.in.h:795
msgid "English (UK, Macintosh)"
msgstr ""
-#: ../rules/base.xml.in.h:795
+#: ../rules/base.xml.in.h:796
msgid "English (UK, Macintosh international)"
msgstr ""
-#: ../rules/base.xml.in.h:796
+#: ../rules/base.xml.in.h:797
msgid "English (UK, Colemak)"
msgstr ""
-#: ../rules/base.xml.in.h:797
+#: ../rules/base.xml.in.h:798
msgid "Uzbek"
msgstr ""
-#: ../rules/base.xml.in.h:798
+#: ../rules/base.xml.in.h:799
msgid "Uzbek (Latin)"
msgstr ""
#. Keyboard indicator for Vietnamese layouts
-#: ../rules/base.xml.in.h:800
+#: ../rules/base.xml.in.h:801
msgid "vi"
msgstr ""
-#: ../rules/base.xml.in.h:801
+#: ../rules/base.xml.in.h:802
msgid "Vietnamese"
msgstr ""
#. Keyboard indicator for Korean layouts
-#: ../rules/base.xml.in.h:803 ../rules/base.extras.xml.in.h:126
+#: ../rules/base.xml.in.h:804 ../rules/base.extras.xml.in.h:127
msgid "ko"
msgstr ""
-#: ../rules/base.xml.in.h:804 ../rules/base.extras.xml.in.h:127
+#: ../rules/base.xml.in.h:805 ../rules/base.extras.xml.in.h:128
msgid "Korean"
msgstr ""
-#: ../rules/base.xml.in.h:805
+#: ../rules/base.xml.in.h:806
msgid "Korean (101/104 key compatible)"
msgstr ""
-#: ../rules/base.xml.in.h:806
+#: ../rules/base.xml.in.h:807
msgid "Japanese (PC-98xx Series)"
msgstr ""
#. Keyboard indicator for Irish layouts
-#: ../rules/base.xml.in.h:808
+#: ../rules/base.xml.in.h:809
msgid "ie"
msgstr ""
-#: ../rules/base.xml.in.h:809
+#: ../rules/base.xml.in.h:810
msgid "Irish"
msgstr ""
-#: ../rules/base.xml.in.h:810
+#: ../rules/base.xml.in.h:811
msgid "CloGaelach"
msgstr ""
-#: ../rules/base.xml.in.h:811
+#: ../rules/base.xml.in.h:812
msgid "Irish (UnicodeExpert)"
msgstr ""
-#: ../rules/base.xml.in.h:812
+#: ../rules/base.xml.in.h:813
msgid "Ogham"
msgstr ""
-#: ../rules/base.xml.in.h:813
+#: ../rules/base.xml.in.h:814
msgid "Ogham (IS434)"
msgstr ""
-#: ../rules/base.xml.in.h:814
+#: ../rules/base.xml.in.h:815
msgid "Urdu (Pakistan)"
msgstr ""
-#: ../rules/base.xml.in.h:815
+#: ../rules/base.xml.in.h:816
msgid "Urdu (Pakistan, CRULP)"
msgstr ""
-#: ../rules/base.xml.in.h:816
+#: ../rules/base.xml.in.h:817
msgid "Urdu (Pakistan, NLA)"
msgstr ""
-#: ../rules/base.xml.in.h:817
+#: ../rules/base.xml.in.h:818
msgid "Arabic (Pakistan)"
msgstr ""
#. Keyboard indicator for Sindhi layouts
-#: ../rules/base.xml.in.h:819
+#: ../rules/base.xml.in.h:820
msgid "sd"
msgstr ""
-#: ../rules/base.xml.in.h:820
+#: ../rules/base.xml.in.h:821
msgid "Sindhi"
msgstr ""
#. Keyboard indicator for Dhivehi layouts
-#: ../rules/base.xml.in.h:822
+#: ../rules/base.xml.in.h:823
msgid "dv"
msgstr ""
-#: ../rules/base.xml.in.h:823
+#: ../rules/base.xml.in.h:824
msgid "Dhivehi"
msgstr ""
-#: ../rules/base.xml.in.h:824
+#: ../rules/base.xml.in.h:825
msgid "English (South Africa)"
msgstr ""
#. Keyboard indicator for Esperanto layouts
-#: ../rules/base.xml.in.h:826
+#: ../rules/base.xml.in.h:827
msgid "eo"
msgstr ""
-#: ../rules/base.xml.in.h:827
+#: ../rules/base.xml.in.h:828
msgid "Esperanto"
msgstr ""
-#: ../rules/base.xml.in.h:828
+#: ../rules/base.xml.in.h:829
msgid "Esperanto (displaced semicolon and quote, obsolete)"
msgstr ""
#. Keyboard indicator for Nepali layouts
-#: ../rules/base.xml.in.h:830
+#: ../rules/base.xml.in.h:831
msgid "ne"
msgstr ""
-#: ../rules/base.xml.in.h:831
+#: ../rules/base.xml.in.h:832
msgid "Nepali"
msgstr ""
-#: ../rules/base.xml.in.h:832
+#: ../rules/base.xml.in.h:833
msgid "English (Nigeria)"
msgstr ""
#. Keyboard indicator for Igbo layouts
-#: ../rules/base.xml.in.h:834
+#: ../rules/base.xml.in.h:835
msgid "ig"
msgstr ""
-#: ../rules/base.xml.in.h:835
+#: ../rules/base.xml.in.h:836
msgid "Igbo"
msgstr ""
#. Keyboard indicator for Yoruba layouts
-#: ../rules/base.xml.in.h:837
+#: ../rules/base.xml.in.h:838
msgid "yo"
msgstr ""
-#: ../rules/base.xml.in.h:838
+#: ../rules/base.xml.in.h:839
msgid "Yoruba"
msgstr ""
#. Keyboard indicator for Amharic layouts
-#: ../rules/base.xml.in.h:840
+#: ../rules/base.xml.in.h:841
msgid "am"
msgstr ""
-#: ../rules/base.xml.in.h:841
+#: ../rules/base.xml.in.h:842
msgid "Amharic"
msgstr ""
#. Keyboard indicator for Wolof layouts
-#: ../rules/base.xml.in.h:843
+#: ../rules/base.xml.in.h:844
msgid "wo"
msgstr ""
-#: ../rules/base.xml.in.h:844
+#: ../rules/base.xml.in.h:845
msgid "Wolof"
msgstr ""
#. Keyboard indicator for Braille layouts
-#: ../rules/base.xml.in.h:846
+#: ../rules/base.xml.in.h:847
msgid "brl"
msgstr ""
-#: ../rules/base.xml.in.h:847
+#: ../rules/base.xml.in.h:848
msgid "Braille"
msgstr ""
-#: ../rules/base.xml.in.h:848
+#: ../rules/base.xml.in.h:849
msgid "Braille (left hand)"
msgstr ""
-#: ../rules/base.xml.in.h:849
+#: ../rules/base.xml.in.h:850
msgid "Braille (right hand)"
msgstr ""
#. Keyboard indicator for Turkmen layouts
-#: ../rules/base.xml.in.h:851
+#: ../rules/base.xml.in.h:852
msgid "tk"
msgstr ""
-#: ../rules/base.xml.in.h:852
+#: ../rules/base.xml.in.h:853
msgid "Turkmen"
msgstr ""
-#: ../rules/base.xml.in.h:853
+#: ../rules/base.xml.in.h:854
msgid "Turkmen (Alt-Q)"
msgstr ""
#. Keyboard indicator for Bambara layouts
-#: ../rules/base.xml.in.h:855
+#: ../rules/base.xml.in.h:856
msgid "bm"
msgstr ""
-#: ../rules/base.xml.in.h:856
+#: ../rules/base.xml.in.h:857
msgid "Bambara"
msgstr ""
-#: ../rules/base.xml.in.h:857
+#: ../rules/base.xml.in.h:858
msgid "French (Mali, alternative)"
msgstr ""
-#: ../rules/base.xml.in.h:858
+#: ../rules/base.xml.in.h:859
msgid "English (Mali, US Macintosh)"
msgstr ""
-#: ../rules/base.xml.in.h:859
+#: ../rules/base.xml.in.h:860
msgid "English (Mali, US international)"
msgstr ""
#. Keyboard indicator for Swahili layouts
-#: ../rules/base.xml.in.h:861
+#: ../rules/base.xml.in.h:862
msgid "sw"
msgstr ""
-#: ../rules/base.xml.in.h:862
+#: ../rules/base.xml.in.h:863
msgid "Swahili (Tanzania)"
msgstr ""
-#: ../rules/base.xml.in.h:863
+#: ../rules/base.xml.in.h:864
msgid "Swahili (Kenya)"
msgstr ""
-#: ../rules/base.xml.in.h:864
+#: ../rules/base.xml.in.h:865
msgid "Kikuyu"
msgstr ""
#. Keyboard indicator for Tswana layouts
-#: ../rules/base.xml.in.h:866
+#: ../rules/base.xml.in.h:867
msgid "tn"
msgstr ""
-#: ../rules/base.xml.in.h:867
+#: ../rules/base.xml.in.h:868
msgid "Tswana"
msgstr ""
#. Keyboard indicator for Filipino layouts
-#: ../rules/base.xml.in.h:869
+#: ../rules/base.xml.in.h:870
msgid "ph"
msgstr ""
-#: ../rules/base.xml.in.h:870
+#: ../rules/base.xml.in.h:871
msgid "Filipino"
msgstr ""
-#: ../rules/base.xml.in.h:871
+#: ../rules/base.xml.in.h:872
msgid "Filipino (QWERTY Baybayin)"
msgstr ""
-#: ../rules/base.xml.in.h:872
+#: ../rules/base.xml.in.h:873
msgid "Filipino (Capewell-Dvorak Latin)"
msgstr ""
-#: ../rules/base.xml.in.h:873
+#: ../rules/base.xml.in.h:874
msgid "Filipino (Capewell-Dvorak Baybayin)"
msgstr ""
-#: ../rules/base.xml.in.h:874
+#: ../rules/base.xml.in.h:875
msgid "Filipino (Capewell-QWERF 2006 Latin)"
msgstr ""
-#: ../rules/base.xml.in.h:875
+#: ../rules/base.xml.in.h:876
msgid "Filipino (Capewell-QWERF 2006 Baybayin)"
msgstr ""
-#: ../rules/base.xml.in.h:876
+#: ../rules/base.xml.in.h:877
msgid "Filipino (Colemak Latin)"
msgstr ""
-#: ../rules/base.xml.in.h:877
+#: ../rules/base.xml.in.h:878
msgid "Filipino (Colemak Baybayin)"
msgstr ""
-#: ../rules/base.xml.in.h:878
+#: ../rules/base.xml.in.h:879
msgid "Filipino (Dvorak Latin)"
msgstr ""
-#: ../rules/base.xml.in.h:879
+#: ../rules/base.xml.in.h:880
msgid "Filipino (Dvorak Baybayin)"
msgstr ""
-#: ../rules/base.xml.in.h:880
+#: ../rules/base.xml.in.h:881
msgid "md"
msgstr ""
-#: ../rules/base.xml.in.h:881
+#: ../rules/base.xml.in.h:882
msgid "Moldavian"
msgstr ""
-#: ../rules/base.xml.in.h:882
+#: ../rules/base.xml.in.h:883
msgid "gag"
msgstr ""
-#: ../rules/base.xml.in.h:883
+#: ../rules/base.xml.in.h:884
msgid "Moldavian (Gagauz)"
msgstr ""
-#: ../rules/base.xml.in.h:884
+#: ../rules/base.xml.in.h:885
msgid "Switching to another layout"
msgstr ""
-#: ../rules/base.xml.in.h:885
+#: ../rules/base.xml.in.h:886
msgid "Right Alt (while pressed)"
msgstr ""
-#: ../rules/base.xml.in.h:886
+#: ../rules/base.xml.in.h:887
msgid "Left Alt (while pressed)"
msgstr ""
-#: ../rules/base.xml.in.h:887
+#: ../rules/base.xml.in.h:888
msgid "Left Win (while pressed)"
msgstr ""
-#: ../rules/base.xml.in.h:888
+#: ../rules/base.xml.in.h:889
msgid "Right Win (while pressed)"
msgstr ""
-#: ../rules/base.xml.in.h:889
+#: ../rules/base.xml.in.h:890
msgid "Any Win key (while pressed)"
msgstr ""
-#: ../rules/base.xml.in.h:890
+#: ../rules/base.xml.in.h:891
msgid ""
"Caps Lock (while pressed), Alt+Caps Lock does the original capslock action"
msgstr ""
-#: ../rules/base.xml.in.h:891
+#: ../rules/base.xml.in.h:892
msgid "Right Ctrl (while pressed)"
msgstr ""
-#: ../rules/base.xml.in.h:892
+#: ../rules/base.xml.in.h:893
msgid "Right Alt"
msgstr ""
-#: ../rules/base.xml.in.h:893
+#: ../rules/base.xml.in.h:894
msgid "Left Alt"
msgstr ""
-#: ../rules/base.xml.in.h:894
+#: ../rules/base.xml.in.h:895
msgid "Caps Lock"
msgstr ""
-#: ../rules/base.xml.in.h:895
+#: ../rules/base.xml.in.h:896
msgid "Shift+Caps Lock"
msgstr ""
-#: ../rules/base.xml.in.h:896
+#: ../rules/base.xml.in.h:897
msgid "Caps Lock (to first layout), Shift+Caps Lock (to last layout)"
msgstr ""
-#: ../rules/base.xml.in.h:897
+#: ../rules/base.xml.in.h:898
msgid "Left Win (to first layout), Right Win/Menu (to last layout)"
msgstr ""
-#: ../rules/base.xml.in.h:898
+#: ../rules/base.xml.in.h:899
msgid "Left Ctrl (to first layout), Right Ctrl (to last layout)"
msgstr ""
-#: ../rules/base.xml.in.h:899
+#: ../rules/base.xml.in.h:900
msgid "Alt+Caps Lock"
msgstr ""
-#: ../rules/base.xml.in.h:900
+#: ../rules/base.xml.in.h:901
msgid "Both Shift keys together"
msgstr ""
-#: ../rules/base.xml.in.h:901
+#: ../rules/base.xml.in.h:902
msgid "Both Alt keys together"
msgstr ""
-#: ../rules/base.xml.in.h:902
+#: ../rules/base.xml.in.h:903
msgid "Both Ctrl keys together"
msgstr ""
-#: ../rules/base.xml.in.h:903
+#: ../rules/base.xml.in.h:904
msgid "Ctrl+Shift"
msgstr ""
-#: ../rules/base.xml.in.h:904
+#: ../rules/base.xml.in.h:905
msgid "Left Ctrl+Left Shift"
msgstr ""
-#: ../rules/base.xml.in.h:905
+#: ../rules/base.xml.in.h:906
msgid "Right Ctrl+Right Shift"
msgstr ""
-#: ../rules/base.xml.in.h:906
+#: ../rules/base.xml.in.h:907
msgid "Alt+Ctrl"
msgstr ""
-#: ../rules/base.xml.in.h:907
+#: ../rules/base.xml.in.h:908
msgid "Alt+Shift"
msgstr ""
-#: ../rules/base.xml.in.h:908
+#: ../rules/base.xml.in.h:909
msgid "Left Alt+Left Shift"
msgstr ""
-#: ../rules/base.xml.in.h:909
+#: ../rules/base.xml.in.h:910
msgid "Alt+Space"
msgstr ""
-#: ../rules/base.xml.in.h:910
+#: ../rules/base.xml.in.h:911
msgid "Menu"
msgstr ""
-#: ../rules/base.xml.in.h:911
+#: ../rules/base.xml.in.h:912
msgid "Left Win"
msgstr ""
-#: ../rules/base.xml.in.h:912
+#: ../rules/base.xml.in.h:913
msgid "Right Win"
msgstr ""
-#: ../rules/base.xml.in.h:913
+#: ../rules/base.xml.in.h:914
msgid "Left Shift"
msgstr ""
-#: ../rules/base.xml.in.h:914
+#: ../rules/base.xml.in.h:915
msgid "Right Shift"
msgstr ""
-#: ../rules/base.xml.in.h:915
+#: ../rules/base.xml.in.h:916
msgid "Left Ctrl"
msgstr ""
-#: ../rules/base.xml.in.h:916
+#: ../rules/base.xml.in.h:917
msgid "Right Ctrl"
msgstr ""
-#: ../rules/base.xml.in.h:917
+#: ../rules/base.xml.in.h:918
msgid "Scroll Lock"
msgstr ""
-#: ../rules/base.xml.in.h:918
+#: ../rules/base.xml.in.h:919
msgid "LeftCtrl+LeftWin (to first layout), RightCtrl+Menu (to second layout)"
msgstr ""
-#: ../rules/base.xml.in.h:919
+#: ../rules/base.xml.in.h:920
msgid "Key to choose 3rd level"
msgstr ""
-#: ../rules/base.xml.in.h:920
+#: ../rules/base.xml.in.h:921
msgid "Any Win key"
msgstr ""
-#: ../rules/base.xml.in.h:921
+#: ../rules/base.xml.in.h:922
msgid "Any Alt key"
msgstr ""
-#: ../rules/base.xml.in.h:922
+#: ../rules/base.xml.in.h:923
msgid "Right Alt, Shift+Right Alt key is Compose"
msgstr ""
-#: ../rules/base.xml.in.h:923
+#: ../rules/base.xml.in.h:924
msgid "Right Alt key never chooses 3rd level"
msgstr ""
-#: ../rules/base.xml.in.h:924
+#: ../rules/base.xml.in.h:925
msgid "Enter on keypad"
msgstr ""
-#: ../rules/base.xml.in.h:925
+#: ../rules/base.xml.in.h:926
msgid "Backslash"
msgstr ""
-#: ../rules/base.xml.in.h:926
+#: ../rules/base.xml.in.h:927
msgid "&lt;Less/Greater&gt;"
msgstr ""
-#: ../rules/base.xml.in.h:927
+#: ../rules/base.xml.in.h:928
msgid ""
"Caps Lock chooses 3rd level, acts as onetime lock when pressed together with "
"another 3rd-level-chooser"
msgstr ""
-#: ../rules/base.xml.in.h:928
+#: ../rules/base.xml.in.h:929
msgid ""
"Backslash chooses 3rd level, acts as onetime lock when pressed together with "
"another 3rd-level-chooser"
msgstr ""
-#: ../rules/base.xml.in.h:929
+#: ../rules/base.xml.in.h:930
msgid ""
"&lt;Less/Greater&gt; chooses 3rd level, acts as onetime lock when pressed "
"together with another 3rd-level-chooser"
msgstr ""
-#: ../rules/base.xml.in.h:930
+#: ../rules/base.xml.in.h:931
msgid "Ctrl key position"
msgstr ""
-#: ../rules/base.xml.in.h:931
+#: ../rules/base.xml.in.h:932
msgid "Caps Lock as Ctrl"
msgstr ""
-#: ../rules/base.xml.in.h:932
+#: ../rules/base.xml.in.h:933
msgid "Left Ctrl as Meta"
msgstr ""
-#: ../rules/base.xml.in.h:933
+#: ../rules/base.xml.in.h:934
msgid "Swap Ctrl and Caps Lock"
msgstr ""
-#: ../rules/base.xml.in.h:934
+#: ../rules/base.xml.in.h:935
msgid "At left of 'A'"
msgstr ""
-#: ../rules/base.xml.in.h:935
+#: ../rules/base.xml.in.h:936
msgid "At bottom left"
msgstr ""
-#: ../rules/base.xml.in.h:936
+#: ../rules/base.xml.in.h:937
msgid "Right Ctrl as Right Alt"
msgstr ""
-#: ../rules/base.xml.in.h:937
+#: ../rules/base.xml.in.h:938
msgid "Menu as Right Ctrl"
msgstr ""
-#: ../rules/base.xml.in.h:938
+#: ../rules/base.xml.in.h:939
msgid "Right Alt as Right Ctrl"
msgstr ""
-#: ../rules/base.xml.in.h:939
+#: ../rules/base.xml.in.h:940
+msgid "Swap Left Alt key with Left Ctrl key"
+msgstr ""
+
+#: ../rules/base.xml.in.h:941
+msgid "Swap Left Win key with Left Ctrl key"
+msgstr ""
+
+#: ../rules/base.xml.in.h:942
+msgid "Left Alt as Ctrl, Left Ctrl as Win, Left Win as Alt"
+msgstr ""
+
+#: ../rules/base.xml.in.h:943
msgid "Use keyboard LED to show alternative layout"
msgstr ""
-#: ../rules/base.xml.in.h:940
+#: ../rules/base.xml.in.h:944
msgid "Num Lock"
msgstr ""
-#: ../rules/base.xml.in.h:941
+#: ../rules/base.xml.in.h:945
msgid "Layout of numeric keypad"
msgstr ""
-#: ../rules/base.xml.in.h:942
+#: ../rules/base.xml.in.h:946
msgid "Legacy"
msgstr ""
-#: ../rules/base.xml.in.h:943
+#: ../rules/base.xml.in.h:947
msgid "Unicode additions (arrows and math operators)"
msgstr ""
-#: ../rules/base.xml.in.h:944
+#: ../rules/base.xml.in.h:948
msgid ""
"Unicode additions (arrows and math operators; math operators on default "
"level)"
msgstr ""
-#: ../rules/base.xml.in.h:945
+#: ../rules/base.xml.in.h:949
msgid "Legacy Wang 724"
msgstr ""
-#: ../rules/base.xml.in.h:946
+#: ../rules/base.xml.in.h:950
msgid "Wang 724 keypad with Unicode additions (arrows and math operators)"
msgstr ""
-#: ../rules/base.xml.in.h:947
+#: ../rules/base.xml.in.h:951
msgid ""
"Wang 724 keypad with Unicode additions (arrows and math operators; math "
"operators on default level)"
msgstr ""
-#: ../rules/base.xml.in.h:948
+#: ../rules/base.xml.in.h:952
msgid "Hexadecimal"
msgstr ""
-#: ../rules/base.xml.in.h:949
+#: ../rules/base.xml.in.h:953
msgid "ATM/phone-style"
msgstr ""
-#: ../rules/base.xml.in.h:950
+#: ../rules/base.xml.in.h:954
msgid "Numeric keypad delete key behaviour"
msgstr ""
-#: ../rules/base.xml.in.h:951
+#: ../rules/base.xml.in.h:955
msgid "Legacy key with dot"
msgstr ""
#. Actually, with KP_SEPARATOR, as the old keypad(comma)
-#: ../rules/base.xml.in.h:953
+#: ../rules/base.xml.in.h:957
msgid "Legacy key with comma"
msgstr ""
-#: ../rules/base.xml.in.h:954
+#: ../rules/base.xml.in.h:958
msgid "Four-level key with dot"
msgstr ""
-#: ../rules/base.xml.in.h:955
+#: ../rules/base.xml.in.h:959
msgid "Four-level key with dot, Latin-9 only"
msgstr ""
-#: ../rules/base.xml.in.h:956
+#: ../rules/base.xml.in.h:960
msgid "Four-level key with comma"
msgstr ""
-#: ../rules/base.xml.in.h:957
+#: ../rules/base.xml.in.h:961
msgid "Four-level key with momayyez"
msgstr ""
#. This assumes the KP_ abstract symbols are actually useful for some apps
#. The description needs to be rewritten
-#: ../rules/base.xml.in.h:960
+#: ../rules/base.xml.in.h:964
msgid "Four-level key with abstract separators"
msgstr ""
-#: ../rules/base.xml.in.h:961
+#: ../rules/base.xml.in.h:965
msgid "Semicolon on third level"
msgstr ""
-#: ../rules/base.xml.in.h:962
+#: ../rules/base.xml.in.h:966
msgid "Caps Lock key behavior"
msgstr ""
-#: ../rules/base.xml.in.h:963
+#: ../rules/base.xml.in.h:967
msgid "Caps Lock uses internal capitalization; Shift \"pauses\" Caps Lock"
msgstr ""
-#: ../rules/base.xml.in.h:964
+#: ../rules/base.xml.in.h:968
msgid "Caps Lock uses internal capitalization; Shift doesn't affect Caps Lock"
msgstr ""
-#: ../rules/base.xml.in.h:965
+#: ../rules/base.xml.in.h:969
msgid "Caps Lock acts as Shift with locking; Shift \"pauses\" Caps Lock"
msgstr ""
-#: ../rules/base.xml.in.h:966
+#: ../rules/base.xml.in.h:970
msgid "Caps Lock acts as Shift with locking; Shift doesn't affect Caps Lock"
msgstr ""
-#: ../rules/base.xml.in.h:967
+#: ../rules/base.xml.in.h:971
msgid "Caps Lock toggles normal capitalization of alphabetic characters"
msgstr ""
-#: ../rules/base.xml.in.h:968
+#: ../rules/base.xml.in.h:972
msgid "Make Caps Lock an additional Num Lock"
msgstr ""
-#: ../rules/base.xml.in.h:969
+#: ../rules/base.xml.in.h:973
msgid "Swap ESC and Caps Lock"
msgstr ""
-#: ../rules/base.xml.in.h:970
+#: ../rules/base.xml.in.h:974
msgid "Make Caps Lock an additional ESC"
msgstr ""
-#: ../rules/base.xml.in.h:971
+#: ../rules/base.xml.in.h:975
msgid "Make Caps Lock an additional Backspace"
msgstr ""
-#: ../rules/base.xml.in.h:972
+#: ../rules/base.xml.in.h:976
msgid "Make Caps Lock an additional Super"
msgstr ""
-#: ../rules/base.xml.in.h:973
+#: ../rules/base.xml.in.h:977
msgid "Make Caps Lock an additional Hyper"
msgstr ""
-#: ../rules/base.xml.in.h:974
+#: ../rules/base.xml.in.h:978
msgid "Caps Lock toggles ShiftLock (affects all keys)"
msgstr ""
-#: ../rules/base.xml.in.h:975
+#: ../rules/base.xml.in.h:979
msgid "Caps Lock is disabled"
msgstr ""
-#: ../rules/base.xml.in.h:976
+#: ../rules/base.xml.in.h:980
msgid "Make Caps Lock an additional Ctrl"
msgstr ""
-#: ../rules/base.xml.in.h:977
+#: ../rules/base.xml.in.h:981
msgid "Alt/Win key behavior"
msgstr ""
-#: ../rules/base.xml.in.h:978
+#: ../rules/base.xml.in.h:982
msgid "Add the standard behavior to Menu key"
msgstr ""
-#: ../rules/base.xml.in.h:979
+#: ../rules/base.xml.in.h:983
msgid "Alt and Meta are on Alt keys"
msgstr ""
-#: ../rules/base.xml.in.h:980
+#: ../rules/base.xml.in.h:984
msgid "Alt is mapped to Win keys (and the usual Alt keys)"
msgstr ""
-#: ../rules/base.xml.in.h:981
+#: ../rules/base.xml.in.h:985
msgid "Ctrl is mapped to Win keys (and the usual Ctrl keys)"
msgstr ""
-#: ../rules/base.xml.in.h:982
+#: ../rules/base.xml.in.h:986
msgid "Ctrl is mapped to Alt keys, Alt is mapped to Win keys"
msgstr ""
-#: ../rules/base.xml.in.h:983
+#: ../rules/base.xml.in.h:987
msgid "Meta is mapped to Win keys"
msgstr ""
-#: ../rules/base.xml.in.h:984
+#: ../rules/base.xml.in.h:988
msgid "Meta is mapped to Left Win"
msgstr ""
-#: ../rules/base.xml.in.h:985
+#: ../rules/base.xml.in.h:989
msgid "Hyper is mapped to Win-keys"
msgstr ""
-#: ../rules/base.xml.in.h:986
+#: ../rules/base.xml.in.h:990
msgid "Alt is mapped to Right Win, Super to Menu"
msgstr ""
-#: ../rules/base.xml.in.h:987
+#: ../rules/base.xml.in.h:991
msgid "Alt is swapped with Win"
msgstr ""
-#: ../rules/base.xml.in.h:988
+#: ../rules/base.xml.in.h:992
msgid "Position of Compose key"
msgstr ""
-#: ../rules/base.xml.in.h:989
+#: ../rules/base.xml.in.h:993
msgid "3rd level of Left Win"
msgstr ""
-#: ../rules/base.xml.in.h:990
+#: ../rules/base.xml.in.h:994
msgid "3rd level of Right Win"
msgstr ""
-#: ../rules/base.xml.in.h:991
+#: ../rules/base.xml.in.h:995
msgid "3rd level of Menu"
msgstr ""
-#: ../rules/base.xml.in.h:992
+#: ../rules/base.xml.in.h:996
msgid "3rd level of Left Ctrl"
msgstr ""
-#: ../rules/base.xml.in.h:993
+#: ../rules/base.xml.in.h:997
msgid "3rd level of Right Ctrl"
msgstr ""
-#: ../rules/base.xml.in.h:994
+#: ../rules/base.xml.in.h:998
msgid "3rd level of Caps Lock"
msgstr ""
-#: ../rules/base.xml.in.h:995
+#: ../rules/base.xml.in.h:999
msgid "3rd level of &lt;Less/Greater&gt;"
msgstr ""
-#: ../rules/base.xml.in.h:996
+#: ../rules/base.xml.in.h:1000
msgid "Pause"
msgstr ""
-#: ../rules/base.xml.in.h:997
+#: ../rules/base.xml.in.h:1001
msgid "PrtSc"
msgstr ""
-#: ../rules/base.xml.in.h:998
+#: ../rules/base.xml.in.h:1002
msgid "Miscellaneous compatibility options"
msgstr ""
-#: ../rules/base.xml.in.h:999
+#: ../rules/base.xml.in.h:1003
msgid "Default numeric keypad keys"
msgstr ""
-#: ../rules/base.xml.in.h:1000
+#: ../rules/base.xml.in.h:1004
msgid "Numeric keypad keys always enter digits (as in Mac OS)"
msgstr ""
-#: ../rules/base.xml.in.h:1001
+#: ../rules/base.xml.in.h:1005
msgid "Shift with numeric keypad keys works as in MS Windows"
msgstr ""
-#: ../rules/base.xml.in.h:1002
+#: ../rules/base.xml.in.h:1006
msgid "Shift does not cancel Num Lock, chooses 3rd level instead"
msgstr ""
-#: ../rules/base.xml.in.h:1003
+#: ../rules/base.xml.in.h:1007
msgid "Special keys (Ctrl+Alt+&lt;key&gt;) handled in a server"
msgstr ""
-#: ../rules/base.xml.in.h:1004
+#: ../rules/base.xml.in.h:1008
msgid ""
"Apple Aluminium Keyboard: emulate PC keys (Print, Scroll Lock, Pause, Num "
"Lock)"
msgstr ""
-#: ../rules/base.xml.in.h:1005
+#: ../rules/base.xml.in.h:1009
msgid "Shift cancels Caps Lock"
msgstr ""
-#: ../rules/base.xml.in.h:1006
+#: ../rules/base.xml.in.h:1010
msgid "Enable extra typographic characters"
msgstr ""
-#: ../rules/base.xml.in.h:1007
+#: ../rules/base.xml.in.h:1011
msgid "Both Shift keys together toggle Caps Lock"
msgstr ""
-#: ../rules/base.xml.in.h:1008
+#: ../rules/base.xml.in.h:1012
msgid "Both Shift keys together activate Caps Lock, one Shift key deactivates"
msgstr ""
-#: ../rules/base.xml.in.h:1009
+#: ../rules/base.xml.in.h:1013
msgid "Both Shift keys together toggle ShiftLock"
msgstr ""
-#: ../rules/base.xml.in.h:1010
+#: ../rules/base.xml.in.h:1014
msgid "Shift + NumLock toggles PointerKeys"
msgstr ""
-#: ../rules/base.xml.in.h:1011
+#: ../rules/base.xml.in.h:1015
msgid "Allow breaking grabs with keyboard actions (warning: security risk)"
msgstr ""
-#: ../rules/base.xml.in.h:1012
+#: ../rules/base.xml.in.h:1016
+msgid "Allow grab and window tree logging"
+msgstr ""
+
+#: ../rules/base.xml.in.h:1017
msgid "Adding currency signs to certain keys"
msgstr ""
-#: ../rules/base.xml.in.h:1013
+#: ../rules/base.xml.in.h:1018
msgid "Euro on E"
msgstr ""
-#: ../rules/base.xml.in.h:1014
+#: ../rules/base.xml.in.h:1019
msgid "Euro on 2"
msgstr ""
-#: ../rules/base.xml.in.h:1015
+#: ../rules/base.xml.in.h:1020
msgid "Euro on 4"
msgstr ""
-#: ../rules/base.xml.in.h:1016
+#: ../rules/base.xml.in.h:1021
msgid "Euro on 5"
msgstr ""
-#: ../rules/base.xml.in.h:1017
+#: ../rules/base.xml.in.h:1022
msgid "Rupee on 4"
msgstr ""
-#: ../rules/base.xml.in.h:1018
+#: ../rules/base.xml.in.h:1023
msgid "Key to choose 5th level"
msgstr ""
-#: ../rules/base.xml.in.h:1019
+#: ../rules/base.xml.in.h:1024
msgid ""
"&lt;Less/Greater&gt; chooses 5th level, locks when pressed together with "
"another 5th-level-chooser"
msgstr ""
-#: ../rules/base.xml.in.h:1020
+#: ../rules/base.xml.in.h:1025
msgid ""
"Right Alt chooses 5th level, locks when pressed together with another 5th-"
"level-chooser"
msgstr ""
-#: ../rules/base.xml.in.h:1021
+#: ../rules/base.xml.in.h:1026
msgid ""
"Left Win chooses 5th level, locks when pressed together with another 5th-"
"level-chooser"
msgstr ""
-#: ../rules/base.xml.in.h:1022
+#: ../rules/base.xml.in.h:1027
msgid ""
"Right Win chooses 5th level, locks when pressed together with another 5th-"
"level-chooser"
msgstr ""
-#: ../rules/base.xml.in.h:1023
+#: ../rules/base.xml.in.h:1028
msgid "Using space key to input non-breakable space character"
msgstr ""
-#: ../rules/base.xml.in.h:1024
+#: ../rules/base.xml.in.h:1029
msgid "Usual space at any level"
msgstr ""
-#: ../rules/base.xml.in.h:1025
+#: ../rules/base.xml.in.h:1030
msgid "Non-breakable space character at second level"
msgstr ""
-#: ../rules/base.xml.in.h:1026
+#: ../rules/base.xml.in.h:1031
msgid "Non-breakable space character at third level"
msgstr ""
-#: ../rules/base.xml.in.h:1027
+#: ../rules/base.xml.in.h:1032
msgid "Non-breakable space character at third level, nothing at fourth level"
msgstr ""
-#: ../rules/base.xml.in.h:1028
+#: ../rules/base.xml.in.h:1033
msgid ""
"Non-breakable space character at third level, thin non-breakable space "
"character at fourth level"
msgstr ""
-#: ../rules/base.xml.in.h:1029
+#: ../rules/base.xml.in.h:1034
msgid "Non-breakable space character at fourth level"
msgstr ""
-#: ../rules/base.xml.in.h:1030
+#: ../rules/base.xml.in.h:1035
msgid ""
"Non-breakable space character at fourth level, thin non-breakable space "
"character at sixth level"
msgstr ""
-#: ../rules/base.xml.in.h:1031
+#: ../rules/base.xml.in.h:1036
msgid ""
"Non-breakable space character at fourth level, thin non-breakable space "
"character at sixth level (via Ctrl+Shift)"
msgstr ""
-#: ../rules/base.xml.in.h:1032
+#: ../rules/base.xml.in.h:1037
msgid "Zero-width non-joiner character at second level"
msgstr ""
-#: ../rules/base.xml.in.h:1033
+#: ../rules/base.xml.in.h:1038
msgid ""
"Zero-width non-joiner character at second level, zero-width joiner character "
"at third level"
msgstr ""
-#: ../rules/base.xml.in.h:1034
+#: ../rules/base.xml.in.h:1039
msgid ""
"Zero-width non-joiner character at second level, zero-width joiner character "
"at third level, non-breakable space character at fourth level"
msgstr ""
-#: ../rules/base.xml.in.h:1035
+#: ../rules/base.xml.in.h:1040
msgid ""
"Zero-width non-joiner character at second level, non-breakable space "
"character at third level"
msgstr ""
-#: ../rules/base.xml.in.h:1036
+#: ../rules/base.xml.in.h:1041
msgid ""
"Zero-width non-joiner character at second level, non-breakable space "
"character at third level, nothing at fourth level"
msgstr ""
-#: ../rules/base.xml.in.h:1037
+#: ../rules/base.xml.in.h:1042
msgid ""
"Zero-width non-joiner character at second level, non-breakable space "
"character at third level, zero-width joiner at fourth level"
msgstr ""
-#: ../rules/base.xml.in.h:1038
+#: ../rules/base.xml.in.h:1043
msgid ""
"Zero-width non-joiner character at second level, non-breakable space "
"character at third level, thin non-breakable space at fourth level"
msgstr ""
-#: ../rules/base.xml.in.h:1039
+#: ../rules/base.xml.in.h:1044
msgid ""
"Zero-width non-joiner character at third level, zero-width joiner at fourth "
"level"
msgstr ""
-#: ../rules/base.xml.in.h:1040
+#: ../rules/base.xml.in.h:1045
msgid "Japanese keyboard options"
msgstr ""
-#: ../rules/base.xml.in.h:1041
+#: ../rules/base.xml.in.h:1046
msgid "Kana Lock key is locking"
msgstr ""
-#: ../rules/base.xml.in.h:1042
+#: ../rules/base.xml.in.h:1047
msgid "NICOLA-F style Backspace"
msgstr ""
-#: ../rules/base.xml.in.h:1043
+#: ../rules/base.xml.in.h:1048
msgid "Make Zenkaku Hankaku an additional ESC"
msgstr ""
-#: ../rules/base.xml.in.h:1044
+#: ../rules/base.xml.in.h:1049
msgid "Adding Esperanto supersigned letters"
msgstr ""
-#: ../rules/base.xml.in.h:1045
+#: ../rules/base.xml.in.h:1050
msgid "To the corresponding key in a Qwerty layout"
msgstr ""
-#: ../rules/base.xml.in.h:1046
+#: ../rules/base.xml.in.h:1051
msgid "To the corresponding key in a Dvorak layout"
msgstr ""
-#: ../rules/base.xml.in.h:1047
+#: ../rules/base.xml.in.h:1052
msgid "To the corresponding key in a Colemak layout"
msgstr ""
-#: ../rules/base.xml.in.h:1048
+#: ../rules/base.xml.in.h:1053
msgid "Maintain key compatibility with old Solaris keycodes"
msgstr ""
-#: ../rules/base.xml.in.h:1049
+#: ../rules/base.xml.in.h:1054
msgid "Sun Key compatibility"
msgstr ""
-#: ../rules/base.xml.in.h:1050
+#: ../rules/base.xml.in.h:1055
msgid "Key sequence to kill the X server"
msgstr ""
-#: ../rules/base.xml.in.h:1051
+#: ../rules/base.xml.in.h:1056
msgid "Ctrl + Alt + Backspace"
msgstr ""
@@ -4061,146 +4081,150 @@ msgstr ""
msgid "English (US, Sun Type 6/7)"
msgstr ""
-#: ../rules/base.extras.xml.in.h:42
-msgid "Polish (international with dead keys)"
+#: ../rules/base.extras.xml.in.h:40
+msgid "English (Norman)"
msgstr ""
#: ../rules/base.extras.xml.in.h:43
-msgid "Polish (Colemak)"
+msgid "Polish (international with dead keys)"
msgstr ""
#: ../rules/base.extras.xml.in.h:44
+msgid "Polish (Colemak)"
+msgstr ""
+
+#: ../rules/base.extras.xml.in.h:45
msgid "Polish (Sun Type 6/7)"
msgstr ""
-#: ../rules/base.extras.xml.in.h:48
+#: ../rules/base.extras.xml.in.h:49
msgid "Crimean Tatar (Dobruja Q)"
msgstr ""
-#: ../rules/base.extras.xml.in.h:49
+#: ../rules/base.extras.xml.in.h:50
msgid "Romanian (ergonomic Touchtype)"
msgstr ""
-#: ../rules/base.extras.xml.in.h:50
+#: ../rules/base.extras.xml.in.h:51
msgid "Romanian (Sun Type 6/7)"
msgstr ""
-#: ../rules/base.extras.xml.in.h:53
+#: ../rules/base.extras.xml.in.h:54
msgid "Serbian (combining accents instead of dead keys)"
msgstr ""
-#: ../rules/base.extras.xml.in.h:56
+#: ../rules/base.extras.xml.in.h:57
msgid "Russian (with Ukrainian-Belorussian layout)"
msgstr ""
-#: ../rules/base.extras.xml.in.h:57
+#: ../rules/base.extras.xml.in.h:58
msgid "Russian (Sun Type 6/7)"
msgstr ""
-#: ../rules/base.extras.xml.in.h:60
+#: ../rules/base.extras.xml.in.h:61
msgid "Armenian (OLPC phonetic)"
msgstr ""
-#: ../rules/base.extras.xml.in.h:63
+#: ../rules/base.extras.xml.in.h:64
msgid "Hebrew (Biblical, SIL phonetic)"
msgstr ""
-#: ../rules/base.extras.xml.in.h:66
+#: ../rules/base.extras.xml.in.h:67
msgid "Arabic (Sun Type 6/7)"
msgstr ""
-#: ../rules/base.extras.xml.in.h:69
+#: ../rules/base.extras.xml.in.h:70
msgid "Belgian (Sun Type 6/7)"
msgstr ""
-#: ../rules/base.extras.xml.in.h:72
+#: ../rules/base.extras.xml.in.h:73
msgid "Portuguese (Brazil, Sun Type 6/7)"
msgstr ""
-#: ../rules/base.extras.xml.in.h:75
+#: ../rules/base.extras.xml.in.h:76
msgid "Czech (Sun Type 6/7)"
msgstr ""
-#: ../rules/base.extras.xml.in.h:78
+#: ../rules/base.extras.xml.in.h:79
msgid "Danish (Sun Type 6/7)"
msgstr ""
-#: ../rules/base.extras.xml.in.h:81
+#: ../rules/base.extras.xml.in.h:82
msgid "Dutch (Sun Type 6/7)"
msgstr ""
-#: ../rules/base.extras.xml.in.h:84
+#: ../rules/base.extras.xml.in.h:85
msgid "Estonian (Sun Type 6/7)"
msgstr ""
-#: ../rules/base.extras.xml.in.h:87
+#: ../rules/base.extras.xml.in.h:88
msgid "Finnish (Sun Type 6/7)"
msgstr ""
-#: ../rules/base.extras.xml.in.h:89
+#: ../rules/base.extras.xml.in.h:90
msgid "French (Sun Type 6/7)"
msgstr ""
-#: ../rules/base.extras.xml.in.h:92
+#: ../rules/base.extras.xml.in.h:93
msgid "Greek (Sun Type 6/7)"
msgstr ""
-#: ../rules/base.extras.xml.in.h:95
+#: ../rules/base.extras.xml.in.h:96
msgid "Italian (Sun Type 6/7)"
msgstr ""
-#: ../rules/base.extras.xml.in.h:98
+#: ../rules/base.extras.xml.in.h:99
msgid "Japanese (Sun Type 6)"
msgstr ""
-#: ../rules/base.extras.xml.in.h:99
+#: ../rules/base.extras.xml.in.h:100
msgid "Japanese (Sun Type 7 - pc compatible)"
msgstr ""
-#: ../rules/base.extras.xml.in.h:100
+#: ../rules/base.extras.xml.in.h:101
msgid "Japanese (Sun Type 7 - sun compatible)"
msgstr ""
-#: ../rules/base.extras.xml.in.h:103
+#: ../rules/base.extras.xml.in.h:104
msgid "Norwegian (Sun Type 6/7)"
msgstr ""
-#: ../rules/base.extras.xml.in.h:105
+#: ../rules/base.extras.xml.in.h:106
msgid "Portuguese (Sun Type 6/7)"
msgstr ""
-#: ../rules/base.extras.xml.in.h:108
+#: ../rules/base.extras.xml.in.h:109
msgid "Slovak (Sun Type 6/7)"
msgstr ""
-#: ../rules/base.extras.xml.in.h:111
+#: ../rules/base.extras.xml.in.h:112
msgid "Spanish (Sun Type 6/7)"
msgstr ""
-#: ../rules/base.extras.xml.in.h:114
+#: ../rules/base.extras.xml.in.h:115
msgid "Swedish (Sun Type 6/7)"
msgstr ""
-#: ../rules/base.extras.xml.in.h:116
+#: ../rules/base.extras.xml.in.h:117
msgid "German (Switzerland, Sun Type 6/7)"
msgstr ""
-#: ../rules/base.extras.xml.in.h:117
+#: ../rules/base.extras.xml.in.h:118
msgid "French (Switzerland, Sun Type 6/7)"
msgstr ""
-#: ../rules/base.extras.xml.in.h:120
+#: ../rules/base.extras.xml.in.h:121
msgid "Turkish (Sun Type 6/7)"
msgstr ""
-#: ../rules/base.extras.xml.in.h:123
+#: ../rules/base.extras.xml.in.h:124
msgid "Ukrainian (Sun Type 6/7)"
msgstr ""
-#: ../rules/base.extras.xml.in.h:125
+#: ../rules/base.extras.xml.in.h:126
msgid "English (UK, Sun Type 6/7)"
msgstr ""
-#: ../rules/base.extras.xml.in.h:128
+#: ../rules/base.extras.xml.in.h:129
msgid "Korean (Sun Type 6/7)"
msgstr ""
diff --git a/xorg-server/xkeyboard-config/rules/base.extras.xml.in b/xorg-server/xkeyboard-config/rules/base.extras.xml.in
index dd3251b6e..dd7339390 100644
--- a/xorg-server/xkeyboard-config/rules/base.extras.xml.in
+++ b/xorg-server/xkeyboard-config/rules/base.extras.xml.in
@@ -14,43 +14,43 @@
<variant>
<configItem>
<name>dyalog</name>
- <shortDescription>dlg</shortDescription>
- <description>APL keyboard symbols (Dyalog)</description>
+ <_shortDescription>dlg</_shortDescription>
+ <_description>APL keyboard symbols (Dyalog)</_description>
</configItem>
</variant>
<variant>
<configItem>
<name>sax</name>
- <shortDescription>sax</shortDescription>
- <description>APL keyboard symbols (sax)</description>
+ <_shortDescription>sax</_shortDescription>
+ <_description>APL keyboard symbols (sax)</_description>
</configItem>
</variant>
<variant>
<configItem>
<name>unified</name>
- <shortDescription>ufd</shortDescription>
- <description>APL keyboard symbols (unified)</description>
+ <_shortDescription>ufd</_shortDescription>
+ <_description>APL keyboard symbols (unified)</_description>
</configItem>
</variant>
<variant>
<configItem>
<name>apl2</name>
- <shortDescription>apl2</shortDescription>
- <description>APL keyboard symbols (IBM APL2)</description>
+ <_shortDescription>apl2</_shortDescription>
+ <_description>APL keyboard symbols (IBM APL2)</_description>
</configItem>
</variant>
<variant>
<configItem>
<name>aplplusII</name>
- <shortDescription>aplII</shortDescription>
- <description>APL keyboard symbols (Manugistics APL*PLUS II)</description>
+ <_shortDescription>aplII</_shortDescription>
+ <_description>APL keyboard symbols (Manugistics APL*PLUS II)</_description>
</configItem>
</variant>
<variant>
<configItem>
<name>aplx</name>
- <shortDescription>aplx</shortDescription>
- <description>APL keyboard symbols (APLX unified)</description>
+ <_shortDescription>aplx</_shortDescription>
+ <_description>APL keyboard symbols (APLX unified)</_description>
</configItem>
</variant>
</variantList>
@@ -264,7 +264,7 @@
<variant>
<configItem>
<name>cz_sk_de</name>
- <description>Czech Slovak and German (US)</description>
+ <_description>Czech Slovak and German (US)</_description>
<languageList><iso639Id>eng</iso639Id>
<iso639Id>cze</iso639Id>
<iso639Id>slo</iso639Id>
@@ -371,7 +371,7 @@
<variant>
<configItem>
<name>chu</name>
- <description>Church Slavonic</description>
+ <_description>Church Slavonic</_description>
<languageList><iso639Id>chu</iso639Id></languageList>
</configItem>
</variant>
@@ -776,6 +776,33 @@
</variant>
</variantList>
</layout>
+ <layout>
+ <configItem>
+ <name>eu</name>
+ <!-- Keyboard indicator for European layouts -->
+ <_shortDescription>eu</_shortDescription>
+ <_description>EurKEY (US based layout with european letters)</_description>
+ <languageList>
+ <iso639Id>cat</iso639Id>
+ <iso639Id>dan</iso639Id>
+ <iso639Id>eng</iso639Id>
+ <iso639Id>est</iso639Id>
+ <iso639Id>fao</iso639Id>
+ <iso639Id>fin</iso639Id>
+ <iso639Id>ger</iso639Id>
+ <iso639Id>gre</iso639Id>
+ <iso639Id>gsw</iso639Id>
+ <iso639Id>ita</iso639Id>
+ <iso639Id>lav</iso639Id>
+ <iso639Id>lit</iso639Id>
+ <iso639Id>nld</iso639Id>
+ <iso639Id>nor</iso639Id>
+ <iso639Id>por</iso639Id>
+ <iso639Id>spa</iso639Id>
+ <iso639Id>swe</iso639Id>
+ </languageList>
+ </configItem>
+ </layout>
</layoutList>
<optionList/>
</xkbConfigRegistry>
diff --git a/xorg-server/xkeyboard-config/rules/base.xml.in b/xorg-server/xkeyboard-config/rules/base.xml.in
index eb9586680..198b3a7be 100644
--- a/xorg-server/xkeyboard-config/rules/base.xml.in
+++ b/xorg-server/xkeyboard-config/rules/base.xml.in
@@ -1839,7 +1839,7 @@
<variant>
<configItem>
<name>eeyek</name>
- <description>Manipuri (Eeyek)</description>
+ <_description>Manipuri (Eeyek)</_description>
<languageList><iso639Id>mni</iso639Id></languageList>
</configItem>
</variant>
@@ -1925,7 +1925,7 @@
<name>mal_enhanced</name>
<!-- Keyboard indicator for Malayalam layouts -->
<_shortDescription>ml</_shortDescription>
- <_description>Malayalam (enhanced Inscript with Rupee Sign)</_description>
+ <_description>Malayalam (enhanced Inscript, with rupee sign)</_description>
<languageList><iso639Id>mal</iso639Id></languageList>
</configItem>
</variant>
@@ -2110,7 +2110,7 @@
<name>eng</name>
<!-- Keyboard indicator for English layouts -->
<_shortDescription>en</_shortDescription>
- <_description>English (India, with RupeeSign)</_description>
+ <_description>English (India, with rupee sign)</_description>
<languageList>
<iso639Id>eng</iso639Id>
</languageList>
@@ -2132,13 +2132,13 @@
<variant>
<configItem>
<name>alternatequotes</name>
- <_description>Bosnian (use guillemets for quotes)</_description>
+ <_description>Bosnian (with guillemets for quotes)</_description>
</configItem>
</variant>
<variant>
<configItem>
<name>unicode</name>
- <_description>Bosnian (use Bosnian digraphs)</_description>
+ <_description>Bosnian (with Bosnian digraphs)</_description>
</configItem>
</variant>
<variant>
@@ -2559,13 +2559,13 @@
<variant>
<configItem>
<name>alternatequotes</name>
- <_description>Croatian (use guillemets for quotes)</_description>
+ <_description>Croatian (with guillemets for quotes)</_description>
</configItem>
</variant>
<variant>
<configItem>
<name>unicode</name>
- <_description>Croatian (use Croatian digraphs)</_description>
+ <_description>Croatian (with Croatian digraphs)</_description>
</configItem>
</variant>
<variant>
@@ -2644,6 +2644,12 @@
</variant>
<variant>
<configItem>
+ <name>winkeys</name>
+ <_description>Danish (Winkeys)</_description>
+ </configItem>
+ </variant>
+ <variant>
+ <configItem>
<name>mac</name>
<_description>Danish (Macintosh)</_description>
</configItem>
@@ -2749,7 +2755,7 @@
<variant>
<configItem>
<name>pes_keypad</name>
- <_description>Persian (with Persian Keypad)</_description>
+ <_description>Persian (with Persian keypad)</_description>
</configItem>
</variant>
<variant>
@@ -2898,6 +2904,12 @@
</variant>
<variant>
<configItem>
+ <name>winkeys</name>
+ <_description>Finnish (Winkeys)</_description>
+ </configItem>
+ </variant>
+ <variant>
+ <configItem>
<name>smi</name>
<_description>Northern Saami (Finland)</_description>
<languageList><iso639Id>sme</iso639Id></languageList>
@@ -3279,6 +3291,15 @@
</variant>
<variant>
<configItem>
+ <name>tr</name>
+ <_description>Turkish (Germany)</_description>
+ <languageList>
+ <iso639Id>tr</iso639Id>
+ </languageList>
+ </configItem>
+ </variant>
+ <variant>
+ <configItem>
<name>ru</name>
<!-- Keyboard indicator for Russian layouts -->
<_shortDescription>ru</_shortDescription>
@@ -3547,6 +3568,12 @@
</variant>
<variant>
<configItem>
+ <name>winkeys</name>
+ <_description>Italian (Winkeys)</_description>
+ </configItem>
+ </variant>
+ <variant>
+ <configItem>
<name>mac</name>
<_description>Italian (Macintosh)</_description>
</configItem>
@@ -3984,6 +4011,12 @@
</variant>
<variant>
<configItem>
+ <name>winkeys</name>
+ <_description>Norwegian (Winkeys)</_description>
+ </configItem>
+ </variant>
+ <variant>
+ <configItem>
<name>dvorak</name>
<_description>Norwegian (Dvorak)</_description>
</configItem>
@@ -4079,7 +4112,7 @@
<variant>
<configItem>
<name>szl</name>
- <description>Silesian</description>
+ <_description>Silesian</_description>
<languageList><iso639Id>szl</iso639Id></languageList>
</configItem>
</variant>
@@ -4443,7 +4476,7 @@
<variant>
<configItem>
<name>alternatequotes</name>
- <_description>Slovenian (use guillemets for quotes)</_description>
+ <_description>Slovenian (with guillemets for quotes)</_description>
</configItem>
</variant>
<variant>
@@ -4504,6 +4537,12 @@
</variant>
<variant>
<configItem>
+ <name>winkeys</name>
+ <_description>Spanish (Winkeys)</_description>
+ </configItem>
+ </variant>
+ <variant>
+ <configItem>
<name>deadtilde</name>
<_description>Spanish (include dead tilde)</_description>
</configItem>
@@ -6343,7 +6382,7 @@
<option>
<configItem>
<name>altwin:hyper_win</name>
- <_description>Hyper is mapped to Win-keys</_description>
+ <_description>Hyper is mapped to Win keys</_description>
</configItem>
</option>
<option>
diff --git a/xorg-server/xkeyboard-config/symbols/Makefile.am b/xorg-server/xkeyboard-config/symbols/Makefile.am
index 509a549cd..77ec0ff0e 100644
--- a/xorg-server/xkeyboard-config/symbols/Makefile.am
+++ b/xorg-server/xkeyboard-config/symbols/Makefile.am
@@ -11,7 +11,7 @@ bt bw by \
ca cd ch \
cm cn cz \
de dk \
-ee es et epo \
+ee es et epo eu \
fi fo fr \
gb ge gh gn \
gr hr hu \
diff --git a/xorg-server/xkeyboard-config/symbols/af b/xorg-server/xkeyboard-config/symbols/af
index b93019a95..67f07c862 100644
--- a/xorg-server/xkeyboard-config/symbols/af
+++ b/xorg-server/xkeyboard-config/symbols/af
@@ -26,7 +26,7 @@ xkb_symbols "basic" {
key <AE09> { [ 0x10006f9, 0x1000029, 0x100200e ] };
key <AE10> { [ 0x10006f0, 0x1000028, 0x100200f ] };
key <AE11> { [ minus, Arabic_tatweel, 0x100005f ] };
- key <AE12> { [ plus, equal ] };
+ key <AE12> { [ equal, plus ] };
key <AD01> { [ Arabic_dad, Arabic_sukun, 0x10000b0 ] };
key <AD02> { [ Arabic_sad, Arabic_dammatan ] };
@@ -97,7 +97,7 @@ xkb_symbols "ps" {
key <AE09> { [ 0x10006f9, 0x1000029, 0x100200e ] };
key <AE10> { [ 0x10006f0, 0x1000028, 0x100200f ] };
key <AE11> { [ minus, Arabic_tatweel, 0x100005f ] };
- key <AE12> { [ plus, equal ] };
+ key <AE12> { [ equal, plus ] };
key <AD01> { [ Arabic_dad, Arabic_sukun, 0x10000b0 ] };
key <AD02> { [ Arabic_sad, Arabic_dammatan, 0x1000653 ] };
@@ -168,7 +168,7 @@ xkb_symbols "uz" {
key <AE09> { [ 0x10006f9, 0x1000029, 0x100200e ] };
key <AE10> { [ 0x10006f0, 0x1000028, 0x100200f ] };
key <AE11> { [ minus, Arabic_tatweel, 0x100005f ] };
- key <AE12> { [ plus, equal ] };
+ key <AE12> { [ equal, plus ] };
key <AD01> { [ Arabic_dad, Arabic_sukun, 0x10000b0 ] };
key <AD02> { [ Arabic_sad, Arabic_dammatan, 0x1000653 ] };
@@ -229,7 +229,7 @@ xkb_symbols "olpc-ps" {
key <AE09> { [ 0x10006F9, parenright, enfilledcircbullet ] }; // Arabic nine
key <AE10> { [ 0x10006F0, parenleft, degree ] }; // Arabic zero
key <AE11> { [ minus, 0x1000640, underscore ] }; // Arabic_tatweel
- key <AE12> { [ plus, equal, division ] };
+ key <AE12> { [ equal, plus, division ] };
key <AD01> { [ 0x1000636, 0x1000652, EuroSign ] }; // Arabic dad, Arabic sukun
key <AD02> { [ 0x1000635, 0x100064C, 0x1000671 ] }; // Arabic sad, Arabic dammatan, Arabic alef walsa
@@ -290,7 +290,7 @@ xkb_symbols "fa-olpc" {
key <AE09> { [ 0x10006F9, parenright, 0x100200E ] }; // Arabic nine, left-to-right mark
key <AE10> { [ 0x10006F0, parenleft, 0x100200F ] }; // Arabic zero, right-to-left mark
key <AE11> { [ minus, 0x1000640, underscore ] }; // Arabic_tatweel
- key <AE12> { [ plus, equal ] };
+ key <AE12> { [ equal, plus ] };
key <AD01> { [ 0x1000636, 0x1000652, degree ] }; // Arabic dad, Arabic sukun
key <AD02> { [ 0x1000635, 0x100064C ] }; // Arabic sad, Arabic dammatan
@@ -351,7 +351,7 @@ xkb_symbols "uz-olpc" {
key <AE09> { [ 0x10006F9, parenright, 0x100200E ] }; // Arabic nine, left-to-right mark
key <AE10> { [ 0x10006F0, parenleft, 0x100200F ] }; // Arabic zero, right-to-left mark
key <AE11> { [ minus, 0x1000640, underscore ] }; // Arabic_tatweel
- key <AE12> { [ plus, equal ] };
+ key <AE12> { [ equal, plus ] };
key <AD01> { [ 0x1000636, 0x1000652, degree ] }; // Arabic dad, Arabic sukun
key <AD02> { [ 0x1000635, 0x100064C, 0x1000653 ] }; // Arabic sad, Arabic dammatan, Arabic maddah above
diff --git a/xorg-server/xkeyboard-config/symbols/ba b/xorg-server/xkeyboard-config/symbols/ba
index 0cc4988d4..63331b858 100644
--- a/xorg-server/xkeyboard-config/symbols/ba
+++ b/xorg-server/xkeyboard-config/symbols/ba
@@ -1,40 +1,34 @@
default partial alphanumeric_keys
xkb_symbols "basic" {
- name[Group1]="Bosnian";
-
include "rs(latin)"
+ name[Group1]="Bosnian";
};
partial alphanumeric_keys
xkb_symbols "us" {
- name[Group1]= "Bosnian (US keyboard with Bosnian letters)";
-
include "rs(latinyz)"
+ name[Group1]= "Bosnian (US keyboard with Bosnian letters)";
};
-
partial alphanumeric_keys
xkb_symbols "alternatequotes" {
- name[Group1]= "Bosnian (use guillemets for quotes)";
-
include "rs(latinalternatequotes)"
+ name[Group1]= "Bosnian (with guillemets for quotes)";
};
partial alphanumeric_keys
xkb_symbols "unicode" {
- name[Group1]= "Bosnian (use Bosnian digraphs)";
-
include "rs(latinunicode)"
+ name[Group1]= "Bosnian (with Bosnian digraphs)";
};
partial alphanumeric_keys
xkb_symbols "unicodeus" {
- name[Group1]= "Bosnian (US keyboard with Bosnian digraphs)";
-
include "rs(latinunicodeyz)"
+ name[Group1]= "Bosnian (US keyboard with Bosnian digraphs)";
};
diff --git a/xorg-server/xkeyboard-config/symbols/ca b/xorg-server/xkeyboard-config/symbols/ca
index abfbbd9f7..2ba48b480 100644
--- a/xorg-server/xkeyboard-config/symbols/ca
+++ b/xorg-server/xkeyboard-config/symbols/ca
@@ -122,10 +122,10 @@ xkb_symbols "fr-dvorak" {
partial
xkb_symbols "fr-legacy" {
- name[Group1] = "French (Canada, legacy)";
-
include "ca(fr)"
+ name[Group1] = "French (Canada, legacy)";
+
key <TLDE> { [ degree, degree, notsign ] };
key <AE01> { [ 1, exclam, onesuperior ] };
@@ -168,10 +168,10 @@ xkb_symbols "fr-legacy" {
partial
xkb_symbols "multi" {
- name[Group1] = "Canadian Multilingual (first part)";
-
include "ca(fr)"
+ name[Group1] = "Canadian Multilingual (first part)";
+
key <TLDE> { [ slash, backslash, bar ] };
key <AE01> { [ 1, exclam ] };
key <AE02> { [ 2, at ] };
@@ -259,7 +259,6 @@ xkb_symbols "multi-2gr" {
key <AB08> { [ Greek_horizbar, multiply ] };
key <AB09> { [ periodcentered, division ] };
key <AB10> { [ NoSymbol, dead_abovedot ] };
-
};
// based on
@@ -466,8 +465,8 @@ xkb_symbols "olpc" {
partial alphanumeric_keys
xkb_symbols "eng" {
- name[Group1] = "English (Canada)";
include "us(basic)"
+ name[Group1] = "English (Canada)";
};
// EXTRAS:
diff --git a/xorg-server/xkeyboard-config/symbols/cm b/xorg-server/xkeyboard-config/symbols/cm
index 6404c97aa..6b7a51854 100644
--- a/xorg-server/xkeyboard-config/symbols/cm
+++ b/xorg-server/xkeyboard-config/symbols/cm
@@ -96,8 +96,8 @@ xkb_symbols "basic" {
partial alphanumeric_keys
xkb_symbols "french"
{
- name[Group1]="French (Cameroon)";
include "latin"
+ name[Group1]="French (Cameroon)";
key <AE01> { [ ampersand, 1, onesuperior, exclamdown ] };
key <AE02> { [ eacute, 2, asciitilde, oneeighth ] };
@@ -133,13 +133,11 @@ xkb_symbols "french"
include "level3(ralt_switch)"
};
-
partial alphanumeric_keys
xkb_symbols "azerty"
{
- name[Group1] = "Cameroon Multilingual (azerty)";
- include "level3(ralt_switch)"
include "cm(basic)"
+ name[Group1] = "Cameroon Multilingual (azerty)";
key <AB01> { [ w, W, U1E85, U1E84 ] }; // SMALL LETTER W, CAPITAL LETTER W, SMALL LETTER W WITH DIAERESIS, CAPITAL LETTER W WITH DIAERESIS
key <AB02> { [ x, X, U2039, U203A ] }; // SMALL LETTER X, CAPITAL LETTER X, SINGLE LEFT-POINTING ANGLE QUOTATION MARK, SINGLE RIGHT-POINTING ANGLE QUOTATION MARK
key <AB03> { [ c, C, U0327, copyright ] }; // SMALL LETTER C, CAPITAL LETTER C, COMBINING CEDILLA, COPYRIGHT SIGN
@@ -189,14 +187,14 @@ xkb_symbols "azerty"
key <LSGT> { [ U003C, U003E, U00AB, U00BB ] }; // LESS THAN, GREATER THAN, LEFT GUILLEMET, RIGHT GUILLEMET
key <TLDE> { [ U0024, U20AC, U00B2, U00B3 ] }; // DOLLAR, EURO, SUPERSCRIPT 2, SUPERSCRIPT 3
include "cm(exclamation_switch)"
+ include "level3(ralt_switch)"
};
partial alphanumeric_keys
xkb_symbols "qwerty"
{
- name[Group1] = "Cameroon Multilingual (qwerty)";
- include "level3(ralt_switch)"
include "cm(basic)"
+ name[Group1] = "Cameroon Multilingual (qwerty)";
key <AB01> { [ z, Z, U2026, U2020 ] }; // SMALL LETTER Z, CAPITAL LETTER Z, ELLIPSIS, DAGGER
key <AB02> { [ x, X ] }; // SMALL LETTER X, CAPITAL LETTER X
key <AB03> { [ c, C, U0327, U00A9 ] }; // SMALL LETTER C, CAPITAL LETTER C, CEDILLA, COPYRIGHT
@@ -242,15 +240,14 @@ xkb_symbols "qwerty"
key <BKSL> { [ U005C, U007C ] }; // BACKSLASH, BAR
key <TLDE> { [ U030D, U0303, U0060, U007E ] }; // COMBINING VERTICAL LINE ABOVE, COMBINING TILDE ABOVE, GRAVE ACCENT, TILDE
include "cm(semicolon_switch)"
+ include "level3(ralt_switch)"
};
-
partial alphanumeric_keys
xkb_symbols "dvorak"
{
- name[Group1] = "Cameroon Multilingual (Dvorak)";
- include "level3(ralt_switch)"
include "us(dvorak)"
+ name[Group1] = "Cameroon Multilingual (Dvorak)";
key <AB01> { [ semicolon, colon ] }; // SEMICOLON, COLON
key <AB02> { [ q, Q, U2014, U2013 ] }; // SMALL LETTER Q, CAPITAL LETTER Q, EM DASH, EN DASH
key <AB03> { [ j, J, U0330, U0323 ] }; // SMALL LETTER J, CAPITAL LETTER J, COMBINING TILDE (NASAL) BELOW, COMBINING DOT BELOW
@@ -299,6 +296,7 @@ xkb_symbols "dvorak"
key <BKSL> { [ backslash, bar ] }; // BACKSLASH, BAR
key <TLDE> { [ U030D, U0303, U0060, U007E ] }; // COMBINING VERTICAL LINE ABOVE, COMBINING TILDE ABOVE, GRAVE ACCENT, TILDE
include "cm(semicolon_switch_dvorak)"
+ include "level3(ralt_switch)"
};
// The following code creates the "Cameroon key" phenomenon.
diff --git a/xorg-server/xkeyboard-config/symbols/de b/xorg-server/xkeyboard-config/symbols/de
index a497d7f48..150c081c9 100644
--- a/xorg-server/xkeyboard-config/symbols/de
+++ b/xorg-server/xkeyboard-config/symbols/de
@@ -526,10 +526,8 @@ xkb_symbols "mac_nodeadkeys" {
partial alphanumeric_keys
xkb_symbols "dsb"
{
- name[Group1] = "Lower Sorbian";
include "latin(basic)"
- include "level3(ralt_switch)"
- include "kpdl(comma)"
+ name[Group1] = "Lower Sorbian";
key <AB01> { [ z, Z, zcaron, Zcaron ] };
key <AB02> { [ x, X, zacute, Zacute ] };
key <AB03> { [ c, C, cacute, Cacute ] };
@@ -544,15 +542,15 @@ xkb_symbols "dsb"
key <AD04> { [ r, R, racute, Racute ] };
key <AD05> { [ t, T, U20B5, EuroSign ] };
key <AD09> { [ o, O, oacute, Oacute ] };
+ include "kpdl(comma)"
+ include "level3(ralt_switch)"
};
partial alphanumeric_keys
xkb_symbols "dsb_qwertz"
{
- name[Group1] = "Lower Sorbian (qwertz)";
include "latin(basic)"
- include "level3(ralt_switch)"
- include "kpdl(comma)"
+ name[Group1] = "Lower Sorbian (qwertz)";
key <AB01> { [ y, Y ] };
key <AB02> { [ x, X ] };
key <AB03> { [ c, C, cacute, Cacute ] };
@@ -569,6 +567,8 @@ xkb_symbols "dsb_qwertz"
key <AD06> { [ z, Z, zcaron, Zcaron ] };
key <AD07> { [ u, U, zacute, Zacute ] };
key <AD09> { [ o, O, oacute, Oacute ] };
+ include "kpdl(comma)"
+ include "level3(ralt_switch)"
};
partial alphanumeric_keys
@@ -681,6 +681,24 @@ xkb_symbols "htcdream" {
include "level3(alt_switch)"
};
+partial alphanumeric_keys
+xkb_symbols "tr" {
+
+ // add turkish-specific letters to the basic German layout.
+ // Turkish symbols are accessible with combination of <AltGr> and
+ // 'i', 's', 'g', 'c'' (+<Shift> for capital letters).
+
+ include "de(basic)"
+
+ name[Group1]="Turkish (Germany)";
+
+ key <AD08> { [ i, I, U0131, U0130 ] };
+ key <AC02> { [ s, S, U015F, U015E ] };
+ key <AC05> { [ g, G, U011F, U011E ] };
+ key <AB03> { [ c, C, U0E7, U0C7 ] };
+
+};
+
// EXTRAS:
partial alphanumeric_keys
diff --git a/xorg-server/xkeyboard-config/symbols/dk b/xorg-server/xkeyboard-config/symbols/dk
index 838478bf8..509802753 100644
--- a/xorg-server/xkeyboard-config/symbols/dk
+++ b/xorg-server/xkeyboard-config/symbols/dk
@@ -42,6 +42,14 @@ xkb_symbols "nodeadkeys" {
};
+partial alphanumeric_keys
+xkb_symbols "winkeys" {
+
+ include "dk(basic)"
+ name[Group1] = "Danish (Winkeys)";
+ include "eurosign(5)"
+};
+
// Copied from macintosh_vndr/dk
partial alphanumeric_keys
xkb_symbols "mac" {
diff --git a/xorg-server/xkeyboard-config/symbols/es b/xorg-server/xkeyboard-config/symbols/es
index 9e963a23f..749a86d71 100644
--- a/xorg-server/xkeyboard-config/symbols/es
+++ b/xorg-server/xkeyboard-config/symbols/es
@@ -26,6 +26,14 @@ xkb_symbols "basic" {
include "level3(ralt_switch)"
};
+partial alphanumeric
+xkb_symbols "winkeys" {
+
+ include "es(basic)"
+ name[Group1]="Spanish (Winkeys)";
+ include "eurosign(5)"
+};
+
partial alphanumeric_keys
xkb_symbols "Sundeadkeys" {
diff --git a/xorg-server/xkeyboard-config/symbols/eu b/xorg-server/xkeyboard-config/symbols/eu
new file mode 100644
index 000000000..0a4d31a21
--- /dev/null
+++ b/xorg-server/xkeyboard-config/symbols/eu
@@ -0,0 +1,63 @@
+// Based on <http://eurkey.steffen.bruentjen.eu/>
+// Copyright: Copyright 2012 Steffen Bruentjen (eurkey (at) steffen dot bruentjen dot de)
+// License: GPLv3 <http://www.gnu.org/licenses/gpl-3.0.html>
+// modified by Christoph Roeper <spam (at) roeper dot biz> (use firstName to mail)
+
+default partial alphanumeric_keys modifier_keys
+xkb_symbols "basic" {
+
+ include "us(basic)"
+
+ name[Group1] = "EurKEY (US based layout with european letters)";
+
+ key <AB01> { [ z, Z, agrave, Agrave ] };
+ key <AB02> { [ x, X, aacute, Aacute ] };
+ key <AB03> { [ c, C, ccedilla, Ccedilla ] };
+ key <AB04> { [ v, V, igrave, Igrave ] };
+ key <AB05> { [ b, B, iacute, Iacute ] };
+ key <AB06> { [ n, N, ntilde, Ntilde ] };
+ key <AB07> { [ m, M, Multi_key, Multi_key ] };
+ key <AB08> { [ comma, less, ograve, Ograve ] };
+ key <AB09> { [ period, greater, oacute, Oacute ] };
+ key <AB10> { [ slash, question, questiondown, 0x1002026 ] };
+ key <AC01> { [ a, A, adiaeresis, Adiaeresis ] };
+ key <AC02> { [ s, S, ssharp, section ] };
+ key <AC03> { [ d, D, eth, Eth ] };
+ key <AC04> { [ f, F, egrave, Egrave ] };
+ key <AC05> { [ g, G, eacute, Eacute ] };
+ key <AC06> { [ h, H, ugrave, Ugrave ] };
+ key <AC07> { [ j, J, uacute, Uacute ] };
+ key <AC08> { [ k, K, U0133, U0132 ] };
+ key <AC09> { [ l, L, oslash, Oslash ] };
+ key <AC10> { [ semicolon, colon, dead_diaeresis, periodcentered ] };
+ key <AC11> { [ apostrophe, quotedbl, dead_acute, dagger] };
+ key <AD01> { [ q, Q, ae, AE ] };
+ key <AD02> { [ w, W, aring, Aring ] };
+ key <AD03> { [ e, E, ediaeresis, Ediaeresis ] };
+ key <AD04> { [ r, R, yacute, Yacute ] };
+ key <AD05> { [ t, T, thorn, Thorn ] };
+ key <AD06> { [ y, Y, ydiaeresis, Ydiaeresis ] };
+ key <AD07> { [ u, U, udiaeresis, Udiaeresis ] };
+ key <AD08> { [ i, I, idiaeresis, Idiaeresis ] };
+ key <AD09> { [ o, O, odiaeresis, Odiaeresis ] };
+ key <AD10> { [ p, P, oe, OE ] };
+ key <AD11> { [ bracketleft, braceleft, guillemotleft, U2039 ] };
+ key <AD12> { [ bracketright, braceright, guillemotright, U203A ] };
+ key <AE01> { [ 1, exclam, exclamdown, onesuperior ] };
+ key <AE02> { [ 2, at, ordfeminine, twosuperior ] };
+ key <AE03> { [ 3, numbersign, masculine, threesuperior ] };
+ key <AE04> { [ 4, dollar, sterling, yen ] };
+ key <AE05> { [ 5, percent, EuroSign, cent ] };
+ key <AE06> { [ 6, asciicircum, dead_circumflex, dead_caron ] };
+ key <AE07> { [ 7, ampersand, dead_abovering, dead_macron ] };
+ key <AE08> { [ 8, asterisk, doublelowquotemark, singlelowquotemark ] };
+ key <AE09> { [ 9, parenleft, leftdoublequotemark, leftsinglequotemark ] };
+ key <AE10> { [ 0, parenright, rightdoublequotemark, rightsinglequotemark ] };
+ key <AE11> { [ minus, underscore, copyright, numerosign ] };
+ key <AE12> { [ equal, plus, multiply, division ] };
+ key <BKSL> { [ backslash, bar, notsign, brokenbar ] };
+ key <TLDE> { [ grave, asciitilde, dead_grave, dead_tilde ] };
+ key <KPDL> { [ KP_Delete, KP_Decimal, comma, comma ] };
+
+ include "level3(ralt_switch)"
+};
diff --git a/xorg-server/xkeyboard-config/symbols/fi b/xorg-server/xkeyboard-config/symbols/fi
index 4fdcc2a25..1818243dd 100644
--- a/xorg-server/xkeyboard-config/symbols/fi
+++ b/xorg-server/xkeyboard-config/symbols/fi
@@ -83,6 +83,14 @@ xkb_symbols "kotoistus" {
};
partial alphanumeric_keys
+xkb_symbols "winkeys" {
+
+ include "fi(kotoistus)"
+ name[Group1]="Finnish (Winkeys)";
+ include "eurosign(5)"
+};
+
+partial alphanumeric_keys
xkb_symbols "classic" {
include "fi(fi)"
diff --git a/xorg-server/xkeyboard-config/symbols/fr b/xorg-server/xkeyboard-config/symbols/fr
index 9c89db825..3898b1c57 100644
--- a/xorg-server/xkeyboard-config/symbols/fr
+++ b/xorg-server/xkeyboard-config/symbols/fr
@@ -36,8 +36,6 @@ xkb_symbols "basic" {
key <AB09> { [ colon, slash, periodcentered, division ] };
key <AB10> { [ exclam, section, dead_belowdot, dead_abovedot ] };
- include "kpdl(comma)"
-
include "level3(ralt_switch)"
};
diff --git a/xorg-server/xkeyboard-config/symbols/hr b/xorg-server/xkeyboard-config/symbols/hr
index 1ec0c809a..61fc39221 100644
--- a/xorg-server/xkeyboard-config/symbols/hr
+++ b/xorg-server/xkeyboard-config/symbols/hr
@@ -1,9 +1,8 @@
default partial alphanumeric_keys
xkb_symbols "basic" {
- name[Group1]="Croatian";
-
include "rs(latin)"
+ name[Group1]="Croatian";
// Redefine these keys to match XFree86 Croatian layout
key <AE01> { [ 1, exclam, asciitilde, dead_tilde ] };
@@ -16,9 +15,8 @@ xkb_symbols "basic" {
partial alphanumeric_keys
xkb_symbols "us" {
- name[Group1]= "Croatian (US keyboard with Croatian letters)";
-
include "us"
+ name[Group1]= "Croatian (US keyboard with Croatian letters)";
key <AD01> { [ any, any, backslash ] };
key <AD02> { [ any, any, bar ] };
@@ -44,30 +42,25 @@ xkb_symbols "us" {
key <BKSL> { [ any, any, zcaron, Zcaron ] };
include "level3(ralt_switch)"
-
};
-
partial alphanumeric_keys
xkb_symbols "alternatequotes" {
- name[Group1]= "Croatian (use guillemets for quotes)";
-
include "rs(latinalternatequotes)"
+ name[Group1]= "Croatian (with guillemets for quotes)";
};
partial alphanumeric_keys
xkb_symbols "unicode" {
- name[Group1]= "Croatian (use Croatian digraphs)";
-
include "rs(latinunicode)"
+ name[Group1]= "Croatian (with Croatian digraphs)";
};
partial alphanumeric_keys
xkb_symbols "unicodeus" {
- name[Group1]= "Croatian (US keyboard with Croatian digraphs)";
-
include "rs(latinunicodeyz)"
+ name[Group1]= "Croatian (US keyboard with Croatian digraphs)";
};
diff --git a/xorg-server/xkeyboard-config/symbols/in b/xorg-server/xkeyboard-config/symbols/in
index f70e215e6..054671513 100644
--- a/xorg-server/xkeyboard-config/symbols/in
+++ b/xorg-server/xkeyboard-config/symbols/in
@@ -107,7 +107,7 @@ partial alphanumeric_keys
xkb_symbols "bolnagri" {
name[Group1] = "Hindi (Bolnagri)";
key.type="FOUR_LEVEL";
- //Top Alphanumeric row
+
// Roman digits
key <TLDE> { [ U0902, U0901, apostrophe, asciitilde ] }; // apostrophe: anusvara, candrabindu
key <AE01> { [ 1, exclam, U0967, exclam ] };
@@ -393,8 +393,6 @@ xkb_symbols "ben_baishakhi" {
// modifier_map Shift { Shift_L };
// modifier_map Lock { Caps_Lock };
// modifier_map Control{ Control_L };
-
-
};
xkb_symbols "ben_inscript" {
@@ -536,8 +534,6 @@ xkb_symbols "ben_gitanjali" {
// modifier_map Shift { Shift_L };
// modifier_map Lock { Caps_Lock };
// modifier_map Control{ Control_L };
-
-
};
@@ -613,7 +609,6 @@ xkb_symbols "ben_bornona" {
// modifier_map Control{ Control_L };
// third level with right-alt
include "level3(ralt_switch)"
-
};
partial alphanumeric_keys
@@ -842,7 +837,6 @@ xkb_symbols "mal" {
include "rupeesign(4)"
include "level3(ralt_switch)"
-
};
//Name : Lalitha
@@ -854,7 +848,7 @@ partial alphanumeric_keys
xkb_symbols "mal_lalitha" {
name[Group1] = "Malayalam (Lalitha)";
key.type="FOUR_LEVEL";
- //Top Alphanumeric row
+
// Roman digits
key <TLDE> { [ U0D4D, U0D02, apostrophe, asciitilde ] }; // apostrophe: virama(chandrakala),anusvara
key <AE01> { [ 1, exclam, U0D67, exclam ] };
@@ -1237,7 +1231,6 @@ xkb_symbols "tam_TSCII" {
key <AB07> { [ 0x10000ab, 0x10000ac ] }; // a, A
key <AB08> { [ 0x10000fe, 0x10000ae ] }; // i, I
-};
partial alphanumeric_keys
xkb_symbols "tam_TAB" {
@@ -1462,7 +1455,7 @@ partial alphanumeric_keys
xkb_symbols "jhelum" {
name[Group1] = "Punjabi (Gurmukhi Jhelum)";
key.type="FOUR_LEVEL";
- //Top Alphanumeric row
+
// Roman digits
key <TLDE> { [ apostrophe, asciitilde, U0A02,U0A01 ] }; // apostrophe: anusvara, candrabindu
key <AE01> { [ 1,exclam, U0A67, exclam ] };
@@ -1660,12 +1653,10 @@ xkb_symbols "hin-wx" {
partial alphanumeric_keys
xkb_symbols "eng" {
- name[Group1]= "English (India, with RupeeSign)";
-
include "us(basic)"
+ name[Group1]= "English (India, with rupee sign)";
include "rupeesign(4)"
-
include "level3(ralt_switch)"
};
@@ -1681,7 +1672,7 @@ xkb_symbols "eng" {
partial alphanumeric_keys
xkb_symbols "mal_enhanced" {
- name[Group1] = "Malayalam (enhanced Inscript with Rupee Sign)";
+ name[Group1] = "Malayalam (enhanced Inscript, with rupee sign)";
//From grave to backslash (\)
@@ -1744,11 +1735,8 @@ xkb_symbols "mal_enhanced" {
key <AB09> { [ period , U0d7d ] }; //chillu l
key <AB10> { [ U0d2f , question ] };
- // hope this includes the rupee sign at alt + 4
-
include "rupeesign(4)"
include "level3(ralt_switch)"
-
};
@@ -1780,13 +1768,12 @@ xkb_symbols "hin-kagapa" {
name[Group1] = "Hindi (KaGaPa phonetic)";
key.type="FOUR_LEVEL";
- //Top Alphanumeric row
// Roman digits
key <TLDE> { [ apostrophe, asciitilde, U201C ] }; // U201C: left double quotation mark
key <AE01> { [ 1, exclam, U0967 ] };
key <AE02> { [ 2, at, U0968, U20A8 ] }; // U20A8: generic rupee sign (Rs)
key <AE03> { [ 3, numbersign, U0969 ] };
- key <AE04> { [ 4, dollar, U096A, U20B9 ] }; // U20B9: new Indian Rupee sign
+ key <AE04> { [ 4, dollar, U096A, U20B9 ] }; // U20B9: new Indian rupee sign
key <AE05> { [ 5, percent, U096B ] };
key <AE06> { [ 6, asciicircum, U096C, U200C ] }; // ZWNJ
key <AE07> { [ 7, ampersand, U096D, U200D ] }; // ZWJ
@@ -1824,7 +1811,6 @@ xkb_symbols "hin-kagapa" {
key <AC10> { [ semicolon, colon, U1CF2, U1CF3 ] }; // U1CF2/3: ardhavisarga/rotated ardhavisarga
key <AC11> { [ apostrophe, quotedbl, U0951, U201D ] }; // U0951: Devanagari stress sign udatta
// U201D: Right double quotation mark
-
//Z Row
key <AB01> { [ U091E, U0919 ] }; // Z: nya, nga
key <AB02> { [ U0937, U093C, U0934 ] }; // X: ssa, nukta below, lla-nukta
@@ -1844,17 +1830,15 @@ xkb_symbols "hin-kagapa" {
// Sanskrit uses Devanagari layout of Hindi
partial alphanumeric_keys
xkb_symbols "san-kagapa" {
- name[Group1] = "Sanskrit (KaGaPa phonetic)";
include "in(hin-kagapa)"
-
+ name[Group1] = "Sanskrit (KaGaPa phonetic)";
};
// Marathi uses Devanagari layout of Hindi
partial alphanumeric_keys
xkb_symbols "mar-kagapa" {
- name[Group1] = "Marathi (KaGaPa phonetic)";
include "in(hin-kagapa)"
-
+ name[Group1] = "Marathi (KaGaPa phonetic)";
};
@@ -1875,13 +1859,12 @@ xkb_symbols "kan-kagapa" {
name[Group1] = "Kannada (KaGaPa phonetic)";
key.type="FOUR_LEVEL";
- //Top Alphanumeric row
// Roman digits
key <TLDE> { [ apostrophe, asciitilde, U201C ] }; // U201C: left double quotation mark
key <AE01> { [ 1, exclam, U0CE7 ] };
key <AE02> { [ 2, at, U0CE8, U20A8 ] }; // U20A8: generic rupee sign (Rs)
key <AE03> { [ 3, numbersign, U0CE9 ] };
- key <AE04> { [ 4, dollar, U0CEA, U20B9 ] }; // U20B9: new Indian Rupee sign
+ key <AE04> { [ 4, dollar, U0CEA, U20B9 ] }; // U20B9: new Indian rupee sign
key <AE05> { [ 5, percent, U0CEB ] };
key <AE06> { [ 6, asciicircum, U0CEC, U200C ] }; // ZWNJ
key <AE07> { [ 7, ampersand, U0CED, U200D ] }; // ZWJ
@@ -1919,7 +1902,6 @@ xkb_symbols "kan-kagapa" {
key <AC10> { [ semicolon, colon ] };
key <AC11> { [ apostrophe, quotedbl, U0951, U201D ] }; // U0951: Devanagari stress sign udatta
// U201D: Right double quotation mark
-
//Z Row
key <AB01> { [ U0C9E, U0C99 ] }; // Z: nya, nga
key <AB02> { [ U0CB7, U0CBC, U0CDE ] }; // X: ssa, nukta below, LLLA
@@ -1954,13 +1936,12 @@ xkb_symbols "tel-kagapa" {
name[Group1] = "Telugu (KaGaPa phonetic)";
key.type="FOUR_LEVEL";
- //Top Alphanumeric row
// Roman digits
key <TLDE> { [ apostrophe, asciitilde, U201C ] }; // U201C: left double quotation mark
key <AE01> { [ 1, exclam, U0C67 ] };
key <AE02> { [ 2, at, U0C68, U20A8 ] }; // U20A8: generic rupee sign (Rs)
key <AE03> { [ 3, numbersign, U0C69 ] };
- key <AE04> { [ 4, dollar, U0C6A, U20B9 ] }; // U20B9: new Indian Rupee sign
+ key <AE04> { [ 4, dollar, U0C6A, U20B9 ] }; // U20B9: new Indian rupee sign
key <AE05> { [ 5, percent, U0C6B ] };
key <AE06> { [ 6, asciicircum, U0C6C, U200C ] }; // ZWNJ
key <AE07> { [ 7, ampersand, U0C6D, U200D ] }; // ZWJ
@@ -1998,7 +1979,6 @@ xkb_symbols "tel-kagapa" {
key <AC10> { [ semicolon, colon ] };
key <AC11> { [ apostrophe, quotedbl, U0951, U201D ] }; // U0951: Devanagari stress sign udatta
// U201D: Right double quotation mark
-
//Z Row
key <AB01> { [ U0C1E, U0C19 ] }; // Z: nya, nga
key <AB02> { [ U0C37 ] }; // X: ssa
@@ -2026,7 +2006,6 @@ xkb_symbols "eeyek" {
name[Group1]= "Manipuri (Eeyek)";
- // Alphanumeric section
key <TLDE> { [ grave, asciitilde ] };
key <AE01> { [ Uabf1, exclam ] };
key <AE02> { [ Uabf2, at ] };
@@ -2078,7 +2057,6 @@ xkb_symbols "eeyek" {
key <AB10> { [ slash, question ] };
key <BKSL> { [ backslash, bar ] };
- // End alphanumeric section
include "level3(ralt_switch)"
};
diff --git a/xorg-server/xkeyboard-config/symbols/inet b/xorg-server/xkeyboard-config/symbols/inet
index fe21f1ed7..f7ccc6f81 100644
--- a/xorg-server/xkeyboard-config/symbols/inet
+++ b/xorg-server/xkeyboard-config/symbols/inet
@@ -256,7 +256,7 @@ xkb_symbols "acer_c300" {
key <I30> { [ XF86AudioRaiseVolume ] };
key <I5E> { [ XF86Launch2 ] };
key <I75> { [ Help ] };
- key <XFER> { [ XF86Launch1 ] };
+ key <IR7C> { [ XF86Launch1 ] };
};
// Acer Ferrari 4000 Keyboard
@@ -461,7 +461,7 @@ xkb_symbols "cherryblue" {
key <I26> { [ XF86AudioMute ] };
key <I63> { [ XF86Standby ] };
key <PRSC> { [ XF86Terminal ] };
- key <XFER> { [ XF86Go ] };
+ key <IR7C> { [ XF86Go ] };
};
// Cherry CyMotion Master XPress
@@ -488,7 +488,7 @@ xkb_symbols "cherryblueb" {
key <I71> { [ XF86Book ] };
key <I72> { [ XF86Book ] };
key <PRSC> { [ XF86Terminal ] };
- key <XFER> { [ XF86Go ] };
+ key <IR7C> { [ XF86Go ] };
};
// Cherry Blue Line CyBo@rd (alternate option)
@@ -505,7 +505,7 @@ xkb_symbols "cherrycyboard" {
key <FK17> { [ XF86Search ] };
key <I02> { [ XF86HomePage ] };
key <K67> { [ XF86Terminal ] };
- key <XFER> { [ XF86AudioMedia ] };
+ key <IR7C> { [ XF86AudioMedia ] };
};
// Cherry CyMotion Expert
@@ -695,8 +695,8 @@ xkb_symbols "inspiron" {
key <I04> { [ XF86AudioNext ] };
key <I21> { [ XF86Eject ] };
key <I56> { [ XF86Display ] };
- key <NFER> { [ XF86AudioPrev ] };
- key <XFER> { [ XF86AudioPlay, XF86AudioPause ] };
+ key <IR7D> { [ XF86AudioPrev ] };
+ key <IR7C> { [ XF86AudioPlay, XF86AudioPause ] };
};
// DELL USB Multimedia Keyboard (former 8135, generalized, superset of 8125)
@@ -707,7 +707,7 @@ xkb_symbols "dellusbmm" {
include "inet(media_nav_acpi_common)"
key <I02> { [ XF86HomePage ] };
key <K67> { [ XF86MyComputer ] };
- key <XFER> { [ XF86AudioMedia ] };
+ key <IR7C> { [ XF86AudioMedia ] };
};
@@ -727,7 +727,7 @@ xkb_symbols "diamond" {
partial alphanumeric_keys
xkb_symbols "ennyah_dkb1008" {
include "inet(media_nav_acpi_common)"
- key <XFER> { [ XF86AudioMedia ] };
+ key <IR7C> { [ XF86AudioMedia ] };
};
@@ -1033,7 +1033,7 @@ xkb_symbols "logitech_set3" {
key <I55> { [ XF86Save ] }; // F8
key <I56> { [ XF86Documents ] }; // F10
key <I69> { [ XF86Go ] };
- key <XFER> { [ XF86AudioMedia ] };
+ key <IR7C> { [ XF86AudioMedia ] };
};
// Logitech Access Keyboard
@@ -1170,7 +1170,7 @@ xkb_symbols "logidinovo" {
key <I21> { [ XF86AudioRaiseVolume ] };
key <K66> { [ XF86AudioLowerVolume ] };
key <KPDC> { [ XF86AudioMute ] };
- key <XFER> { [ XF86AudioMedia ] };
+ key <IR7C> { [ XF86AudioMedia ] };
};
partial alphanumeric_keys
@@ -1179,7 +1179,7 @@ xkb_symbols "logidinovoedge" {
key <I02> { [ XF86HomePage ] };
key <I6C> { [ XF86Mail ] };
key <FK17> { [ XF86Search ] };
- key <XFER> { [ XF86AudioMedia ] };
+ key <IR7C> { [ XF86AudioMedia ] };
};
partial alphanumeric_keys
@@ -1218,8 +1218,8 @@ xkb_symbols "logitech_g15" {
key <K74> { [ XF86WWW ] };
key <K75> { [ XF86LaunchE ] };
key <II5D> { [ XF86Launch1 ] };
- key <NFER> { [ XF86Launch2 ] };
- key <XFER> { [ XF86Launch8 ] };
+ key <IR7D> { [ XF86Launch2 ] };
+ key <IR7C> { [ XF86Launch8 ] };
};
@@ -1364,7 +1364,7 @@ xkb_symbols "microsoftprose" {
key <I63> { [ XF86Standby ] };
key <I68> { [ XF86AudioStop ] };
key <PRSC> { [ XF86MyComputer ] };
- key <XFER> { [ XF86AudioMedia ] };
+ key <IR7C> { [ XF86AudioMedia ] };
};
// Microsoft Office Keyboard
@@ -1511,7 +1511,7 @@ xkb_symbols "samsung4500" {
key <I18> { [ XF86Eject ] };
key <I26> { [ Help ] };
key <I59> { [ XF86Explorer ] };
- key <NFER> { [ XF86Launch2 ] };
+ key <IR7D> { [ XF86Launch2 ] };
};
// Samsung SDM 4510P
@@ -1521,7 +1521,7 @@ xkb_symbols "samsung4510" {
key <I02> { [ XF86Launch1 ] };
key <I04> { [ XF86Launch3 ] };
key <I18> { [ XF86Eject ] };
- key <NFER> { [ XF86Launch2 ] };
+ key <IR7D> { [ XF86Launch2 ] };
};
@@ -1748,7 +1748,7 @@ xkb_symbols "cymotionlinux" {
key <I78> { [ XF86Copy ] };
key <K65> { [ XF86Paste ] };
key <K75> { [ XF86ScrollUp ] };
- key <XFER> { [ XF86AudioMedia ] };
+ key <IR7C> { [ XF86AudioMedia ] };
};
partial alphanumeric_keys
diff --git a/xorg-server/xkeyboard-config/symbols/ir b/xorg-server/xkeyboard-config/symbols/ir
index 983bf60d9..1be5e7a22 100644
--- a/xorg-server/xkeyboard-config/symbols/ir
+++ b/xorg-server/xkeyboard-config/symbols/ir
@@ -26,7 +26,7 @@ xkb_symbols "pes" {
partial alphanumeric_keys
xkb_symbols "pes_keypad" {
- name[Group1]= "Persian (with Persian Keypad)";
+ name[Group1]= "Persian (with Persian keypad)";
include "ir(pes_part_basic)"
include "ir(pes_part_keypad)"
diff --git a/xorg-server/xkeyboard-config/symbols/is b/xorg-server/xkeyboard-config/symbols/is
index 34d6bed33..93af3f803 100644
--- a/xorg-server/xkeyboard-config/symbols/is
+++ b/xorg-server/xkeyboard-config/symbols/is
@@ -193,11 +193,12 @@ xkb_symbols "mac" {
// Icelandic Dvorak
partial alphanumeric_keys
xkb_symbols "dvorak" {
- name[Group1]= "Icelandic (Dvorak)";
include "us(dvorak)"
include "eurosign(4)"
+ name[Group1]= "Icelandic (Dvorak)";
+
key <AD11> { [ slash, question, U201e, U201c ] };
key <AC06> { [ d, D, eth, ETH ] };
key <AC10> { [ s, S, ae, AE ] };
diff --git a/xorg-server/xkeyboard-config/symbols/it b/xorg-server/xkeyboard-config/symbols/it
index 8a66a306a..8dd4365de 100644
--- a/xorg-server/xkeyboard-config/symbols/it
+++ b/xorg-server/xkeyboard-config/symbols/it
@@ -33,8 +33,6 @@ xkb_symbols "basic" {
key <LSGT> { [ less, greater,guillemotleft,guillemotright] };
- include "kpdl(comma)"
-
include "level3(ralt_switch)"
};
@@ -63,6 +61,14 @@ xkb_symbols "nodeadkeys" {
key <BKSL> { [ ugrave, section, grave, breve ] };
};
+partial alphanueric_keys
+xkb_symbols "winkeys" {
+
+ include "it(basic)"
+ name[Group1]="Italian (Winkeys)";
+ include "eurosign(5)"
+};
+
// Copied from macintosh_vndr/it
partial alphanumeric_keys
xkb_symbols "mac" {
diff --git a/xorg-server/xkeyboard-config/symbols/jp b/xorg-server/xkeyboard-config/symbols/jp
index 52f574623..f0b2c4d75 100644
--- a/xorg-server/xkeyboard-config/symbols/jp
+++ b/xorg-server/xkeyboard-config/symbols/jp
@@ -243,8 +243,8 @@ xkb_symbols "nicola_f_bs" {
// Copied from macintosh_vndr/jp
partial alphanumeric_keys
xkb_symbols "mac" {
- name[Group1]= "Japanese (Macintosh)";
include "jp(kana)"
+ name[Group1]= "Japanese (Macintosh)";
replace key <CAPS> { [ Caps_Lock ] };
};
@@ -256,8 +256,8 @@ xkb_symbols "hztg_escape" {
partial alphanumeric_keys
xkb_symbols "dvorak" {
- name[Group1]= "Japanese (Dvorak)";
include "jp(OADG109A)"
+ name[Group1]= "Japanese (Dvorak)";
key <AE11> { [ at, grave ] };
diff --git a/xorg-server/xkeyboard-config/symbols/ma b/xorg-server/xkeyboard-config/symbols/ma
index 2d128837e..db7b5bb38 100644
--- a/xorg-server/xkeyboard-config/symbols/ma
+++ b/xorg-server/xkeyboard-config/symbols/ma
@@ -82,9 +82,9 @@ xkb_symbols "tifinagh" {
partial alphanumeric_keys
xkb_symbols "tifinagh-phonetic" {
+ include "ma(tifinagh)"
name[Group1]="Berber (Morocco, Tifinagh phonetic)";
- include "ma(tifinagh)"
key <LatA> { [ 0x1002d30 ] };
key <LatZ> { [ 0x1002d63, 0x1002d65 ] };
diff --git a/xorg-server/xkeyboard-config/symbols/nl b/xorg-server/xkeyboard-config/symbols/nl
index 1dde405f8..76cb0183e 100644
--- a/xorg-server/xkeyboard-config/symbols/nl
+++ b/xorg-server/xkeyboard-config/symbols/nl
@@ -49,8 +49,6 @@ xkb_symbols "basic" {
key <LSGT> { [bracketright, bracketleft, bar, brokenbar ] };
- include "kpdl(comma)"
-
include "level3(ralt_switch)"
};
diff --git a/xorg-server/xkeyboard-config/symbols/no b/xorg-server/xkeyboard-config/symbols/no
index 5609de06e..fe79d9ba4 100644
--- a/xorg-server/xkeyboard-config/symbols/no
+++ b/xorg-server/xkeyboard-config/symbols/no
@@ -52,6 +52,14 @@ xkb_symbols "nodeadkeys" {
key <AB09> { [ period, colon, periodcentered, abovedot ] };
};
+partial alphanumeric_keys
+xkb_symbols "winkeys" {
+
+ include "no(basic)"
+ name[Group1]="Norwegian (Winkeys)";
+ include "eurosign(5)"
+};
+
// Norwegian Dvorak
partial alphanumeric_keys
xkb_symbols "dvorak" {
diff --git a/xorg-server/xkeyboard-config/symbols/rs b/xorg-server/xkeyboard-config/symbols/rs
index 86b54632a..06025e17e 100644
--- a/xorg-server/xkeyboard-config/symbols/rs
+++ b/xorg-server/xkeyboard-config/symbols/rs
@@ -40,12 +40,10 @@ xkb_symbols "latin" {
partial alphanumeric_keys
xkb_symbols "yz" {
- // Cyrillic_zhe and Cyrillic_ze swapped.
-
- name[Group1]= "Serbian (Cyrillic, Z and ZHE swapped)";
-
include "rs(basic)"
+ name[Group1]= "Serbian (Cyrillic, ZE and ZHE swapped)";
+
key <AD06> { [ Cyrillic_zhe, Cyrillic_ZHE, any,any ] }; // y
key <AB01> { [ Cyrillic_ze, Cyrillic_ZE, any,any ] }; // z
};
@@ -247,9 +245,10 @@ xkb_symbols "latinunicode" {
// This mapping supports the Unicode characters 0x1c4-0x1cc (dz, lj, and nj
// as single character). You get the title form with AltGr+Shift.
+ include "rs(latin)"
+
name[Group1]= "Serbian (Latin Unicode)";
- include "rs(latin)"
include "rs(twoletter)"
};
@@ -257,10 +256,10 @@ partial alphanumeric_keys
xkb_symbols "latinyz" {
// For those who insist on using "english-position" Z and Y.
- name[Group1]= "Serbian (Latin qwerty)";
-
include "rs(latin)"
+ name[Group1]= "Serbian (Latin qwerty)";
+
key <AD06> { [ y, Y, any,any ] }; // y
key <AB01> { [ z, Z, any,any ] }; // z
};
@@ -269,10 +268,10 @@ partial alphanumeric_keys
xkb_symbols "latinunicodeyz" {
// Unicode, ZHE and Z swapped.
- name[Group1]= "Serbian (Latin Unicode qwerty)";
-
include "rs(latinunicode)"
+ name[Group1]= "Serbian (Latin Unicode qwerty)";
+
key <AD06> { [ zcaron, Zcaron, any,any ] }; // y
key <AB01> { [ z, Z, any,any ] }; // z
};
@@ -280,10 +279,10 @@ xkb_symbols "latinunicodeyz" {
xkb_symbols "alternatequotes" {
// Another acceptable »pair of quotes« for Serbian
- name[Group1]= "Serbian (Cyrillic with guillemets)";
-
include "rs(basic)"
+ name[Group1]= "Serbian (Cyrillic with guillemets)";
+
key <AC02> { [ any,any, guillemotright, NoSymbol ] }; // s
key <AC03> { [ any,any, guillemotleft, NoSymbol ] }; // d
};
@@ -291,10 +290,10 @@ xkb_symbols "alternatequotes" {
xkb_symbols "latinalternatequotes" {
// Another acceptable »pair of quotes« for Serbian
- name[Group1]= "Serbian (Latin with guillemets)";
-
include "rs(latin)"
+ name[Group1]= "Serbian (Latin with guillemets)";
+
key <AC02> { [ any,any, guillemotright, NoSymbol ] }; // s
key <AC03> { [ any,any, guillemotleft, NoSymbol ] }; // d
};
@@ -306,10 +305,10 @@ xkb_symbols "rue" {
// Ljubomir J. Papuga (Любомир Я. Папуґа) <papuga@zoho.com>
// Mihajlo Hornjak <smeceiotpad@gmail.com>
- name[Group1]= "Pannonian Rusyn";
-
include "rs(basic)"
+ name[Group1]= "Pannonian Rusyn";
+
key <TLDE> { [ Cyrillic_softsign, Cyrillic_SOFTSIGN ] }; // `
key <AD01> { [ Cyrillic_ya, Cyrillic_YA ] }; // q
@@ -330,10 +329,10 @@ xkb_symbols "combiningkeys" {
// Raw combining characters instead of dead keys,
// especially good for post-accenting texts.
- name[Group1]= "Serbian (combining accents instead of dead keys)";
-
include "rs(basic)"
+ name[Group1]= "Serbian (combining accents instead of dead keys)";
+
key <AE03> { [ any,any, U0302, dead_circumflex ] }; // 3, U0302 = COMBINING CIRCUMFLEX ACCENT
key <AE07> { [ any,any, U0300, NoSymbol ] }; // 7, U0300 = COMBINING GRAVE ACCENT
key <AE08> { [ any,any, U030F, NoSymbol ] }; // 8, U030F = COMBINING DOUBLE GRAVE ACCENT
diff --git a/xorg-server/xkeyboard-config/symbols/ru b/xorg-server/xkeyboard-config/symbols/ru
index 043e011e6..782a3d75a 100644
--- a/xorg-server/xkeyboard-config/symbols/ru
+++ b/xorg-server/xkeyboard-config/symbols/ru
@@ -201,7 +201,7 @@ xkb_symbols "phonetic" {
key <LatP> { [ Cyrillic_pe, Cyrillic_PE ] };
key <AD11> { [ Cyrillic_sha, Cyrillic_SHA ] };
- key <AE12> { [ Cyrillic_softsign, Cyrillic_softsign ] };
+ key <AE12> { [ Cyrillic_softsign, Cyrillic_SOFTSIGN ] };
key <AD12> { [ Cyrillic_shcha, Cyrillic_SHCHA ] };
key <BKSL> { [ Cyrillic_e, Cyrillic_E ] };
};
@@ -214,7 +214,7 @@ xkb_symbols "phonetic_winkeys" {
key <LatX> { [ Cyrillic_ha, Cyrillic_HA ] };
key <LatH> { [ Cyrillic_che, Cyrillic_CHE ] };
- key <AE12> { [ Cyrillic_softsign, Cyrillic_softsign ] };
+ key <AE12> { [ Cyrillic_softsign, Cyrillic_SOFTSIGN ] };
};
diff --git a/xorg-server/xkeyboard-config/symbols/se b/xorg-server/xkeyboard-config/symbols/se
index 7c37d2a1d..320a1861d 100644
--- a/xorg-server/xkeyboard-config/symbols/se
+++ b/xorg-server/xkeyboard-config/symbols/se
@@ -48,10 +48,10 @@ xkb_symbols "nodeadkeys" {
partial alphanumeric_keys
xkb_symbols "dvorak" {
- name[Group1]="Swedish (Dvorak)";
-
include "se(basic)"
+ name[Group1]="Swedish (Dvorak)";
+
key <AD01> { [ aring, Aring, backslash ] };
key <AD02> { [ adiaeresis, Adiaeresis, braceleft, bracketleft ] };
key <AD03> { [ odiaeresis, Odiaeresis, braceright, bracketright ] };
@@ -202,10 +202,10 @@ xkb_symbols "mac" {
partial alphanumeric_keys
xkb_symbols "svdvorak" {
- name[Group1]="Swedish (Svdvorak)";
-
include "se(basic)"
+ name[Group1]="Swedish (Svdvorak)";
+
key <AD01> { [ aring, Aring, braceleft ] };
key <AD02> { [ comma, semicolon, bracketleft ] };
key <AD03> { [ period, colon, bracketright ] };
diff --git a/xorg-server/xkeyboard-config/symbols/si b/xorg-server/xkeyboard-config/symbols/si
index cff5f5602..7e214fba8 100644
--- a/xorg-server/xkeyboard-config/symbols/si
+++ b/xorg-server/xkeyboard-config/symbols/si
@@ -1,30 +1,29 @@
default partial alphanumeric_keys
xkb_symbols "basic" {
- name[Group1]="Slovenian";
-
include "rs(latin)"
+ name[Group1]="Slovenian";
+
key <TLDE> { type[Group1]="TWO_LEVEL", [ cedilla, diaeresis ] };
};
partial alphanumeric_keys
xkb_symbols "us" {
- name[Group1]= "Slovenian (US keyboard with Slovenian letters)";
-
include "rs(latinyz)"
+ name[Group1]= "Slovenian (US keyboard with Slovenian letters)";
+
key <TLDE> { type[Group1]="TWO_LEVEL", [ cedilla, diaeresis ] };
};
-
partial alphanumeric_keys
xkb_symbols "alternatequotes" {
- name[Group1]= "Slovenian (use guillemets for quotes)";
-
include "rs(latinalternatequotes)"
+ name[Group1]= "Slovenian (with guillemets for quotes)";
+
key <TLDE> { type[Group1]="TWO_LEVEL", [ cedilla, diaeresis ] };
};
diff --git a/xorg-server/xkeyboard-config/symbols/tm b/xorg-server/xkeyboard-config/symbols/tm
index e861b35c3..6c71f48bf 100644
--- a/xorg-server/xkeyboard-config/symbols/tm
+++ b/xorg-server/xkeyboard-config/symbols/tm
@@ -3,9 +3,10 @@
// Default layout (based on Vista Turkmen layout)
default partial
xkb_symbols "basic" {
- name[Group1]="Turkmen";
include "us"
+ name[Group1]="Turkmen";
+
key <TLDE> { [ zcaron, Zcaron, grave, asciitilde ] };
key <AD01> { [ adiaeresis, Adiaeresis, q, Q ] };
@@ -25,9 +26,9 @@ xkb_symbols "basic" {
// This layout provides turkmen letter via the AltGr key
partial
xkb_symbols "alt" {
- name[Group1]="Turkmen (Alt-Q)";
include "us"
+ name[Group1]="Turkmen (Alt-Q)";
key <AD06> { [ y, Y, yacute, Yacute ] };
key <AD07> { [ u, U, udiaeresis, Udiaeresis ] };
@@ -41,5 +42,4 @@ xkb_symbols "alt" {
key <AB06> { [ n, N, ncaron, Ncaron ] };
include "level3(ralt_switch)"
-
};
diff --git a/xorg-server/xkeyboard-config/symbols/tw b/xorg-server/xkeyboard-config/symbols/tw
index 8ea31dda6..3a2287222 100644
--- a/xorg-server/xkeyboard-config/symbols/tw
+++ b/xorg-server/xkeyboard-config/symbols/tw
@@ -1,10 +1,10 @@
default partial alphanumeric_keys
xkb_symbols "tw" {
- name[Group1]= "Taiwanese";
-
include "us(basic)"
+ name[Group1]= "Taiwanese";
+
key <TLDE> { [ grave, asciitilde, dead_grave, dead_tilde ] };
key <AE01> { [ 1, exclam, U030D, exclamdown ] };
key <AE02> { [ 2, at, U0358, twosuperior ] };
@@ -49,10 +49,10 @@ xkb_symbols "tw" {
partial alphanumeric_keys
xkb_symbols "indigenous" {
- name[Group1]= "Taiwanese (indigenous)";
-
include "tw(tw)"
+ name[Group1]= "Taiwanese (indigenous)";
+
key <AC11> { [ U02BC, quotedbl, apostrophe, dead_doubleacute ] };
include "level3(ralt_switch)"
@@ -61,10 +61,10 @@ xkb_symbols "indigenous" {
partial alphanumeric_keys
xkb_symbols "saisiyat" {
- name[Group1]= "Saisiyat (Taiwan)";
-
include "tw(indigenous)"
+ name[Group1]= "Saisiyat (Taiwan)";
+
key <AC10> { [ U02D0, colon, semicolon, dead_diaeresis ] };
include "level3(ralt_switch)"
diff --git a/xorg-server/xkeyboard-config/symbols/ua b/xorg-server/xkeyboard-config/symbols/ua
index 9aea09e05..81d696ec4 100644
--- a/xorg-server/xkeyboard-config/symbols/ua
+++ b/xorg-server/xkeyboard-config/symbols/ua
@@ -12,7 +12,7 @@ xkb_symbols "unicode" {
name[Group1]= "Ukrainian";
key <TLDE> { [ U2019, apostrophe, U0301, asciitilde ] }; // Apostrophe and Stress symbol
- key <AE02> { [ 1, exclam, onesuperior ] };
+ key <AE01> { [ 1, exclam, onesuperior ] };
key <AE02> { [ 2, quotedbl, twosuperior ] };
key <AE03> { [ 3, numerosign, U00A7, U20B4 ] }; // Paragraph and Hryvnia sign
key <AE04> { [ 4, semicolon, dollar, EuroSign ] };
diff --git a/xorg-server/xkeyboard-config/symbols/us b/xorg-server/xkeyboard-config/symbols/us
index 4948a6345..d5a6c18e4 100644
--- a/xorg-server/xkeyboard-config/symbols/us
+++ b/xorg-server/xkeyboard-config/symbols/us
@@ -59,9 +59,8 @@ xkb_symbols "basic" {
partial alphanumeric_keys
xkb_symbols "euro" {
- name[Group1]= "English (US, with euro on 5)";
-
include "us(basic)"
+ name[Group1]= "English (US, with euro on 5)";
include "eurosign(5)"
@@ -72,9 +71,8 @@ xkb_symbols "euro" {
partial alphanumeric_keys
xkb_symbols "intl" {
- name[Group1]= "English (US, international with dead keys)";
-
include "us(basic)"
+ name[Group1]= "English (US, international with dead keys)";
key <TLDE> { [dead_grave, dead_tilde, grave, asciitilde ] };
key <AE01> { [ 1, exclam, exclamdown, onesuperior ] };
@@ -163,9 +161,8 @@ xkb_symbols "intl" {
partial alphanumeric_keys
xkb_symbols "alt-intl" {
- name[Group1]= "English (US, alternative international)";
-
include "us"
+ name[Group1]= "English (US, alternative international)";
key <TLDE> { [ dead_grave, dead_tilde, grave, asciitilde ] };
key <AE05> { [ 5, percent, EuroSign ] };
@@ -257,9 +254,8 @@ xkb_symbols "dvorak" {
partial alphanumeric_keys
xkb_symbols "dvorak-intl" {
- name[Group1]= "English (Dvorak, international with dead keys)";
-
include "us(dvorak)"
+ name[Group1]= "English (Dvorak, international with dead keys)";
key <TLDE> { [dead_grave, dead_tilde, grave, asciitilde ] };
@@ -336,9 +332,8 @@ xkb_symbols "dvorak-intl" {
partial alphanumeric_keys
xkb_symbols "dvorak-alt-intl" {
- name[Group1]= "English (Dvorak alternative international no dead keys)";
-
include "us(dvorak)"
+ name[Group1]= "English (Dvorak alternative international no dead keys)";
key <AE04> { [ 4, dollar, EuroSign ] };
@@ -548,8 +543,8 @@ xkb_symbols "dvorak-classic" {
// symbols that usually follows, accented characters are possible for I18N.
partial alphanumeric_keys
xkb_symbols "dvp" {
- include "us(dvorak)"
+ include "us(dvorak)"
name[Group1] = "English (programmer Dvorak)";
// Unmodified Shift AltGr Shift+AltGr
@@ -619,9 +614,8 @@ xkb_symbols "dvp" {
partial alphanumeric_keys
xkb_symbols "rus" {
- name[Group1]= "Russian (US, phonetic)";
-
include "us(basic)"
+ name[Group1]= "Russian (US, phonetic)";
key.type[group1]="FOUR_LEVEL_ALPHABETIC";
@@ -732,6 +726,7 @@ xkb_symbols "mac" {
partial alphanumeric_keys
xkb_symbols "colemak" {
+
include "us"
name[Group1]= "English (Colemak)";
@@ -812,9 +807,8 @@ xkb_symbols "colemak" {
partial alphanumeric_keys
xkb_symbols "altgr-intl" {
- name[Group1]= "English (international AltGr dead keys)";
-
include "us(intl)"
+ name[Group1]= "English (international AltGr dead keys)";
// five dead keys moved into level3:
@@ -1175,9 +1169,8 @@ xkb_symbols "chr" {
partial alphanumeric_keys
xkb_symbols "hbs" {
- name[Group1]= "Serbo-Croatian (US)";
-
include "us"
+ name[Group1]= "Serbo-Croatian (US)";
key <TLDE> { [ grave, asciitilde ] };
key <AE06> { [ 6, dead_caron, asciicircum, asciicircum ] };
@@ -1247,9 +1240,8 @@ xkb_symbols "htcdream" {
partial alphanumeric_keys
xkb_symbols "workman" {
- name[Group1]= "English (Workman)";
-
include "us(basic)"
+ name[Group1]= "English (Workman)";
key <AD01> { [ q, Q ] };
key <AD02> { [ d, D ] };
@@ -1289,9 +1281,8 @@ xkb_symbols "workman" {
partial alphanumeric_keys
xkb_symbols "workman-intl" {
- name[Group1]= "English (Workman, international with dead keys)";
-
include "us(intl)"
+ name[Group1]= "English (Workman, international with dead keys)";
key <AD01> { [ q, Q, adiaeresis, Adiaeresis ] };
key <AD02> { [ d, D, eth, ETH ] };
@@ -1337,11 +1328,9 @@ xkb_symbols "workman-intl" {
partial alphanumeric_keys
xkb_symbols "norman" {
- name[Group1]= "English (Norman)";
-
include "us(basic)"
+ name[Group1]= "English (Norman)";
- // Alphanumeric section
key <AD01> { [ q, Q ] };
key <AD02> { [ w, W ] };
key <AD03> { [ d, D ] };
@@ -1371,7 +1360,6 @@ xkb_symbols "norman" {
key <AB05> { [ b, B ] };
key <AB06> { [ p, P ] };
key <AB07> { [ m, M ] };
- // End alphanumeric section
key <CAPS> { [ BackSpace ] };
@@ -1383,6 +1371,7 @@ xkb_symbols "norman" {
// Czech, Slovak and German charecters added as third level symbols to US keyboard layout.
partial alphanumeric_keys
xkb_symbols "cz_sk_de" {
+
include "us"
name[Group1]="Czech Slovak and German (US)";
@@ -1518,7 +1507,6 @@ partial alphanumeric_keys
xkb_symbols "ats" {
include "us"
-
name[Group1]= "Atsina";
//Using Dead key to get COMBINING COMMA ABOVE for ejectives on
@@ -1548,7 +1536,6 @@ partial alphanumeric_keys
xkb_symbols "crd" {
include "us"
-
name[Group1]= "Coeur d'Alene Salish";
key <AD02> { [ w, W, U02B7, U02B7 ] };