window-corner snapping added, and also is a run-time option.
# Focus New Windows
$ #FocusLast
# Focus Window on Workspace Change
+$ #WindowToWindowSnap
+# Window-To-Window Snapping
+$ #WindowCornerSnap
+# Window Corner Snapping
$ #HideToolbar
# Hide Toolbar
$ #ClickToFocus
"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();
}
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());
}
}
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;
}
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
-
- 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();
-
- // 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;
-
- // 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 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();
-
- 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();
-
- continue;
+ 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());
+
+ // snap left of other window?
+ if (dleft < snap_distance && dleft <= dright) {
+ dx = winrect.left() - frame.rect.width();
+
+ 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;
+
+ 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 top of other window?
+ if (dtop < snap_distance && dtop <= dbottom) {
+ dy = winrect.top() - frame.rect.height();
+
+ 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;
+
+ 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;
+ }
}
}
}
+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
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));
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;
}
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;
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
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);