Remove Mouse Emulation from KWin

Mouse Emulation is provided in a better way by KAccess. This provides
a global systemsettings switch to enable mouse emulation instead of
a shortcut and Xkb to enable mouse control with keyboard instead of
sending out fake mouse events.

So no need for duplicated functionality in KWin.

REVIEW: 101406
This commit is contained in:
Martin Gräßlin 2011-05-21 08:50:59 +02:00
parent 163824af85
commit 494edbe76f
4 changed files with 0 additions and 264 deletions

View file

@ -221,10 +221,6 @@ void RootInfo::changeShowingDesktop(bool showing)
*/
bool Workspace::workspaceEvent(XEvent * e)
{
if (mouse_emulation && (e->type == ButtonPress || e->type == ButtonRelease)) {
mouse_emulation = false;
ungrabXKeyboard();
}
if (effects && static_cast< EffectsHandlerImpl* >(effects)->hasKeyboardGrab()
&& (e->type == KeyPress || e->type == KeyRelease))
return false; // let Qt process it, it'll be intercepted again in eventFilter()
@ -410,14 +406,6 @@ bool Workspace::workspaceEvent(XEvent * e)
}
break;
}
case KeyPress:
if (mouse_emulation)
return keyPressMouseEmulation(e->xkey);
break;
case KeyRelease:
if (mouse_emulation)
return false;
break;
case FocusIn:
if (e->xfocus.window == rootWindow()
&& (e->xfocus.detail == NotifyDetailNone || e->xfocus.detail == NotifyPointerRoot)) {

View file

@ -192,7 +192,6 @@ DEF(I18N_NOOP("Switch to Next Screen"), 0, slotSwitchToNextScreen());
a = actionCollection->addAction("Group:Miscellaneous");
a->setText(i18n("Miscellaneous"));
DEF(I18N_NOOP("Mouse Emulation"), Qt::ALT + Qt::Key_F12, slotMouseEmulation());
DEF(I18N_NOOP("Kill Window"), Qt::CTRL + Qt::ALT + Qt::Key_Escape, slotKillWindow());
DEF(I18N_NOOP("Block Global Shortcuts"), 0, slotDisableGlobalShortcuts());
DEF(I18N_NOOP("Suspend Compositing"), Qt::SHIFT + Qt::ALT + Qt::Key_F12, slotToggleCompositing());

View file

@ -122,7 +122,6 @@ Workspace::Workspace(bool restore)
, session_saving(false)
, control_grab(false)
, tab_grab(false)
, mouse_emulation(false)
, block_focus(0)
, tab_box(0)
, desktop_change_osd(0)
@ -1866,246 +1865,6 @@ void Workspace::sendTakeActivity(Client* c, Time timestamp, long flags)
pending_take_activity = c;
}
/**
* Invokes keyboard mouse emulation
*/
void Workspace::slotMouseEmulation()
{
if (mouse_emulation) {
ungrabXKeyboard();
mouse_emulation = false;
return;
}
if (grabXKeyboard()) {
mouse_emulation = true;
mouse_emulation_state = 0;
mouse_emulation_window = 0;
}
}
/**
* Returns the child window under the mouse and activates the
* respective client if necessary.
*
* Auxiliary function for the mouse emulation system.
*/
WId Workspace::getMouseEmulationWindow()
{
Window root;
Window child = rootWindow();
int root_x, root_y, lx, ly;
uint state;
Window w;
Client * c = 0;
do {
w = child;
if (!c)
c = findClient(FrameIdMatchPredicate(w));
XQueryPointer(display(), w, &root, &child, &root_x, &root_y, &lx, &ly, &state);
} while (child != None && child != w);
if (c && !c->isActive())
activateClient(c);
return WId(w);
}
/**
* Sends a faked mouse event to the specified window. Returns the new button state.
*/
unsigned int Workspace::sendFakedMouseEvent(const QPoint& pos, WId w, MouseEmulation type,
int button, unsigned int state)
{
if (!w)
return state;
QWidget* widget = QWidget::find(w);
if ((!widget || qobject_cast<QToolButton*>(widget)) && !findClient(WindowMatchPredicate(w))) {
int x, y;
Window xw;
XTranslateCoordinates(display(), rootWindow(), w, pos.x(), pos.y(), &x, &y, &xw);
if (type == EmuMove) {
// Motion notify events
XEvent e;
e.type = MotionNotify;
e.xmotion.window = w;
e.xmotion.root = rootWindow();
e.xmotion.subwindow = w;
e.xmotion.time = xTime();
e.xmotion.x = x;
e.xmotion.y = y;
e.xmotion.x_root = pos.x();
e.xmotion.y_root = pos.y();
e.xmotion.state = state;
e.xmotion.is_hint = NotifyNormal;
XSendEvent(display(), w, true, ButtonMotionMask, &e);
} else {
XEvent e;
e.type = type == EmuRelease ? ButtonRelease : ButtonPress;
e.xbutton.window = w;
e.xbutton.root = rootWindow();
e.xbutton.subwindow = w;
e.xbutton.time = xTime();
e.xbutton.x = x;
e.xbutton.y = y;
e.xbutton.x_root = pos.x();
e.xbutton.y_root = pos.y();
e.xbutton.state = state;
e.xbutton.button = button;
XSendEvent(display(), w, true, ButtonPressMask, &e);
if (type == EmuPress) {
switch(button) {
case 2:
state |= Button2Mask;
break;
case 3:
state |= Button3Mask;
break;
default: // 1
state |= Button1Mask;
break;
}
} else {
switch(button) {
case 2:
state &= ~Button2Mask;
break;
case 3:
state &= ~Button3Mask;
break;
default: // 1
state &= ~Button1Mask;
break;
}
}
}
}
return state;
}
/**
* Handles keypress event during mouse emulation
*/
bool Workspace::keyPressMouseEmulation(XKeyEvent& ev)
{
int kc = XKeycodeToKeysym(display(), ev.keycode, 0);
int km = ev.state & (ControlMask | Mod1Mask | ShiftMask);
bool is_control = km & ControlMask;
bool is_alt = km & Mod1Mask;
bool is_shift = km & ShiftMask;
int delta = is_control ? 1 : (is_alt ? 32 : 8);
QPoint pos = cursorPos();
switch(kc) {
case XK_Left:
case XK_KP_Left:
pos.rx() -= delta;
break;
case XK_Right:
case XK_KP_Right:
pos.rx() += delta;
break;
case XK_Up:
case XK_KP_Up:
pos.ry() -= delta;
break;
case XK_Down:
case XK_KP_Down:
pos.ry() += delta;
break;
case XK_Home:
case XK_KP_Home:
pos.rx() -= delta;
pos.ry() -= delta;
break;
case XK_Page_Up:
case XK_KP_Page_Up:
pos.rx() += delta;
pos.ry() -= delta;
break;
case XK_Page_Down:
case XK_KP_Page_Down:
pos.rx() += delta;
pos.ry() += delta;
break;
case XK_End:
case XK_KP_End:
pos.rx() -= delta;
pos.ry() += delta;
break;
case XK_F1:
if (!mouse_emulation_state)
mouse_emulation_window = getMouseEmulationWindow();
if ((mouse_emulation_state & Button1Mask) == 0)
mouse_emulation_state = sendFakedMouseEvent(pos, mouse_emulation_window,
EmuPress, Button1, mouse_emulation_state);
if (!is_shift)
mouse_emulation_state = sendFakedMouseEvent(pos, mouse_emulation_window,
EmuRelease, Button1, mouse_emulation_state);
break;
case XK_F2:
if (!mouse_emulation_state)
mouse_emulation_window = getMouseEmulationWindow();
if ((mouse_emulation_state & Button2Mask) == 0)
mouse_emulation_state = sendFakedMouseEvent(pos, mouse_emulation_window,
EmuPress, Button2, mouse_emulation_state);
if (!is_shift)
mouse_emulation_state = sendFakedMouseEvent(pos, mouse_emulation_window,
EmuRelease, Button2, mouse_emulation_state);
break;
case XK_F3:
if (!mouse_emulation_state)
mouse_emulation_window = getMouseEmulationWindow();
if ((mouse_emulation_state & Button3Mask) == 0)
mouse_emulation_state = sendFakedMouseEvent(pos, mouse_emulation_window,
EmuPress, Button3, mouse_emulation_state);
if (!is_shift)
mouse_emulation_state = sendFakedMouseEvent(pos, mouse_emulation_window,
EmuRelease, Button3, mouse_emulation_state);
break;
case XK_Return:
case XK_space:
case XK_KP_Enter:
case XK_KP_Space: {
if (!mouse_emulation_state) {
// Nothing was pressed, fake a LMB click
mouse_emulation_window = getMouseEmulationWindow();
mouse_emulation_state = sendFakedMouseEvent(pos, mouse_emulation_window,
EmuPress, Button1, mouse_emulation_state);
mouse_emulation_state = sendFakedMouseEvent(pos, mouse_emulation_window,
EmuRelease, Button1, mouse_emulation_state);
} else {
// Release all
if (mouse_emulation_state & Button1Mask)
mouse_emulation_state = sendFakedMouseEvent(pos, mouse_emulation_window,
EmuRelease, Button1, mouse_emulation_state);
if (mouse_emulation_state & Button2Mask)
mouse_emulation_state = sendFakedMouseEvent(pos, mouse_emulation_window,
EmuRelease, Button2, mouse_emulation_state);
if (mouse_emulation_state & Button3Mask)
mouse_emulation_state = sendFakedMouseEvent(pos, mouse_emulation_window,
EmuRelease, Button3, mouse_emulation_state);
}
}
// Fall through
case XK_Escape:
ungrabXKeyboard();
mouse_emulation = false;
return true;
default:
return false;
}
QCursor::setPos(pos);
if (mouse_emulation_state)
mouse_emulation_state = sendFakedMouseEvent(pos, mouse_emulation_window,
EmuMove, 0, mouse_emulation_state);
return true;
}
/**
* Delayed focus functions
*/

View file

@ -645,7 +645,6 @@ public slots:
void slotWindowToDesktopUp();
void slotWindowToDesktopDown();
void slotMouseEmulation();
void slotDisableGlobalShortcuts();
void slotSettingsChanged(int category);
@ -730,7 +729,6 @@ private slots:
void reallyStopActivity(const QString &id); //dbus deadlocks suck
protected:
bool keyPressMouseEmulation(XKeyEvent& ev);
void timerEvent(QTimerEvent *te);
Q_SIGNALS:
@ -814,11 +812,6 @@ private:
void loadDesktopSettings();
void saveDesktopSettings();
// Mouse emulation
WId getMouseEmulationWindow();
enum MouseEmulation { EmuPress, EmuRelease, EmuMove };
unsigned int sendFakedMouseEvent(const QPoint& pos, WId win, MouseEmulation type, int button, unsigned int state); // returns the new state
void tabBoxKeyPress(int key);
void tabBoxKeyRelease(const XKeyEvent& ev);
@ -919,9 +912,6 @@ private:
KShortcut cutWalkThroughWindows, cutWalkThroughWindowsReverse;
KShortcut cutWalkThroughGroupWindows, cutWalkThroughGroupWindowsReverse;
KShortcut cutWalkThroughWindowsAlternative, cutWalkThroughWindowsAlternativeReverse;
bool mouse_emulation;
unsigned int mouse_emulation_state;
WId mouse_emulation_window;
int block_focus;
TabBox::TabBox* tab_box;