d0tfiles

Unnamed repository; edit this file 'description' to name the repository.
Log | Files | Refs | README | LICENSE

commit fce3e4655b32923e67c10d564377e103bde8f48b
parent f7df983f2f1218fa228dcdabd37ad45b9818f9ee
Author: underd0g1 <hide4@comcast.net>
Date:   Wed, 14 Oct 2020 00:02:16 -0400

added new dotz

Diffstat:
ADWM/config.h | 119+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
ADWM/dwm.c | 2160+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Abash/.bashrc | 273+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Dconfig.h - DWM | 115-------------------------------------------------------------------------------
Airssi/config | 143+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Airssi/fro.theme | 209+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Airssi/neongold.theme | 206+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Airssi/nixers.theme | 304+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Aurxvt/.Xresources | 74++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Rweechat.conf -> weechat/weechat.conf | 0
10 files changed, 3488 insertions(+), 115 deletions(-)

diff --git a/DWM/config.h b/DWM/config.h @@ -0,0 +1,119 @@ +/* See LICENSE file for copyright and license details. */ + +/* appearance */ +static const char font[] = "Minecraftia:size=10"; +static const char normbordercolor[] = "#444444"; +static const char normbgcolor[] = "#222222"; +static const char normfgcolor[] = "#bbbbbb"; +static const char selbordercolor[] = "#005577"; +static const char selbgcolor[] = "#000000"; +static const char selfgcolor[] = "#eeeeee"; +static const unsigned int borderpx = 1; /* border pixel of windows */ +static const unsigned int gappx = 20; /* gaps between windows */ +static const unsigned int snap = 52; /* snap pixel */ +static const Bool showbar = True; /* False means no bar */ +static const Bool topbar = True; /* False means bottom bar */ + +/* tagging */ +static const char *tags[] = { "h0me", "c0de", "w0rk", "mUsic", "chAt", "gAmez", "aRt", "sch00l", "br0wse" }; + +static const Rule rules[] = { + /* class instance title tags mask isfloating monitor */ + { "Gimp", NULL, NULL, 0, True, -1 }, + { "Firefox", NULL, NULL, 1 << 8, False, -1 }, +}; + +/* layout(s) */ +static const float mfact = 0.55; /* factor of master area size [0.05..0.95] */ +static const int nmaster = 1; /* number of clients in master area */ +static const Bool resizehints = True; /* True means respect size hints in tiled resizals */ + +static const Layout layouts[] = { + /* symbol arrange function */ + { "[]=", tile }, /* first entry is default */ + { "><>", NULL }, /* no layout function means floating behavior */ + { "[M]", monocle }, +}; + +/* key definitions */ +#define MODKEY Mod1Mask +#define TAGKEYS(KEY,TAG) \ + { MODKEY, KEY, view, {.ui = 1 << TAG} }, \ + { MODKEY|ControlMask, KEY, toggleview, {.ui = 1 << TAG} }, \ + { MODKEY|ShiftMask, KEY, tag, {.ui = 1 << TAG} }, \ + { MODKEY|ControlMask|ShiftMask, KEY, toggletag, {.ui = 1 << TAG} }, + +/* helper for spawning shell commands in the pre dwm-5.0 fashion */ +#define SHCMD(cmd) { .v = (const char*[]){ "/bin/sh", "-c", cmd, NULL } } + +/* commands */ +static const char *dmenucmd[] = { "rofi", "-show", "run", NULL }; +static const char *termcmd[] = { "urxvt", NULL }; +static const char *firef0x[] = { "firefox", NULL }; +static const char *sEtup[] = { "urxvt","setup", NULL }; + + + + +# include "shiftview.c" +static Key keys[] = { + /* modifier key function argument */ + { MODKEY, XK_space, spawn, {.v = dmenucmd } }, + { MODKEY, XK_Return, spawn, {.v = termcmd } }, + { MODKEY, XK_f, spawn, {.v = firef0x } }, + { MODKEY, XK_l, spawn, {.v = sEtup } }, + { MODKEY, XK_b, togglebar, {0} }, + { MODKEY, XK_j, focusstack, {.i = +1 } }, + { MODKEY, XK_k, focusstack, {.i = -1 } }, + { MODKEY, XK_i, incnmaster, {.i = +1 } }, + { MODKEY, XK_d, incnmaster, {.i = -1 } }, + { MODKEY, XK_h, setmfact, {.f = -0.05} }, + { MODKEY, XK_l, setmfact, {.f = +0.05} }, + { MODKEY, XK_t, zoom, {0} }, + { MODKEY, XK_Tab, view, {0} }, + { MODKEY, XK_q, killclient, {0} }, + { MODKEY, XK_o, setlayout, {.v = &layouts[0]} }, + { MODKEY, XK_a, setlayout, {.v = &layouts[1]} }, + { MODKEY, XK_m, setlayout, {.v = &layouts[2]} }, + { MODKEY, XK_p, setlayout, {0} }, + { MODKEY|ShiftMask, XK_space, togglefloating, {0} }, + { MODKEY, XK_0, view, {.ui = ~0 } }, + { MODKEY|ShiftMask, XK_0, tag, {.ui = ~0 } }, + { MODKEY, XK_comma, focusmon, {.i = -1 } }, + { MODKEY, XK_period, focusmon, {.i = +1 } }, + { MODKEY|ShiftMask, XK_comma, tagmon, {.i = -1 } }, + { MODKEY|ShiftMask, XK_period, tagmon, {.i = +1 } }, + { MODKEY, XK_minus, setgaps, {.i = -1 } }, + { MODKEY, XK_equal, setgaps, {.i = +1 } }, + { MODKEY|ShiftMask, XK_equal, setgaps, {.i = 0 } }, + { MODKEY, XK_Left, shiftview, {.i = -1 } }, + { MODKEY, XK_Right, shiftview, {.i = +1 } }, + TAGKEYS( XK_1, 0) + TAGKEYS( XK_2, 1) + TAGKEYS( XK_3, 2) + TAGKEYS( XK_4, 3) + TAGKEYS( XK_5, 4) + TAGKEYS( XK_6, 5) + TAGKEYS( XK_7, 6) + TAGKEYS( XK_8, 7) + TAGKEYS( XK_9, 8) + { MODKEY|ShiftMask, XK_q, quit, {0} }, +}; + +/* button definitions */ +/* click can be ClkLtSymbol, ClkStatusText, ClkWinTitle, ClkClientWin, or ClkRootWin */ +static Button buttons[] = { + /* click event mask button function argument */ + { ClkLtSymbol, 0, Button1, setlayout, {0} }, + { ClkLtSymbol, 0, Button3, setlayout, {.v = &layouts[2]} }, + { ClkWinTitle, 0, Button2, zoom, {0} }, + { ClkStatusText, 0, Button2, spawn, {.v = termcmd } }, + { ClkClientWin, MODKEY, Button1, movemouse, {0} }, + { ClkClientWin, MODKEY, Button2, togglefloating, {0} }, + { ClkClientWin, MODKEY, Button3, resizemouse, {0} }, + { ClkTagBar, 0, Button1, view, {0} }, + { ClkTagBar, 0, Button3, toggleview, {0} }, + { ClkTagBar, MODKEY, Button1, tag, {0} }, + { ClkTagBar, MODKEY, Button3, toggletag, {0} }, +}; + diff --git a/DWM/dwm.c b/DWM/dwm.c @@ -0,0 +1,2160 @@ +/* See LICENSE file for copyright and license details. + * + * dynamic window manager is designed like any other X client as well. It is + * driven through handling X events. In contrast to other X clients, a window + * manager selects for SubstructureRedirectMask on the root window, to receive + * events about window (dis-)appearance. Only one X connection at a time is + * allowed to select for this event mask. + * + * The event handlers of dwm are organized in an array which is accessed + * whenever a new event has been fetched. This allows event dispatching + * in O(1) time. + * + * Each child of the root window is called a client, except windows which have + * set the override_redirect flag. Clients are organized in a linked client + * list on each monitor, the focus history is remembered through a stack list + * on each monitor. Each client contains a bit array to indicate the tags of a + * client. + * + * Keys and tagging rules are organized as arrays and defined in config.h. + * + * To understand everything else, start reading main(). + */ +#include <errno.h> +#include <locale.h> +#include <stdarg.h> +#include <signal.h> +#include <stdio.h> +#include <stdlib.h> +#include <string.h> +#include <unistd.h> +#include <sys/types.h> +#include <sys/wait.h> +#include <X11/cursorfont.h> +#include <X11/keysym.h> +#include <X11/Xatom.h> +#include <X11/Xlib.h> +#include <X11/Xproto.h> +#include <X11/Xutil.h> +#ifdef XINERAMA +#include <X11/extensions/Xinerama.h> +#endif /* XINERAMA */ + +/* macros */ +#define BUTTONMASK (ButtonPressMask|ButtonReleaseMask) +#define CLEANMASK(mask) (mask & ~(numlockmask|LockMask) & (ShiftMask|ControlMask|Mod1Mask|Mod2Mask|Mod3Mask|Mod4Mask|Mod5Mask)) +#define INTERSECT(x,y,w,h,m) (MAX(0, MIN((x)+(w),(m)->wx+(m)->ww) - MAX((x),(m)->wx)) \ + * MAX(0, MIN((y)+(h),(m)->wy+(m)->wh) - MAX((y),(m)->wy))) +#define ISVISIBLE(C) ((C->tags & C->mon->tagset[C->mon->seltags])) +#define LENGTH(X) (sizeof X / sizeof X[0]) +#define MAX(A, B) ((A) > (B) ? (A) : (B)) +#define MIN(A, B) ((A) < (B) ? (A) : (B)) +#define MOUSEMASK (BUTTONMASK|PointerMotionMask) +#define WIDTH(X) ((X)->w + 2 * (X)->bw) +#define HEIGHT(X) ((X)->h + 2 * (X)->bw) +#define TAGMASK ((1 << LENGTH(tags)) - 1) +#define TEXTW(X) (textnw(X, strlen(X)) + dc.font.height) + +/* enums */ +enum { CurNormal, CurResize, CurMove, CurLast }; /* cursor */ +enum { ColBorder, ColFG, ColBG, ColLast }; /* color */ +enum { NetSupported, NetWMName, NetWMState, + NetWMFullscreen, NetActiveWindow, NetWMWindowType, + NetWMWindowTypeDialog, NetLast }; /* EWMH atoms */ +enum { WMProtocols, WMDelete, WMState, WMTakeFocus, WMLast }; /* default atoms */ +enum { ClkTagBar, ClkLtSymbol, ClkStatusText, ClkWinTitle, + ClkClientWin, ClkRootWin, ClkLast }; /* clicks */ + +typedef union { + int i; + unsigned int ui; + float f; + const void *v; +} Arg; + +typedef struct { + unsigned int click; + unsigned int mask; + unsigned int button; + void (*func)(const Arg *arg); + const Arg arg; +} Button; + +typedef struct Monitor Monitor; +typedef struct Client Client; +struct Client { + char name[256]; + float mina, maxa; + int x, y, w, h; + int oldx, oldy, oldw, oldh; + int basew, baseh, incw, inch, maxw, maxh, minw, minh; + int bw, oldbw; + unsigned int tags; + Bool isfixed, isfloating, isurgent, neverfocus, oldstate, isfullscreen; + Client *next; + Client *snext; + Monitor *mon; + Window win; +}; + +typedef struct { + int x, y, w, h; + unsigned long norm[ColLast]; + unsigned long sel[ColLast]; + Drawable drawable; + GC gc; + struct { + int ascent; + int descent; + int height; + XFontSet set; + XFontStruct *xfont; + } font; +} DC; /* draw context */ + +typedef struct { + unsigned int mod; + KeySym keysym; + void (*func)(const Arg *); + const Arg arg; +} Key; + +typedef struct { + const char *symbol; + void (*arrange)(Monitor *); +} Layout; + +struct Monitor { + char ltsymbol[16]; + float mfact; + int nmaster; + int num; + int by; /* bar geometry */ + int mx, my, mw, mh; /* screen size */ + int wx, wy, ww, wh; /* window area */ + int gappx; /* gaps between windows */ + unsigned int seltags; + unsigned int sellt; + unsigned int tagset[2]; + Bool showbar; + Bool topbar; + Client *clients; + Client *sel; + Client *stack; + Monitor *next; + Window barwin; + const Layout *lt[2]; +}; + +typedef struct { + const char *class; + const char *instance; + const char *title; + unsigned int tags; + Bool isfloating; + int monitor; +} Rule; + +/* function declarations */ +static void applyrules(Client *c); +static Bool applysizehints(Client *c, int *x, int *y, int *w, int *h, Bool interact); +static void arrange(Monitor *m); +static void arrangemon(Monitor *m); +static void attach(Client *c); +static void attachstack(Client *c); +static void buttonpress(XEvent *e); +static void checkotherwm(void); +static void cleanup(void); +static void cleanupmon(Monitor *mon); +static void clearurgent(Client *c); +static void clientmessage(XEvent *e); +static void configure(Client *c); +static void configurenotify(XEvent *e); +static void configurerequest(XEvent *e); +static Monitor *createmon(void); +static void destroynotify(XEvent *e); +static void detach(Client *c); +static void detachstack(Client *c); +static void die(const char *errstr, ...); +static Monitor *dirtomon(int dir); +static void drawbar(Monitor *m); +static void drawbars(void); +static void drawsquare(Bool filled, Bool empty, Bool invert, unsigned long col[ColLast]); +static void drawtext(const char *text, unsigned long col[ColLast], Bool invert); +static void enternotify(XEvent *e); +static void expose(XEvent *e); +static void focus(Client *c); +static void focusin(XEvent *e); +static void focusmon(const Arg *arg); +static void focusstack(const Arg *arg); +static unsigned long getcolor(const char *colstr); +static Bool getrootptr(int *x, int *y); +static long getstate(Window w); +static Bool gettextprop(Window w, Atom atom, char *text, unsigned int size); +static void grabbuttons(Client *c, Bool focused); +static void grabkeys(void); +static void incnmaster(const Arg *arg); +static void initfont(const char *fontstr); +static void keypress(XEvent *e); +static void killclient(const Arg *arg); +static void manage(Window w, XWindowAttributes *wa); +static void mappingnotify(XEvent *e); +static void maprequest(XEvent *e); +static void monocle(Monitor *m); +static void motionnotify(XEvent *e); +static void movemouse(const Arg *arg); +static Client *nexttiled(Client *c); +static void pop(Client *); +static void propertynotify(XEvent *e); +static void quit(const Arg *arg); +static Monitor *recttomon(int x, int y, int w, int h); +static void resize(Client *c, int x, int y, int w, int h, Bool interact); +static void resizeclient(Client *c, int x, int y, int w, int h); +static void resizemouse(const Arg *arg); +static void restack(Monitor *m); +static void run(void); +static void scan(void); +static Bool sendevent(Client *c, Atom proto); +static void sendmon(Client *c, Monitor *m); +static void setclientstate(Client *c, long state); +static void setfocus(Client *c); +static void setfullscreen(Client *c, Bool fullscreen); +static void setgaps(const Arg *arg); +static void setlayout(const Arg *arg); +static void setmfact(const Arg *arg); +static void setup(void); +static void showhide(Client *c); +static void sigchld(int unused); +static void spawn(const Arg *arg); +static void tag(const Arg *arg); +static void tagmon(const Arg *arg); +static int textnw(const char *text, unsigned int len); +static void tile(Monitor *); +static void togglebar(const Arg *arg); +static void togglefloating(const Arg *arg); +static void toggletag(const Arg *arg); +static void toggleview(const Arg *arg); +static void unfocus(Client *c, Bool setfocus); +static void unmanage(Client *c, Bool destroyed); +static void unmapnotify(XEvent *e); +static Bool updategeom(void); +static void updatebarpos(Monitor *m); +static void updatebars(void); +static void updatenumlockmask(void); +static void updatesizehints(Client *c); +static void updatestatus(void); +static void updatewindowtype(Client *c); +static void updatetitle(Client *c); +static void updatewmhints(Client *c); +static void view(const Arg *arg); +static Client *wintoclient(Window w); +static Monitor *wintomon(Window w); +static int xerror(Display *dpy, XErrorEvent *ee); +static int xerrordummy(Display *dpy, XErrorEvent *ee); +static int xerrorstart(Display *dpy, XErrorEvent *ee); +static void zoom(const Arg *arg); + +/* variables */ +static const char broken[] = "broken"; +static char stext[256]; +static int screen; +static int sw, sh; /* X display screen geometry width, height */ +static int bh, blw = 0; /* bar geometry */ +static int (*xerrorxlib)(Display *, XErrorEvent *); +static unsigned int numlockmask = 0; +static void (*handler[LASTEvent]) (XEvent *) = { + [ButtonPress] = buttonpress, + [ClientMessage] = clientmessage, + [ConfigureRequest] = configurerequest, + [ConfigureNotify] = configurenotify, + [DestroyNotify] = destroynotify, + [EnterNotify] = enternotify, + [Expose] = expose, + [FocusIn] = focusin, + [KeyPress] = keypress, + [MappingNotify] = mappingnotify, + [MapRequest] = maprequest, + [MotionNotify] = motionnotify, + [PropertyNotify] = propertynotify, + [UnmapNotify] = unmapnotify +}; +static Atom wmatom[WMLast], netatom[NetLast]; +static Bool running = True; +static Cursor cursor[CurLast]; +static Display *dpy; +static DC dc; +static Monitor *mons = NULL, *selmon = NULL; +static Window root; + +/* configuration, allows nested code to access above variables */ +#include "config.h" + +/* compile-time check if all tags fit into an unsigned int bit array. */ +struct NumTags { char limitexceeded[LENGTH(tags) > 31 ? -1 : 1]; }; + +/* function implementations */ +void +applyrules(Client *c) { + const char *class, *instance; + unsigned int i; + const Rule *r; + Monitor *m; + XClassHint ch = { NULL, NULL }; + + /* rule matching */ + c->isfloating = c->tags = 0; + XGetClassHint(dpy, c->win, &ch); + class = ch.res_class ? ch.res_class : broken; + instance = ch.res_name ? ch.res_name : broken; + + for(i = 0; i < LENGTH(rules); i++) { + r = &rules[i]; + if((!r->title || strstr(c->name, r->title)) + && (!r->class || strstr(class, r->class)) + && (!r->instance || strstr(instance, r->instance))) + { + c->isfloating = r->isfloating; + c->tags |= r->tags; + for(m = mons; m && m->num != r->monitor; m = m->next); + if(m) + c->mon = m; + } + } + if(ch.res_class) + XFree(ch.res_class); + if(ch.res_name) + XFree(ch.res_name); + c->tags = c->tags & TAGMASK ? c->tags & TAGMASK : c->mon->tagset[c->mon->seltags]; +} + +Bool +applysizehints(Client *c, int *x, int *y, int *w, int *h, Bool interact) { + Bool baseismin; + Monitor *m = c->mon; + + /* set minimum possible */ + *w = MAX(1, *w); + *h = MAX(1, *h); + if(interact) { + if(*x > sw) + *x = sw - WIDTH(c); + if(*y > sh) + *y = sh - HEIGHT(c); + if(*x + *w + 2 * c->bw < 0) + *x = 0; + if(*y + *h + 2 * c->bw < 0) + *y = 0; + } + else { + if(*x >= m->wx + m->ww) + *x = m->wx + m->ww - WIDTH(c); + if(*y >= m->wy + m->wh) + *y = m->wy + m->wh - HEIGHT(c); + if(*x + *w + 2 * c->bw <= m->wx) + *x = m->wx; + if(*y + *h + 2 * c->bw <= m->wy) + *y = m->wy; + } + if(*h < bh) + *h = bh; + if(*w < bh) + *w = bh; + if(resizehints || c->isfloating || !c->mon->lt[c->mon->sellt]->arrange) { + /* see last two sentences in ICCCM 4.1.2.3 */ + baseismin = c->basew == c->minw && c->baseh == c->minh; + if(!baseismin) { /* temporarily remove base dimensions */ + *w -= c->basew; + *h -= c->baseh; + } + /* adjust for aspect limits */ + if(c->mina > 0 && c->maxa > 0) { + if(c->maxa < (float)*w / *h) + *w = *h * c->maxa + 0.5; + else if(c->mina < (float)*h / *w) + *h = *w * c->mina + 0.5; + } + if(baseismin) { /* increment calculation requires this */ + *w -= c->basew; + *h -= c->baseh; + } + /* adjust for increment value */ + if(c->incw) + *w -= *w % c->incw; + if(c->inch) + *h -= *h % c->inch; + /* restore base dimensions */ + *w = MAX(*w + c->basew, c->minw); + *h = MAX(*h + c->baseh, c->minh); + if(c->maxw) + *w = MIN(*w, c->maxw); + if(c->maxh) + *h = MIN(*h, c->maxh); + } + return *x != c->x || *y != c->y || *w != c->w || *h != c->h; +} + +void +arrange(Monitor *m) { + if(m) + showhide(m->stack); + else for(m = mons; m; m = m->next) + showhide(m->stack); + if(m) + arrangemon(m); + else for(m = mons; m; m = m->next) + arrangemon(m); +} + +void +arrangemon(Monitor *m) { + strncpy(m->ltsymbol, m->lt[m->sellt]->symbol, sizeof m->ltsymbol); + if(m->lt[m->sellt]->arrange) + m->lt[m->sellt]->arrange(m); + restack(m); +} + +void +attach(Client *c) { + c->next = c->mon->clients; + c->mon->clients = c; +} + +void +attachstack(Client *c) { + c->snext = c->mon->stack; + c->mon->stack = c; +} + +void +buttonpress(XEvent *e) { + unsigned int i, x, click; + Arg arg = {0}; + Client *c; + Monitor *m; + XButtonPressedEvent *ev = &e->xbutton; + + click = ClkRootWin; + /* focus monitor if necessary */ + if((m = wintomon(ev->window)) && m != selmon) { + unfocus(selmon->sel, True); + selmon = m; + focus(NULL); + } + if(ev->window == selmon->barwin) { + i = x = 0; + do + x += TEXTW(tags[i]); + while(ev->x >= x && ++i < LENGTH(tags)); + if(i < LENGTH(tags)) { + click = ClkTagBar; + arg.ui = 1 << i; + } + else if(ev->x < x + blw) + click = ClkLtSymbol; + else if(ev->x > selmon->ww - TEXTW(stext)) + click = ClkStatusText; + else + click = ClkWinTitle; + } + else if((c = wintoclient(ev->window))) { + focus(c); + click = ClkClientWin; + } + for(i = 0; i < LENGTH(buttons); i++) + if(click == buttons[i].click && buttons[i].func && buttons[i].button == ev->button + && CLEANMASK(buttons[i].mask) == CLEANMASK(ev->state)) + buttons[i].func(click == ClkTagBar && buttons[i].arg.i == 0 ? &arg : &buttons[i].arg); +} + +void +checkotherwm(void) { + xerrorxlib = XSetErrorHandler(xerrorstart); + /* this causes an error if some other window manager is running */ + XSelectInput(dpy, DefaultRootWindow(dpy), SubstructureRedirectMask); + XSync(dpy, False); + XSetErrorHandler(xerror); + XSync(dpy, False); +} + +void +cleanup(void) { + Arg a = {.ui = ~0}; + Layout foo = { "", NULL }; + Monitor *m; + + view(&a); + selmon->lt[selmon->sellt] = &foo; + for(m = mons; m; m = m->next) + while(m->stack) + unmanage(m->stack, False); + if(dc.font.set) + XFreeFontSet(dpy, dc.font.set); + else + XFreeFont(dpy, dc.font.xfont); + XUngrabKey(dpy, AnyKey, AnyModifier, root); + XFreePixmap(dpy, dc.drawable); + XFreeGC(dpy, dc.gc); + XFreeCursor(dpy, cursor[CurNormal]); + XFreeCursor(dpy, cursor[CurResize]); + XFreeCursor(dpy, cursor[CurMove]); + while(mons) + cleanupmon(mons); + XSync(dpy, False); + XSetInputFocus(dpy, PointerRoot, RevertToPointerRoot, CurrentTime); +} + +void +cleanupmon(Monitor *mon) { + Monitor *m; + + if(mon == mons) + mons = mons->next; + else { + for(m = mons; m && m->next != mon; m = m->next); + m->next = mon->next; + } + XUnmapWindow(dpy, mon->barwin); + XDestroyWindow(dpy, mon->barwin); + free(mon); +} + +void +clearurgent(Client *c) { + XWMHints *wmh; + + c->isurgent = False; + if(!(wmh = XGetWMHints(dpy, c->win))) + return; + wmh->flags &= ~XUrgencyHint; + XSetWMHints(dpy, c->win, wmh); + XFree(wmh); +} + +void +clientmessage(XEvent *e) { + XClientMessageEvent *cme = &e->xclient; + Client *c = wintoclient(cme->window); + + if(!c) + return; + if(cme->message_type == netatom[NetWMState]) { + if(cme->data.l[1] == netatom[NetWMFullscreen] || cme->data.l[2] == netatom[NetWMFullscreen]) + setfullscreen(c, (cme->data.l[0] == 1 /* _NET_WM_STATE_ADD */ + || (cme->data.l[0] == 2 /* _NET_WM_STATE_TOGGLE */ && !c->isfullscreen))); + } + else if(cme->message_type == netatom[NetActiveWindow]) { + if(!ISVISIBLE(c)) { + c->mon->seltags ^= 1; + c->mon->tagset[c->mon->seltags] = c->tags; + } + pop(c); + } +} + +void +configure(Client *c) { + XConfigureEvent ce; + + ce.type = ConfigureNotify; + ce.display = dpy; + ce.event = c->win; + ce.window = c->win; + ce.x = c->x; + ce.y = c->y; + ce.width = c->w; + ce.height = c->h; + ce.border_width = c->bw; + ce.above = None; + ce.override_redirect = False; + XSendEvent(dpy, c->win, False, StructureNotifyMask, (XEvent *)&ce); +} + +void +configurenotify(XEvent *e) { + Monitor *m; + XConfigureEvent *ev = &e->xconfigure; + Bool dirty; + + if(ev->window == root) { + dirty = (sw != ev->width); + sw = ev->width; + sh = ev->height; + if(updategeom() || dirty) { + if(dc.drawable != 0) + XFreePixmap(dpy, dc.drawable); + dc.drawable = XCreatePixmap(dpy, root, sw, bh, DefaultDepth(dpy, screen)); + updatebars(); + for(m = mons; m; m = m->next) + XMoveResizeWindow(dpy, m->barwin, m->wx, m->by, m->ww, bh); + focus(NULL); + arrange(NULL); + } + } +} + +void +configurerequest(XEvent *e) { + Client *c; + Monitor *m; + XConfigureRequestEvent *ev = &e->xconfigurerequest; + XWindowChanges wc; + + if((c = wintoclient(ev->window))) { + if(ev->value_mask & CWBorderWidth) + c->bw = ev->border_width; + else if(c->isfloating || !selmon->lt[selmon->sellt]->arrange) { + m = c->mon; + if(ev->value_mask & CWX) { + c->oldx = c->x; + c->x = m->mx + ev->x; + } + if(ev->value_mask & CWY) { + c->oldy = c->y; + c->y = m->my + ev->y; + } + if(ev->value_mask & CWWidth) { + c->oldw = c->w; + c->w = ev->width; + } + if(ev->value_mask & CWHeight) { + c->oldh = c->h; + c->h = ev->height; + } + if((c->x + c->w) > m->mx + m->mw && c->isfloating) + c->x = m->mx + (m->mw / 2 - WIDTH(c) / 2); /* center in x direction */ + if((c->y + c->h) > m->my + m->mh && c->isfloating) + c->y = m->my + (m->mh / 2 - HEIGHT(c) / 2); /* center in y direction */ + if((ev->value_mask & (CWX|CWY)) && !(ev->value_mask & (CWWidth|CWHeight))) + configure(c); + if(ISVISIBLE(c)) + XMoveResizeWindow(dpy, c->win, c->x, c->y, c->w, c->h); + } + else + configure(c); + } + else { + wc.x = ev->x; + wc.y = ev->y; + wc.width = ev->width; + wc.height = ev->height; + wc.border_width = ev->border_width; + wc.sibling = ev->above; + wc.stack_mode = ev->detail; + XConfigureWindow(dpy, ev->window, ev->value_mask, &wc); + } + XSync(dpy, False); +} + +Monitor * +createmon(void) { + Monitor *m; + + if(!(m = (Monitor *)calloc(1, sizeof(Monitor)))) + die("fatal: could not malloc() %u bytes\n", sizeof(Monitor)); + m->tagset[0] = m->tagset[1] = 1; + m->mfact = mfact; + m->nmaster = nmaster; + m->showbar = showbar; + m->topbar = topbar; + m->gappx = gappx; + m->lt[0] = &layouts[0]; + m->lt[1] = &layouts[1 % LENGTH(layouts)]; + strncpy(m->ltsymbol, layouts[0].symbol, sizeof m->ltsymbol); + return m; +} + +void +destroynotify(XEvent *e) { + Client *c; + XDestroyWindowEvent *ev = &e->xdestroywindow; + + if((c = wintoclient(ev->window))) + unmanage(c, True); +} + +void +detach(Client *c) { + Client **tc; + + for(tc = &c->mon->clients; *tc && *tc != c; tc = &(*tc)->next); + *tc = c->next; +} + +void +detachstack(Client *c) { + Client **tc, *t; + + for(tc = &c->mon->stack; *tc && *tc != c; tc = &(*tc)->snext); + *tc = c->snext; + + if(c == c->mon->sel) { + for(t = c->mon->stack; t && !ISVISIBLE(t); t = t->snext); + c->mon->sel = t; + } +} + +void +die(const char *errstr, ...) { + va_list ap; + + va_start(ap, errstr); + vfprintf(stderr, errstr, ap); + va_end(ap); + exit(EXIT_FAILURE); +} + +Monitor * +dirtomon(int dir) { + Monitor *m = NULL; + + if(dir > 0) { + if(!(m = selmon->next)) + m = mons; + } + else if(selmon == mons) + for(m = mons; m->next; m = m->next); + else + for(m = mons; m->next != selmon; m = m->next); + return m; +} + +void +drawbar(Monitor *m) { + int x; + unsigned int i, occ = 0, urg = 0; + unsigned long *col; + Client *c; + + for(c = m->clients; c; c = c->next) { + occ |= c->tags; + if(c->isurgent) + urg |= c->tags; + } + dc.x = 0; + for(i = 0; i < LENGTH(tags); i++) { + dc.w = TEXTW(tags[i]); + col = m->tagset[m->seltags] & 1 << i ? dc.sel : dc.norm; + drawtext(tags[i], col, urg & 1 << i); + drawsquare(m == selmon && selmon->sel && selmon->sel->tags & 1 << i, + occ & 1 << i, urg & 1 << i, col); + dc.x += dc.w; + } + dc.w = blw = TEXTW(m->ltsymbol); + drawtext(m->ltsymbol, dc.norm, False); + dc.x += dc.w; + x = dc.x; + if(m == selmon) { /* status is only drawn on selected monitor */ + dc.w = TEXTW(stext); + dc.x = m->ww - dc.w; + if(dc.x < x) { + dc.x = x; + dc.w = m->ww - x; + } + drawtext(stext, dc.norm, False); + } + else + dc.x = m->ww; + if((dc.w = dc.x - x) > bh) { + dc.x = x; + if(m->sel) { + col = m == selmon ? dc.sel : dc.norm; + drawtext(m->sel->name, col, False); + drawsquare(m->sel->isfixed, m->sel->isfloating, False, col); + } + else + drawtext(NULL, dc.norm, False); + } + XCopyArea(dpy, dc.drawable, m->barwin, dc.gc, 0, 0, m->ww, bh, 0, 0); + XSync(dpy, False); +} + +void +drawbars(void) { + Monitor *m; + + for(m = mons; m; m = m->next) + drawbar(m); +} + +void +drawsquare(Bool filled, Bool empty, Bool invert, unsigned long col[ColLast]) { + int x; + + XSetForeground(dpy, dc.gc, col[invert ? ColBG : ColFG]); + x = (dc.font.ascent + dc.font.descent + 2) / 4; + if(filled) + XFillRectangle(dpy, dc.drawable, dc.gc, dc.x+1, dc.y+1, x+1, x+1); + else if(empty) + XDrawRectangle(dpy, dc.drawable, dc.gc, dc.x+1, dc.y+1, x, x); +} + +void +drawtext(const char *text, unsigned long col[ColLast], Bool invert) { + char buf[256]; + int i, x, y, h, len, olen; + + XSetForeground(dpy, dc.gc, col[invert ? ColFG : ColBG]); + XFillRectangle(dpy, dc.drawable, dc.gc, dc.x, dc.y, dc.w, dc.h); + if(!text) + return; + olen = strlen(text); + h = dc.font.ascent + dc.font.descent; + y = dc.y + (dc.h / 2) - (h / 2) + dc.font.ascent; + x = dc.x + (h / 2); + /* shorten text if necessary */ + for(len = MIN(olen, sizeof buf); len && textnw(text, len) > dc.w - h; len--); + if(!len) + return; + memcpy(buf, text, len); + if(len < olen) + for(i = len; i && i > len - 3; buf[--i] = '.'); + XSetForeground(dpy, dc.gc, col[invert ? ColBG : ColFG]); + if(dc.font.set) + XmbDrawString(dpy, dc.drawable, dc.font.set, dc.gc, x, y, buf, len); + else + XDrawString(dpy, dc.drawable, dc.gc, x, y, buf, len); +} + +void +enternotify(XEvent *e) { + Client *c; + Monitor *m; + XCrossingEvent *ev = &e->xcrossing; + + if((ev->mode != NotifyNormal || ev->detail == NotifyInferior) && ev->window != root) + return; + c = wintoclient(ev->window); + m = c ? c->mon : wintomon(ev->window); + if(m != selmon) { + unfocus(selmon->sel, True); + selmon = m; + } + else if(!c || c == selmon->sel) + return; + focus(c); +} + +void +expose(XEvent *e) { + Monitor *m; + XExposeEvent *ev = &e->xexpose; + + if(ev->count == 0 && (m = wintomon(ev->window))) + drawbar(m); +} + +void +focus(Client *c) { + if(!c || !ISVISIBLE(c)) + for(c = selmon->stack; c && !ISVISIBLE(c); c = c->snext); + /* was if(selmon->sel) */ + if(selmon->sel && selmon->sel != c) + unfocus(selmon->sel, False); + if(c) { + if(c->mon != selmon) + selmon = c->mon; + if(c->isurgent) + clearurgent(c); + detachstack(c); + attachstack(c); + grabbuttons(c, True); + XSetWindowBorder(dpy, c->win, dc.sel[ColBorder]); + setfocus(c); + } + else + XSetInputFocus(dpy, root, RevertToPointerRoot, CurrentTime); + selmon->sel = c; + drawbars(); +} + +void +focusin(XEvent *e) { /* there are some broken focus acquiring clients */ + XFocusChangeEvent *ev = &e->xfocus; + + if(selmon->sel && ev->window != selmon->sel->win) + setfocus(selmon->sel); +} + +void +focusmon(const Arg *arg) { + Monitor *m; + + if(!mons->next) + return; + if((m = dirtomon(arg->i)) == selmon) + return; + unfocus(selmon->sel, True); + selmon = m; + focus(NULL); +} + +void +focusstack(const Arg *arg) { + Client *c = NULL, *i; + + if(!selmon->sel) + return; + if(arg->i > 0) { + for(c = selmon->sel->next; c && !ISVISIBLE(c); c = c->next); + if(!c) + for(c = selmon->clients; c && !ISVISIBLE(c); c = c->next); + } + else { + for(i = selmon->clients; i != selmon->sel; i = i->next) + if(ISVISIBLE(i)) + c = i; + if(!c) + for(; i; i = i->next) + if(ISVISIBLE(i)) + c = i; + } + if(c) { + focus(c); + restack(selmon); + } +} + +Atom +getatomprop(Client *c, Atom prop) { + int di; + unsigned long dl; + unsigned char *p = NULL; + Atom da, atom = None; + + if(XGetWindowProperty(dpy, c->win, prop, 0L, sizeof atom, False, XA_ATOM, + &da, &di, &dl, &dl, &p) == Success && p) { + atom = *(Atom *)p; + XFree(p); + } + return atom; +} + +unsigned long +getcolor(const char *colstr) { + Colormap cmap = DefaultColormap(dpy, screen); + XColor color; + + if(!XAllocNamedColor(dpy, cmap, colstr, &color, &color)) + die("error, cannot allocate color '%s'\n", colstr); + return color.pixel; +} + +Bool +getrootptr(int *x, int *y) { + int di; + unsigned int dui; + Window dummy; + + return XQueryPointer(dpy, root, &dummy, &dummy, x, y, &di, &di, &dui); +} + +long +getstate(Window w) { + int format; + long result = -1; + unsigned char *p = NULL; + unsigned long n, extra; + Atom real; + + if(XGetWindowProperty(dpy, w, wmatom[WMState], 0L, 2L, False, wmatom[WMState], + &real, &format, &n, &extra, (unsigned char **)&p) != Success) + return -1; + if(n != 0) + result = *p; + XFree(p); + return result; +} + +Bool +gettextprop(Window w, Atom atom, char *text, unsigned int size) { + char **list = NULL; + int n; + XTextProperty name; + + if(!text || size == 0) + return False; + text[0] = '\0'; + XGetTextProperty(dpy, w, &name, atom); + if(!name.nitems) + return False; + if(name.encoding == XA_STRING) + strncpy(text, (char *)name.value, size - 1); + else { + if(XmbTextPropertyToTextList(dpy, &name, &list, &n) >= Success && n > 0 && *list) { + strncpy(text, *list, size - 1); + XFreeStringList(list); + } + } + text[size - 1] = '\0'; + XFree(name.value); + return True; +} + +void +grabbuttons(Client *c, Bool focused) { + updatenumlockmask(); + { + unsigned int i, j; + unsigned int modifiers[] = { 0, LockMask, numlockmask, numlockmask|LockMask }; + XUngrabButton(dpy, AnyButton, AnyModifier, c->win); + if(focused) { + for(i = 0; i < LENGTH(buttons); i++) + if(buttons[i].click == ClkClientWin) + for(j = 0; j < LENGTH(modifiers); j++) + XGrabButton(dpy, buttons[i].button, + buttons[i].mask | modifiers[j], + c->win, False, BUTTONMASK, + GrabModeAsync, GrabModeSync, None, None); + } + else + XGrabButton(dpy, AnyButton, AnyModifier, c->win, False, + BUTTONMASK, GrabModeAsync, GrabModeSync, None, None); + } +} + +void +grabkeys(void) { + updatenumlockmask(); + { + unsigned int i, j; + unsigned int modifiers[] = { 0, LockMask, numlockmask, numlockmask|LockMask }; + KeyCode code; + + XUngrabKey(dpy, AnyKey, AnyModifier, root); + for(i = 0; i < LENGTH(keys); i++) + if((code = XKeysymToKeycode(dpy, keys[i].keysym))) + for(j = 0; j < LENGTH(modifiers); j++) + XGrabKey(dpy, code, keys[i].mod | modifiers[j], root, + True, GrabModeAsync, GrabModeAsync); + } +} + +void +incnmaster(const Arg *arg) { + selmon->nmaster = MAX(selmon->nmaster + arg->i, 0); + arrange(selmon); +} + +void +initfont(const char *fontstr) { + char *def, **missing; + int n; + + dc.font.set = XCreateFontSet(dpy, fontstr, &missing, &n, &def); + if(missing) { + while(n--) + fprintf(stderr, "dwm: missing fontset: %s\n", missing[n]); + XFreeStringList(missing); + } + if(dc.font.set) { + XFontStruct **xfonts; + char **font_names; + + dc.font.ascent = dc.font.descent = 0; + XExtentsOfFontSet(dc.font.set); + n = XFontsOfFontSet(dc.font.set, &xfonts, &font_names); + while(n--) { + dc.font.ascent = MAX(dc.font.ascent, (*xfonts)->ascent); + dc.font.descent = MAX(dc.font.descent,(*xfonts)->descent); + xfonts++; + } + } + else { + if(!(dc.font.xfont = XLoadQueryFont(dpy, fontstr)) + && !(dc.font.xfont = XLoadQueryFont(dpy, "fixed"))) + die("error, cannot load font: '%s'\n", fontstr); + dc.font.ascent = dc.font.xfont->ascent; + dc.font.descent = dc.font.xfont->descent; + } + dc.font.height = dc.font.ascent + dc.font.descent; +} + +#ifdef XINERAMA +static Bool +isuniquegeom(XineramaScreenInfo *unique, size_t n, XineramaScreenInfo *info) { + while(n--) + if(unique[n].x_org == info->x_org && unique[n].y_org == info->y_org + && unique[n].width == info->width && unique[n].height == info->height) + return False; + return True; +} +#endif /* XINERAMA */ + +void +keypress(XEvent *e) { + unsigned int i; + KeySym keysym; + XKeyEvent *ev; + + ev = &e->xkey; + keysym = XKeycodeToKeysym(dpy, (KeyCode)ev->keycode, 0); + for(i = 0; i < LENGTH(keys); i++) + if(keysym == keys[i].keysym + && CLEANMASK(keys[i].mod) == CLEANMASK(ev->state) + && keys[i].func) + keys[i].func(&(keys[i].arg)); +} + +void +killclient(const Arg *arg) { + if(!selmon->sel) + return; + if(!sendevent(selmon->sel, wmatom[WMDelete])) { + XGrabServer(dpy); + XSetErrorHandler(xerrordummy); + XSetCloseDownMode(dpy, DestroyAll); + XKillClient(dpy, selmon->sel->win); + XSync(dpy, False); + XSetErrorHandler(xerror); + XUngrabServer(dpy); + } +} + +void +manage(Window w, XWindowAttributes *wa) { + Client *c, *t = NULL; + Window trans = None; + XWindowChanges wc; + + if(!(c = calloc(1, sizeof(Client)))) + die("fatal: could not malloc() %u bytes\n", sizeof(Client)); + c->win = w; + updatetitle(c); + if(XGetTransientForHint(dpy, w, &trans) && (t = wintoclient(trans))) { + c->mon = t->mon; + c->tags = t->tags; + } + else { + c->mon = selmon; + applyrules(c); + } + /* geometry */ + c->x = c->oldx = wa->x; + c->y = c->oldy = wa->y; + c->w = c->oldw = wa->width; + c->h = c->oldh = wa->height; + c->oldbw = wa->border_width; + + if(c->x + WIDTH(c) > c->mon->mx + c->mon->mw) + c->x = c->mon->mx + c->mon->mw - WIDTH(c); + if(c->y + HEIGHT(c) > c->mon->my + c->mon->mh) + c->y = c->mon->my + c->mon->mh - HEIGHT(c); + c->x = MAX(c->x, c->mon->mx); + /* only fix client y-offset, if the client center might cover the bar */ + c->y = MAX(c->y, ((c->mon->by == c->mon->my) && (c->x + (c->w / 2) >= c->mon->wx) + && (c->x + (c->w / 2) < c->mon->wx + c->mon->ww)) ? bh : c->mon->my); + c->bw = borderpx; + + wc.border_width = c->bw; + XConfigureWindow(dpy, w, CWBorderWidth, &wc); + XSetWindowBorder(dpy, w, dc.norm[ColBorder]); + configure(c); /* propagates border_width, if size doesn't change */ + updatewindowtype(c); + updatesizehints(c); + updatewmhints(c); + XSelectInput(dpy, w, EnterWindowMask|FocusChangeMask|PropertyChangeMask|StructureNotifyMask); + grabbuttons(c, False); + if(!c->isfloating) + c->isfloating = c->oldstate = trans != None || c->isfixed; + if(c->isfloating) + XRaiseWindow(dpy, c->win); + attach(c); + attachstack(c); + XMoveResizeWindow(dpy, c->win, c->x + 2 * sw, c->y, c->w, c->h); /* some windows require this */ + setclientstate(c, NormalState); + if (c->mon == selmon) + unfocus(selmon->sel, False); + c->mon->sel = c; + arrange(c->mon); + XMapWindow(dpy, c->win); + focus(NULL); +} + +void +mappingnotify(XEvent *e) { + XMappingEvent *ev = &e->xmapping; + + XRefreshKeyboardMapping(ev); + if(ev->request == MappingKeyboard) + grabkeys(); +} + +void +maprequest(XEvent *e) { + static XWindowAttributes wa; + XMapRequestEvent *ev = &e->xmaprequest; + + if(!XGetWindowAttributes(dpy, ev->window, &wa)) + return; + if(wa.override_redirect) + return; + if(!wintoclient(ev->window)) + manage(ev->window, &wa); +} + +void +monocle(Monitor *m) { + unsigned int n = 0; + Client *c; + + for(c = m->clients; c; c = c->next) + if(ISVISIBLE(c)) + n++; + if(n > 0) /* override layout symbol */ + snprintf(m->ltsymbol, sizeof m->ltsymbol, "[%d]", n); + for(c = nexttiled(m->clients); c; c = nexttiled(c->next)) + resize(c, m->wx, m->wy, m->ww - 2 * c->bw, m->wh - 2 * c->bw, False); +} + +void +motionnotify(XEvent *e) { + static Monitor *mon = NULL; + Monitor *m; + XMotionEvent *ev = &e->xmotion; + + if(ev->window != root) + return; + if((m = recttomon(ev->x_root, ev->y_root, 1, 1)) != mon && mon) { + selmon = m; + focus(NULL); + } + mon = m; +} + +void +movemouse(const Arg *arg) { + int x, y, ocx, ocy, nx, ny; + Client *c; + Monitor *m; + XEvent ev; + + if(!(c = selmon->sel)) + return; + restack(selmon); + ocx = c->x; + ocy = c->y; + if(XGrabPointer(dpy, root, False, MOUSEMASK, GrabModeAsync, GrabModeAsync, + None, cursor[CurMove], CurrentTime) != GrabSuccess) + return; + if(!getrootptr(&x, &y)) + return; + do { + XMaskEvent(dpy, MOUSEMASK|ExposureMask|SubstructureRedirectMask, &ev); + switch(ev.type) { + case ConfigureRequest: + case Expose: + case MapRequest: + handler[ev.type](&ev); + break; + case MotionNotify: + nx = ocx + (ev.xmotion.x - x); + ny = ocy + (ev.xmotion.y - y); + if(nx >= selmon->wx && nx <= selmon->wx + selmon->ww + && ny >= selmon->wy && ny <= selmon->wy + selmon->wh) { + if(abs(selmon->wx - nx) < snap) + nx = selmon->wx; + else if(abs((selmon->wx + selmon->ww) - (nx + WIDTH(c))) < snap) + nx = selmon->wx + selmon->ww - WIDTH(c); + if(abs(selmon->wy - ny) < snap) + ny = selmon->wy; + else if(abs((selmon->wy + selmon->wh) - (ny + HEIGHT(c))) < snap) + ny = selmon->wy + selmon->wh - HEIGHT(c); + if(!c->isfloating && selmon->lt[selmon->sellt]->arrange + && (abs(nx - c->x) > snap || abs(ny - c->y) > snap)) + togglefloating(NULL); + } + if(!selmon->lt[selmon->sellt]->arrange || c->isfloating) + resize(c, nx, ny, c->w, c->h, True); + break; + } + } while(ev.type != ButtonRelease); + XUngrabPointer(dpy, CurrentTime); + if((m = recttomon(c->x, c->y, c->w, c->h)) != selmon) { + sendmon(c, m); + selmon = m; + focus(NULL); + } +} + +Client * +nexttiled(Client *c) { + for(; c && (c->isfloating || !ISVISIBLE(c)); c = c->next); + return c; +} + +void +pop(Client *c) { + detach(c); + attach(c); + focus(c); + arrange(c->mon); +} + +void +propertynotify(XEvent *e) { + Client *c; + Window trans; + XPropertyEvent *ev = &e->xproperty; + + if((ev->window == root) && (ev->atom == XA_WM_NAME)) + updatestatus(); + else if(ev->state == PropertyDelete) + return; /* ignore */ + else if((c = wintoclient(ev->window))) { + switch(ev->atom) { + default: break; + case XA_WM_TRANSIENT_FOR: + if(!c->isfloating && (XGetTransientForHint(dpy, c->win, &trans)) && + (c->isfloating = (wintoclient(trans)) != NULL)) + arrange(c->mon); + break; + case XA_WM_NORMAL_HINTS: + updatesizehints(c); + break; + case XA_WM_HINTS: + updatewmhints(c); + drawbars(); + break; + } + if(ev->atom == XA_WM_NAME || ev->atom == netatom[NetWMName]) { + updatetitle(c); + if(c == c->mon->sel) + drawbar(c->mon); + } + if(ev->atom == netatom[NetWMWindowType]) + updatewindowtype(c); + } +} + +void +quit(const Arg *arg) { + running = False; +} + +Monitor * +recttomon(int x, int y, int w, int h) { + Monitor *m, *r = selmon; + int a, area = 0; + + for(m = mons; m; m = m->next) + if((a = INTERSECT(x, y, w, h, m)) > area) { + area = a; + r = m; + } + return r; +} + +void +resize(Client *c, int x, int y, int w, int h, Bool interact) { + if(applysizehints(c, &x, &y, &w, &h, interact)) + resizeclient(c, x, y, w, h); +} + +void +resizeclient(Client *c, int x, int y, int w, int h) { + XWindowChanges wc; + + c->oldx = c->x; c->x = wc.x = x; + c->oldy = c->y; c->y = wc.y = y; + c->oldw = c->w; c->w = wc.width = w; + c->oldh = c->h; c->h = wc.height = h; + wc.border_width = c->bw; + XConfigureWindow(dpy, c->win, CWX|CWY|CWWidth|CWHeight|CWBorderWidth, &wc); + configure(c); + XSync(dpy, False); +} + +void +resizemouse(const Arg *arg) { + int ocx, ocy; + int nw, nh; + Client *c; + Monitor *m; + XEvent ev; + + if(!(c = selmon->sel)) + return; + restack(selmon); + ocx = c->x; + ocy = c->y; + if(XGrabPointer(dpy, root, False, MOUSEMASK, GrabModeAsync, GrabModeAsync, + None, cursor[CurResize], CurrentTime) != GrabSuccess) + return; + XWarpPointer(dpy, None, c->win, 0, 0, 0, 0, c->w + c->bw - 1, c->h + c->bw - 1); + do { + XMaskEvent(dpy, MOUSEMASK|ExposureMask|SubstructureRedirectMask, &ev); + switch(ev.type) { + case ConfigureRequest: + case Expose: + case MapRequest: + handler[ev.type](&ev); + break; + case MotionNotify: + nw = MAX(ev.xmotion.x - ocx - 2 * c->bw + 1, 1); + nh = MAX(ev.xmotion.y - ocy - 2 * c->bw + 1, 1); + if(c->mon->wx + nw >= selmon->wx && c->mon->wx + nw <= selmon->wx + selmon->ww + && c->mon->wy + nh >= selmon->wy && c->mon->wy + nh <= selmon->wy + selmon->wh) + { + if(!c->isfloating && selmon->lt[selmon->sellt]->arrange + && (abs(nw - c->w) > snap || abs(nh - c->h) > snap)) + togglefloating(NULL); + } + if(!selmon->lt[selmon->sellt]->arrange || c->isfloating) + resize(c, c->x, c->y, nw, nh, True); + break; + } + } while(ev.type != ButtonRelease); + XWarpPointer(dpy, None, c->win, 0, 0, 0, 0, c->w + c->bw - 1, c->h + c->bw - 1); + XUngrabPointer(dpy, CurrentTime); + while(XCheckMaskEvent(dpy, EnterWindowMask, &ev)); + if((m = recttomon(c->x, c->y, c->w, c->h)) != selmon) { + sendmon(c, m); + selmon = m; + focus(NULL); + } +} + +void +restack(Monitor *m) { + Client *c; + XEvent ev; + XWindowChanges wc; + + drawbar(m); + if(!m->sel) + return; + if(m->sel->isfloating || !m->lt[m->sellt]->arrange) + XRaiseWindow(dpy, m->sel->win); + if(m->lt[m->sellt]->arrange) { + wc.stack_mode = Below; + wc.sibling = m->barwin; + for(c = m->stack; c; c = c->snext) + if(!c->isfloating && ISVISIBLE(c)) { + XConfigureWindow(dpy, c->win, CWSibling|CWStackMode, &wc); + wc.sibling = c->win; + } + } + XSync(dpy, False); + while(XCheckMaskEvent(dpy, EnterWindowMask, &ev)); +} + +void +run(void) { + XEvent ev; + /* main event loop */ + XSync(dpy, False); + while(running && !XNextEvent(dpy, &ev)) + if(handler[ev.type]) + handler[ev.type](&ev); /* call handler */ +} + +void +scan(void) { + unsigned int i, num; + Window d1, d2, *wins = NULL; + XWindowAttributes wa; + + if(XQueryTree(dpy, root, &d1, &d2, &wins, &num)) { + for(i = 0; i < num; i++) { + if(!XGetWindowAttributes(dpy, wins[i], &wa) + || wa.override_redirect || XGetTransientForHint(dpy, wins[i], &d1)) + continue; + if(wa.map_state == IsViewable || getstate(wins[i]) == IconicState) + manage(wins[i], &wa); + } + for(i = 0; i < num; i++) { /* now the transients */ + if(!XGetWindowAttributes(dpy, wins[i], &wa)) + continue; + if(XGetTransientForHint(dpy, wins[i], &d1) + && (wa.map_state == IsViewable || getstate(wins[i]) == IconicState)) + manage(wins[i], &wa); + } + if(wins) + XFree(wins); + } +} + +void +sendmon(Client *c, Monitor *m) { + if(c->mon == m) + return; + unfocus(c, True); + detach(c); + detachstack(c); + c->mon = m; + c->tags = m->tagset[m->seltags]; /* assign tags of target monitor */ + attach(c); + attachstack(c); + focus(NULL); + arrange(NULL); +} + +void +setclientstate(Client *c, long state) { + long data[] = { state, None }; + + XChangeProperty(dpy, c->win, wmatom[WMState], wmatom[WMState], 32, + PropModeReplace, (unsigned char *)data, 2); +} + +Bool +sendevent(Client *c, Atom proto) { + int n; + Atom *protocols; + Bool exists = False; + XEvent ev; + + if(XGetWMProtocols(dpy, c->win, &protocols, &n)) { + while(!exists && n--) + exists = protocols[n] == proto; + XFree(protocols); + } + if(exists) { + ev.type = ClientMessage; + ev.xclient.window = c->win; + ev.xclient.message_type = wmatom[WMProtocols]; + ev.xclient.format = 32; + ev.xclient.data.l[0] = proto; + ev.xclient.data.l[1] = CurrentTime; + XSendEvent(dpy, c->win, False, NoEventMask, &ev); + } + return exists; +} + +void +setgaps(const Arg *arg) +{ + if ((arg->i == 0) || (selmon->gappx + arg->i < 0)) + selmon->gappx = 0; + else + selmon->gappx += arg->i; + arrange(selmon); +} + +void +setfocus(Client *c) { + if(!c->neverfocus) + XSetInputFocus(dpy, c->win, RevertToPointerRoot, CurrentTime); + sendevent(c, wmatom[WMTakeFocus]); +} + +void +setfullscreen(Client *c, Bool fullscreen) { + if(fullscreen) { + XChangeProperty(dpy, c->win, netatom[NetWMState], XA_ATOM, 32, + PropModeReplace, (unsigned char*)&netatom[NetWMFullscreen], 1); + c->isfullscreen = True; + c->oldstate = c->isfloating; + c->oldbw = c->bw; + c->bw = 0; + c->isfloating = True; + resizeclient(c, c->mon->mx, c->mon->my, c->mon->mw, c->mon->mh); + XRaiseWindow(dpy, c->win); + } + else { + XChangeProperty(dpy, c->win, netatom[NetWMState], XA_ATOM, 32, + PropModeReplace, (unsigned char*)0, 0); + c->isfullscreen = False; + c->isfloating = c->oldstate; + c->bw = c->oldbw; + c->x = c->oldx; + c->y = c->oldy; + c->w = c->oldw; + c->h = c->oldh; + resizeclient(c, c->x, c->y, c->w, c->h); + arrange(c->mon); + } +} + +void +setlayout(const Arg *arg) { + if(!arg || !arg->v || arg->v != selmon->lt[selmon->sellt]) + selmon->sellt ^= 1; + if(arg && arg->v) + selmon->lt[selmon->sellt] = (Layout *)arg->v; + strncpy(selmon->ltsymbol, selmon->lt[selmon->sellt]->symbol, sizeof selmon->ltsymbol); + if(selmon->sel) + arrange(selmon); + else + drawbar(selmon); +} + +/* arg > 1.0 will set mfact absolutly */ +void +setmfact(const Arg *arg) { + float f; + + if(!arg || !selmon->lt[selmon->sellt]->arrange) + return; + f = arg->f < 1.0 ? arg->f + selmon->mfact : arg->f - 1.0; + if(f < 0.1 || f > 0.9) + return; + selmon->mfact = f; + arrange(selmon); +} + +void +setup(void) { + XSetWindowAttributes wa; + + /* clean up any zombies immediately */ + sigchld(0); + + /* init screen */ + screen = DefaultScreen(dpy); + root = RootWindow(dpy, screen); + initfont(font); + sw = DisplayWidth(dpy, screen); + sh = DisplayHeight(dpy, screen); + bh = dc.h = dc.font.height + 2; + updategeom(); + /* init atoms */ + wmatom[WMProtocols] = XInternAtom(dpy, "WM_PROTOCOLS", False); + wmatom[WMDelete] = XInternAtom(dpy, "WM_DELETE_WINDOW", False); + wmatom[WMState] = XInternAtom(dpy, "WM_STATE", False); + wmatom[WMTakeFocus] = XInternAtom(dpy, "WM_TAKE_FOCUS", False); + netatom[NetActiveWindow] = XInternAtom(dpy, "_NET_ACTIVE_WINDOW", False); + netatom[NetSupported] = XInternAtom(dpy, "_NET_SUPPORTED", False); + netatom[NetWMName] = XInternAtom(dpy, "_NET_WM_NAME", False); + netatom[NetWMState] = XInternAtom(dpy, "_NET_WM_STATE", False); + netatom[NetWMFullscreen] = XInternAtom(dpy, "_NET_WM_STATE_FULLSCREEN", False); + netatom[NetWMWindowType] = XInternAtom(dpy, "_NET_WM_WINDOW_TYPE", False); + netatom[NetWMWindowTypeDialog] = XInternAtom(dpy, "_NET_WM_WINDOW_TYPE_DIALOG", False); + /* init cursors */ + cursor[CurNormal] = XCreateFontCursor(dpy, XC_left_ptr); + cursor[CurResize] = XCreateFontCursor(dpy, XC_sizing); + cursor[CurMove] = XCreateFontCursor(dpy, XC_fleur); + /* init appearance */ + dc.norm[ColBorder] = getcolor(normbordercolor); + dc.norm[ColBG] = getcolor(normbgcolor); + dc.norm[ColFG] = getcolor(normfgcolor); + dc.sel[ColBorder] = getcolor(selbordercolor); + dc.sel[ColBG] = getcolor(selbgcolor); + dc.sel[ColFG] = getcolor(selfgcolor); + dc.drawable = XCreatePixmap(dpy, root, DisplayWidth(dpy, screen), bh, DefaultDepth(dpy, screen)); + dc.gc = XCreateGC(dpy, root, 0, NULL); + XSetLineAttributes(dpy, dc.gc, 1, LineSolid, CapButt, JoinMiter); + if(!dc.font.set) + XSetFont(dpy, dc.gc, dc.font.xfont->fid); + /* init bars */ + updatebars(); + updatestatus(); + /* EWMH support per view */ + XChangeProperty(dpy, root, netatom[NetSupported], XA_ATOM, 32, + PropModeReplace, (unsigned char *) netatom, NetLast); + /* select for events */ + wa.cursor = cursor[CurNormal]; + wa.event_mask = SubstructureRedirectMask|SubstructureNotifyMask|ButtonPressMask|PointerMotionMask + |EnterWindowMask|LeaveWindowMask|StructureNotifyMask|PropertyChangeMask; + XChangeWindowAttributes(dpy, root, CWEventMask|CWCursor, &wa); + XSelectInput(dpy, root, wa.event_mask); + grabkeys(); +} + +void +showhide(Client *c) { + if(!c) + return; + if(ISVISIBLE(c)) { /* show clients top down */ + XMoveWindow(dpy, c->win, c->x, c->y); + if((!c->mon->lt[c->mon->sellt]->arrange || c->isfloating) && !c->isfullscreen) + resize(c, c->x, c->y, c->w, c->h, False); + showhide(c->snext); + } + else { /* hide clients bottom up */ + showhide(c->snext); + XMoveWindow(dpy, c->win, WIDTH(c) * -2, c->y); + } +} + +void +sigchld(int unused) { + if(signal(SIGCHLD, sigchld) == SIG_ERR) + die("Can't install SIGCHLD handler"); + while(0 < waitpid(-1, NULL, WNOHANG)); +} + +void +spawn(const Arg *arg) { + if(fork() == 0) { + if(dpy) + close(ConnectionNumber(dpy)); + setsid(); + execvp(((char **)arg->v)[0], (char **)arg->v); + fprintf(stderr, "dwm: execvp %s", ((char **)arg->v)[0]); + perror(" failed"); + exit(EXIT_SUCCESS); + } +} + +void +tag(const Arg *arg) { + if(selmon->sel && arg->ui & TAGMASK) { + selmon->sel->tags = arg->ui & TAGMASK; + focus(NULL); + arrange(selmon); + } +} + +void +tagmon(const Arg *arg) { + if(!selmon->sel || !mons->next) + return; + sendmon(selmon->sel, dirtomon(arg->i)); +} + +int +textnw(const char *text, unsigned int len) { + XRectangle r; + + if(dc.font.set) { + XmbTextExtents(dc.font.set, text, len, NULL, &r); + return r.width; + } + return XTextWidth(dc.font.xfont, text, len); +} + +void +tile(Monitor *m) { + unsigned int i, n, h, mw, my, ty; + Client *c; + + for(n = 0, c = nexttiled(m->clients); c; c = nexttiled(c->next), n++); + if(n == 0) + return; + + if(n > m->nmaster) + mw = m->nmaster ? m->ww * m->mfact : 0; + else + mw = m->ww - m->gappx; + for (i = 0, my = ty = m->gappx, c = nexttiled(m->clients); c; c = nexttiled(c->next), i++) + + if(i < m->nmaster) { + h = (m->wh - my) / (MIN(n, m->nmaster) - i) - m->gappx; + resize(c, m->wx + m->gappx, m->wy + my, mw - (2*c->bw) - m->gappx, h - (2*c->bw), 0); + my += HEIGHT(c) + m->gappx; + } + else { + h = (m->wh - ty) / (n - i) - m->gappx; + resize(c, m->wx + mw + m->gappx, m->wy + ty, m->ww - mw - (2*c->bw) - 2*m->gappx, h - (2*c->bw), 0); + ty += HEIGHT(c) + m->gappx; + } +} + +void +togglebar(const Arg *arg) { + selmon->showbar = !selmon->showbar; + updatebarpos(selmon); + XMoveResizeWindow(dpy, selmon->barwin, selmon->wx, selmon->by, selmon->ww, bh); + arrange(selmon); +} + +void +togglefloating(const Arg *arg) { + if(!selmon->sel) + return; + selmon->sel->isfloating = !selmon->sel->isfloating || selmon->sel->isfixed; + if(selmon->sel->isfloating) + resize(selmon->sel, selmon->sel->x, selmon->sel->y, + selmon->sel->w, selmon->sel->h, False); + arrange(selmon); +} + +void +toggletag(const Arg *arg) { + unsigned int newtags; + + if(!selmon->sel) + return; + newtags = selmon->sel->tags ^ (arg->ui & TAGMASK); + if(newtags) { + selmon->sel->tags = newtags; + focus(NULL); + arrange(selmon); + } +} + +void +toggleview(const Arg *arg) { + unsigned int newtagset = selmon->tagset[selmon->seltags] ^ (arg->ui & TAGMASK); + + if(newtagset) { + selmon->tagset[selmon->seltags] = newtagset; + focus(NULL); + arrange(selmon); + } +} + +void +unfocus(Client *c, Bool setfocus) { + if(!c) + return; + grabbuttons(c, False); + XSetWindowBorder(dpy, c->win, dc.norm[ColBorder]); + if(setfocus) + XSetInputFocus(dpy, root, RevertToPointerRoot, CurrentTime); +} + +void +unmanage(Client *c, Bool destroyed) { + Monitor *m = c->mon; + XWindowChanges wc; + + /* The server grab construct avoids race conditions. */ + detach(c); + detachstack(c); + if(!destroyed) { + wc.border_width = c->oldbw; + XGrabServer(dpy); + XSetErrorHandler(xerrordummy); + XConfigureWindow(dpy, c->win, CWBorderWidth, &wc); /* restore border */ + XUngrabButton(dpy, AnyButton, AnyModifier, c->win); + setclientstate(c, WithdrawnState); + XSync(dpy, False); + XSetErrorHandler(xerror); + XUngrabServer(dpy); + } + free(c); + focus(NULL); + arrange(m); +} + +void +unmapnotify(XEvent *e) { + Client *c; + XUnmapEvent *ev = &e->xunmap; + + if((c = wintoclient(ev->window))) { + if(ev->send_event) + setclientstate(c, WithdrawnState); + else + unmanage(c, False); + } +} + +void +updatebars(void) { + Monitor *m; + XSetWindowAttributes wa = { + .override_redirect = True, + .background_pixmap = ParentRelative, + .event_mask = ButtonPressMask|ExposureMask + }; + for(m = mons; m; m = m->next) { + m->barwin = XCreateWindow(dpy, root, m->wx, m->by, m->ww, bh, 0, DefaultDepth(dpy, screen), + CopyFromParent, DefaultVisual(dpy, screen), + CWOverrideRedirect|CWBackPixmap|CWEventMask, &wa); + XDefineCursor(dpy, m->barwin, cursor[CurNormal]); + XMapRaised(dpy, m->barwin); + } +} + +void +updatebarpos(Monitor *m) { + m->wy = m->my; + m->wh = m->mh; + if(m->showbar) { + m->wh -= bh; + m->by = m->topbar ? m->wy : m->wy + m->wh; + m->wy = m->topbar ? m->wy + bh : m->wy; + } + else + m->by = -bh; +} + +Bool +updategeom(void) { + Bool dirty = False; + +#ifdef XINERAMA + if(XineramaIsActive(dpy)) { + int i, j, n, nn; + Client *c; + Monitor *m; + XineramaScreenInfo *info = XineramaQueryScreens(dpy, &nn); + XineramaScreenInfo *unique = NULL; + + for(n = 0, m = mons; m; m = m->next, n++); + /* only consider unique geometries as separate screens */ + if(!(unique = (XineramaScreenInfo *)malloc(sizeof(XineramaScreenInfo) * nn))) + die("fatal: could not malloc() %u bytes\n", sizeof(XineramaScreenInfo) * nn); + for(i = 0, j = 0; i < nn; i++) + if(isuniquegeom(unique, j, &info[i])) + memcpy(&unique[j++], &info[i], sizeof(XineramaScreenInfo)); + XFree(info); + nn = j; + if(n <= nn) { + for(i = 0; i < (nn - n); i++) { /* new monitors available */ + for(m = mons; m && m->next; m = m->next); + if(m) + m->next = createmon(); + else + mons = createmon(); + } + for(i = 0, m = mons; i < nn && m; m = m->next, i++) + if(i >= n + || (unique[i].x_org != m->mx || unique[i].y_org != m->my + || unique[i].width != m->mw || unique[i].height != m->mh)) + { + dirty = True; + m->num = i; + m->mx = m->wx = unique[i].x_org; + m->my = m->wy = unique[i].y_org; + m->mw = m->ww = unique[i].width; + m->mh = m->wh = unique[i].height; + updatebarpos(m); + } + } + else { /* less monitors available nn < n */ + for(i = nn; i < n; i++) { + for(m = mons; m && m->next; m = m->next); + while(m->clients) { + dirty = True; + c = m->clients; + m->clients = c->next; + detachstack(c); + c->mon = mons; + attach(c); + attachstack(c); + } + if(m == selmon) + selmon = mons; + cleanupmon(m); + } + } + free(unique); + } + else +#endif /* XINERAMA */ + /* default monitor setup */ + { + if(!mons) + mons = createmon(); + if(mons->mw != sw || mons->mh != sh) { + dirty = True; + mons->mw = mons->ww = sw; + mons->mh = mons->wh = sh; + updatebarpos(mons); + } + } + if(dirty) { + selmon = mons; + selmon = wintomon(root); + } + return dirty; +} + +void +updatenumlockmask(void) { + unsigned int i, j; + XModifierKeymap *modmap; + + numlockmask = 0; + modmap = XGetModifierMapping(dpy); + for(i = 0; i < 8; i++) + for(j = 0; j < modmap->max_keypermod; j++) + if(modmap->modifiermap[i * modmap->max_keypermod + j] + == XKeysymToKeycode(dpy, XK_Num_Lock)) + numlockmask = (1 << i); + XFreeModifiermap(modmap); +} + +void +updatesizehints(Client *c) { + long msize; + XSizeHints size; + + if(!XGetWMNormalHints(dpy, c->win, &size, &msize)) + /* size is uninitialized, ensure that size.flags aren't used */ + size.flags = PSize; + if(size.flags & PBaseSize) { + c->basew = size.base_width; + c->baseh = size.base_height; + } + else if(size.flags & PMinSize) { + c->basew = size.min_width; + c->baseh = size.min_height; + } + else + c->basew = c->baseh = 0; + if(size.flags & PResizeInc) { + c->incw = size.width_inc; + c->inch = size.height_inc; + } + else + c->incw = c->inch = 0; + if(size.flags & PMaxSize) { + c->maxw = size.max_width; + c->maxh = size.max_height; + } + else + c->maxw = c->maxh = 0; + if(size.flags & PMinSize) { + c->minw = size.min_width; + c->minh = size.min_height; + } + else if(size.flags & PBaseSize) { + c->minw = size.base_width; + c->minh = size.base_height; + } + else + c->minw = c->minh = 0; + if(size.flags & PAspect) { + c->mina = (float)size.min_aspect.y / size.min_aspect.x; + c->maxa = (float)size.max_aspect.x / size.max_aspect.y; + } + else + c->maxa = c->mina = 0.0; + c->isfixed = (c->maxw && c->minw && c->maxh && c->minh + && c->maxw == c->minw && c->maxh == c->minh); +} + +void +updatetitle(Client *c) { + if(!gettextprop(c->win, netatom[NetWMName], c->name, sizeof c->name)) + gettextprop(c->win, XA_WM_NAME, c->name, sizeof c->name); + if(c->name[0] == '\0') /* hack to mark broken clients */ + strcpy(c->name, broken); +} + +void +updatestatus(void) { + if(!gettextprop(root, XA_WM_NAME, stext, sizeof(stext))) + strcpy(stext, "dwm-"VERSION); + drawbar(selmon); +} + +void +updatewindowtype(Client *c) { + Atom state = getatomprop(c, netatom[NetWMState]); + Atom wtype = getatomprop(c, netatom[NetWMWindowType]); + + if(state == netatom[NetWMFullscreen]) + setfullscreen(c, True); + + if(wtype == netatom[NetWMWindowTypeDialog]) + c->isfloating = True; +} + +void +updatewmhints(Client *c) { + XWMHints *wmh; + + if((wmh = XGetWMHints(dpy, c->win))) { + if(c == selmon->sel && wmh->flags & XUrgencyHint) { + wmh->flags &= ~XUrgencyHint; + XSetWMHints(dpy, c->win, wmh); + } + else + c->isurgent = (wmh->flags & XUrgencyHint) ? True : False; + if(wmh->flags & InputHint) + c->neverfocus = !wmh->input; + else + c->neverfocus = False; + XFree(wmh); + } +} + +void +view(const Arg *arg) { + if((arg->ui & TAGMASK) == selmon->tagset[selmon->seltags]) + return; + selmon->seltags ^= 1; /* toggle sel tagset */ + if(arg->ui & TAGMASK) + selmon->tagset[selmon->seltags] = arg->ui & TAGMASK; + focus(NULL); + arrange(selmon); +} + +Client * +wintoclient(Window w) { + Client *c; + Monitor *m; + + for(m = mons; m; m = m->next) + for(c = m->clients; c; c = c->next) + if(c->win == w) + return c; + return NULL; +} + +Monitor * +wintomon(Window w) { + int x, y; + Client *c; + Monitor *m; + + if(w == root && getrootptr(&x, &y)) + return recttomon(x, y, 1, 1); + for(m = mons; m; m = m->next) + if(w == m->barwin) + return m; + if((c = wintoclient(w))) + return c->mon; + return selmon; +} + +/* There's no way to check accesses to destroyed windows, thus those cases are + * ignored (especially on UnmapNotify's). Other types of errors call Xlibs + * default error handler, which may call exit. */ +int +xerror(Display *dpy, XErrorEvent *ee) { + if(ee->error_code == BadWindow + || (ee->request_code == X_SetInputFocus && ee->error_code == BadMatch) + || (ee->request_code == X_PolyText8 && ee->error_code == BadDrawable) + || (ee->request_code == X_PolyFillRectangle && ee->error_code == BadDrawable) + || (ee->request_code == X_PolySegment && ee->error_code == BadDrawable) + || (ee->request_code == X_ConfigureWindow && ee->error_code == BadMatch) + || (ee->request_code == X_GrabButton && ee->error_code == BadAccess) + || (ee->request_code == X_GrabKey && ee->error_code == BadAccess) + || (ee->request_code == X_CopyArea && ee->error_code == BadDrawable)) + return 0; + fprintf(stderr, "dwm: fatal error: request code=%d, error code=%d\n", + ee->request_code, ee->error_code); + return xerrorxlib(dpy, ee); /* may call exit */ +} + +int +xerrordummy(Display *dpy, XErrorEvent *ee) { + return 0; +} + +/* Startup Error handler to check if another window manager + * is already running. */ +int +xerrorstart(Display *dpy, XErrorEvent *ee) { + die("dwm: another window manager is already running\n"); + return -1; +} + +void +zoom(const Arg *arg) { + Client *c = selmon->sel; + + if(!selmon->lt[selmon->sellt]->arrange + || (selmon->sel && selmon->sel->isfloating)) + return; + if(c == nexttiled(selmon->clients)) + if(!c || !(c = nexttiled(c->next))) + return; + pop(c); +} + +int +main(int argc, char *argv[]) { + if(argc == 2 && !strcmp("-v", argv[1])) + die("dwm-"VERSION", © 2006-2011 dwm engineers, see LICENSE for details\n"); + else if(argc != 1) + die("usage: dwm [-v]\n"); + if(!setlocale(LC_CTYPE, "") || !XSupportsLocale()) + fputs("warning: no locale support\n", stderr); + if(!(dpy = XOpenDisplay(NULL))) + die("dwm: cannot open display\n"); + checkotherwm(); + setup(); + scan(); + run(); + cleanup(); + XCloseDisplay(dpy); + return EXIT_SUCCESS; +} diff --git a/bash/.bashrc b/bash/.bashrc @@ -0,0 +1,273 @@ +# ~/.bashrc: executed by bash(1) for non-login shells. +# see /usr/share/doc/bash/examples/startup-files (in the package bash-doc) +# for examples +[[ $- == *i* ]] || return +case $- in + *i*) ;; + *) return;; +esac + +# Add vim as default editor +export EDITOR=vim +export TERMINAL=urxvt +export BROWSER=firefox +export PROMPT_COMMAND='echo -ne "\033]0;$PWD\007"' + +# don't put duplicate lines or lines starting with space in the history. +# See bash(1) for more options +HISTCONTROL=ignoreboth + +# append to the history file, don't overwrite it +shopt -s histappend + +# for setting history length see HISTSIZE and HISTFILESIZE in bash(1) +HISTSIZE=1000 +HISTFILESIZE=2000 + +# set pager +export PAGER=/usr/bin/most + +# check the window size after each command and, if necessary, +# update the values of LINES and COLUMNS. +shopt -s checkwinsize + +# Gtk themes +export GTK2_RC_FILES="$HOME/.gtkrc-2.0" + +xhost +local:root > /dev/null 2>&1 + +complete -cf sudo +complete -cf man + +# Shopt +shopt -s autocd +shopt -s cdspell +shopt -s cmdhist +shopt -s dotglob +shopt -s expand_aliases +shopt -s extglob +shopt -s hostcomplete +shopt -s nocaseglob + +# Colour chart +#!/bin/bash +# +UPDATES=$(aptitude search "~U" | wc -l) + +echo -e "\033[0;36m" + +echo "" + +echo " ▀▄ ▄▀ " + +echo -e " ▄█▀███▀█▄ \033[1;31m "$UPDATES"\033[0;36m Fucks Given" + +echo " █▀███████▀█" + +echo " ▀ ▀▄▄ ▄▄▀ ▀" + +echo "" + +echo -e "\033[m" +# enable color support of ls and also add handy aliases +if [ -x /usr/bin/dircolors ]; then + test -r ~/.dircolors && eval "$(dircolors -b ~/.dircolors)" || eval "$(dircolors -b)" + alias ls='ls++' + alias dir='dir --color=auto' + alias vdir='vdir --color=auto' + alias vpn='nordvpn connect' + alias work='bash /opt/forticlient-sslvpn/forticlientsslvpn.sh' + alias setup='sh /home/hide4/scripts/./feh.sh' + alias grep='grep --color=auto' + alias fgrep='fgrep --color=auto' + alias egrep='egrep --color=auto' + alias vim='nvim' + alias wallpaper='feh --bg-scale ~/Pictures/smileypurp.ong' +fi + +color_prompt=yes + +# Bash Completion +if [ -f /etc/bash_completion ]; then + . /etc/bash_completion +fi + +# Alias definitions. +if [ -x ~/.bash_aliases ]; then + . ~/.bash_aliases +fi + +# Function definitions. +if [ -x ~/.bash_functions ]; then + . ~/.bash_functions +fi + +# Prompt definitions. +if [ -x ~/.bash_prompt ]; then + . ~/.bash_prompt +fi + +## MISC ALIASES ## +alias ls='ls++' +alias ll='ls -l --group-directories-first --time-style=+"%d.%m.%Y %H:%M" --color=auto -F' +alias la='ls -la --group-directories-first --time-style=+"%d.%m.%Y %H:%M" --color=auto -F' +alias grep='grep --color=tty -d skip' +alias cp="cp -i" # confirm before overwriting something +alias df='df -h' # human-readable sizes +alias free='free -m' # show sizes in MB +alias vp='vim PKGBUILD' + +alias update='sudo apt-get update' +alias install='sudo apt-get install ' +alias uninstall='sudo pacman -Rs' +alias search='pacman -Ss' +alias show='pacman -Si' +alias need='pacman -Qi' +alias missing='pacman -Qk' +alias trash='pacman -Qdt' + +alias youtube-mp3='youtube-dl --extract-audio --audio-format mp3' +alias speedtest='speedtest-cli' + + + +alias wvdial='sudo wvdial' + +# Color man pages +man() { + env \ + LESS_TERMCAP_mb=$(printf "\e[1;31m") \ + LESS_TERMCAP_md=$(printf "\e[1;31m") \ + LESS_TERMCAP_me=$(printf "\e[0m") \ + LESS_TERMCAP_se=$(printf "\e[0m") \ + LESS_TERMCAP_so=$(printf "\e[1;44;33m") \ + LESS_TERMCAP_ue=$(printf "\e[0m") \ + LESS_TERMCAP_us=$(printf "\e[1;32m") \ + man "$@" +} + +## COMPRESSION FUNCTION ## +function compress_() { + # Credit goes to: Daenyth + FILE=$1 + shift + case $FILE in + *.tar.bz2) tar cjf $FILE $* ;; + *.tar.gz) tar czf $FILE $* ;; + *.tgz) tar czf $FILE $* ;; + *.zip) zip $FILE $* ;; + *.rar) rar $FILE $* ;; + *) echo "Filetype not recognized" ;; + esac +} + +## EXTRACT FUNCTION ## +extract () +{ + if [ -f $1 ] ; then + case $1 in + *.tar.bz2) tar xjf $1 ;; + *.tar.gz) tar xzf $1 ;; + *.bz2) bunzip2 $1 ;; + *.rar) unrar x $1 ;; + *.gz) gunzip $1 ;; + *.tar) tar xf $1 ;; + *.tbz2) tar xjf $1 ;; + *.tgz) tar xzf $1 ;; + *.zip) unzip $1 ;; + *.Z) uncompress $1;; + *.7z) 7z x $1 ;; + *) echo "'$1' cannot be extracted via extract()" ;; + esac + else + echo "'$1' is not a valid file" + fi +} + +# test if a file should be opened normally, or as root (edit) +argc () { + count=0; + for arg in "$@"; do + if [[ ! "$arg" =~ '-' ]]; then count=$(($count+1)); fi; + done; + echo $count; +} + +edit () { if [[ `argc "$@"` > 1 ]]; then vim $@; + elif [ $1 = '' ]; then vim; + elif [ ! -f $1 ] || [ -w $1 ]; then vim $@; + else + echo -n "File is Read-only. Edit as root? (Y/n): " + read -n 1 yn; echo; + if [ "$yn" = 'n' ] || [ "$yn" = 'N' ]; + then vim $*; + else sudo vim $*; + fi + fi + } + +# cd and ls in one +cl() { + dir=$1 + if [[ -z "$dir" ]]; then + dir=$HOME + fi + if [[ -d "$dir" ]]; then + cd "$dir" + ls + else + echo "bash: cl: '$dir': Directory not found" + fi +} + +# test encode & decode base64 +decode () { + echo "$1" | base64 -d ; echo +} + +encode () { + echo "$1" | base64 - ; echo +} + +# access translate.google.com from terminal +translate () { + +# adjust to taste +DEFAULT_TARGET_LANG=en + +if [[ $1 = -h || $1 = --help ]] +then + echo "$help" + exit +fi + +if [[ $3 ]]; then + source="$2" + target="$3" +elif [[ $2 ]]; then + source=auto + target="$2" +else + source=auto + target="$DEFAULT_TARGET_LANG" +fi + +echo $i" " $text +result=$(curl -s -i --user-agent "" -d "sl=$source" -d "tl=$target" --data-urlencode "text=$1" http://translate.google.com) +encoding=$(awk '/Content-Type: .* charset=/ {sub(/^.*charset=["'\'']?/,""); sub(/[ "'\''].*$/,""); print}' <<<"$result") +iconv -f $encoding <<<"$result" | awk 'BEGIN {RS="</div>"};/<span[^>]* id=["'\'']?result_box["'\'']?/' | html2text +} + +# prompt +# Needed for git status in the prompt +#source /usr/share/git/git-prompt.sh + + +export PS1='\[\e]0;\w\a\]\[\033[31m\][\[\033[0;92m\]\W\[\033[31m\]]\[\033[0;35m\] \[\033[2;33m\]:\[\033[00m\] ' + +export NVM_DIR="$HOME/.nvm" +[ -s "$NVM_DIR/nvm.sh" ] && \. "$NVM_DIR/nvm.sh" # This loads nvm +[ -s "$NVM_DIR/bash_completion" ] && \. "$NVM_DIR/bash_completion" # This loads nvm bash_completion + +# twilio autocomplete setup +TWILIO_AC_BASH_SETUP_PATH=/home/hide4/.twilio-cli/autocomplete/bash_setup && test -f $TWILIO_AC_BASH_SETUP_PATH && source $TWILIO_AC_BASH_SETUP_PATH; diff --git a/config.h - DWM b/config.h - DWM @@ -1,115 +0,0 @@ -static const char normbordercolor[] = "#777777"; /* color of unselected window's border */ -static const char normbgcolor[] = "#777777"; /* color of unselected workspace bg */ -static const char normfgcolor[] = "#FAFAFA"; /* color of unselected workspace font */ -static const char selbordercolor[] = "#AAAAAA"; /* color of selected window's border */ -static const char selbgcolor[] = "#242424"; /* color of selected worspace bg */ -static const char selfgcolor[] = "#FAFAFA"; /* color of selected workspace font */ -static const unsigned int borderpx = 1; /* border pixel of windows */ -static const unsigned int snap = 1; /* snap pixel */ -static const Bool showbar = True; /* False means no bar */ -static const Bool topbar = True; /* False means bottom bar */ -static const Bool bottombar = True; /*True means an extra bar at the bottom*/ - -//remove the next three lines depending on what patches you have -static const Bool extrabar = True; /*False means no extra bar */ -static const Bool statusmarkup = False; -static const unsigned int gappx = 0; - -/* tagging */ -static const char *tags[] = { "♬", "▲", "▼", "♢", "♤", "Ω", "✝", "∞",}; - -static const Rule rules[] = { - /* class instance title tags mask isfloating monitor */ - - { "URxvt", NULL, NULL, 0, True, -1 }, - { "epiphany", NULL, NULL, 0, True, -1 }, - { "feh", NULL, NULL, 0, True, 1 }, -}; - -/* layout(s) */ -static const float mfact = 0.50; /* factor of master area size [0.05..0.95] */ -static const int nmaster = 1; /* number of clients in master area */ -static const Bool resizehints = False; /* True means respect size hints in tiled resizals */ - -static const Layout layouts[] = { - /* symbol arrange function */ - { "+", tile }, /* first entry is default */ - { "-", NULL }, /* no layout function means floating behavior */ - { "M", monocle }, -}; - -/* key definitions */ -#define MODKEY Mod1Mask -#define TAGKEYS(KEY,TAG) \ - { MODKEY, KEY, view, {.ui = 1 << TAG} }, \ - { MODKEY|ControlMask, KEY, toggleview, {.ui = 1 << TAG} }, \ - { MODKEY|ShiftMask, KEY, tag, {.ui = 1 << TAG} }, \ - { MODKEY|ControlMask|ShiftMask, KEY, toggletag, {.ui = 1 << TAG} }, - -/* helper for spawning shell commands in the pre dwm-5.0 fashion */ -#define SHCMD(cmd) { .v = (const char*[]){ "/bin/sh", "-c", cmd, NULL } } - -/* commands */ -static const char *dmenucmd[] = { "dmenu_run", "-fn", "lemon", "-nb", normbgcolor, "-nf", normfgcolor, "-sb", selbgcolor, "-sf", selfgcolor, NULL }; -static const char *termcmd[] = { "urxvt", NULL }; -static const char *epipbrowse[] = {"epiphany", NULL }; -static const char *thunbrowse[] = {"nautilus", NULL }; -static const char *editbrowse[] = {"gedit", NULL }; - -static Key keys[] = { - /* modifier key function argument */ - { MODKEY, XK_p, spawn, {.v = dmenucmd } }, - { MODKEY, XK_Return, spawn, {.v = termcmd } }, - { MODKEY, XK_b, togglebar, {0} }, - { MODKEY|ShiftMask, XK_b, toggleextrabar, {0} }, - { MODKEY, XK_j, focusstack, {.i = +1 } }, - { MODKEY, XK_k, focusstack, {.i = -1 } }, - { MODKEY, XK_i, incnmaster, {.i = +1 } }, - { MODKEY, XK_d, incnmaster, {.i = -1 } }, - { MODKEY, XK_h, setmfact, {.f = -0.05} }, - { MODKEY, XK_l, setmfact, {.f = +0.05} }, - { MODKEY|ShiftMask, XK_Return, zoom, {0} }, - { MODKEY, XK_Tab, view, {0} }, - { MODKEY|ShiftMask, XK_c, killclient, {0} }, - { MODKEY, XK_t, setlayout, {.v = &layouts[0]} }, - { MODKEY, XK_f, setlayout, {.v = &layouts[1]} }, - { MODKEY, XK_m, setlayout, {.v = &layouts[2]} }, - { MODKEY, XK_space, setlayout, {0} }, - { MODKEY|ShiftMask, XK_space, togglefloating, {0} }, - { MODKEY, XK_0, view, {.ui = ~0 } }, - { MODKEY|ShiftMask, XK_0, tag, {.ui = ~0 } }, - { MODKEY, XK_comma, focusmon, {.i = -1 } }, - { MODKEY, XK_period, focusmon, {.i = +1 } }, - { MODKEY|ShiftMask, XK_comma, tagmon, {.i = -1 } }, - { MODKEY|ShiftMask, XK_period, tagmon, {.i = +1 } }, - { MODKEY|ShiftMask, XK_q, spawn, {.v = epipbrowse } }, - { MODKEY|ShiftMask, XK_w, spawn, {.v = thunbrowse } }, - { MODKEY|ShiftMask, XK_r, spawn, {.v = editbrowse } }, - TAGKEYS( XK_1, 0) - TAGKEYS( XK_2, 1) - TAGKEYS( XK_3, 2) - TAGKEYS( XK_4, 3) - TAGKEYS( XK_5, 4) - TAGKEYS( XK_6, 5) - TAGKEYS( XK_7, 6) - TAGKEYS( XK_8, 7) - TAGKEYS( XK_9, 8) - { MODKEY|ShiftMask, XK_e, quit, {0} }, -}; - -/* button definitions */ -/* click can be ClkLtSymbol, ClkStatusText, ClkWinTitle, ClkClientWin, or ClkRootWin */ -static Button buttons[] = { - /* click event mask button function argument */ - { ClkLtSymbol, 0, Button1, setlayout, {0} }, - { ClkLtSymbol, 0, Button3, setlayout, {.v = &layouts[2]} }, - { ClkWinTitle, 0, Button2, zoom, {0} }, - { ClkStatusText, 0, Button2, spawn, {.v = termcmd } }, - { ClkClientWin, MODKEY, Button1, movemouse, {0} }, - { ClkClientWin, MODKEY, Button2, togglefloating, {0} }, - { ClkClientWin, MODKEY, Button3, resizemouse, {0} }, - { ClkTagBar, 0, Button1, view, {0} }, - { ClkTagBar, 0, Button3, toggleview, {0} }, - { ClkTagBar, MODKEY, Button1, tag, {0} }, - { ClkTagBar, MODKEY, Button3, toggletag, {0} }, -}; diff --git a/irssi/config b/irssi/config @@ -0,0 +1,143 @@ +# ██ ██ +# ░░ ░░ +# ██ ██████ ██████ ██████ ██ +# ░██░░██░░█ ██░░░░ ██░░░░ ░██ +# ░██ ░██ ░ ░░█████ ░░█████ ░██ +# ░██ ░██ ░░░░░██ ░░░░░██░██ +# ░██░███ ██████ ██████ ░██ +# ░░ ░░░ ░░░░░░ ░░░░░░ ░░ +# +# ▓▓▓▓▓▓▓▓▓▓ +# ░▓ author ▓ xero <x@xero.nu> +# ░▓ code ▓ http://code.xero.nu/dotfiles +# ░▓ mirror ▓ http://git.io/.files +# ░▓▓▓▓▓▓▓▓▓▓ +# ░░░░░░░░░░ + +utf8 = "on"; + +servers = ( +# { +# address = "unix.chat"; +# chatnet = "unixchat"; +# port = "6697"; +# use_ssl = "yes"; +# ssl_verify = "no"; +# autoconnect = "yes"; +# }, +# { +# address = "irc.us.ircnet.net"; +# chatnet = "ircnet"; +# autoconnect = "yes"; +# }, +# { +# address = "irc.cyberia.is"; +# chatnet = "cyberia"; +# port = "6697"; +# use_ssl = "yes"; +# autoconnect = "yes"; +# }, +# { +# address = "irc.blackhats.ru"; +# chatnet = "blackhats"; +# port = "6697"; +# use_ssl = "yes"; +# autoconnect = "yes"; +# } + { + address = "irc.freenode.org"; + chatnet = "nixerz"; + port = "6697"; + use_ssl = "yes"; + autoconnect = "yes"; + } + +); + +chatnets = { + unixchat = { type = "IRC"; nick = "underd0g"; }; + ircnet = { type = "IRC"; nick = "underd0g"; }; + efnet = { type = "IRC"; nick = "underd0g"; }; + cyberia = { type = "IRC"; nick = "underd0g"; }; + blackhats = { type = "IRC"; nick = "underd0g"; }; + nixerz = {type = "IRC"; nick = "underd0g";}; +}; + +channels = ( +# { name = "#2f30"; chatnet = "cyberia"; autojoin = "Yes"; }, +# { name = "#ascii"; chatnet = "ircnet"; autojoin = "Yes"; }, +# { name = "#askee"; chatnet = "efnet"; autojoin = "Yes"; }, +# { name = "#cyberia"; chatnet = "cyberia"; autojoin = "Yes"; }, +# { name = "#gentlemanloser"; chatnet = "unixchat"; autojoin = "Yes"; }, +# { name = "#security"; chatnet = "blackhats"; autojoin = "No"; }, +# { name = "#unix"; chatnet = "unixchat"; autojoin = "Yes"; }, +# { name = "#unixporn"; chatnet = "unixchat"; autojoin = "Yes"; }, + { name = "#ubuntu"; chatnet = "nixerz"; autojoin = "Yes"; } +); + +aliases = { + graff = "exec -o graff"; + emote = "exec -o emote"; + ascii = "hello"; + rusto = "exec -o toilet -f rusto --irc"; + rustofat = "exec -o toilet -f rustofat --irc"; + gay = "exec -o toilet -f term --gay --irc"; + toilet = "exec -o toilet"; + ns = "msg nickserv"; + cs = "msg chanserv"; + os = "msg operserv"; + w = "win"; +}; + +settings = { + core = { + real_name = "underd0g"; + user_name = "hide4"; + nick = "underd0g"; + }; + "fe-text" = { + actlist_sort = "refnum"; + term_force_colors = "yes"; + indent = "12"; + paste_verify_line_count = "0"; + }; + "fe-common/core" = { + theme = "weed.theme"; + autolog_path = "~/irc/$tag/$0.log"; + autolog = "yes"; + }; + "irc / core" = { + ctcp_userinfo_reply = "rip"; + ctcp_version_reply = "rip"; + max_ctcp_queue = "0"; + }; +}; +logs = { }; +statusbar = { + default = { + window = { + items = { + barstart = { priority = "100"; }; + user = { }; + window = { }; + window_empty = { }; + lag = { priority = "-1"; }; + act = { priority = "10"; }; + more = { priority = "-1"; alignment = "right"; }; + barend = { priority = "100"; alignment = "right"; }; + }; + }; + }; +}; + +ignores = ( + { level = "JOINS PARTS QUITS"; channels = ( "#2f30" ); }, + { level = "JOINS PARTS QUITS"; channels = ( "#ascii" ); }, + { level = "JOINS PARTS QUITS"; channels = ( "#askee" ); }, + { level = "JOINS PARTS QUITS"; channels = ( "#cyberia" ); }, + { level = "JOINS PARTS QUITS"; channels = ( "#gentlemanloster" ); }, + { level = "JOINS PARTS QUITS"; channels = ( "#security" ); }, + { level = "JOINS PARTS QUITS"; channels = ( "#unixporn" ); }, + { mask = "DCC"; level = "ALL"; }, + { mask = "CTCPS"; level = "ALL"; } +); diff --git a/irssi/fro.theme b/irssi/fro.theme @@ -0,0 +1,209 @@ +# +# +default_color = "-1"; + +info_eol = "false"; + +replaces = { "[]" = "%K$*%n"; }; + +abstracts = { + + indent_default = ""; + + line_start = ""; + + timestamp = ""; + + hilight = "%_$*%_"; + + error = "%R$*%n"; + + channel = "%K$*%n"; + + nick = "%_$*%_"; + + nickhost = "%g$*"; + + server = "%_$*%_"; + + comment = "%n(%K$*%n)"; + + reason = "{comment $*}"; + + mode = "{comment $*}"; + + channick_hilight = "%g$*%N"; + chanhost_hilight = "{nickhost $*}"; + + channick = "$*"; + chanhost = "{nickhost $*}"; + + channelhilight = "%g$*%n"; + + ban = "$*"; + + #msgnick = "%K%N$1 %K %|%N"; + msgnick = "%K<$0%w$1-%K>%n %|"; + #ownmsgnick = "{msgnick $0 $1}"; + #ownmsgnick = "{msgnick $0 $1-}"; + ownnick = "%W$*%n"; + #ownnick = "%K<$*%K>%n"; + + #pubmsgnick = "{msgnick $0 $1}"; + #pubmsgnick = "{msgnick $0 $1-}"; + pubnick = "%N$*%n"; + + #pubmsghinick = "{msgnick $0 $1}%r"; + #menick = "%R$*%n"; + + #msgchannel = "%m$*%n"; + #privmsg = "$0=%b\"$1-\"%n "; + + #ownprivmsg = "$0=%b\"$1-\"%n "; + + #privmsgnick = " %g<%N "; + + #ownprivmsgnick = " %r>%N "; + + action_core = "%c—%C—%K┄%K %n$*"; + + #action = "{action_core $*} "; + + #ownaction = "{action %p$*}"; + + #ownaction_target = "{action_core $0}%Y:%c$1%n "; + + #pvtaction = "%y (*) $*%n "; + #pvtaction_query = "{action $* }"; + + #pubaction = "{action $*}"; + + whois = "%K │ %n$1-"; + + ownnotice = "%NNote n = %Mnew%n $0 ($1-) "; + notice = "%M$*%n "; + pubnotice_channel = " %N($*)"; + pvtnotice_host = " %N($*)"; + servernotice = " %N($*)"; + + ownctcp = "%N$0 (%K$1-%N) "; + ctcp = "%N$*%n"; + + wallop = "%K$*%n: "; + wallop_nick = "%n$*"; + wallop_action = "%K * $*%n "; + + #netsplit = "%K$*%n"; + #netjoin = "%K$*%n"; + + names_users = "%c┌%C—%K┄ %nusers in $1"; + names_nick = "$2$0%n$1 "; + names_nick_op = "{names_nick $* %K}"; + names_nick_halfop = "{names_nick $* %K}"; + names_nick_voice = "{names_nick $* %K}"; + names_prefix = "%c│ %n$1"; + names_channel = "%W$*%n"; + + dcc = "%g$*%n"; + dccfile = "%_$*%_"; + + dccownmsg = "%g /* $0 ($1-) */"; + dccownnick = "$*%n"; + dccownquerynick = "$*%n"; + dccownaction = "{action $*}"; + dccownaction_target = "{action $*}"; + + dccmsg = "%g/* $1- ($0) */"; + dccquerynick = "%g$*%n"; + dccaction = "{action $*}"; + + sb_background = "%N%N"; + + sb_prompt_bg = "%n"; + + sbstart = "%c┌%C—%K┄ "; + sbend = ""; + + topicsbstart = "%BChannel: %b\"$*"; + topicsbend = "$*%b\""; + + prompt = "%c└%C—%K┄ %n"; + #prompt = "%c│%n "; + + sb = "%N$*%N "; + #sb = ""; + sbmode = "%c(%K+%N$*%c)%n"; + sbaway = "%c(%Naway%c)%N"; + sbservertag = "%c:%N$0%c(%N^X%c)"; + #sbservertag = ""; + sbnickmode = "%K$0%N$1"; + + #sb_usercount = "{sb %_$0%_ nicks ($1-)}"; + #sb_uc_ircops = "%_*%_$*"; + #sb_uc_ops = "%_@%r$*%n"; + #sb_uc_halfops = "%_%%%g$*%n"; + #sb_uc_voices = "%_+%y$*%n"; + #sb_uc_normal = "%w$*%n"; + #sb_uc_space = " "; + + #sb_act_sep = "%c$*"; + #sb_act_text = "%N$*"; + #sb_act_msg = "%c$*"; + #sb_act_hilight = "%R%9$*%n"; + #sb_act_hilight_color = "%R%9$1-%n"; +}; + +formats = { + "fe-common/core" = { + #line_start = "{line_start}"; + line_start_irssi = "{line_start}"; + + join = "%c—%C—%K┄%K %n{channick $0} %K(%n{nickhost %w$1}%K)%n joined %K$2"; + part = "%c—%C—%K┄%K %n{channick $0} %K(%n{nickhost %w$1}%K)%n left %K$2 {reason %C$3}"; + quit = "%c—%C—%K┄%K %nsignoff%K: %n{channick $0}%K {reason %C$2}"; + kick = "%c—%C—%K┄%K %n{channick $0} was kicked by $2 %K{reason %C$3}"; + nick_changed = "%c—%C—%K┄%K %n{channick $0} %Kis now known as %W{channick $1}"; + your_nick_changed = "%c—%C—%K┄%K %nyou %Kare now known as %W{channick $1}"; + #pubmsg = "{pubmsgnick $2 {pubnick \00312$[-9]0}}$1"; + #own_msg = "{ownmsgnick $2 {ownnick $[-9]0}}$1"; + #own_msg_channel = "{ownmsgnick $3 {ownnick $[-9]0}{msgchannel $1}}$2"; + #own_msg_private_query = "{ownprivmsgnick {ownprivnick $[-11]2}}$1"; + #pubmsg_me = "{pubmsghinick $2 {menick $[-9]0}}$1"; + #pubmsg_me_channel = "{pubmsghinick $3 {menick $[-9]0}{msgchannel $1}}$2"; + #pubmsg_hilight = "{pubmsghinick $3 {menick $[-9]1}}$2"; + #pubmsg_hilight_channel = "{pubmsghinick $0 $[-9]1$4{msgchannel $2}}$3"; + #pubmsg_channel = "{pubmsgnick {pubnick %G$[-9]0}$2}$1"; + #msg_private_query = "{privmsgnick $[-9]0}$2"; + new_topic = "%c—%C—%K┄ %wtopic %K'%W$2%K' %Nset by $0"; + endofnames = "%c└%C—%K┄ %wtotal: {hilight $2} ops, {hilight $3} halfops, {hilight $4} voices, {hilight $5} normal%n"; + #pubmsg = "{pubmsgnick $2 {pubnick \00304$[-9]0}}$1"; + }; + "fe-common/irc" = { + chanmode_change = "%c—%C—%K┄%n mode %K(%W{channick $1}%K) %nby %W$2"; + server_chanmode_change = "%c—%C—%K┄%K%n {channick $1} %n(%K$2%n)"; + whois = "%c┌%C—%K┄ %n\012%c│ %Ku%Cser %n$0 %K(%n$1%c@%n$2%K) %n\012%c│ %Kn%Came %n$3%n"; + whois_idle = "%c│ %Ki%Cdle%n %|$1d $2h $3m $4s"; + whois_idle_signon = "%c│ %Ki%Cdle%n %|$1d $2h $3m $4s {comment signon: $5}"; + whois_server = "%c│ %Ks%Cerv%n %|$1 {comment $2}"; + whois_oper = "%c│ %Ko%Cper%n {hilight $1}"; + whois_registered = "%c│ %Kr%Cgis%n yes"; + whois_help = "%c│ %Kh%Celp%n available for help"; + whois_modes = "%c│ %Km%Code%n $1"; + whois_realhost = "%c│ %Kr%Ceal%n $1-"; + whois_usermode = "%c│ %Ku%Cmod%n $1"; + whois_channels = "%c│ %Kc%Chan%n %|$1"; + whois_away = "%c│ %Ka%Cway%n %|$1"; + whois_special = "%c│ %Ki%Cnfo%n {comment %|$1}"; + whois_extra = "%c│ %Ke%Cxtr%n %|$1"; + end_of_whois = "%c└%C—%K┄ "; + whois_not_found = "%c—%C—%K┄ there is no such nick $0"; + topic = "%c—%C—%K┄ %Ntopic for %K$0 %W$1"; + topic_info = "%c—%C—%K┄ %Nset by $0 %N(%K$1%N)"; + #own_action = "{ownaction $[-9]0} $1"; + #action_private = "{pvtaction $[-9]0}$1"; + #action_private_query = "{pvtaction_query $[-9]0} $2"; + #action_public = "{pubaction $[-9]0}$1"; + channel_synced = "%c—%C—%K┄ %nsynced in {hilight $1} secs"; + channel_created = "%c—%C—%K┄ %ncreated $1"; + }; +}; diff --git a/irssi/neongold.theme b/irssi/neongold.theme @@ -0,0 +1,206 @@ +# +# ███████ █████ ██████ ███████ +# ░░██░░░██ ██░░░██ ██░░░░██░░██░░░██ +# ░██ ░██░███████░██ ░██ ░██ ░██ +# ░██ ░██░██░░░░ ░██ ░██ ░██ ░██ +# ███ ░██░░██████░░██████ ███ ░██ +# ░░░ ░░ ░░░░░░ ░░░░░░ ░░░ ░░ +# +# ██ ██ +# ░██ ░██ +# █████ ██████ ░██ ░██ +# ██░░░██ ██░░░░██ ░██ ██████ +# ░██ ░██░██ ░██ ░██ ██░░░██ +# ░░██████░██ ░██ ░██░██ ░██ +# ░░░░░██░░██████ ███░░██████ +# █████ ░░░░░░ ░░░ ░░░░░░ +# ░░░░░ +# +# ▓▓▓▓▓▓▓▓▓▓ +# ░▓ author ▓ xero <x@xero.nu> +# ░▓ code ▓ http://code.xero.nu/dotfiles +# ░▓ mirror ▓ http://git.io/.files +# ░▓▓▓▓▓▓▓▓▓▓ +# ░░░░░░░░░░ +# +default_color = "-1"; + +info_eol = "false"; + +replaces = { "[]" = "%w$*%n"; }; + +abstracts = { + + indent_default = " + %Y│%n "; + line_start = ""; + timestamp = ""; + hilight = "%_$*%_"; + error = "%r$*%n"; + channel = "%w$*%n"; + nick = "%_$*%_"; + nickhost = "%g$*"; + server = "%_$*%_"; + comment = "%n(%w$*%n)"; + reason = "{comment $*}"; + mode = "{comment $*}"; + + channick_hilight = "%g$*%N"; + chanhost_hilight = "{nickhost $*}"; + + channick = "$*"; + chanhost = "{nickhost $*}"; + + channelhilight = "%g$*%n"; + + ban = "$*"; + + msgnick = "%Y$0%w$1 %Y│ %N"; + ownmsgnick = "%Y$0%w$1 %Y│ "; + ownnick = "%W$*%n"; + pubnick = "%N$*%n"; + menick = "%y$*%y"; + + # generic one that's used by most actions + action = "%b$* %Y│%b"; + + # own action, both private/public + ownaction = "%b$* %Y│%b"; + + # own action with target, both private/public + ownaction_target = "{action $*}"; + + # private action sent by others + pvtaction = "{action $*}"; + pvtaction_query = "{action $*}"; + + # public action sent by others + pubaction = "{action $*}"; + + whois = "%w │ %n$1-"; + + ownnotice = "%NNote n = %Mnew%n $0 ($1-) "; + notice = "%M$*%n "; + pubnotice_channel = " %N($*)"; + pvtnotice_host = " %N($*)"; + servernotice = " %N($*)"; + + ownctcp = "%N$0 (%w$1-%N) "; + ctcp = "%N$*%n"; + + wallop = "%w$*%n: "; + wallop_nick = "%n$*"; + wallop_action = "%w * $*%n "; + + #netsplit = "%w$*%n"; + #netjoin = "%w$*%n"; + + names_users = "%Y┌─┄┄─┄┄──┘ %nusers in %b$1"; + names_nick = "$2$0%n$1 "; + names_nick_op = "{names_nick $* %w}"; + names_nick_halfop = "{names_nick $* %w}"; + names_nick_voice = "{names_nick $* %w}"; + names_prefix = "%Y│ %n$1"; + names_channel = "%W$*%n"; + + dcc = "%g$*%n"; + dccfile = "%_$*%_"; + + dccownmsg = "%g /* $0 ($1-) */"; + dccownnick = "$*%n"; + dccownquerynick = "$*%n"; + dccownaction = "{action $*}"; + dccownaction_target = "{action $*}"; + + dccmsg = "%g/* $1- ($0) */"; + dccquerynick = "%g$*%n"; + dccaction = "{action $*}"; + + sb_background = "%N%N"; + + sb_prompt_bg = "%n"; + + sbstart = " %Y┌─┄┄─────┘ %w"; + sbend = ""; + + topicsbstart = "%w$C %Y┄─┄$*"; + topicsbend = "$*"; + + prompt = " %Y└──┄┄%n "; + + sb = "%N$*%N "; + #sb = ""; + sbmode = "%b(%w+%N$*%b)%n"; + sbaway = "%b(%Naway%b)%N"; + sbservertag = "%b:%N$0%b(%N^X%b)"; + #sbservertag = ""; + sbnickmode = "%w$0%N$1"; + + #sb_usercount = "{sb %_$0%_ nicks ($1-)}"; + #sb_uc_ircops = "%_*%_$*"; + #sb_uc_ops = "%_@%r$*%n"; + #sb_uc_halfops = "%_%%%g$*%n"; + #sb_uc_voices = "%_+%y$*%n"; + #sb_uc_normal = "%w$*%n"; + #sb_uc_space = " "; + + #sb_act_sep = "%b$*"; + #sb_act_text = "%N$*"; + #sb_act_msg = "%b$*"; + #sb_act_hilight = "%R%9$*%n"; + #sb_act_hilight_color = "%R%9$1-%n"; +}; + +formats = { + "fe-common/core" = { + #line_start = "{line_start}"; + line_start_irssi = "{line_start}"; + join = "%n join %Y┄┄─┤ %n{channick $0} %w(%n{nickhost %w$1}%w)%n joined %w$2"; + part = "%n part %Y┄┄─┤ %n{channick $0} %w(%n{nickhost %w$1}%w)%n left %w$2 {reason %b$3}"; + quit = "%n quit %Y┄┄─┤ %nsignoff%w: %n{channick $0}%w {reason %b$2}"; + kick = "%r kick %Y┄┄─┤ %n{channick $0} was kicked by $2 %w{reason %b$3}"; + nick_changed = " %Y┄┼┄%w %n{channick $0} %Y>> %W{channick $1}"; + your_nick_changed = " %Y┄┼┄%w %n{channick $0} %Y>> %W{channick $1}"; + new_topic = "%Y┌─┄┄─────┘%n\012%Y│ %wtopic %b'$2' %Nset by%b $0\012%Y└─┄┄─┄┄──┐ "; + endofnames = "%Y└─┄┄─┄┄──┐ %btotal: {hilight $2} ops, {hilight $3} halfops, {hilight $4} voices, {hilight $5} normies%n"; + #nick padding + pubmsg = "{pubmsgnick $2 {pubnick \00312$[-7]0}}$1"; + own_msg = "{ownmsgnick $2 {ownnick $[-7]0}}$1"; + own_msg_channel = "{ownmsgnick $3 {ownnick $[-7]0}{msgchannel $1}}$2"; + own_msg_private_query = "{ownprivmsgnick {ownprivnick $[-7]2}}$1"; + pubmsg_me = "{pubmsghinick $[-7]0 {menick $2}}%y$1"; + pubmsg_me_channel = "{pubmsghinick $3 {menick $[-7]0}{msgchannel $1}}$2"; + pubmsg_hilight_channel = "{pubmsghinick $0 $[-7]1$4{msgchannel $2}}$3"; + pubmsg_hilight = "{pubmsghinick $3 {menick $[-7]1}}$2"; + pubmsg_channel = "{pubmsgnick {pubnick %G$[-7]0}$2}$1"; + msg_private_query = "{privmsgnick $[-7]0}$2"; + }; + "fe-common/irc" = { + chanmode_change = "%n mode %Y┄┄─┤ %w(%B{channick $1}%w) %nby %B$2"; + server_chanmode_change = "%n mode %Y┄┄─┤ %w{channick $1} %n(%w$2%n)"; + whois = "%Y┌─┄┄ %n\012%Y│ %wuser %b$0 %w(%n$1%b@%n$2%w) %n\012%Y│ %wname %n$3%n"; + whois_idle = "%Y│ %widle%b %|$1d $2h $3m $4s"; + whois_idle_signon = "%Y│ %widle%b %|$1d $2h $3m $4s {comment signon: $5}"; + whois_server = "%Y│ %wserv%b %|$1 {comment $2}"; + whois_oper = "%Y│ %woper%b {hilight $1}"; + whois_registered = "%Y│ %wrgis%n yes"; + whois_help = "%Y│ %whelp%b available for help"; + whois_modes = "%Y│ %wmode%b $1"; + whois_realhost = "%Y│ %wreal%b $1-"; + whois_usermode = "%Y│ %wumod%b $1"; + whois_channels = "%Y│ %wchan%b %|$1"; + whois_away = "%Y│ %waway%b %|$1"; + whois_special = "%Y│ %winfo%b {comment %|$1}"; + whois_extra = "%Y│ %wextr%b %|$1"; + end_of_whois = "%Y└─┄┄ "; + whois_not_found = "%Y──┄┄ %wthere is no such nick %b$0"; + topic = "%ntopic %Y┄┄─┤ %B$0 %b$1"; + topic_info = " %Y┄┄─┤ %wset by %b$0 %B(%w$1%B)"; + channel_synced = "%n sync %Y┄┄─┤ %nin {hilight $1} secs"; + channel_created = "%n %Y┄┄─┤ %ncreated $1"; + action_core = "%b$[-8]0 %Y│ %b$1"; + own_action = "{ownaction $[-8]0} $1"; + action_private = "{pvtaction $[-8]0}$1"; + action_private_query = "{pvtaction_query $[-8} $2"; + action_public = "{pubaction $[-8]0}$1"; + }; +}; diff --git a/irssi/nixers.theme b/irssi/nixers.theme @@ -0,0 +1,304 @@ +# ██ ██ +# ░░ ░░ +# ██ ██████ ██████ ██████ ██ +# ░██░░██░░█ ██░░░░ ██░░░░ ░██ +# ░██ ░██ ░ ░░█████ ░░█████ ░██ +# ░██ ░██ ░░░░░██ ░░░░░██░██ +# ░██░███ ██████ ██████ ░██ +# ░░ ░░░ ░░░░░░ ░░░░░░ ░░ +# +# ▓▓▓▓▓▓▓▓▓▓ +# ░▓ author ▓ xero <x@xero.nu> +# ░▓ code ▓ http://code.xero.nu/dotfiles +# ░▓ mirror ▓ http://git.io/.files +# ░▓▓▓▓▓▓▓▓▓▓ +# ░░░░░░░░░░ +# +# default foreground color (%N) - -1 is the "default terminal color" +default_color = "-1"; + +# print timestamp/servertag at the end of line, not at beginning +info_eol = "false"; + +# these characters are automatically replaced with specified color +# (dark grey by default) +replaces = { "[]" = "%b$*%n"; }; + +abstracts = { + + ############# generic ############################### + + indent_default = " + "; + + # text to insert at the beginning of each non-message line + # line_start = "%g//%n "; + line_start = ""; + + # timestamp styling, nothing by default + timestamp = "%Z5F5F5F$0-%n"; + + # any kind of text that needs hilighting, default is to bold + hilight = "%_$*%_"; + + # any kind of error message, default is bright red + error = "%R$*%n"; + + # channel name is printed + channel = "%b$*%n"; + + # nick is printed + nick = "%_$*%_"; + + # nick host is printed + nickhost = "%g$*"; + + # server name is printed + server = "%_$*%_"; + + # some kind of comment is printed + comment = "%n(%b$*%n);"; + + # reason for something is printed (part, quit, kick, ..) + reason = "{comment $*}"; + + # mode change is printed ([+o nick]) + mode = "{comment $*}"; + + ## channel specific messages + + # highlighted nick/host is printed (joins) + channick_hilight = "%g$*%N"; + chanhost_hilight = "{nickhost $*}"; + + # nick/host is printed (parts, quits, etc.) + channick = "$*"; + chanhost = "{nickhost $*}"; + + # highlighted channel name is printed + channelhilight = "%g$*%n"; + + # ban/ban exception/invite list mask is printed + ban = "$*"; + + action_core = "%Z5F5F5F─┄┄ %n$*"; + + ########### messages ################################# + + # the basic styling of how to print message, $0 = nick mode, $1 = nick + msgnick = "%Z5F5F5F$0%N $1 │ %|%N"; + + # $0 = nick mode, $1 = nick + ownmsgnick = "{msgnick $0 $1}"; + ownnick = "%Z6A8C8C$*%n"; + + # public message in channel, $0 = nick mode, $1 = nick + pubmsgnick = "{msgnick $0 $1}"; + pubnick = "%N$*%n"; + + # public highlighted message in channel + pubmsghinick = "{msgnick $0 $1}%y"; + menick = "%y$*%n"; + + # channel name is printed with message + msgchannel = "%Z5F5F5F:%m$*%n"; + + # private message, $0 = nick, $1 = host + privmsg = "$0=%b\"$1-\"%n "; + + # private message from you, $0 = "msg", $1 = target nick + ownprivmsg = "$0=%b\"$1-\"%n "; + + # private message in query + privmsgnick = "%g<%N %|"; + + # own private message in query + ownprivmsgnick = "%r>%N %|"; + + + ########## Actions (/ME stuff) ######################### + + # generic one that's used by most actions + action = " %m$* %M* %m%|"; + + # own action, both private/public + ownaction = " %m$* %M*%N%m"; + + # own action with target, both private/public + ownaction_target = "{action $*}"; + + # private action sent by others + pvtaction = "{action $*}"; + pvtaction_query = "{action $*}"; + + # public action sent by others + pubaction = "{action $*}"; + + + ########## other IRC events ############################# + + # whois + whois = "%# $[8]0 = $1-;"; + + # notices + ownnotice = "%NNote n = %Mnew%n $0 ($1-) "; + notice = "%M$*%n "; + pubnotice_channel = " %N($*)"; + pvtnotice_host = " %N($*)"; + servernotice = " %N($*)"; + + # CTCPs + ownctcp = "%NCTCP c = %Mnew%n $0 ($1-) "; + ctcp = "%N$*%n"; + + # wallops + wallop = "%Z5F5F5F$*%n: "; + wallop_nick = "%n$*"; + wallop_action = "%Z5F5F5F * $*%n "; + + # netsplits + netsplit = " %Z5F5F5Fnsplit %R< %b\"$*\"%n"; + netjoin = " %Z5F5F5Fnjoin %G> %b\"$*\"%n"; + + # /names list + #names_prefix = "%Z5F5F5F░▒▓ "; + names_users = "%Z5F5F5F┌┄┄ users in $1 "; + names_nick = "%_$2$0%_%n$1- "; + names_nick_op = "{names_nick $* %R}"; + names_nick_halfop = "{names_nick $* %C}"; + names_nick_voice = "{names_nick $* %Z5F5F5F}"; + #names_users = "%Z5F5F5F░▒▓ %n$1"; + names_prefix = "%Z5F5F5F│ %n$1"; + names_channel = "%b$*%n"; + + # DCC + dcc = "%g$*%n"; + dccfile = "%_$*%_"; + + # DCC chat, own msg/action + dccownmsg = "%g /* $0 ($1-) */"; + dccownnick = "$*%n"; + dccownquerynick = "$*%n"; + dccownaction = "{action $*}"; + dccownaction_target = "{action $*}"; + + # DCC chat, others + dccmsg = "%g/* $1- ($0) */"; + dccquerynick = "%g$*%n"; + dccaction = "{action $*}"; + + ######## statusbar/topicbar ############################ + + # default background for all statusbars. You can also give + # the default foreground color for statusbar items. + sb_background = "%z303030"; + + # background for prompt / input line + sb_prompt_bg = "%n"; + + # text at the beginning of statusbars. + sbstart = "%k▓▒░ "; + # text at the end of statusbars. + sbend = "%k░▒▓"; + + topicsbstart = "%k▓▒░$*"; + topicsbend = "$*%b%k░▒▓"; + + prompt = " %y$* »%n "; + + sb = " $* "; + sbmode = " %Z5F5F5F░ %g%g+%n$* %Z5F5F5F░"; + sbaway = " %g/* zZzZ */%n"; + sbservertag = ":%g$0%n"; + sbnickmode = "$0"; + + # Usercount + sb_usercount = "{sb %_$0%_ nicks ($1-)}"; + sb_uc_ircops = "%_*%_$*"; + sb_uc_ops = "%_@%r$*%n"; + sb_uc_halfops = "%_%%%g$*%n"; + sb_uc_voices = "%_+%y$*%n"; + sb_uc_normal = "%w$*%n"; + sb_uc_space = " "; + # activity in statusbar + + # ',' separator + sb_act_sep = " "; + # normal text + sb_act_text = "%Z5F5F5F%9$*%n"; + # public message + sb_act_msg = "%Y%9$*%n"; + # hilight + sb_act_hilight = "%R%9$*%n"; + # hilight with specified color, $0 = color, $1 = text + sb_act_hilight_color = "%R%9$1-%n"; +}; + +######################################################## + +formats = { + "fe-common/core" = { + line_start = "{line_start}"; + line_start_irssi = "{line_start}"; + + join = "%G>%Z5F5F5F> join %g>%n {channick $0} %Z303030({nickhost %Z5F5F5F$1}%Z303030)%n"; + part = "%R<%Z5F5F5F< part %r<%n {channick $0} %Z303030({nickhost %Z5F5F5F$1}%Z303030)%n"; + kick = "%R<%Z5F5F5F< kicked %r<%n {channick $0} %Z303030({nickhost %Z5F5F5F$1}%Z303030)%n"; + quit = "%R<%Z5F5F5F< quit %r<%n {channick $0} %Z303030({nickhost %Z5F5F5F$1}%Z303030)%n"; + quit_once = "{channel $3} {channick $0} {chanhost $1} %kquit {reason %C$2}"; + + nick_changed = "%Z5F5F5F{channick $[-13]0} %G>%n {channick $1}"; + your_nick_changed = "%Z5F5F5F you %G>%n {channick $1}"; + + pubmsg = "{pubmsgnick $2 {pubnick \00313$[-11]0}}$1"; + + own_msg = "{ownmsgnick $2 {ownnick $[-11]0}}$1"; + own_msg_channel = "{ownmsgnick $3 {ownnick $[-11]0}{msgchannel $1}}$2"; + own_msg_private_query = "{ownprivmsgnick {ownprivnick $[-11]2}}$1"; + + pubmsg_me = "{pubmsghinick $2 {menick $[-11]0}}$1"; + pubmsg_me_channel = "{pubmsghinick $3 {menick $[-11]0}{msgchannel $1}}$2"; + + pubmsg_hilight = "{pubmsghinick $3 {menick $[-11]1}}$2"; + pubmsg_hilight_channel = "{pubmsghinick $0 $[-11]1$4{msgchannel $2}}$3"; + + pubmsg_channel = "{pubmsgnick {pubnick %G$[-11]0}$2}$1"; + msg_private_query = "{privmsgnick $[-11]0}$2"; + new_topic = " %ctopic %Z5F5F5F= %|%B'$2' %non %b$1%n%Z5F5F5F[set by {nick %y$0}]"; + + #endofnames = "%Z5F5F5F░▒▓ %mtotal: {hilight $2} ops, {hilight $3} halfops, {hilight $4} voices, {hilight $5} normal%n"; + endofnames = "%Z5F5F5F└┄┄ %mtotal: {hilight $2} ops, {hilight $3} halfops, {hilight $4} voices, {hilight $5} normal%n"; + }; + "fe-common/irc" = { + chanmode_change = "%Z5F5F5F─┄┄ %n mode %y!%n {channick $1}"; + server_chanmode_change = "%Z5F5F5F─┄┄ %n mode %y!%n {channick $1}"; + + whois = "%Z5F5F5F┌┄┄ %n\012%c%Z5F5F5F│ user %n$0 (%n$1%c@%n$2) %n\012%c%Z5F5F5F│ name %n$3%n"; + whois_idle = "%Z5F5F5F│ idle%n %│$1d $2h $3m $4s"; + whois_idle_signon = "%Z5F5F5F│ idle%n %|$1d $2h $3m $4s {comment signon: $5}"; + whois_server = "%Z5F5F5F│ serv%n %|$1 {comment $2}"; + whois_oper = "%Z5F5F5F│ oper%n {hilight $1}"; + whois_registered = "%Z5F5F5F│ rgis%n yes"; + whois_help = "%Z5F5F5F│ help%n available for help"; + whois_modes = "%Z5F5F5F│ mode%n $1"; + whois_realhost = "%Z5F5F5F│ real%n $1-"; + whois_usermode = "%Z5F5F5F│ umod%n $1"; + whois_channels = "%Z5F5F5F│ chan%n %|$1"; + whois_away = "%Z5F5F5F│ away%n %|$1"; + whois_special = "%Z5F5F5F│ info%n {comment %|$1}"; + whois_extra = "%Z5F5F5F│ extr%n %|$1"; + end_of_whois = "%Z5F5F5F└┄┄ "; + whois_not_found = "%Z5F5F5F─┄┄ %nthere is no such nick $0"; + + own_action = "{ownaction $[-11]0} $1"; + action_private = "{pvtaction $[-11]0}$1"; + action_private_query = "{pvtaction_query $[-11]0} $2"; + action_public = "{pubaction $[-11]0}$1"; + }; + "Irssi::Script::ichat" = { + ichat_timestamp = "%Y>%Z5F5F5F> $1 %y>%n"; + }; +}; +settings = { + core = { real_name = "Unknown"; user_name = "xero"; nick = "xero"; }; + "fe-text" = { actlist_sort = "refnum"; }; +}; diff --git a/urxvt/.Xresources b/urxvt/.Xresources @@ -0,0 +1,74 @@ +!nixio by eti @rizon +URxvt.font:xft:minecraftia:pixelsize=14 +URxvt.boldfont:xft:minecraftia-Bold:pixelsize=15 +*.URxvt.scrollBar: false +URxvt.borderColor: #000000 +URxvt*cursorColor: #FFA500 + +! ██████ ██████ ██ ██ ██████ █████ █████ ██████ █████ ██████ +! ██░░░░ ██░░░░██░██ ░██░░██░░████░░░██ ██░░░██░░██░░████░░░██░░██░░██ +! ░░█████ ░██ ░██░██ ░██ ░██ ░░░██ ░░ ░███████ ░██ ░░░███████ ░██ ░░ +! ░░░░░██░██ ░██░██ ░██ ░██ ░██ ██░██░░░░ ░██ ░██░░░░ ░██ +! ██████ ░░██████ ░░██████░███ ░░█████ ░░██████░███ ░░██████░███ +! ░░░░░░ ░░░░░░ ░░░░░░ ░░░ ░░░░░ ░░░░░░ ░░░ ░░░░░░ ░░░ +! r e a d c o d e l i k e a w i z a r d +! +! sourcerer by xero harrison (http://xero.nu) +! ├─ based on sorcerer by Jeet Sukumaran (http://jeetworks.org) +! └─ based on mustang by Henrique C. Alves (hcarvalhoalves@gmail.com) + +! █▓▒░ scorcerer colors +*.foreground: #665c64 +*.background: #121212 + +! black +*.color0: #2b3135 +*.color8: #4c5356 + +! red +*.color1: #8fa1b3 +*.color9: #8fa1b3 + +! green +*.color2: #EC1850 +*.color10: #EC1850 + +! yellow +*.color3: #4f5b66 +*.color11: #4f5b66 + +! blue +*.color4: #607a86 +*.color12: #607a86 + +! magenta +*.color5: #80757e +*.color13: #80757e + +! cyan +*.color6: #B19CD9 +*.color14: #B19CD9 + +! white +*.color7: #deded6 +*.color15: #deded6 + +URxvt.perl-lib: /home/scp1/dev/urxvt-extensions +URxvt.perl-ext-common: default,clipboard,url-select,keyboard-select,bell-command,matcher +URxvt.keysym.C-u: perl:url-select:select_next +URxvt.perl-ext: selection,mark-yank-urls +URxvt.url-select.launcher: /usr/lib/firefox/firefox +URxvt.urlLauncher: /usr/lib/firefox/firefox +URxvt.url-select.underline: false +URxvt.keysym.C-Up: perl:keyboard-select:activate +URxvt.keysym.M-s: perl:keyboard-select:search +URxvt*urgentOnBell: yes + + +URxvt.matcher.rend.0: Italic fg5 + +rofi.color-enabled: true +rofi.color-window: #393939, #393939, #268bd2 +rofi.color-normal: #393939, #ffffff, #393939, #268bd2, #ffffff +rofi.color-active: #393939, #268bd2, #393939, #268bd2, #205171 +rofi.color-urgent: #393939, #f3843d, #393939, #268bd2, #ffc39c diff --git a/weechat.conf b/weechat/weechat.conf