window-to-window snapping is now a run-time option.
window-corner snapping added, and also is a run-time option.
This commit is contained in:
parent
f0c2fa18be
commit
a7db565c75
5 changed files with 137 additions and 66 deletions
|
@ -16,6 +16,10 @@ $ #FocusNew
|
|||
# Focus New Windows
|
||||
$ #FocusLast
|
||||
# Focus Window on Workspace Change
|
||||
$ #WindowToWindowSnap
|
||||
# Window-To-Window Snapping
|
||||
$ #WindowCornerSnap
|
||||
# Window Corner Snapping
|
||||
$ #HideToolbar
|
||||
# Hide Toolbar
|
||||
$ #ClickToFocus
|
||||
|
|
|
@ -53,8 +53,12 @@ Configmenu::Configmenu(BScreen *scr) : Basemenu(scr) {
|
|||
"Focus New Windows"), 4);
|
||||
insert(i18n(ConfigmenuSet, ConfigmenuFocusLast,
|
||||
"Focus Last Window on Workspace"), 5);
|
||||
insert(i18n(ConfigmenuSet, ConfigmenuWindowToWindowSnap,
|
||||
"Window-To-Window Snapping"), 6);
|
||||
insert(i18n(ConfigmenuSet, ConfigmenuWindowCornerSnap,
|
||||
"Window Corner Snapping"), 7);
|
||||
insert(i18n(ConfigmenuSet, ConfigmenuHideToolbar,
|
||||
"Hide Toolbar"), 6);
|
||||
"Hide Toolbar"), 8);
|
||||
update();
|
||||
setValues();
|
||||
}
|
||||
|
@ -66,7 +70,12 @@ void Configmenu::setValues(void) {
|
|||
setItemSelected(4, getScreen()->doFullMax());
|
||||
setItemSelected(5, getScreen()->doFocusNew());
|
||||
setItemSelected(6, getScreen()->doFocusLast());
|
||||
setItemSelected(7, getScreen()->doHideToolbar());
|
||||
setItemSelected(7, getScreen()->getBlackbox()->getWindowToWindowSnap());
|
||||
|
||||
setItemSelected(8, getScreen()->getBlackbox()->getWindowCornerSnap());
|
||||
setItemEnabled(8, getScreen()->getBlackbox()->getWindowToWindowSnap());
|
||||
|
||||
setItemSelected(9, getScreen()->doHideToolbar());
|
||||
}
|
||||
|
||||
|
||||
|
@ -92,30 +101,47 @@ void Configmenu::itemSelected(int button, unsigned int index) {
|
|||
}
|
||||
|
||||
case 2: { // opaque move
|
||||
getScreen()->saveOpaqueMove((! getScreen()->doOpaqueMove()));
|
||||
getScreen()->saveOpaqueMove(! getScreen()->doOpaqueMove());
|
||||
setItemSelected(index, getScreen()->doOpaqueMove());
|
||||
break;
|
||||
}
|
||||
|
||||
case 3: { // full maximization
|
||||
getScreen()->saveFullMax((! getScreen()->doFullMax()));
|
||||
getScreen()->saveFullMax(! getScreen()->doFullMax());
|
||||
setItemSelected(index, getScreen()->doFullMax());
|
||||
break;
|
||||
}
|
||||
case 4: { // focus new windows
|
||||
getScreen()->saveFocusNew((! getScreen()->doFocusNew()));
|
||||
getScreen()->saveFocusNew(! getScreen()->doFocusNew());
|
||||
setItemSelected(index, getScreen()->doFocusNew());
|
||||
break;
|
||||
}
|
||||
|
||||
case 5: { // focus last window on workspace
|
||||
getScreen()->saveFocusLast((! getScreen()->doFocusLast()));
|
||||
getScreen()->saveFocusLast(! getScreen()->doFocusLast());
|
||||
setItemSelected(index, getScreen()->doFocusLast());
|
||||
break;
|
||||
}
|
||||
|
||||
case 6: { // hide toolbar
|
||||
getScreen()->saveHideToolbar((! getScreen()->doHideToolbar()));
|
||||
case 6: { // window-to-window snapping
|
||||
getScreen()->getBlackbox()->
|
||||
saveWindowToWindowSnap(! getScreen()->getBlackbox()->
|
||||
getWindowToWindowSnap());
|
||||
setItemSelected(index, getScreen()->getBlackbox()->getWindowToWindowSnap());
|
||||
setItemEnabled(index + 1,
|
||||
getScreen()->getBlackbox()->getWindowToWindowSnap());
|
||||
break;
|
||||
}
|
||||
|
||||
case 7: { // window corner snapping
|
||||
getScreen()->getBlackbox()->
|
||||
saveWindowCornerSnap(! getScreen()->getBlackbox()->getWindowCornerSnap());
|
||||
setItemSelected(index, getScreen()->getBlackbox()->getWindowCornerSnap());
|
||||
break;
|
||||
}
|
||||
|
||||
case 8: { // hide toolbar
|
||||
getScreen()->saveHideToolbar(! getScreen()->doHideToolbar());
|
||||
setItemSelected(index, getScreen()->doHideToolbar());
|
||||
break;
|
||||
}
|
||||
|
|
124
src/Window.cc
124
src/Window.cc
|
@ -2525,74 +2525,84 @@ void BlackboxWindow::motionNotifyEvent(XMotionEvent *me) {
|
|||
Workspace *w = screen->getWorkspace(getWorkspaceNumber());
|
||||
assert(w);
|
||||
|
||||
// try snap to another window
|
||||
for (unsigned int i = 0, c = w->getCount(); i < c; ++i) {
|
||||
BlackboxWindow *snapwin = w->getWindow(i);
|
||||
if (snapwin == this)
|
||||
continue; // don't snap to self
|
||||
if (blackbox->getWindowToWindowSnap()) {
|
||||
// try snap to another window
|
||||
for (unsigned int i = 0, c = w->getCount(); i < c; ++i) {
|
||||
BlackboxWindow *snapwin = w->getWindow(i);
|
||||
if (snapwin == this)
|
||||
continue; // don't snap to self
|
||||
|
||||
const Rect &winrect = snapwin->frameRect();
|
||||
int dleft = std::abs(wright - winrect.left()),
|
||||
dright = std::abs(wleft - winrect.right()),
|
||||
dtop = std::abs(wbottom - winrect.top()),
|
||||
dbottom = std::abs(wtop - winrect.bottom());
|
||||
const Rect &winrect = snapwin->frameRect();
|
||||
int dleft = std::abs(wright - winrect.left()),
|
||||
dright = std::abs(wleft - winrect.right()),
|
||||
dtop = std::abs(wbottom - winrect.top()),
|
||||
dbottom = std::abs(wtop - winrect.bottom());
|
||||
|
||||
// snap left of other window?
|
||||
if (dleft < snap_distance && dleft <= dright) {
|
||||
dx = winrect.left() - frame.rect.width();
|
||||
// snap left of other window?
|
||||
if (dleft < snap_distance && dleft <= dright) {
|
||||
dx = winrect.left() - frame.rect.width();
|
||||
|
||||
// try corner-snap to its other sides
|
||||
dtop = std::abs(wtop - winrect.top());
|
||||
dbottom = std::abs(wbottom - winrect.bottom());
|
||||
if (dtop < snap_distance && dtop <= dbottom)
|
||||
dy = winrect.top();
|
||||
else if (dbottom < snap_distance)
|
||||
dy = winrect.bottom() - frame.rect.height();
|
||||
if (blackbox->getWindowCornerSnap()) {
|
||||
// try corner-snap to its other sides
|
||||
dtop = std::abs(wtop - winrect.top());
|
||||
dbottom = std::abs(wbottom - winrect.bottom());
|
||||
if (dtop < snap_distance && dtop <= dbottom)
|
||||
dy = winrect.top();
|
||||
else if (dbottom < snap_distance)
|
||||
dy = winrect.bottom() - frame.rect.height();
|
||||
}
|
||||
|
||||
continue;
|
||||
}
|
||||
// snap right of other window?
|
||||
else if (dright < snap_distance) {
|
||||
dx = winrect.right() + 1;
|
||||
continue;
|
||||
}
|
||||
// snap right of other window?
|
||||
else if (dright < snap_distance) {
|
||||
dx = winrect.right() + 1;
|
||||
|
||||
// try corner-snap to its other sides
|
||||
dtop = std::abs(wtop - winrect.top());
|
||||
dbottom = std::abs(wbottom - winrect.bottom());
|
||||
if (dtop < snap_distance && dtop <= dbottom)
|
||||
dy = winrect.top();
|
||||
else if (dbottom < snap_distance)
|
||||
dy = winrect.bottom() - frame.rect.height();
|
||||
if (blackbox->getWindowCornerSnap()) {
|
||||
// try corner-snap to its other sides
|
||||
dtop = std::abs(wtop - winrect.top());
|
||||
dbottom = std::abs(wbottom - winrect.bottom());
|
||||
if (dtop < snap_distance && dtop <= dbottom)
|
||||
dy = winrect.top();
|
||||
else if (dbottom < snap_distance)
|
||||
dy = winrect.bottom() - frame.rect.height();
|
||||
}
|
||||
|
||||
continue;
|
||||
}
|
||||
continue;
|
||||
}
|
||||
|
||||
// snap top of other window?
|
||||
if (dtop < snap_distance && dtop <= dbottom) {
|
||||
dy = winrect.top() - frame.rect.height();
|
||||
// snap top of other window?
|
||||
if (dtop < snap_distance && dtop <= dbottom) {
|
||||
dy = winrect.top() - frame.rect.height();
|
||||
|
||||
// try corner-snap to its other sides
|
||||
dleft = std::abs(wleft - winrect.left());
|
||||
dright = std::abs(wright - winrect.right());
|
||||
if (dleft < snap_distance && dleft <= dright)
|
||||
dx = winrect.left();
|
||||
else if (dright < snap_distance)
|
||||
dx = winrect.right() - frame.rect.width();
|
||||
if (blackbox->getWindowCornerSnap()) {
|
||||
// try corner-snap to its other sides
|
||||
dleft = std::abs(wleft - winrect.left());
|
||||
dright = std::abs(wright - winrect.right());
|
||||
if (dleft < snap_distance && dleft <= dright)
|
||||
dx = winrect.left();
|
||||
else if (dright < snap_distance)
|
||||
dx = winrect.right() - frame.rect.width();
|
||||
}
|
||||
|
||||
continue;
|
||||
}
|
||||
// snap bottom of other window?
|
||||
else if (dbottom < snap_distance) {
|
||||
dy = winrect.bottom() + 1;
|
||||
continue;
|
||||
}
|
||||
// snap bottom of other window?
|
||||
else if (dbottom < snap_distance) {
|
||||
dy = winrect.bottom() + 1;
|
||||
|
||||
// try corner-snap to its other sides
|
||||
dleft = std::abs(wleft - winrect.left());
|
||||
dright = std::abs(wright - winrect.right());
|
||||
if (dleft < snap_distance && dleft <= dright)
|
||||
dx = winrect.left();
|
||||
else if (dright < snap_distance)
|
||||
dx = winrect.right() - frame.rect.width();
|
||||
if (blackbox->getWindowCornerSnap()) {
|
||||
// try corner-snap to its other sides
|
||||
dleft = std::abs(wleft - winrect.left());
|
||||
dright = std::abs(wright - winrect.right());
|
||||
if (dleft < snap_distance && dleft <= dright)
|
||||
dx = winrect.left();
|
||||
else if (dright < snap_distance)
|
||||
dx = winrect.right() - frame.rect.width();
|
||||
}
|
||||
|
||||
continue;
|
||||
continue;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
|
|
@ -896,6 +896,18 @@ void Blackbox::shutdown(void) {
|
|||
}
|
||||
|
||||
|
||||
void Blackbox::saveWindowToWindowSnap(bool s) {
|
||||
resource.window_to_window_snap = s;
|
||||
config.setValue("session.windowToWindowSnap", resource.window_to_window_snap);
|
||||
}
|
||||
|
||||
|
||||
void Blackbox::saveWindowCornerSnap(bool s) {
|
||||
resource.window_corner_snap = s;
|
||||
config.setValue("session.windowCornerSnap", resource.window_corner_snap);
|
||||
}
|
||||
|
||||
|
||||
/*
|
||||
* Save all values as they are so that the defaults will be written to the rc
|
||||
* file
|
||||
|
@ -913,6 +925,8 @@ void Blackbox::save_rc(void) {
|
|||
config.setValue("session.cacheMax", resource.cache_max);
|
||||
config.setValue("session.styleFile", resource.style_file);
|
||||
config.setValue("session.titlebarLayout", resource.titlebar_layout);
|
||||
saveWindowToWindowSnap(resource.window_to_window_snap);
|
||||
saveWindowCornerSnap(resource.window_corner_snap);
|
||||
|
||||
std::for_each(screenList.begin(), screenList.end(),
|
||||
std::mem_fun(&BScreen::save_rc));
|
||||
|
@ -960,6 +974,14 @@ void Blackbox::load_rc(void) {
|
|||
|
||||
if (! config.getValue("session.titlebarLayout", resource.titlebar_layout))
|
||||
resource.titlebar_layout = "ILMC";
|
||||
|
||||
if (! config.getValue("session.windowToWindowSnap",
|
||||
resource.window_to_window_snap))
|
||||
resource.window_to_window_snap = true;
|
||||
|
||||
if (! config.getValue("session.windowCornerSnap",
|
||||
resource.window_corner_snap))
|
||||
resource.window_corner_snap = true;
|
||||
}
|
||||
|
||||
|
||||
|
|
|
@ -115,6 +115,8 @@ private:
|
|||
timeval auto_raise_delay;
|
||||
unsigned long cache_life, cache_max;
|
||||
std::string titlebar_layout;
|
||||
bool window_to_window_snap;
|
||||
bool window_corner_snap;
|
||||
} resource;
|
||||
|
||||
typedef std::map<Window, BlackboxWindow*> WindowLookup;
|
||||
|
@ -215,6 +217,11 @@ public:
|
|||
inline unsigned long getCacheMax(void) const
|
||||
{ return resource.cache_max; }
|
||||
|
||||
inline bool getWindowToWindowSnap(void) const
|
||||
{ return resource.window_to_window_snap; }
|
||||
inline bool getWindowCornerSnap(void) const
|
||||
{ return resource.window_corner_snap; }
|
||||
|
||||
inline void setNoFocus(bool f) { no_focus = f; }
|
||||
|
||||
inline Cursor getSessionCursor(void) const
|
||||
|
@ -229,6 +236,8 @@ public:
|
|||
void setFocusedWindow(BlackboxWindow *w);
|
||||
void shutdown(void);
|
||||
void saveStyleFilename(const std::string& filename);
|
||||
void saveWindowToWindowSnap(bool);
|
||||
void saveWindowCornerSnap(bool);
|
||||
void addMenuTimestamp(const std::string& filename);
|
||||
void restart(const char *prog = 0);
|
||||
void reconfigure(void);
|
||||
|
|
Loading…
Reference in a new issue