From e90fafd2fd907a81bdc60ad8b6de35fc1595cdff Mon Sep 17 00:00:00 2001 From: Dana Jansens Date: Fri, 7 Jun 2002 00:24:02 +0000 Subject: fix off-by-ones in window-to-window snapping. move the property from the blackbox class to the screen class. --- src/Configmenu.cc | 45 +++++++++++++------------------- src/Screen.cc | 24 ++++++++++++++++++ src/Screen.hh | 10 ++++++-- src/Window.cc | 76 +++++++++++++++++++++++++++---------------------------- src/blackbox.cc | 22 ---------------- src/blackbox.hh | 9 ------- 6 files changed, 87 insertions(+), 99 deletions(-) (limited to 'src') diff --git a/src/Configmenu.cc b/src/Configmenu.cc index 7bd90ef2..3a8a6e45 100644 --- a/src/Configmenu.cc +++ b/src/Configmenu.cc @@ -70,10 +70,10 @@ void Configmenu::setValues(void) { setItemSelected(4, getScreen()->doFullMax()); setItemSelected(5, getScreen()->doFocusNew()); setItemSelected(6, getScreen()->doFocusLast()); - setItemSelected(7, getScreen()->getBlackbox()->getWindowToWindowSnap()); + setItemSelected(7, getScreen()->getWindowToWindowSnap()); - setItemSelected(8, getScreen()->getBlackbox()->getWindowCornerSnap()); - setItemEnabled(8, getScreen()->getBlackbox()->getWindowToWindowSnap()); + setItemSelected(8, getScreen()->getWindowCornerSnap()); + setItemEnabled(8, getScreen()->getWindowToWindowSnap()); setItemSelected(9, getScreen()->doHideToolbar()); } @@ -94,58 +94,47 @@ void Configmenu::itemSelected(int button, unsigned int index) { return; switch(item->function()) { - case 1: { // dither + case 1: // dither getScreen()->saveImageDither(! getScreen()->doImageDither()); setItemSelected(index, getScreen()->doImageDither()); break; - } - case 2: { // opaque move + case 2: // opaque move getScreen()->saveOpaqueMove(! getScreen()->doOpaqueMove()); setItemSelected(index, getScreen()->doOpaqueMove()); break; - } - case 3: { // full maximization + case 3: // full maximization getScreen()->saveFullMax(! getScreen()->doFullMax()); setItemSelected(index, getScreen()->doFullMax()); break; - } - case 4: { // focus new windows + + case 4: // focus new windows getScreen()->saveFocusNew(! getScreen()->doFocusNew()); setItemSelected(index, getScreen()->doFocusNew()); break; - } - case 5: { // focus last window on workspace + case 5: // focus last window on workspace getScreen()->saveFocusLast(! getScreen()->doFocusLast()); setItemSelected(index, getScreen()->doFocusLast()); break; - } - case 6: { // window-to-window snapping - getScreen()->getBlackbox()-> - saveWindowToWindowSnap(! getScreen()->getBlackbox()-> - getWindowToWindowSnap()); - setItemSelected(index, getScreen()->getBlackbox()->getWindowToWindowSnap()); - setItemEnabled(index + 1, - getScreen()->getBlackbox()->getWindowToWindowSnap()); + case 6: // window-to-window snapping + getScreen()->saveWindowToWindowSnap(! getScreen()->getWindowToWindowSnap()); + setItemSelected(index, getScreen()->getWindowToWindowSnap()); + setItemEnabled(index + 1, getScreen()->getWindowToWindowSnap()); break; - } - case 7: { // window corner snapping - getScreen()->getBlackbox()-> - saveWindowCornerSnap(! getScreen()->getBlackbox()->getWindowCornerSnap()); - setItemSelected(index, getScreen()->getBlackbox()->getWindowCornerSnap()); + case 7: // window corner snapping + getScreen()->saveWindowCornerSnap(! getScreen()->getWindowCornerSnap()); + setItemSelected(index, getScreen()->getWindowCornerSnap()); break; - } - case 8: { // hide toolbar + case 8: // hide toolbar getScreen()->saveHideToolbar(! getScreen()->doHideToolbar()); setItemSelected(index, getScreen()->doHideToolbar()); break; } - } // switch } diff --git a/src/Screen.cc b/src/Screen.cc index 512475c8..ba394bc9 100644 --- a/src/Screen.cc +++ b/src/Screen.cc @@ -424,6 +424,20 @@ void BScreen::saveHideToolbar(bool h) { } +void BScreen::saveWindowToWindowSnap(bool s) { + resource.window_to_window_snap = s; + config->setValue(screenstr + "windowToWindowSnap", + resource.window_to_window_snap); +} + + +void BScreen::saveWindowCornerSnap(bool s) { + resource.window_corner_snap = s; + config->setValue(screenstr + "windowCornerSnap", + resource.window_corner_snap); +} + + void BScreen::saveWorkspaces(unsigned int w) { resource.workspaces = w; config->setValue(screenstr + "workspaces", resource.workspaces); @@ -510,6 +524,8 @@ void BScreen::save_rc(void) { saveFocusNew(resource.focus_new); saveFocusLast(resource.focus_last); saveHideToolbar(resource.hide_toolbar); + saveWindowToWindowSnap(resource.window_to_window_snap); + saveWindowCornerSnap(resource.window_corner_snap); saveWorkspaces(resource.workspaces); savePlacementPolicy(resource.placement_policy); saveEdgeSnapThreshold(resource.edge_snap_threshold); @@ -549,6 +565,14 @@ void BScreen::load_rc(void) { if (! config->getValue(screenstr + "hideToolbar", resource.hide_toolbar)) resource.hide_toolbar = false; + if (! config->getValue(screenstr + "windowToWindowSnap", + resource.window_to_window_snap)) + resource.window_to_window_snap = true; + + if (! config->getValue(screenstr + "windowCornerSnap", + resource.window_corner_snap)) + resource.window_corner_snap = true; + if (! config->getValue(screenstr + "imageDither", b)) b = true; image_control->setDither(b); diff --git a/src/Screen.hh b/src/Screen.hh index c044200c..44199b34 100644 --- a/src/Screen.hh +++ b/src/Screen.hh @@ -152,8 +152,8 @@ private: MenuStyle mstyle; bool sloppy_focus, auto_raise, auto_edge_balance, ordered_dither, - opaque_move, full_max, focus_new, focus_last, click_raise, - hide_toolbar; + opaque_move, full_max, focus_new, focus_last, click_raise, + hide_toolbar, window_to_window_snap, window_corner_snap; BColor border_color; unsigned int workspaces; @@ -216,6 +216,10 @@ public: inline bool doFocusNew(void) const { return resource.focus_new; } inline bool doFocusLast(void) const { return resource.focus_last; } inline bool doHideToolbar(void) const { return resource.hide_toolbar; } + inline bool getWindowToWindowSnap(void) const + { return resource.window_to_window_snap; } + inline bool getWindowCornerSnap(void) const + { return resource.window_corner_snap; } inline const GC &getOpGC(void) const { return opGC; } @@ -273,6 +277,8 @@ public: void saveFocusNew(bool f); void saveFocusLast(bool f); void saveHideToolbar(bool h); + void saveWindowToWindowSnap(bool s); + void saveWindowCornerSnap(bool s); inline void iconUpdate(void) { iconmenu->update(); } #ifdef HAVE_STRFTIME diff --git a/src/Window.cc b/src/Window.cc index 2fe0928f..417e15ac 100644 --- a/src/Window.cc +++ b/src/Window.cc @@ -2524,7 +2524,7 @@ void BlackboxWindow::motionNotifyEvent(XMotionEvent *me) { Workspace *w = screen->getWorkspace(getWorkspaceNumber()); assert(w); - if (blackbox->getWindowToWindowSnap()) { + if (screen->getWindowToWindowSnap()) { // try snap to another window for (unsigned int i = 0, c = w->getCount(); i < c; ++i) { BlackboxWindow *snapwin = w->getWindow(i); @@ -2537,51 +2537,18 @@ void BlackboxWindow::motionNotifyEvent(XMotionEvent *me) { 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()) { + if (screen->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(); + dx = winrect.right() - frame.rect.width() + 1; } continue; @@ -2590,14 +2557,47 @@ void BlackboxWindow::motionNotifyEvent(XMotionEvent *me) { else if (dbottom < snap_distance) { dy = winrect.bottom() + 1; - if (blackbox->getWindowCornerSnap()) { + if (screen->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(); + dx = winrect.right() - frame.rect.width() + 1; + } + + continue; + } + + // snap left of other window? + if (dleft < snap_distance && dleft <= dright) { + dx = winrect.left() - frame.rect.width(); + + if (screen->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() + 1; + } + + continue; + } + // snap right of other window? + else if (dright < snap_distance) { + dx = winrect.right() + 1; + + if (screen->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() + 1; } continue; diff --git a/src/blackbox.cc b/src/blackbox.cc index 118a17bc..56782248 100644 --- a/src/blackbox.cc +++ b/src/blackbox.cc @@ -895,18 +895,6 @@ 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 @@ -924,8 +912,6 @@ 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)); @@ -973,14 +959,6 @@ 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; } diff --git a/src/blackbox.hh b/src/blackbox.hh index 48fda8c5..cb38dc34 100644 --- a/src/blackbox.hh +++ b/src/blackbox.hh @@ -115,8 +115,6 @@ 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 WindowLookup; @@ -217,11 +215,6 @@ 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 @@ -236,8 +229,6 @@ 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); -- cgit v1.2.3