Introduction
Introduction Statistics Contact Development Disclaimer Help
Adding an option to do relative new position. And fixing tab position. - tabbed…
git clone git://git.suckless.org/tabbed
Log
Files
Refs
README
LICENSE
---
commit 94add5a96d4db3df1d71a45defa671ed45d23c7f
parent 39594f1935e8cd8f27c55b4716b8194a99e4b65d
Author: Christoph Lohmann <[email protected]>
Date: Tue, 25 Dec 2012 23:48:28 +0100
Adding an option to do relative new position. And fixing tab position.
Thanks Kyle Kramer for the suggestion!
Diffstat:
M config.def.h | 8 ++++++++
M tabbed.c | 93 +++++++++++++++++++++--------…
2 files changed, 73 insertions(+), 28 deletions(-)
---
diff --git a/config.def.h b/config.def.h
@@ -11,6 +11,14 @@ static const char after[] = ">";
static const int tabwidth = 200;
static const Bool foreground = True;
+/*
+ * Where to place a new tab when it is opened. When npisrelative is True,
+ * then the current position is changed + newposition. If npisrelative
+ * is False, then newposition is an absolute position.
+ */
+static int newposition = 0;
+static Bool npisrelative = False;
+
#define MODKEY ControlMask
static Key keys[] = { \
/* modifier key function argument */
diff --git a/tabbed.c b/tabbed.c
@@ -439,11 +439,14 @@ focus(int c) {
sendxembed(c, XEMBED_WINDOW_ACTIVATE, 0, 0, 0);
XStoreName(dpy, win, clients[c]->name);
- if(sel != c)
+ /* If sel is already c, change nothing. */
+ if(sel != c) {
lastsel = sel;
- sel = c;
+ sel = c;
+ }
drawbar();
+ XSync(dpy, False);
}
void
@@ -647,7 +650,7 @@ void
manage(Window w) {
updatenumlockmask();
{
- int i, j;
+ int i, j, nextpos;
unsigned int modifiers[] = { 0, LockMask, numlockmask,
numlockmask|LockMask };
KeyCode code;
@@ -676,13 +679,29 @@ manage(Window w) {
nclients++;
clients = erealloc(clients, sizeof(Client *) * nclients);
- if(nclients > 1) {
- memmove(&clients[1], &clients[0],
- sizeof(Client *) * (nclients - 1));
+
+ if(npisrelative) {
+ nextpos = sel + newposition;
+ } else {
+ if(newposition < 0) {
+ nextpos = nclients - newposition;
+ } else {
+ nextpos = newposition;
+ }
+ }
+ if(nextpos >= nclients)
+ nextpos = nclients - 1;
+ if(nextpos < 0)
+ nextpos = 0;
+
+ if(nclients > 1 && nextpos < nclients - 1) {
+ memmove(&clients[nextpos + 1], &clients[nextpos],
+ sizeof(Client *) *
+ (nclients - nextpos - 1));
}
- clients[0] = c;
+ clients[nextpos] = c;
+ updatetitle(nextpos);
- updatetitle(0);
XLowerWindow(dpy, w);
XMapWindow(dpy, w);
@@ -698,7 +717,11 @@ manage(Window w) {
XSendEvent(dpy, root, False, NoEventMask, &e);
XSync(dpy, False);
- focus((nextfocus)? 0 : ((sel < 0)? 0 : sel));
+
+ /* Adjust sel before focus does set it to lastsel. */
+ if(sel >= nextpos)
+ sel++;
+ focus((nextfocus)? nextpos : ((sel < 0)? 0 : sel));
nextfocus = foreground;
}
}
@@ -939,6 +962,7 @@ void
unmanage(int c) {
if(c < 0 || c >= nclients) {
drawbar();
+ XSync(dpy, False);
return;
}
@@ -962,31 +986,36 @@ unmanage(int c) {
nclients--;
}
- if(c == lastsel) {
+ if(nclients <= 0) {
+ sel = -1;
lastsel = -1;
- } else if(lastsel > c) {
- lastsel--;
- }
- if(sel > c && c > 0) {
- sel--;
- lastsel = -1;
- }
- if(c == nclients && nclients > 0)
- sel = nclients - 1;
-
- if(lastsel > -1) {
- focus(lastsel);
- } else {
- focus(sel);
- }
-
- if(nclients == 0) {
if (closelastclient) {
running = False;
} else if (fillagain && running) {
spawn(NULL);
}
+ } else {
+ if(c == lastsel) {
+ lastsel = -1;
+ } else if(lastsel > c) {
+ lastsel--;
+ }
+
+ if(c == sel) {
+ if(lastsel > 0 && lastsel != sel) {
+ focus(lastsel);
+ } else {
+ focus(0);
+ }
+ } else {
+ if(sel > c)
+ sel -= 1;
+ if(sel >= nclients)
+ sel = nclients - 1;
+
+ focus(sel);
+ }
}
drawbar();
@@ -1058,13 +1087,15 @@ char *argv0;
void
usage(void) {
- die("usage: %s [-dfhsv] [-n name] [-r narg] command...\n", argv0);
+ die("usage: %s [-dfhsv] [-n name] [-p [+/-]pos] [-r narg]"
+ " command...\n", argv0);
}
int
main(int argc, char *argv[]) {
Bool detach = False;
int replace = 0;
+ char *pstr;
ARGBEGIN {
case 'c':
@@ -1079,6 +1110,12 @@ main(int argc, char *argv[]) {
case 'n':
wmname = EARGF(usage());
break;
+ case 'p':
+ pstr = EARGF(usage());
+ if (pstr[0] == '-' || pstr[0] == '+')
+ npisrelative = True;
+ newposition = atoi(pstr);
+ break;
case 'r':
replace = atoi(EARGF(usage()));
break;
You are viewing proxied material from suckless.org. The copyright of proxied material belongs to its original authors. Any comments or complaints in relation to proxied material should be directed to the original authors of the content concerned. Please see the disclaimer for more details.