mirror of
https://github.com/debauchee/barrier.git
synced 2024-11-24 06:15:57 +03:00
16110acaa2
and on a secondary screen and locked to the screen (via scroll lock) mouse motion is sent as motion deltas. When true and scroll lock is toggled off the mouse is warped to the secondary screen's center so the server knows where it is. This option is intended to support games and other programs that repeatedly warp the mouse to the center of the screen. This change adds general and X11 support but not win32. The option name is "relativeMouseMoves".
192 lines
5.3 KiB
C++
192 lines
5.3 KiB
C++
/*
|
|
* synergy -- mouse and keyboard sharing utility
|
|
* Copyright (C) 2002 Chris Schoeneman
|
|
*
|
|
* This package is free software; you can redistribute it and/or
|
|
* modify it under the terms of the GNU General Public License
|
|
* found in the file COPYING that should have accompanied this file.
|
|
*
|
|
* This package is distributed in the hope that it will be useful,
|
|
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
* GNU General Public License for more details.
|
|
*/
|
|
|
|
#ifndef CXWINDOWSSCREEN_H
|
|
#define CXWINDOWSSCREEN_H
|
|
|
|
#include "CPlatformScreen.h"
|
|
#include "stdvector.h"
|
|
#if defined(X_DISPLAY_MISSING)
|
|
# error X11 is required to build synergy
|
|
#else
|
|
# include <X11/Xlib.h>
|
|
#endif
|
|
|
|
class CXWindowsClipboard;
|
|
class CXWindowsKeyState;
|
|
class CXWindowsScreenSaver;
|
|
|
|
//! Implementation of IPlatformScreen for X11
|
|
class CXWindowsScreen : public CPlatformScreen {
|
|
public:
|
|
CXWindowsScreen(bool isPrimary);
|
|
virtual ~CXWindowsScreen();
|
|
|
|
//! @name manipulators
|
|
//@{
|
|
|
|
//@}
|
|
|
|
// IScreen overrides
|
|
virtual void* getEventTarget() const;
|
|
virtual bool getClipboard(ClipboardID id, IClipboard*) const;
|
|
virtual void getShape(SInt32& x, SInt32& y,
|
|
SInt32& width, SInt32& height) const;
|
|
virtual void getCursorPos(SInt32& x, SInt32& y) const;
|
|
|
|
// IPrimaryScreen overrides
|
|
virtual void reconfigure(UInt32 activeSides);
|
|
virtual void warpCursor(SInt32 x, SInt32 y);
|
|
virtual SInt32 getJumpZoneSize() const;
|
|
virtual bool isAnyMouseButtonDown() const;
|
|
virtual void getCursorCenter(SInt32& x, SInt32& y) const;
|
|
|
|
// ISecondaryScreen overrides
|
|
virtual void fakeMouseButton(ButtonID id, bool press) const;
|
|
virtual void fakeMouseMove(SInt32 x, SInt32 y) const;
|
|
virtual void fakeMouseRelativeMove(SInt32 dx, SInt32 dy) const;
|
|
virtual void fakeMouseWheel(SInt32 delta) const;
|
|
|
|
// IPlatformScreen overrides
|
|
virtual void enable();
|
|
virtual void disable();
|
|
virtual void enter();
|
|
virtual bool leave();
|
|
virtual bool setClipboard(ClipboardID, const IClipboard*);
|
|
virtual void checkClipboards();
|
|
virtual void openScreensaver(bool notify);
|
|
virtual void closeScreensaver();
|
|
virtual void screensaver(bool activate);
|
|
virtual void resetOptions();
|
|
virtual void setOptions(const COptionsList& options);
|
|
virtual void setSequenceNumber(UInt32);
|
|
virtual bool isPrimary() const;
|
|
|
|
protected:
|
|
// IPlatformScreen overrides
|
|
virtual void handleSystemEvent(const CEvent&, void*);
|
|
virtual void updateButtons();
|
|
virtual IKeyState* getKeyState() const;
|
|
|
|
private:
|
|
// event sending
|
|
void sendEvent(CEvent::Type, void* = NULL);
|
|
void sendClipboardEvent(CEvent::Type, ClipboardID);
|
|
|
|
// create the transparent cursor
|
|
Cursor createBlankCursor() const;
|
|
|
|
// determine the clipboard from the X selection. returns
|
|
// kClipboardEnd if no such clipboard.
|
|
ClipboardID getClipboardID(Atom selection) const;
|
|
|
|
// continue processing a selection request
|
|
void processClipboardRequest(Window window,
|
|
Time time, Atom property);
|
|
|
|
// terminate a selection request
|
|
void destroyClipboardRequest(Window window);
|
|
|
|
// X I/O error handler
|
|
void onError();
|
|
static int ioErrorHandler(Display*);
|
|
|
|
private:
|
|
class CKeyEventFilter {
|
|
public:
|
|
int m_event;
|
|
Window m_window;
|
|
Time m_time;
|
|
KeyCode m_keycode;
|
|
};
|
|
|
|
Display* openDisplay() const;
|
|
void saveShape();
|
|
Window openWindow() const;
|
|
void openIM();
|
|
|
|
bool grabMouseAndKeyboard();
|
|
void onKeyPress(XKeyEvent&);
|
|
void onKeyRelease(XKeyEvent&, bool isRepeat);
|
|
void onMousePress(const XButtonEvent&);
|
|
void onMouseRelease(const XButtonEvent&);
|
|
void onMouseMove(const XMotionEvent&);
|
|
|
|
void selectEvents(Window) const;
|
|
void doSelectEvents(Window) const;
|
|
|
|
KeyID mapKeyFromX(XKeyEvent*) const;
|
|
ButtonID mapButtonFromX(const XButtonEvent*) const;
|
|
unsigned int mapButtonToX(ButtonID id) const;
|
|
|
|
void warpCursorNoFlush(SInt32 x, SInt32 y);
|
|
|
|
static Bool findKeyEvent(Display*, XEvent* xevent, XPointer arg);
|
|
|
|
private:
|
|
// true if screen is being used as a primary screen, false otherwise
|
|
bool m_isPrimary;
|
|
|
|
Display* m_display;
|
|
Window m_root;
|
|
Window m_window;
|
|
|
|
// true if mouse has entered the screen
|
|
bool m_isOnScreen;
|
|
|
|
// screen shape stuff
|
|
SInt32 m_x, m_y;
|
|
SInt32 m_w, m_h;
|
|
SInt32 m_xCenter, m_yCenter;
|
|
|
|
// last mouse position
|
|
SInt32 m_xCursor, m_yCursor;
|
|
|
|
// keyboard stuff
|
|
CXWindowsKeyState* m_keyState;
|
|
|
|
// input method stuff
|
|
XIM m_im;
|
|
XIC m_ic;
|
|
KeyCode m_lastKeycode;
|
|
|
|
// clipboards
|
|
CXWindowsClipboard* m_clipboard[kClipboardEnd];
|
|
UInt32 m_sequenceNumber;
|
|
|
|
// screen saver stuff
|
|
CXWindowsScreenSaver* m_screensaver;
|
|
bool m_screensaverNotify;
|
|
|
|
// logical to physical button mapping. m_buttons[i] gives the
|
|
// physical button for logical button i+1.
|
|
std::vector<unsigned char> m_buttons;
|
|
|
|
// true if global auto-repeat was enabled before we turned it off
|
|
bool m_autoRepeat;
|
|
|
|
// stuff to workaround xtest being xinerama unaware. attempting
|
|
// to fake a mouse motion under xinerama may behave strangely,
|
|
// especially if screen 0 is not at 0,0 or if faking a motion on
|
|
// a screen other than screen 0.
|
|
bool m_xtestIsXineramaUnaware;
|
|
bool m_xinerama;
|
|
|
|
// pointer to (singleton) screen. this is only needed by
|
|
// ioErrorHandler().
|
|
static CXWindowsScreen* s_screen;
|
|
};
|
|
|
|
#endif
|