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
$ #FocusLast
# Focus Window on Workspace Change
$ #WindowToWindowSnap
# Window-To-Window Snapping
$ #WindowCornerSnap
# Window Corner Snapping
$ #HideToolbar
# Hide Toolbar
$ #ClickToFocus

View file

@ -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;
}

View file

@ -2525,6 +2525,7 @@ void BlackboxWindow::motionNotifyEvent(XMotionEvent *me) {
Workspace *w = screen->getWorkspace(getWorkspaceNumber());
assert(w);
if (blackbox->getWindowToWindowSnap()) {
// try snap to another window
for (unsigned int i = 0, c = w->getCount(); i < c; ++i) {
BlackboxWindow *snapwin = w->getWindow(i);
@ -2541,6 +2542,7 @@ void BlackboxWindow::motionNotifyEvent(XMotionEvent *me) {
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());
@ -2548,6 +2550,7 @@ void BlackboxWindow::motionNotifyEvent(XMotionEvent *me) {
dy = winrect.top();
else if (dbottom < snap_distance)
dy = winrect.bottom() - frame.rect.height();
}
continue;
}
@ -2555,6 +2558,7 @@ void BlackboxWindow::motionNotifyEvent(XMotionEvent *me) {
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());
@ -2562,6 +2566,7 @@ void BlackboxWindow::motionNotifyEvent(XMotionEvent *me) {
dy = winrect.top();
else if (dbottom < snap_distance)
dy = winrect.bottom() - frame.rect.height();
}
continue;
}
@ -2570,6 +2575,7 @@ void BlackboxWindow::motionNotifyEvent(XMotionEvent *me) {
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());
@ -2577,6 +2583,7 @@ void BlackboxWindow::motionNotifyEvent(XMotionEvent *me) {
dx = winrect.left();
else if (dright < snap_distance)
dx = winrect.right() - frame.rect.width();
}
continue;
}
@ -2584,6 +2591,7 @@ void BlackboxWindow::motionNotifyEvent(XMotionEvent *me) {
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());
@ -2591,10 +2599,12 @@ void BlackboxWindow::motionNotifyEvent(XMotionEvent *me) {
dx = winrect.left();
else if (dright < snap_distance)
dx = winrect.right() - frame.rect.width();
}
continue;
}
}
}
// try snap to the screen's available area
Rect srect = screen->availableArea();

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
* 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;
}

View file

@ -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);