* Source/x11/XGServerEvent.m (initializeMouse): new method. Calls -mouseOptionsChanged:

and setups observer for defaults changes.
(mouseOptionsChanged:): new method. Read mouse properties from user defaults.
(processEvent:): respect mouse options on ButtonPress and ButtonRelease events.

* Source/x11/XGServer.m (dealloc): remove notification observer.
This commit is contained in:
Sergii Stoian 2019-04-11 01:50:30 +03:00
parent 2f4c96f9d1
commit 7981c3e41c
3 changed files with 123 additions and 20 deletions

View file

@ -1,3 +1,12 @@
2019-04-11 Sergii Stoian <stoyan255@ukr.net>
* Source/x11/XGServerEvent.m (initializeMouse): new method. Calls -mouseOptionsChanged:
and setups observer for defaults changes.
(mouseOptionsChanged:): new method. Read mouse properties from user defaults.
(processEvent:): respect mouse options on ButtonPress and ButtonRelease events.
* Source/x11/XGServer.m (dealloc): remove notification observer.
2019-04-06 Sergii Stoian <stoyan255@ukr.net>
* Source/x11/XGServerWindow.m (hideApplication:): new method name for

View file

@ -40,6 +40,7 @@
#include <Foundation/NSString.h>
#include <Foundation/NSUserDefaults.h>
#include <Foundation/NSDebug.h>
#include <Foundation/NSDistributedNotificationCenter.h>
#include <signal.h>
/* Terminate cleanly if we get a signal to do so */
@ -489,6 +490,7 @@ _parse_display_name(NSString *name, int *dn, int *sn)
- (void) dealloc
{
NSDebugLog(@"Destroying X11 Server");
[[NSDistributedNotificationCenter defaultCenter] removeObserver:self];
DESTROY(inputServer);
[self _destroyServerWindows];
NSFreeMapTable(screenList);

View file

@ -42,6 +42,7 @@
#include <Foundation/NSUserDefaults.h>
#include <Foundation/NSRunLoop.h>
#include <Foundation/NSDebug.h>
#include <Foundation/NSDistributedNotificationCenter.h>
#include "x11/XGServerWindow.h"
#include "x11/XGInputServer.h"
@ -89,6 +90,16 @@ static KeySym _help_keysyms[2];
static BOOL _is_keyboard_initialized = NO;
static BOOL _mod_ignore_shift = NO;
/*
Mouse properties. In comments below specified defaults key and default value.
*/
static NSInteger clickTime; // "GSDoubleClickTime" - milisecond (250)
static NSInteger clickMove; // "GSMouseMoveThreshold" - in pixels (3)
static NSInteger mouseScrollMultiplier; // "GSMouseScrollMultiplier" - times (1)
static NSEventType menuMouseButton; // "GSMenuButtonEvent" - (NSRightMouseButon)
static BOOL menuButtonEnabled; // "GSMenuButtonEnabled" - BOOL
static BOOL swapMouseButtons; // YES if "GSMenuButtonEvent" == NSLeftMouseButton
void __objc_xgcontextevent_linking (void)
{
}
@ -328,6 +339,52 @@ posixFileDescriptor: (NSPosixFileDescriptor*)fileDescriptor
return o;
}
- (void) initializeMouse
{
[self mouseOptionsChanged:nil];
[[NSDistributedNotificationCenter defaultCenter]
addObserver: self
selector: @selector(mouseOptionsChanged:)
name: NSUserDefaultsDidChangeNotification
object: nil];
}
- (void) mouseOptionsChanged: (NSNotification *)aNotif
{
NSUserDefaults *defs = [NSUserDefaults standardUserDefaults];
clickTime = [defs integerForKey:@"GSDoubleClickTime"];
if (clickTime < 250)
clickTime = 250;
clickMove = [defs integerForKey:@"GSMouseMoveThreshold"];
if (clickMove < 3)
clickMove = 3;
mouseScrollMultiplier = [defs integerForKey:@"GSMouseScrollMultiplier"];
if (mouseScrollMultiplier == 0)
mouseScrollMultiplier = 1;
if ([defs objectForKey:@"GSMenuButtonEnabled"])
menuButtonEnabled = [defs boolForKey:@"GSMenuButtonEnabled"];
else
menuButtonEnabled = YES;
if ([defs objectForKey:@"GSMenuButtonEvent"])
menuMouseButton = [defs integerForKey:@"GSMenuButtonEvent"];
else
menuMouseButton = NSRightMouseDown;
switch (menuMouseButton)
{
case NSLeftMouseDown:
swapMouseButtons = YES;
break;
default:
swapMouseButtons = NO;
break;
}
}
- (void) processEvent: (XEvent *) event
{
@ -367,20 +424,20 @@ posixFileDescriptor: (NSPosixFileDescriptor*)fileDescriptor
{
BOOL incrementCount = YES;
#define CLICK_TIME 300
#define CLICK_MOVE 3
if (clickTime == 0) [self initializeMouse];
if (xEvent.xbutton.time
>= (unsigned long)(generic.lastClick + CLICK_TIME))
>= (unsigned long)(generic.lastClick + clickTime))
incrementCount = NO;
else if (generic.lastClickWindow != xEvent.xbutton.window)
incrementCount = NO;
else if ((generic.lastClickX - xEvent.xbutton.x) > CLICK_MOVE)
else if ((generic.lastClickX - xEvent.xbutton.x) > clickMove)
incrementCount = NO;
else if ((generic.lastClickX - xEvent.xbutton.x) < -CLICK_MOVE)
else if ((generic.lastClickX - xEvent.xbutton.x) < -clickMove)
incrementCount = NO;
else if ((generic.lastClickY - xEvent.xbutton.y) > CLICK_MOVE)
else if ((generic.lastClickY - xEvent.xbutton.y) > clickMove)
incrementCount = NO;
else if ((generic.lastClickY - xEvent.xbutton.y) < -CLICK_MOVE)
else if ((generic.lastClickY - xEvent.xbutton.y) < -clickMove)
incrementCount = NO;
if (incrementCount == YES)
@ -406,16 +463,32 @@ posixFileDescriptor: (NSPosixFileDescriptor*)fileDescriptor
deltaY = 0.0;
if (xEvent.xbutton.button == generic.lMouse)
{
if (swapMouseButtons)
{
eventType = NSRightMouseDown;
buttonNumber = generic.rMouse;
}
else
{
eventType = NSLeftMouseDown;
buttonNumber = generic.lMouse;
}
}
else if (xEvent.xbutton.button == generic.rMouse
&& generic.rMouse != 0)
{
if (swapMouseButtons)
{
eventType = NSLeftMouseDown;
buttonNumber = generic.lMouse;
}
else
{
eventType = NSRightMouseDown;
buttonNumber = generic.rMouse;
}
}
else if (xEvent.xbutton.button == generic.mMouse
&& generic.mMouse != 0)
{
@ -425,28 +498,28 @@ posixFileDescriptor: (NSPosixFileDescriptor*)fileDescriptor
else if (xEvent.xbutton.button == generic.upMouse
&& generic.upMouse != 0)
{
deltaY = 1.;
deltaY = 1. * mouseScrollMultiplier;
eventType = NSScrollWheel;
buttonNumber = generic.upMouse;
}
else if (xEvent.xbutton.button == generic.downMouse
&& generic.downMouse != 0)
{
deltaY = -1.;
deltaY = -1. * mouseScrollMultiplier;
eventType = NSScrollWheel;
buttonNumber = generic.downMouse;
}
else if (xEvent.xbutton.button == generic.scrollLeftMouse
&& generic.scrollLeftMouse != 0)
{
deltaX = -1.;
deltaX = -1. * mouseScrollMultiplier;
eventType = NSScrollWheel;
buttonNumber = generic.scrollLeftMouse;
}
else if (xEvent.xbutton.button == generic.scrollRightMouse
&& generic.scrollRightMouse != 0)
{
deltaX = 1.;
deltaX = 1. * mouseScrollMultiplier;
eventType = NSScrollWheel;
buttonNumber = generic.scrollRightMouse;
}
@ -455,6 +528,9 @@ posixFileDescriptor: (NSPosixFileDescriptor*)fileDescriptor
break; /* Unknown button */
}
if (menuButtonEnabled == NO && eventType == menuMouseButton)
break; // disabled menu button was pressed
eventFlags = process_modifier_flags(xEvent.xbutton.state);
// if pointer is grabbed use grab window
xWin = (grabWindow == 0) ? xEvent.xbutton.window : grabWindow;
@ -510,16 +586,32 @@ posixFileDescriptor: (NSPosixFileDescriptor*)fileDescriptor
xEvent.xbutton.window);
[self setLastTime: xEvent.xbutton.time];
if (xEvent.xbutton.button == generic.lMouse)
{
if (swapMouseButtons)
{
eventType = NSRightMouseUp;
buttonNumber = generic.rMouse;
}
else
{
eventType = NSLeftMouseUp;
buttonNumber = generic.lMouse;
}
}
else if (xEvent.xbutton.button == generic.rMouse
&& generic.rMouse != 0)
{
if (swapMouseButtons)
{
eventType = NSLeftMouseUp;
buttonNumber = generic.lMouse;
}
else
{
eventType = NSRightMouseUp;
buttonNumber = generic.rMouse;
}
}
else if (xEvent.xbutton.button == generic.mMouse
&& generic.mMouse != 0)
{