summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorAlexander Sedov <alex0player@gmail.com>2013-07-29 11:11:33 +0400
committerChristoph Lohmann <20h@r-36.net>2013-10-10 18:45:19 +0200
commit14beaabe6ccbdf12546f31edf931e30cbe9c0c82 (patch)
tree1b2f4ee8041456f37a3ee50f398788ce3ba2019d
parent361ddc85d506c058562ccba7c68370d49733c928 (diff)
Fixed obscure miscalculation when a client is closed.
This crops up whenever you just switched from tab # N+1 to tab # N and close current tab. unmanage() first decreases lastsel (so it becomes N) then erroneously tests it against sel and focuses first tab instead. One can see that focus() would never set lastsel == sel, so I took liberty to fix this annoying behaviour which happens to frequently with newposition = 0 and npisrelative = True settings. Signed-off-by: Christoph Lohmann <20h@r-36.net>
-rw-r--r--tabbed.c16
1 files changed, 13 insertions, 3 deletions
diff --git a/tabbed.c b/tabbed.c
index 3df24c2..3a6e7f9 100644
--- a/tabbed.c
+++ b/tabbed.c
@@ -171,12 +171,18 @@ void
buttonpress(const XEvent *e) {
const XButtonPressedEvent *ev = &e->xbutton;
int i;
+ int fc;
Arg arg;
- if((getfirsttab() != 0 && ev->x < TEXTW(before)) || ev->x < 0)
+ fc = getfirsttab();
+
+ if((fc > 0 && ev->x < TEXTW(before)) || ev->x < 0)
return;
- for(i = 0; i < nclients; i++) {
+ if(ev->y < 0 || ev-> y > bh)
+ return;
+
+ for(i = (fc > 0) ? fc : 0; i < nclients; i++) {
if(clients[i]->tabx > ev->x) {
switch(ev->button) {
case Button1:
@@ -1053,7 +1059,11 @@ unmanage(int c) {
}
if(c == sel) {
- if(lastsel > 0 && lastsel != sel) {
+ /* Note that focus() will never set lastsel == sel,
+ * so if here lastsel == sel, it was decreased by above if() clause
+ * and was actually (sel + 1) before.
+ */
+ if(lastsel > 0) {
focus(lastsel);
} else {
focus(0);