changing tabbed to embedding like xterm it does.
This commit is contained in:
parent
e104fc4a76
commit
814d7166cc
124
tabbed.c
124
tabbed.c
|
@ -67,11 +67,6 @@ typedef struct Client {
|
|||
int tabx;
|
||||
} Client;
|
||||
|
||||
typedef struct Listener {
|
||||
int fd;
|
||||
struct Listener *next;
|
||||
} Listener;
|
||||
|
||||
/* function declarations */
|
||||
static void buttonpress(XEvent *e);
|
||||
static void cleanup(void);
|
||||
|
@ -91,8 +86,9 @@ static void initfont(const char *fontstr);
|
|||
static void keypress(XEvent *e);
|
||||
static void killclient(const Arg *arg);
|
||||
static void move(const Arg *arg);
|
||||
static void spawntab(const Arg *arg);
|
||||
static void spawn(const Arg *arg);
|
||||
static void manage(Window win);
|
||||
static void maprequest(XEvent *e);
|
||||
static void propertynotify(XEvent *e);
|
||||
static void resize(Client *c, int w, int h);
|
||||
static void rotate(const Arg *arg);
|
||||
|
@ -112,6 +108,7 @@ static void (*handler[LASTEvent]) (XEvent *) = {
|
|||
[DestroyNotify] = destroynotify,
|
||||
[PropertyNotify] = propertynotify,
|
||||
[UnmapNotify] = unmapnotify,
|
||||
[MapRequest] = maprequest,
|
||||
[ButtonPress] = buttonpress,
|
||||
[KeyPress] = keypress,
|
||||
[Expose] = expose,
|
||||
|
@ -124,8 +121,8 @@ static Bool running = True;
|
|||
static unsigned int numlockmask = 0;
|
||||
static unsigned bh, wx, wy, ww, wh;
|
||||
static Client *clients = NULL, *sel = NULL;
|
||||
static Listener *listeners;
|
||||
static Bool badwindow = False;
|
||||
static int (*xerrorxlib)(Display *, XErrorEvent *);
|
||||
/* configuration, allows nested code to access above variables */
|
||||
#include "config.h"
|
||||
|
||||
|
@ -202,7 +199,9 @@ drawbar() {
|
|||
if(!clients) {
|
||||
dc.x = 0;
|
||||
dc.w = ww;
|
||||
drawtext("Tabbed", dc.norm);
|
||||
drawtext("tabbed-"VERSION, dc.norm);
|
||||
XCopyArea(dpy, dc.drawable, win, dc.gc, 0, 0, ww, bh, 0, 0);
|
||||
XSync(dpy, False);
|
||||
return;
|
||||
}
|
||||
width = ww;
|
||||
|
@ -275,7 +274,7 @@ emallocz(size_t size) {
|
|||
void *p;
|
||||
|
||||
if(!(p = calloc(1, size)))
|
||||
die(0, "Cannot Malloc");
|
||||
die(0, "tabbed: cannot malloc");
|
||||
return p;
|
||||
}
|
||||
|
||||
|
@ -470,32 +469,18 @@ sigchld(int signal) {
|
|||
while(0 < waitpid(-1, NULL, WNOHANG));
|
||||
}
|
||||
|
||||
void
|
||||
spawntab(const Arg *arg) {
|
||||
int fd[2];
|
||||
Listener *l;
|
||||
|
||||
if(pipe(fd)) {
|
||||
perror("tabbed: pipe failed");
|
||||
return;
|
||||
}
|
||||
l = emallocz(sizeof(Listener));
|
||||
l->fd = fd[0];
|
||||
l->next = listeners;
|
||||
listeners = l;
|
||||
signal(SIGCHLD, sigchld);
|
||||
void
|
||||
spawn(const Arg *arg) {
|
||||
if(fork() == 0) {
|
||||
if(dpy)
|
||||
close(ConnectionNumber(dpy));
|
||||
setsid();
|
||||
dup2(fd[1], STDOUT_FILENO);
|
||||
close(fd[0]);
|
||||
execvp(((char **)arg->v)[0], (char **)arg->v);
|
||||
fprintf(stderr, "tabbed: execvp %s", ((char **)arg->v)[0]);
|
||||
fprintf(stderr, "dwm: execvp %s", ((char **)arg->v)[0]);
|
||||
perror(" failed");
|
||||
exit(0);
|
||||
}
|
||||
close(fd[1]);
|
||||
}
|
||||
|
||||
void
|
||||
|
@ -530,6 +515,18 @@ manage(Window w) {
|
|||
}
|
||||
}
|
||||
|
||||
void maprequest(XEvent *e) {
|
||||
static XWindowAttributes wa;
|
||||
XMapRequestEvent *ev = &e->xmaprequest;
|
||||
|
||||
if(!XGetWindowAttributes(dpy, ev->window, &wa))
|
||||
return;
|
||||
if(wa.override_redirect)
|
||||
return;
|
||||
if(!getclient(ev->window))
|
||||
manage(ev->window);
|
||||
}
|
||||
|
||||
void
|
||||
propertynotify(XEvent *e) {
|
||||
Client *c;
|
||||
|
@ -581,68 +578,15 @@ rotate(const Arg *arg) {
|
|||
|
||||
void
|
||||
run(void) {
|
||||
char buf[32], *p;
|
||||
fd_set rd;
|
||||
int r, xfd, maxfd, wid;
|
||||
unsigned int offset = 0;
|
||||
XEvent ev;
|
||||
Listener *l, *pl;
|
||||
|
||||
/* main event loop, also reads xids from stdin */
|
||||
XSync(dpy, False);
|
||||
xfd = ConnectionNumber(dpy);
|
||||
buf[LENGTH(buf) - 1] = '\0'; /* 0-terminator is never touched */
|
||||
drawbar();
|
||||
while(running) {
|
||||
FD_ZERO(&rd);
|
||||
maxfd = xfd;
|
||||
FD_SET(xfd, &rd);
|
||||
for(l = listeners; l; l = l->next) {
|
||||
maxfd = MAX(maxfd, l->fd);
|
||||
FD_SET(l->fd, &rd);
|
||||
}
|
||||
if(select(maxfd + 1, &rd, NULL, NULL, NULL) == -1) {
|
||||
if(errno == EINTR)
|
||||
continue;
|
||||
die("select failed\n");
|
||||
}
|
||||
for(l = listeners; l; l = l->next) {
|
||||
if(!FD_ISSET(l->fd, &rd))
|
||||
continue;
|
||||
switch((r = read(l->fd, buf + offset, LENGTH(buf) - 1 - offset))) {
|
||||
case -1:
|
||||
perror("tabbed: fd error");
|
||||
case 0:
|
||||
close(l->fd);
|
||||
if(listeners == l)
|
||||
listeners = l->next;
|
||||
else {
|
||||
for(pl = listeners; pl->next != l ; pl = pl->next);
|
||||
pl->next = l->next;
|
||||
}
|
||||
free(l);
|
||||
break;
|
||||
default:
|
||||
for(p = buf + offset; r > 0; p++, r--, offset++)
|
||||
if(*p == '\n' || *p == '\0') {
|
||||
*p = '\0';
|
||||
if((wid = atoi(buf)))
|
||||
manage((Window)wid);
|
||||
p += r - 1; /* p is buf + offset + r - 1 */
|
||||
for(r = 0; *(p - r) && *(p - r) != '\n'; r++);
|
||||
offset = r;
|
||||
if(r)
|
||||
memmove(buf, p - r + 1, r);
|
||||
break;
|
||||
}
|
||||
break;
|
||||
}
|
||||
}
|
||||
while(XPending(dpy)) {
|
||||
XNextEvent(dpy, &ev);
|
||||
if(handler[ev.type])
|
||||
(handler[ev.type])(&ev); /* call handler */
|
||||
}
|
||||
XNextEvent(dpy, &ev);
|
||||
if(handler[ev.type])
|
||||
(handler[ev.type])(&ev); /* call handler */
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -678,14 +622,12 @@ setup(void) {
|
|||
ButtonPressMask|ExposureMask|KeyPressMask|
|
||||
LeaveWindowMask);
|
||||
XMapRaised(dpy, win);
|
||||
XSetErrorHandler(xerror);
|
||||
xerrorxlib = XSetErrorHandler(xerror);
|
||||
XClassHint class_hint;
|
||||
XStoreName(dpy, win, "Tabbed");
|
||||
class_hint.res_name = "tabbed";
|
||||
class_hint.res_class = "Tabbed";
|
||||
XSetClassHint(dpy, win, &class_hint);
|
||||
listeners = emallocz(sizeof(Listener));
|
||||
listeners->fd = STDIN_FILENO;
|
||||
}
|
||||
|
||||
int
|
||||
|
@ -760,9 +702,10 @@ xerror(Display *dpy, XErrorEvent *ee) {
|
|||
puts("badwindow");
|
||||
return 0;
|
||||
}
|
||||
die("tabbed: fatal error: request code=%d, error code=%d\n",
|
||||
fprintf(stderr, "tabbed: fatal error: request code=%d, error code=%d\n",
|
||||
ee->request_code, ee->error_code);
|
||||
return 1;
|
||||
return xerrorxlib(dpy, ee); /* may call exit */
|
||||
|
||||
}
|
||||
|
||||
int
|
||||
|
@ -770,17 +713,16 @@ main(int argc, char *argv[]) {
|
|||
if(argc == 2 && !strcmp("-v", argv[1]))
|
||||
die("tabbed-"VERSION", © 2006-2008 surf engineers, see LICENSE for details\n");
|
||||
else if(argc != 1)
|
||||
die("usage: tabbed [surf-options]\n");
|
||||
die("usage: tabbed [-v]\n");
|
||||
if(!setlocale(LC_CTYPE, "") || !XSupportsLocale())
|
||||
fprintf(stderr, "warning: no locale support\n");
|
||||
if(!(dpy = XOpenDisplay(0)))
|
||||
die("tabbed: cannot open display\n");
|
||||
setup();
|
||||
printf("%i\n", (int)win);
|
||||
fflush(NULL);
|
||||
run();
|
||||
/*dummys*/
|
||||
cleanup();
|
||||
XCloseDisplay(dpy);
|
||||
return 0;
|
||||
textnw(" ", 1);
|
||||
updatenumlockmask();
|
||||
}
|
||||
|
|
Loading…
Reference in a new issue