diff options
author | marha <marha@users.sourceforge.net> | 2011-02-28 06:37:03 +0000 |
---|---|---|
committer | marha <marha@users.sourceforge.net> | 2011-02-28 06:37:03 +0000 |
commit | feee2b5ceb37101bd1c4162e49805e6ad63e28ae (patch) | |
tree | dacb7faae8047c9dbc714a377440d9f69eb1f480 /xorg-server | |
parent | 8268836508edd4ba2a3045c9ba937397df7bf2c5 (diff) | |
download | vcxsrv-feee2b5ceb37101bd1c4162e49805e6ad63e28ae.tar.gz vcxsrv-feee2b5ceb37101bd1c4162e49805e6ad63e28ae.tar.bz2 vcxsrv-feee2b5ceb37101bd1c4162e49805e6ad63e28ae.zip |
xserver libX11 Xextproto mesa Git update 28 Feb 2011
Diffstat (limited to 'xorg-server')
-rw-r--r-- | xorg-server/configure.ac | 7 | ||||
-rw-r--r-- | xorg-server/dix/devices.c | 5206 | ||||
-rw-r--r-- | xorg-server/hw/dmx/doc/Makefile.am | 63 | ||||
-rw-r--r-- | xorg-server/hw/dmx/doc/doxygen.conf.in (renamed from xorg-server/hw/dmx/doc/doxygen.conf) | 18 | ||||
-rw-r--r-- | xorg-server/hw/xfree86/loader/Makefile.am | 59 | ||||
-rw-r--r-- | xorg-server/hw/xwin/glx/Makefile.am | 120 | ||||
-rw-r--r-- | xorg-server/xkeyboard-config/rules/base.o_s.part | 285 | ||||
-rw-r--r-- | xorg-server/xkeyboard-config/rules/base.xml.in | 10 | ||||
-rw-r--r-- | xorg-server/xkeyboard-config/symbols/af | 794 | ||||
-rw-r--r-- | xorg-server/xkeyboard-config/symbols/capslock | 136 | ||||
-rw-r--r-- | xorg-server/xkeyboard-config/symbols/et | 146 | ||||
-rw-r--r-- | xorg-server/xkeyboard-config/symbols/mn | 162 | ||||
-rw-r--r-- | xorg-server/xkeyboard-config/symbols/np | 241 |
13 files changed, 3645 insertions, 3602 deletions
diff --git a/xorg-server/configure.ac b/xorg-server/configure.ac index f3b293940..85d5c980e 100644 --- a/xorg-server/configure.ac +++ b/xorg-server/configure.ac @@ -26,8 +26,8 @@ dnl dnl Process this file with autoconf to create configure. AC_PREREQ(2.57) -AC_INIT([xorg-server], 1.9.99.903, [https://bugs.freedesktop.org/enter_bug.cgi?product=xorg], xorg-server) -RELEASE_DATE="2011-2-24" +AC_INIT([xorg-server], 1.10.0, [https://bugs.freedesktop.org/enter_bug.cgi?product=xorg], xorg-server) +RELEASE_DATE="2011-2-25" AC_CONFIG_SRCDIR([Makefile.am]) AM_INIT_AUTOMAKE([foreign dist-bzip2]) AM_MAINTAINER_MODE @@ -2173,6 +2173,8 @@ AC_SUBST([libdir]) AC_SUBST([exec_prefix]) AC_SUBST([prefix]) +AC_CONFIG_COMMANDS([sdksyms], [touch hw/xfree86/loader/sdksyms.dep]) + AC_OUTPUT([ Makefile glx/Makefile @@ -2246,6 +2248,7 @@ hw/xfree86/utils/gtf/Makefile hw/dmx/config/Makefile hw/dmx/config/man/Makefile hw/dmx/doc/Makefile +hw/dmx/doc/doxygen.conf hw/dmx/examples/Makefile hw/dmx/input/Makefile hw/dmx/glxProxy/Makefile diff --git a/xorg-server/dix/devices.c b/xorg-server/dix/devices.c index 08eb6c1cd..89294aacb 100644 --- a/xorg-server/dix/devices.c +++ b/xorg-server/dix/devices.c @@ -1,2602 +1,2604 @@ -/************************************************************
-
-Copyright 1987, 1998 The Open Group
-
-Permission to use, copy, modify, distribute, and sell this software and its
-documentation for any purpose is hereby granted without fee, provided that
-the above copyright notice appear in all copies and that both that
-copyright notice and this permission notice appear in supporting
-documentation.
-
-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 THE
-OPEN GROUP 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.
-
-Except as contained in this notice, the name of The Open Group shall not be
-used in advertising or otherwise to promote the sale, use or other dealings
-in this Software without prior written authorization from The Open Group.
-
-
-Copyright 1987 by Digital Equipment Corporation, Maynard, Massachusetts.
-
- All Rights Reserved
-
-Permission to use, copy, modify, and distribute this software and its
-documentation for any purpose and without fee is hereby granted,
-provided that the above copyright notice appear in all copies and that
-both that copyright notice and this permission notice appear in
-supporting documentation, and that the name of Digital not be
-used in advertising or publicity pertaining to distribution of the
-software without specific, written prior permission.
-
-DIGITAL DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, INCLUDING
-ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO EVENT SHALL
-DIGITAL BE LIABLE FOR ANY SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR
-ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS,
-WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION,
-ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS
-SOFTWARE.
-
-********************************************************/
-
-
-
-#ifdef HAVE_DIX_CONFIG_H
-#include <dix-config.h>
-#endif
-
-#include <X11/X.h>
-#include "misc.h"
-#include "resource.h"
-#include <X11/Xproto.h>
-#include <X11/Xatom.h>
-#include "windowstr.h"
-#include "inputstr.h"
-#include "scrnintstr.h"
-#include "cursorstr.h"
-#include "dixstruct.h"
-#include "ptrveloc.h"
-#include "site.h"
-#include "xkbsrv.h"
-#include "privates.h"
-#include "xace.h"
-#include "mi.h"
-
-#include "dispatch.h"
-#include "swaprep.h"
-#include "dixevents.h"
-#include "mipointer.h"
-#include "eventstr.h"
-
-#include <X11/extensions/XI.h>
-#include <X11/extensions/XI2.h>
-#include <X11/extensions/XIproto.h>
-#include <math.h>
-#include <pixman.h>
-#include "exglobals.h"
-#include "exevents.h"
-#include "xiquerydevice.h" /* for SizeDeviceClasses */
-#include "xiproperty.h"
-#include "enterleave.h" /* for EnterWindow() */
-#include "xserver-properties.h"
-#include "xichangehierarchy.h" /* For XISendDeviceHierarchyEvent */
-
-/** @file
- * This file handles input device-related stuff.
- */
-
-static void RecalculateMasterButtons(DeviceIntPtr slave);
-
-static void
-DeviceSetTransform(DeviceIntPtr dev, float *transform)
-{
- struct pixman_f_transform scale;
- double sx, sy;
- int x, y;
-
- /**
- * calculate combined transformation matrix:
- *
- * M = InvScale * Transform * Scale
- *
- * So we can later transform points using M * p
- *
- * Where:
- * Scale scales coordinates into 0..1 range
- * Transform is the user supplied (affine) transform
- * InvScale scales coordinates back up into their native range
- */
- sx = dev->valuator->axes[0].max_value - dev->valuator->axes[0].min_value;
- sy = dev->valuator->axes[1].max_value - dev->valuator->axes[1].min_value;
-
- /* invscale */
- pixman_f_transform_init_scale(&scale, sx, sy);
- scale.m[0][2] = dev->valuator->axes[0].min_value;
- scale.m[1][2] = dev->valuator->axes[1].min_value;
-
- /* transform */
- for (y=0; y<3; y++)
- for (x=0; x<3; x++)
- dev->transform.m[y][x] = *transform++;
-
- pixman_f_transform_multiply(&dev->transform, &scale, &dev->transform);
-
- /* scale */
- pixman_f_transform_init_scale(&scale, 1.0 / sx, 1.0 / sy);
- scale.m[0][2] = -dev->valuator->axes[0].min_value / sx;
- scale.m[1][2] = -dev->valuator->axes[1].min_value / sy;
-
- pixman_f_transform_multiply(&dev->transform, &dev->transform, &scale);
-}
-
-/**
- * DIX property handler.
- */
-static int
-DeviceSetProperty(DeviceIntPtr dev, Atom property, XIPropertyValuePtr prop,
- BOOL checkonly)
-{
- if (property == XIGetKnownProperty(XI_PROP_ENABLED))
- {
- if (prop->format != 8 || prop->type != XA_INTEGER || prop->size != 1)
- return BadValue;
-
- /* Don't allow disabling of VCP/VCK */
- if ((dev == inputInfo.pointer || dev == inputInfo.keyboard) &&
- !(*(CARD8*)prop->data))
- return BadAccess;
-
- if (!checkonly)
- {
- if ((*((CARD8*)prop->data)) && !dev->enabled)
- EnableDevice(dev, TRUE);
- else if (!(*((CARD8*)prop->data)) && dev->enabled)
- DisableDevice(dev, TRUE);
- }
- } else if (property == XIGetKnownProperty(XI_PROP_TRANSFORM))
- {
- float *f = (float*)prop->data;
- int i;
-
- if (prop->format != 32 || prop->size != 9 ||
- prop->type != XIGetKnownProperty(XATOM_FLOAT))
- return BadValue;
-
- for (i=0; i<9; i++)
- if (!isfinite(f[i]))
- return BadValue;
-
- if (!checkonly)
- DeviceSetTransform(dev, f);
- }
-
- return Success;
-}
-
-/* Pair the keyboard to the pointer device. Keyboard events will follow the
- * pointer sprite. Only applicable for master devices.
- * If the client is set, the request to pair comes from some client. In this
- * case, we need to check for access. If the client is NULL, it's from an
- * internal automatic pairing, we must always permit this.
- */
-static int
-PairDevices(ClientPtr client, DeviceIntPtr ptr, DeviceIntPtr kbd)
-{
- if (!ptr)
- return BadDevice;
-
- /* Don't allow pairing for slave devices */
- if (!IsMaster(ptr) || !IsMaster(kbd))
- return BadDevice;
-
- if (ptr->spriteInfo->paired)
- return BadDevice;
-
- if (kbd->spriteInfo->spriteOwner)
- {
- free(kbd->spriteInfo->sprite);
- kbd->spriteInfo->sprite = NULL;
- kbd->spriteInfo->spriteOwner = FALSE;
- }
-
- kbd->spriteInfo->sprite = ptr->spriteInfo->sprite;
- kbd->spriteInfo->paired = ptr;
- ptr->spriteInfo->paired = kbd;
- return Success;
-}
-
-
-/**
- * Find and return the next unpaired MD pointer device.
- */
-static DeviceIntPtr
-NextFreePointerDevice(void)
-{
- DeviceIntPtr dev;
- for (dev = inputInfo.devices; dev; dev = dev->next)
- if (IsMaster(dev) &&
- dev->spriteInfo->spriteOwner &&
- !dev->spriteInfo->paired)
- return dev;
- return NULL;
-}
-
-/**
- * Create a new input device and init it to sane values. The device is added
- * to the server's off_devices list.
- *
- * @param deviceProc Callback for device control function (switch dev on/off).
- * @return The newly created device.
- */
-DeviceIntPtr
-AddInputDevice(ClientPtr client, DeviceProc deviceProc, Bool autoStart)
-{
- DeviceIntPtr dev, *prev; /* not a typo */
- DeviceIntPtr devtmp;
- int devid;
- char devind[MAXDEVICES];
- BOOL enabled;
- float transform[9];
-
- /* Find next available id, 0 and 1 are reserved */
- memset(devind, 0, sizeof(char)*MAXDEVICES);
- for (devtmp = inputInfo.devices; devtmp; devtmp = devtmp->next)
- devind[devtmp->id]++;
- for (devtmp = inputInfo.off_devices; devtmp; devtmp = devtmp->next)
- devind[devtmp->id]++;
- for (devid = 2; devid < MAXDEVICES && devind[devid]; devid++)
- ;
-
- if (devid >= MAXDEVICES)
- return (DeviceIntPtr)NULL;
- dev = _dixAllocateObjectWithPrivates(sizeof(DeviceIntRec) + sizeof(SpriteInfoRec),
- sizeof(DeviceIntRec) + sizeof(SpriteInfoRec),
- offsetof(DeviceIntRec, devPrivates), PRIVATE_DEVICE);
- if (!dev)
- return (DeviceIntPtr)NULL;
- dev->id = devid;
- dev->public.processInputProc = ProcessOtherEvent;
- dev->public.realInputProc = ProcessOtherEvent;
- dev->public.enqueueInputProc = EnqueueEvent;
- dev->deviceProc = deviceProc;
- dev->startup = autoStart;
-
- /* device grab defaults */
- dev->deviceGrab.grabTime = currentTime;
- dev->deviceGrab.ActivateGrab = ActivateKeyboardGrab;
- dev->deviceGrab.DeactivateGrab = DeactivateKeyboardGrab;
-
- XkbSetExtension(dev, ProcessKeyboardEvent);
-
- dev->coreEvents = TRUE;
-
- /* sprite defaults */
- dev->spriteInfo = (SpriteInfoPtr)&dev[1];
-
- /* security creation/labeling check
- */
- if (XaceHook(XACE_DEVICE_ACCESS, client, dev, DixCreateAccess)) {
- free(dev);
- return NULL;
- }
-
- inputInfo.numDevices++;
-
- for (prev = &inputInfo.off_devices; *prev; prev = &(*prev)->next)
- ;
- *prev = dev;
- dev->next = NULL;
-
- enabled = FALSE;
- XIChangeDeviceProperty(dev, XIGetKnownProperty(XI_PROP_ENABLED),
- XA_INTEGER, 8, PropModeReplace, 1, &enabled,
- FALSE);
- XISetDevicePropertyDeletable(dev, XIGetKnownProperty(XI_PROP_ENABLED), FALSE);
-
- /* unity matrix */
- memset(transform, 0, sizeof(transform));
- transform[0] = transform[4] = transform[8] = 1.0f;
-
- XIChangeDeviceProperty(dev, XIGetKnownProperty(XI_PROP_TRANSFORM),
- XIGetKnownProperty(XATOM_FLOAT), 32,
- PropModeReplace, 9, transform, FALSE);
- XISetDevicePropertyDeletable(dev, XIGetKnownProperty(XI_PROP_TRANSFORM),
- FALSE);
-
- XIRegisterPropertyHandler(dev, DeviceSetProperty, NULL, NULL);
-
- return dev;
-}
-
-void
-SendDevicePresenceEvent(int deviceid, int type)
-{
- DeviceIntRec dummyDev;
- devicePresenceNotify ev;
-
- memset(&dummyDev, 0, sizeof(DeviceIntRec));
- ev.type = DevicePresenceNotify;
- ev.time = currentTime.milliseconds;
- ev.devchange = type;
- ev.deviceid = deviceid;
- dummyDev.id = XIAllDevices;
- SendEventToAllWindows(&dummyDev, DevicePresenceNotifyMask,
- (xEvent*)&ev, 1);
-}
-
-/**
- * Enable the device through the driver, add the device to the device list.
- * Switch device ON through the driver and push it onto the global device
- * list. Initialize the DIX sprite or pair the device. All clients are
- * notified about the device being enabled.
- *
- * A master pointer device needs to be enabled before a master keyboard
- * device.
- *
- * @param The device to be enabled.
- * @param sendevent True if an XI2 event should be sent.
- * @return TRUE on success or FALSE otherwise.
- */
-Bool
-EnableDevice(DeviceIntPtr dev, BOOL sendevent)
-{
- DeviceIntPtr *prev;
- int ret;
- DeviceIntPtr other;
- BOOL enabled;
- int flags[MAXDEVICES] = {0};
-
- for (prev = &inputInfo.off_devices;
- *prev && (*prev != dev);
- prev = &(*prev)->next)
- ;
-
- if (!dev->spriteInfo->sprite)
- {
- if (IsMaster(dev))
- {
- /* Sprites appear on first root window, so we can hardcode it */
- if (dev->spriteInfo->spriteOwner)
- {
- InitializeSprite(dev, screenInfo.screens[0]->root);
- /* mode doesn't matter */
- EnterWindow(dev, screenInfo.screens[0]->root, NotifyAncestor);
- }
- else if ((other = NextFreePointerDevice()) == NULL)
- {
- ErrorF("[dix] cannot find pointer to pair with. "
- "This is a bug.\n");
- return FALSE;
- } else
- PairDevices(NULL, other, dev);
- } else
- {
- if (dev->coreEvents)
- other = (IsPointerDevice(dev)) ? inputInfo.pointer :
- inputInfo.keyboard;
- else
- other = NULL; /* auto-float non-core devices */
- AttachDevice(NULL, dev, other);
- }
- }
-
- if ((*prev != dev) || !dev->inited ||
- ((ret = (*dev->deviceProc)(dev, DEVICE_ON)) != Success)) {
- ErrorF("[dix] couldn't enable device %d\n", dev->id);
- return FALSE;
- }
- dev->enabled = TRUE;
- *prev = dev->next;
-
- for (prev = &inputInfo.devices; *prev; prev = &(*prev)->next)
- ;
- *prev = dev;
- dev->next = NULL;
-
- enabled = TRUE;
- XIChangeDeviceProperty(dev, XIGetKnownProperty(XI_PROP_ENABLED),
- XA_INTEGER, 8, PropModeReplace, 1, &enabled,
- TRUE);
-
- SendDevicePresenceEvent(dev->id, DeviceEnabled);
- if (sendevent)
- {
- flags[dev->id] |= XIDeviceEnabled;
- XISendDeviceHierarchyEvent(flags);
- }
-
- RecalculateMasterButtons(dev);
-
- return TRUE;
-}
-
-/**
- * Switch a device off through the driver and push it onto the off_devices
- * list. A device will not send events while disabled. All clients are
- * notified about the device being disabled.
- *
- * Master keyboard devices have to be disabled before master pointer devices
- * otherwise things turn bad.
- *
- * @param sendevent True if an XI2 event should be sent.
- * @return TRUE on success or FALSE otherwise.
- */
-Bool
-DisableDevice(DeviceIntPtr dev, BOOL sendevent)
-{
- DeviceIntPtr *prev, other;
- BOOL enabled;
- int flags[MAXDEVICES] = {0};
-
- for (prev = &inputInfo.devices;
- *prev && (*prev != dev);
- prev = &(*prev)->next)
- ;
- if (*prev != dev)
- return FALSE;
-
- /* float attached devices */
- if (IsMaster(dev))
- {
- for (other = inputInfo.devices; other; other = other->next)
- {
- if (other->u.master == dev)
- {
- AttachDevice(NULL, other, NULL);
- flags[other->id] |= XISlaveDetached;
- }
- }
- }
- else
- {
- for (other = inputInfo.devices; other; other = other->next)
- {
- if (IsMaster(other) && other->u.lastSlave == dev)
- other->u.lastSlave = NULL;
- }
- }
-
- if (IsMaster(dev) && dev->spriteInfo->sprite)
- {
- for (other = inputInfo.devices; other; other = other->next)
- {
- if (other->spriteInfo->paired == dev)
- {
- ErrorF("[dix] cannot disable device, still paired. "
- "This is a bug. \n");
- return FALSE;
- }
- }
- }
-
- (void)(*dev->deviceProc)(dev, DEVICE_OFF);
- dev->enabled = FALSE;
-
- /* now that the device is disabled, we can reset the signal handler's
- * last.slave */
- OsBlockSignals();
- for (other = inputInfo.devices; other; other = other->next)
- {
- if (other->last.slave == dev)
- other->last.slave = NULL;
- }
- OsReleaseSignals();
-
- LeaveWindow(dev);
- SetFocusOut(dev);
-
- *prev = dev->next;
- dev->next = inputInfo.off_devices;
- inputInfo.off_devices = dev;
-
- enabled = FALSE;
- XIChangeDeviceProperty(dev, XIGetKnownProperty(XI_PROP_ENABLED),
- XA_INTEGER, 8, PropModeReplace, 1, &enabled,
- TRUE);
-
- SendDevicePresenceEvent(dev->id, DeviceDisabled);
- if (sendevent)
- {
- flags[dev->id] = XIDeviceDisabled;
- XISendDeviceHierarchyEvent(flags);
- }
-
- RecalculateMasterButtons(dev);
-
- return TRUE;
-}
-
-/**
- * Initialise a new device through the driver and tell all clients about the
- * new device.
- *
- * Must be called before EnableDevice.
- * The device will NOT send events until it is enabled!
- *
- * @param sendevent True if an XI2 event should be sent.
- * @return Success or an error code on failure.
- */
-int
-ActivateDevice(DeviceIntPtr dev, BOOL sendevent)
-{
- int ret = Success;
- ScreenPtr pScreen = screenInfo.screens[0];
-
- if (!dev || !dev->deviceProc)
- return BadImplementation;
-
- ret = (*dev->deviceProc) (dev, DEVICE_INIT);
- dev->inited = (ret == Success);
- if (!dev->inited)
- return ret;
-
- /* Initialize memory for sprites. */
- if (IsMaster(dev) && dev->spriteInfo->spriteOwner)
- if (!pScreen->DeviceCursorInitialize(dev, pScreen))
- ret = BadAlloc;
-
- SendDevicePresenceEvent(dev->id, DeviceAdded);
- if (sendevent)
- {
- int flags[MAXDEVICES] = {0};
- flags[dev->id] = XISlaveAdded;
- XISendDeviceHierarchyEvent(flags);
- }
- return ret;
-}
-
-/**
- * Ring the bell.
- * The actual task of ringing the bell is the job of the DDX.
- */
-static void
-CoreKeyboardBell(int volume, DeviceIntPtr pDev, pointer arg, int something)
-{
- KeybdCtrl *ctrl = arg;
-
- DDXRingBell(volume, ctrl->bell_pitch, ctrl->bell_duration);
-}
-
-static void
-CoreKeyboardCtl(DeviceIntPtr pDev, KeybdCtrl *ctrl)
-{
- return;
-}
-
-/**
- * Device control function for the Virtual Core Keyboard.
- */
-int
-CoreKeyboardProc(DeviceIntPtr pDev, int what)
-{
-
- switch (what) {
- case DEVICE_INIT:
- if (!InitKeyboardDeviceStruct(pDev, NULL, CoreKeyboardBell,
- CoreKeyboardCtl))
- {
- ErrorF("Keyboard initialization failed. This could be a missing "
- "or incorrect setup of xkeyboard-config.\n");
- return BadValue;
- }
- return Success;
-
- case DEVICE_ON:
- case DEVICE_OFF:
- return Success;
-
- case DEVICE_CLOSE:
- return Success;
- }
-
- return BadMatch;
-}
-
-/**
- * Device control function for the Virtual Core Pointer.
- */
-int
-CorePointerProc(DeviceIntPtr pDev, int what)
-{
-#define NBUTTONS 10
-#define NAXES 2
- BYTE map[NBUTTONS + 1];
- int i = 0;
- Atom btn_labels[NBUTTONS] = {0};
- Atom axes_labels[NAXES] = {0};
-
- switch (what) {
- case DEVICE_INIT:
- for (i = 1; i <= NBUTTONS; i++)
- map[i] = i;
-
- btn_labels[0] = XIGetKnownProperty(BTN_LABEL_PROP_BTN_LEFT);
- btn_labels[1] = XIGetKnownProperty(BTN_LABEL_PROP_BTN_MIDDLE);
- btn_labels[2] = XIGetKnownProperty(BTN_LABEL_PROP_BTN_RIGHT);
- btn_labels[3] = XIGetKnownProperty(BTN_LABEL_PROP_BTN_WHEEL_UP);
- btn_labels[4] = XIGetKnownProperty(BTN_LABEL_PROP_BTN_WHEEL_DOWN);
- btn_labels[5] = XIGetKnownProperty(BTN_LABEL_PROP_BTN_HWHEEL_LEFT);
- btn_labels[6] = XIGetKnownProperty(BTN_LABEL_PROP_BTN_HWHEEL_RIGHT);
- /* don't know about the rest */
-
- axes_labels[0] = XIGetKnownProperty(AXIS_LABEL_PROP_REL_X);
- axes_labels[1] = XIGetKnownProperty(AXIS_LABEL_PROP_REL_Y);
-
- if (!InitPointerDeviceStruct((DevicePtr)pDev, map, NBUTTONS, btn_labels,
- (PtrCtrlProcPtr)NoopDDA,
- GetMotionHistorySize(), NAXES, axes_labels))
- {
- ErrorF("Could not initialize device '%s'. Out of memory.\n",
- pDev->name);
- return BadAlloc; /* IPDS only fails on allocs */
- }
- pDev->valuator->axisVal[0] = screenInfo.screens[0]->width / 2;
- pDev->last.valuators[0] = pDev->valuator->axisVal[0];
- pDev->valuator->axisVal[1] = screenInfo.screens[0]->height / 2;
- pDev->last.valuators[1] = pDev->valuator->axisVal[1];
- break;
-
- case DEVICE_CLOSE:
- break;
-
- default:
- break;
- }
-
- return Success;
-
-#undef NBUTTONS
-#undef NAXES
-}
-
-/**
- * Initialise the two core devices, VCP and VCK (see events.c).
- * Both devices are not tied to physical devices, but guarantee that there is
- * always a keyboard and a pointer present and keep the protocol semantics.
- *
- * Note that the server MUST have two core devices at all times, even if there
- * is no physical device connected.
- */
-void
-InitCoreDevices(void)
-{
- if (AllocDevicePair(serverClient, "Virtual core",
- &inputInfo.pointer, &inputInfo.keyboard,
- CorePointerProc, CoreKeyboardProc,
- TRUE) != Success)
- FatalError("Failed to allocate core devices");
-
- if (ActivateDevice(inputInfo.pointer, TRUE) != Success ||
- ActivateDevice(inputInfo.keyboard, TRUE) != Success)
- FatalError("Failed to activate core devices.");
- if (!EnableDevice(inputInfo.pointer, TRUE) ||
- !EnableDevice(inputInfo.keyboard, TRUE))
- FatalError("Failed to enable core devices.");
-
- InitXTestDevices();
-}
-
-/**
- * Activate all switched-off devices and then enable all those devices.
- *
- * Will return an error if no core keyboard or core pointer is present.
- * In theory this should never happen if you call InitCoreDevices() first.
- *
- * InitAndStartDevices needs to be called AFTER the windows are initialized.
- * Devices will start sending events after InitAndStartDevices() has
- * completed.
- *
- * @return Success or error code on failure.
- */
-int
-InitAndStartDevices(void)
-{
- DeviceIntPtr dev, next;
-
- for (dev = inputInfo.off_devices; dev; dev = dev->next) {
- DebugF("(dix) initialising device %d\n", dev->id);
- if (!dev->inited)
- ActivateDevice(dev, TRUE);
- }
-
- /* enable real devices */
- for (dev = inputInfo.off_devices; dev; dev = next)
- {
- DebugF("(dix) enabling device %d\n", dev->id);
- next = dev->next;
- if (dev->inited && dev->startup)
- EnableDevice(dev, TRUE);
- }
-
- return Success;
-}
-
-/**
- * Free the given device class and reset the pointer to NULL.
- */
-static void
-FreeDeviceClass(int type, pointer *class)
-{
- if (!(*class))
- return;
-
- switch(type)
- {
- case KeyClass:
- {
- KeyClassPtr* k = (KeyClassPtr*)class;
- if ((*k)->xkbInfo)
- {
- XkbFreeInfo((*k)->xkbInfo);
- (*k)->xkbInfo = NULL;
- }
- free((*k));
- break;
- }
- case ButtonClass:
- {
- ButtonClassPtr *b = (ButtonClassPtr*)class;
- free((*b)->xkb_acts);
- free((*b));
- break;
- }
- case ValuatorClass:
- {
- ValuatorClassPtr *v = (ValuatorClassPtr*)class;
-
- free((*v)->motion);
- free((*v));
- break;
- }
- case FocusClass:
- {
- FocusClassPtr *f = (FocusClassPtr*)class;
- free((*f)->trace);
- free((*f));
- break;
- }
- case ProximityClass:
- {
- ProximityClassPtr *p = (ProximityClassPtr*)class;
- free((*p));
- break;
- }
- }
- *class = NULL;
-}
-
-static void
-FreeFeedbackClass(int type, pointer *class)
-{
- if (!(*class))
- return;
-
- switch(type)
- {
- case KbdFeedbackClass:
- {
- KbdFeedbackPtr *kbdfeed = (KbdFeedbackPtr*)class;
- KbdFeedbackPtr k, knext;
- for (k = (*kbdfeed); k; k = knext) {
- knext = k->next;
- if (k->xkb_sli)
- XkbFreeSrvLedInfo(k->xkb_sli);
- free(k);
- }
- break;
- }
- case PtrFeedbackClass:
- {
- PtrFeedbackPtr *ptrfeed = (PtrFeedbackPtr*)class;
- PtrFeedbackPtr p, pnext;
-
- for (p = (*ptrfeed); p; p = pnext) {
- pnext = p->next;
- free(p);
- }
- break;
- }
- case IntegerFeedbackClass:
- {
- IntegerFeedbackPtr *intfeed = (IntegerFeedbackPtr*)class;
- IntegerFeedbackPtr i, inext;
-
- for (i = (*intfeed); i; i = inext) {
- inext = i->next;
- free(i);
- }
- break;
- }
- case StringFeedbackClass:
- {
- StringFeedbackPtr *stringfeed = (StringFeedbackPtr*)class;
- StringFeedbackPtr s, snext;
-
- for (s = (*stringfeed); s; s = snext) {
- snext = s->next;
- free(s->ctrl.symbols_supported);
- free(s->ctrl.symbols_displayed);
- free(s);
- }
- break;
- }
- case BellFeedbackClass:
- {
- BellFeedbackPtr *bell = (BellFeedbackPtr*)class;
- BellFeedbackPtr b, bnext;
-
- for (b = (*bell); b; b = bnext) {
- bnext = b->next;
- free(b);
- }
- break;
- }
- case LedFeedbackClass:
- {
- LedFeedbackPtr *leds = (LedFeedbackPtr*)class;
- LedFeedbackPtr l, lnext;
-
- for (l = (*leds); l; l = lnext) {
- lnext = l->next;
- if (l->xkb_sli)
- XkbFreeSrvLedInfo(l->xkb_sli);
- free(l);
- }
- break;
- }
- }
- *class = NULL;
-}
-
-static void
-FreeAllDeviceClasses(ClassesPtr classes)
-{
- if (!classes)
- return;
-
- FreeDeviceClass(KeyClass, (pointer)&classes->key);
- FreeDeviceClass(ValuatorClass, (pointer)&classes->valuator);
- FreeDeviceClass(ButtonClass, (pointer)&classes->button);
- FreeDeviceClass(FocusClass, (pointer)&classes->focus);
- FreeDeviceClass(ProximityClass, (pointer)&classes->proximity);
-
- FreeFeedbackClass(KbdFeedbackClass, (pointer)&classes->kbdfeed);
- FreeFeedbackClass(PtrFeedbackClass, (pointer)&classes->ptrfeed);
- FreeFeedbackClass(IntegerFeedbackClass, (pointer)&classes->intfeed);
- FreeFeedbackClass(StringFeedbackClass, (pointer)&classes->stringfeed);
- FreeFeedbackClass(BellFeedbackClass, (pointer)&classes->bell);
- FreeFeedbackClass(LedFeedbackClass, (pointer)&classes->leds);
-
-}
-
-/**
- * Close down a device and free all resources.
- * Once closed down, the driver will probably not expect you that you'll ever
- * enable it again and free associated structs. If you want the device to just
- * be disabled, DisableDevice().
- * Don't call this function directly, use RemoveDevice() instead.
- */
-static void
-CloseDevice(DeviceIntPtr dev)
-{
- ScreenPtr screen = screenInfo.screens[0];
- ClassesPtr classes;
- int j;
-
- if (!dev)
- return;
-
- XIDeleteAllDeviceProperties(dev);
-
- if (dev->inited)
- (void)(*dev->deviceProc)(dev, DEVICE_CLOSE);
-
- /* free sprite memory */
- if (IsMaster(dev) && dev->spriteInfo->sprite)
- screen->DeviceCursorCleanup(dev, screen);
-
- /* free acceleration info */
- if(dev->valuator && dev->valuator->accelScheme.AccelCleanupProc)
- dev->valuator->accelScheme.AccelCleanupProc(dev);
-
- while (dev->xkb_interest)
- XkbRemoveResourceClient((DevicePtr)dev,dev->xkb_interest->resource);
-
- free(dev->name);
-
- classes = (ClassesPtr)&dev->key;
- FreeAllDeviceClasses(classes);
-
- if (IsMaster(dev))
- {
- classes = dev->unused_classes;
- FreeAllDeviceClasses(classes);
- free(classes);
- }
-
- if (DevHasCursor(dev) && dev->spriteInfo->sprite) {
- if (dev->spriteInfo->sprite->current)
- FreeCursor(dev->spriteInfo->sprite->current, None);
- free(dev->spriteInfo->sprite->spriteTrace);
- free(dev->spriteInfo->sprite);
- }
-
- /* a client may have the device set as client pointer */
- for (j = 0; j < currentMaxClients; j++)
- {
- if (clients[j] && clients[j]->clientPtr == dev)
- {
- clients[j]->clientPtr = NULL;
- clients[j]->clientPtr = PickPointer(clients[j]);
- }
- }
-
- free(dev->deviceGrab.sync.event);
- dixFreeObjectWithPrivates(dev, PRIVATE_DEVICE);
-}
-
-/**
- * Shut down all devices of one list and free all resources.
- */
-static
-void
-CloseDeviceList(DeviceIntPtr *listHead)
-{
- /* Used to mark devices that we tried to free */
- Bool freedIds[MAXDEVICES];
- DeviceIntPtr dev;
- int i;
-
- if (listHead == NULL)
- return;
-
- for (i = 0; i < MAXDEVICES; i++)
- freedIds[i] = FALSE;
-
- dev = *listHead;
- while (dev != NULL)
- {
- freedIds[dev->id] = TRUE;
- DeleteInputDeviceRequest(dev);
-
- dev = *listHead;
- while (dev != NULL && freedIds[dev->id])
- dev = dev->next;
- }
-}
-
-/**
- * Shut down all devices, free all resources, etc.
- * Only useful if you're shutting down the server!
- */
-void
-CloseDownDevices(void)
-{
- DeviceIntPtr dev;
-
- /* Float all SDs before closing them. Note that at this point resources
- * (e.g. cursors) have been freed already, so we can't just call
- * AttachDevice(NULL, dev, NULL). Instead, we have to forcibly set master
- * to NULL and pretend nothing happened.
- */
- for (dev = inputInfo.devices; dev; dev = dev->next)
- {
- if (!IsMaster(dev) && dev->u.master)
- dev->u.master = NULL;
- }
-
- CloseDeviceList(&inputInfo.devices);
- CloseDeviceList(&inputInfo.off_devices);
-
- CloseDevice(inputInfo.pointer);
- CloseDevice(inputInfo.keyboard);
-
- inputInfo.devices = NULL;
- inputInfo.off_devices = NULL;
- inputInfo.keyboard = NULL;
- inputInfo.pointer = NULL;
- XkbDeleteRulesDflts();
-}
-
-/**
- * Remove the cursor sprite for all devices. This needs to be done before any
- * resources are freed or any device is deleted.
- */
-void
-UndisplayDevices(void)
-{
- DeviceIntPtr dev;
- ScreenPtr screen = screenInfo.screens[0];
-
- for (dev = inputInfo.devices; dev; dev = dev->next)
- screen->DisplayCursor(dev, screen, NullCursor);
-}
-
-/**
- * Remove a device from the device list, closes it and thus frees all
- * resources.
- * Removes both enabled and disabled devices and notifies all devices about
- * the removal of the device.
- *
- * No PresenceNotify is sent for device that the client never saw. This can
- * happen if a malloc fails during the addition of master devices. If
- * dev->init is FALSE it means the client never received a DeviceAdded event,
- * so let's not send a DeviceRemoved event either.
- *
- * @param sendevent True if an XI2 event should be sent.
- */
-int
-RemoveDevice(DeviceIntPtr dev, BOOL sendevent)
-{
- DeviceIntPtr prev,tmp,next;
- int ret = BadMatch;
- ScreenPtr screen = screenInfo.screens[0];
- int deviceid;
- int initialized;
- int flags[MAXDEVICES] = {0};
-
- DebugF("(dix) removing device %d\n", dev->id);
-
- if (!dev || dev == inputInfo.keyboard || dev == inputInfo.pointer)
- return BadImplementation;
-
- initialized = dev->inited;
- deviceid = dev->id;
-
- if (initialized)
- {
- if (DevHasCursor(dev))
- screen->DisplayCursor(dev, screen, NullCursor);
-
- DisableDevice(dev, sendevent);
- flags[dev->id] = XIDeviceDisabled;
- }
-
- prev = NULL;
- for (tmp = inputInfo.devices; tmp; (prev = tmp), (tmp = next)) {
- next = tmp->next;
- if (tmp == dev) {
-
- if (prev==NULL)
- inputInfo.devices = next;
- else
- prev->next = next;
-
- flags[tmp->id] = IsMaster(tmp) ? XIMasterRemoved : XISlaveRemoved;
- CloseDevice(tmp);
- ret = Success;
- }
- }
-
- prev = NULL;
- for (tmp = inputInfo.off_devices; tmp; (prev = tmp), (tmp = next)) {
- next = tmp->next;
- if (tmp == dev) {
- flags[tmp->id] = IsMaster(tmp) ? XIMasterRemoved : XISlaveRemoved;
- CloseDevice(tmp);
-
- if (prev == NULL)
- inputInfo.off_devices = next;
- else
- prev->next = next;
-
- ret = Success;
- }
- }
-
- if (ret == Success && initialized) {
- inputInfo.numDevices--;
- SendDevicePresenceEvent(deviceid, DeviceRemoved);
- if (sendevent)
- XISendDeviceHierarchyEvent(flags);
- }
-
- return ret;
-}
-
-int
-NumMotionEvents(void)
-{
- /* only called to fill data in initial connection reply.
- * VCP is ok here, it is the only fixed device we have. */
- return inputInfo.pointer->valuator->numMotionEvents;
-}
-
-int
-dixLookupDevice(DeviceIntPtr *pDev, int id, ClientPtr client, Mask access_mode)
-{
- DeviceIntPtr dev;
- int rc;
- *pDev = NULL;
-
- for (dev=inputInfo.devices; dev; dev=dev->next) {
- if (dev->id == id)
- goto found;
- }
- for (dev=inputInfo.off_devices; dev; dev=dev->next) {
- if (dev->id == id)
- goto found;
- }
- return BadDevice;
-
-found:
- rc = XaceHook(XACE_DEVICE_ACCESS, client, dev, access_mode);
- if (rc == Success)
- *pDev = dev;
- return rc;
-}
-
-void
-QueryMinMaxKeyCodes(KeyCode *minCode, KeyCode *maxCode)
-{
- if (inputInfo.keyboard) {
- *minCode = inputInfo.keyboard->key->xkbInfo->desc->min_key_code;
- *maxCode = inputInfo.keyboard->key->xkbInfo->desc->max_key_code;
- }
-}
-
-/* Notably, this function does not expand the destination's keycode range, or
- * notify clients. */
-Bool
-SetKeySymsMap(KeySymsPtr dst, KeySymsPtr src)
-{
- int i, j;
- KeySym *tmp;
- int rowDif = src->minKeyCode - dst->minKeyCode;
-
- /* if keysym map size changes, grow map first */
- if (src->mapWidth < dst->mapWidth) {
- for (i = src->minKeyCode; i <= src->maxKeyCode; i++) {
-#define SI(r, c) (((r - src->minKeyCode) * src->mapWidth) + (c))
-#define DI(r, c) (((r - dst->minKeyCode) * dst->mapWidth) + (c))
- for (j = 0; j < src->mapWidth; j++)
- dst->map[DI(i, j)] = src->map[SI(i, j)];
- for (j = src->mapWidth; j < dst->mapWidth; j++)
- dst->map[DI(i, j)] = NoSymbol;
-#undef SI
-#undef DI
- }
- return TRUE;
- }
- else if (src->mapWidth > dst->mapWidth) {
- i = sizeof(KeySym) * src->mapWidth *
- (dst->maxKeyCode - dst->minKeyCode + 1);
- tmp = calloc(sizeof(KeySym), i);
- if (!tmp)
- return FALSE;
-
- if (dst->map) {
- for (i = 0; i <= dst->maxKeyCode-dst->minKeyCode; i++)
- memmove(&tmp[i * src->mapWidth], &dst->map[i * dst->mapWidth],
- dst->mapWidth * sizeof(KeySym));
- free(dst->map);
- }
- dst->mapWidth = src->mapWidth;
- dst->map = tmp;
- }
- else if (!dst->map) {
- i = sizeof(KeySym) * src->mapWidth *
- (dst->maxKeyCode - dst->minKeyCode + 1);
- tmp = calloc(sizeof(KeySym), i);
- if (!tmp)
- return FALSE;
-
- dst->map = tmp;
- dst->mapWidth = src->mapWidth;
- }
-
- memmove(&dst->map[rowDif * dst->mapWidth], src->map,
- (src->maxKeyCode - src->minKeyCode + 1) *
- dst->mapWidth * sizeof(KeySym));
-
- return TRUE;
-}
-
-Bool
-InitButtonClassDeviceStruct(DeviceIntPtr dev, int numButtons, Atom* labels,
- CARD8 *map)
-{
- ButtonClassPtr butc;
- int i;
-
- butc = calloc(1, sizeof(ButtonClassRec));
- if (!butc)
- return FALSE;
- butc->numButtons = numButtons;
- butc->sourceid = dev->id;
- for (i = 1; i <= numButtons; i++)
- butc->map[i] = map[i];
- for (i = numButtons + 1; i < MAP_LENGTH; i++)
- butc->map[i] = i;
- memcpy(butc->labels, labels, numButtons * sizeof(Atom));
- dev->button = butc;
- return TRUE;
-}
-
-Bool
-InitValuatorClassDeviceStruct(DeviceIntPtr dev, int numAxes, Atom *labels,
- int numMotionEvents, int mode)
-{
- int i;
- ValuatorClassPtr valc;
-
- if (!dev)
- return FALSE;
-
- if (numAxes > MAX_VALUATORS)
- {
- LogMessage(X_WARNING,
- "Device '%s' has %d axes, only using first %d.\n",
- dev->name, numAxes, MAX_VALUATORS);
- numAxes = MAX_VALUATORS;
- }
-
- valc = (ValuatorClassPtr)calloc(1, sizeof(ValuatorClassRec) +
- numAxes * sizeof(AxisInfo) +
- numAxes * sizeof(double));
- if (!valc)
- return FALSE;
-
- valc->sourceid = dev->id;
- valc->motion = NULL;
- valc->first_motion = 0;
- valc->last_motion = 0;
-
- valc->numMotionEvents = numMotionEvents;
- valc->motionHintWindow = NullWindow;
- valc->numAxes = numAxes;
- valc->axes = (AxisInfoPtr)(valc + 1);
- valc->axisVal = (double *)(valc->axes + numAxes);
-
- if (mode & OutOfProximity)
- InitProximityClassDeviceStruct(dev);
-
- dev->valuator = valc;
-
- AllocateMotionHistory(dev);
-
- for (i=0; i<numAxes; i++) {
- InitValuatorAxisStruct(dev, i, labels[i], NO_AXIS_LIMITS, NO_AXIS_LIMITS,
- 0, 0, 0, mode);
- valc->axisVal[i]=0;
- }
-
- dev->last.numValuators = numAxes;
-
- if (IsMaster(dev) || /* do not accelerate master or xtest devices */
- IsXTestDevice(dev, NULL))
- InitPointerAccelerationScheme(dev, PtrAccelNoOp);
- else
- InitPointerAccelerationScheme(dev, PtrAccelDefault);
- return TRUE;
-}
-
-/* global list of acceleration schemes */
-ValuatorAccelerationRec pointerAccelerationScheme[] = {
- {PtrAccelNoOp, NULL, NULL, NULL},
- {PtrAccelPredictable, acceleratePointerPredictable, NULL, AccelerationDefaultCleanup},
- {PtrAccelLightweight, acceleratePointerLightweight, NULL, NULL},
- {-1, NULL, NULL, NULL} /* terminator */
-};
-
-/**
- * install an acceleration scheme. returns TRUE on success, and should not
- * change anything if unsuccessful.
- */
-Bool
-InitPointerAccelerationScheme(DeviceIntPtr dev,
- int scheme)
-{
- int x, i = -1;
- void* data = NULL;
- ValuatorClassPtr val;
-
- val = dev->valuator;
-
- if(!val)
- return FALSE;
-
- if(IsMaster(dev) && scheme != PtrAccelNoOp)
- return FALSE;
-
- for(x = 0; pointerAccelerationScheme[x].number >= 0; x++) {
- if(pointerAccelerationScheme[x].number == scheme){
- i = x;
- break;
- }
- }
-
- if(-1 == i)
- return FALSE;
-
- if (val->accelScheme.AccelCleanupProc)
- val->accelScheme.AccelCleanupProc(dev);
-
- /* init scheme-specific data */
- switch(scheme){
- case PtrAccelPredictable:
- {
- DeviceVelocityPtr s;
- s = malloc(sizeof(DeviceVelocityRec));
- if(!s)
- return FALSE;
- InitVelocityData(s);
- data = s;
- break;
- }
- default:
- break;
- }
-
- val->accelScheme = pointerAccelerationScheme[i];
- val->accelScheme.accelData = data;
-
- /* post-init scheme */
- switch(scheme){
- case PtrAccelPredictable:
- InitializePredictableAccelerationProperties(dev);
- break;
-
- default:
- break;
- }
-
- return TRUE;
-}
-
-Bool
-InitAbsoluteClassDeviceStruct(DeviceIntPtr dev)
-{
- AbsoluteClassPtr abs;
-
- abs = malloc(sizeof(AbsoluteClassRec));
- if (!abs)
- return FALSE;
-
- /* we don't do anything sensible with these, but should */
- abs->min_x = NO_AXIS_LIMITS;
- abs->min_y = NO_AXIS_LIMITS;
- abs->max_x = NO_AXIS_LIMITS;
- abs->max_y = NO_AXIS_LIMITS;
- abs->flip_x = 0;
- abs->flip_y = 0;
- abs->rotation = 0;
- abs->button_threshold = 0;
-
- abs->offset_x = 0;
- abs->offset_y = 0;
- abs->width = NO_AXIS_LIMITS;
- abs->height = NO_AXIS_LIMITS;
- abs->following = 0;
- abs->screen = 0;
-
- abs->sourceid = dev->id;
-
- dev->absolute = abs;
-
- return TRUE;
-}
-
-Bool
-InitFocusClassDeviceStruct(DeviceIntPtr dev)
-{
- FocusClassPtr focc;
-
- focc = malloc(sizeof(FocusClassRec));
- if (!focc)
- return FALSE;
- focc->win = PointerRootWin;
- focc->revert = None;
- focc->time = currentTime;
- focc->trace = (WindowPtr *)NULL;
- focc->traceSize = 0;
- focc->traceGood = 0;
- focc->sourceid = dev->id;
- dev->focus = focc;
- return TRUE;
-}
-
-Bool
-InitPtrFeedbackClassDeviceStruct(DeviceIntPtr dev, PtrCtrlProcPtr controlProc)
-{
- PtrFeedbackPtr feedc;
-
- feedc = malloc(sizeof(PtrFeedbackClassRec));
- if (!feedc)
- return FALSE;
- feedc->CtrlProc = controlProc;
- feedc->ctrl = defaultPointerControl;
- feedc->ctrl.id = 0;
- if ( (feedc->next = dev->ptrfeed) )
- feedc->ctrl.id = dev->ptrfeed->ctrl.id + 1;
- dev->ptrfeed = feedc;
- (*controlProc)(dev, &feedc->ctrl);
- return TRUE;
-}
-
-
-static LedCtrl defaultLedControl = {
- DEFAULT_LEDS, DEFAULT_LEDS_MASK, 0};
-
-static BellCtrl defaultBellControl = {
- DEFAULT_BELL,
- DEFAULT_BELL_PITCH,
- DEFAULT_BELL_DURATION,
- 0};
-
-static IntegerCtrl defaultIntegerControl = {
- DEFAULT_INT_RESOLUTION,
- DEFAULT_INT_MIN_VALUE,
- DEFAULT_INT_MAX_VALUE,
- DEFAULT_INT_DISPLAYED,
- 0};
-
-Bool
-InitStringFeedbackClassDeviceStruct (
- DeviceIntPtr dev, StringCtrlProcPtr controlProc,
- int max_symbols, int num_symbols_supported, KeySym *symbols)
-{
- int i;
- StringFeedbackPtr feedc;
-
- feedc = malloc(sizeof(StringFeedbackClassRec));
- if (!feedc)
- return FALSE;
- feedc->CtrlProc = controlProc;
- feedc->ctrl.num_symbols_supported = num_symbols_supported;
- feedc->ctrl.num_symbols_displayed = 0;
- feedc->ctrl.max_symbols = max_symbols;
- feedc->ctrl.symbols_supported = malloc(sizeof (KeySym) * num_symbols_supported);
- feedc->ctrl.symbols_displayed = malloc(sizeof (KeySym) * max_symbols);
- if (!feedc->ctrl.symbols_supported || !feedc->ctrl.symbols_displayed)
- {
- free(feedc->ctrl.symbols_supported);
- free(feedc->ctrl.symbols_displayed);
- free(feedc);
- return FALSE;
- }
- for (i=0; i<num_symbols_supported; i++)
- *(feedc->ctrl.symbols_supported+i) = *symbols++;
- for (i=0; i<max_symbols; i++)
- *(feedc->ctrl.symbols_displayed+i) = (KeySym) 0;
- feedc->ctrl.id = 0;
- if ( (feedc->next = dev->stringfeed) )
- feedc->ctrl.id = dev->stringfeed->ctrl.id + 1;
- dev->stringfeed = feedc;
- (*controlProc)(dev, &feedc->ctrl);
- return TRUE;
-}
-
-Bool
-InitBellFeedbackClassDeviceStruct (DeviceIntPtr dev, BellProcPtr bellProc,
- BellCtrlProcPtr controlProc)
-{
- BellFeedbackPtr feedc;
-
- feedc = malloc(sizeof(BellFeedbackClassRec));
- if (!feedc)
- return FALSE;
- feedc->CtrlProc = controlProc;
- feedc->BellProc = bellProc;
- feedc->ctrl = defaultBellControl;
- feedc->ctrl.id = 0;
- if ( (feedc->next = dev->bell) )
- feedc->ctrl.id = dev->bell->ctrl.id + 1;
- dev->bell = feedc;
- (*controlProc)(dev, &feedc->ctrl);
- return TRUE;
-}
-
-Bool
-InitLedFeedbackClassDeviceStruct (DeviceIntPtr dev, LedCtrlProcPtr controlProc)
-{
- LedFeedbackPtr feedc;
-
- feedc = malloc(sizeof(LedFeedbackClassRec));
- if (!feedc)
- return FALSE;
- feedc->CtrlProc = controlProc;
- feedc->ctrl = defaultLedControl;
- feedc->ctrl.id = 0;
- if ( (feedc->next = dev->leds) )
- feedc->ctrl.id = dev->leds->ctrl.id + 1;
- feedc->xkb_sli= NULL;
- dev->leds = feedc;
- (*controlProc)(dev, &feedc->ctrl);
- return TRUE;
-}
-
-Bool
-InitIntegerFeedbackClassDeviceStruct (DeviceIntPtr dev, IntegerCtrlProcPtr controlProc)
-{
- IntegerFeedbackPtr feedc;
-
- feedc = malloc(sizeof(IntegerFeedbackClassRec));
- if (!feedc)
- return FALSE;
- feedc->CtrlProc = controlProc;
- feedc->ctrl = defaultIntegerControl;
- feedc->ctrl.id = 0;
- if ( (feedc->next = dev->intfeed) )
- feedc->ctrl.id = dev->intfeed->ctrl.id + 1;
- dev->intfeed = feedc;
- (*controlProc)(dev, &feedc->ctrl);
- return TRUE;
-}
-
-Bool
-InitPointerDeviceStruct(DevicePtr device, CARD8 *map, int numButtons, Atom* btn_labels,
- PtrCtrlProcPtr controlProc, int numMotionEvents,
- int numAxes, Atom *axes_labels)
-{
- DeviceIntPtr dev = (DeviceIntPtr)device;
-
- return(InitButtonClassDeviceStruct(dev, numButtons, btn_labels, map) &&
- InitValuatorClassDeviceStruct(dev, numAxes, axes_labels,
- numMotionEvents, Relative) &&
- InitPtrFeedbackClassDeviceStruct(dev, controlProc));
-}
-
-/*
- * Check if the given buffer contains elements between low (inclusive) and
- * high (inclusive) only.
- *
- * @return TRUE if the device map is invalid, FALSE otherwise.
- */
-Bool
-BadDeviceMap(BYTE *buff, int length, unsigned low, unsigned high, XID *errval)
-{
- int i;
-
- for (i = 0; i < length; i++)
- if (buff[i]) /* only check non-zero elements */
- {
- if ((low > buff[i]) || (high < buff[i]))
- {
- *errval = buff[i];
- return TRUE;
- }
- }
- return FALSE;
-}
-
-int
-ProcSetModifierMapping(ClientPtr client)
-{
- xSetModifierMappingReply rep;
- int rc;
- REQUEST(xSetModifierMappingReq);
- REQUEST_AT_LEAST_SIZE(xSetModifierMappingReq);
-
- if (client->req_len != ((stuff->numKeyPerModifier << 1) +
- bytes_to_int32(sizeof(xSetModifierMappingReq))))
- return BadLength;
-
- rep.type = X_Reply;
- rep.length = 0;
- rep.sequenceNumber = client->sequence;
-
- rc = change_modmap(client, PickKeyboard(client), (KeyCode *)&stuff[1],
- stuff->numKeyPerModifier);
- if (rc == MappingFailed || rc == -1)
- return BadValue;
- if (rc != Success && rc != MappingSuccess && rc != MappingFailed &&
- rc != MappingBusy)
- return rc;
-
- rep.success = rc;
-
- WriteReplyToClient(client, sizeof(xSetModifierMappingReply), &rep);
- return Success;
-}
-
-int
-ProcGetModifierMapping(ClientPtr client)
-{
- xGetModifierMappingReply rep;
- int max_keys_per_mod = 0;
- KeyCode *modkeymap = NULL;
- REQUEST_SIZE_MATCH(xReq);
-
- generate_modkeymap(client, PickKeyboard(client), &modkeymap,
- &max_keys_per_mod);
-
- memset(&rep, 0, sizeof(xGetModifierMappingReply));
- rep.type = X_Reply;
- rep.numKeyPerModifier = max_keys_per_mod;
- rep.sequenceNumber = client->sequence;
- /* length counts 4 byte quantities - there are 8 modifiers 1 byte big */
- rep.length = max_keys_per_mod << 1;
-
- WriteReplyToClient(client, sizeof(xGetModifierMappingReply), &rep);
- (void)WriteToClient(client, max_keys_per_mod * 8, (char *) modkeymap);
-
- free(modkeymap);
-
- return Success;
-}
-
-int
-ProcChangeKeyboardMapping(ClientPtr client)
-{
- REQUEST(xChangeKeyboardMappingReq);
- unsigned len;
- KeySymsRec keysyms;
- DeviceIntPtr pDev, tmp;
- int rc;
- REQUEST_AT_LEAST_SIZE(xChangeKeyboardMappingReq);
-
- len = client->req_len - bytes_to_int32(sizeof(xChangeKeyboardMappingReq));
- if (len != (stuff->keyCodes * stuff->keySymsPerKeyCode))
- return BadLength;
-
- pDev = PickKeyboard(client);
-
- if ((stuff->firstKeyCode < pDev->key->xkbInfo->desc->min_key_code) ||
- (stuff->firstKeyCode > pDev->key->xkbInfo->desc->max_key_code)) {
- client->errorValue = stuff->firstKeyCode;
- return BadValue;
-
- }
- if (((unsigned)(stuff->firstKeyCode + stuff->keyCodes - 1) >
- pDev->key->xkbInfo->desc->max_key_code) ||
- (stuff->keySymsPerKeyCode == 0)) {
- client->errorValue = stuff->keySymsPerKeyCode;
- return BadValue;
- }
-
- keysyms.minKeyCode = stuff->firstKeyCode;
- keysyms.maxKeyCode = stuff->firstKeyCode + stuff->keyCodes - 1;
- keysyms.mapWidth = stuff->keySymsPerKeyCode;
- keysyms.map = (KeySym *) &stuff[1];
-
- rc = XaceHook(XACE_DEVICE_ACCESS, client, pDev, DixManageAccess);
- if (rc != Success)
- return rc;
-
- XkbApplyMappingChange(pDev, &keysyms, stuff->firstKeyCode,
- stuff->keyCodes, NULL, client);
-
- for (tmp = inputInfo.devices; tmp; tmp = tmp->next) {
- if (IsMaster(tmp) || tmp->u.master != pDev)
- continue;
- if (!tmp->key)
- continue;
-
- rc = XaceHook(XACE_DEVICE_ACCESS, client, pDev, DixManageAccess);
- if (rc != Success)
- continue;
-
- XkbApplyMappingChange(tmp, &keysyms, stuff->firstKeyCode,
- stuff->keyCodes, NULL, client);
- }
-
- return Success;
-}
-
-int
-ProcSetPointerMapping(ClientPtr client)
-{
- BYTE *map;
- int ret;
- int i, j;
- DeviceIntPtr ptr = PickPointer(client);
- xSetPointerMappingReply rep;
- REQUEST(xSetPointerMappingReq);
- REQUEST_AT_LEAST_SIZE(xSetPointerMappingReq);
-
- if (client->req_len !=
- bytes_to_int32(sizeof(xSetPointerMappingReq) + stuff->nElts))
- return BadLength;
- rep.type = X_Reply;
- rep.length = 0;
- rep.sequenceNumber = client->sequence;
- rep.success = MappingSuccess;
- map = (BYTE *)&stuff[1];
-
- /* So we're bounded here by the number of core buttons. This check
- * probably wants disabling through XFixes. */
- /* MPX: With ClientPointer, we can return the right number of buttons.
- * Let's just hope nobody changed ClientPointer between GetPointerMapping
- * and SetPointerMapping
- */
- if (stuff->nElts != ptr->button->numButtons) {
- client->errorValue = stuff->nElts;
- return BadValue;
- }
-
- /* Core protocol specs don't allow for duplicate mappings; this check
- * almost certainly wants disabling through XFixes too. */
- for (i = 0; i < stuff->nElts; i++) {
- for (j = i + 1; j < stuff->nElts; j++) {
- if (map[i] && map[i] == map[j]) {
- client->errorValue = map[i];
- return BadValue;
- }
- }
- }
-
- ret = ApplyPointerMapping(ptr, map, stuff->nElts, client);
- if (ret == MappingBusy)
- rep.success = ret;
- else if (ret == -1)
- return BadValue;
- else if (ret != Success)
- return ret;
-
- WriteReplyToClient(client, sizeof(xSetPointerMappingReply), &rep);
- return Success;
-}
-
-int
-ProcGetKeyboardMapping(ClientPtr client)
-{
- xGetKeyboardMappingReply rep;
- DeviceIntPtr kbd = PickKeyboard(client);
- XkbDescPtr xkb;
- KeySymsPtr syms;
- int rc;
- REQUEST(xGetKeyboardMappingReq);
- REQUEST_SIZE_MATCH(xGetKeyboardMappingReq);
-
- rc = XaceHook(XACE_DEVICE_ACCESS, client, kbd, DixGetAttrAccess);
- if (rc != Success)
- return rc;
-
- xkb = kbd->key->xkbInfo->desc;
-
- if ((stuff->firstKeyCode < xkb->min_key_code) ||
- (stuff->firstKeyCode > xkb->max_key_code)) {
- client->errorValue = stuff->firstKeyCode;
- return BadValue;
- }
- if (stuff->firstKeyCode + stuff->count > xkb->max_key_code + 1) {
- client->errorValue = stuff->count;
- return BadValue;
- }
-
- syms = XkbGetCoreMap(kbd);
- if (!syms)
- return BadAlloc;
-
- memset(&rep, 0, sizeof(xGetKeyboardMappingReply));
- rep.type = X_Reply;
- rep.sequenceNumber = client->sequence;
- rep.keySymsPerKeyCode = syms->mapWidth;
- /* length is a count of 4 byte quantities and KeySyms are 4 bytes */
- rep.length = syms->mapWidth * stuff->count;
- WriteReplyToClient(client, sizeof(xGetKeyboardMappingReply), &rep);
- client->pSwapReplyFunc = (ReplySwapPtr) CopySwap32Write;
- WriteSwappedDataToClient(client,
- syms->mapWidth * stuff->count * sizeof(KeySym),
- &syms->map[syms->mapWidth * (stuff->firstKeyCode -
- syms->minKeyCode)]);
- free(syms->map);
- free(syms);
-
- return Success;
-}
-
-int
-ProcGetPointerMapping(ClientPtr client)
-{
- xGetPointerMappingReply rep;
- /* Apps may get different values each time they call GetPointerMapping as
- * the ClientPointer could change. */
- DeviceIntPtr ptr = PickPointer(client);
- ButtonClassPtr butc = ptr->button;
- int rc;
- REQUEST_SIZE_MATCH(xReq);
-
- rc = XaceHook(XACE_DEVICE_ACCESS, client, ptr, DixGetAttrAccess);
- if (rc != Success)
- return rc;
-
- rep.type = X_Reply;
- rep.sequenceNumber = client->sequence;
- rep.nElts = (butc) ? butc->numButtons : 0;
- rep.length = ((unsigned)rep.nElts + (4-1))/4;
- WriteReplyToClient(client, sizeof(xGetPointerMappingReply), &rep);
- if (butc)
- WriteToClient(client, (int)rep.nElts, (char *)&butc->map[1]);
- return Success;
-}
-
-void
-NoteLedState(DeviceIntPtr keybd, int led, Bool on)
-{
- KeybdCtrl *ctrl = &keybd->kbdfeed->ctrl;
- if (on)
- ctrl->leds |= ((Leds)1 << (led - 1));
- else
- ctrl->leds &= ~((Leds)1 << (led - 1));
-}
-
-int
-Ones(unsigned long mask) /* HACKMEM 169 */
-{
- unsigned long y;
-
- y = (mask >> 1) &033333333333;
- y = mask - y - ((y >>1) & 033333333333);
- return (((y + (y >> 3)) & 030707070707) % 077);
-}
-
-static int
-DoChangeKeyboardControl (ClientPtr client, DeviceIntPtr keybd, XID *vlist,
- BITS32 vmask)
-{
-#define DO_ALL (-1)
- KeybdCtrl ctrl;
- int t;
- int led = DO_ALL;
- int key = DO_ALL;
- BITS32 index2;
- int mask = vmask, i;
- XkbEventCauseRec cause;
-
- ctrl = keybd->kbdfeed->ctrl;
- while (vmask) {
- index2 = (BITS32) lowbit (vmask);
- vmask &= ~index2;
- switch (index2) {
- case KBKeyClickPercent:
- t = (INT8)*vlist;
- vlist++;
- if (t == -1) {
- t = defaultKeyboardControl.click;
- }
- else if (t < 0 || t > 100) {
- client->errorValue = t;
- return BadValue;
- }
- ctrl.click = t;
- break;
- case KBBellPercent:
- t = (INT8)*vlist;
- vlist++;
- if (t == -1) {
- t = defaultKeyboardControl.bell;
- }
- else if (t < 0 || t > 100) {
- client->errorValue = t;
- return BadValue;
- }
- ctrl.bell = t;
- break;
- case KBBellPitch:
- t = (INT16)*vlist;
- vlist++;
- if (t == -1) {
- t = defaultKeyboardControl.bell_pitch;
- }
- else if (t < 0) {
- client->errorValue = t;
- return BadValue;
- }
- ctrl.bell_pitch = t;
- break;
- case KBBellDuration:
- t = (INT16)*vlist;
- vlist++;
- if (t == -1)
- t = defaultKeyboardControl.bell_duration;
- else if (t < 0) {
- client->errorValue = t;
- return BadValue;
- }
- ctrl.bell_duration = t;
- break;
- case KBLed:
- led = (CARD8)*vlist;
- vlist++;
- if (led < 1 || led > 32) {
- client->errorValue = led;
- return BadValue;
- }
- if (!(mask & KBLedMode))
- return BadMatch;
- break;
- case KBLedMode:
- t = (CARD8)*vlist;
- vlist++;
- if (t == LedModeOff) {
- if (led == DO_ALL)
- ctrl.leds = 0x0;
- else
- ctrl.leds &= ~(((Leds)(1)) << (led - 1));
- }
- else if (t == LedModeOn) {
- if (led == DO_ALL)
- ctrl.leds = ~0L;
- else
- ctrl.leds |= (((Leds)(1)) << (led - 1));
- }
- else {
- client->errorValue = t;
- return BadValue;
- }
-
- XkbSetCauseCoreReq(&cause,X_ChangeKeyboardControl,client);
- XkbSetIndicators(keybd,((led == DO_ALL) ? ~0L : (1L<<(led-1))),
- ctrl.leds, &cause);
- ctrl.leds = keybd->kbdfeed->ctrl.leds;
-
- break;
- case KBKey:
- key = (KeyCode)*vlist;
- vlist++;
- if ((KeyCode)key < keybd->key->xkbInfo->desc->min_key_code ||
- (KeyCode)key > keybd->key->xkbInfo->desc->max_key_code) {
- client->errorValue = key;
- return BadValue;
- }
- if (!(mask & KBAutoRepeatMode))
- return BadMatch;
- break;
- case KBAutoRepeatMode:
- i = (key >> 3);
- mask = (1 << (key & 7));
- t = (CARD8)*vlist;
- vlist++;
- if (key != DO_ALL)
- XkbDisableComputedAutoRepeats(keybd,key);
- if (t == AutoRepeatModeOff) {
- if (key == DO_ALL)
- ctrl.autoRepeat = FALSE;
- else
- ctrl.autoRepeats[i] &= ~mask;
- }
- else if (t == AutoRepeatModeOn) {
- if (key == DO_ALL)
- ctrl.autoRepeat = TRUE;
- else
- ctrl.autoRepeats[i] |= mask;
- }
- else if (t == AutoRepeatModeDefault) {
- if (key == DO_ALL)
- ctrl.autoRepeat = defaultKeyboardControl.autoRepeat;
- else
- ctrl.autoRepeats[i] =
- (ctrl.autoRepeats[i] & ~mask) |
- (defaultKeyboardControl.autoRepeats[i] & mask);
- }
- else {
- client->errorValue = t;
- return BadValue;
- }
- break;
- default:
- client->errorValue = mask;
- return BadValue;
- }
- }
- keybd->kbdfeed->ctrl = ctrl;
-
- /* The XKB RepeatKeys control and core protocol global autorepeat */
- /* value are linked */
- XkbSetRepeatKeys(keybd, key, keybd->kbdfeed->ctrl.autoRepeat);
-
- return Success;
-
-#undef DO_ALL
-}
-
-/**
- * Changes kbd control on the ClientPointer and all attached SDs.
- */
-int
-ProcChangeKeyboardControl (ClientPtr client)
-{
- XID *vlist;
- BITS32 vmask;
- int ret = Success, error = Success;
- DeviceIntPtr pDev = NULL, keyboard;
- REQUEST(xChangeKeyboardControlReq);
-
- REQUEST_AT_LEAST_SIZE(xChangeKeyboardControlReq);
-
- vmask = stuff->mask;
- vlist = (XID *)&stuff[1];
-
- if (client->req_len != (sizeof(xChangeKeyboardControlReq)>>2)+Ones(vmask))
- return BadLength;
-
- keyboard = PickKeyboard(client);
-
- for (pDev = inputInfo.devices; pDev; pDev = pDev->next) {
- if ((pDev == keyboard ||
- (!IsMaster(pDev) && GetMaster(pDev, MASTER_KEYBOARD) == keyboard))
- && pDev->kbdfeed && pDev->kbdfeed->CtrlProc) {
- ret = XaceHook(XACE_DEVICE_ACCESS, client, pDev, DixManageAccess);
- if (ret != Success)
- return ret;
- }
- }
-
- for (pDev = inputInfo.devices; pDev; pDev = pDev->next) {
- if ((pDev == keyboard ||
- (!IsMaster(pDev) && GetMaster(pDev, MASTER_KEYBOARD) == keyboard))
- && pDev->kbdfeed && pDev->kbdfeed->CtrlProc) {
- ret = DoChangeKeyboardControl(client, pDev, vlist, vmask);
- if (ret != Success)
- error = ret;
- }
- }
-
- return error;
-}
-
-int
-ProcGetKeyboardControl (ClientPtr client)
-{
- int rc, i;
- DeviceIntPtr kbd = PickKeyboard(client);
- KeybdCtrl *ctrl = &kbd->kbdfeed->ctrl;
- xGetKeyboardControlReply rep;
- REQUEST_SIZE_MATCH(xReq);
-
- rc = XaceHook(XACE_DEVICE_ACCESS, client, kbd, DixGetAttrAccess);
- if (rc != Success)
- return rc;
-
- rep.type = X_Reply;
- rep.length = 5;
- rep.sequenceNumber = client->sequence;
- rep.globalAutoRepeat = ctrl->autoRepeat;
- rep.keyClickPercent = ctrl->click;
- rep.bellPercent = ctrl->bell;
- rep.bellPitch = ctrl->bell_pitch;
- rep.bellDuration = ctrl->bell_duration;
- rep.ledMask = ctrl->leds;
- for (i = 0; i < 32; i++)
- rep.map[i] = ctrl->autoRepeats[i];
- WriteReplyToClient(client, sizeof(xGetKeyboardControlReply), &rep);
- return Success;
-}
-
-int
-ProcBell(ClientPtr client)
-{
- DeviceIntPtr dev, keybd = PickKeyboard(client);
- int base = keybd->kbdfeed->ctrl.bell;
- int newpercent;
- int rc;
- REQUEST(xBellReq);
- REQUEST_SIZE_MATCH(xBellReq);
-
- if (stuff->percent < -100 || stuff->percent > 100) {
- client->errorValue = stuff->percent;
- return BadValue;
- }
-
- newpercent = (base * stuff->percent) / 100;
- if (stuff->percent < 0)
- newpercent = base + newpercent;
- else
- newpercent = base - newpercent + stuff->percent;
-
- for (dev = inputInfo.devices; dev; dev = dev->next) {
- if ((dev == keybd ||
- (!IsMaster(dev) && GetMaster(dev, MASTER_KEYBOARD) == keybd)) &&
- dev->kbdfeed && dev->kbdfeed->BellProc) {
-
- rc = XaceHook(XACE_DEVICE_ACCESS, client, dev, DixBellAccess);
- if (rc != Success)
- return rc;
- XkbHandleBell(FALSE, FALSE, dev, newpercent,
- &dev->kbdfeed->ctrl, 0, None, NULL, client);
- }
- }
-
- return Success;
-}
-
-int
-ProcChangePointerControl(ClientPtr client)
-{
- DeviceIntPtr dev, mouse = PickPointer(client);
- PtrCtrl ctrl; /* might get BadValue part way through */
- int rc;
- REQUEST(xChangePointerControlReq);
- REQUEST_SIZE_MATCH(xChangePointerControlReq);
-
- ctrl = mouse->ptrfeed->ctrl;
- if ((stuff->doAccel != xTrue) && (stuff->doAccel != xFalse)) {
- client->errorValue = stuff->doAccel;
- return BadValue;
- }
- if ((stuff->doThresh != xTrue) && (stuff->doThresh != xFalse)) {
- client->errorValue = stuff->doThresh;
- return BadValue;
- }
- if (stuff->doAccel) {
- if (stuff->accelNum == -1) {
- ctrl.num = defaultPointerControl.num;
- }
- else if (stuff->accelNum < 0) {
- client->errorValue = stuff->accelNum;
- return BadValue;
- }
- else {
- ctrl.num = stuff->accelNum;
- }
-
- if (stuff->accelDenum == -1) {
- ctrl.den = defaultPointerControl.den;
- }
- else if (stuff->accelDenum <= 0) {
- client->errorValue = stuff->accelDenum;
- return BadValue;
- }
- else {
- ctrl.den = stuff->accelDenum;
- }
- }
- if (stuff->doThresh) {
- if (stuff->threshold == -1) {
- ctrl.threshold = defaultPointerControl.threshold;
- }
- else if (stuff->threshold < 0) {
- client->errorValue = stuff->threshold;
- return BadValue;
- }
- else {
- ctrl.threshold = stuff->threshold;
- }
- }
-
- for (dev = inputInfo.devices; dev; dev = dev->next) {
- if ((dev == mouse ||
- (!IsMaster(dev) && GetMaster(dev, MASTER_POINTER) == mouse)) &&
- dev->ptrfeed) {
- rc = XaceHook(XACE_DEVICE_ACCESS, client, dev, DixManageAccess);
- if (rc != Success)
- return rc;
- }
- }
-
- for (dev = inputInfo.devices; dev; dev = dev->next) {
- if ((dev == mouse ||
- (!IsMaster(dev) && GetMaster(dev, MASTER_POINTER) == mouse)) &&
- dev->ptrfeed) {
- dev->ptrfeed->ctrl = ctrl;
- }
- }
-
- return Success;
-}
-
-int
-ProcGetPointerControl(ClientPtr client)
-{
- DeviceIntPtr ptr = PickPointer(client);
- PtrCtrl *ctrl = &ptr->ptrfeed->ctrl;
- xGetPointerControlReply rep;
- int rc;
- REQUEST_SIZE_MATCH(xReq);
-
- rc = XaceHook(XACE_DEVICE_ACCESS, client, ptr, DixGetAttrAccess);
- if (rc != Success)
- return rc;
-
- rep.type = X_Reply;
- rep.length = 0;
- rep.sequenceNumber = client->sequence;
- rep.threshold = ctrl->threshold;
- rep.accelNumerator = ctrl->num;
- rep.accelDenominator = ctrl->den;
- WriteReplyToClient(client, sizeof(xGenericReply), &rep);
- return Success;
-}
-
-void
-MaybeStopHint(DeviceIntPtr dev, ClientPtr client)
-{
- GrabPtr grab = dev->deviceGrab.grab;
-
- if ((grab && SameClient(grab, client) &&
- ((grab->eventMask & PointerMotionHintMask) ||
- (grab->ownerEvents &&
- (EventMaskForClient(dev->valuator->motionHintWindow, client) &
- PointerMotionHintMask)))) ||
- (!grab &&
- (EventMaskForClient(dev->valuator->motionHintWindow, client) &
- PointerMotionHintMask)))
- dev->valuator->motionHintWindow = NullWindow;
-}
-
-int
-ProcGetMotionEvents(ClientPtr client)
-{
- WindowPtr pWin;
- xTimecoord * coords = (xTimecoord *) NULL;
- xGetMotionEventsReply rep;
- int i, count, xmin, xmax, ymin, ymax, rc;
- unsigned long nEvents;
- DeviceIntPtr mouse = PickPointer(client);
- TimeStamp start, stop;
- REQUEST(xGetMotionEventsReq);
- REQUEST_SIZE_MATCH(xGetMotionEventsReq);
-
- rc = dixLookupWindow(&pWin, stuff->window, client, DixGetAttrAccess);
- if (rc != Success)
- return rc;
- rc = XaceHook(XACE_DEVICE_ACCESS, client, mouse, DixReadAccess);
- if (rc != Success)
- return rc;
-
- if (mouse->valuator->motionHintWindow)
- MaybeStopHint(mouse, client);
- rep.type = X_Reply;
- rep.sequenceNumber = client->sequence;
- nEvents = 0;
- start = ClientTimeToServerTime(stuff->start);
- stop = ClientTimeToServerTime(stuff->stop);
- if ((CompareTimeStamps(start, stop) != LATER) &&
- (CompareTimeStamps(start, currentTime) != LATER) &&
- mouse->valuator->numMotionEvents)
- {
- if (CompareTimeStamps(stop, currentTime) == LATER)
- stop = currentTime;
- count = GetMotionHistory(mouse, &coords, start.milliseconds,
- stop.milliseconds, pWin->drawable.pScreen,
- TRUE);
- xmin = pWin->drawable.x - wBorderWidth (pWin);
- xmax = pWin->drawable.x + (int)pWin->drawable.width +
- wBorderWidth (pWin);
- ymin = pWin->drawable.y - wBorderWidth (pWin);
- ymax = pWin->drawable.y + (int)pWin->drawable.height +
- wBorderWidth (pWin);
- for (i = 0; i < count; i++)
- if ((xmin <= coords[i].x) && (coords[i].x < xmax) &&
- (ymin <= coords[i].y) && (coords[i].y < ymax))
- {
- coords[nEvents].time = coords[i].time;
- coords[nEvents].x = coords[i].x - pWin->drawable.x;
- coords[nEvents].y = coords[i].y - pWin->drawable.y;
- nEvents++;
- }
- }
- rep.length = nEvents * bytes_to_int32(sizeof(xTimecoord));
- rep.nEvents = nEvents;
- WriteReplyToClient(client, sizeof(xGetMotionEventsReply), &rep);
- if (nEvents)
- {
- client->pSwapReplyFunc = (ReplySwapPtr) SwapTimeCoordWrite;
- WriteSwappedDataToClient(client, nEvents * sizeof(xTimecoord),
- (char *)coords);
- }
- free(coords);
- return Success;
-}
-
-int
-ProcQueryKeymap(ClientPtr client)
-{
- xQueryKeymapReply rep;
- int rc, i;
- DeviceIntPtr keybd = PickKeyboard(client);
- CARD8 *down = keybd->key->down;
-
- REQUEST_SIZE_MATCH(xReq);
- rep.type = X_Reply;
- rep.sequenceNumber = client->sequence;
- rep.length = 2;
-
- rc = XaceHook(XACE_DEVICE_ACCESS, client, keybd, DixReadAccess);
- if (rc != Success && rc != BadAccess)
- return rc;
-
- for (i = 0; i<32; i++)
- rep.map[i] = down[i];
-
- if (rc == BadAccess)
- memset(rep.map, 0, 32);
-
- WriteReplyToClient(client, sizeof(xQueryKeymapReply), &rep);
-
- return Success;
-}
-
-
-/**
- * Recalculate the number of buttons for the master device. The number of
- * buttons on the master device is equal to the number of buttons on the
- * slave device with the highest number of buttons.
- */
-static void
-RecalculateMasterButtons(DeviceIntPtr slave)
-{
- DeviceIntPtr dev, master;
- int maxbuttons = 0;
-
- if (!slave->button || IsMaster(slave))
- return;
-
- master = GetMaster(slave, MASTER_POINTER);
- if (!master)
- return;
-
- for (dev = inputInfo.devices; dev; dev = dev->next)
- {
- if (IsMaster(dev) ||
- dev->u.master != master ||
- !dev->button)
- continue;
-
- maxbuttons = max(maxbuttons, dev->button->numButtons);
- }
-
- if (master->button && master->button->numButtons != maxbuttons)
- {
- int i;
- DeviceChangedEvent event;
-
- memset(&event, 0, sizeof(event));
-
- master->button->numButtons = maxbuttons;
-
- event.header = ET_Internal;
- event.type = ET_DeviceChanged;
- event.time = GetTimeInMillis();
- event.deviceid = master->id;
- event.flags = DEVCHANGE_POINTER_EVENT | DEVCHANGE_DEVICE_CHANGE;
- event.buttons.num_buttons = maxbuttons;
- memcpy(&event.buttons.names, master->button->labels, maxbuttons *
- sizeof(Atom));
-
- if (master->valuator)
- {
- event.num_valuators = master->valuator->numAxes;
- for (i = 0; i < event.num_valuators; i++)
- {
- event.valuators[i].min = master->valuator->axes[i].min_value;
- event.valuators[i].max = master->valuator->axes[i].max_value;
- event.valuators[i].resolution = master->valuator->axes[i].resolution;
- event.valuators[i].mode = master->valuator->axes[i].mode;
- event.valuators[i].name = master->valuator->axes[i].label;
- }
- }
-
- if (master->key)
- {
- event.keys.min_keycode = master->key->xkbInfo->desc->min_key_code;
- event.keys.max_keycode = master->key->xkbInfo->desc->max_key_code;
- }
-
- XISendDeviceChangedEvent(master, master, &event);
- }
-}
-
-/**
- * Attach device 'dev' to device 'master'.
- * Client is set to the client that issued the request, or NULL if it comes
- * from some internal automatic pairing.
- *
- * Master may be NULL to set the device floating.
- *
- * We don't allow multi-layer hierarchies right now. You can't attach a slave
- * to another slave.
- */
-int
-AttachDevice(ClientPtr client, DeviceIntPtr dev, DeviceIntPtr master)
-{
- ScreenPtr screen;
- DeviceIntPtr oldmaster;
- if (!dev || IsMaster(dev))
- return BadDevice;
-
- if (master && !IsMaster(master)) /* can't attach to slaves */
- return BadDevice;
-
- /* set from floating to floating? */
- if (!dev->u.master && !master && dev->enabled)
- return Success;
-
- /* free the existing sprite. */
- if (!dev->u.master && dev->spriteInfo->paired == dev)
- {
- screen = miPointerGetScreen(dev);
- screen->DeviceCursorCleanup(dev, screen);
- free(dev->spriteInfo->sprite);
- }
-
- oldmaster = dev->u.master;
- dev->u.master = master;
-
- /* If device is set to floating, we need to create a sprite for it,
- * otherwise things go bad. However, we don't want to render the cursor,
- * so we reset spriteOwner.
- * Sprite has to be forced to NULL first, otherwise InitializeSprite won't
- * alloc new memory but overwrite the previous one.
- */
- if (!master)
- {
- WindowPtr currentRoot;
-
- if (dev->spriteInfo->sprite)
- currentRoot = GetCurrentRootWindow(dev);
- else /* new device auto-set to floating */
- currentRoot = screenInfo.screens[0]->root;
-
- /* we need to init a fake sprite */
- screen = currentRoot->drawable.pScreen;
- screen->DeviceCursorInitialize(dev, screen);
- dev->spriteInfo->sprite = NULL;
- InitializeSprite(dev, currentRoot);
- dev->spriteInfo->spriteOwner = FALSE;
- dev->spriteInfo->paired = dev;
- } else
- {
- dev->spriteInfo->sprite = master->spriteInfo->sprite;
- dev->spriteInfo->paired = master;
- dev->spriteInfo->spriteOwner = FALSE;
-
- RecalculateMasterButtons(master);
- }
-
- /* XXX: in theory, the MD should change back to its old, original
- * classes when the last SD is detached. Thanks to the XTEST devices,
- * we'll always have an SD attached until the MD is removed.
- * So let's not worry about that.
- */
-
- return Success;
-}
-
-/**
- * Return the device paired with the given device or NULL.
- * Returns the device paired with the parent master if the given device is a
- * slave device.
- */
-DeviceIntPtr
-GetPairedDevice(DeviceIntPtr dev)
-{
- if (!IsMaster(dev) && dev->u.master)
- dev = dev->u.master;
-
- return dev->spriteInfo->paired;
-}
-
-
-/**
- * Returns the right master for the type of event needed. If the event is a
- * keyboard event.
- * This function may be called with a master device as argument. If so, the
- * returned master is either the device itself or the paired master device.
- * If dev is a floating slave device, NULL is returned.
- *
- * @type ::MASTER_KEYBOARD or ::MASTER_POINTER
- */
-DeviceIntPtr
-GetMaster(DeviceIntPtr dev, int which)
-{
- DeviceIntPtr master;
-
- if (IsMaster(dev))
- master = dev;
- else
- master = dev->u.master;
-
- if (master)
- {
- if (which == MASTER_KEYBOARD)
- {
- if (master->type != MASTER_KEYBOARD)
- master = GetPairedDevice(master);
- } else
- {
- if (master->type != MASTER_POINTER)
- master = GetPairedDevice(master);
- }
- }
-
- return master;
-}
-
-/**
- * Create a new device pair (== one pointer, one keyboard device).
- * Only allocates the devices, you will need to call ActivateDevice() and
- * EnableDevice() manually.
- * Either a master or a slave device can be created depending on
- * the value for master.
- */
-int
-AllocDevicePair (ClientPtr client, char* name,
- DeviceIntPtr* ptr,
- DeviceIntPtr* keybd,
- DeviceProc ptr_proc,
- DeviceProc keybd_proc,
- Bool master)
-{
- DeviceIntPtr pointer;
- DeviceIntPtr keyboard;
- *ptr = *keybd = NULL;
-
- pointer = AddInputDevice(client, ptr_proc, TRUE);
- if (!pointer)
- return BadAlloc;
-
- if (asprintf(&pointer->name, "%s pointer", name) == -1) {
- pointer->name = NULL;
- RemoveDevice(pointer, FALSE);
- return BadAlloc;
- }
-
- pointer->public.processInputProc = ProcessOtherEvent;
- pointer->public.realInputProc = ProcessOtherEvent;
- XkbSetExtension(pointer, ProcessPointerEvent);
- pointer->deviceGrab.ActivateGrab = ActivatePointerGrab;
- pointer->deviceGrab.DeactivateGrab = DeactivatePointerGrab;
- pointer->coreEvents = TRUE;
- pointer->spriteInfo->spriteOwner = TRUE;
-
- pointer->u.lastSlave = NULL;
- pointer->last.slave = NULL;
- pointer->type = (master) ? MASTER_POINTER : SLAVE;
-
- keyboard = AddInputDevice(client, keybd_proc, TRUE);
- if (!keyboard)
- {
- RemoveDevice(pointer, FALSE);
- return BadAlloc;
- }
-
- if (asprintf(&keyboard->name, "%s keyboard", name) == -1) {
- keyboard->name = NULL;
- RemoveDevice(keyboard, FALSE);
- RemoveDevice(pointer, FALSE);
- return BadAlloc;
- }
-
- keyboard->public.processInputProc = ProcessOtherEvent;
- keyboard->public.realInputProc = ProcessOtherEvent;
- XkbSetExtension(keyboard, ProcessKeyboardEvent);
- keyboard->deviceGrab.ActivateGrab = ActivateKeyboardGrab;
- keyboard->deviceGrab.DeactivateGrab = DeactivateKeyboardGrab;
- keyboard->coreEvents = TRUE;
- keyboard->spriteInfo->spriteOwner = FALSE;
-
- keyboard->u.lastSlave = NULL;
- keyboard->last.slave = NULL;
- keyboard->type = (master) ? MASTER_KEYBOARD : SLAVE;
-
- /* The ClassesRec stores the device classes currently not used. */
- pointer->unused_classes = calloc(1, sizeof(ClassesRec));
- keyboard->unused_classes = calloc(1, sizeof(ClassesRec));
-
- *ptr = pointer;
- *keybd = keyboard;
-
- return Success;
-}
-
-/**
- * Return Relative or Absolute for the device.
- */
-int valuator_get_mode(DeviceIntPtr dev, int axis)
-{
- return (dev->valuator->axes[axis].mode & DeviceMode);
-}
-
-/**
- * Set the given mode for the axis. If axis is VALUATOR_MODE_ALL_AXES, then
- * set the mode for all axes.
- */
-void valuator_set_mode(DeviceIntPtr dev, int axis, int mode)
-{
- if (axis != VALUATOR_MODE_ALL_AXES)
- dev->valuator->axes[axis].mode = mode;
- else {
- int i;
- for (i = 0; i < dev->valuator->numAxes; i++)
- dev->valuator->axes[i].mode = mode;
- }
-}
+/************************************************************ + +Copyright 1987, 1998 The Open Group + +Permission to use, copy, modify, distribute, and sell this software and its +documentation for any purpose is hereby granted without fee, provided that +the above copyright notice appear in all copies and that both that +copyright notice and this permission notice appear in supporting +documentation. + +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 THE +OPEN GROUP 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. + +Except as contained in this notice, the name of The Open Group shall not be +used in advertising or otherwise to promote the sale, use or other dealings +in this Software without prior written authorization from The Open Group. + + +Copyright 1987 by Digital Equipment Corporation, Maynard, Massachusetts. + + All Rights Reserved + +Permission to use, copy, modify, and distribute this software and its +documentation for any purpose and without fee is hereby granted, +provided that the above copyright notice appear in all copies and that +both that copyright notice and this permission notice appear in +supporting documentation, and that the name of Digital not be +used in advertising or publicity pertaining to distribution of the +software without specific, written prior permission. + +DIGITAL DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, INCLUDING +ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO EVENT SHALL +DIGITAL BE LIABLE FOR ANY SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR +ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, +WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, +ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS +SOFTWARE. + +********************************************************/ + + + +#ifdef HAVE_DIX_CONFIG_H +#include <dix-config.h> +#endif + +#include <X11/X.h> +#include "misc.h" +#include "resource.h" +#include <X11/Xproto.h> +#include <X11/Xatom.h> +#include "windowstr.h" +#include "inputstr.h" +#include "scrnintstr.h" +#include "cursorstr.h" +#include "dixstruct.h" +#include "ptrveloc.h" +#include "site.h" +#include "xkbsrv.h" +#include "privates.h" +#include "xace.h" +#include "mi.h" + +#include "dispatch.h" +#include "swaprep.h" +#include "dixevents.h" +#include "mipointer.h" +#include "eventstr.h" + +#include <X11/extensions/XI.h> +#include <X11/extensions/XI2.h> +#include <X11/extensions/XIproto.h> +#include <math.h> +#include <pixman.h> +#include "exglobals.h" +#include "exevents.h" +#include "xiquerydevice.h" /* for SizeDeviceClasses */ +#include "xiproperty.h" +#include "enterleave.h" /* for EnterWindow() */ +#include "xserver-properties.h" +#include "xichangehierarchy.h" /* For XISendDeviceHierarchyEvent */ + +/** @file + * This file handles input device-related stuff. + */ + +static void RecalculateMasterButtons(DeviceIntPtr slave); + +static void +DeviceSetTransform(DeviceIntPtr dev, float *transform) +{ + struct pixman_f_transform scale; + double sx, sy; + int x, y; + + /** + * calculate combined transformation matrix: + * + * M = InvScale * Transform * Scale + * + * So we can later transform points using M * p + * + * Where: + * Scale scales coordinates into 0..1 range + * Transform is the user supplied (affine) transform + * InvScale scales coordinates back up into their native range + */ + sx = dev->valuator->axes[0].max_value - dev->valuator->axes[0].min_value; + sy = dev->valuator->axes[1].max_value - dev->valuator->axes[1].min_value; + + /* invscale */ + pixman_f_transform_init_scale(&scale, sx, sy); + scale.m[0][2] = dev->valuator->axes[0].min_value; + scale.m[1][2] = dev->valuator->axes[1].min_value; + + /* transform */ + for (y=0; y<3; y++) + for (x=0; x<3; x++) + dev->transform.m[y][x] = *transform++; + + pixman_f_transform_multiply(&dev->transform, &scale, &dev->transform); + + /* scale */ + pixman_f_transform_init_scale(&scale, 1.0 / sx, 1.0 / sy); + scale.m[0][2] = -dev->valuator->axes[0].min_value / sx; + scale.m[1][2] = -dev->valuator->axes[1].min_value / sy; + + pixman_f_transform_multiply(&dev->transform, &dev->transform, &scale); +} + +/** + * DIX property handler. + */ +static int +DeviceSetProperty(DeviceIntPtr dev, Atom property, XIPropertyValuePtr prop, + BOOL checkonly) +{ + if (property == XIGetKnownProperty(XI_PROP_ENABLED)) + { + if (prop->format != 8 || prop->type != XA_INTEGER || prop->size != 1) + return BadValue; + + /* Don't allow disabling of VCP/VCK */ + if ((dev == inputInfo.pointer || dev == inputInfo.keyboard) && + !(*(CARD8*)prop->data)) + return BadAccess; + + if (!checkonly) + { + if ((*((CARD8*)prop->data)) && !dev->enabled) + EnableDevice(dev, TRUE); + else if (!(*((CARD8*)prop->data)) && dev->enabled) + DisableDevice(dev, TRUE); + } + } else if (property == XIGetKnownProperty(XI_PROP_TRANSFORM)) + { + float *f = (float*)prop->data; + int i; + + if (prop->format != 32 || prop->size != 9 || + prop->type != XIGetKnownProperty(XATOM_FLOAT)) + return BadValue; + + for (i=0; i<9; i++) + if (!isfinite(f[i])) + return BadValue; + + if (!checkonly) + DeviceSetTransform(dev, f); + } + + return Success; +} + +/* Pair the keyboard to the pointer device. Keyboard events will follow the + * pointer sprite. Only applicable for master devices. + * If the client is set, the request to pair comes from some client. In this + * case, we need to check for access. If the client is NULL, it's from an + * internal automatic pairing, we must always permit this. + */ +static int +PairDevices(ClientPtr client, DeviceIntPtr ptr, DeviceIntPtr kbd) +{ + if (!ptr) + return BadDevice; + + /* Don't allow pairing for slave devices */ + if (!IsMaster(ptr) || !IsMaster(kbd)) + return BadDevice; + + if (ptr->spriteInfo->paired) + return BadDevice; + + if (kbd->spriteInfo->spriteOwner) + { + free(kbd->spriteInfo->sprite); + kbd->spriteInfo->sprite = NULL; + kbd->spriteInfo->spriteOwner = FALSE; + } + + kbd->spriteInfo->sprite = ptr->spriteInfo->sprite; + kbd->spriteInfo->paired = ptr; + ptr->spriteInfo->paired = kbd; + return Success; +} + + +/** + * Find and return the next unpaired MD pointer device. + */ +static DeviceIntPtr +NextFreePointerDevice(void) +{ + DeviceIntPtr dev; + for (dev = inputInfo.devices; dev; dev = dev->next) + if (IsMaster(dev) && + dev->spriteInfo->spriteOwner && + !dev->spriteInfo->paired) + return dev; + return NULL; +} + +/** + * Create a new input device and init it to sane values. The device is added + * to the server's off_devices list. + * + * @param deviceProc Callback for device control function (switch dev on/off). + * @return The newly created device. + */ +DeviceIntPtr +AddInputDevice(ClientPtr client, DeviceProc deviceProc, Bool autoStart) +{ + DeviceIntPtr dev, *prev; /* not a typo */ + DeviceIntPtr devtmp; + int devid; + char devind[MAXDEVICES]; + BOOL enabled; + float transform[9]; + + /* Find next available id, 0 and 1 are reserved */ + memset(devind, 0, sizeof(char)*MAXDEVICES); + for (devtmp = inputInfo.devices; devtmp; devtmp = devtmp->next) + devind[devtmp->id]++; + for (devtmp = inputInfo.off_devices; devtmp; devtmp = devtmp->next) + devind[devtmp->id]++; + for (devid = 2; devid < MAXDEVICES && devind[devid]; devid++) + ; + + if (devid >= MAXDEVICES) + return (DeviceIntPtr)NULL; + dev = _dixAllocateObjectWithPrivates(sizeof(DeviceIntRec) + sizeof(SpriteInfoRec), + sizeof(DeviceIntRec) + sizeof(SpriteInfoRec), + offsetof(DeviceIntRec, devPrivates), PRIVATE_DEVICE); + if (!dev) + return (DeviceIntPtr)NULL; + dev->id = devid; + dev->public.processInputProc = ProcessOtherEvent; + dev->public.realInputProc = ProcessOtherEvent; + dev->public.enqueueInputProc = EnqueueEvent; + dev->deviceProc = deviceProc; + dev->startup = autoStart; + + /* device grab defaults */ + dev->deviceGrab.grabTime = currentTime; + dev->deviceGrab.ActivateGrab = ActivateKeyboardGrab; + dev->deviceGrab.DeactivateGrab = DeactivateKeyboardGrab; + + XkbSetExtension(dev, ProcessKeyboardEvent); + + dev->coreEvents = TRUE; + + /* sprite defaults */ + dev->spriteInfo = (SpriteInfoPtr)&dev[1]; + + /* security creation/labeling check + */ + if (XaceHook(XACE_DEVICE_ACCESS, client, dev, DixCreateAccess)) { + free(dev); + return NULL; + } + + inputInfo.numDevices++; + + for (prev = &inputInfo.off_devices; *prev; prev = &(*prev)->next) + ; + *prev = dev; + dev->next = NULL; + + enabled = FALSE; + XIChangeDeviceProperty(dev, XIGetKnownProperty(XI_PROP_ENABLED), + XA_INTEGER, 8, PropModeReplace, 1, &enabled, + FALSE); + XISetDevicePropertyDeletable(dev, XIGetKnownProperty(XI_PROP_ENABLED), FALSE); + + /* unity matrix */ + memset(transform, 0, sizeof(transform)); + transform[0] = transform[4] = transform[8] = 1.0f; + + XIChangeDeviceProperty(dev, XIGetKnownProperty(XI_PROP_TRANSFORM), + XIGetKnownProperty(XATOM_FLOAT), 32, + PropModeReplace, 9, transform, FALSE); + XISetDevicePropertyDeletable(dev, XIGetKnownProperty(XI_PROP_TRANSFORM), + FALSE); + + XIRegisterPropertyHandler(dev, DeviceSetProperty, NULL, NULL); + + return dev; +} + +void +SendDevicePresenceEvent(int deviceid, int type) +{ + DeviceIntRec dummyDev; + devicePresenceNotify ev; + + memset(&dummyDev, 0, sizeof(DeviceIntRec)); + ev.type = DevicePresenceNotify; + ev.time = currentTime.milliseconds; + ev.devchange = type; + ev.deviceid = deviceid; + dummyDev.id = XIAllDevices; + SendEventToAllWindows(&dummyDev, DevicePresenceNotifyMask, + (xEvent*)&ev, 1); +} + +/** + * Enable the device through the driver, add the device to the device list. + * Switch device ON through the driver and push it onto the global device + * list. Initialize the DIX sprite or pair the device. All clients are + * notified about the device being enabled. + * + * A master pointer device needs to be enabled before a master keyboard + * device. + * + * @param The device to be enabled. + * @param sendevent True if an XI2 event should be sent. + * @return TRUE on success or FALSE otherwise. + */ +Bool +EnableDevice(DeviceIntPtr dev, BOOL sendevent) +{ + DeviceIntPtr *prev; + int ret; + DeviceIntPtr other; + BOOL enabled; + int flags[MAXDEVICES] = {0}; + + for (prev = &inputInfo.off_devices; + *prev && (*prev != dev); + prev = &(*prev)->next) + ; + + if (!dev->spriteInfo->sprite) + { + if (IsMaster(dev)) + { + /* Sprites appear on first root window, so we can hardcode it */ + if (dev->spriteInfo->spriteOwner) + { + InitializeSprite(dev, screenInfo.screens[0]->root); + /* mode doesn't matter */ + EnterWindow(dev, screenInfo.screens[0]->root, NotifyAncestor); + } + else if ((other = NextFreePointerDevice()) == NULL) + { + ErrorF("[dix] cannot find pointer to pair with. " + "This is a bug.\n"); + return FALSE; + } else + PairDevices(NULL, other, dev); + } else + { + if (dev->coreEvents) + other = (IsPointerDevice(dev)) ? inputInfo.pointer : + inputInfo.keyboard; + else + other = NULL; /* auto-float non-core devices */ + AttachDevice(NULL, dev, other); + } + } + + if ((*prev != dev) || !dev->inited || + ((ret = (*dev->deviceProc)(dev, DEVICE_ON)) != Success)) { + ErrorF("[dix] couldn't enable device %d\n", dev->id); + return FALSE; + } + dev->enabled = TRUE; + *prev = dev->next; + + for (prev = &inputInfo.devices; *prev; prev = &(*prev)->next) + ; + *prev = dev; + dev->next = NULL; + + enabled = TRUE; + XIChangeDeviceProperty(dev, XIGetKnownProperty(XI_PROP_ENABLED), + XA_INTEGER, 8, PropModeReplace, 1, &enabled, + TRUE); + + SendDevicePresenceEvent(dev->id, DeviceEnabled); + if (sendevent) + { + flags[dev->id] |= XIDeviceEnabled; + XISendDeviceHierarchyEvent(flags); + } + + RecalculateMasterButtons(dev); + + return TRUE; +} + +/** + * Switch a device off through the driver and push it onto the off_devices + * list. A device will not send events while disabled. All clients are + * notified about the device being disabled. + * + * Master keyboard devices have to be disabled before master pointer devices + * otherwise things turn bad. + * + * @param sendevent True if an XI2 event should be sent. + * @return TRUE on success or FALSE otherwise. + */ +Bool +DisableDevice(DeviceIntPtr dev, BOOL sendevent) +{ + DeviceIntPtr *prev, other; + BOOL enabled; + int flags[MAXDEVICES] = {0}; + + for (prev = &inputInfo.devices; + *prev && (*prev != dev); + prev = &(*prev)->next) + ; + if (*prev != dev) + return FALSE; + + /* float attached devices */ + if (IsMaster(dev)) + { + for (other = inputInfo.devices; other; other = other->next) + { + if (other->u.master == dev) + { + AttachDevice(NULL, other, NULL); + flags[other->id] |= XISlaveDetached; + } + } + } + else + { + for (other = inputInfo.devices; other; other = other->next) + { + if (IsMaster(other) && other->u.lastSlave == dev) + other->u.lastSlave = NULL; + } + } + + if (IsMaster(dev) && dev->spriteInfo->sprite) + { + for (other = inputInfo.devices; other; other = other->next) + { + if (other->spriteInfo->paired == dev) + { + ErrorF("[dix] cannot disable device, still paired. " + "This is a bug. \n"); + return FALSE; + } + } + } + + (void)(*dev->deviceProc)(dev, DEVICE_OFF); + dev->enabled = FALSE; + + /* now that the device is disabled, we can reset the signal handler's + * last.slave */ + OsBlockSignals(); + for (other = inputInfo.devices; other; other = other->next) + { + if (other->last.slave == dev) + other->last.slave = NULL; + } + OsReleaseSignals(); + + LeaveWindow(dev); + SetFocusOut(dev); + + *prev = dev->next; + dev->next = inputInfo.off_devices; + inputInfo.off_devices = dev; + + enabled = FALSE; + XIChangeDeviceProperty(dev, XIGetKnownProperty(XI_PROP_ENABLED), + XA_INTEGER, 8, PropModeReplace, 1, &enabled, + TRUE); + + SendDevicePresenceEvent(dev->id, DeviceDisabled); + if (sendevent) + { + flags[dev->id] = XIDeviceDisabled; + XISendDeviceHierarchyEvent(flags); + } + + RecalculateMasterButtons(dev); + + return TRUE; +} + +/** + * Initialise a new device through the driver and tell all clients about the + * new device. + * + * Must be called before EnableDevice. + * The device will NOT send events until it is enabled! + * + * @param sendevent True if an XI2 event should be sent. + * @return Success or an error code on failure. + */ +int +ActivateDevice(DeviceIntPtr dev, BOOL sendevent) +{ + int ret = Success; + ScreenPtr pScreen = screenInfo.screens[0]; + + if (!dev || !dev->deviceProc) + return BadImplementation; + + ret = (*dev->deviceProc) (dev, DEVICE_INIT); + dev->inited = (ret == Success); + if (!dev->inited) + return ret; + + /* Initialize memory for sprites. */ + if (IsMaster(dev) && dev->spriteInfo->spriteOwner) + if (!pScreen->DeviceCursorInitialize(dev, pScreen)) + ret = BadAlloc; + + SendDevicePresenceEvent(dev->id, DeviceAdded); + if (sendevent) + { + int flags[MAXDEVICES] = {0}; + flags[dev->id] = XISlaveAdded; + XISendDeviceHierarchyEvent(flags); + } + return ret; +} + +/** + * Ring the bell. + * The actual task of ringing the bell is the job of the DDX. + */ +static void +CoreKeyboardBell(int volume, DeviceIntPtr pDev, pointer arg, int something) +{ + KeybdCtrl *ctrl = arg; + + DDXRingBell(volume, ctrl->bell_pitch, ctrl->bell_duration); +} + +static void +CoreKeyboardCtl(DeviceIntPtr pDev, KeybdCtrl *ctrl) +{ + return; +} + +/** + * Device control function for the Virtual Core Keyboard. + */ +int +CoreKeyboardProc(DeviceIntPtr pDev, int what) +{ + + switch (what) { + case DEVICE_INIT: + if (!InitKeyboardDeviceStruct(pDev, NULL, CoreKeyboardBell, + CoreKeyboardCtl)) + { + ErrorF("Keyboard initialization failed. This could be a missing " + "or incorrect setup of xkeyboard-config.\n"); + return BadValue; + } + return Success; + + case DEVICE_ON: + case DEVICE_OFF: + return Success; + + case DEVICE_CLOSE: + return Success; + } + + return BadMatch; +} + +/** + * Device control function for the Virtual Core Pointer. + */ +int +CorePointerProc(DeviceIntPtr pDev, int what) +{ +#define NBUTTONS 10 +#define NAXES 2 + BYTE map[NBUTTONS + 1]; + int i = 0; + Atom btn_labels[NBUTTONS] = {0}; + Atom axes_labels[NAXES] = {0}; + + switch (what) { + case DEVICE_INIT: + for (i = 1; i <= NBUTTONS; i++) + map[i] = i; + + btn_labels[0] = XIGetKnownProperty(BTN_LABEL_PROP_BTN_LEFT); + btn_labels[1] = XIGetKnownProperty(BTN_LABEL_PROP_BTN_MIDDLE); + btn_labels[2] = XIGetKnownProperty(BTN_LABEL_PROP_BTN_RIGHT); + btn_labels[3] = XIGetKnownProperty(BTN_LABEL_PROP_BTN_WHEEL_UP); + btn_labels[4] = XIGetKnownProperty(BTN_LABEL_PROP_BTN_WHEEL_DOWN); + btn_labels[5] = XIGetKnownProperty(BTN_LABEL_PROP_BTN_HWHEEL_LEFT); + btn_labels[6] = XIGetKnownProperty(BTN_LABEL_PROP_BTN_HWHEEL_RIGHT); + /* don't know about the rest */ + + axes_labels[0] = XIGetKnownProperty(AXIS_LABEL_PROP_REL_X); + axes_labels[1] = XIGetKnownProperty(AXIS_LABEL_PROP_REL_Y); + + if (!InitPointerDeviceStruct((DevicePtr)pDev, map, NBUTTONS, btn_labels, + (PtrCtrlProcPtr)NoopDDA, + GetMotionHistorySize(), NAXES, axes_labels)) + { + ErrorF("Could not initialize device '%s'. Out of memory.\n", + pDev->name); + return BadAlloc; /* IPDS only fails on allocs */ + } + pDev->valuator->axisVal[0] = screenInfo.screens[0]->width / 2; + pDev->last.valuators[0] = pDev->valuator->axisVal[0]; + pDev->valuator->axisVal[1] = screenInfo.screens[0]->height / 2; + pDev->last.valuators[1] = pDev->valuator->axisVal[1]; + break; + + case DEVICE_CLOSE: + break; + + default: + break; + } + + return Success; + +#undef NBUTTONS +#undef NAXES +} + +/** + * Initialise the two core devices, VCP and VCK (see events.c). + * Both devices are not tied to physical devices, but guarantee that there is + * always a keyboard and a pointer present and keep the protocol semantics. + * + * Note that the server MUST have two core devices at all times, even if there + * is no physical device connected. + */ +void +InitCoreDevices(void) +{ + if (AllocDevicePair(serverClient, "Virtual core", + &inputInfo.pointer, &inputInfo.keyboard, + CorePointerProc, CoreKeyboardProc, + TRUE) != Success) + FatalError("Failed to allocate core devices"); + + if (ActivateDevice(inputInfo.pointer, TRUE) != Success || + ActivateDevice(inputInfo.keyboard, TRUE) != Success) + FatalError("Failed to activate core devices."); + if (!EnableDevice(inputInfo.pointer, TRUE) || + !EnableDevice(inputInfo.keyboard, TRUE)) + FatalError("Failed to enable core devices."); + + InitXTestDevices(); +} + +/** + * Activate all switched-off devices and then enable all those devices. + * + * Will return an error if no core keyboard or core pointer is present. + * In theory this should never happen if you call InitCoreDevices() first. + * + * InitAndStartDevices needs to be called AFTER the windows are initialized. + * Devices will start sending events after InitAndStartDevices() has + * completed. + * + * @return Success or error code on failure. + */ +int +InitAndStartDevices(void) +{ + DeviceIntPtr dev, next; + + for (dev = inputInfo.off_devices; dev; dev = dev->next) { + DebugF("(dix) initialising device %d\n", dev->id); + if (!dev->inited) + ActivateDevice(dev, TRUE); + } + + /* enable real devices */ + for (dev = inputInfo.off_devices; dev; dev = next) + { + DebugF("(dix) enabling device %d\n", dev->id); + next = dev->next; + if (dev->inited && dev->startup) + EnableDevice(dev, TRUE); + } + + return Success; +} + +/** + * Free the given device class and reset the pointer to NULL. + */ +static void +FreeDeviceClass(int type, pointer *class) +{ + if (!(*class)) + return; + + switch(type) + { + case KeyClass: + { + KeyClassPtr* k = (KeyClassPtr*)class; + if ((*k)->xkbInfo) + { + XkbFreeInfo((*k)->xkbInfo); + (*k)->xkbInfo = NULL; + } + free((*k)); + break; + } + case ButtonClass: + { + ButtonClassPtr *b = (ButtonClassPtr*)class; + free((*b)->xkb_acts); + free((*b)); + break; + } + case ValuatorClass: + { + ValuatorClassPtr *v = (ValuatorClassPtr*)class; + + free((*v)->motion); + free((*v)); + break; + } + case FocusClass: + { + FocusClassPtr *f = (FocusClassPtr*)class; + free((*f)->trace); + free((*f)); + break; + } + case ProximityClass: + { + ProximityClassPtr *p = (ProximityClassPtr*)class; + free((*p)); + break; + } + } + *class = NULL; +} + +static void +FreeFeedbackClass(int type, pointer *class) +{ + if (!(*class)) + return; + + switch(type) + { + case KbdFeedbackClass: + { + KbdFeedbackPtr *kbdfeed = (KbdFeedbackPtr*)class; + KbdFeedbackPtr k, knext; + for (k = (*kbdfeed); k; k = knext) { + knext = k->next; + if (k->xkb_sli) + XkbFreeSrvLedInfo(k->xkb_sli); + free(k); + } + break; + } + case PtrFeedbackClass: + { + PtrFeedbackPtr *ptrfeed = (PtrFeedbackPtr*)class; + PtrFeedbackPtr p, pnext; + + for (p = (*ptrfeed); p; p = pnext) { + pnext = p->next; + free(p); + } + break; + } + case IntegerFeedbackClass: + { + IntegerFeedbackPtr *intfeed = (IntegerFeedbackPtr*)class; + IntegerFeedbackPtr i, inext; + + for (i = (*intfeed); i; i = inext) { + inext = i->next; + free(i); + } + break; + } + case StringFeedbackClass: + { + StringFeedbackPtr *stringfeed = (StringFeedbackPtr*)class; + StringFeedbackPtr s, snext; + + for (s = (*stringfeed); s; s = snext) { + snext = s->next; + free(s->ctrl.symbols_supported); + free(s->ctrl.symbols_displayed); + free(s); + } + break; + } + case BellFeedbackClass: + { + BellFeedbackPtr *bell = (BellFeedbackPtr*)class; + BellFeedbackPtr b, bnext; + + for (b = (*bell); b; b = bnext) { + bnext = b->next; + free(b); + } + break; + } + case LedFeedbackClass: + { + LedFeedbackPtr *leds = (LedFeedbackPtr*)class; + LedFeedbackPtr l, lnext; + + for (l = (*leds); l; l = lnext) { + lnext = l->next; + if (l->xkb_sli) + XkbFreeSrvLedInfo(l->xkb_sli); + free(l); + } + break; + } + } + *class = NULL; +} + +static void +FreeAllDeviceClasses(ClassesPtr classes) +{ + if (!classes) + return; + + FreeDeviceClass(KeyClass, (pointer)&classes->key); + FreeDeviceClass(ValuatorClass, (pointer)&classes->valuator); + FreeDeviceClass(ButtonClass, (pointer)&classes->button); + FreeDeviceClass(FocusClass, (pointer)&classes->focus); + FreeDeviceClass(ProximityClass, (pointer)&classes->proximity); + + FreeFeedbackClass(KbdFeedbackClass, (pointer)&classes->kbdfeed); + FreeFeedbackClass(PtrFeedbackClass, (pointer)&classes->ptrfeed); + FreeFeedbackClass(IntegerFeedbackClass, (pointer)&classes->intfeed); + FreeFeedbackClass(StringFeedbackClass, (pointer)&classes->stringfeed); + FreeFeedbackClass(BellFeedbackClass, (pointer)&classes->bell); + FreeFeedbackClass(LedFeedbackClass, (pointer)&classes->leds); + +} + +/** + * Close down a device and free all resources. + * Once closed down, the driver will probably not expect you that you'll ever + * enable it again and free associated structs. If you want the device to just + * be disabled, DisableDevice(). + * Don't call this function directly, use RemoveDevice() instead. + */ +static void +CloseDevice(DeviceIntPtr dev) +{ + ScreenPtr screen = screenInfo.screens[0]; + ClassesPtr classes; + int j; + + if (!dev) + return; + + XIDeleteAllDeviceProperties(dev); + + if (dev->inited) + (void)(*dev->deviceProc)(dev, DEVICE_CLOSE); + + /* free sprite memory */ + if (IsMaster(dev) && dev->spriteInfo->sprite) + screen->DeviceCursorCleanup(dev, screen); + + /* free acceleration info */ + if(dev->valuator && dev->valuator->accelScheme.AccelCleanupProc) + dev->valuator->accelScheme.AccelCleanupProc(dev); + + while (dev->xkb_interest) + XkbRemoveResourceClient((DevicePtr)dev,dev->xkb_interest->resource); + + free(dev->name); + + classes = (ClassesPtr)&dev->key; + FreeAllDeviceClasses(classes); + + if (IsMaster(dev)) + { + classes = dev->unused_classes; + FreeAllDeviceClasses(classes); + free(classes); + } + + if (DevHasCursor(dev) && dev->spriteInfo->sprite) { + if (dev->spriteInfo->sprite->current) + FreeCursor(dev->spriteInfo->sprite->current, None); + free(dev->spriteInfo->sprite->spriteTrace); + free(dev->spriteInfo->sprite); + } + + /* a client may have the device set as client pointer */ + for (j = 0; j < currentMaxClients; j++) + { + if (clients[j] && clients[j]->clientPtr == dev) + { + clients[j]->clientPtr = NULL; + clients[j]->clientPtr = PickPointer(clients[j]); + } + } + + free(dev->deviceGrab.sync.event); + dixFreeObjectWithPrivates(dev, PRIVATE_DEVICE); +} + +/** + * Shut down all devices of one list and free all resources. + */ +static +void +CloseDeviceList(DeviceIntPtr *listHead) +{ + /* Used to mark devices that we tried to free */ + Bool freedIds[MAXDEVICES]; + DeviceIntPtr dev; + int i; + + if (listHead == NULL) + return; + + for (i = 0; i < MAXDEVICES; i++) + freedIds[i] = FALSE; + + dev = *listHead; + while (dev != NULL) + { + freedIds[dev->id] = TRUE; + DeleteInputDeviceRequest(dev); + + dev = *listHead; + while (dev != NULL && freedIds[dev->id]) + dev = dev->next; + } +} + +/** + * Shut down all devices, free all resources, etc. + * Only useful if you're shutting down the server! + */ +void +CloseDownDevices(void) +{ + DeviceIntPtr dev; + + /* Float all SDs before closing them. Note that at this point resources + * (e.g. cursors) have been freed already, so we can't just call + * AttachDevice(NULL, dev, NULL). Instead, we have to forcibly set master + * to NULL and pretend nothing happened. + */ + for (dev = inputInfo.devices; dev; dev = dev->next) + { + if (!IsMaster(dev) && dev->u.master) + dev->u.master = NULL; + } + + CloseDeviceList(&inputInfo.devices); + CloseDeviceList(&inputInfo.off_devices); + + CloseDevice(inputInfo.pointer); + CloseDevice(inputInfo.keyboard); + + inputInfo.devices = NULL; + inputInfo.off_devices = NULL; + inputInfo.keyboard = NULL; + inputInfo.pointer = NULL; + XkbDeleteRulesDflts(); +} + +/** + * Remove the cursor sprite for all devices. This needs to be done before any + * resources are freed or any device is deleted. + */ +void +UndisplayDevices(void) +{ + DeviceIntPtr dev; + ScreenPtr screen = screenInfo.screens[0]; + + for (dev = inputInfo.devices; dev; dev = dev->next) + screen->DisplayCursor(dev, screen, NullCursor); +} + +/** + * Remove a device from the device list, closes it and thus frees all + * resources. + * Removes both enabled and disabled devices and notifies all devices about + * the removal of the device. + * + * No PresenceNotify is sent for device that the client never saw. This can + * happen if a malloc fails during the addition of master devices. If + * dev->init is FALSE it means the client never received a DeviceAdded event, + * so let's not send a DeviceRemoved event either. + * + * @param sendevent True if an XI2 event should be sent. + */ +int +RemoveDevice(DeviceIntPtr dev, BOOL sendevent) +{ + DeviceIntPtr prev,tmp,next; + int ret = BadMatch; + ScreenPtr screen = screenInfo.screens[0]; + int deviceid; + int initialized; + int flags[MAXDEVICES] = {0}; + + DebugF("(dix) removing device %d\n", dev->id); + + if (!dev || dev == inputInfo.keyboard || dev == inputInfo.pointer) + return BadImplementation; + + initialized = dev->inited; + deviceid = dev->id; + + if (initialized) + { + if (DevHasCursor(dev)) + screen->DisplayCursor(dev, screen, NullCursor); + + DisableDevice(dev, sendevent); + flags[dev->id] = XIDeviceDisabled; + } + + prev = NULL; + for (tmp = inputInfo.devices; tmp; (prev = tmp), (tmp = next)) { + next = tmp->next; + if (tmp == dev) { + + if (prev==NULL) + inputInfo.devices = next; + else + prev->next = next; + + flags[tmp->id] = IsMaster(tmp) ? XIMasterRemoved : XISlaveRemoved; + CloseDevice(tmp); + ret = Success; + } + } + + prev = NULL; + for (tmp = inputInfo.off_devices; tmp; (prev = tmp), (tmp = next)) { + next = tmp->next; + if (tmp == dev) { + flags[tmp->id] = IsMaster(tmp) ? XIMasterRemoved : XISlaveRemoved; + CloseDevice(tmp); + + if (prev == NULL) + inputInfo.off_devices = next; + else + prev->next = next; + + ret = Success; + } + } + + if (ret == Success && initialized) { + inputInfo.numDevices--; + SendDevicePresenceEvent(deviceid, DeviceRemoved); + if (sendevent) + XISendDeviceHierarchyEvent(flags); + } + + return ret; +} + +int +NumMotionEvents(void) +{ + /* only called to fill data in initial connection reply. + * VCP is ok here, it is the only fixed device we have. */ + return inputInfo.pointer->valuator->numMotionEvents; +} + +int +dixLookupDevice(DeviceIntPtr *pDev, int id, ClientPtr client, Mask access_mode) +{ + DeviceIntPtr dev; + int rc; + *pDev = NULL; + + for (dev=inputInfo.devices; dev; dev=dev->next) { + if (dev->id == id) + goto found; + } + for (dev=inputInfo.off_devices; dev; dev=dev->next) { + if (dev->id == id) + goto found; + } + return BadDevice; + +found: + rc = XaceHook(XACE_DEVICE_ACCESS, client, dev, access_mode); + if (rc == Success) + *pDev = dev; + return rc; +} + +void +QueryMinMaxKeyCodes(KeyCode *minCode, KeyCode *maxCode) +{ + if (inputInfo.keyboard) { + *minCode = inputInfo.keyboard->key->xkbInfo->desc->min_key_code; + *maxCode = inputInfo.keyboard->key->xkbInfo->desc->max_key_code; + } +} + +/* Notably, this function does not expand the destination's keycode range, or + * notify clients. */ +Bool +SetKeySymsMap(KeySymsPtr dst, KeySymsPtr src) +{ + int i, j; + KeySym *tmp; + int rowDif = src->minKeyCode - dst->minKeyCode; + + /* if keysym map size changes, grow map first */ + if (src->mapWidth < dst->mapWidth) { + for (i = src->minKeyCode; i <= src->maxKeyCode; i++) { +#define SI(r, c) (((r - src->minKeyCode) * src->mapWidth) + (c)) +#define DI(r, c) (((r - dst->minKeyCode) * dst->mapWidth) + (c)) + for (j = 0; j < src->mapWidth; j++) + dst->map[DI(i, j)] = src->map[SI(i, j)]; + for (j = src->mapWidth; j < dst->mapWidth; j++) + dst->map[DI(i, j)] = NoSymbol; +#undef SI +#undef DI + } + return TRUE; + } + else if (src->mapWidth > dst->mapWidth) { + i = sizeof(KeySym) * src->mapWidth * + (dst->maxKeyCode - dst->minKeyCode + 1); + tmp = calloc(sizeof(KeySym), i); + if (!tmp) + return FALSE; + + if (dst->map) { + for (i = 0; i <= dst->maxKeyCode-dst->minKeyCode; i++) + memmove(&tmp[i * src->mapWidth], &dst->map[i * dst->mapWidth], + dst->mapWidth * sizeof(KeySym)); + free(dst->map); + } + dst->mapWidth = src->mapWidth; + dst->map = tmp; + } + else if (!dst->map) { + i = sizeof(KeySym) * src->mapWidth * + (dst->maxKeyCode - dst->minKeyCode + 1); + tmp = calloc(sizeof(KeySym), i); + if (!tmp) + return FALSE; + + dst->map = tmp; + dst->mapWidth = src->mapWidth; + } + + memmove(&dst->map[rowDif * dst->mapWidth], src->map, + (src->maxKeyCode - src->minKeyCode + 1) * + dst->mapWidth * sizeof(KeySym)); + + return TRUE; +} + +Bool +InitButtonClassDeviceStruct(DeviceIntPtr dev, int numButtons, Atom* labels, + CARD8 *map) +{ + ButtonClassPtr butc; + int i; + + butc = calloc(1, sizeof(ButtonClassRec)); + if (!butc) + return FALSE; + butc->numButtons = numButtons; + butc->sourceid = dev->id; + for (i = 1; i <= numButtons; i++) + butc->map[i] = map[i]; + for (i = numButtons + 1; i < MAP_LENGTH; i++) + butc->map[i] = i; + memcpy(butc->labels, labels, numButtons * sizeof(Atom)); + dev->button = butc; + return TRUE; +} + +Bool +InitValuatorClassDeviceStruct(DeviceIntPtr dev, int numAxes, Atom *labels, + int numMotionEvents, int mode) +{ + int i; + ValuatorClassPtr valc; + union align_u { ValuatorClassRec valc; double d; } *align; + + if (!dev) + return FALSE; + + if (numAxes > MAX_VALUATORS) + { + LogMessage(X_WARNING, + "Device '%s' has %d axes, only using first %d.\n", + dev->name, numAxes, MAX_VALUATORS); + numAxes = MAX_VALUATORS; + } + + align = (union align_u *) calloc(1, sizeof(union align_u) + + numAxes * sizeof(double) + + numAxes * sizeof(AxisInfo)); + if (!align) + return FALSE; + + valc = &align->valc; + valc->sourceid = dev->id; + valc->motion = NULL; + valc->first_motion = 0; + valc->last_motion = 0; + + valc->numMotionEvents = numMotionEvents; + valc->motionHintWindow = NullWindow; + valc->numAxes = numAxes; + valc->axisVal = (double *)(align + 1); + valc->axes = (AxisInfoPtr)(valc->axisVal + numAxes); + + if (mode & OutOfProximity) + InitProximityClassDeviceStruct(dev); + + dev->valuator = valc; + + AllocateMotionHistory(dev); + + for (i=0; i<numAxes; i++) { + InitValuatorAxisStruct(dev, i, labels[i], NO_AXIS_LIMITS, NO_AXIS_LIMITS, + 0, 0, 0, mode); + valc->axisVal[i]=0; + } + + dev->last.numValuators = numAxes; + + if (IsMaster(dev) || /* do not accelerate master or xtest devices */ + IsXTestDevice(dev, NULL)) + InitPointerAccelerationScheme(dev, PtrAccelNoOp); + else + InitPointerAccelerationScheme(dev, PtrAccelDefault); + return TRUE; +} + +/* global list of acceleration schemes */ +ValuatorAccelerationRec pointerAccelerationScheme[] = { + {PtrAccelNoOp, NULL, NULL, NULL}, + {PtrAccelPredictable, acceleratePointerPredictable, NULL, AccelerationDefaultCleanup}, + {PtrAccelLightweight, acceleratePointerLightweight, NULL, NULL}, + {-1, NULL, NULL, NULL} /* terminator */ +}; + +/** + * install an acceleration scheme. returns TRUE on success, and should not + * change anything if unsuccessful. + */ +Bool +InitPointerAccelerationScheme(DeviceIntPtr dev, + int scheme) +{ + int x, i = -1; + void* data = NULL; + ValuatorClassPtr val; + + val = dev->valuator; + + if(!val) + return FALSE; + + if(IsMaster(dev) && scheme != PtrAccelNoOp) + return FALSE; + + for(x = 0; pointerAccelerationScheme[x].number >= 0; x++) { + if(pointerAccelerationScheme[x].number == scheme){ + i = x; + break; + } + } + + if(-1 == i) + return FALSE; + + if (val->accelScheme.AccelCleanupProc) + val->accelScheme.AccelCleanupProc(dev); + + /* init scheme-specific data */ + switch(scheme){ + case PtrAccelPredictable: + { + DeviceVelocityPtr s; + s = malloc(sizeof(DeviceVelocityRec)); + if(!s) + return FALSE; + InitVelocityData(s); + data = s; + break; + } + default: + break; + } + + val->accelScheme = pointerAccelerationScheme[i]; + val->accelScheme.accelData = data; + + /* post-init scheme */ + switch(scheme){ + case PtrAccelPredictable: + InitializePredictableAccelerationProperties(dev); + break; + + default: + break; + } + + return TRUE; +} + +Bool +InitAbsoluteClassDeviceStruct(DeviceIntPtr dev) +{ + AbsoluteClassPtr abs; + + abs = malloc(sizeof(AbsoluteClassRec)); + if (!abs) + return FALSE; + + /* we don't do anything sensible with these, but should */ + abs->min_x = NO_AXIS_LIMITS; + abs->min_y = NO_AXIS_LIMITS; + abs->max_x = NO_AXIS_LIMITS; + abs->max_y = NO_AXIS_LIMITS; + abs->flip_x = 0; + abs->flip_y = 0; + abs->rotation = 0; + abs->button_threshold = 0; + + abs->offset_x = 0; + abs->offset_y = 0; + abs->width = NO_AXIS_LIMITS; + abs->height = NO_AXIS_LIMITS; + abs->following = 0; + abs->screen = 0; + + abs->sourceid = dev->id; + + dev->absolute = abs; + + return TRUE; +} + +Bool +InitFocusClassDeviceStruct(DeviceIntPtr dev) +{ + FocusClassPtr focc; + + focc = malloc(sizeof(FocusClassRec)); + if (!focc) + return FALSE; + focc->win = PointerRootWin; + focc->revert = None; + focc->time = currentTime; + focc->trace = (WindowPtr *)NULL; + focc->traceSize = 0; + focc->traceGood = 0; + focc->sourceid = dev->id; + dev->focus = focc; + return TRUE; +} + +Bool +InitPtrFeedbackClassDeviceStruct(DeviceIntPtr dev, PtrCtrlProcPtr controlProc) +{ + PtrFeedbackPtr feedc; + + feedc = malloc(sizeof(PtrFeedbackClassRec)); + if (!feedc) + return FALSE; + feedc->CtrlProc = controlProc; + feedc->ctrl = defaultPointerControl; + feedc->ctrl.id = 0; + if ( (feedc->next = dev->ptrfeed) ) + feedc->ctrl.id = dev->ptrfeed->ctrl.id + 1; + dev->ptrfeed = feedc; + (*controlProc)(dev, &feedc->ctrl); + return TRUE; +} + + +static LedCtrl defaultLedControl = { + DEFAULT_LEDS, DEFAULT_LEDS_MASK, 0}; + +static BellCtrl defaultBellControl = { + DEFAULT_BELL, + DEFAULT_BELL_PITCH, + DEFAULT_BELL_DURATION, + 0}; + +static IntegerCtrl defaultIntegerControl = { + DEFAULT_INT_RESOLUTION, + DEFAULT_INT_MIN_VALUE, + DEFAULT_INT_MAX_VALUE, + DEFAULT_INT_DISPLAYED, + 0}; + +Bool +InitStringFeedbackClassDeviceStruct ( + DeviceIntPtr dev, StringCtrlProcPtr controlProc, + int max_symbols, int num_symbols_supported, KeySym *symbols) +{ + int i; + StringFeedbackPtr feedc; + + feedc = malloc(sizeof(StringFeedbackClassRec)); + if (!feedc) + return FALSE; + feedc->CtrlProc = controlProc; + feedc->ctrl.num_symbols_supported = num_symbols_supported; + feedc->ctrl.num_symbols_displayed = 0; + feedc->ctrl.max_symbols = max_symbols; + feedc->ctrl.symbols_supported = malloc(sizeof (KeySym) * num_symbols_supported); + feedc->ctrl.symbols_displayed = malloc(sizeof (KeySym) * max_symbols); + if (!feedc->ctrl.symbols_supported || !feedc->ctrl.symbols_displayed) + { + free(feedc->ctrl.symbols_supported); + free(feedc->ctrl.symbols_displayed); + free(feedc); + return FALSE; + } + for (i=0; i<num_symbols_supported; i++) + *(feedc->ctrl.symbols_supported+i) = *symbols++; + for (i=0; i<max_symbols; i++) + *(feedc->ctrl.symbols_displayed+i) = (KeySym) 0; + feedc->ctrl.id = 0; + if ( (feedc->next = dev->stringfeed) ) + feedc->ctrl.id = dev->stringfeed->ctrl.id + 1; + dev->stringfeed = feedc; + (*controlProc)(dev, &feedc->ctrl); + return TRUE; +} + +Bool +InitBellFeedbackClassDeviceStruct (DeviceIntPtr dev, BellProcPtr bellProc, + BellCtrlProcPtr controlProc) +{ + BellFeedbackPtr feedc; + + feedc = malloc(sizeof(BellFeedbackClassRec)); + if (!feedc) + return FALSE; + feedc->CtrlProc = controlProc; + feedc->BellProc = bellProc; + feedc->ctrl = defaultBellControl; + feedc->ctrl.id = 0; + if ( (feedc->next = dev->bell) ) + feedc->ctrl.id = dev->bell->ctrl.id + 1; + dev->bell = feedc; + (*controlProc)(dev, &feedc->ctrl); + return TRUE; +} + +Bool +InitLedFeedbackClassDeviceStruct (DeviceIntPtr dev, LedCtrlProcPtr controlProc) +{ + LedFeedbackPtr feedc; + + feedc = malloc(sizeof(LedFeedbackClassRec)); + if (!feedc) + return FALSE; + feedc->CtrlProc = controlProc; + feedc->ctrl = defaultLedControl; + feedc->ctrl.id = 0; + if ( (feedc->next = dev->leds) ) + feedc->ctrl.id = dev->leds->ctrl.id + 1; + feedc->xkb_sli= NULL; + dev->leds = feedc; + (*controlProc)(dev, &feedc->ctrl); + return TRUE; +} + +Bool +InitIntegerFeedbackClassDeviceStruct (DeviceIntPtr dev, IntegerCtrlProcPtr controlProc) +{ + IntegerFeedbackPtr feedc; + + feedc = malloc(sizeof(IntegerFeedbackClassRec)); + if (!feedc) + return FALSE; + feedc->CtrlProc = controlProc; + feedc->ctrl = defaultIntegerControl; + feedc->ctrl.id = 0; + if ( (feedc->next = dev->intfeed) ) + feedc->ctrl.id = dev->intfeed->ctrl.id + 1; + dev->intfeed = feedc; + (*controlProc)(dev, &feedc->ctrl); + return TRUE; +} + +Bool +InitPointerDeviceStruct(DevicePtr device, CARD8 *map, int numButtons, Atom* btn_labels, + PtrCtrlProcPtr controlProc, int numMotionEvents, + int numAxes, Atom *axes_labels) +{ + DeviceIntPtr dev = (DeviceIntPtr)device; + + return(InitButtonClassDeviceStruct(dev, numButtons, btn_labels, map) && + InitValuatorClassDeviceStruct(dev, numAxes, axes_labels, + numMotionEvents, Relative) && + InitPtrFeedbackClassDeviceStruct(dev, controlProc)); +} + +/* + * Check if the given buffer contains elements between low (inclusive) and + * high (inclusive) only. + * + * @return TRUE if the device map is invalid, FALSE otherwise. + */ +Bool +BadDeviceMap(BYTE *buff, int length, unsigned low, unsigned high, XID *errval) +{ + int i; + + for (i = 0; i < length; i++) + if (buff[i]) /* only check non-zero elements */ + { + if ((low > buff[i]) || (high < buff[i])) + { + *errval = buff[i]; + return TRUE; + } + } + return FALSE; +} + +int +ProcSetModifierMapping(ClientPtr client) +{ + xSetModifierMappingReply rep; + int rc; + REQUEST(xSetModifierMappingReq); + REQUEST_AT_LEAST_SIZE(xSetModifierMappingReq); + + if (client->req_len != ((stuff->numKeyPerModifier << 1) + + bytes_to_int32(sizeof(xSetModifierMappingReq)))) + return BadLength; + + rep.type = X_Reply; + rep.length = 0; + rep.sequenceNumber = client->sequence; + + rc = change_modmap(client, PickKeyboard(client), (KeyCode *)&stuff[1], + stuff->numKeyPerModifier); + if (rc == MappingFailed || rc == -1) + return BadValue; + if (rc != Success && rc != MappingSuccess && rc != MappingFailed && + rc != MappingBusy) + return rc; + + rep.success = rc; + + WriteReplyToClient(client, sizeof(xSetModifierMappingReply), &rep); + return Success; +} + +int +ProcGetModifierMapping(ClientPtr client) +{ + xGetModifierMappingReply rep; + int max_keys_per_mod = 0; + KeyCode *modkeymap = NULL; + REQUEST_SIZE_MATCH(xReq); + + generate_modkeymap(client, PickKeyboard(client), &modkeymap, + &max_keys_per_mod); + + memset(&rep, 0, sizeof(xGetModifierMappingReply)); + rep.type = X_Reply; + rep.numKeyPerModifier = max_keys_per_mod; + rep.sequenceNumber = client->sequence; + /* length counts 4 byte quantities - there are 8 modifiers 1 byte big */ + rep.length = max_keys_per_mod << 1; + + WriteReplyToClient(client, sizeof(xGetModifierMappingReply), &rep); + (void)WriteToClient(client, max_keys_per_mod * 8, (char *) modkeymap); + + free(modkeymap); + + return Success; +} + +int +ProcChangeKeyboardMapping(ClientPtr client) +{ + REQUEST(xChangeKeyboardMappingReq); + unsigned len; + KeySymsRec keysyms; + DeviceIntPtr pDev, tmp; + int rc; + REQUEST_AT_LEAST_SIZE(xChangeKeyboardMappingReq); + + len = client->req_len - bytes_to_int32(sizeof(xChangeKeyboardMappingReq)); + if (len != (stuff->keyCodes * stuff->keySymsPerKeyCode)) + return BadLength; + + pDev = PickKeyboard(client); + + if ((stuff->firstKeyCode < pDev->key->xkbInfo->desc->min_key_code) || + (stuff->firstKeyCode > pDev->key->xkbInfo->desc->max_key_code)) { + client->errorValue = stuff->firstKeyCode; + return BadValue; + + } + if (((unsigned)(stuff->firstKeyCode + stuff->keyCodes - 1) > + pDev->key->xkbInfo->desc->max_key_code) || + (stuff->keySymsPerKeyCode == 0)) { + client->errorValue = stuff->keySymsPerKeyCode; + return BadValue; + } + + keysyms.minKeyCode = stuff->firstKeyCode; + keysyms.maxKeyCode = stuff->firstKeyCode + stuff->keyCodes - 1; + keysyms.mapWidth = stuff->keySymsPerKeyCode; + keysyms.map = (KeySym *) &stuff[1]; + + rc = XaceHook(XACE_DEVICE_ACCESS, client, pDev, DixManageAccess); + if (rc != Success) + return rc; + + XkbApplyMappingChange(pDev, &keysyms, stuff->firstKeyCode, + stuff->keyCodes, NULL, client); + + for (tmp = inputInfo.devices; tmp; tmp = tmp->next) { + if (IsMaster(tmp) || tmp->u.master != pDev) + continue; + if (!tmp->key) + continue; + + rc = XaceHook(XACE_DEVICE_ACCESS, client, pDev, DixManageAccess); + if (rc != Success) + continue; + + XkbApplyMappingChange(tmp, &keysyms, stuff->firstKeyCode, + stuff->keyCodes, NULL, client); + } + + return Success; +} + +int +ProcSetPointerMapping(ClientPtr client) +{ + BYTE *map; + int ret; + int i, j; + DeviceIntPtr ptr = PickPointer(client); + xSetPointerMappingReply rep; + REQUEST(xSetPointerMappingReq); + REQUEST_AT_LEAST_SIZE(xSetPointerMappingReq); + + if (client->req_len != + bytes_to_int32(sizeof(xSetPointerMappingReq) + stuff->nElts)) + return BadLength; + rep.type = X_Reply; + rep.length = 0; + rep.sequenceNumber = client->sequence; + rep.success = MappingSuccess; + map = (BYTE *)&stuff[1]; + + /* So we're bounded here by the number of core buttons. This check + * probably wants disabling through XFixes. */ + /* MPX: With ClientPointer, we can return the right number of buttons. + * Let's just hope nobody changed ClientPointer between GetPointerMapping + * and SetPointerMapping + */ + if (stuff->nElts != ptr->button->numButtons) { + client->errorValue = stuff->nElts; + return BadValue; + } + + /* Core protocol specs don't allow for duplicate mappings; this check + * almost certainly wants disabling through XFixes too. */ + for (i = 0; i < stuff->nElts; i++) { + for (j = i + 1; j < stuff->nElts; j++) { + if (map[i] && map[i] == map[j]) { + client->errorValue = map[i]; + return BadValue; + } + } + } + + ret = ApplyPointerMapping(ptr, map, stuff->nElts, client); + if (ret == MappingBusy) + rep.success = ret; + else if (ret == -1) + return BadValue; + else if (ret != Success) + return ret; + + WriteReplyToClient(client, sizeof(xSetPointerMappingReply), &rep); + return Success; +} + +int +ProcGetKeyboardMapping(ClientPtr client) +{ + xGetKeyboardMappingReply rep; + DeviceIntPtr kbd = PickKeyboard(client); + XkbDescPtr xkb; + KeySymsPtr syms; + int rc; + REQUEST(xGetKeyboardMappingReq); + REQUEST_SIZE_MATCH(xGetKeyboardMappingReq); + + rc = XaceHook(XACE_DEVICE_ACCESS, client, kbd, DixGetAttrAccess); + if (rc != Success) + return rc; + + xkb = kbd->key->xkbInfo->desc; + + if ((stuff->firstKeyCode < xkb->min_key_code) || + (stuff->firstKeyCode > xkb->max_key_code)) { + client->errorValue = stuff->firstKeyCode; + return BadValue; + } + if (stuff->firstKeyCode + stuff->count > xkb->max_key_code + 1) { + client->errorValue = stuff->count; + return BadValue; + } + + syms = XkbGetCoreMap(kbd); + if (!syms) + return BadAlloc; + + memset(&rep, 0, sizeof(xGetKeyboardMappingReply)); + rep.type = X_Reply; + rep.sequenceNumber = client->sequence; + rep.keySymsPerKeyCode = syms->mapWidth; + /* length is a count of 4 byte quantities and KeySyms are 4 bytes */ + rep.length = syms->mapWidth * stuff->count; + WriteReplyToClient(client, sizeof(xGetKeyboardMappingReply), &rep); + client->pSwapReplyFunc = (ReplySwapPtr) CopySwap32Write; + WriteSwappedDataToClient(client, + syms->mapWidth * stuff->count * sizeof(KeySym), + &syms->map[syms->mapWidth * (stuff->firstKeyCode - + syms->minKeyCode)]); + free(syms->map); + free(syms); + + return Success; +} + +int +ProcGetPointerMapping(ClientPtr client) +{ + xGetPointerMappingReply rep; + /* Apps may get different values each time they call GetPointerMapping as + * the ClientPointer could change. */ + DeviceIntPtr ptr = PickPointer(client); + ButtonClassPtr butc = ptr->button; + int rc; + REQUEST_SIZE_MATCH(xReq); + + rc = XaceHook(XACE_DEVICE_ACCESS, client, ptr, DixGetAttrAccess); + if (rc != Success) + return rc; + + rep.type = X_Reply; + rep.sequenceNumber = client->sequence; + rep.nElts = (butc) ? butc->numButtons : 0; + rep.length = ((unsigned)rep.nElts + (4-1))/4; + WriteReplyToClient(client, sizeof(xGetPointerMappingReply), &rep); + if (butc) + WriteToClient(client, (int)rep.nElts, (char *)&butc->map[1]); + return Success; +} + +void +NoteLedState(DeviceIntPtr keybd, int led, Bool on) +{ + KeybdCtrl *ctrl = &keybd->kbdfeed->ctrl; + if (on) + ctrl->leds |= ((Leds)1 << (led - 1)); + else + ctrl->leds &= ~((Leds)1 << (led - 1)); +} + +int +Ones(unsigned long mask) /* HACKMEM 169 */ +{ + unsigned long y; + + y = (mask >> 1) &033333333333; + y = mask - y - ((y >>1) & 033333333333); + return (((y + (y >> 3)) & 030707070707) % 077); +} + +static int +DoChangeKeyboardControl (ClientPtr client, DeviceIntPtr keybd, XID *vlist, + BITS32 vmask) +{ +#define DO_ALL (-1) + KeybdCtrl ctrl; + int t; + int led = DO_ALL; + int key = DO_ALL; + BITS32 index2; + int mask = vmask, i; + XkbEventCauseRec cause; + + ctrl = keybd->kbdfeed->ctrl; + while (vmask) { + index2 = (BITS32) lowbit (vmask); + vmask &= ~index2; + switch (index2) { + case KBKeyClickPercent: + t = (INT8)*vlist; + vlist++; + if (t == -1) { + t = defaultKeyboardControl.click; + } + else if (t < 0 || t > 100) { + client->errorValue = t; + return BadValue; + } + ctrl.click = t; + break; + case KBBellPercent: + t = (INT8)*vlist; + vlist++; + if (t == -1) { + t = defaultKeyboardControl.bell; + } + else if (t < 0 || t > 100) { + client->errorValue = t; + return BadValue; + } + ctrl.bell = t; + break; + case KBBellPitch: + t = (INT16)*vlist; + vlist++; + if (t == -1) { + t = defaultKeyboardControl.bell_pitch; + } + else if (t < 0) { + client->errorValue = t; + return BadValue; + } + ctrl.bell_pitch = t; + break; + case KBBellDuration: + t = (INT16)*vlist; + vlist++; + if (t == -1) + t = defaultKeyboardControl.bell_duration; + else if (t < 0) { + client->errorValue = t; + return BadValue; + } + ctrl.bell_duration = t; + break; + case KBLed: + led = (CARD8)*vlist; + vlist++; + if (led < 1 || led > 32) { + client->errorValue = led; + return BadValue; + } + if (!(mask & KBLedMode)) + return BadMatch; + break; + case KBLedMode: + t = (CARD8)*vlist; + vlist++; + if (t == LedModeOff) { + if (led == DO_ALL) + ctrl.leds = 0x0; + else + ctrl.leds &= ~(((Leds)(1)) << (led - 1)); + } + else if (t == LedModeOn) { + if (led == DO_ALL) + ctrl.leds = ~0L; + else + ctrl.leds |= (((Leds)(1)) << (led - 1)); + } + else { + client->errorValue = t; + return BadValue; + } + + XkbSetCauseCoreReq(&cause,X_ChangeKeyboardControl,client); + XkbSetIndicators(keybd,((led == DO_ALL) ? ~0L : (1L<<(led-1))), + ctrl.leds, &cause); + ctrl.leds = keybd->kbdfeed->ctrl.leds; + + break; + case KBKey: + key = (KeyCode)*vlist; + vlist++; + if ((KeyCode)key < keybd->key->xkbInfo->desc->min_key_code || + (KeyCode)key > keybd->key->xkbInfo->desc->max_key_code) { + client->errorValue = key; + return BadValue; + } + if (!(mask & KBAutoRepeatMode)) + return BadMatch; + break; + case KBAutoRepeatMode: + i = (key >> 3); + mask = (1 << (key & 7)); + t = (CARD8)*vlist; + vlist++; + if (key != DO_ALL) + XkbDisableComputedAutoRepeats(keybd,key); + if (t == AutoRepeatModeOff) { + if (key == DO_ALL) + ctrl.autoRepeat = FALSE; + else + ctrl.autoRepeats[i] &= ~mask; + } + else if (t == AutoRepeatModeOn) { + if (key == DO_ALL) + ctrl.autoRepeat = TRUE; + else + ctrl.autoRepeats[i] |= mask; + } + else if (t == AutoRepeatModeDefault) { + if (key == DO_ALL) + ctrl.autoRepeat = defaultKeyboardControl.autoRepeat; + else + ctrl.autoRepeats[i] = + (ctrl.autoRepeats[i] & ~mask) | + (defaultKeyboardControl.autoRepeats[i] & mask); + } + else { + client->errorValue = t; + return BadValue; + } + break; + default: + client->errorValue = mask; + return BadValue; + } + } + keybd->kbdfeed->ctrl = ctrl; + + /* The XKB RepeatKeys control and core protocol global autorepeat */ + /* value are linked */ + XkbSetRepeatKeys(keybd, key, keybd->kbdfeed->ctrl.autoRepeat); + + return Success; + +#undef DO_ALL +} + +/** + * Changes kbd control on the ClientPointer and all attached SDs. + */ +int +ProcChangeKeyboardControl (ClientPtr client) +{ + XID *vlist; + BITS32 vmask; + int ret = Success, error = Success; + DeviceIntPtr pDev = NULL, keyboard; + REQUEST(xChangeKeyboardControlReq); + + REQUEST_AT_LEAST_SIZE(xChangeKeyboardControlReq); + + vmask = stuff->mask; + vlist = (XID *)&stuff[1]; + + if (client->req_len != (sizeof(xChangeKeyboardControlReq)>>2)+Ones(vmask)) + return BadLength; + + keyboard = PickKeyboard(client); + + for (pDev = inputInfo.devices; pDev; pDev = pDev->next) { + if ((pDev == keyboard || + (!IsMaster(pDev) && GetMaster(pDev, MASTER_KEYBOARD) == keyboard)) + && pDev->kbdfeed && pDev->kbdfeed->CtrlProc) { + ret = XaceHook(XACE_DEVICE_ACCESS, client, pDev, DixManageAccess); + if (ret != Success) + return ret; + } + } + + for (pDev = inputInfo.devices; pDev; pDev = pDev->next) { + if ((pDev == keyboard || + (!IsMaster(pDev) && GetMaster(pDev, MASTER_KEYBOARD) == keyboard)) + && pDev->kbdfeed && pDev->kbdfeed->CtrlProc) { + ret = DoChangeKeyboardControl(client, pDev, vlist, vmask); + if (ret != Success) + error = ret; + } + } + + return error; +} + +int +ProcGetKeyboardControl (ClientPtr client) +{ + int rc, i; + DeviceIntPtr kbd = PickKeyboard(client); + KeybdCtrl *ctrl = &kbd->kbdfeed->ctrl; + xGetKeyboardControlReply rep; + REQUEST_SIZE_MATCH(xReq); + + rc = XaceHook(XACE_DEVICE_ACCESS, client, kbd, DixGetAttrAccess); + if (rc != Success) + return rc; + + rep.type = X_Reply; + rep.length = 5; + rep.sequenceNumber = client->sequence; + rep.globalAutoRepeat = ctrl->autoRepeat; + rep.keyClickPercent = ctrl->click; + rep.bellPercent = ctrl->bell; + rep.bellPitch = ctrl->bell_pitch; + rep.bellDuration = ctrl->bell_duration; + rep.ledMask = ctrl->leds; + for (i = 0; i < 32; i++) + rep.map[i] = ctrl->autoRepeats[i]; + WriteReplyToClient(client, sizeof(xGetKeyboardControlReply), &rep); + return Success; +} + +int +ProcBell(ClientPtr client) +{ + DeviceIntPtr dev, keybd = PickKeyboard(client); + int base = keybd->kbdfeed->ctrl.bell; + int newpercent; + int rc; + REQUEST(xBellReq); + REQUEST_SIZE_MATCH(xBellReq); + + if (stuff->percent < -100 || stuff->percent > 100) { + client->errorValue = stuff->percent; + return BadValue; + } + + newpercent = (base * stuff->percent) / 100; + if (stuff->percent < 0) + newpercent = base + newpercent; + else + newpercent = base - newpercent + stuff->percent; + + for (dev = inputInfo.devices; dev; dev = dev->next) { + if ((dev == keybd || + (!IsMaster(dev) && GetMaster(dev, MASTER_KEYBOARD) == keybd)) && + dev->kbdfeed && dev->kbdfeed->BellProc) { + + rc = XaceHook(XACE_DEVICE_ACCESS, client, dev, DixBellAccess); + if (rc != Success) + return rc; + XkbHandleBell(FALSE, FALSE, dev, newpercent, + &dev->kbdfeed->ctrl, 0, None, NULL, client); + } + } + + return Success; +} + +int +ProcChangePointerControl(ClientPtr client) +{ + DeviceIntPtr dev, mouse = PickPointer(client); + PtrCtrl ctrl; /* might get BadValue part way through */ + int rc; + REQUEST(xChangePointerControlReq); + REQUEST_SIZE_MATCH(xChangePointerControlReq); + + ctrl = mouse->ptrfeed->ctrl; + if ((stuff->doAccel != xTrue) && (stuff->doAccel != xFalse)) { + client->errorValue = stuff->doAccel; + return BadValue; + } + if ((stuff->doThresh != xTrue) && (stuff->doThresh != xFalse)) { + client->errorValue = stuff->doThresh; + return BadValue; + } + if (stuff->doAccel) { + if (stuff->accelNum == -1) { + ctrl.num = defaultPointerControl.num; + } + else if (stuff->accelNum < 0) { + client->errorValue = stuff->accelNum; + return BadValue; + } + else { + ctrl.num = stuff->accelNum; + } + + if (stuff->accelDenum == -1) { + ctrl.den = defaultPointerControl.den; + } + else if (stuff->accelDenum <= 0) { + client->errorValue = stuff->accelDenum; + return BadValue; + } + else { + ctrl.den = stuff->accelDenum; + } + } + if (stuff->doThresh) { + if (stuff->threshold == -1) { + ctrl.threshold = defaultPointerControl.threshold; + } + else if (stuff->threshold < 0) { + client->errorValue = stuff->threshold; + return BadValue; + } + else { + ctrl.threshold = stuff->threshold; + } + } + + for (dev = inputInfo.devices; dev; dev = dev->next) { + if ((dev == mouse || + (!IsMaster(dev) && GetMaster(dev, MASTER_POINTER) == mouse)) && + dev->ptrfeed) { + rc = XaceHook(XACE_DEVICE_ACCESS, client, dev, DixManageAccess); + if (rc != Success) + return rc; + } + } + + for (dev = inputInfo.devices; dev; dev = dev->next) { + if ((dev == mouse || + (!IsMaster(dev) && GetMaster(dev, MASTER_POINTER) == mouse)) && + dev->ptrfeed) { + dev->ptrfeed->ctrl = ctrl; + } + } + + return Success; +} + +int +ProcGetPointerControl(ClientPtr client) +{ + DeviceIntPtr ptr = PickPointer(client); + PtrCtrl *ctrl = &ptr->ptrfeed->ctrl; + xGetPointerControlReply rep; + int rc; + REQUEST_SIZE_MATCH(xReq); + + rc = XaceHook(XACE_DEVICE_ACCESS, client, ptr, DixGetAttrAccess); + if (rc != Success) + return rc; + + rep.type = X_Reply; + rep.length = 0; + rep.sequenceNumber = client->sequence; + rep.threshold = ctrl->threshold; + rep.accelNumerator = ctrl->num; + rep.accelDenominator = ctrl->den; + WriteReplyToClient(client, sizeof(xGenericReply), &rep); + return Success; +} + +void +MaybeStopHint(DeviceIntPtr dev, ClientPtr client) +{ + GrabPtr grab = dev->deviceGrab.grab; + + if ((grab && SameClient(grab, client) && + ((grab->eventMask & PointerMotionHintMask) || + (grab->ownerEvents && + (EventMaskForClient(dev->valuator->motionHintWindow, client) & + PointerMotionHintMask)))) || + (!grab && + (EventMaskForClient(dev->valuator->motionHintWindow, client) & + PointerMotionHintMask))) + dev->valuator->motionHintWindow = NullWindow; +} + +int +ProcGetMotionEvents(ClientPtr client) +{ + WindowPtr pWin; + xTimecoord * coords = (xTimecoord *) NULL; + xGetMotionEventsReply rep; + int i, count, xmin, xmax, ymin, ymax, rc; + unsigned long nEvents; + DeviceIntPtr mouse = PickPointer(client); + TimeStamp start, stop; + REQUEST(xGetMotionEventsReq); + REQUEST_SIZE_MATCH(xGetMotionEventsReq); + + rc = dixLookupWindow(&pWin, stuff->window, client, DixGetAttrAccess); + if (rc != Success) + return rc; + rc = XaceHook(XACE_DEVICE_ACCESS, client, mouse, DixReadAccess); + if (rc != Success) + return rc; + + if (mouse->valuator->motionHintWindow) + MaybeStopHint(mouse, client); + rep.type = X_Reply; + rep.sequenceNumber = client->sequence; + nEvents = 0; + start = ClientTimeToServerTime(stuff->start); + stop = ClientTimeToServerTime(stuff->stop); + if ((CompareTimeStamps(start, stop) != LATER) && + (CompareTimeStamps(start, currentTime) != LATER) && + mouse->valuator->numMotionEvents) + { + if (CompareTimeStamps(stop, currentTime) == LATER) + stop = currentTime; + count = GetMotionHistory(mouse, &coords, start.milliseconds, + stop.milliseconds, pWin->drawable.pScreen, + TRUE); + xmin = pWin->drawable.x - wBorderWidth (pWin); + xmax = pWin->drawable.x + (int)pWin->drawable.width + + wBorderWidth (pWin); + ymin = pWin->drawable.y - wBorderWidth (pWin); + ymax = pWin->drawable.y + (int)pWin->drawable.height + + wBorderWidth (pWin); + for (i = 0; i < count; i++) + if ((xmin <= coords[i].x) && (coords[i].x < xmax) && + (ymin <= coords[i].y) && (coords[i].y < ymax)) + { + coords[nEvents].time = coords[i].time; + coords[nEvents].x = coords[i].x - pWin->drawable.x; + coords[nEvents].y = coords[i].y - pWin->drawable.y; + nEvents++; + } + } + rep.length = nEvents * bytes_to_int32(sizeof(xTimecoord)); + rep.nEvents = nEvents; + WriteReplyToClient(client, sizeof(xGetMotionEventsReply), &rep); + if (nEvents) + { + client->pSwapReplyFunc = (ReplySwapPtr) SwapTimeCoordWrite; + WriteSwappedDataToClient(client, nEvents * sizeof(xTimecoord), + (char *)coords); + } + free(coords); + return Success; +} + +int +ProcQueryKeymap(ClientPtr client) +{ + xQueryKeymapReply rep; + int rc, i; + DeviceIntPtr keybd = PickKeyboard(client); + CARD8 *down = keybd->key->down; + + REQUEST_SIZE_MATCH(xReq); + rep.type = X_Reply; + rep.sequenceNumber = client->sequence; + rep.length = 2; + + rc = XaceHook(XACE_DEVICE_ACCESS, client, keybd, DixReadAccess); + if (rc != Success && rc != BadAccess) + return rc; + + for (i = 0; i<32; i++) + rep.map[i] = down[i]; + + if (rc == BadAccess) + memset(rep.map, 0, 32); + + WriteReplyToClient(client, sizeof(xQueryKeymapReply), &rep); + + return Success; +} + + +/** + * Recalculate the number of buttons for the master device. The number of + * buttons on the master device is equal to the number of buttons on the + * slave device with the highest number of buttons. + */ +static void +RecalculateMasterButtons(DeviceIntPtr slave) +{ + DeviceIntPtr dev, master; + int maxbuttons = 0; + + if (!slave->button || IsMaster(slave)) + return; + + master = GetMaster(slave, MASTER_POINTER); + if (!master) + return; + + for (dev = inputInfo.devices; dev; dev = dev->next) + { + if (IsMaster(dev) || + dev->u.master != master || + !dev->button) + continue; + + maxbuttons = max(maxbuttons, dev->button->numButtons); + } + + if (master->button && master->button->numButtons != maxbuttons) + { + int i; + DeviceChangedEvent event; + + memset(&event, 0, sizeof(event)); + + master->button->numButtons = maxbuttons; + + event.header = ET_Internal; + event.type = ET_DeviceChanged; + event.time = GetTimeInMillis(); + event.deviceid = master->id; + event.flags = DEVCHANGE_POINTER_EVENT | DEVCHANGE_DEVICE_CHANGE; + event.buttons.num_buttons = maxbuttons; + memcpy(&event.buttons.names, master->button->labels, maxbuttons * + sizeof(Atom)); + + if (master->valuator) + { + event.num_valuators = master->valuator->numAxes; + for (i = 0; i < event.num_valuators; i++) + { + event.valuators[i].min = master->valuator->axes[i].min_value; + event.valuators[i].max = master->valuator->axes[i].max_value; + event.valuators[i].resolution = master->valuator->axes[i].resolution; + event.valuators[i].mode = master->valuator->axes[i].mode; + event.valuators[i].name = master->valuator->axes[i].label; + } + } + + if (master->key) + { + event.keys.min_keycode = master->key->xkbInfo->desc->min_key_code; + event.keys.max_keycode = master->key->xkbInfo->desc->max_key_code; + } + + XISendDeviceChangedEvent(master, master, &event); + } +} + +/** + * Attach device 'dev' to device 'master'. + * Client is set to the client that issued the request, or NULL if it comes + * from some internal automatic pairing. + * + * Master may be NULL to set the device floating. + * + * We don't allow multi-layer hierarchies right now. You can't attach a slave + * to another slave. + */ +int +AttachDevice(ClientPtr client, DeviceIntPtr dev, DeviceIntPtr master) +{ + ScreenPtr screen; + DeviceIntPtr oldmaster; + if (!dev || IsMaster(dev)) + return BadDevice; + + if (master && !IsMaster(master)) /* can't attach to slaves */ + return BadDevice; + + /* set from floating to floating? */ + if (!dev->u.master && !master && dev->enabled) + return Success; + + /* free the existing sprite. */ + if (!dev->u.master && dev->spriteInfo->paired == dev) + { + screen = miPointerGetScreen(dev); + screen->DeviceCursorCleanup(dev, screen); + free(dev->spriteInfo->sprite); + } + + oldmaster = dev->u.master; + dev->u.master = master; + + /* If device is set to floating, we need to create a sprite for it, + * otherwise things go bad. However, we don't want to render the cursor, + * so we reset spriteOwner. + * Sprite has to be forced to NULL first, otherwise InitializeSprite won't + * alloc new memory but overwrite the previous one. + */ + if (!master) + { + WindowPtr currentRoot; + + if (dev->spriteInfo->sprite) + currentRoot = GetCurrentRootWindow(dev); + else /* new device auto-set to floating */ + currentRoot = screenInfo.screens[0]->root; + + /* we need to init a fake sprite */ + screen = currentRoot->drawable.pScreen; + screen->DeviceCursorInitialize(dev, screen); + dev->spriteInfo->sprite = NULL; + InitializeSprite(dev, currentRoot); + dev->spriteInfo->spriteOwner = FALSE; + dev->spriteInfo->paired = dev; + } else + { + dev->spriteInfo->sprite = master->spriteInfo->sprite; + dev->spriteInfo->paired = master; + dev->spriteInfo->spriteOwner = FALSE; + + RecalculateMasterButtons(master); + } + + /* XXX: in theory, the MD should change back to its old, original + * classes when the last SD is detached. Thanks to the XTEST devices, + * we'll always have an SD attached until the MD is removed. + * So let's not worry about that. + */ + + return Success; +} + +/** + * Return the device paired with the given device or NULL. + * Returns the device paired with the parent master if the given device is a + * slave device. + */ +DeviceIntPtr +GetPairedDevice(DeviceIntPtr dev) +{ + if (!IsMaster(dev) && dev->u.master) + dev = dev->u.master; + + return dev->spriteInfo->paired; +} + + +/** + * Returns the right master for the type of event needed. If the event is a + * keyboard event. + * This function may be called with a master device as argument. If so, the + * returned master is either the device itself or the paired master device. + * If dev is a floating slave device, NULL is returned. + * + * @type ::MASTER_KEYBOARD or ::MASTER_POINTER + */ +DeviceIntPtr +GetMaster(DeviceIntPtr dev, int which) +{ + DeviceIntPtr master; + + if (IsMaster(dev)) + master = dev; + else + master = dev->u.master; + + if (master) + { + if (which == MASTER_KEYBOARD) + { + if (master->type != MASTER_KEYBOARD) + master = GetPairedDevice(master); + } else + { + if (master->type != MASTER_POINTER) + master = GetPairedDevice(master); + } + } + + return master; +} + +/** + * Create a new device pair (== one pointer, one keyboard device). + * Only allocates the devices, you will need to call ActivateDevice() and + * EnableDevice() manually. + * Either a master or a slave device can be created depending on + * the value for master. + */ +int +AllocDevicePair (ClientPtr client, char* name, + DeviceIntPtr* ptr, + DeviceIntPtr* keybd, + DeviceProc ptr_proc, + DeviceProc keybd_proc, + Bool master) +{ + DeviceIntPtr pointer; + DeviceIntPtr keyboard; + *ptr = *keybd = NULL; + + pointer = AddInputDevice(client, ptr_proc, TRUE); + if (!pointer) + return BadAlloc; + + if (asprintf(&pointer->name, "%s pointer", name) == -1) { + pointer->name = NULL; + RemoveDevice(pointer, FALSE); + return BadAlloc; + } + + pointer->public.processInputProc = ProcessOtherEvent; + pointer->public.realInputProc = ProcessOtherEvent; + XkbSetExtension(pointer, ProcessPointerEvent); + pointer->deviceGrab.ActivateGrab = ActivatePointerGrab; + pointer->deviceGrab.DeactivateGrab = DeactivatePointerGrab; + pointer->coreEvents = TRUE; + pointer->spriteInfo->spriteOwner = TRUE; + + pointer->u.lastSlave = NULL; + pointer->last.slave = NULL; + pointer->type = (master) ? MASTER_POINTER : SLAVE; + + keyboard = AddInputDevice(client, keybd_proc, TRUE); + if (!keyboard) + { + RemoveDevice(pointer, FALSE); + return BadAlloc; + } + + if (asprintf(&keyboard->name, "%s keyboard", name) == -1) { + keyboard->name = NULL; + RemoveDevice(keyboard, FALSE); + RemoveDevice(pointer, FALSE); + return BadAlloc; + } + + keyboard->public.processInputProc = ProcessOtherEvent; + keyboard->public.realInputProc = ProcessOtherEvent; + XkbSetExtension(keyboard, ProcessKeyboardEvent); + keyboard->deviceGrab.ActivateGrab = ActivateKeyboardGrab; + keyboard->deviceGrab.DeactivateGrab = DeactivateKeyboardGrab; + keyboard->coreEvents = TRUE; + keyboard->spriteInfo->spriteOwner = FALSE; + + keyboard->u.lastSlave = NULL; + keyboard->last.slave = NULL; + keyboard->type = (master) ? MASTER_KEYBOARD : SLAVE; + + /* The ClassesRec stores the device classes currently not used. */ + pointer->unused_classes = calloc(1, sizeof(ClassesRec)); + keyboard->unused_classes = calloc(1, sizeof(ClassesRec)); + + *ptr = pointer; + *keybd = keyboard; + + return Success; +} + +/** + * Return Relative or Absolute for the device. + */ +int valuator_get_mode(DeviceIntPtr dev, int axis) +{ + return (dev->valuator->axes[axis].mode & DeviceMode); +} + +/** + * Set the given mode for the axis. If axis is VALUATOR_MODE_ALL_AXES, then + * set the mode for all axes. + */ +void valuator_set_mode(DeviceIntPtr dev, int axis, int mode) +{ + if (axis != VALUATOR_MODE_ALL_AXES) + dev->valuator->axes[axis].mode = mode; + else { + int i; + for (i = 0; i < dev->valuator->numAxes; i++) + dev->valuator->axes[i].mode = mode; + } +} diff --git a/xorg-server/hw/dmx/doc/Makefile.am b/xorg-server/hw/dmx/doc/Makefile.am index 4bbc8bf88..8e7360288 100644 --- a/xorg-server/hw/dmx/doc/Makefile.am +++ b/xorg-server/hw/dmx/doc/Makefile.am @@ -24,34 +24,14 @@ doc_sources = dmx.xml scaled.xml # Developer's documentation is not installed if ENABLE_DEVEL_DOCS include $(top_srcdir)/doc/xml/xmlrules-noinst.in - -if HAVE_DOXYGEN - -DOXYGEN_SRC=doxygen.head doxygen.foot doxygen.css doxygen.conf - -all-local: html/annotated.html - -dist-local: html/annotated.html - -html/annotated.html: $(DOXYGEN_SRC) - $(DOXYGEN) $(srcdir)/doxygen.conf - -maintainer-clean-local: - rm -rf html/ -endif endif ENABLE_DEVEL_DOCS -EXTRA_DIST = \ - $(XML_FILES) \ - DMXSpec.txt \ - DMXSpec-v1.txt \ +DOXYGEN_HEAD=\ + html/annotated.html + +DOXYGEN_REST= \ dmx.txt \ - doxygen.conf \ - doxygen.css \ - doxygen.foot \ - doxygen.head \ scaled.txt \ - html/annotated.html \ html/ChkNotMaskEv_8c.html \ html/ChkNotMaskEv_8h.html \ html/ChkNotMaskEv_8h_source.html \ @@ -254,6 +234,41 @@ EXTRA_DIST = \ html/usb-private_8h.html \ html/usb-private_8h_source.html +DOXYGEN_FILES=$(DOXYGEN_HEAD) $(DOXYGEN_REST) + +EXTRA_DIST = \ + $(XML_FILES) \ + DMXSpec.txt \ + DMXSpec-v1.txt \ + doxygen.conf \ + doxygen.css \ + doxygen.foot \ + doxygen.head \ + $(DOXYGEN_FILES) + +if ENABLE_DEVEL_DOCS +if HAVE_DOXYGEN + +DOXYGEN_SRC=doxygen.head doxygen.foot doxygen.css doxygen.conf + +all-local: $(DOXYGEN_FILES) + +dist-local: $(DOXYGEN_FILES) + +$(DOXYGEN_HEAD): $(DOXYGEN_SRC) + $(DOXYGEN) doxygen.conf + +$(DOXYGEN_REST): $(DOXYGEN_HEAD) + +maintainer-clean-local: + rm -rf html/ scaled.txt dmx.txt + +distclean-local: + rm -rf html/ scaled.txt dmx.txt + +endif HAVE_DOXYGEN +endif ENABLE_DEVEL_DOCS + $(builddir)/doxygen.head: $(LN_S) $(srcdir)/doxygen.head $@ diff --git a/xorg-server/hw/dmx/doc/doxygen.conf b/xorg-server/hw/dmx/doc/doxygen.conf.in index f7a541f90..f886a436f 100644 --- a/xorg-server/hw/dmx/doc/doxygen.conf +++ b/xorg-server/hw/dmx/doc/doxygen.conf.in @@ -344,9 +344,9 @@ WARN_LOGFILE = # directories like "/usr/src/myproject". Separate the files or directories # with spaces. -INPUT = .. \ - ../input \ - ../config +INPUT = @srcdir@/.. \ + @srcdir@/../input \ + @srcdir@/../config # If the value of the INPUT tag contains directories, you can use the # FILE_PATTERNS tag to specify one or more wildcard pattern (like *.cpp @@ -367,9 +367,9 @@ RECURSIVE = NO # excluded from the INPUT source files. This way you can easily exclude a # subdirectory from a directory tree whose root is specified with the INPUT tag. -EXCLUDE = ../config/parser.c \ - ../config/parser.h \ - ../config/scanner.c +EXCLUDE = @srcdir@/../config/parser.c \ + @srcdir@/../config/parser.h \ + @srcdir@/../config/scanner.c # The EXCLUDE_SYMLINKS tag can be used select whether or not files or directories # that are symbolic links (a Unix filesystem feature) are excluded from the input. @@ -510,20 +510,20 @@ HTML_FILE_EXTENSION = .html # each generated HTML page. If it is left blank doxygen will generate a # standard header. -HTML_HEADER = doxygen.head +HTML_HEADER = @srcdir@/doxygen.head # The HTML_FOOTER tag can be used to specify a personal HTML footer for # each generated HTML page. If it is left blank doxygen will generate a # standard footer. -HTML_FOOTER = doxygen.foot +HTML_FOOTER = @srcdir@/doxygen.foot # The HTML_STYLESHEET tag can be used to specify a user-defined cascading # style sheet that is used by each HTML page. It can be used to # fine-tune the look of the HTML output. If the tag is left blank doxygen # will generate a default style sheet -HTML_STYLESHEET = doxygen.css +HTML_STYLESHEET = @srcdir@/doxygen.css # If the HTML_ALIGN_MEMBERS tag is set to YES, the members of classes, # files or namespaces will be aligned in HTML using tables. If set to diff --git a/xorg-server/hw/xfree86/loader/Makefile.am b/xorg-server/hw/xfree86/loader/Makefile.am index acacda650..7f386ccc0 100644 --- a/xorg-server/hw/xfree86/loader/Makefile.am +++ b/xorg-server/hw/xfree86/loader/Makefile.am @@ -1,29 +1,30 @@ -noinst_LTLIBRARIES = libloader.la
-
-INCLUDES = $(XORG_INCS) -I$(srcdir)/../parser -I$(top_srcdir)/miext/cw \
- -I$(srcdir)/../ddc -I$(srcdir)/../i2c -I$(srcdir)/../modes \
- -I$(srcdir)/../ramdac
-
-#AM_LDFLAGS = -r
-AM_CFLAGS = $(DIX_CFLAGS) $(XORG_CFLAGS)
-
-EXTRA_DIST = \
- loader.h \
- loaderProcs.h \
- sdksyms.sh
-
-libloader_la_SOURCES = \
- loader.c \
- loaderProcs.h \
- loadext.c \
- loadmod.c \
- os.c \
- sdksyms.c
-libloader_la_LIBADD = $(DLOPEN_LIBS)
-
-CLEANFILES = sdksyms.c sdksyms.dep
-
-sdksyms.dep sdksyms.c: sdksyms.sh
- CPP='$(CPP)' AWK='$(AWK)' $(srcdir)/sdksyms.sh $(top_srcdir) $(AM_CFLAGS) $(CFLAGS) $(INCLUDES)
-
-sinclude sdksyms.dep
+noinst_LTLIBRARIES = libloader.la + +INCLUDES = $(XORG_INCS) -I$(srcdir)/../parser -I$(top_srcdir)/miext/cw \ + -I$(srcdir)/../ddc -I$(srcdir)/../i2c -I$(srcdir)/../modes \ + -I$(srcdir)/../ramdac + +#AM_LDFLAGS = -r +AM_CFLAGS = $(DIX_CFLAGS) $(XORG_CFLAGS) + +EXTRA_DIST = \ + loader.h \ + loaderProcs.h \ + sdksyms.sh + +libloader_la_SOURCES = \ + loader.c \ + loaderProcs.h \ + loadext.c \ + loadmod.c \ + os.c \ + sdksyms.c +libloader_la_LIBADD = $(DLOPEN_LIBS) + +CLEANFILES = sdksyms.c sdksyms.dep + +sdksyms.dep sdksyms.c: sdksyms.sh + CPP='$(CPP)' AWK='$(AWK)' $(srcdir)/sdksyms.sh $(top_srcdir) $(AM_CFLAGS) $(CFLAGS) $(INCLUDES) + +SDKSYMS_DEP = sdksyms.dep +include $(SDKSYMS_DEP) diff --git a/xorg-server/hw/xwin/glx/Makefile.am b/xorg-server/hw/xwin/glx/Makefile.am index dae58bf89..303ff53f2 100644 --- a/xorg-server/hw/xwin/glx/Makefile.am +++ b/xorg-server/hw/xwin/glx/Makefile.am @@ -1,60 +1,60 @@ -noinst_LTLIBRARIES = libXwinGLX.la
-
-libXwinGLX_la_SOURCES = \
- winpriv.c \
- winpriv.h \
- glwindows.h \
- glwrap.c \
- indirect.c \
- wgl_ext_api.c
-
-if XWIN_MULTIWINDOW
-DEFS_MULTIWINDOW = -DXWIN_MULTIWINDOW
-endif
-
-if XWIN_MULTIWINDOWEXTWM
-DEFS_MULTIWINDOWEXTWM = -DXWIN_MULTIWINDOWEXTWM
-endif
-
-DEFS = $(DEFS_MULTIWINDOW) $(DEFS_MULTIWINDOWEXTWM)
-
-INCLUDES = -I$(top_srcdir)/miext/rootless
-
-AM_CFLAGS = -DHAVE_XWIN_CONFIG_H $(DIX_CFLAGS) \
- $(XWINMODULES_CFLAGS) \
- -I$(top_srcdir) \
- -I$(top_srcdir)/hw/xwin/
-
-glwrap.c: generated_gl_wrappers.c
-wgl_ext_api.c: generated_wgl_wrappers.c wglext.h
-wgl_ext_api.h: wglext.h
-indirect.c: wgl_ext_api.h
-
-SPEC_FILES = gl.spec gl.tm wglext.spec wgl.tm
-
-gl.spec:
- wget http://www.opengl.org/registry/api/gl.spec
-
-gl.tm:
- wget http://www.opengl.org/registry/api/gl.tm
-
-wglext.spec:
- wget http://www.opengl.org/registry/api/wglext.spec
-
-wgl.tm:
- wget http://www.opengl.org/registry/api/wgl.tm
-
-generated_gl_wrappers.c: gen_gl_wrappers.py gl.spec gl.tm
- $(srcdir)/gen_gl_wrappers.py --spec=$(srcdir)/gl.spec --typemap=$(srcdir)/gl.tm --dispatch-header=$(top_srcdir)/glx/dispatch.h --staticwrappers >generated_gl_wrappers.c
-
-generated_wgl_wrappers.c: gen_gl_wrappers.py wglext.spec wgl.tm
- $(srcdir)/gen_gl_wrappers.py --spec=$(srcdir)/wglext.spec --typemap=$(srcdir)/wgl.tm --prefix=wgl --preresolve >generated_wgl_wrappers.c
-
-wglext.h:
- wget http://www.opengl.org/registry/api/wglext.h
-
-BUILT_SOURCES = generated_gl_wrappers.c generated_wgl_wrappers.c
-CLEANFILES = $(BUILT_SOURCES)
-DISTCLEANFILES = $(SPEC_FILES) wglext.h
-
-EXTRA_DIST = gen_gl_wrappers.py $(SPEC_FILES) wglext.h
+noinst_LTLIBRARIES = libXwinGLX.la + +libXwinGLX_la_SOURCES = \ + winpriv.c \ + winpriv.h \ + glwindows.h \ + glwrap.c \ + indirect.c \ + wgl_ext_api.c + +if XWIN_MULTIWINDOW +DEFS_MULTIWINDOW = -DXWIN_MULTIWINDOW +endif + +if XWIN_MULTIWINDOWEXTWM +DEFS_MULTIWINDOWEXTWM = -DXWIN_MULTIWINDOWEXTWM +endif + +DEFS = $(DEFS_MULTIWINDOW) $(DEFS_MULTIWINDOWEXTWM) + +INCLUDES = -I$(top_srcdir)/miext/rootless + +AM_CFLAGS = -DHAVE_XWIN_CONFIG_H $(DIX_CFLAGS) \ + $(XWINMODULES_CFLAGS) \ + -I$(top_srcdir) \ + -I$(top_srcdir)/hw/xwin/ + +glwrap.c: generated_gl_wrappers.c +wgl_ext_api.c: generated_wgl_wrappers.c wglext.h +wgl_ext_api.h: wglext.h +indirect.c: wgl_ext_api.h + +SPEC_FILES = gl.spec gl.tm wglext.spec wgl.tm + +gl.spec: + wget http://www.opengl.org/registry/api/gl.spec + +gl.tm: + wget http://www.opengl.org/registry/api/gl.tm + +wglext.spec: + wget http://www.opengl.org/registry/api/wglext.spec + +wgl.tm: + wget http://www.opengl.org/registry/api/wgl.tm + +generated_gl_wrappers.c: gen_gl_wrappers.py gl.spec gl.tm + $(srcdir)/gen_gl_wrappers.py --spec=`test -e gl.spec || echo $(srcdir)/`gl.spec --typemap=`test -e gl.tm || echo $(srcdir)/`gl.tm --dispatch-header=$(top_srcdir)/glx/dispatch.h --staticwrappers >generated_gl_wrappers.c + +generated_wgl_wrappers.c: gen_gl_wrappers.py wglext.spec wgl.tm + $(srcdir)/gen_gl_wrappers.py --spec=`test -e wglext.spec || echo $(srcdir)/`wglext.spec --typemap=`test -e wgl.tm || echo $(srcdir)/`wgl.tm --prefix=wgl --preresolve >generated_wgl_wrappers.c + +wglext.h: + wget http://www.opengl.org/registry/api/wglext.h + +BUILT_SOURCES = generated_gl_wrappers.c generated_wgl_wrappers.c +CLEANFILES = $(BUILT_SOURCES) +DISTCLEANFILES = $(SPEC_FILES) wglext.h + +EXTRA_DIST = gen_gl_wrappers.py $(SPEC_FILES) wglext.h diff --git a/xorg-server/xkeyboard-config/rules/base.o_s.part b/xorg-server/xkeyboard-config/rules/base.o_s.part index 00634858d..3e23396da 100644 --- a/xorg-server/xkeyboard-config/rules/base.o_s.part +++ b/xorg-server/xkeyboard-config/rules/base.o_s.part @@ -1,142 +1,143 @@ - altwin:menu = +altwin(menu)
- altwin:meta_alt = +altwin(meta_alt)
- altwin:ctrl_win = +altwin(ctrl_win)
- altwin:ctrl_alt_win = +altwin(ctrl_alt_win)
- altwin:meta_win = +altwin(meta_win)
- altwin:left_meta_win = +altwin(left_meta_win)
- altwin:hyper_win = +altwin(hyper_win)
- altwin:alt_super_win = +altwin(alt_super_win)
- altwin:swap_lalt_lwin = +altwin(swap_lalt_lwin)
- grp:switch = +group(switch)
- grp:lswitch = +group(lswitch)
- grp:win_switch = +group(win_switch)
- grp:lwin_switch = +group(lwin_switch)
- grp:rwin_switch = +group(rwin_switch)
- grp:toggle = +group(toggle)
- grp:shifts_toggle = +group(shifts_toggle)
- grp:ctrls_toggle = +group(ctrls_toggle)
- grp:alts_toggle = +group(alts_toggle)
- grp:ctrl_shift_toggle = +group(ctrl_shift_toggle)
- grp:lctrl_lshift_toggle = +group(lctrl_lshift_toggle)
- grp:rctrl_rshift_toggle = +group(rctrl_rshift_toggle)
- grp:caps_toggle = +capslock(grouplock)
- grp:caps_switch = +capslock(groupshift)
- grp:shift_caps_toggle = +group(shift_caps_toggle)
- grp:shift_caps_switch = +group(shift_caps_switch)
- grp:win_menu_switch = +group(win_menu_switch)
- grp:alt_caps_toggle = +group(alt_caps_toggle)
- grp:ctrl_alt_toggle = +group(ctrl_alt_toggle)
- grp:alt_shift_toggle = +group(alt_shift_toggle)
- grp:alt_space_toggle = +group(alt_space_toggle)
- grp:menu_toggle = +group(menu_toggle)
- grp:lwin_toggle = +group(lwin_toggle)
- grp:rwin_toggle = +group(rwin_toggle)
- grp:lshift_toggle = +group(lshift_toggle)
- grp:rshift_toggle = +group(rshift_toggle)
- grp:rctrl_switch = +group(rctrl_switch)
- grp:lctrl_toggle = +group(lctrl_toggle)
- grp:rctrl_toggle = +group(rctrl_toggle)
- grp:lalt_toggle = +group(lalt_toggle)
- grp:sclk_toggle = +group(sclk_toggle)
- grp:lctrl_rctrl_switch = +group(lctrl_rctrl_switch)
- grp:lctrl_lwin_rctrl_menu = +group(lctrl_lwin_rctrl_menu)
- lv3:switch = +level3(switch)
- lv3:ralt_switch = +level3(ralt_switch)
- lv3:ralt_switch_multikey = +level3(ralt_switch_multikey)
- lv3:ralt_alt = +level3(ralt_alt)
- lv3:lalt_switch = +level3(lalt_switch)
- lv3:alt_switch = +level3(alt_switch)
- lv3:menu_switch = +level3(menu_switch)
- lv3:win_switch = +level3(win_switch)
- lv3:lwin_switch = +level3(lwin_switch)
- lv3:rwin_switch = +level3(rwin_switch)
- lv3:enter_switch = +level3(enter_switch)
- caps:capslock = +capslock(capslock)
- caps:numlock = +capslock(numlock)
- caps:shiftlock = +capslock(shiftlock)
- caps:swapescape = +capslock(swapescape)
- caps:escape = +capslock(escape)
- caps:backspace = +capslock(backspace)
- caps:super = +capslock(super)
- caps:hyper = +capslock(hyper)
- caps:none = +capslock(none)
- ctrl:nocaps = +ctrl(nocaps)
- ctrl:lctrl_meta = +ctrl(lctrl_meta)
- ctrl:swapcaps = +ctrl(swapcaps)
- ctrl:ctrl_ac = +ctrl(ctrl_ac)
- ctrl:ctrl_aa = +ctrl(ctrl_aa)
- ctrl:ctrl_ra = +ctrl(ctrl_ra)
- ctrl:ctrl_menu = +ctrl(ctrl_menu)
- compose:ralt = +compose(ralt)
- compose:lwin = +compose(lwin)
- compose:rwin = +compose(rwin)
- compose:menu = +compose(menu)
- compose:lctrl = +compose(lctrl)
- compose:rctrl = +compose(rctrl)
- compose:caps = +compose(caps)
- compose:102 = +compose(102)
- compose:paus = +compose(paus)
- compose:prsc = +compose(prsc)
- compose:sclk = +compose(sclk)
- srvrkeys:none = +srvr_ctrl(no_srvr_keys)
- eurosign:e = +eurosign(e)
- eurosign:2 = +eurosign(2)
- eurosign:4 = +eurosign(4)
- eurosign:5 = +eurosign(5)
- rupeesign:4 = +rupeesign(4)
- keypad:oss = +keypad(oss)
- keypad:legacy = +keypad(legacy)
- keypad:legacy_wang = +keypad(legacy_wang)
- keypad:oss_wang = +keypad(oss_wang)
- keypad:future = +keypad(future)
- keypad:future_wang = +keypad(future_wang)
- keypad:hex = +keypad(ops)+keypad(hex)
- keypad:atm = +keypad(ops)+keypad(hex)+keypad(atm)
- nbsp:none = +nbsp(none)
- nbsp:level2 = +nbsp(level2)
- nbsp:level3 = +nbsp(level3)
- nbsp:level3s = +nbsp(level3s)
- nbsp:level3n = +nbsp(level3n)
- nbsp:level4 = +nbsp(level4)
- nbsp:level4n = +nbsp(level4n)
- nbsp:level4nl = +nbsp(level4nl)
- japan:nicola_f_bs = +jp(nicola_f_bs)
- kpdl:dot = +kpdl(dot)
- kpdl:comma = +kpdl(comma)
- kpdl:dotoss = +kpdl(dotoss)
- kpdl:dotoss_latin9 = +kpdl(dotoss_latin9)
- kpdl:commaoss = +kpdl(commaoss)
- kpdl:momayyezoss = +kpdl(momayyezoss)
- kpdl:kposs = +kpdl(kposs)
- kpdl:semi = +kpdl(semi)
- shift:breaks_caps = +shift(breaks_caps)
- esperanto:qwerty = +epo(qwerty)
- esperanto:dvorak = +epo(dvorak)
- terminate:ctrl_alt_bksp = +terminate(ctrl_alt_bksp)
- keypad:pointerkeys = +keypad(pointerkeys)
- apple:alupckeys = +macintosh_vndr/apple(alupckeys)
- shift:both_capslock = +shift(both_capslock)
- shift:lshift_both_capslock = +shift(lshift_both_capslock)
- shift:rshift_both_capslock = +shift(rshift_both_capslock)
- shift:both_capslock_cancel = +shift(both_capslock_cancel)
- shift:lshift_both_capslock_cancel = +shift(lshift_both_capslock_cancel)
- shift:rshift_both_capslock_cancel = +shift(rshift_both_capslock_cancel)
- shift:both_shiftlock = +shift(both_shiftlock)
- shift:lshift_both_shiftlock = +shift(lshift_both_shiftlock)
- shift:rshift_both_shiftlock = +shift(rshift_both_shiftlock)
- lv3:caps_switch = +level3(caps_switch)
- lv3:bksl_switch = +level3(bksl_switch)
- lv3:lsgt_switch = +level3(lsgt_switch)
- lv3:caps_switch_latch = +level3(caps_switch_latch)
- lv3:bksl_switch_latch = +level3(bksl_switch_latch)
- lv3:lsgt_switch_latch = +level3(lsgt_switch_latch)
- lv5:lsgt_switch_lock = +level5(lsgt_switch_lock)
- lv5:ralt_switch_lock = +level5(ralt_switch_lock)
- lv5:lwin_switch_lock = +level5(lwin_switch_lock)
- lv5:rwin_switch_lock = +level5(rwin_switch_lock)
- lv5:lsgt_switch_lock_cancel = +level5(lsgt_switch_lock_cancel)
- lv5:ralt_switch_lock_cancel = +level5(ralt_switch_lock_cancel)
- lv5:lwin_switch_lock_cancel = +level5(lwin_switch_lock_cancel)
- lv5:rwin_switch_lock_cancel = +level5(rwin_switch_lock_cancel)
-
-
+ altwin:menu = +altwin(menu) + altwin:meta_alt = +altwin(meta_alt) + altwin:ctrl_win = +altwin(ctrl_win) + altwin:ctrl_alt_win = +altwin(ctrl_alt_win) + altwin:meta_win = +altwin(meta_win) + altwin:left_meta_win = +altwin(left_meta_win) + altwin:hyper_win = +altwin(hyper_win) + altwin:alt_super_win = +altwin(alt_super_win) + altwin:swap_lalt_lwin = +altwin(swap_lalt_lwin) + grp:switch = +group(switch) + grp:lswitch = +group(lswitch) + grp:win_switch = +group(win_switch) + grp:lwin_switch = +group(lwin_switch) + grp:rwin_switch = +group(rwin_switch) + grp:toggle = +group(toggle) + grp:shifts_toggle = +group(shifts_toggle) + grp:ctrls_toggle = +group(ctrls_toggle) + grp:alts_toggle = +group(alts_toggle) + grp:ctrl_shift_toggle = +group(ctrl_shift_toggle) + grp:lctrl_lshift_toggle = +group(lctrl_lshift_toggle) + grp:rctrl_rshift_toggle = +group(rctrl_rshift_toggle) + grp:caps_toggle = +capslock(grouplock) + grp:caps_switch = +capslock(groupshift) + grp:shift_caps_toggle = +group(shift_caps_toggle) + grp:shift_caps_switch = +group(shift_caps_switch) + grp:win_menu_switch = +group(win_menu_switch) + grp:alt_caps_toggle = +group(alt_caps_toggle) + grp:ctrl_alt_toggle = +group(ctrl_alt_toggle) + grp:alt_shift_toggle = +group(alt_shift_toggle) + grp:alt_space_toggle = +group(alt_space_toggle) + grp:menu_toggle = +group(menu_toggle) + grp:lwin_toggle = +group(lwin_toggle) + grp:rwin_toggle = +group(rwin_toggle) + grp:lshift_toggle = +group(lshift_toggle) + grp:rshift_toggle = +group(rshift_toggle) + grp:rctrl_switch = +group(rctrl_switch) + grp:lctrl_toggle = +group(lctrl_toggle) + grp:rctrl_toggle = +group(rctrl_toggle) + grp:lalt_toggle = +group(lalt_toggle) + grp:sclk_toggle = +group(sclk_toggle) + grp:lctrl_rctrl_switch = +group(lctrl_rctrl_switch) + grp:lctrl_lwin_rctrl_menu = +group(lctrl_lwin_rctrl_menu) + lv3:switch = +level3(switch) + lv3:ralt_switch = +level3(ralt_switch) + lv3:ralt_switch_multikey = +level3(ralt_switch_multikey) + lv3:ralt_alt = +level3(ralt_alt) + lv3:lalt_switch = +level3(lalt_switch) + lv3:alt_switch = +level3(alt_switch) + lv3:menu_switch = +level3(menu_switch) + lv3:win_switch = +level3(win_switch) + lv3:lwin_switch = +level3(lwin_switch) + lv3:rwin_switch = +level3(rwin_switch) + lv3:enter_switch = +level3(enter_switch) + caps:capslock = +capslock(capslock) + caps:numlock = +capslock(numlock) + caps:shiftlock = +capslock(shiftlock) + caps:swapescape = +capslock(swapescape) + caps:escape = +capslock(escape) + caps:backspace = +capslock(backspace) + caps:super = +capslock(super) + caps:hyper = +capslock(hyper) + caps:none = +capslock(none) + caps:ctrl_modifier = +capslock(ctrl_modifier) + ctrl:nocaps = +ctrl(nocaps) + ctrl:lctrl_meta = +ctrl(lctrl_meta) + ctrl:swapcaps = +ctrl(swapcaps) + ctrl:ctrl_ac = +ctrl(ctrl_ac) + ctrl:ctrl_aa = +ctrl(ctrl_aa) + ctrl:ctrl_ra = +ctrl(ctrl_ra) + ctrl:ctrl_menu = +ctrl(ctrl_menu) + compose:ralt = +compose(ralt) + compose:lwin = +compose(lwin) + compose:rwin = +compose(rwin) + compose:menu = +compose(menu) + compose:lctrl = +compose(lctrl) + compose:rctrl = +compose(rctrl) + compose:caps = +compose(caps) + compose:102 = +compose(102) + compose:paus = +compose(paus) + compose:prsc = +compose(prsc) + compose:sclk = +compose(sclk) + srvrkeys:none = +srvr_ctrl(no_srvr_keys) + eurosign:e = +eurosign(e) + eurosign:2 = +eurosign(2) + eurosign:4 = +eurosign(4) + eurosign:5 = +eurosign(5) + rupeesign:4 = +rupeesign(4) + keypad:oss = +keypad(oss) + keypad:legacy = +keypad(legacy) + keypad:legacy_wang = +keypad(legacy_wang) + keypad:oss_wang = +keypad(oss_wang) + keypad:future = +keypad(future) + keypad:future_wang = +keypad(future_wang) + keypad:hex = +keypad(ops)+keypad(hex) + keypad:atm = +keypad(ops)+keypad(hex)+keypad(atm) + nbsp:none = +nbsp(none) + nbsp:level2 = +nbsp(level2) + nbsp:level3 = +nbsp(level3) + nbsp:level3s = +nbsp(level3s) + nbsp:level3n = +nbsp(level3n) + nbsp:level4 = +nbsp(level4) + nbsp:level4n = +nbsp(level4n) + nbsp:level4nl = +nbsp(level4nl) + japan:nicola_f_bs = +jp(nicola_f_bs) + kpdl:dot = +kpdl(dot) + kpdl:comma = +kpdl(comma) + kpdl:dotoss = +kpdl(dotoss) + kpdl:dotoss_latin9 = +kpdl(dotoss_latin9) + kpdl:commaoss = +kpdl(commaoss) + kpdl:momayyezoss = +kpdl(momayyezoss) + kpdl:kposs = +kpdl(kposs) + kpdl:semi = +kpdl(semi) + shift:breaks_caps = +shift(breaks_caps) + esperanto:qwerty = +epo(qwerty) + esperanto:dvorak = +epo(dvorak) + terminate:ctrl_alt_bksp = +terminate(ctrl_alt_bksp) + keypad:pointerkeys = +keypad(pointerkeys) + apple:alupckeys = +macintosh_vndr/apple(alupckeys) + shift:both_capslock = +shift(both_capslock) + shift:lshift_both_capslock = +shift(lshift_both_capslock) + shift:rshift_both_capslock = +shift(rshift_both_capslock) + shift:both_capslock_cancel = +shift(both_capslock_cancel) + shift:lshift_both_capslock_cancel = +shift(lshift_both_capslock_cancel) + shift:rshift_both_capslock_cancel = +shift(rshift_both_capslock_cancel) + shift:both_shiftlock = +shift(both_shiftlock) + shift:lshift_both_shiftlock = +shift(lshift_both_shiftlock) + shift:rshift_both_shiftlock = +shift(rshift_both_shiftlock) + lv3:caps_switch = +level3(caps_switch) + lv3:bksl_switch = +level3(bksl_switch) + lv3:lsgt_switch = +level3(lsgt_switch) + lv3:caps_switch_latch = +level3(caps_switch_latch) + lv3:bksl_switch_latch = +level3(bksl_switch_latch) + lv3:lsgt_switch_latch = +level3(lsgt_switch_latch) + lv5:lsgt_switch_lock = +level5(lsgt_switch_lock) + lv5:ralt_switch_lock = +level5(ralt_switch_lock) + lv5:lwin_switch_lock = +level5(lwin_switch_lock) + lv5:rwin_switch_lock = +level5(rwin_switch_lock) + lv5:lsgt_switch_lock_cancel = +level5(lsgt_switch_lock_cancel) + lv5:ralt_switch_lock_cancel = +level5(ralt_switch_lock_cancel) + lv5:lwin_switch_lock_cancel = +level5(lwin_switch_lock_cancel) + lv5:rwin_switch_lock_cancel = +level5(rwin_switch_lock_cancel) + + diff --git a/xorg-server/xkeyboard-config/rules/base.xml.in b/xorg-server/xkeyboard-config/rules/base.xml.in index 3578100ee..ef97ab8d2 100644 --- a/xorg-server/xkeyboard-config/rules/base.xml.in +++ b/xorg-server/xkeyboard-config/rules/base.xml.in @@ -1394,14 +1394,14 @@ </variant> <variant> <configItem> - <name>olpc-fa</name> + <name>fa-olpc</name> <_description>OLPC Dari</_description> <!-- No ISO code in ISO639-2, only draft ISO693-3 --> </configItem> </variant> <variant> <configItem> - <name>olpc-uz</name> + <name>uz-olpc</name> <_description>OLPC Southern Uzbek</_description> <languageList><iso639Id>uzb</iso639Id></languageList> </configItem> @@ -5295,6 +5295,12 @@ <_description>Caps Lock is disabled</_description> </configItem> </option> + <option> + <configItem> + <name>caps:ctrl_modifier</name> + <_description>Make Caps Lock an additional Control but keep the Caps_Lock keysym</_description> + </configItem> + </option> </group> <group allowMultipleSelection="false"> <!-- Using special PC keys (Win, Menu) to work as standard X keys (Super, Hyper, etc.) --> diff --git a/xorg-server/xkeyboard-config/symbols/af b/xorg-server/xkeyboard-config/symbols/af index 90bfe127d..d7d866d34 100644 --- a/xorg-server/xkeyboard-config/symbols/af +++ b/xorg-server/xkeyboard-config/symbols/af @@ -1,397 +1,397 @@ -//
-// Keymap for the Afghan dari keybord layout
-// Based on the specification "Computer Locale Requirements for
-// Afghanstan" [1] from the "United Nations Development Programme
-// Afghanistan" and the "Afghan Transitional Islamic
-// Administration Ministry of Communications".
-// [1] http://www.evertype.com/standards/af/
-// For a MINI HOWTO see [2].
-// [2] http://www.afghanischerKulturverein.de/en/afghanComputer_en.php
-//
-// 2006-02-15 file created by M. Emal Alekozai <memala@gmx.net>
-
-partial default alphanumeric_keys
-xkb_symbols "basic" {
- //name[Group1]= "Afghanistan Dari";
- name[Group1]= "Afghanistan";
-
- key <TLDE> { [ 0x100200d, 0x10000f7, dead_tilde ] };
- key <AE01> { [ 0x10006f1, exclam, 0x1000060 ] };
- key <AE02> { [ 0x10006f2, 0x100066c, 0x1000040 ] };
- key <AE03> { [ 0x10006f3, 0x100066b, numbersign ] };
- key <AE04> { [ 0x10006f4, 0x100e60b, 0x1000024] };
- key <AE05> { [ 0x10006f5, 0x100066a, 0x1000025 ] };
- key <AE06> { [ 0x10006f6, multiply, 0x100005e ] };
- key <AE07> { [ 0x10006f7, Arabic_comma, 0x1000026 ] };
- key <AE08> { [ 0x10006f8, asterisk, 0x1002022 ] };
- key <AE09> { [ 0x10006f9, 0x1000029, 0x100200e ] };
- key <AE10> { [ 0x10006f0, 0x1000028, 0x100200f ] };
- key <AE11> { [ minus, Arabic_tatweel, 0x100005f ] };
- key <AE12> { [ plus, equal ] };
-
- key <AD01> { [ Arabic_dad, Arabic_sukun, 0x10000b0 ] };
- key <AD02> { [ Arabic_sad, Arabic_dammatan ] };
- key <AD03> { [ Arabic_theh, Arabic_kasratan, 0x10020ac ] };
- key <AD04> { [ Arabic_qaf, Arabic_fathatan, 0x100fd3e ] };
- key <AD05> { [ Arabic_feh, Arabic_damma, 0x100fd3f ] };
- key <AD06> { [ Arabic_ghain, Arabic_kasra, 0x100e656] };
- key <AD07> { [ Arabic_ain, Arabic_fatha, 0x100e659] };
- key <AD08> { [ Arabic_heh, Arabic_shadda, 0x1000655] };
- key <AD09> { [ Arabic_khah, bracketright, 0x1000027] };
- key <AD10> { [ Arabic_hah, bracketleft, 0x1000022] };
- key <AD11> { [ Arabic_jeem, braceright, 0x1000681 ] };
- key <AD12> { [ 0x1000686, braceleft, 0x1000685 ] };
-
- key <AC01> { [ Arabic_sheen, Arabic_hamzaonwaw, 0x100069a ] };
- key <AC02> { [ Arabic_seen, Arabic_hamzaonyeh, 0x10006cd ] };
- key <AC03> { [ 0x10006cc, Arabic_yeh, 0x1000649 ] };
- key <AC04> { [ Arabic_beh, Arabic_hamzaunderalef, 0x10006d0 ] };
- key <AC05> { [ Arabic_lam, Arabic_hamzaonalef, 0x10006b7 ] };
- key <AC06> { [ Arabic_alef, Arabic_maddaonalef, 0x1000671 ] };
- key <AC07> { [ Arabic_teh, Arabic_tehmarbuta, 0x100067c ] };
- key <AC08> { [ Arabic_noon, 0x10000bb, 0x10006bc ] };
- key <AC09> { [ Arabic_meem, 0x10000ab, 0x10006ba ] };
- key <AC10> { [ 0x10006a9, colon, 0x100003b ] };
- key <AC11> { [ 0x10006af, Arabic_semicolon, 0x10006ab ] };
-
- key <BKSL> { [ backslash, bar, 0x100003f ] };
-
- key <AB01> { [ Arabic_zah, Arabic_kaf, 0x10006d2] };
- key <AB02> { [ Arabic_tah, 0x1000653 , 0x1000691 ] };
- key <AB03> { [ Arabic_zain, 0x1000698, 0x1000696 ] };
- key <AB04> { [ Arabic_ra, 0x1000670 , 0x1000693 ] };
- key <AB05> { [ Arabic_thal, 0x100200c, 0x1000688 ] };
- key <AB06> { [ Arabic_dal, 0x1000654, 0x1000689 ] };
- key <AB07> { [ 0x100067e, Arabic_hamza, 0x1000679 ] };
- key <AB08> { [ Arabic_waw, greater, 0x100002c ] };
- key <AB09> { [ period, less, 0x10006c7 ] };
- key <AB10> { [ slash, Arabic_question_mark, 0x10006c9 ] };
-
- include "nbsp(zwnj2nb3)"
- include "level3(ralt_switch)"
-};
-
-// Keymap for the Afghan pashto keybord layout
-// Based on the specification "Computer Locale Requirements for
-// Afghanstan" [1] from the "United Nations Development Programme
-// Afghanistan"" and the "Afghan Transitional Islamic
-// Administration Ministry of Communications".
-// [1] http://www.evertype.com/standards/af/
-// For a MINI HOWTO see [2].
-// [2] http://www.afghanischerKulturverein.de/en/afghanComputer_en.php
-//
-// 2006-02-15 file created by M. Emal Alekozai <memala@gmx.net>
-
-partial alphanumeric_keys
-xkb_symbols "ps" {
- name[Group1]= "Afghanistan - Pashto";
-
- key <TLDE> { [ 0x100200d, 0x10000f7, dead_tilde ] };
- key <AE01> { [ 0x10006f1, exclam, 0x1000060 ] };
- key <AE02> { [ 0x10006f2, 0x100066c, 0x1000040 ] };
- key <AE03> { [ 0x10006f3, 0x100066b, numbersign ] };
- key <AE04> { [ 0x10006f4, 0x100e60b, 0x1000024] };
- key <AE05> { [ 0x10006f5, 0x100066a, 0x1000025 ] };
- key <AE06> { [ 0x10006f6, multiply, 0x100005e ] };
- key <AE07> { [ 0x10006f7, 0x10000bb, 0x1000026 ] };
- key <AE08> { [ 0x10006f8, 0x10000ab, 0x1002022 ] };
- key <AE09> { [ 0x10006f9, 0x1000029, 0x100200e ] };
- key <AE10> { [ 0x10006f0, 0x1000028, 0x100200f ] };
- key <AE11> { [ minus, Arabic_tatweel, 0x100005f ] };
- key <AE12> { [ plus, equal ] };
-
- key <AD01> { [ Arabic_dad, Arabic_sukun, 0x10000b0 ] };
- key <AD02> { [ Arabic_sad, Arabic_dammatan, 0x1000653 ] };
- key <AD03> { [ Arabic_theh, Arabic_kasratan, 0x10020ac ] };
- key <AD04> { [ Arabic_qaf, Arabic_fathatan, 0x100fd3e ] };
- key <AD05> { [ Arabic_feh, Arabic_damma, 0x100fd3f ] };
- key <AD06> { [ Arabic_ghain, Arabic_kasra, 0x100e656] };
- key <AD07> { [ Arabic_ain, Arabic_fatha, 0x100e659] };
- key <AD08> { [ Arabic_heh, Arabic_shadda, 0x1000670] };
- key <AD09> { [ Arabic_khah, 0x1000681, 0x1000027] };
- key <AD10> { [ Arabic_hah, 0x1000685, 0x1000022] };
- key <AD11> { [ Arabic_jeem, 0x100005d, 0x100007d ] };
- key <AD12> { [ 0x1000686, 0x100005b, 0x100007b ] };
-
- key <AC01> { [ Arabic_sheen, 0x100069a ] };
- key <AC02> { [ Arabic_seen, Arabic_hamzaonyeh, 0x10006d2 ] };
- key <AC03> { [ 0x10006cc, Arabic_yeh, 0x1000649 ] };
- key <AC04> { [ Arabic_beh, 0x100067e, 0x10006ba ] };
- key <AC05> { [ Arabic_lam, Arabic_hamzaonalef, 0x10006b7 ] };
- key <AC06> { [ Arabic_alef, Arabic_maddaonalef, 0x1000671 ] };
- key <AC07> { [ Arabic_teh, 0x100067c, 0x1000679 ] };
- key <AC08> { [ Arabic_noon, 0x10006bc, 0x100003e ] };
- key <AC09> { [ Arabic_meem, 0x1000629, 0x100003c ] };
- key <AC10> { [ 0x10006a9, colon, 0x1000643 ] };
- key <AC11> { [ 0x10006ab, Arabic_semicolon, 0x10006af ] };
-
- key <BKSL> { [ backslash, 0x100002a, 0x100007c ] };
-
- key <AB01> { [ 0x10006cd, 0x1000638, 0x100003f] };
- key <AB02> { [ 0x10006d0, 0x1000637, 0x100003b ] };
- key <AB03> { [ Arabic_zain, 0x1000698, 0x1000655 ] };
- key <AB04> { [ Arabic_ra, 0x1000621, 0x1000654 ] };
- key <AB05> { [ Arabic_thal, 0x100200c, 0x1000625 ] };
- key <AB06> { [ Arabic_dal, 0x1000689, 0x1000688 ] };
- key <AB07> { [ 0x1000693, 0x1000624, 0x1000691 ] };
- key <AB08> { [ Arabic_waw, 0x100060c, 0x100002c ] };
- key <AB09> { [ 0x1000696, 0x100002e, 0x10006c7 ] };
- key <AB10> { [ slash, Arabic_question_mark, 0x10006c9 ] };
-
- include "nbsp(zwnj2nb3)"
- include "level3(ralt_switch)"
-};
-
-// Keymap for the Afghan southern uzbek keybord layout
-// Based on the specification "Computer Locale Requirements for
-// Afghanstan" [1] from the "United Nations Development Programme
-// Afghanistan"" and the "Afghan Transitional Islamic
-// Administration Ministry of Communications".
-// [1] http://www.evertype.com/standards/af/
-// For a MINI HOWTO see [2].
-// [2] http://www.afghanischerKulturverein.de/en/afghanComputer_en.php
-//
-// 2006-02-15 file created by M. Emal Alekozai <memala@gmx.net>
-
-partial alphanumeric_keys
-xkb_symbols "uz" {
- name[Group1]= "Afghanistan - Southern Uzbek";
-
- key <TLDE> { [ 0x100200d, 0x10000f7, dead_tilde ] };
- key <AE01> { [ 0x10006f1, exclam, 0x1000060 ] };
- key <AE02> { [ 0x10006f2, 0x100066c, 0x1000040 ] };
- key <AE03> { [ 0x10006f3, 0x100066b, numbersign ] };
- key <AE04> { [ 0x10006f4, 0x100e60b, 0x1000024] };
- key <AE05> { [ 0x10006f5, 0x100066a, 0x1000025 ] };
- key <AE06> { [ 0x10006f6, multiply, 0x100005e ] };
- key <AE07> { [ 0x10006f7, Arabic_comma, 0x1000026 ] };
- key <AE08> { [ 0x10006f8, asterisk, 0x1002022 ] };
- key <AE09> { [ 0x10006f9, 0x1000029, 0x100200e ] };
- key <AE10> { [ 0x10006f0, 0x1000028, 0x100200f ] };
- key <AE11> { [ minus, Arabic_tatweel, 0x100005f ] };
- key <AE12> { [ plus, equal ] };
-
- key <AD01> { [ Arabic_dad, Arabic_sukun, 0x10000b0 ] };
- key <AD02> { [ Arabic_sad, Arabic_dammatan, 0x1000653 ] };
- key <AD03> { [ Arabic_theh, Arabic_kasratan, 0x10020ac ] };
- key <AD04> { [ Arabic_qaf, Arabic_fathatan, 0x100fd3e ] };
- key <AD05> { [ Arabic_feh, Arabic_damma, 0x100fd3f ] };
- key <AD06> { [ Arabic_ghain, Arabic_kasra, 0x100e656] };
- key <AD07> { [ Arabic_ain, Arabic_fatha, 0x100e659] };
- key <AD08> { [ Arabic_heh, Arabic_shadda, 0x1000670] };
- key <AD09> { [ Arabic_khah, bracketright, 0x1000027] };
- key <AD10> { [ Arabic_hah, bracketleft, 0x1000022] };
- key <AD11> { [ Arabic_jeem, braceright, 0x1000681 ] };
- key <AD12> { [ 0x1000686, braceleft, 0x1000685 ] };
-
- key <AC01> { [ Arabic_sheen, Arabic_hamzaonwaw, 0x100069a ] };
- key <AC02> { [ Arabic_seen, Arabic_hamzaonyeh, 0x10006cd ] };
- key <AC03> { [ 0x10006cc, Arabic_yeh, 0x1000649 ] };
- key <AC04> { [ Arabic_beh, 0x10006d0, 0x1000643 ] };
- key <AC05> { [ Arabic_lam, Arabic_hamzaonalef, 0x10006b7 ] };
- key <AC06> { [ Arabic_alef, Arabic_maddaonalef, 0x1000671 ] };
- key <AC07> { [ Arabic_teh, Arabic_tehmarbuta, 0x100067c ] };
- key <AC08> { [ Arabic_noon, 0x10000bb, 0x10006bc ] };
- key <AC09> { [ Arabic_meem, 0x10000ab, 0x10006ba ] };
- key <AC10> { [ 0x10006a9, colon, 0x100003b ] };
- key <AC11> { [ 0x10006af, Arabic_semicolon, 0x10006ab ] };
-
- key <BKSL> { [ backslash, bar, 0x100003f ] };
-
- key <AB01> { [ Arabic_zah, 0x10006c9, 0x10006d2] };
- key <AB02> { [ Arabic_tah, 0x10006c7, 0x1000691 ] };
- key <AB03> { [ Arabic_zain, 0x1000698, 0x1000696 ] };
- key <AB04> { [ Arabic_ra, 0x1000625, 0x1000693 ] };
- key <AB05> { [ Arabic_thal, 0x100200c, 0x1000688 ] };
- key <AB06> { [ Arabic_dal, 0x1000654, 0x1000689 ] };
- key <AB07> { [ 0x100067e, Arabic_hamza, 0x1000679 ] };
- key <AB08> { [ Arabic_waw, greater, 0x100002c ] };
- key <AB09> { [ period, less ] };
- key <AB10> { [ slash, Arabic_question_mark, 0x1000655 ] };
-
- include "nbsp(zwnj2nb3)"
- include "level3(ralt_switch)"
-};
-
-partial alphanumeric_keys
-xkb_symbols "olpc-ps" {
-
- name[Group1]= "Afghanistan - OLPC Pashto";
-
- key <TLDE> { [ 0x100200D, 0x1000654, grave ] }; // zero width joiner, Arabic hamza above
- key <AE01> { [ 0x10006F1, exclam, asciitilde ] }; // Arabic one
- key <AE02> { [ 0x10006F2, 0x100066C, at ] }; // Arabic two, Arabic thousands separator
- key <AE03> { [ 0x10006F3, 0x100066B, numbersign ] }; // Arabic three, Arabic decimal separator
- key <AE04> { [ 0x10006F4, 0x100060B, dollar ] }; // Arabic four, Afghani sign
- key <AE05> { [ 0x10006F5, 0x100066A, percent ] }; // Arabic five, Arabic percent sign
- key <AE06> { [ 0x10006F6, multiply, asciicircum ] }; // Arabic six
- key <AE07> { [ 0x10006F7, guillemotright, ampersand ] }; // Arabic seven
- key <AE08> { [ 0x10006F8, guillemotleft, 0x100066D ] }; // Arabic eight, Arabic five-pointed star
- 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 <AD01> { [ 0x1000636, 0x1000652, EuroSign ] }; // Arabic dad, Arabic sukun
- key <AD02> { [ 0x1000635, 0x100064C, 0x1000671 ] }; // Arabic sad, Arabic dammatan, Arabic alef walsa
- key <AD03> { [ 0x100062B, 0x100064D, 0x1000649 ] }; // Arabic theh, Arabic kasratan, Arabic alef maksura initial form
- key <AD04> { [ 0x1000642, 0x100064B, 0x100200E ] }; // Arabic qaf, Arabic fathatan, left-to-right mark
- key <AD05> { [ 0x1000641, 0x100064F, 0x100200F ] }; // Arabic feh, Arabic damma, right-to-left mark
- key <AD06> { [ 0x100063A, 0x1000650, 0x100e653 ] }; // Arabic ghain, Arabic kasra, Arabic alef with madda above
- key <AD07> { [ 0x1000639, 0x100064E, 0x100e659 ] }; // Arabic ain, Arabic fatha, Arabic zwarakay
- key <AD08> { [ 0x1000647, 0x1000651, 0x1000670 ] }; // Arabic heh, Arabic shadda, Arabic superscript alef
- key <AD09> { [ 0x100062E, 0x1000681, apostrophe ] }; // Arabic khah, Arabic hah with hamza above,
- key <AD10> { [ 0x100062D, 0x1000685, quotedbl ] }; // Arabic hah, Arabic hah with three dots above
- key <AD11> { [ 0x100062C, bracketright, braceleft ] }; // Arabic jeem
- key <AD12> { [ 0x1000686, bracketleft, braceright ] }; // Arabic tcheh
-
- key <AC01> { [ 0x1000634, 0x100069A ] }; // Arabic sheen, Arabic seen with dot below and dot above
- key <AC02> { [ 0x1000633, 0x10006CD ] }; // Arabic seen, Arabic yeh with tail
- key <AC03> { [ 0x10006CC, 0x100064A, 0x10006D2 ] }; // Farsi yeh, Arabic yeh, Arabic yeh barree
- key <AC04> { [ 0x1000628, 0x100067E, 0x10006BA ] }; // Arabic beh, Arabic peh, Arabic noon ghunna
- key <AC05> { [ 0x1000644, 0x1000623, 0x10006B7 ] }; // Arabic lam, Arabic hamza on alef, Arabic alef with hamza above
- key <AC06> { [ 0x1000627, 0x1000622, 0x1000625 ] }; // Arabic alef, Arabic madda on alef, Arabic alef with hamza below
- key <AC07> { [ 0x100062A, 0x100067C, 0x1000679 ] }; // Arabic teh, Arabic teh with ring, Arabic tteh
- key <AC08> { [ 0x1000646, 0x10006BC, greater ] }; // Arabic noon, Arabic noon with ring
- key <AC09> { [ 0x1000645, 0x1000629, less ] }; // Arabic meem, Arabic teh marbuta
- key <AC10> { [ 0x10006A9, colon, 0x1000643 ] }; // Arabic keheh, Arabic kaf
- key <AC11> { [ 0x10006AB, 0x100061B, 0x10006AF ] }; // Arabic kaf with ring, Arabic semicolon, Arabic gaf
-
- key <BKSL> { [ backslash, asterisk, bar ] };
-
- key <AB01> { [ 0x1000638, 0x1000626, question] }; // Arabic zah, Arabic yeh with hamza above
- key <AB02> { [ 0x10006D0, 0x1000637, semicolon ] }; // Arabic tah, Arabic E
- key <AB03> { [ 0x1000632, 0x1000698 ] }; // Arabic zain, Arabic jeh
- key <AB04> { [ 0x1000631, 0x1000621 ] }; // Arabic_ra (reh?), Arabic hamza
- key <AB05> { [ 0x1000630, 0x100200C ] }; // Arabic_thal, zero width non-joiner
- key <AB06> { [ 0x100062F, 0x1000689, 0x1000688 ] }; // Arabic_dal, Arabic dal with ring, Arabic ddal
- key <AB07> { [ 0x1000693, 0x1000624, 0x1000691 ] }; // Arabic reh with ring, Arabic waw with hamza above, Arabic rreh
- key <AB08> { [ 0x1000648, period, comma ] }; // Arabic_waw, Arabic comma
- key <AB09> { [ 0x1000696, 0x100002E, 0x10006C7 ] }; // Arabic reh with dot below and dot above, full stop, Arabic letter U
- key <AB10> { [ slash, 0x100061F, 0x10006C9 ] }; // Arabic question mark, Arabic kirghiz yu
-
- include "nbsp(zwnj2nb3)"
- include "group(olpc)"
-};
-
-partial alphanumeric_keys
-xkb_symbols "olpc-fa" {
-
- name[Group1]= "Afghanistan - OLPC Dari";
-
- key <TLDE> { [ 0x100200D, division, asciitilde ] }; // zero width joiner
- key <AE01> { [ 0x10006F1, exclam, grave ] }; // Arabic one
- key <AE02> { [ 0x10006F2, 0x100066C, at ] }; // Arabic two, Arabic thousands separator
- key <AE03> { [ 0x10006F3, 0x100066B, numbersign ] }; // Arabic three, Arabic decimal separator
- key <AE04> { [ 0x10006F4, 0x100060B, dollar ] }; // Arabic four, Afghani sign
- key <AE05> { [ 0x10006F5, 0x100066A, percent ] }; // Arabic five, Arabic percent sign
- key <AE06> { [ 0x10006F6, multiply, asciicircum ] }; // Arabic six
- key <AE07> { [ 0x10006F7, 0x100060C, ampersand ] }; // Arabic seven, Arabic comma
- key <AE08> { [ 0x10006F8, asterisk, enfilledcircbullet ] }; // Arabic eight,
- 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 <AD01> { [ 0x1000636, 0x1000652, degree ] }; // Arabic dad, Arabic sukun
- key <AD02> { [ 0x1000635, 0x100064C ] }; // Arabic sad, Arabic dammatan
- key <AD03> { [ 0x100062B, 0x100064D, EuroSign ] }; // Arabic theh, Arabic kasratan
- key <AD04> { [ 0x1000642, 0x100064B, 0x100FD3E ] }; // Arabic qaf, Arabic fathatan, ornate left paren
- key <AD05> { [ 0x1000641, 0x100064F, 0x100FD3F ] }; // Arabic feh, Arabic damma, ornate right paren
- key <AD06> { [ 0x100063A, 0x1000650, 0x1000656 ] }; // Arabic ghain, Arabic kasra, Arabic subscript alef
- key <AD07> { [ 0x1000639, 0x100064E, 0x100e659 ] }; // Arabic ain, Arabic fatha, Arabic zwarakay
- key <AD08> { [ 0x1000647, 0x1000651, 0x1000655 ] }; // Arabic heh, Arabic shadda, Arabic hamza below
- key <AD09> { [ 0x100062E, bracketright, apostrophe ] }; // Arabic khah
- key <AD10> { [ 0x100062D, bracketleft, quotedbl ] }; // Arabic hah
- key <AD11> { [ 0x100062C, braceright, 0x1000681 ] }; // Arabic jeem, Arabic hah with hamza above
- key <AD12> { [ 0x1000686, braceleft, 0x1000685 ] }; // Arabic tcheh, Arabic hah with three dots above
-
- key <AC01> { [ 0x1000634, 0x1000624, 0x100069A ] }; // Arabic sheen, Arabic waw with hamza above, Arabic seen with dot below and dot above
- key <AC02> { [ 0x1000633, 0x1000626, 0x10006CD ] }; // Arabic seen, Arabic yeh with hamza above, Arabic yeh with tail
- key <AC03> { [ 0x10006CC, 0x100064A, 0x1000649 ] }; // Farsi yeh, Arabic yeh, Arabic alef maksura
- key <AC04> { [ 0x1000628, 0x1000625, 0x10006D0 ] }; // Arabic beh, Arabic alef with hamza below, Arabic e
- key <AC05> { [ 0x1000644, 0x1000623, 0x10006B7 ] }; // Arabic lam, Arabic hamza on alef, Arabic alef with hamza above
- key <AC06> { [ 0x1000627, 0x1000622, 0x1000671 ] }; // Arabic alef, Arabic madda on alef, Arabic alef wasla
- key <AC07> { [ 0x100062A, 0x1000629, 0x100067C ] }; // Arabic teh, Arabic teh marbuta, Arabic tteh
- key <AC08> { [ 0x1000646, guillemotright, 0x10006BC ] }; // Arabic noon, Arabic noon with ring
- key <AC09> { [ 0x1000645, guillemotleft, 0x10006BA ] }; // Arabic meem, Arabic noon ghunna
- key <AC10> { [ 0x10006A9, colon, semicolon ] }; // Arabic keheh,
- key <AC11> { [ 0x10006AF, 0x100061B, 0x10006AB ] }; // Arabic gaf, Arabic semicolon, Arabic kaf with ring
-
- key <BKSL> { [ backslash, bar, question ] };
-
- key <AB01> { [ 0x1000638, 0x1000643, 0x10006D2 ] }; // Arabic zah, Arabic kaf, Arabic yeh barree
- key <AB02> { [ 0x1000637, 0x1000653, 0x1000691 ] }; // Arabic tah, Arabic maddah above, Arabic rreh
- key <AB03> { [ 0x1000632, 0x1000698, 0x1000696 ] }; // Arabic zain, Arabic jeh, Arabic reh with dot below and dot above
- key <AB04> { [ 0x1000631, 0x1000670, 0x1000693 ] }; // Arabic_ra (reh?), Arabic superscript alef, Arabic reh with ring
- key <AB05> { [ 0x1000630, 0x100200C, 0x1000688 ] }; // Arabic_thal, zero width non-joiner, Arabic ddal
- key <AB06> { [ 0x100062F, 0x1000654, 0x1000689 ] }; // Arabic dal, Arabic hamza above, Arabic dal with ring
- key <AB07> { [ 0x100067E, 0x1000621, 0x1000679 ] }; // Arabic peh, Arabic hamza, Arabic tteh
- key <AB08> { [ 0x1000648, greater, comma ] }; // Arabic_waw
- key <AB09> { [ period, less, 0x10006C7 ] }; // Arabic u
- key <AB10> { [ slash, 0x100061F, 0x10006C9 ] }; // Arabic question mark, Arabic kirghiz yu
-
- include "nbsp(zwnj2nb3)"
- include "group(olpc)"
-};
-
-partial alphanumeric_keys
-xkb_symbols "olpc-uz" {
-
- name[Group1]= "Afghanistan - OLPC Southern Uzbek";
-
- key <TLDE> { [ 0x100200D, division, asciitilde ] }; // zero width joiner
- key <AE01> { [ 0x10006F1, exclam, grave ] }; // Arabic one
- key <AE02> { [ 0x10006F2, 0x100066C, at ] }; // Arabic two, Arabic thousands separator
- key <AE03> { [ 0x10006F3, 0x100066B, numbersign ] }; // Arabic three, Arabic decimal separator
- key <AE04> { [ 0x10006F4, 0x100060B, dollar ] }; // Arabic four, Afghani sign
- key <AE05> { [ 0x10006F5, 0x100066A, percent ] }; // Arabic five, Arabic percent sign
- key <AE06> { [ 0x10006F6, multiply, asciicircum ] }; // Arabic six
- key <AE07> { [ 0x10006F7, 0x100060C, ampersand ] }; // Arabic seven, Arabic comma
- key <AE08> { [ 0x10006F8, asterisk, enfilledcircbullet ] }; // Arabic eight,
- 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 <AD01> { [ 0x1000636, 0x1000652, degree ] }; // Arabic dad, Arabic sukun
- key <AD02> { [ 0x1000635, 0x100064C, 0x1000653 ] }; // Arabic sad, Arabic dammatan, Arabic maddah above
- key <AD03> { [ 0x100062B, 0x100064D, EuroSign ] }; // Arabic theh, Arabic kasratan
- key <AD04> { [ 0x1000642, 0x100064B, 0x100FD3E ] }; // Arabic qaf, Arabic fathatan, ornate left paren
- key <AD05> { [ 0x1000641, 0x100064F, 0x100FD3F ] }; // Arabic feh, Arabic damma, ornate right paren
- key <AD06> { [ 0x100063A, 0x1000650, 0x1000656 ] }; // Arabic ghain, Arabic kasra, Arabic subscript alef
- key <AD07> { [ 0x1000639, 0x100064E, 0x100e659 ] }; // Arabic ain, Arabic fatha, Arabic zwarakay
- key <AD08> { [ 0x1000647, 0x1000651, 0x1000670 ] }; // Arabic heh, Arabic shadda, Arabic superscript alef
- key <AD09> { [ 0x100062E, bracketright, apostrophe ] }; // Arabic khah
- key <AD10> { [ 0x100062D, bracketleft, quotedbl ] }; // Arabic hah
- key <AD11> { [ 0x100062C, braceright, 0x1000681 ] }; // Arabic jeem, Arabic hah with hamza above
- key <AD12> { [ 0x1000686, braceleft, 0x1000685 ] }; // Arabic tcheh, Arabic hah with three dots above
-
- key <AC01> { [ 0x1000634, 0x1000624, 0x100069A ] }; // Arabic sheen, Arabic waw with hamza above, Arabic seen with dot below and dot above
- key <AC02> { [ 0x1000633, 0x1000626, 0x10006CD ] }; // Arabic seen, Arabic yeh with hamza above, Arabic yeh with tail
- key <AC03> { [ 0x10006CC, 0x100064A, 0x1000649 ] }; // Farsi yeh, Arabic yeh, Arabic alef maksura
- key <AC04> { [ 0x1000628, 0x10006D0, 0x1000643 ] }; // Arabic beh, Arabic e, Arabic kaf
- key <AC05> { [ 0x1000644, 0x1000623, 0x10006B7 ] }; // Arabic lam, Arabic hamza on alef, Arabic alef with hamza above
- key <AC06> { [ 0x1000627, 0x1000622, 0x1000671 ] }; // Arabic alef, Arabic madda on alef, Arabic alef wasla
- key <AC07> { [ 0x100062A, 0x1000629, 0x100067C ] }; // Arabic teh, Arabic teh marbuta, Arabic tteh
- key <AC08> { [ 0x1000646, guillemotright, 0x10006BC ] }; // Arabic noon, Arabic noon with ring
- key <AC09> { [ 0x1000645, guillemotleft, 0x10006BA ] }; // Arabic meem, Arabic noon ghunna
- key <AC10> { [ 0x10006A9, colon, semicolon ] }; // Arabic keheh,
- key <AC11> { [ 0x10006AF, 0x100061B, 0x10006AB ] }; // Arabic gaf, Arabic semicolon, Arabic kaf with ring
-
- key <BKSL> { [ backslash, bar, question ] };
-
- key <AB01> { [ 0x1000638, 0x10006C9, 0x10006D2 ] }; // Arabic zah, Arabic kirghiz yu, Arabic yeh barree
- key <AB02> { [ 0x1000637, 0x10006C7, 0x1000691 ] }; // Arabic tah, Arabic u, Arabic rreh
- key <AB03> { [ 0x1000632, 0x1000698, 0x1000696 ] }; // Arabic zain, Arabic jeh, Arabic reh with dot below and dot above
- key <AB04> { [ 0x1000631, 0x1000625, 0x1000693 ] }; // Arabic_ra (reh?), Arabic alef with hamza below, Arabic reh with ring
- key <AB05> { [ 0x1000630, 0x100200C, 0x1000688 ] }; // Arabic_thal, zero width non-joiner, Arabic ddal
- key <AB06> { [ 0x100062F, 0x1000654, 0x1000689 ] }; // Arabic dal, Arabic hamza above, Arabic dal with ring
- key <AB07> { [ 0x100067E, 0x1000621, 0x1000679 ] }; // Arabic peh, Arabic hamza, Arabic tteh
- key <AB08> { [ 0x1000648, greater, comma ] }; // Arabic_waw
- key <AB09> { [ period, less ] };
- key <AB10> { [ slash, 0x100061F, 0x1000655 ] }; // Arabic question mark, Arabic hamza below
-
- include "nbsp(zwnj2nb3)"
- include "group(olpc)"
-};
+// +// Keymap for the Afghan dari keybord layout +// Based on the specification "Computer Locale Requirements for +// Afghanstan" [1] from the "United Nations Development Programme +// Afghanistan" and the "Afghan Transitional Islamic +// Administration Ministry of Communications". +// [1] http://www.evertype.com/standards/af/ +// For a MINI HOWTO see [2]. +// [2] http://www.afghanischerKulturverein.de/en/afghanComputer_en.php +// +// 2006-02-15 file created by M. Emal Alekozai <memala@gmx.net> + +partial default alphanumeric_keys +xkb_symbols "basic" { + //name[Group1]= "Afghanistan Dari"; + name[Group1]= "Afghanistan"; + + key <TLDE> { [ 0x100200d, 0x10000f7, dead_tilde ] }; + key <AE01> { [ 0x10006f1, exclam, 0x1000060 ] }; + key <AE02> { [ 0x10006f2, 0x100066c, 0x1000040 ] }; + key <AE03> { [ 0x10006f3, 0x100066b, numbersign ] }; + key <AE04> { [ 0x10006f4, 0x100e60b, 0x1000024] }; + key <AE05> { [ 0x10006f5, 0x100066a, 0x1000025 ] }; + key <AE06> { [ 0x10006f6, multiply, 0x100005e ] }; + key <AE07> { [ 0x10006f7, Arabic_comma, 0x1000026 ] }; + key <AE08> { [ 0x10006f8, asterisk, 0x1002022 ] }; + key <AE09> { [ 0x10006f9, 0x1000029, 0x100200e ] }; + key <AE10> { [ 0x10006f0, 0x1000028, 0x100200f ] }; + key <AE11> { [ minus, Arabic_tatweel, 0x100005f ] }; + key <AE12> { [ plus, equal ] }; + + key <AD01> { [ Arabic_dad, Arabic_sukun, 0x10000b0 ] }; + key <AD02> { [ Arabic_sad, Arabic_dammatan ] }; + key <AD03> { [ Arabic_theh, Arabic_kasratan, 0x10020ac ] }; + key <AD04> { [ Arabic_qaf, Arabic_fathatan, 0x100fd3e ] }; + key <AD05> { [ Arabic_feh, Arabic_damma, 0x100fd3f ] }; + key <AD06> { [ Arabic_ghain, Arabic_kasra, 0x100e656] }; + key <AD07> { [ Arabic_ain, Arabic_fatha, 0x100e659] }; + key <AD08> { [ Arabic_heh, Arabic_shadda, 0x1000655] }; + key <AD09> { [ Arabic_khah, bracketright, 0x1000027] }; + key <AD10> { [ Arabic_hah, bracketleft, 0x1000022] }; + key <AD11> { [ Arabic_jeem, braceright, 0x1000681 ] }; + key <AD12> { [ 0x1000686, braceleft, 0x1000685 ] }; + + key <AC01> { [ Arabic_sheen, Arabic_hamzaonwaw, 0x100069a ] }; + key <AC02> { [ Arabic_seen, Arabic_hamzaonyeh, 0x10006cd ] }; + key <AC03> { [ 0x10006cc, Arabic_yeh, 0x1000649 ] }; + key <AC04> { [ Arabic_beh, Arabic_hamzaunderalef, 0x10006d0 ] }; + key <AC05> { [ Arabic_lam, Arabic_hamzaonalef, 0x10006b7 ] }; + key <AC06> { [ Arabic_alef, Arabic_maddaonalef, 0x1000671 ] }; + key <AC07> { [ Arabic_teh, Arabic_tehmarbuta, 0x100067c ] }; + key <AC08> { [ Arabic_noon, 0x10000bb, 0x10006bc ] }; + key <AC09> { [ Arabic_meem, 0x10000ab, 0x10006ba ] }; + key <AC10> { [ 0x10006a9, colon, 0x100003b ] }; + key <AC11> { [ 0x10006af, Arabic_semicolon, 0x10006ab ] }; + + key <BKSL> { [ backslash, bar, 0x100003f ] }; + + key <AB01> { [ Arabic_zah, Arabic_kaf, 0x10006d2] }; + key <AB02> { [ Arabic_tah, 0x1000653 , 0x1000691 ] }; + key <AB03> { [ Arabic_zain, 0x1000698, 0x1000696 ] }; + key <AB04> { [ Arabic_ra, 0x1000670 , 0x1000693 ] }; + key <AB05> { [ Arabic_thal, 0x100200c, 0x1000688 ] }; + key <AB06> { [ Arabic_dal, 0x1000654, 0x1000689 ] }; + key <AB07> { [ 0x100067e, Arabic_hamza, 0x1000679 ] }; + key <AB08> { [ Arabic_waw, greater, 0x100002c ] }; + key <AB09> { [ period, less, 0x10006c7 ] }; + key <AB10> { [ slash, Arabic_question_mark, 0x10006c9 ] }; + + include "nbsp(zwnj2nb3)" + include "level3(ralt_switch)" +}; + +// Keymap for the Afghan pashto keybord layout +// Based on the specification "Computer Locale Requirements for +// Afghanstan" [1] from the "United Nations Development Programme +// Afghanistan"" and the "Afghan Transitional Islamic +// Administration Ministry of Communications". +// [1] http://www.evertype.com/standards/af/ +// For a MINI HOWTO see [2]. +// [2] http://www.afghanischerKulturverein.de/en/afghanComputer_en.php +// +// 2006-02-15 file created by M. Emal Alekozai <memala@gmx.net> + +partial alphanumeric_keys +xkb_symbols "ps" { + name[Group1]= "Afghanistan - Pashto"; + + key <TLDE> { [ 0x100200d, 0x10000f7, dead_tilde ] }; + key <AE01> { [ 0x10006f1, exclam, 0x1000060 ] }; + key <AE02> { [ 0x10006f2, 0x100066c, 0x1000040 ] }; + key <AE03> { [ 0x10006f3, 0x100066b, numbersign ] }; + key <AE04> { [ 0x10006f4, 0x100e60b, 0x1000024] }; + key <AE05> { [ 0x10006f5, 0x100066a, 0x1000025 ] }; + key <AE06> { [ 0x10006f6, multiply, 0x100005e ] }; + key <AE07> { [ 0x10006f7, 0x10000bb, 0x1000026 ] }; + key <AE08> { [ 0x10006f8, 0x10000ab, 0x1002022 ] }; + key <AE09> { [ 0x10006f9, 0x1000029, 0x100200e ] }; + key <AE10> { [ 0x10006f0, 0x1000028, 0x100200f ] }; + key <AE11> { [ minus, Arabic_tatweel, 0x100005f ] }; + key <AE12> { [ plus, equal ] }; + + key <AD01> { [ Arabic_dad, Arabic_sukun, 0x10000b0 ] }; + key <AD02> { [ Arabic_sad, Arabic_dammatan, 0x1000653 ] }; + key <AD03> { [ Arabic_theh, Arabic_kasratan, 0x10020ac ] }; + key <AD04> { [ Arabic_qaf, Arabic_fathatan, 0x100fd3e ] }; + key <AD05> { [ Arabic_feh, Arabic_damma, 0x100fd3f ] }; + key <AD06> { [ Arabic_ghain, Arabic_kasra, 0x100e656] }; + key <AD07> { [ Arabic_ain, Arabic_fatha, 0x100e659] }; + key <AD08> { [ Arabic_heh, Arabic_shadda, 0x1000670] }; + key <AD09> { [ Arabic_khah, 0x1000681, 0x1000027] }; + key <AD10> { [ Arabic_hah, 0x1000685, 0x1000022] }; + key <AD11> { [ Arabic_jeem, 0x100005d, 0x100007d ] }; + key <AD12> { [ 0x1000686, 0x100005b, 0x100007b ] }; + + key <AC01> { [ Arabic_sheen, 0x100069a ] }; + key <AC02> { [ Arabic_seen, Arabic_hamzaonyeh, 0x10006d2 ] }; + key <AC03> { [ 0x10006cc, Arabic_yeh, 0x1000649 ] }; + key <AC04> { [ Arabic_beh, 0x100067e, 0x10006ba ] }; + key <AC05> { [ Arabic_lam, Arabic_hamzaonalef, 0x10006b7 ] }; + key <AC06> { [ Arabic_alef, Arabic_maddaonalef, 0x1000671 ] }; + key <AC07> { [ Arabic_teh, 0x100067c, 0x1000679 ] }; + key <AC08> { [ Arabic_noon, 0x10006bc, 0x100003e ] }; + key <AC09> { [ Arabic_meem, 0x1000629, 0x100003c ] }; + key <AC10> { [ 0x10006a9, colon, 0x1000643 ] }; + key <AC11> { [ 0x10006ab, Arabic_semicolon, 0x10006af ] }; + + key <BKSL> { [ backslash, 0x100002a, 0x100007c ] }; + + key <AB01> { [ 0x10006cd, 0x1000638, 0x100003f] }; + key <AB02> { [ 0x10006d0, 0x1000637, 0x100003b ] }; + key <AB03> { [ Arabic_zain, 0x1000698, 0x1000655 ] }; + key <AB04> { [ Arabic_ra, 0x1000621, 0x1000654 ] }; + key <AB05> { [ Arabic_thal, 0x100200c, 0x1000625 ] }; + key <AB06> { [ Arabic_dal, 0x1000689, 0x1000688 ] }; + key <AB07> { [ 0x1000693, 0x1000624, 0x1000691 ] }; + key <AB08> { [ Arabic_waw, 0x100060c, 0x100002c ] }; + key <AB09> { [ 0x1000696, 0x100002e, 0x10006c7 ] }; + key <AB10> { [ slash, Arabic_question_mark, 0x10006c9 ] }; + + include "nbsp(zwnj2nb3)" + include "level3(ralt_switch)" +}; + +// Keymap for the Afghan southern uzbek keybord layout +// Based on the specification "Computer Locale Requirements for +// Afghanstan" [1] from the "United Nations Development Programme +// Afghanistan"" and the "Afghan Transitional Islamic +// Administration Ministry of Communications". +// [1] http://www.evertype.com/standards/af/ +// For a MINI HOWTO see [2]. +// [2] http://www.afghanischerKulturverein.de/en/afghanComputer_en.php +// +// 2006-02-15 file created by M. Emal Alekozai <memala@gmx.net> + +partial alphanumeric_keys +xkb_symbols "uz" { + name[Group1]= "Afghanistan - Southern Uzbek"; + + key <TLDE> { [ 0x100200d, 0x10000f7, dead_tilde ] }; + key <AE01> { [ 0x10006f1, exclam, 0x1000060 ] }; + key <AE02> { [ 0x10006f2, 0x100066c, 0x1000040 ] }; + key <AE03> { [ 0x10006f3, 0x100066b, numbersign ] }; + key <AE04> { [ 0x10006f4, 0x100e60b, 0x1000024] }; + key <AE05> { [ 0x10006f5, 0x100066a, 0x1000025 ] }; + key <AE06> { [ 0x10006f6, multiply, 0x100005e ] }; + key <AE07> { [ 0x10006f7, Arabic_comma, 0x1000026 ] }; + key <AE08> { [ 0x10006f8, asterisk, 0x1002022 ] }; + key <AE09> { [ 0x10006f9, 0x1000029, 0x100200e ] }; + key <AE10> { [ 0x10006f0, 0x1000028, 0x100200f ] }; + key <AE11> { [ minus, Arabic_tatweel, 0x100005f ] }; + key <AE12> { [ plus, equal ] }; + + key <AD01> { [ Arabic_dad, Arabic_sukun, 0x10000b0 ] }; + key <AD02> { [ Arabic_sad, Arabic_dammatan, 0x1000653 ] }; + key <AD03> { [ Arabic_theh, Arabic_kasratan, 0x10020ac ] }; + key <AD04> { [ Arabic_qaf, Arabic_fathatan, 0x100fd3e ] }; + key <AD05> { [ Arabic_feh, Arabic_damma, 0x100fd3f ] }; + key <AD06> { [ Arabic_ghain, Arabic_kasra, 0x100e656] }; + key <AD07> { [ Arabic_ain, Arabic_fatha, 0x100e659] }; + key <AD08> { [ Arabic_heh, Arabic_shadda, 0x1000670] }; + key <AD09> { [ Arabic_khah, bracketright, 0x1000027] }; + key <AD10> { [ Arabic_hah, bracketleft, 0x1000022] }; + key <AD11> { [ Arabic_jeem, braceright, 0x1000681 ] }; + key <AD12> { [ 0x1000686, braceleft, 0x1000685 ] }; + + key <AC01> { [ Arabic_sheen, Arabic_hamzaonwaw, 0x100069a ] }; + key <AC02> { [ Arabic_seen, Arabic_hamzaonyeh, 0x10006cd ] }; + key <AC03> { [ 0x10006cc, Arabic_yeh, 0x1000649 ] }; + key <AC04> { [ Arabic_beh, 0x10006d0, 0x1000643 ] }; + key <AC05> { [ Arabic_lam, Arabic_hamzaonalef, 0x10006b7 ] }; + key <AC06> { [ Arabic_alef, Arabic_maddaonalef, 0x1000671 ] }; + key <AC07> { [ Arabic_teh, Arabic_tehmarbuta, 0x100067c ] }; + key <AC08> { [ Arabic_noon, 0x10000bb, 0x10006bc ] }; + key <AC09> { [ Arabic_meem, 0x10000ab, 0x10006ba ] }; + key <AC10> { [ 0x10006a9, colon, 0x100003b ] }; + key <AC11> { [ 0x10006af, Arabic_semicolon, 0x10006ab ] }; + + key <BKSL> { [ backslash, bar, 0x100003f ] }; + + key <AB01> { [ Arabic_zah, 0x10006c9, 0x10006d2] }; + key <AB02> { [ Arabic_tah, 0x10006c7, 0x1000691 ] }; + key <AB03> { [ Arabic_zain, 0x1000698, 0x1000696 ] }; + key <AB04> { [ Arabic_ra, 0x1000625, 0x1000693 ] }; + key <AB05> { [ Arabic_thal, 0x100200c, 0x1000688 ] }; + key <AB06> { [ Arabic_dal, 0x1000654, 0x1000689 ] }; + key <AB07> { [ 0x100067e, Arabic_hamza, 0x1000679 ] }; + key <AB08> { [ Arabic_waw, greater, 0x100002c ] }; + key <AB09> { [ period, less ] }; + key <AB10> { [ slash, Arabic_question_mark, 0x1000655 ] }; + + include "nbsp(zwnj2nb3)" + include "level3(ralt_switch)" +}; + +partial alphanumeric_keys +xkb_symbols "olpc-ps" { + + name[Group1]= "Afghanistan - OLPC Pashto"; + + key <TLDE> { [ 0x100200D, 0x1000654, grave ] }; // zero width joiner, Arabic hamza above + key <AE01> { [ 0x10006F1, exclam, asciitilde ] }; // Arabic one + key <AE02> { [ 0x10006F2, 0x100066C, at ] }; // Arabic two, Arabic thousands separator + key <AE03> { [ 0x10006F3, 0x100066B, numbersign ] }; // Arabic three, Arabic decimal separator + key <AE04> { [ 0x10006F4, 0x100060B, dollar ] }; // Arabic four, Afghani sign + key <AE05> { [ 0x10006F5, 0x100066A, percent ] }; // Arabic five, Arabic percent sign + key <AE06> { [ 0x10006F6, multiply, asciicircum ] }; // Arabic six + key <AE07> { [ 0x10006F7, guillemotright, ampersand ] }; // Arabic seven + key <AE08> { [ 0x10006F8, guillemotleft, 0x100066D ] }; // Arabic eight, Arabic five-pointed star + 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 <AD01> { [ 0x1000636, 0x1000652, EuroSign ] }; // Arabic dad, Arabic sukun + key <AD02> { [ 0x1000635, 0x100064C, 0x1000671 ] }; // Arabic sad, Arabic dammatan, Arabic alef walsa + key <AD03> { [ 0x100062B, 0x100064D, 0x1000649 ] }; // Arabic theh, Arabic kasratan, Arabic alef maksura initial form + key <AD04> { [ 0x1000642, 0x100064B, 0x100200E ] }; // Arabic qaf, Arabic fathatan, left-to-right mark + key <AD05> { [ 0x1000641, 0x100064F, 0x100200F ] }; // Arabic feh, Arabic damma, right-to-left mark + key <AD06> { [ 0x100063A, 0x1000650, 0x100e653 ] }; // Arabic ghain, Arabic kasra, Arabic alef with madda above + key <AD07> { [ 0x1000639, 0x100064E, 0x100e659 ] }; // Arabic ain, Arabic fatha, Arabic zwarakay + key <AD08> { [ 0x1000647, 0x1000651, 0x1000670 ] }; // Arabic heh, Arabic shadda, Arabic superscript alef + key <AD09> { [ 0x100062E, 0x1000681, apostrophe ] }; // Arabic khah, Arabic hah with hamza above, + key <AD10> { [ 0x100062D, 0x1000685, quotedbl ] }; // Arabic hah, Arabic hah with three dots above + key <AD11> { [ 0x100062C, bracketright, braceleft ] }; // Arabic jeem + key <AD12> { [ 0x1000686, bracketleft, braceright ] }; // Arabic tcheh + + key <AC01> { [ 0x1000634, 0x100069A ] }; // Arabic sheen, Arabic seen with dot below and dot above + key <AC02> { [ 0x1000633, 0x10006CD ] }; // Arabic seen, Arabic yeh with tail + key <AC03> { [ 0x10006CC, 0x100064A, 0x10006D2 ] }; // Farsi yeh, Arabic yeh, Arabic yeh barree + key <AC04> { [ 0x1000628, 0x100067E, 0x10006BA ] }; // Arabic beh, Arabic peh, Arabic noon ghunna + key <AC05> { [ 0x1000644, 0x1000623, 0x10006B7 ] }; // Arabic lam, Arabic hamza on alef, Arabic alef with hamza above + key <AC06> { [ 0x1000627, 0x1000622, 0x1000625 ] }; // Arabic alef, Arabic madda on alef, Arabic alef with hamza below + key <AC07> { [ 0x100062A, 0x100067C, 0x1000679 ] }; // Arabic teh, Arabic teh with ring, Arabic tteh + key <AC08> { [ 0x1000646, 0x10006BC, greater ] }; // Arabic noon, Arabic noon with ring + key <AC09> { [ 0x1000645, 0x1000629, less ] }; // Arabic meem, Arabic teh marbuta + key <AC10> { [ 0x10006A9, colon, 0x1000643 ] }; // Arabic keheh, Arabic kaf + key <AC11> { [ 0x10006AB, 0x100061B, 0x10006AF ] }; // Arabic kaf with ring, Arabic semicolon, Arabic gaf + + key <BKSL> { [ backslash, asterisk, bar ] }; + + key <AB01> { [ 0x1000638, 0x1000626, question] }; // Arabic zah, Arabic yeh with hamza above + key <AB02> { [ 0x10006D0, 0x1000637, semicolon ] }; // Arabic tah, Arabic E + key <AB03> { [ 0x1000632, 0x1000698 ] }; // Arabic zain, Arabic jeh + key <AB04> { [ 0x1000631, 0x1000621 ] }; // Arabic_ra (reh?), Arabic hamza + key <AB05> { [ 0x1000630, 0x100200C ] }; // Arabic_thal, zero width non-joiner + key <AB06> { [ 0x100062F, 0x1000689, 0x1000688 ] }; // Arabic_dal, Arabic dal with ring, Arabic ddal + key <AB07> { [ 0x1000693, 0x1000624, 0x1000691 ] }; // Arabic reh with ring, Arabic waw with hamza above, Arabic rreh + key <AB08> { [ 0x1000648, period, comma ] }; // Arabic_waw, Arabic comma + key <AB09> { [ 0x1000696, 0x100002E, 0x10006C7 ] }; // Arabic reh with dot below and dot above, full stop, Arabic letter U + key <AB10> { [ slash, 0x100061F, 0x10006C9 ] }; // Arabic question mark, Arabic kirghiz yu + + include "nbsp(zwnj2nb3)" + include "group(olpc)" +}; + +partial alphanumeric_keys +xkb_symbols "fa-olpc" { + + name[Group1]= "Afghanistan - OLPC Dari"; + + key <TLDE> { [ 0x100200D, division, asciitilde ] }; // zero width joiner + key <AE01> { [ 0x10006F1, exclam, grave ] }; // Arabic one + key <AE02> { [ 0x10006F2, 0x100066C, at ] }; // Arabic two, Arabic thousands separator + key <AE03> { [ 0x10006F3, 0x100066B, numbersign ] }; // Arabic three, Arabic decimal separator + key <AE04> { [ 0x10006F4, 0x100060B, dollar ] }; // Arabic four, Afghani sign + key <AE05> { [ 0x10006F5, 0x100066A, percent ] }; // Arabic five, Arabic percent sign + key <AE06> { [ 0x10006F6, multiply, asciicircum ] }; // Arabic six + key <AE07> { [ 0x10006F7, 0x100060C, ampersand ] }; // Arabic seven, Arabic comma + key <AE08> { [ 0x10006F8, asterisk, enfilledcircbullet ] }; // Arabic eight, + 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 <AD01> { [ 0x1000636, 0x1000652, degree ] }; // Arabic dad, Arabic sukun + key <AD02> { [ 0x1000635, 0x100064C ] }; // Arabic sad, Arabic dammatan + key <AD03> { [ 0x100062B, 0x100064D, EuroSign ] }; // Arabic theh, Arabic kasratan + key <AD04> { [ 0x1000642, 0x100064B, 0x100FD3E ] }; // Arabic qaf, Arabic fathatan, ornate left paren + key <AD05> { [ 0x1000641, 0x100064F, 0x100FD3F ] }; // Arabic feh, Arabic damma, ornate right paren + key <AD06> { [ 0x100063A, 0x1000650, 0x1000656 ] }; // Arabic ghain, Arabic kasra, Arabic subscript alef + key <AD07> { [ 0x1000639, 0x100064E, 0x100e659 ] }; // Arabic ain, Arabic fatha, Arabic zwarakay + key <AD08> { [ 0x1000647, 0x1000651, 0x1000655 ] }; // Arabic heh, Arabic shadda, Arabic hamza below + key <AD09> { [ 0x100062E, bracketright, apostrophe ] }; // Arabic khah + key <AD10> { [ 0x100062D, bracketleft, quotedbl ] }; // Arabic hah + key <AD11> { [ 0x100062C, braceright, 0x1000681 ] }; // Arabic jeem, Arabic hah with hamza above + key <AD12> { [ 0x1000686, braceleft, 0x1000685 ] }; // Arabic tcheh, Arabic hah with three dots above + + key <AC01> { [ 0x1000634, 0x1000624, 0x100069A ] }; // Arabic sheen, Arabic waw with hamza above, Arabic seen with dot below and dot above + key <AC02> { [ 0x1000633, 0x1000626, 0x10006CD ] }; // Arabic seen, Arabic yeh with hamza above, Arabic yeh with tail + key <AC03> { [ 0x10006CC, 0x100064A, 0x1000649 ] }; // Farsi yeh, Arabic yeh, Arabic alef maksura + key <AC04> { [ 0x1000628, 0x1000625, 0x10006D0 ] }; // Arabic beh, Arabic alef with hamza below, Arabic e + key <AC05> { [ 0x1000644, 0x1000623, 0x10006B7 ] }; // Arabic lam, Arabic hamza on alef, Arabic alef with hamza above + key <AC06> { [ 0x1000627, 0x1000622, 0x1000671 ] }; // Arabic alef, Arabic madda on alef, Arabic alef wasla + key <AC07> { [ 0x100062A, 0x1000629, 0x100067C ] }; // Arabic teh, Arabic teh marbuta, Arabic tteh + key <AC08> { [ 0x1000646, guillemotright, 0x10006BC ] }; // Arabic noon, Arabic noon with ring + key <AC09> { [ 0x1000645, guillemotleft, 0x10006BA ] }; // Arabic meem, Arabic noon ghunna + key <AC10> { [ 0x10006A9, colon, semicolon ] }; // Arabic keheh, + key <AC11> { [ 0x10006AF, 0x100061B, 0x10006AB ] }; // Arabic gaf, Arabic semicolon, Arabic kaf with ring + + key <BKSL> { [ backslash, bar, question ] }; + + key <AB01> { [ 0x1000638, 0x1000643, 0x10006D2 ] }; // Arabic zah, Arabic kaf, Arabic yeh barree + key <AB02> { [ 0x1000637, 0x1000653, 0x1000691 ] }; // Arabic tah, Arabic maddah above, Arabic rreh + key <AB03> { [ 0x1000632, 0x1000698, 0x1000696 ] }; // Arabic zain, Arabic jeh, Arabic reh with dot below and dot above + key <AB04> { [ 0x1000631, 0x1000670, 0x1000693 ] }; // Arabic_ra (reh?), Arabic superscript alef, Arabic reh with ring + key <AB05> { [ 0x1000630, 0x100200C, 0x1000688 ] }; // Arabic_thal, zero width non-joiner, Arabic ddal + key <AB06> { [ 0x100062F, 0x1000654, 0x1000689 ] }; // Arabic dal, Arabic hamza above, Arabic dal with ring + key <AB07> { [ 0x100067E, 0x1000621, 0x1000679 ] }; // Arabic peh, Arabic hamza, Arabic tteh + key <AB08> { [ 0x1000648, greater, comma ] }; // Arabic_waw + key <AB09> { [ period, less, 0x10006C7 ] }; // Arabic u + key <AB10> { [ slash, 0x100061F, 0x10006C9 ] }; // Arabic question mark, Arabic kirghiz yu + + include "nbsp(zwnj2nb3)" + include "group(olpc)" +}; + +partial alphanumeric_keys +xkb_symbols "uz-olpc" { + + name[Group1]= "Afghanistan - OLPC Southern Uzbek"; + + key <TLDE> { [ 0x100200D, division, asciitilde ] }; // zero width joiner + key <AE01> { [ 0x10006F1, exclam, grave ] }; // Arabic one + key <AE02> { [ 0x10006F2, 0x100066C, at ] }; // Arabic two, Arabic thousands separator + key <AE03> { [ 0x10006F3, 0x100066B, numbersign ] }; // Arabic three, Arabic decimal separator + key <AE04> { [ 0x10006F4, 0x100060B, dollar ] }; // Arabic four, Afghani sign + key <AE05> { [ 0x10006F5, 0x100066A, percent ] }; // Arabic five, Arabic percent sign + key <AE06> { [ 0x10006F6, multiply, asciicircum ] }; // Arabic six + key <AE07> { [ 0x10006F7, 0x100060C, ampersand ] }; // Arabic seven, Arabic comma + key <AE08> { [ 0x10006F8, asterisk, enfilledcircbullet ] }; // Arabic eight, + 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 <AD01> { [ 0x1000636, 0x1000652, degree ] }; // Arabic dad, Arabic sukun + key <AD02> { [ 0x1000635, 0x100064C, 0x1000653 ] }; // Arabic sad, Arabic dammatan, Arabic maddah above + key <AD03> { [ 0x100062B, 0x100064D, EuroSign ] }; // Arabic theh, Arabic kasratan + key <AD04> { [ 0x1000642, 0x100064B, 0x100FD3E ] }; // Arabic qaf, Arabic fathatan, ornate left paren + key <AD05> { [ 0x1000641, 0x100064F, 0x100FD3F ] }; // Arabic feh, Arabic damma, ornate right paren + key <AD06> { [ 0x100063A, 0x1000650, 0x1000656 ] }; // Arabic ghain, Arabic kasra, Arabic subscript alef + key <AD07> { [ 0x1000639, 0x100064E, 0x100e659 ] }; // Arabic ain, Arabic fatha, Arabic zwarakay + key <AD08> { [ 0x1000647, 0x1000651, 0x1000670 ] }; // Arabic heh, Arabic shadda, Arabic superscript alef + key <AD09> { [ 0x100062E, bracketright, apostrophe ] }; // Arabic khah + key <AD10> { [ 0x100062D, bracketleft, quotedbl ] }; // Arabic hah + key <AD11> { [ 0x100062C, braceright, 0x1000681 ] }; // Arabic jeem, Arabic hah with hamza above + key <AD12> { [ 0x1000686, braceleft, 0x1000685 ] }; // Arabic tcheh, Arabic hah with three dots above + + key <AC01> { [ 0x1000634, 0x1000624, 0x100069A ] }; // Arabic sheen, Arabic waw with hamza above, Arabic seen with dot below and dot above + key <AC02> { [ 0x1000633, 0x1000626, 0x10006CD ] }; // Arabic seen, Arabic yeh with hamza above, Arabic yeh with tail + key <AC03> { [ 0x10006CC, 0x100064A, 0x1000649 ] }; // Farsi yeh, Arabic yeh, Arabic alef maksura + key <AC04> { [ 0x1000628, 0x10006D0, 0x1000643 ] }; // Arabic beh, Arabic e, Arabic kaf + key <AC05> { [ 0x1000644, 0x1000623, 0x10006B7 ] }; // Arabic lam, Arabic hamza on alef, Arabic alef with hamza above + key <AC06> { [ 0x1000627, 0x1000622, 0x1000671 ] }; // Arabic alef, Arabic madda on alef, Arabic alef wasla + key <AC07> { [ 0x100062A, 0x1000629, 0x100067C ] }; // Arabic teh, Arabic teh marbuta, Arabic tteh + key <AC08> { [ 0x1000646, guillemotright, 0x10006BC ] }; // Arabic noon, Arabic noon with ring + key <AC09> { [ 0x1000645, guillemotleft, 0x10006BA ] }; // Arabic meem, Arabic noon ghunna + key <AC10> { [ 0x10006A9, colon, semicolon ] }; // Arabic keheh, + key <AC11> { [ 0x10006AF, 0x100061B, 0x10006AB ] }; // Arabic gaf, Arabic semicolon, Arabic kaf with ring + + key <BKSL> { [ backslash, bar, question ] }; + + key <AB01> { [ 0x1000638, 0x10006C9, 0x10006D2 ] }; // Arabic zah, Arabic kirghiz yu, Arabic yeh barree + key <AB02> { [ 0x1000637, 0x10006C7, 0x1000691 ] }; // Arabic tah, Arabic u, Arabic rreh + key <AB03> { [ 0x1000632, 0x1000698, 0x1000696 ] }; // Arabic zain, Arabic jeh, Arabic reh with dot below and dot above + key <AB04> { [ 0x1000631, 0x1000625, 0x1000693 ] }; // Arabic_ra (reh?), Arabic alef with hamza below, Arabic reh with ring + key <AB05> { [ 0x1000630, 0x100200C, 0x1000688 ] }; // Arabic_thal, zero width non-joiner, Arabic ddal + key <AB06> { [ 0x100062F, 0x1000654, 0x1000689 ] }; // Arabic dal, Arabic hamza above, Arabic dal with ring + key <AB07> { [ 0x100067E, 0x1000621, 0x1000679 ] }; // Arabic peh, Arabic hamza, Arabic tteh + key <AB08> { [ 0x1000648, greater, comma ] }; // Arabic_waw + key <AB09> { [ period, less ] }; + key <AB10> { [ slash, 0x100061F, 0x1000655 ] }; // Arabic question mark, Arabic hamza below + + include "nbsp(zwnj2nb3)" + include "group(olpc)" +}; diff --git a/xorg-server/xkeyboard-config/symbols/capslock b/xorg-server/xkeyboard-config/symbols/capslock index 288a1d293..3e0880573 100644 --- a/xorg-server/xkeyboard-config/symbols/capslock +++ b/xorg-server/xkeyboard-config/symbols/capslock @@ -1,62 +1,74 @@ -default partial hidden modifier_keys
-xkb_symbols "capslock" {
- replace key <CAPS> { [ Caps_Lock ] };
- modifier_map Lock { Caps_Lock };
-};
-
-partial hidden modifier_keys
-xkb_symbols "shiftlock" {
- replace key <CAPS> { [ Shift_Lock ] };
- modifier_map Shift { Shift_Lock };
-};
-
-partial hidden modifier_keys
-xkb_symbols "grouplock" {
- replace key <CAPS> { [ ISO_Next_Group, Caps_Lock ] };
-};
-
-partial hidden modifier_keys
-xkb_symbols "swapescape" {
- key <CAPS> { [ Escape ] };
- key <ESC> { [ Caps_Lock ] };
-};
-
-partial hidden modifier_keys
-xkb_symbols "groupshift" {
- key <CAPS> {
- type[Group1]="PC_ALT_LEVEL2",
- [ Mode_switch, Caps_Lock ]
- };
-};
-
-partial hidden modifier_keys
-xkb_symbols "escape" {
- key <CAPS> { [ Escape ] };
-};
-
-partial hidden modifier_keys
-xkb_symbols "backspace" {
- key <CAPS> { [ BackSpace ] };
-};
-
-partial hidden modifier_keys
-xkb_symbols "super" {
- key <CAPS> { [ Super_L ] };
- modifier_map Mod4 { <CAPS> };
-};
-
-partial hidden modifier_keys
-xkb_symbols "hyper" {
- key <CAPS> { [ Hyper_L ] };
- modifier_map Mod4 { <CAPS> };
-};
-
-partial hidden modifier_keys
-xkb_symbols "none" {
- key <CAPS> { [ VoidSymbol ] };
-};
-
-partial hidden modifier_keys
-xkb_symbols "numlock" {
- key <CAPS> { [ Num_Lock ] };
-};
+default partial hidden modifier_keys +xkb_symbols "capslock" { + replace key <CAPS> { [ Caps_Lock ] }; + modifier_map Lock { Caps_Lock }; +}; + +partial hidden modifier_keys +xkb_symbols "shiftlock" { + replace key <CAPS> { [ Shift_Lock ] }; + modifier_map Shift { Shift_Lock }; +}; + +partial hidden modifier_keys +xkb_symbols "grouplock" { + replace key <CAPS> { [ ISO_Next_Group, Caps_Lock ] }; +}; + +partial hidden modifier_keys +xkb_symbols "swapescape" { + key <CAPS> { [ Escape ] }; + key <ESC> { [ Caps_Lock ] }; +}; + +partial hidden modifier_keys +xkb_symbols "groupshift" { + key <CAPS> { + type[Group1]="PC_ALT_LEVEL2", + [ Mode_switch, Caps_Lock ] + }; +}; + +partial hidden modifier_keys +xkb_symbols "escape" { + key <CAPS> { [ Escape ] }; +}; + +partial hidden modifier_keys +xkb_symbols "backspace" { + key <CAPS> { [ BackSpace ] }; +}; + +partial hidden modifier_keys +xkb_symbols "super" { + key <CAPS> { [ Super_L ] }; + modifier_map Mod4 { <CAPS> }; +}; + +partial hidden modifier_keys +xkb_symbols "hyper" { + key <CAPS> { [ Hyper_L ] }; + modifier_map Mod4 { <CAPS> }; +}; + +partial hidden modifier_keys +xkb_symbols "none" { + key <CAPS> { [ VoidSymbol ] }; +}; + +partial hidden modifier_keys +xkb_symbols "numlock" { + key <CAPS> { [ Num_Lock ] }; +}; + +// This changes the modifier behavior of the <CAPS> key. +// The keysym will be reset to Caps_Lock +partial hidden modifier_keys +xkb_symbols "ctrl_modifier" { + replace key <CAPS> { + type[Group1] = "ONE_LEVEL", + symbols[Group1] = [ Caps_Lock ], + actions[Group1] = [ SetMods(modifiers=Control) ] + }; + modifier_map Control { <CAPS> }; +}; diff --git a/xorg-server/xkeyboard-config/symbols/et b/xorg-server/xkeyboard-config/symbols/et index 6f71b2f97..7d15967e2 100644 --- a/xorg-server/xkeyboard-config/symbols/et +++ b/xorg-server/xkeyboard-config/symbols/et @@ -1,73 +1,73 @@ -//
-// Ethiopia
-// Designed as a part of OLPC project
-//
-// 2007 Sergey Udaltsov <svu@gnome.org>
-//
-
-partial default alphanumeric_keys
-xkb_symbols "basic" {
- include "et(olpc)"
- name[Group1]="Ethiopia";
-};
-
-partial alphanumeric_keys
-xkb_symbols "olpc" {
-
- name[Group1]="Ethiopia";
-
- key <AE01> { [ 0x01001369, 0x01001372 ] }; // 1
- key <AE02> { [ 0x0100136a, 0x01001373 ] }; // 2
- key <AE03> { [ 0x0100136b, 0x01001374 ] }; // 3
- key <AE04> { [ 0x0100136c, 0x01001375 ] }; // 4
- key <AE05> { [ 0x0100136d, 0x01001376 ] }; // 5
- key <AE06> { [ 0x0100136e, 0x01001377 ] }; // 6
- key <AE07> { [ 0x0100136f, 0x01001378 ] }; // 7
- key <AE08> { [ 0x01001370, 0x01001379 ] }; // 8
- key <AE09> { [ 0x01001371, 0x0100137a ] }; // 9
- key <AE10> { [ 0x0100137b, 0x0100137c ] }; // 0
- key <AE11> { [ minus, underscore ] }; // -_
- key <AE12> { [ equal, plus ] }; // =+
-
- key <AD01> { [ 0x01001240, 0x01001250 ] }; // q
- key <AD02> { [ 0x010012C8, VoidSymbol ] }; // w
- key <AD03> { [ e, E ] }; // e
- key <AD04> { [ 0x01001228, VoidSymbol ] }; // r
- key <AD05> { [ 0x01001270, 0x01001320 ] }; // t
- key <AD06> { [ 0x010012E8, VoidSymbol ] }; // y
- key <AD07> { [ u, U ] }; // u
- key <AD08> { [ i, I ] }; // i
- key <AD09> { [ o, O ] }; // o
- key <AD10> { [ 0x01001350, 0x01001330 ] }; // p
- key <AD11> { [ 0x01001340, 0x01001338 ] }; // [
- key <AD12> { [ 0x01001328, 0x01001280 ] }; // ]
-
- key <AC01> { [ a, A ] }; // a
- key <AC02> { [ 0x01001230, 0x01001220 ] }; // s
- key <AC03> { [ 0x010012F0, 0x010012F8 ] }; // d
- key <AC04> { [ 0x01001348, VoidSymbol ] }; // f
- key <AC05> { [ 0x01001308, 0x01001318 ] }; // g
- key <AC06> { [ 0x01001200, 0x01001210 ] }; // h
- key <AC07> { [ 0x01001300, VoidSymbol ] }; // j
- key <AC08> { [ 0x010012A8, 0x010012B8 ] }; // k
- key <AC09> { [ 0x01001208, VoidSymbol ] }; // l
-
- key <AC10> { [ 0x01001362, 0x01001361 ] }; // :;
- key <AC11> { [ 0x01001366, 0x01001365 ] }; // '"
-
- key <AB01> { [ 0x010012D8, 0x010012E0 ] }; // z
- key <AB02> { [ 0x010012A0, 0x010012D0 ] }; // x
- key <AB03> { [ 0x01001278, VoidSymbol ] }; // c
- key <AB04> { [ 0x01001238, 0x01001268 ] }; // v
- key <AB05> { [ 0x01001260, VoidSymbol ] }; // b
- key <AB06> { [ 0x01001290, 0x01001298 ] }; // n
- key <AB07> { [ 0x01001218, VoidSymbol ] }; // m
-
- key <AB08> { [ 0x01001363, VoidSymbol ] }; // <
- key <AB09> { [ 0x01001364, VoidSymbol ] }; // >
- key <AB10> { [ 0x01001367, VoidSymbol ] }; // ?
-
- key <BKSL> { [ VoidSymbol, 0x01002010 ] }; // bksl
-
- include "group(olpc)"
-};
+// +// Ethiopia +// Designed as a part of OLPC project +// +// 2007 Sergey Udaltsov <svu@gnome.org> +// + +partial default alphanumeric_keys +xkb_symbols "basic" { + include "et(olpc)" + name[Group1]="Ethiopia"; +}; + +partial alphanumeric_keys +xkb_symbols "olpc" { + + name[Group1]="Ethiopia"; + + key <AE01> { [ 0x01001369, 0x01001372 ] }; // 1 + key <AE02> { [ 0x0100136a, 0x01001373 ] }; // 2 + key <AE03> { [ 0x0100136b, 0x01001374 ] }; // 3 + key <AE04> { [ 0x0100136c, 0x01001375 ] }; // 4 + key <AE05> { [ 0x0100136d, 0x01001376 ] }; // 5 + key <AE06> { [ 0x0100136e, 0x01001377 ] }; // 6 + key <AE07> { [ 0x0100136f, 0x01001378 ] }; // 7 + key <AE08> { [ 0x01001370, 0x01001379 ] }; // 8 + key <AE09> { [ 0x01001371, 0x0100137a ] }; // 9 + key <AE10> { [ 0x0100137b, 0x0100137c ] }; // 0 + key <AE11> { [ minus, underscore ] }; // -_ + key <AE12> { [ equal, plus ] }; // =+ + + key <AD01> { [ 0x01001240, 0x01001250 ] }; // q + key <AD02> { [ 0x010012C8, VoidSymbol ] }; // w + key <AD03> { [ 0x0100FE69, 0x0100FE70 ] }; // dead e + key <AD04> { [ 0x01001228, VoidSymbol ] }; // r + key <AD05> { [ 0x01001270, 0x01001320 ] }; // t + key <AD06> { [ 0x010012E8, VoidSymbol ] }; // y + key <AD07> { [ 0x0100FE75, 0x0100FE76 ] }; // dead u + key <AD08> { [ 0x0100FE71, 0x0100FE72 ] }; // dead i + key <AD09> { [ 0x0100FE73, 0x0100FE74 ] }; // dead o + key <AD10> { [ 0x01001350, 0x01001330 ] }; // p + key <AD11> { [ 0x01001340, 0x01001338 ] }; // [ + key <AD12> { [ 0x01001328, 0x01001280 ] }; // ] + + key <AC01> { [ 0x0100FE67, 0x0100FE68 ] }; // dead a + key <AC02> { [ 0x01001230, 0x01001220 ] }; // s + key <AC03> { [ 0x010012F0, 0x010012F8 ] }; // d + key <AC04> { [ 0x01001348, VoidSymbol ] }; // f + key <AC05> { [ 0x01001308, 0x01001318 ] }; // g + key <AC06> { [ 0x01001200, 0x01001210 ] }; // h + key <AC07> { [ 0x01001300, VoidSymbol ] }; // j + key <AC08> { [ 0x010012A8, 0x010012B8 ] }; // k + key <AC09> { [ 0x01001208, VoidSymbol ] }; // l + + key <AC10> { [ 0x01001362, 0x01001361 ] }; // :; + key <AC11> { [ 0x01001366, 0x01001365 ] }; // '" + + key <AB01> { [ 0x010012D8, 0x010012E0 ] }; // z + key <AB02> { [ 0x010012A0, 0x010012D0 ] }; // x + key <AB03> { [ 0x01001278, 0x0100FE78 ] }; // c + key <AB04> { [ 0x01001238, 0x01001268 ] }; // v + key <AB05> { [ 0x01001260, VoidSymbol ] }; // b + key <AB06> { [ 0x01001290, 0x01001298 ] }; // n + key <AB07> { [ 0x01001218, VoidSymbol ] }; // m + + key <AB08> { [ 0x01001363, VoidSymbol ] }; // < + key <AB09> { [ 0x01001364, VoidSymbol ] }; // > + key <AB10> { [ 0x01001367, question ] }; // ? + + key <BKSL> { [ VoidSymbol, 0x01002010 ] }; // bksl + + include "group(olpc)" +}; diff --git a/xorg-server/xkeyboard-config/symbols/mn b/xorg-server/xkeyboard-config/symbols/mn index 44e5e4e67..a838bd5e0 100644 --- a/xorg-server/xkeyboard-config/symbols/mn +++ b/xorg-server/xkeyboard-config/symbols/mn @@ -1,80 +1,82 @@ -// based on:
-// Mongolian standard keyboard
-// Author Sanlig Badral <badral@chinggis.com>
-// 2002/12/7 Version 1.0
-
-partial default alphanumeric_keys
-xkb_symbols "basic" {
-
- name[Group1]= "Mongolia";
-
- key <TLDE> { [ equal, plus, degree ] };
- key <AE01> { [ 1, numerosign, multiply ] };
- key <AE02> { [ 2, minus, division ] };
- key <AE03> { [ 3, quotedbl, plusminus ] };
- key <AE04> { [ 4, U20ae, notsign ] }; // Tugrik sign
- key <AE05> { [ 5, colon, NoSymbol ] };
- key <AE06> { [ 6, period, notequal ] };
- key <AE07> { [ 7, underscore, ampersand ] };
- key <AE08> { [ 8, comma, asterisk ] };
- key <AE09> { [ 9, percent, bracketleft ] };
- key <AE10> { [ 0, question, bracketright ] };
- key <AE11> { [ Cyrillic_ie, Cyrillic_IE, X ] };
- key <AE12> { [ Cyrillic_shcha, Cyrillic_SHCHA, L ] };
-
- key <AD01> { [ Cyrillic_ef, Cyrillic_EF, apostrophe ] };
- key <AD02> { [ Cyrillic_tse, Cyrillic_TSE, grave ] };
- key <AD03> { [ Cyrillic_u, Cyrillic_U, EuroSign ] };
- key <AD04> { [ Cyrillic_zhe, Cyrillic_ZHE, registered ] };
- key <AD05> { [ Cyrillic_e, Cyrillic_E, trademark ] };
- key <AD06> { [ Cyrillic_en, Cyrillic_EN, yen ] };
- key <AD07> { [ Cyrillic_ghe, Cyrillic_GHE, doublelowquotemark ] };
- key <AD08> { [ Cyrillic_sha, Cyrillic_SHA, leftdoublequotemark ] };
- key <AD09> { [ Cyrillic_u_straight,Cyrillic_U_straight,rightdoublequotemark] };
- key <AD10> { [ Cyrillic_ze, Cyrillic_ZE, NoSymbol ] };
- key <AD11> { [ Cyrillic_ka, Cyrillic_KA, braceleft ] };
- key <AD12> { [ Cyrillic_hardsign, Cyrillic_HARDSIGN, braceright ] };
-
- key <AC01> { [ Cyrillic_shorti, Cyrillic_SHORTI, mu ] };
- key <AC02> { [ Cyrillic_yeru, Cyrillic_YERU, sterling ] };
- key <AC03> { [ Cyrillic_be, Cyrillic_BE, dollar ] };
- key <AC04> { [ Cyrillic_o_bar, Cyrillic_O_bar, rightdoublequotemark ] };
- key <AC05> { [ Cyrillic_a, Cyrillic_A, Cyrillic_yeru ] };
- key <AC06> { [ Cyrillic_ha, Cyrillic_HA, Cyrillic_YERU ] };
- key <AC07> { [ Cyrillic_er, Cyrillic_ER, Cyrillic_e ] };
- key <AC08> { [ Cyrillic_o, Cyrillic_O, Cyrillic_E ] };
- key <AC09> { [ Cyrillic_el, Cyrillic_EL, numerosign ] };
- key <AC10> { [ Cyrillic_de, Cyrillic_DE, section ] };
- key <AC11> { [ Cyrillic_pe, Cyrillic_PE, ellipsis ] };
- key <BKSL> { [ exclam, bar, bar ] };
-
- key <LSGT> { [ parenleft, parenright, NoSymbol ] };
- key <AB01> { [ Cyrillic_ya, Cyrillic_YA, emdash ] };
- key <AB02> { [ Cyrillic_che, Cyrillic_CHE, endash ] };
- key <AB03> { [ Cyrillic_io, Cyrillic_IO, copyright ] };
- key <AB04> { [ Cyrillic_es, Cyrillic_ES, NoSymbol ] };
- key <AB05> { [ Cyrillic_em, Cyrillic_EM, NoSymbol ] };
- key <AB06> { [ Cyrillic_i, Cyrillic_I, less ] };
- key <AB07> { [ Cyrillic_te, Cyrillic_TE, greater ] };
- key <AB08> { [ Cyrillic_softsign, Cyrillic_SOFTSIGN, guillemotleft ] };
- key <AB09> { [ Cyrillic_ve, Cyrillic_VE, guillemotright ] };
- key <AB10> { [ Cyrillic_yu, Cyrillic_YU, backslash ] };
-
- // End alphanumeric section
-
- key <SPCE> { [ space, space, nobreakspace ] };
-
- include "level3(ralt_switch)"
-};
-
-partial alphanumeric_keys
-xkb_symbols "olpc" {
-
-// Contact: Walter Bender <walter@laptop.org>
-
- include "mn(basic)"
-
- key <BKSL> { [ backslash, bar, exclam ] };
-
- include "group(olpc)"
-};
+// based on: +// Mongolian standard keyboard +// Author Sanlig Badral <badral@chinggis.com> +// 2002/12/7 Version 1.0 + +partial default alphanumeric_keys +xkb_symbols "basic" { + + name[Group1]= "Mongolia"; + + key <TLDE> { [ equal, plus, degree ] }; + key <AE01> { [ 1, numerosign, multiply ] }; + key <AE02> { [ 2, minus, division ] }; + key <AE03> { [ 3, quotedbl, plusminus ] }; + key <AE04> { [ 4, U20ae, notsign ] }; // Tugrik sign + key <AE05> { [ 5, colon, NoSymbol ] }; + key <AE06> { [ 6, period, notequal ] }; + key <AE07> { [ 7, underscore, ampersand ] }; + key <AE08> { [ 8, comma, asterisk ] }; + key <AE09> { [ 9, percent, bracketleft ] }; + key <AE10> { [ 0, question, bracketright ] }; + key <AE11> { [ Cyrillic_ie, Cyrillic_IE, X ] }; + key <AE12> { [ Cyrillic_shcha, Cyrillic_SHCHA, L ] }; + + key <AD01> { [ Cyrillic_ef, Cyrillic_EF, apostrophe ] }; + key <AD02> { [ Cyrillic_tse, Cyrillic_TSE, grave ] }; + key <AD03> { [ Cyrillic_u, Cyrillic_U, EuroSign ] }; + key <AD04> { [ Cyrillic_zhe, Cyrillic_ZHE, registered ] }; + key <AD05> { [ Cyrillic_e, Cyrillic_E, trademark ] }; + key <AD06> { [ Cyrillic_en, Cyrillic_EN, yen ] }; + key <AD07> { [ Cyrillic_ghe, Cyrillic_GHE, doublelowquotemark ] }; + key <AD08> { [ Cyrillic_sha, Cyrillic_SHA, leftdoublequotemark ] }; + key <AD09> { [ Cyrillic_u_straight,Cyrillic_U_straight,rightdoublequotemark] }; + key <AD10> { [ Cyrillic_ze, Cyrillic_ZE, NoSymbol ] }; + key <AD11> { [ Cyrillic_ka, Cyrillic_KA, braceleft ] }; + key <AD12> { [ Cyrillic_hardsign, Cyrillic_HARDSIGN, braceright ] }; + + key <AC01> { [ Cyrillic_shorti, Cyrillic_SHORTI, mu ] }; + key <AC02> { [ Cyrillic_yeru, Cyrillic_YERU, sterling ] }; + key <AC03> { [ Cyrillic_be, Cyrillic_BE, dollar ] }; + key <AC04> { [ Cyrillic_o_bar, Cyrillic_O_bar, rightdoublequotemark ] }; + key <AC05> { [ Cyrillic_a, Cyrillic_A, Cyrillic_yeru ] }; + key <AC06> { [ Cyrillic_ha, Cyrillic_HA, Cyrillic_YERU ] }; + key <AC07> { [ Cyrillic_er, Cyrillic_ER, Cyrillic_e ] }; + key <AC08> { [ Cyrillic_o, Cyrillic_O, Cyrillic_E ] }; + key <AC09> { [ Cyrillic_el, Cyrillic_EL, numerosign ] }; + key <AC10> { [ Cyrillic_de, Cyrillic_DE, section ] }; + key <AC11> { [ Cyrillic_pe, Cyrillic_PE, ellipsis ] }; + key <BKSL> { [ exclam, bar, bar ] }; + + key <LSGT> { [ parenleft, parenright, NoSymbol ] }; + key <AB01> { [ Cyrillic_ya, Cyrillic_YA, emdash ] }; + key <AB02> { [ Cyrillic_che, Cyrillic_CHE, endash ] }; + key <AB03> { [ Cyrillic_io, Cyrillic_IO, copyright ] }; + key <AB04> { [ Cyrillic_es, Cyrillic_ES, NoSymbol ] }; + key <AB05> { [ Cyrillic_em, Cyrillic_EM, NoSymbol ] }; + key <AB06> { [ Cyrillic_i, Cyrillic_I, less ] }; + key <AB07> { [ Cyrillic_te, Cyrillic_TE, greater ] }; + key <AB08> { [ Cyrillic_softsign, Cyrillic_SOFTSIGN, guillemotleft ] }; + key <AB09> { [ Cyrillic_ve, Cyrillic_VE, guillemotright ] }; + key <AB10> { [ Cyrillic_yu, Cyrillic_YU, backslash ] }; + + // End alphanumeric section + + key <SPCE> { [ space, space, nobreakspace ] }; + + include "level3(ralt_switch)" +}; + +partial alphanumeric_keys +xkb_symbols "olpc" { + +// Contact: Walter Bender <walter@laptop.org> + + include "mn(basic)" + + key <AE07> { [ 7, semicolon, ampersand ] }; + + key <BKSL> { [ backslash, bar, exclam ] }; + + include "group(olpc)" +}; diff --git a/xorg-server/xkeyboard-config/symbols/np b/xorg-server/xkeyboard-config/symbols/np index 635fa348a..e139b0ff7 100644 --- a/xorg-server/xkeyboard-config/symbols/np +++ b/xorg-server/xkeyboard-config/symbols/np @@ -1,120 +1,121 @@ -// based on a keyboard map from an 'xkb/symbols/dev' file
-
-partial default alphanumeric_keys
-xkb_symbols "basic" {
-
- name[Group1]= "Nepal";
-
-// `,1,2,3,4,5,6,7,8,9,0,-,=
-
- key <TLDE> { [ 0x100093D,0x100093C ] };
- key <AE01> { [ 0x1000967 ] };
- key <AE02> { [ 0x1000968 ] };
- key <AE03> { [ 0x1000969 ] };
- key <AE04> { [ 0x100096A ] };
- key <AE05> { [ 0x100096B ] };
- key <AE06> { [ 0x100096C ] };
- key <AE07> { [ 0x100096D ] };
- key <AE08> { [ 0x100096e ] };
- key <AE09> { [ 0x100096F ] };
- key <AE10> { [ 0x1000966,0x1000970 ] };
- key <AE11> { [ minus, 0x1000952 ] };
- key <AE12> { [ equal, 0x100200C ] };
-
-// q,w,e,r,t,y,u,i,o,p,[,]
-
- key <AD01> { [ 0x100091F, 0x1000920 ] };
- key <AD02> { [ 0x100094C, 0x1000914 ] };
- key <AD03> { [ 0x1000947, 0x1000948 ] };
- key <AD04> { [ 0x1000930, 0x1000943 ] };
- key <AD05> { [ 0x1000924, 0x1000925 ] };
- key <AD06> { [ 0x100092F, 0x100091E ] };
- key <AD07> { [ 0x1000941, 0x1000942 ] };
- key <AD08> { [ 0x100093F, 0x1000940 ] };
- key <AD09> { [ 0x100094B, 0x1000913 ] };
- key <AD10> { [ 0x100092A, 0x100092B ] };
- key <AD11> { [ 0x1000907, 0x1000908 ] };
- key <AD12> { [ 0x100090F, 0x1000910 ] };
-
-// a,s,d,f,g,h,j,k,l,;,',Backslash
- key <AC01> { [ 0x100093E, 0x1000906 ] };
- key <AC02> { [ 0x1000938, 0x1000936 ] };
- key <AC03> { [ 0x1000926, 0x1000927 ] };
- key <AC04> { [ 0x1000909, 0x100090A ] };
- key <AC05> { [ 0x1000917, 0x1000918 ] };
- key <AC06> { [ 0x1000939, 0x1000905 ] };
- key <AC07> { [ 0x100091C, 0x100091D ] };
- key <AC08> { [ 0x1000915, 0x1000916 ] };
- key <AC09> { [ 0x1000932, 0x1000933 ] };
- key <AC10> { [ semicolon, colon ] };
- key <AC11> { [ quoteright, quotedbl ] };
- key <BKSL> { [ 0x1000950, 0x1000903 ] };
-
-
-// z,x,c,v,b,n,m,,,.,/
- key <AB01> { [ 0x1000937, 0x100090B ] };
- key <AB02> { [ 0x1000921, 0x1000922 ] };
- key <AB03> { [ 0x100091B, 0x100091A ] };
- key <AB04> { [ 0x1000935, 0x1000901 ] };
- key <AB05> { [ 0x100092C, 0x100092D ] };
- key <AB06> { [ 0x1000928, 0x1000923 ] };
- key <AB07> { [ 0x100092E, 0x1000902 ] };
- key <AB08> { [ comma, 0x1000919 ] };
- key <AB09> { [ 0x1000964, 0x1000965 ] };
- key <AB10> { [ 0x100094D, question ] };
-};
-
-partial alphanumeric_keys
-xkb_symbols "olpc" {
-
-// Contact: Walter Bender <walter@laptop.org>
-
- include "np"
- key <TLDE> { [ grave, asciitilde ] };
- key <AE01> { [ 0x1000967 ] }; // Nepali digit one
- key <AE02> { [ 0x1000968 ] }; // Nepali digit two
- key <AE03> { [ 0x1000969 ] }; // Nepali digit three
- key <AE04> { [ 0x100096A ] }; // Nepali digit four
- key <AE05> { [ 0x100096B ] }; // Nepali digit five
- key <AE06> { [ 0x100096C, sterling ] }; // Nepali digit six
- key <AE07> { [ 0x100096D, eurosign ] }; // Nepali digit seven
- key <AE08> { [ 0x100096e ] }; // Nepali digit eight
- key <AE09> { [ 0x100096F ] }; // Nepali digit nine
- key <AE10> { [ 0x1000966 ] }; // Nepali digit zero
- key <AE12> { [ 0x1000950, 0x1000903 ] }; // OM, SIGN VISARGA
-
- key <AD01> { [ 0x100091C, 0x100091D ] }; // JA, JHA
- key <AD02> { [ 0x1000917, 0x1000918 ] }; // GA, GHA
- key <AD03> { [ 0x100092F, 0x100091E ] }; // YA, YNA
- key <AD04> { [ 0x1000938, 0x1000936 ] }; // SA, SHA
- key <AD05> { [ 0x100090F, 0x1000910 ] }; // E, AI
- key <AD06> { [ 0x100091B, 0x100091A ] }; // CHHA, CHA
- key <AD07> { [ 0x100092A, 0x100092B ] }; // PA, PHA
- key <AD08> { [ 0x1000947, 0x1000948 ] }; // VOWEL SIGN E, VOWEL SIGN AI
- key <AD09> { [ 0x100094B, 0x100093E ] }; // VOWEL SIGN O, VOWEL SIGN AA
- key <AD10> { [ 0x1000924, 0x1000925 ] }; // TA, THA
- key <AD11> { [ 0x1000909, 0x100090A ] }; // HRSHWA U, DIRGHA UU
- key <AD12> { [ 0x100093F, 0x1000940 ] }; // VOWEL SIGN HRSHWA I, VOWEL SIGN DIRGHA II
-
- key <AC01> { [ 0x100092E, 0x1000902 ] }; // MA, SIGN ANUSVARA
- key <AC02> { [ 0x1000907, 0x1000908 ] }; // HRSHWA I, DIRGHA II
- key <AC03> { [ 0x1000928, 0x1000923 ] }; // NA, NNA
- key <AC04> { [ 0x100094D, 0x1000921 ] }; // VIRAMA (HALANTA?), DDA
- key <AC05> { [ 0x100091F, 0x1000920 ] }; // TTA, TTHA
- key <AC06> { [ 0x1000926, 0x1000927 ] }; // DA, DHA
- key <AC07> { [ 0x100093E, 0x1000901 ] }; // SIGN AA, SIGN CANDRABINDU
- key <AC08> { [ 0x1000930, 0x1000943 ] }; // RA, VOWEL SIGN VOCALIC R
- key <AC09> { [ 0x1000915, 0x1000916 ] }; // KA, KHA
-
- key <AB01> { [ 0x1000937, 0x100090B ] }; // SSA, VOCALIC R (RRI)
- key <AB02> { [ 0x100092C, 0x100092D ] }; // BA, BHA
- key <AB03> { [ 0x1000941, 0x1000942 ] }; // VOWEL SIGN HRSHWA U, VOWEL SIGN DIRGHA U (UU)
- key <AB04> { [ 0x1000939, 0x1000922 ] }; // HA, DDHA
- key <AB05> { [ 0x1000913, 0x1000914 ] }; // O, AU
- key <AB06> { [ 0x1000905, 0x1000906 ] }; // A, AA
- key <AB07> { [ 0x1000932, 0x1000919 ] }; // LA, NGA
- key <AB08> { [ comma, 0x1000935 ] }; // VA
- key <AB09> { [ 0x1000964, 0x1000965 ] }; // PURNA VIRAM, DIRGHA VIRAM
-
- include "group(olpc)"
-};
+// based on a keyboard map from an 'xkb/symbols/dev' file + +partial default alphanumeric_keys +xkb_symbols "basic" { + + name[Group1]= "Nepal"; + +// `,1,2,3,4,5,6,7,8,9,0,-,= + + key <TLDE> { [ 0x100093D,0x100093C ] }; + key <AE01> { [ 0x1000967 ] }; + key <AE02> { [ 0x1000968 ] }; + key <AE03> { [ 0x1000969 ] }; + key <AE04> { [ 0x100096A ] }; + key <AE05> { [ 0x100096B ] }; + key <AE06> { [ 0x100096C ] }; + key <AE07> { [ 0x100096D ] }; + key <AE08> { [ 0x100096e ] }; + key <AE09> { [ 0x100096F ] }; + key <AE10> { [ 0x1000966,0x1000970 ] }; + key <AE11> { [ minus, 0x1000952 ] }; + key <AE12> { [ equal, 0x100200C ] }; + +// q,w,e,r,t,y,u,i,o,p,[,] + + key <AD01> { [ 0x100091F, 0x1000920 ] }; + key <AD02> { [ 0x100094C, 0x1000914 ] }; + key <AD03> { [ 0x1000947, 0x1000948 ] }; + key <AD04> { [ 0x1000930, 0x1000943 ] }; + key <AD05> { [ 0x1000924, 0x1000925 ] }; + key <AD06> { [ 0x100092F, 0x100091E ] }; + key <AD07> { [ 0x1000941, 0x1000942 ] }; + key <AD08> { [ 0x100093F, 0x1000940 ] }; + key <AD09> { [ 0x100094B, 0x1000913 ] }; + key <AD10> { [ 0x100092A, 0x100092B ] }; + key <AD11> { [ 0x1000907, 0x1000908 ] }; + key <AD12> { [ 0x100090F, 0x1000910 ] }; + +// a,s,d,f,g,h,j,k,l,;,',Backslash + key <AC01> { [ 0x100093E, 0x1000906 ] }; + key <AC02> { [ 0x1000938, 0x1000936 ] }; + key <AC03> { [ 0x1000926, 0x1000927 ] }; + key <AC04> { [ 0x1000909, 0x100090A ] }; + key <AC05> { [ 0x1000917, 0x1000918 ] }; + key <AC06> { [ 0x1000939, 0x1000905 ] }; + key <AC07> { [ 0x100091C, 0x100091D ] }; + key <AC08> { [ 0x1000915, 0x1000916 ] }; + key <AC09> { [ 0x1000932, 0x1000933 ] }; + key <AC10> { [ semicolon, colon ] }; + key <AC11> { [ quoteright, quotedbl ] }; + key <BKSL> { [ 0x1000950, 0x1000903 ] }; + + +// z,x,c,v,b,n,m,,,.,/ + key <AB01> { [ 0x1000937, 0x100090B ] }; + key <AB02> { [ 0x1000921, 0x1000922 ] }; + key <AB03> { [ 0x100091B, 0x100091A ] }; + key <AB04> { [ 0x1000935, 0x1000901 ] }; + key <AB05> { [ 0x100092C, 0x100092D ] }; + key <AB06> { [ 0x1000928, 0x1000923 ] }; + key <AB07> { [ 0x100092E, 0x1000902 ] }; + key <AB08> { [ comma, 0x1000919 ] }; + key <AB09> { [ 0x1000964, 0x1000965 ] }; + key <AB10> { [ 0x100094D, question ] }; +}; + +partial alphanumeric_keys + +xkb_symbols "olpc" { +// Contact: Walter Bender <walter@laptop.org> + + include "np" + key <TLDE> { [ 0x100091E, 0x1000965 ] }; // NYA; double danda + key <AE01> { [ 0x1000967, 0x10FFFFD ] }; // Nepali digit one; U091C+U094D+U091E + key <AE02> { [ 0x1000968, 0x1000908 ] }; // Nepali digit two; key <AE03> { [ 0x1000969, 0x1000918 ] }; // Nepali digit three; + key <AE04> { [ 0x100096A, 0x10FFFFC ] }; // Nepali digit four; U0926+U094D+U0927 + key <AE05> { [ 0x100096B, 0x100091B ] }; // Nepali digit five + key <AE06> { [ 0x100096C, 0x100091F ] }; // Nepali digit six + key <AE07> { [ 0x100096D, 0x1000920 ] }; // Nepali digit seven + key <AE08> { [ 0x100096e, 0x1000921 ] }; // Nepali digit eight + key <AE09> { [ 0x100096F, 0x1000922 ] }; // Nepali digit nine + key <AE10> { [ 0x1000966, 0x1000923 ] }; // Nepali digit zero + key <AE11> { [ 0x1000914, 0x1000913 ] }; // O, AU + key <AE12> { [ 0x100200C, 0x1000902 ] }; // ZERO-WIDTH-NON-JOINER (ZWNJ); SIGN ANUSVARA + key <BKSL> { [ 0x100094D, 0x100200D ] }; // SIGN VIRAMA; ZERO-WIDTH-JOINER (ZWJ) + key <AD01> { [ 0x10FFFFB, 0x10FFFFA ] }; // U0924+U094D+U0930; U0924+U094D+U0924 + key <AD02> { [ 0x1000927, 0x10FFFF9 ] }; // DHA; U0921+U094D+U0922 + key <AD03> { [ 0x100092D, 0x1000910 ] }; // BHA, AI + key <AD04> { [ 0x100091A, 0x10FFFF8 ] }; // CA; U0926+U094D+U0935 + key <AD05> { [ 0x1000924, 0x10FFFF7 ] }; // TA; U091F+U094D+U091F + key <AD06> { [ 0x1000925, 0x10FFFF6 ] }; // THA; U0920+U094D+U0920 + key <AD07> { [ 0x1000917, 0x100090A ] }; // GA, UU + key <AD08> { [ 0x1000937, 0x10FFFF5 ] }; // SSA; U0915+U094D+U0937 + key <AD09> { [ 0x100092F, 0x1000907 ] }; // YA, I + key <AD10> { [ 0x1000909, 0x100090F ] }; // U, E + key <AD11> { [ 0x10FFFF4, 0x1000943 ] }; // U0928+U094D+ZWJ; VOWEL SIGN VOCALIC R + key <AD12> { [ 0x1000947, 0x1000948 ] }; // SIGN E; SIGN AI + key <AC01> { [ 0x100092C, 0x1000906 ] }; // BA, AA + key <AC02> { [ 0x1000915, 0x10FFFF3 ] }; // KA; U0919+U094D+U0915 + key <AC03> { [ 0x100092E, 0x10FFFF2 ] }; // MA; U0919+U094D+U0917 + key <AC04> { [ 0x100093E, 0x1000901 ] }; // CANDRABINDU, VOWEL SIGN AA + key <AC05> { [ 0x1000928, 0x10FFFF1 ] }; // NA; U0926+U094D+U0926 + key <AC06> { [ 0x100091C, 0x100091D ] }; // JA, JHA + key <AC07> { [ 0x1000935, 0x100094B ] }; // VA, VOWEL SIGN O + key <AC08> { [ 0x100092A, 0x100092B ] }; // PA, PHA + key <AC09> { [ 0x100093F, 0x1000940 ] }; // VOWEL SIGN I, VOWEL SIGN II + key <AC10> { [ 0x1000938, 0x10FFFF0 ] }; // SA; U091F+U094D+U0920 + key <AC11> { [ 0x1000941, 0x1000942 ] }; // VOWEL SIGN U, VOWEL SIGN UU + key <AB01> { [ 0x1000936, 0x10FFFEF ] }; // SHA; U0915+U094D+U0915 + key <AB02> { [ 0x1000939, 0x10FFFEE ] }; // HA; U0939+U094D+U092F + key <AB03> { [ 0x1000905, 0x100090B ] }; // A; U0909+U090B + key <AB04> { [ 0x1000916, 0x1000950 ] }; // KHA, OM + key <AB05> { [ 0x1000926, 0x100094C ] }; // DA, VOWEL SIGN AU + key <AB06> { [ 0x1000932, 0x10FFFED ] }; // LA; U0926+U094D+U092F + key <AB07> { [ 0x1000903, 0x10FFFEC ] }; // SIGN VISARGA; U0921+U094D+U0921 + key <AB08> { [ 0x100093D, 0x1000919 ] }; // SIGN AVAGRHA; NGA + key <AB09> { [ 0x1000964, 0x10FFFEB ] }; // DANDA; U0936+U094D+U0930 + key <AB10> { [ 0x1000930, 0x10FFFEA ] }; // RA; U0930+U0941 + + include "group(olpc)" +}; |