diff --git a/NEWS b/NEWS index fb96dbbf..d60603cd 100644 --- a/NEWS +++ b/NEWS @@ -17,6 +17,11 @@ Note that if "Switch workspaces while dragging windows" is selected under ~/GNUstep/Defaults/WindowMaker, then you may only snap a window to the top or bottom of the screen. +You may set the distance (in pixels) from the edge or corner of the screen at +which a window will begin snapping using "SnapEdgeDetect" and "SnapCornerDetect" +in ~/GNUstep/Defaults/WindowMaker. (The defaults are 1 pixel and 10 pixels, +respectively). + Dragging maximized windows -------------------------- diff --git a/src/WindowMaker.h b/src/WindowMaker.h index 37e3fc01..99751ff8 100644 --- a/src/WindowMaker.h +++ b/src/WindowMaker.h @@ -360,6 +360,8 @@ extern struct WPreferences { char no_animations; /* enable/disable animations */ char no_autowrap; /* wrap workspace when window is moved to the edge */ char window_snapping; /* enable window snapping */ + int snap_edge_detect; /* how far from edge to begin snap */ + int snap_corner_detect; /* how far from corner to begin snap */ char drag_maximized_window; /* behavior when a maximized window is dragged */ char highlight_active_app; /* show the focused app by highlighting its icon */ diff --git a/src/defaults.c b/src/defaults.c index c5a94c69..6f9edfd6 100644 --- a/src/defaults.c +++ b/src/defaults.c @@ -474,6 +474,10 @@ WDefaultEntry optionList[] = { &wPreferences.no_autowrap, getBool, NULL, NULL, NULL}, {"WindowSnapping", "NO", NULL, &wPreferences.window_snapping, getBool, NULL, NULL, NULL}, + {"SnapEdgeDetect", "1", NULL, + &wPreferences.snap_edge_detect, getInt, NULL, NULL, NULL}, + {"SnapCornerDetect", "10", NULL, + &wPreferences.snap_corner_detect, getInt, NULL, NULL, NULL}, {"DragMaximizedWindow", "Move", seDragMaximizedWindow, &wPreferences.drag_maximized_window, getEnum, NULL, NULL, NULL}, {"HighlightActiveApp", "YES", NULL, diff --git a/src/moveres.c b/src/moveres.c index cded064f..e8883c82 100644 --- a/src/moveres.c +++ b/src/moveres.c @@ -1240,23 +1240,28 @@ static void draw_snap_frame(WWindow *wwin, int direction) static int get_snap_direction(WScreen *scr, int x, int y) { - if (x < 1) { - if (y < 1) - return SNAP_TOPLEFT; - if (y > scr->scr_height - 2) - return SNAP_BOTTOMLEFT; + int edge, corner; + + edge = wPreferences.snap_edge_detect; + corner = wPreferences.snap_corner_detect; + + if (x < corner && y < corner) + return SNAP_TOPLEFT; + if (x < corner && y >= scr->scr_height - corner) + return SNAP_BOTTOMLEFT; + if (x < edge) return SNAP_LEFT; - } - if (x > scr->scr_width - 2) { - if (y < 1) - return SNAP_TOPRIGHT; - if (y > scr->scr_height - 2) - return SNAP_BOTTOMRIGHT; + + if (x >= scr->scr_width - corner && y < corner) + return SNAP_TOPRIGHT; + if (x >= scr->scr_width - corner && y >= scr->scr_height - corner) + return SNAP_BOTTOMRIGHT; + if (x >= scr->scr_width - edge) return SNAP_RIGHT; - } - if (y < 1) + + if (y < edge) return SNAP_TOP; - if (y > scr->scr_height - 2) + if (y >= scr->scr_height - edge) return SNAP_BOTTOM; return SNAP_NONE; }