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:
Dana Jansens 2002-06-02 00:30:55 +00:00
parent f0c2fa18be
commit a7db565c75
5 changed files with 137 additions and 66 deletions

View file

@ -16,6 +16,10 @@ $ #FocusNew
# Focus New Windows # Focus New Windows
$ #FocusLast $ #FocusLast
# Focus Window on Workspace Change # Focus Window on Workspace Change
$ #WindowToWindowSnap
# Window-To-Window Snapping
$ #WindowCornerSnap
# Window Corner Snapping
$ #HideToolbar $ #HideToolbar
# Hide Toolbar # Hide Toolbar
$ #ClickToFocus $ #ClickToFocus

View file

@ -53,8 +53,12 @@ Configmenu::Configmenu(BScreen *scr) : Basemenu(scr) {
"Focus New Windows"), 4); "Focus New Windows"), 4);
insert(i18n(ConfigmenuSet, ConfigmenuFocusLast, insert(i18n(ConfigmenuSet, ConfigmenuFocusLast,
"Focus Last Window on Workspace"), 5); "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, insert(i18n(ConfigmenuSet, ConfigmenuHideToolbar,
"Hide Toolbar"), 6); "Hide Toolbar"), 8);
update(); update();
setValues(); setValues();
} }
@ -66,7 +70,12 @@ void Configmenu::setValues(void) {
setItemSelected(4, getScreen()->doFullMax()); setItemSelected(4, getScreen()->doFullMax());
setItemSelected(5, getScreen()->doFocusNew()); setItemSelected(5, getScreen()->doFocusNew());
setItemSelected(6, getScreen()->doFocusLast()); 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 case 2: { // opaque move
getScreen()->saveOpaqueMove((! getScreen()->doOpaqueMove())); getScreen()->saveOpaqueMove(! getScreen()->doOpaqueMove());
setItemSelected(index, getScreen()->doOpaqueMove()); setItemSelected(index, getScreen()->doOpaqueMove());
break; break;
} }
case 3: { // full maximization case 3: { // full maximization
getScreen()->saveFullMax((! getScreen()->doFullMax())); getScreen()->saveFullMax(! getScreen()->doFullMax());
setItemSelected(index, getScreen()->doFullMax()); setItemSelected(index, getScreen()->doFullMax());
break; break;
} }
case 4: { // focus new windows case 4: { // focus new windows
getScreen()->saveFocusNew((! getScreen()->doFocusNew())); getScreen()->saveFocusNew(! getScreen()->doFocusNew());
setItemSelected(index, getScreen()->doFocusNew()); setItemSelected(index, getScreen()->doFocusNew());
break; break;
} }
case 5: { // focus last window on workspace case 5: { // focus last window on workspace
getScreen()->saveFocusLast((! getScreen()->doFocusLast())); getScreen()->saveFocusLast(! getScreen()->doFocusLast());
setItemSelected(index, getScreen()->doFocusLast()); setItemSelected(index, getScreen()->doFocusLast());
break; break;
} }
case 6: { // hide toolbar case 6: { // window-to-window snapping
getScreen()->saveHideToolbar((! getScreen()->doHideToolbar())); 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()); setItemSelected(index, getScreen()->doHideToolbar());
break; break;
} }

View file

@ -2525,74 +2525,84 @@ void BlackboxWindow::motionNotifyEvent(XMotionEvent *me) {
Workspace *w = screen->getWorkspace(getWorkspaceNumber()); Workspace *w = screen->getWorkspace(getWorkspaceNumber());
assert(w); assert(w);
// try snap to another window if (blackbox->getWindowToWindowSnap()) {
for (unsigned int i = 0, c = w->getCount(); i < c; ++i) { // try snap to another window
BlackboxWindow *snapwin = w->getWindow(i); for (unsigned int i = 0, c = w->getCount(); i < c; ++i) {
if (snapwin == this) BlackboxWindow *snapwin = w->getWindow(i);
continue; // don't snap to self if (snapwin == this)
continue; // don't snap to self
const Rect &winrect = snapwin->frameRect(); const Rect &winrect = snapwin->frameRect();
int dleft = std::abs(wright - winrect.left()), int dleft = std::abs(wright - winrect.left()),
dright = std::abs(wleft - winrect.right()), dright = std::abs(wleft - winrect.right()),
dtop = std::abs(wbottom - winrect.top()), dtop = std::abs(wbottom - winrect.top()),
dbottom = std::abs(wtop - winrect.bottom()); dbottom = std::abs(wtop - winrect.bottom());
// snap left of other window? // snap left of other window?
if (dleft < snap_distance && dleft <= dright) { if (dleft < snap_distance && dleft <= dright) {
dx = winrect.left() - frame.rect.width(); dx = winrect.left() - frame.rect.width();
// try corner-snap to its other sides if (blackbox->getWindowCornerSnap()) {
dtop = std::abs(wtop - winrect.top()); // try corner-snap to its other sides
dbottom = std::abs(wbottom - winrect.bottom()); dtop = std::abs(wtop - winrect.top());
if (dtop < snap_distance && dtop <= dbottom) dbottom = std::abs(wbottom - winrect.bottom());
dy = winrect.top(); if (dtop < snap_distance && dtop <= dbottom)
else if (dbottom < snap_distance) dy = winrect.top();
dy = winrect.bottom() - frame.rect.height(); else if (dbottom < snap_distance)
dy = winrect.bottom() - frame.rect.height();
}
continue; continue;
} }
// snap right of other window? // snap right of other window?
else if (dright < snap_distance) { else if (dright < snap_distance) {
dx = winrect.right() + 1; dx = winrect.right() + 1;
// try corner-snap to its other sides if (blackbox->getWindowCornerSnap()) {
dtop = std::abs(wtop - winrect.top()); // try corner-snap to its other sides
dbottom = std::abs(wbottom - winrect.bottom()); dtop = std::abs(wtop - winrect.top());
if (dtop < snap_distance && dtop <= dbottom) dbottom = std::abs(wbottom - winrect.bottom());
dy = winrect.top(); if (dtop < snap_distance && dtop <= dbottom)
else if (dbottom < snap_distance) dy = winrect.top();
dy = winrect.bottom() - frame.rect.height(); else if (dbottom < snap_distance)
dy = winrect.bottom() - frame.rect.height();
}
continue; continue;
} }
// snap top of other window? // snap top of other window?
if (dtop < snap_distance && dtop <= dbottom) { if (dtop < snap_distance && dtop <= dbottom) {
dy = winrect.top() - frame.rect.height(); dy = winrect.top() - frame.rect.height();
// try corner-snap to its other sides if (blackbox->getWindowCornerSnap()) {
dleft = std::abs(wleft - winrect.left()); // try corner-snap to its other sides
dright = std::abs(wright - winrect.right()); dleft = std::abs(wleft - winrect.left());
if (dleft < snap_distance && dleft <= dright) dright = std::abs(wright - winrect.right());
dx = winrect.left(); if (dleft < snap_distance && dleft <= dright)
else if (dright < snap_distance) dx = winrect.left();
dx = winrect.right() - frame.rect.width(); else if (dright < snap_distance)
dx = winrect.right() - frame.rect.width();
}
continue; continue;
} }
// snap bottom of other window? // snap bottom of other window?
else if (dbottom < snap_distance) { else if (dbottom < snap_distance) {
dy = winrect.bottom() + 1; dy = winrect.bottom() + 1;
// try corner-snap to its other sides if (blackbox->getWindowCornerSnap()) {
dleft = std::abs(wleft - winrect.left()); // try corner-snap to its other sides
dright = std::abs(wright - winrect.right()); dleft = std::abs(wleft - winrect.left());
if (dleft < snap_distance && dleft <= dright) dright = std::abs(wright - winrect.right());
dx = winrect.left(); if (dleft < snap_distance && dleft <= dright)
else if (dright < snap_distance) dx = winrect.left();
dx = winrect.right() - frame.rect.width(); else if (dright < snap_distance)
dx = winrect.right() - frame.rect.width();
}
continue; continue;
}
} }
} }

View file

@ -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 * Save all values as they are so that the defaults will be written to the rc
* file * file
@ -913,6 +925,8 @@ void Blackbox::save_rc(void) {
config.setValue("session.cacheMax", resource.cache_max); config.setValue("session.cacheMax", resource.cache_max);
config.setValue("session.styleFile", resource.style_file); config.setValue("session.styleFile", resource.style_file);
config.setValue("session.titlebarLayout", resource.titlebar_layout); 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::for_each(screenList.begin(), screenList.end(),
std::mem_fun(&BScreen::save_rc)); std::mem_fun(&BScreen::save_rc));
@ -960,6 +974,14 @@ void Blackbox::load_rc(void) {
if (! config.getValue("session.titlebarLayout", resource.titlebar_layout)) if (! config.getValue("session.titlebarLayout", resource.titlebar_layout))
resource.titlebar_layout = "ILMC"; 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;
} }

View file

@ -115,6 +115,8 @@ private:
timeval auto_raise_delay; timeval auto_raise_delay;
unsigned long cache_life, cache_max; unsigned long cache_life, cache_max;
std::string titlebar_layout; std::string titlebar_layout;
bool window_to_window_snap;
bool window_corner_snap;
} resource; } resource;
typedef std::map<Window, BlackboxWindow*> WindowLookup; typedef std::map<Window, BlackboxWindow*> WindowLookup;
@ -215,6 +217,11 @@ public:
inline unsigned long getCacheMax(void) const inline unsigned long getCacheMax(void) const
{ return resource.cache_max; } { 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 void setNoFocus(bool f) { no_focus = f; }
inline Cursor getSessionCursor(void) const inline Cursor getSessionCursor(void) const
@ -229,6 +236,8 @@ public:
void setFocusedWindow(BlackboxWindow *w); void setFocusedWindow(BlackboxWindow *w);
void shutdown(void); void shutdown(void);
void saveStyleFilename(const std::string& filename); void saveStyleFilename(const std::string& filename);
void saveWindowToWindowSnap(bool);
void saveWindowCornerSnap(bool);
void addMenuTimestamp(const std::string& filename); void addMenuTimestamp(const std::string& filename);
void restart(const char *prog = 0); void restart(const char *prog = 0);
void reconfigure(void); void reconfigure(void);