added OnLeftGrip, OnRightGrip, OnWindowBorder modifiers for keys file

this allows to move some hardcoded keysbindings into the keys file and
makes the code simpler
This commit is contained in:
Mathias Gumz 2010-05-05 08:41:03 +02:00
parent c1ed891946
commit a10bab0f7c
3 changed files with 164 additions and 163 deletions

View file

@ -352,6 +352,10 @@ void Keys::loadDefaults() {
addBinding("OnDesktop Mouse2 :WorkspaceMenu");
addBinding("OnDesktop Mouse3 :RootMenu");
addBinding("OnTitlebar Mouse3 :WindowMenu");
addBinding("OnTitlebar Move1 :StartMoving");
addBinding("OnLeftGrip Move1 :StartResizing bottomleft");
addBinding("OnRighttGrip Move1 :StartResizing bottomright");
addBinding("OnWindowBorder Move1 :StartMoving");
addBinding("Mod1 Tab :NextWindow");
addBinding("Mod1 Shift Tab :PrevWindow");
keyMode("default");
@ -402,6 +406,12 @@ bool Keys::addBinding(const string &linebuffer) {
context |= ON_WINDOW;
else if (arg == "ontitlebar")
context |= ON_TITLEBAR;
else if (arg == "onwindowborder")
context |= ON_WINDOWBORDER;
else if (arg == "onleftgrip")
context |= ON_LEFTGRIP;
else if (arg == "onrightgrip")
context |= ON_RIGHTGRIP;
else if (arg == "double")
isdouble = true;
else if (arg != "none") {

View file

@ -42,14 +42,17 @@ public:
// it's ok if there is overlap; it will be worked out in t_key::find()
// eventHandlers should submit bitwise-or of contexts the event happened in
enum {
GLOBAL = 0x01,
ON_DESKTOP = 0x02,
ON_TOOLBAR = 0x04,
ON_ICONBUTTON = 0x08,
ON_TITLEBAR = 0x10,
ON_WINDOW = 0x20,
ON_TAB = 0x40,
ON_SLIT = 0x80
GLOBAL = 1 << 0,
ON_DESKTOP = 1 << 1,
ON_TOOLBAR = 1 << 2,
ON_ICONBUTTON = 1 << 3,
ON_TITLEBAR = 1 << 4,
ON_WINDOW = 1 << 5,
ON_WINDOWBORDER = 1 << 6,
ON_LEFTGRIP = 1 << 7,
ON_RIGHTGRIP = 1 << 8,
ON_TAB = 1 << 9,
ON_SLIT = 1 << 10
// and so on...
};

View file

@ -2406,205 +2406,193 @@ void FluxboxWindow::motionNotifyEvent(XMotionEvent &me) {
}
bool inside_titlebar = frame().insideTitlebar( me.window );
bool inside_grips = (me.window == frame().gripRight() || me.window == frame().gripLeft());
bool inside_border = false;
if (!inside_grips)
{
using RectangleUtil::insideBorder;
int borderw = frame().window().borderWidth();
//!! TODO(tabs): the below test ought to be in FbWinFrame
inside_border =
// if mouse is currently on the window border, ignore it
! insideBorder(frame(), me.x_root, me.y_root, borderw) &&
( !frame().externalTabMode() ||
! insideBorder(frame().tabcontainer(), me.x_root, me.y_root, borderw) )
|| // or if mouse was on border when it was last clicked
! insideBorder(frame(), m_last_button_x, m_last_button_y, borderw) &&
( ! frame().externalTabMode() ||
! insideBorder(frame().tabcontainer(), m_last_button_x, m_last_button_y, borderw ) );
}
if (Fluxbox::instance()->getIgnoreBorder() && m_attaching_tab == 0
&& !(isMoving() || isResizing())) {
using RectangleUtil::insideBorder;
int borderw = frame().window().borderWidth();
//!! TODO(tabs): the below test ought to be in FbWinFrame
// if mouse is currently on the window border, ignore it
if ( ! insideBorder(frame(), me.x_root, me.y_root, borderw) &&
( !frame().externalTabMode() ||
! insideBorder(frame().tabcontainer(), me.x_root, me.y_root, borderw) )
|| // or if mouse was on border when it was last clicked
! insideBorder(frame(), m_last_button_x, m_last_button_y, borderw) &&
( ! frame().externalTabMode() ||
! insideBorder(frame().tabcontainer(), m_last_button_x, m_last_button_y, borderw ) ) ) {
if (inside_border) {
return;
}
}
int context = Keys::ON_WINDOW;
if (inside_titlebar) {
context = Keys::ON_TITLEBAR;
} else if (inside_border) {
context = Keys::ON_WINDOWBORDER;
} else if (me.window == frame().gripRight()) {
context = Keys::ON_RIGHTGRIP;
} else if (me.window == frame().gripLeft()) {
context = Keys::ON_LEFTGRIP;
}
// in case someone put MoveX :StartMoving etc into keys, we have
// to activate it before doing the actual motionNotify code
Fluxbox::instance()->keys()->doAction(me.type, me.state, m_last_pressed_button,
inside_titlebar ? Keys::ON_TITLEBAR : Keys::ON_WINDOW,
&winClient(), me.time);
Fluxbox::instance()->keys()->doAction(me.type, me.state, m_last_pressed_button, context, &winClient(), me.time);
if (moving || ((me.state & Button1Mask) && functions.move &&
inside_titlebar && !isResizing() && m_attaching_tab == 0)) {
if (moving) {
if (! isMoving()) {
startMoving(me.x_root, me.y_root);
} else {
// Warp to next or previous workspace?, must have moved sideways some
int moved_x = me.x_root - m_last_resize_x;
// save last event point
m_last_resize_x = me.x_root;
m_last_resize_y = me.y_root;
// Warp to next or previous workspace?, must have moved sideways some
int moved_x = me.x_root - m_last_resize_x;
// save last event point
m_last_resize_x = me.x_root;
m_last_resize_y = me.y_root;
// undraw rectangle before warping workspaces
if (!screen().doOpaqueMove()) {
parent().drawRectangle(screen().rootTheme()->opGC(),
m_last_move_x, m_last_move_y,
frame().width() + 2*frame().window().borderWidth()-1,
frame().height() + 2*frame().window().borderWidth()-1);
}
// undraw rectangle before warping workspaces
if (!screen().doOpaqueMove()) {
parent().drawRectangle(screen().rootTheme()->opGC(),
m_last_move_x, m_last_move_y,
frame().width() + 2*frame().window().borderWidth()-1,
frame().height() + 2*frame().window().borderWidth()-1);
}
if (moved_x && screen().isWorkspaceWarping()) {
unsigned int cur_id = screen().currentWorkspaceID();
unsigned int new_id = cur_id;
const int warpPad = screen().getEdgeSnapThreshold();
// 1) if we're inside the border threshold
// 2) if we moved in the right direction
if (me.x_root >= int(screen().width()) - warpPad - 1 &&
if (moved_x && screen().isWorkspaceWarping()) {
unsigned int cur_id = screen().currentWorkspaceID();
unsigned int new_id = cur_id;
const int warpPad = screen().getEdgeSnapThreshold();
// 1) if we're inside the border threshold
// 2) if we moved in the right direction
if (me.x_root >= int(screen().width()) - warpPad - 1 &&
moved_x > 0) {
//warp right
new_id = (cur_id + 1) % screen().numberOfWorkspaces();
m_last_resize_x = 0; // move mouse back to x=0
} else if (me.x_root <= warpPad &&
moved_x < 0) {
//warp left
new_id = (cur_id + screen().numberOfWorkspaces() - 1) % screen().numberOfWorkspaces();
m_last_resize_x = screen().width() - 1; // move mouse to screen width - 1
}
if (new_id != cur_id) {
// remove motion events from queue to avoid repeated warps
XEvent e;
while (XCheckTypedEvent(display, MotionNotify, &e)) {
// might as well update the y-coordinate
m_last_resize_y = e.xmotion.y_root;
}
// move the pointer to (m_last_resize_x,m_last_resize_y)
XWarpPointer(display, None, me.root, 0, 0, 0, 0,
m_last_resize_x, m_last_resize_y);
if (screen().doOpaqueMove())
screen().sendToWorkspace(new_id, this, true);
else
screen().changeWorkspaceID(new_id, false);
}
//warp right
new_id = (cur_id + 1) % screen().numberOfWorkspaces();
m_last_resize_x = 0; // move mouse back to x=0
} else if (me.x_root <= warpPad &&
moved_x < 0) {
//warp left
new_id = (cur_id + screen().numberOfWorkspaces() - 1) % screen().numberOfWorkspaces();
m_last_resize_x = screen().width() - 1; // move mouse to screen width - 1
}
if (new_id != cur_id) {
int dx = m_last_resize_x - m_button_grab_x,
dy = m_last_resize_y - m_button_grab_y;
// remove motion events from queue to avoid repeated warps
XEvent e;
while (XCheckTypedEvent(display, MotionNotify, &e)) {
// might as well update the y-coordinate
m_last_resize_y = e.xmotion.y_root;
}
dx -= frame().window().borderWidth();
dy -= frame().window().borderWidth();
// move the pointer to (m_last_resize_x,m_last_resize_y)
XWarpPointer(display, None, me.root, 0, 0, 0, 0,
m_last_resize_x, m_last_resize_y);
// dx = current left side, dy = current top
doSnapping(dx, dy);
if (!screen().doOpaqueMove()) {
parent().drawRectangle(screen().rootTheme()->opGC(),
dx, dy,
frame().width() + 2*frame().window().borderWidth()-1,
frame().height() + 2*frame().window().borderWidth()-1);
m_last_move_x = dx;
m_last_move_y = dy;
} else {
//moveResize(dx, dy, frame().width(), frame().height());
// need to move the base window without interfering with transparency
frame().quietMoveResize(dx, dy, frame().width(), frame().height());
if (screen().doOpaqueMove())
screen().sendToWorkspace(new_id, this, true);
else
screen().changeWorkspaceID(new_id, false);
}
}
screen().showPosition(dx, dy);
} // end if moving
} else if (resizing || (m_attaching_tab == 0 && functions.resize &&
(((me.state & Button1Mask) &&
(me.window == frame().gripRight() ||
me.window == frame().gripLeft())) ||
me.window == frame().window()))) {
int dx = m_last_resize_x - m_button_grab_x,
dy = m_last_resize_y - m_button_grab_y;
if (! resizing) {
dx -= frame().window().borderWidth();
dy -= frame().window().borderWidth();
ReferenceCorner resize_corner = RIGHTBOTTOM;
if (me.window == frame().gripRight())
resize_corner = RIGHTBOTTOM;
else if (me.window == frame().gripLeft())
resize_corner = LEFTBOTTOM;
else // dragging border of window, so choose nearest corner
resize_corner = getResizeDirection(me.x, me.y, QUADRANTRESIZE);
// dx = current left side, dy = current top
doSnapping(dx, dy);
// We are grabbing frame window in startResizing
// we need to translate coordinates to it.
int start_x = me.x, start_y = me.y;
Window child;
XTranslateCoordinates(display,
me.window, fbWindow().window(),
start_x, start_y,
&start_x, &start_y,
&child);
if (!screen().doOpaqueMove()) {
parent().drawRectangle(screen().rootTheme()->opGC(),
dx, dy,
frame().width() + 2*frame().window().borderWidth()-1,
frame().height() + 2*frame().window().borderWidth()-1);
m_last_move_x = dx;
m_last_move_y = dy;
} else {
//moveResize(dx, dy, frame().width(), frame().height());
// need to move the base window without interfering with transparency
frame().quietMoveResize(dx, dy, frame().width(), frame().height());
}
startResizing(start_x, start_y, resize_corner);
screen().showPosition(dx, dy);
// end if moving
} else if (resizing) {
} else if (resizing) {
int old_resize_x = m_last_resize_x;
int old_resize_y = m_last_resize_y;
int old_resize_w = m_last_resize_w;
int old_resize_h = m_last_resize_h;
int old_resize_x = m_last_resize_x;
int old_resize_y = m_last_resize_y;
int old_resize_w = m_last_resize_w;
int old_resize_h = m_last_resize_h;
int dx = me.x - m_button_grab_x;
int dy = me.y - m_button_grab_y;
int dx = me.x - m_button_grab_x;
int dy = me.y - m_button_grab_y;
if (m_resize_corner == LEFTTOP || m_resize_corner == LEFTBOTTOM ||
if (m_resize_corner == LEFTTOP || m_resize_corner == LEFTBOTTOM ||
m_resize_corner == LEFT) {
m_last_resize_w = frame().width() - dx;
m_last_resize_x = frame().x() + dx;
}
if (m_resize_corner == LEFTTOP || m_resize_corner == RIGHTTOP ||
m_last_resize_w = frame().width() - dx;
m_last_resize_x = frame().x() + dx;
}
if (m_resize_corner == LEFTTOP || m_resize_corner == RIGHTTOP ||
m_resize_corner == TOP) {
m_last_resize_h = frame().height() - dy;
m_last_resize_y = frame().y() + dy;
}
if (m_resize_corner == LEFTBOTTOM || m_resize_corner == BOTTOM ||
m_last_resize_h = frame().height() - dy;
m_last_resize_y = frame().y() + dy;
}
if (m_resize_corner == LEFTBOTTOM || m_resize_corner == BOTTOM ||
m_resize_corner == RIGHTBOTTOM)
m_last_resize_h = frame().height() + dy;
if (m_resize_corner == RIGHTBOTTOM || m_resize_corner == RIGHTTOP ||
m_last_resize_h = frame().height() + dy;
if (m_resize_corner == RIGHTBOTTOM || m_resize_corner == RIGHTTOP ||
m_resize_corner == RIGHT)
m_last_resize_w = frame().width() + dx;
if (m_resize_corner == CENTER) {
// dx or dy must be at least 2
if (abs(dx) >= 2 || abs(dy) >= 2) {
// take max and make it even
int diff = 2 * (max(dx, dy) / 2);
m_last_resize_w = frame().width() + dx;
if (m_resize_corner == CENTER) {
// dx or dy must be at least 2
if (abs(dx) >= 2 || abs(dy) >= 2) {
// take max and make it even
int diff = 2 * (max(dx, dy) / 2);
m_last_resize_h = frame().height() + diff;
m_last_resize_h = frame().height() + diff;
m_last_resize_w = frame().width() + diff;
m_last_resize_x = frame().x() - diff/2;
m_last_resize_y = frame().y() - diff/2;
}
m_last_resize_w = frame().width() + diff;
m_last_resize_x = frame().x() - diff/2;
m_last_resize_y = frame().y() - diff/2;
}
}
fixSize();
frame().displaySize(m_last_resize_w, m_last_resize_h);
fixSize();
frame().displaySize(m_last_resize_w, m_last_resize_h);
if (old_resize_x != m_last_resize_x ||
if (old_resize_x != m_last_resize_x ||
old_resize_y != m_last_resize_y ||
old_resize_w != m_last_resize_w ||
old_resize_h != m_last_resize_h ) {
// draw over old rect
parent().drawRectangle(screen().rootTheme()->opGC(),
old_resize_x, old_resize_y,
old_resize_w - 1 + 2 * frame().window().borderWidth(),
old_resize_h - 1 + 2 * frame().window().borderWidth());
// draw over old rect
parent().drawRectangle(screen().rootTheme()->opGC(),
old_resize_x, old_resize_y,
old_resize_w - 1 + 2 * frame().window().borderWidth(),
old_resize_h - 1 + 2 * frame().window().borderWidth());
// draw resize rectangle
parent().drawRectangle(screen().rootTheme()->opGC(),
m_last_resize_x, m_last_resize_y,
m_last_resize_w - 1 + 2 * frame().window().borderWidth(),
m_last_resize_h - 1 + 2 * frame().window().borderWidth());
// draw resize rectangle
parent().drawRectangle(screen().rootTheme()->opGC(),
m_last_resize_x, m_last_resize_y,
m_last_resize_w - 1 + 2 * frame().window().borderWidth(),
m_last_resize_h - 1 + 2 * frame().window().borderWidth());
}
}
} else if (m_attaching_tab != 0) {
//