Репозиторий Sisyphus
Последнее обновление: 1 октября 2023 | Пакетов: 18631 | Посещений: 37847211
en ru br
Репозитории ALT
4.0: 7.3.0-alt1
3.0: 6.8.2-alt18
+updates:6.8.2-alt24
www.altlinux.org/Changes

Группа :: Система/X11
Пакет: xorg-x11

 Главная   Изменения   Спек   Патчи   Sources   Загрузить   Gear   Bugs and FR  Repocop 

Патч: xorg-x11-6.8.2-xnest-update-modifier-state-fdo3030-fdo3664.patch
Скачать


Patch submitted to Red Hat bugzilla by Mark McLoughlin to fix the
following bugs:
Fixes bugs:
	https://bugs.freedesktop.org/show_bug.cgi?id=3030
	https://bugs.freedesktop.org/show_bug.cgi?id=3664
And the first part of bug:
	https://bugzilla.redhat.com/bugzilla/show_bug.cgi?id=162246
Mike A. Harris <mharris@redhat.com>
--- xc/programs/Xserver/hw/xnest/Events.h.xnest-update-modifier-state-fdo3030-fdo3664	2004-04-23 20:54:21.000000000 +0100
+++ xc/programs/Xserver/hw/xnest/Events.h	2005-07-01 14:40:14.000000000 +0100
@@ -26,5 +26,6 @@
 void SetTimeSinceLastInputEvent(void);
 void xnestCollectExposures(void);
 void xnestCollectEvents(void);
+void xnestQueueKeyEvent(int type, unsigned int keycode);
 
 #endif /* XNESTEVENTS_H */
--- xc/programs/Xserver/hw/xnest/Pointer.h.xnest-update-modifier-state-fdo3030-fdo3664	2004-04-23 20:54:21.000000000 +0100
+++ xc/programs/Xserver/hw/xnest/Pointer.h	2005-07-01 14:40:14.000000000 +0100
@@ -23,6 +23,8 @@
         (ButtonPressMask | ButtonReleaseMask | PointerMotionMask | \
 	 EnterWindowMask | LeaveWindowMask)
 
+extern DeviceIntPtr xnestPointerDevice;
+
 void xnestChangePointerControl(DeviceIntPtr pDev, PtrCtrl *ctrl);
 int xnestPointerProc(DeviceIntPtr pDev, int onoff);
 
--- xc/programs/Xserver/hw/xnest/Keyboard.c.xnest-update-modifier-state-fdo3030-fdo3664	2004-04-23 20:54:21.000000000 +0100
+++ xc/programs/Xserver/hw/xnest/Keyboard.c	2005-07-01 14:40:29.000000000 +0100
@@ -31,6 +31,7 @@
 #include "Screen.h"
 #include "Keyboard.h"
 #include "Args.h"
+#include "Events.h"
 
 #ifdef XKB
 #include <X11/extensions/XKB.h>
@@ -83,6 +84,8 @@
 
 #endif
 
+DeviceIntPtr xnestKeyboardDevice = NULL;
+
 void
 xnestBell(int volume, DeviceIntPtr pDev, pointer ctrl, int cls)
 {
@@ -282,3 +285,51 @@
 {
   return TRUE;
 }
+
+void
+xnestUpdateModifierState(unsigned int state)
+{
+  DeviceIntPtr pDev = xnestKeyboardDevice;
+  KeyClassPtr keyc = pDev->key;
+  int i;
+  CARD8 mask;
+
+  state = state & 0xff;
+
+  if (keyc->state == state)
+    return;
+
+  for (i = 0, mask = 1; i < 8; i++, mask <<= 1) {
+    int key;
+
+    /* Modifier is down, but shouldn't be
+     */
+    if ((keyc->state & mask) && !(state & mask)) {
+      int count = keyc->modifierKeyCount[i];
+
+      for (key = 0; key < MAP_LENGTH; key++)
+	if (keyc->modifierMap[key] & mask) {
+	  int bit;
+	  BYTE *kptr;
+
+	  kptr = &keyc->down[key >> 3];
+	  bit = 1 << (key & 7);
+
+	  if (*kptr & bit)
+	    xnestQueueKeyEvent(KeyRelease, key);
+
+	  if (--count == 0)
+	    break;
+	}
+    }
+
+    /* Modifier shoud be down, but isn't
+     */
+    if (!(keyc->state & mask) && (state & mask))
+      for (key = 0; key < MAP_LENGTH; key++)
+	if (keyc->modifierMap[key] & mask) {
+	  xnestQueueKeyEvent(KeyPress, key);
+	  break;
+	}
+  }
+}
--- xc/programs/Xserver/hw/xnest/Events.c.xnest-update-modifier-state-fdo3030-fdo3664	2004-08-11 23:40:14.000000000 +0100
+++ xc/programs/Xserver/hw/xnest/Events.c	2005-07-01 14:40:29.000000000 +0100
@@ -34,6 +34,7 @@
 #include "Screen.h"
 #include "XNWindow.h"
 #include "Events.h"
+#include "Keyboard.h"
 #include "mipointer.h"
 
 CARD32 lastEventTime = 0;
@@ -96,6 +97,16 @@
 }
 
 void
+xnestQueueKeyEvent(int type, unsigned int keycode)
+{
+  xEvent x;
+  x.u.u.type = type;
+  x.u.u.detail = keycode;
+  x.u.keyButtonPointer.time = lastEventTime = GetTimeInMillis();
+  mieqEnqueue(&x);
+}
+
+void
 xnestCollectEvents()
 {
   XEvent X;
@@ -105,20 +116,17 @@
   while (XCheckIfEvent(xnestDisplay, &X, xnestNotExposurePredicate, NULL)) {
     switch (X.type) {
     case KeyPress:
-      x.u.u.type = KeyPress;
-      x.u.u.detail = X.xkey.keycode;
-      x.u.keyButtonPointer.time = lastEventTime = GetTimeInMillis();
-      mieqEnqueue(&x);
+      xnestUpdateModifierState(X.xkey.state);
+      xnestQueueKeyEvent(KeyPress, X.xkey.keycode);
       break;
       
     case KeyRelease:
-      x.u.u.type = KeyRelease;
-      x.u.u.detail = X.xkey.keycode;
-      x.u.keyButtonPointer.time = lastEventTime = GetTimeInMillis();
-      mieqEnqueue(&x);
+      xnestUpdateModifierState(X.xkey.state);
+      xnestQueueKeyEvent(KeyRelease, X.xkey.keycode);
       break;
       
     case ButtonPress:
+      xnestUpdateModifierState(X.xkey.state);
       x.u.u.type = ButtonPress;
       x.u.u.detail = X.xbutton.button;
       x.u.keyButtonPointer.time = lastEventTime = GetTimeInMillis();
@@ -126,6 +134,7 @@
       break;
       
     case ButtonRelease:
+      xnestUpdateModifierState(X.xkey.state);
       x.u.u.type = ButtonRelease;
       x.u.u.detail = X.xbutton.button;
       x.u.keyButtonPointer.time = lastEventTime = GetTimeInMillis();
--- xc/programs/Xserver/hw/xnest/Keyboard.h.xnest-update-modifier-state-fdo3030-fdo3664	2004-04-23 20:54:21.000000000 +0100
+++ xc/programs/Xserver/hw/xnest/Keyboard.h	2005-07-01 14:40:14.000000000 +0100
@@ -20,8 +20,11 @@
 #define XNEST_KEYBOARD_EVENT_MASK \
         (KeyPressMask | KeyReleaseMask | FocusChangeMask | KeymapStateMask)
 
+extern DeviceIntPtr xnestKeyboardDevice;
+
 void xnestBell(int volume, DeviceIntPtr pDev, pointer ctrl, int cls);
 void xnestChangeKeyboardControl(DeviceIntPtr pDev, KeybdCtrl *ctrl);
 int xnestKeyboardProc(DeviceIntPtr pDev, int onoff);
+void xnestUpdateModifierState(unsigned int state);
 
 #endif /* XNESTKEYBOARD_H */
--- xc/programs/Xserver/hw/xnest/Init.c.xnest-update-modifier-state-fdo3030-fdo3664	2004-06-21 14:40:25.000000000 +0100
+++ xc/programs/Xserver/hw/xnest/Init.c	2005-07-01 14:40:14.000000000 +0100
@@ -87,15 +87,13 @@
 void
 InitInput(int argc, char *argv[])
 {
-  pointer ptr, kbd;
+  xnestPointerDevice = AddInputDevice(xnestPointerProc, TRUE);
+  xnestKeyboardDevice = AddInputDevice(xnestKeyboardProc, TRUE);
 
-  ptr = AddInputDevice(xnestPointerProc, TRUE);
-  kbd = AddInputDevice(xnestKeyboardProc, TRUE);
+  RegisterPointerDevice(xnestPointerDevice);
+  RegisterKeyboardDevice(xnestKeyboardDevice);
 
-  RegisterPointerDevice(ptr);
-  RegisterKeyboardDevice(kbd);
-
-  mieqInit(kbd, ptr);
+  mieqInit((DevicePtr)xnestKeyboardDevice, (DevicePtr)xnestPointerDevice);
 
   AddEnabledDevice(XConnectionNumber(xnestDisplay));
 
--- xc/programs/Xserver/hw/xnest/Pointer.c.xnest-update-modifier-state-fdo3030-fdo3664	2004-04-23 20:54:21.000000000 +0100
+++ xc/programs/Xserver/hw/xnest/Pointer.c	2005-07-01 14:40:14.000000000 +0100
@@ -31,6 +31,8 @@
 #include "Pointer.h"
 #include "Args.h"
 
+DeviceIntPtr xnestPointerDevice = NULL;
+
 void
 xnestChangePointerControl(DeviceIntPtr pDev, PtrCtrl *ctrl)
 {
 
дизайн и разработка: Vladimir Lettiev aka crux © 2004-2005, Andrew Avramenko aka liks © 2007-2008
текущий майнтейнер: Michael Shigorin