From: Mart Lubbers Date: Wed, 3 Jul 2024 07:20:08 +0000 (+0200) Subject: Merge branch 'master' of git.martlubbers.net:dotfiles X-Git-Url: https://git.martlubbers.net/?a=commitdiff_plain;h=4aa1d562040dbbb81c28348168e96273b088efb2;hp=44bb1a7b5c4a8c21c37181a3f2f945fc94f48ec8;p=dotfiles.git Merge branch 'master' of git.martlubbers.net:dotfiles --- diff --git a/.gitmodules b/.gitmodules index 2ddb6ba..2cd986f 100644 --- a/.gitmodules +++ b/.gitmodules @@ -13,9 +13,6 @@ [submodule "vim/.vim/pack/plugins/start/vim-praat"] path = vim/.vim/pack/plugins/start/vim-praat url = https://github.com/dopefishh/vim-praat.git -[submodule "vim/.vim/pack/plugins/start/vim-spl"] - path = vim/.vim/pack/plugins/start/vim-spl - url = https://gitlab.science.ru.nl:compilerconstruction/vim-spl.git [submodule "vim/.vim/pack/plugins/start/vimperator.vim"] path = vim/.vim/pack/plugins/start/vimperator.vim url = https://github.com/vimperator/vimperator.vim @@ -31,3 +28,12 @@ [submodule "config.h/slstatus/slstatus"] path = config.h/slstatus/slstatus url = https://git.suckless.org/slstatus +[submodule "vim/.vim/pack/plugins/start/vim-LanguageTool"] + path = vim/.vim/pack/plugins/start/vim-LanguageTool + url = https://github.com/dpelle/vim-LanguageTool +[submodule "vim/.vim/pack/plugins/start/-f"] + path = vim/.vim/pack/plugins/start/-f + url = https://github.com/vimwiki/vimwiki.git +[submodule "vim/.vim/pack/plugins/start/vimwiki"] + path = vim/.vim/pack/plugins/start/vimwiki + url = https://github.com/vimwiki/vimwiki diff --git a/cal/.config/vdirsyncer/config b/cal/.config/vdirsyncer/config index ceddd8a..01919df 100644 --- a/cal/.config/vdirsyncer/config +++ b/cal/.config/vdirsyncer/config @@ -13,6 +13,21 @@ status_path = "~/.local/share/vdirsyncer/status/" #default_command = "sync" # Webcal +[pair sws] +a = "sws_web" +b = "sws_remote" +collections = null + +[storage sws_web] +type = "http" +url = "https://calendar.google.com/calendar/ical/673803b665fea319a9af80e9f39d3d7c3310200ca9db88ed073fa872f86a80e5%40group.calendar.google.com/public/basic.ics" + +[storage sws_remote] +type = "caldav" +url = "https://cal.martlubbers.net/dav.php/calendars/mart/sws/" +username = "mart" +password.fetch = ["command", "pass", "show", "caldav_ygdrassil/mart"] + [pair uni] a = "uni_web" b = "uni_remote" @@ -43,21 +58,6 @@ url = "https://cal.martlubbers.net/dav.php/calendars/mart/vuilnis/" username = "mart" password.fetch = ["command", "pass", "show", "caldav_ygdrassil/mart"] -[pair swsseminar] -a = "sws_web" -b = "sws_remote" -collections = null - -[storage sws_web] -type = "http" -url = "webcal://mail.ru.nl/owa/calendar/b6e050a43db94f69b7f22d03b199e2d3@ru.nl/d9d2aad2370a45e384cdd0df82dc0372275936403019441775/S-1-8-3775058472-2008174625-2090802342-630350554/reachcalendar.ics" - -[storage sws_remote] -type = "caldav" -url = "https://cal.martlubbers.net/dav.php/calendars/mart/swsseminar/" -username = "mart" -password.fetch = ["command", "pass", "show", "caldav_ygdrassil/mart"] - # CARDDAV [pair contacts] a = "contacts_local" diff --git a/clean/.nitrile/nitrile-settings.yml b/clean/.nitrile/nitrile-settings.yml new file mode 100644 index 0000000..0109de9 --- /dev/null +++ b/clean/.nitrile/nitrile-settings.yml @@ -0,0 +1,4 @@ +clm: + parallel_jobs: 1 + #fetch: + # always_include_optional: true diff --git a/config.h/dwm/config.h b/config.h/dwm/config.h index ad4a1a7..ec5d1ae 100644 --- a/config.h/dwm/config.h +++ b/config.h/dwm/config.h @@ -38,6 +38,7 @@ static const Rule rules[] = { 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 int resizehints = 1; /* 1 means respect size hints in tiled resizals */ +static const int lockfullscreen = 1; /* 1 will force focus on the fullscreen window */ static const Layout layouts[] = { /* symbol arrange function */ @@ -84,8 +85,8 @@ static Key keys[] = { { 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_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_Return, zoom, {0} }, diff --git a/config.h/dwm/dwm b/config.h/dwm/dwm index 61bb8b2..50ad171 160000 --- a/config.h/dwm/dwm +++ b/config.h/dwm/dwm @@ -1 +1 @@ -Subproject commit 61bb8b2241d4db08bea4261c82e27cd9797099e7 +Subproject commit 50ad171eea9db5ccb36fce2592e047c3282975ff diff --git a/config.h/dwm/dwm-autostart-20210120-cb3f58a.diff b/config.h/dwm/dwm-autostart-20210120-cb3f58a.diff new file mode 100644 index 0000000..efee676 --- /dev/null +++ b/config.h/dwm/dwm-autostart-20210120-cb3f58a.diff @@ -0,0 +1,179 @@ +From 37e970479dc5d40e57fc0cbfeaa5e39941483237 Mon Sep 17 00:00:00 2001 +From: Gan Ainm +Date: Wed, 10 Jun 2020 10:59:02 +0000 +Subject: [PATCH] dwm-xdgautostart-6.2.diff + +=================================================================== +--- + dwm.1 | 23 +++++++++++++++++ + dwm.c | 82 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ + 2 files changed, 105 insertions(+) + +diff --git a/dwm.1 b/dwm.1 +index 13b3729..9533aa6 100644 +--- a/dwm.1 ++++ b/dwm.1 +@@ -30,6 +30,14 @@ top left corner. The tags which are applied to one or more windows are + indicated with an empty square in the top left corner. + .P + dwm draws a small border around windows to indicate the focus state. ++.P ++On start, dwm can start additional programs that may be specified in two special ++shell scripts (see the FILES section below), autostart_blocking.sh and ++autostart.sh. The former is executed first and dwm will wait for its ++termination before starting. The latter is executed in the background before ++dwm enters its handler loop. ++.P ++Either of these files may be omitted. + .SH OPTIONS + .TP + .B \-v +@@ -152,6 +160,21 @@ Toggles focused window between floating and tiled state. + .TP + .B Mod1\-Button3 + Resize focused window while dragging. Tiled windows will be toggled to the floating state. ++.SH FILES ++The files containing programs to be started along with dwm are searched for in ++the following directories: ++.IP "1. $XDG_DATA_HOME/dwm" ++.IP "2. $HOME/.local/share/dwm" ++.IP "3. $HOME/.dwm" ++.P ++The first existing directory is scanned for any of the autostart files below. ++.TP 15 ++autostart.sh ++This file is started as a shell background process before dwm enters its handler ++loop. ++.TP 15 ++autostart_blocking.sh ++This file is started before any autostart.sh; dwm waits for its termination. + .SH CUSTOMIZATION + dwm is customized by creating a custom config.h and (re)compiling the source + code. This keeps it fast, secure and simple. +diff --git a/dwm.c b/dwm.c +index 4465af1..2156b49 100644 +--- a/dwm.c ++++ b/dwm.c +@@ -29,6 +29,7 @@ + #include + #include + #include ++#include + #include + #include + #include +@@ -193,6 +194,7 @@ 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 runautostart(void); + static void scan(void); + static int sendevent(Client *c, Atom proto); + static void sendmon(Client *c, Monitor *m); +@@ -235,7 +237,11 @@ static int xerrorstart(Display *dpy, XErrorEvent *ee); + static void zoom(const Arg *arg); + + /* variables */ ++static const char autostartblocksh[] = "autostart_blocking.sh"; ++static const char autostartsh[] = "autostart.sh"; + static const char broken[] = "broken"; ++static const char dwmdir[] = "dwm"; ++static const char localshare[] = ".local/share"; + static char stext[256]; + static int screen; + static int sw, sh; /* X display screen geometry width, height */ +@@ -1380,6 +1386,83 @@ run(void) + handler[ev.type](&ev); /* call handler */ + } + ++void ++runautostart(void) ++{ ++ char *pathpfx; ++ char *path; ++ char *xdgdatahome; ++ char *home; ++ struct stat sb; ++ ++ if ((home = getenv("HOME")) == NULL) ++ /* this is almost impossible */ ++ return; ++ ++ /* if $XDG_DATA_HOME is set and not empty, use $XDG_DATA_HOME/dwm, ++ * otherwise use ~/.local/share/dwm as autostart script directory ++ */ ++ xdgdatahome = getenv("XDG_DATA_HOME"); ++ if (xdgdatahome != NULL && *xdgdatahome != '\0') { ++ /* space for path segments, separators and nul */ ++ pathpfx = ecalloc(1, strlen(xdgdatahome) + strlen(dwmdir) + 2); ++ ++ if (sprintf(pathpfx, "%s/%s", xdgdatahome, dwmdir) <= 0) { ++ free(pathpfx); ++ return; ++ } ++ } else { ++ /* space for path segments, separators and nul */ ++ pathpfx = ecalloc(1, strlen(home) + strlen(localshare) ++ + strlen(dwmdir) + 3); ++ ++ if (sprintf(pathpfx, "%s/%s/%s", home, localshare, dwmdir) < 0) { ++ free(pathpfx); ++ return; ++ } ++ } ++ ++ /* check if the autostart script directory exists */ ++ if (! (stat(pathpfx, &sb) == 0 && S_ISDIR(sb.st_mode))) { ++ /* the XDG conformant path does not exist or is no directory ++ * so we try ~/.dwm instead ++ */ ++ char *pathpfx_new = realloc(pathpfx, strlen(home) + strlen(dwmdir) + 3); ++ if(pathpfx_new == NULL) { ++ free(pathpfx); ++ return; ++ } ++ pathpfx = pathpfx_new; ++ ++ if (sprintf(pathpfx, "%s/.%s", home, dwmdir) <= 0) { ++ free(pathpfx); ++ return; ++ } ++ } ++ ++ /* try the blocking script first */ ++ path = ecalloc(1, strlen(pathpfx) + strlen(autostartblocksh) + 2); ++ if (sprintf(path, "%s/%s", pathpfx, autostartblocksh) <= 0) { ++ free(path); ++ free(pathpfx); ++ } ++ ++ if (access(path, X_OK) == 0) ++ system(path); ++ ++ /* now the non-blocking script */ ++ if (sprintf(path, "%s/%s", pathpfx, autostartsh) <= 0) { ++ free(path); ++ free(pathpfx); ++ } ++ ++ if (access(path, X_OK) == 0) ++ system(strcat(path, " &")); ++ ++ free(pathpfx); ++ free(path); ++} ++ + void + scan(void) + { +@@ -2142,6 +2223,7 @@ main(int argc, char *argv[]) + die("pledge"); + #endif /* __OpenBSD__ */ + scan(); ++ runautostart(); + run(); + cleanup(); + XCloseDisplay(dpy); +-- +2.27.0 + diff --git a/config.h/dwm/dwm-systray-6.4.diff b/config.h/dwm/dwm-systray-6.4.diff new file mode 100644 index 0000000..58e4a69 --- /dev/null +++ b/config.h/dwm/dwm-systray-6.4.diff @@ -0,0 +1,746 @@ +diff --git a/config.def.h b/config.def.h +index 9efa774..750529d 100644 +--- a/config.def.h ++++ b/config.def.h +@@ -3,6 +3,11 @@ + /* appearance */ + static const unsigned int borderpx = 1; /* border pixel of windows */ + static const unsigned int snap = 32; /* snap pixel */ ++static const unsigned int systraypinning = 0; /* 0: sloppy systray follows selected monitor, >0: pin systray to monitor X */ ++static const unsigned int systrayonleft = 0; /* 0: systray in the right corner, >0: systray on left of status text */ ++static const unsigned int systrayspacing = 2; /* systray spacing */ ++static const int systraypinningfailfirst = 1; /* 1: if pinning fails, display systray on the first monitor, False: display systray on the last monitor*/ ++static const int showsystray = 1; /* 0 means no systray */ + static const int showbar = 1; /* 0 means no bar */ + static const int topbar = 1; /* 0 means bottom bar */ + static const char *fonts[] = { "monospace:size=10" }; +@@ -101,8 +106,8 @@ static const Key keys[] = { + /* click can be ClkTagBar, ClkLtSymbol, ClkStatusText, ClkWinTitle, ClkClientWin, or ClkRootWin */ + static const Button buttons[] = { + /* click event mask button function argument */ +- { ClkLtSymbol, 0, Button1, setlayout, {0} }, +- { ClkLtSymbol, 0, Button3, setlayout, {.v = &layouts[2]} }, ++ { ClkTagBar, MODKEY, Button1, tag, {0} }, ++ { ClkTagBar, MODKEY, Button3, toggletag, {0} }, + { ClkWinTitle, 0, Button2, zoom, {0} }, + { ClkStatusText, 0, Button2, spawn, {.v = termcmd } }, + { ClkClientWin, MODKEY, Button1, movemouse, {0} }, +diff --git a/dwm.c b/dwm.c +index 03baf42..4611a03 100644 +--- a/dwm.c ++++ b/dwm.c +@@ -57,12 +57,27 @@ + #define TAGMASK ((1 << LENGTH(tags)) - 1) + #define TEXTW(X) (drw_fontset_getwidth(drw, (X)) + lrpad) + ++#define SYSTEM_TRAY_REQUEST_DOCK 0 ++/* XEMBED messages */ ++#define XEMBED_EMBEDDED_NOTIFY 0 ++#define XEMBED_WINDOW_ACTIVATE 1 ++#define XEMBED_FOCUS_IN 4 ++#define XEMBED_MODALITY_ON 10 ++#define XEMBED_MAPPED (1 << 0) ++#define XEMBED_WINDOW_ACTIVATE 1 ++#define XEMBED_WINDOW_DEACTIVATE 2 ++#define VERSION_MAJOR 0 ++#define VERSION_MINOR 0 ++#define XEMBED_EMBEDDED_VERSION (VERSION_MAJOR << 16) | VERSION_MINOR ++ + /* enums */ + enum { CurNormal, CurResize, CurMove, CurLast }; /* cursor */ + enum { SchemeNorm, SchemeSel }; /* color schemes */ + enum { NetSupported, NetWMName, NetWMState, NetWMCheck, ++ NetSystemTray, NetSystemTrayOP, NetSystemTrayOrientation, NetSystemTrayOrientationHorz, + NetWMFullscreen, NetActiveWindow, NetWMWindowType, + NetWMWindowTypeDialog, NetClientList, NetLast }; /* EWMH atoms */ ++enum { Manager, Xembed, XembedInfo, XLast }; /* Xembed atoms */ + enum { WMProtocols, WMDelete, WMState, WMTakeFocus, WMLast }; /* default atoms */ + enum { ClkTagBar, ClkLtSymbol, ClkStatusText, ClkWinTitle, + ClkClientWin, ClkRootWin, ClkLast }; /* clicks */ +@@ -141,6 +156,12 @@ typedef struct { + int monitor; + } Rule; + ++typedef struct Systray Systray; ++struct Systray { ++ Window win; ++ Client *icons; ++}; ++ + /* function declarations */ + static void applyrules(Client *c); + static int applysizehints(Client *c, int *x, int *y, int *w, int *h, int interact); +@@ -172,6 +193,7 @@ static void focusstack(const Arg *arg); + static Atom getatomprop(Client *c, Atom prop); + static int getrootptr(int *x, int *y); + static long getstate(Window w); ++static unsigned int getsystraywidth(); + static int gettextprop(Window w, Atom atom, char *text, unsigned int size); + static void grabbuttons(Client *c, int focused); + static void grabkeys(void); +@@ -189,13 +211,16 @@ static void pop(Client *c); + static void propertynotify(XEvent *e); + static void quit(const Arg *arg); + static Monitor *recttomon(int x, int y, int w, int h); ++static void removesystrayicon(Client *i); + static void resize(Client *c, int x, int y, int w, int h, int interact); ++static void resizebarwin(Monitor *m); + static void resizeclient(Client *c, int x, int y, int w, int h); + static void resizemouse(const Arg *arg); ++static void resizerequest(XEvent *e); + static void restack(Monitor *m); + static void run(void); + static void scan(void); +-static int sendevent(Client *c, Atom proto); ++static int sendevent(Window w, Atom proto, int m, long d0, long d1, long d2, long d3, long d4); + static void sendmon(Client *c, Monitor *m); + static void setclientstate(Client *c, long state); + static void setfocus(Client *c); +@@ -207,6 +232,7 @@ static void seturgent(Client *c, int urg); + static void showhide(Client *c); + static void sigchld(int unused); + static void spawn(const Arg *arg); ++static Monitor *systraytomon(Monitor *m); + static void tag(const Arg *arg); + static void tagmon(const Arg *arg); + static void tile(Monitor *m); +@@ -224,18 +250,23 @@ static int updategeom(void); + static void updatenumlockmask(void); + static void updatesizehints(Client *c); + static void updatestatus(void); ++static void updatesystray(void); ++static void updatesystrayicongeom(Client *i, int w, int h); ++static void updatesystrayiconstate(Client *i, XPropertyEvent *ev); + static void updatetitle(Client *c); + static void updatewindowtype(Client *c); + static void updatewmhints(Client *c); + static void view(const Arg *arg); + static Client *wintoclient(Window w); + static Monitor *wintomon(Window w); ++static Client *wintosystrayicon(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 Systray *systray = NULL; + static const char broken[] = "broken"; + static char stext[256]; + static int screen; +@@ -258,9 +289,10 @@ static void (*handler[LASTEvent]) (XEvent *) = { + [MapRequest] = maprequest, + [MotionNotify] = motionnotify, + [PropertyNotify] = propertynotify, ++ [ResizeRequest] = resizerequest, + [UnmapNotify] = unmapnotify + }; +-static Atom wmatom[WMLast], netatom[NetLast]; ++static Atom wmatom[WMLast], netatom[NetLast], xatom[XLast]; + static int running = 1; + static Cur *cursor[CurLast]; + static Clr **scheme; +@@ -442,7 +474,7 @@ buttonpress(XEvent *e) + arg.ui = 1 << i; + } else if (ev->x < x + TEXTW(selmon->ltsymbol)) + click = ClkLtSymbol; +- else if (ev->x > selmon->ww - (int)TEXTW(stext)) ++ else if (ev->x > selmon->ww - (int)TEXTW(stext) - getsystraywidth()) + click = ClkStatusText; + else + click = ClkWinTitle; +@@ -485,6 +517,13 @@ cleanup(void) + XUngrabKey(dpy, AnyKey, AnyModifier, root); + while (mons) + cleanupmon(mons); ++ ++ if (showsystray) { ++ XUnmapWindow(dpy, systray->win); ++ XDestroyWindow(dpy, systray->win); ++ free(systray); ++ } ++ + for (i = 0; i < CurLast; i++) + drw_cur_free(drw, cursor[i]); + for (i = 0; i < LENGTH(colors); i++) +@@ -516,9 +555,58 @@ cleanupmon(Monitor *mon) + void + clientmessage(XEvent *e) + { ++ XWindowAttributes wa; ++ XSetWindowAttributes swa; + XClientMessageEvent *cme = &e->xclient; + Client *c = wintoclient(cme->window); + ++ if (showsystray && cme->window == systray->win && cme->message_type == netatom[NetSystemTrayOP]) { ++ /* add systray icons */ ++ if (cme->data.l[1] == SYSTEM_TRAY_REQUEST_DOCK) { ++ if (!(c = (Client *)calloc(1, sizeof(Client)))) ++ die("fatal: could not malloc() %u bytes\n", sizeof(Client)); ++ if (!(c->win = cme->data.l[2])) { ++ free(c); ++ return; ++ } ++ c->mon = selmon; ++ c->next = systray->icons; ++ systray->icons = c; ++ if (!XGetWindowAttributes(dpy, c->win, &wa)) { ++ /* use sane defaults */ ++ wa.width = bh; ++ wa.height = bh; ++ wa.border_width = 0; ++ } ++ c->x = c->oldx = c->y = c->oldy = 0; ++ c->w = c->oldw = wa.width; ++ c->h = c->oldh = wa.height; ++ c->oldbw = wa.border_width; ++ c->bw = 0; ++ c->isfloating = True; ++ /* reuse tags field as mapped status */ ++ c->tags = 1; ++ updatesizehints(c); ++ updatesystrayicongeom(c, wa.width, wa.height); ++ XAddToSaveSet(dpy, c->win); ++ XSelectInput(dpy, c->win, StructureNotifyMask | PropertyChangeMask | ResizeRedirectMask); ++ XReparentWindow(dpy, c->win, systray->win, 0, 0); ++ /* use parents background color */ ++ swa.background_pixel = scheme[SchemeNorm][ColBg].pixel; ++ XChangeWindowAttributes(dpy, c->win, CWBackPixel, &swa); ++ sendevent(c->win, netatom[Xembed], StructureNotifyMask, CurrentTime, XEMBED_EMBEDDED_NOTIFY, 0 , systray->win, XEMBED_EMBEDDED_VERSION); ++ /* FIXME not sure if I have to send these events, too */ ++ sendevent(c->win, netatom[Xembed], StructureNotifyMask, CurrentTime, XEMBED_FOCUS_IN, 0 , systray->win, XEMBED_EMBEDDED_VERSION); ++ sendevent(c->win, netatom[Xembed], StructureNotifyMask, CurrentTime, XEMBED_WINDOW_ACTIVATE, 0 , systray->win, XEMBED_EMBEDDED_VERSION); ++ sendevent(c->win, netatom[Xembed], StructureNotifyMask, CurrentTime, XEMBED_MODALITY_ON, 0 , systray->win, XEMBED_EMBEDDED_VERSION); ++ XSync(dpy, False); ++ resizebarwin(selmon); ++ updatesystray(); ++ setclientstate(c, NormalState); ++ } ++ return; ++ } ++ + if (!c) + return; + if (cme->message_type == netatom[NetWMState]) { +@@ -571,7 +659,7 @@ configurenotify(XEvent *e) + for (c = m->clients; c; c = c->next) + if (c->isfullscreen) + resizeclient(c, m->mx, m->my, m->mw, m->mh); +- XMoveResizeWindow(dpy, m->barwin, m->wx, m->by, m->ww, bh); ++ resizebarwin(m); + } + focus(NULL); + arrange(NULL); +@@ -656,6 +744,11 @@ destroynotify(XEvent *e) + + if ((c = wintoclient(ev->window))) + unmanage(c, 1); ++ else if ((c = wintosystrayicon(ev->window))) { ++ removesystrayicon(c); ++ resizebarwin(selmon); ++ updatesystray(); ++ } + } + + void +@@ -699,7 +792,7 @@ dirtomon(int dir) + void + drawbar(Monitor *m) + { +- int x, w, tw = 0; ++ int x, w, tw = 0, stw = 0; + int boxs = drw->fonts->h / 9; + int boxw = drw->fonts->h / 6 + 2; + unsigned int i, occ = 0, urg = 0; +@@ -708,13 +801,17 @@ drawbar(Monitor *m) + if (!m->showbar) + return; + ++ if(showsystray && m == systraytomon(m) && !systrayonleft) ++ stw = getsystraywidth(); ++ + /* draw status first so it can be overdrawn by tags later */ + if (m == selmon) { /* status is only drawn on selected monitor */ + drw_setscheme(drw, scheme[SchemeNorm]); +- tw = TEXTW(stext) - lrpad + 2; /* 2px right padding */ +- drw_text(drw, m->ww - tw, 0, tw, bh, 0, stext, 0); ++ tw = TEXTW(stext) - lrpad / 2 + 2; /* 2px extra right padding */ ++ drw_text(drw, m->ww - tw - stw, 0, tw, bh, lrpad / 2 - 2, stext, 0); + } + ++ resizebarwin(m); + for (c = m->clients; c; c = c->next) { + occ |= c->tags; + if (c->isurgent) +@@ -735,7 +832,7 @@ drawbar(Monitor *m) + drw_setscheme(drw, scheme[SchemeNorm]); + x = drw_text(drw, x, 0, w, bh, lrpad / 2, m->ltsymbol, 0); + +- if ((w = m->ww - tw - x) > bh) { ++ if ((w = m->ww - tw - stw - x) > bh) { + if (m->sel) { + drw_setscheme(drw, scheme[m == selmon ? SchemeSel : SchemeNorm]); + drw_text(drw, x, 0, w, bh, lrpad / 2, m->sel->name, 0); +@@ -746,7 +843,7 @@ drawbar(Monitor *m) + drw_rect(drw, x, 0, w, bh, 1, 1); + } + } +- drw_map(drw, m->barwin, 0, 0, m->ww, bh); ++ drw_map(drw, m->barwin, 0, 0, m->ww - stw, bh); + } + + void +@@ -783,8 +880,11 @@ expose(XEvent *e) + Monitor *m; + XExposeEvent *ev = &e->xexpose; + +- if (ev->count == 0 && (m = wintomon(ev->window))) ++ if (ev->count == 0 && (m = wintomon(ev->window))) { + drawbar(m); ++ if (m == selmon) ++ updatesystray(); ++ } + } + + void +@@ -870,14 +970,32 @@ getatomprop(Client *c, Atom prop) + unsigned char *p = NULL; + Atom da, atom = None; + +- if (XGetWindowProperty(dpy, c->win, prop, 0L, sizeof atom, False, XA_ATOM, ++ /* FIXME getatomprop should return the number of items and a pointer to ++ * the stored data instead of this workaround */ ++ Atom req = XA_ATOM; ++ if (prop == xatom[XembedInfo]) ++ req = xatom[XembedInfo]; ++ ++ if (XGetWindowProperty(dpy, c->win, prop, 0L, sizeof atom, False, req, + &da, &di, &dl, &dl, &p) == Success && p) { + atom = *(Atom *)p; ++ if (da == xatom[XembedInfo] && dl == 2) ++ atom = ((Atom *)p)[1]; + XFree(p); + } + return atom; + } + ++unsigned int ++getsystraywidth() ++{ ++ unsigned int w = 0; ++ Client *i; ++ if(showsystray) ++ for(i = systray->icons; i; w += i->w + systrayspacing, i = i->next) ; ++ return w ? w + systrayspacing : 1; ++} ++ + int + getrootptr(int *x, int *y) + { +@@ -1018,7 +1136,8 @@ killclient(const Arg *arg) + { + if (!selmon->sel) + return; +- if (!sendevent(selmon->sel, wmatom[WMDelete])) { ++ ++ if (!sendevent(selmon->sel->win, wmatom[WMDelete], NoEventMask, wmatom[WMDelete], CurrentTime, 0 , 0, 0)) { + XGrabServer(dpy); + XSetErrorHandler(xerrordummy); + XSetCloseDownMode(dpy, DestroyAll); +@@ -1105,6 +1224,13 @@ maprequest(XEvent *e) + static XWindowAttributes wa; + XMapRequestEvent *ev = &e->xmaprequest; + ++ Client *i; ++ if ((i = wintosystrayicon(ev->window))) { ++ sendevent(i->win, netatom[Xembed], StructureNotifyMask, CurrentTime, XEMBED_WINDOW_ACTIVATE, 0, systray->win, XEMBED_EMBEDDED_VERSION); ++ resizebarwin(selmon); ++ updatesystray(); ++ } ++ + if (!XGetWindowAttributes(dpy, ev->window, &wa) || wa.override_redirect) + return; + if (!wintoclient(ev->window)) +@@ -1226,6 +1352,17 @@ propertynotify(XEvent *e) + Window trans; + XPropertyEvent *ev = &e->xproperty; + ++ if ((c = wintosystrayicon(ev->window))) { ++ if (ev->atom == XA_WM_NORMAL_HINTS) { ++ updatesizehints(c); ++ updatesystrayicongeom(c, c->w, c->h); ++ } ++ else ++ updatesystrayiconstate(c, ev); ++ resizebarwin(selmon); ++ updatesystray(); ++ } ++ + if ((ev->window == root) && (ev->atom == XA_WM_NAME)) + updatestatus(); + else if (ev->state == PropertyDelete) +@@ -1276,6 +1413,19 @@ recttomon(int x, int y, int w, int h) + return r; + } + ++void ++removesystrayicon(Client *i) ++{ ++ Client **ii; ++ ++ if (!showsystray || !i) ++ return; ++ for (ii = &systray->icons; *ii && *ii != i; ii = &(*ii)->next); ++ if (ii) ++ *ii = i->next; ++ free(i); ++} ++ + void + resize(Client *c, int x, int y, int w, int h, int interact) + { +@@ -1283,6 +1433,14 @@ resize(Client *c, int x, int y, int w, int h, int interact) + resizeclient(c, x, y, w, h); + } + ++void ++resizebarwin(Monitor *m) { ++ unsigned int w = m->ww; ++ if (showsystray && m == systraytomon(m) && !systrayonleft) ++ w -= getsystraywidth(); ++ XMoveResizeWindow(dpy, m->barwin, m->wx, m->by, w, bh); ++} ++ + void + resizeclient(Client *c, int x, int y, int w, int h) + { +@@ -1298,6 +1456,19 @@ resizeclient(Client *c, int x, int y, int w, int h) + XSync(dpy, False); + } + ++void ++resizerequest(XEvent *e) ++{ ++ XResizeRequestEvent *ev = &e->xresizerequest; ++ Client *i; ++ ++ if ((i = wintosystrayicon(ev->window))) { ++ updatesystrayicongeom(i, ev->width, ev->height); ++ resizebarwin(selmon); ++ updatesystray(); ++ } ++} ++ + void + resizemouse(const Arg *arg) + { +@@ -1444,26 +1615,37 @@ setclientstate(Client *c, long state) + } + + int +-sendevent(Client *c, Atom proto) ++sendevent(Window w, Atom proto, int mask, long d0, long d1, long d2, long d3, long d4) + { + int n; +- Atom *protocols; ++ Atom *protocols, mt; + int exists = 0; + XEvent ev; + +- if (XGetWMProtocols(dpy, c->win, &protocols, &n)) { +- while (!exists && n--) +- exists = protocols[n] == proto; +- XFree(protocols); ++ if (proto == wmatom[WMTakeFocus] || proto == wmatom[WMDelete]) { ++ mt = wmatom[WMProtocols]; ++ if (XGetWMProtocols(dpy, w, &protocols, &n)) { ++ while (!exists && n--) ++ exists = protocols[n] == proto; ++ XFree(protocols); ++ } ++ } ++ else { ++ exists = True; ++ mt = proto; + } ++ + if (exists) { + ev.type = ClientMessage; +- ev.xclient.window = c->win; +- ev.xclient.message_type = wmatom[WMProtocols]; ++ ev.xclient.window = w; ++ ev.xclient.message_type = mt; + ev.xclient.format = 32; +- ev.xclient.data.l[0] = proto; +- ev.xclient.data.l[1] = CurrentTime; +- XSendEvent(dpy, c->win, False, NoEventMask, &ev); ++ ev.xclient.data.l[0] = d0; ++ ev.xclient.data.l[1] = d1; ++ ev.xclient.data.l[2] = d2; ++ ev.xclient.data.l[3] = d3; ++ ev.xclient.data.l[4] = d4; ++ XSendEvent(dpy, w, False, mask, &ev); + } + return exists; + } +@@ -1477,7 +1659,7 @@ setfocus(Client *c) + XA_WINDOW, 32, PropModeReplace, + (unsigned char *) &(c->win), 1); + } +- sendevent(c, wmatom[WMTakeFocus]); ++ sendevent(c->win, wmatom[WMTakeFocus], NoEventMask, wmatom[WMTakeFocus], CurrentTime, 0, 0, 0); + } + + void +@@ -1566,6 +1748,10 @@ setup(void) + wmatom[WMTakeFocus] = XInternAtom(dpy, "WM_TAKE_FOCUS", False); + netatom[NetActiveWindow] = XInternAtom(dpy, "_NET_ACTIVE_WINDOW", False); + netatom[NetSupported] = XInternAtom(dpy, "_NET_SUPPORTED", False); ++ netatom[NetSystemTray] = XInternAtom(dpy, "_NET_SYSTEM_TRAY_S0", False); ++ netatom[NetSystemTrayOP] = XInternAtom(dpy, "_NET_SYSTEM_TRAY_OPCODE", False); ++ netatom[NetSystemTrayOrientation] = XInternAtom(dpy, "_NET_SYSTEM_TRAY_ORIENTATION", False); ++ netatom[NetSystemTrayOrientationHorz] = XInternAtom(dpy, "_NET_SYSTEM_TRAY_ORIENTATION_HORZ", False); + netatom[NetWMName] = XInternAtom(dpy, "_NET_WM_NAME", False); + netatom[NetWMState] = XInternAtom(dpy, "_NET_WM_STATE", False); + netatom[NetWMCheck] = XInternAtom(dpy, "_NET_SUPPORTING_WM_CHECK", False); +@@ -1573,6 +1759,9 @@ setup(void) + netatom[NetWMWindowType] = XInternAtom(dpy, "_NET_WM_WINDOW_TYPE", False); + netatom[NetWMWindowTypeDialog] = XInternAtom(dpy, "_NET_WM_WINDOW_TYPE_DIALOG", False); + netatom[NetClientList] = XInternAtom(dpy, "_NET_CLIENT_LIST", False); ++ xatom[Manager] = XInternAtom(dpy, "MANAGER", False); ++ xatom[Xembed] = XInternAtom(dpy, "_XEMBED", False); ++ xatom[XembedInfo] = XInternAtom(dpy, "_XEMBED_INFO", False); + /* init cursors */ + cursor[CurNormal] = drw_cur_create(drw, XC_left_ptr); + cursor[CurResize] = drw_cur_create(drw, XC_sizing); +@@ -1581,6 +1770,8 @@ setup(void) + scheme = ecalloc(LENGTH(colors), sizeof(Clr *)); + for (i = 0; i < LENGTH(colors); i++) + scheme[i] = drw_scm_create(drw, colors[i], 3); ++ /* init system tray */ ++ updatesystray(); + /* init bars */ + updatebars(); + updatestatus(); +@@ -1711,7 +1902,18 @@ togglebar(const Arg *arg) + { + selmon->showbar = !selmon->showbar; + updatebarpos(selmon); +- XMoveResizeWindow(dpy, selmon->barwin, selmon->wx, selmon->by, selmon->ww, bh); ++ resizebarwin(selmon); ++ if (showsystray) { ++ XWindowChanges wc; ++ if (!selmon->showbar) ++ wc.y = -bh; ++ else if (selmon->showbar) { ++ wc.y = 0; ++ if (!selmon->topbar) ++ wc.y = selmon->mh - bh; ++ } ++ XConfigureWindow(dpy, systray->win, CWY, &wc); ++ } + arrange(selmon); + } + +@@ -1807,11 +2009,18 @@ unmapnotify(XEvent *e) + else + unmanage(c, 0); + } ++ else if ((c = wintosystrayicon(ev->window))) { ++ /* KLUDGE! sometimes icons occasionally unmap their windows, but do ++ * _not_ destroy them. We map those windows back */ ++ XMapRaised(dpy, c->win); ++ updatesystray(); ++ } + } + + void + updatebars(void) + { ++ unsigned int w; + Monitor *m; + XSetWindowAttributes wa = { + .override_redirect = True, +@@ -1822,10 +2031,15 @@ updatebars(void) + for (m = mons; m; m = m->next) { + if (m->barwin) + continue; +- m->barwin = XCreateWindow(dpy, root, m->wx, m->by, m->ww, bh, 0, DefaultDepth(dpy, screen), ++ w = m->ww; ++ if (showsystray && m == systraytomon(m)) ++ w -= getsystraywidth(); ++ m->barwin = XCreateWindow(dpy, root, m->wx, m->by, w, bh, 0, DefaultDepth(dpy, screen), + CopyFromParent, DefaultVisual(dpy, screen), + CWOverrideRedirect|CWBackPixmap|CWEventMask, &wa); + XDefineCursor(dpy, m->barwin, cursor[CurNormal]->cursor); ++ if (showsystray && m == systraytomon(m)) ++ XMapRaised(dpy, systray->win); + XMapRaised(dpy, m->barwin); + XSetClassHint(dpy, m->barwin, &ch); + } +@@ -2002,6 +2216,125 @@ updatestatus(void) + if (!gettextprop(root, XA_WM_NAME, stext, sizeof(stext))) + strcpy(stext, "dwm-"VERSION); + drawbar(selmon); ++ updatesystray(); ++} ++ ++ ++void ++updatesystrayicongeom(Client *i, int w, int h) ++{ ++ if (i) { ++ i->h = bh; ++ if (w == h) ++ i->w = bh; ++ else if (h == bh) ++ i->w = w; ++ else ++ i->w = (int) ((float)bh * ((float)w / (float)h)); ++ applysizehints(i, &(i->x), &(i->y), &(i->w), &(i->h), False); ++ /* force icons into the systray dimensions if they don't want to */ ++ if (i->h > bh) { ++ if (i->w == i->h) ++ i->w = bh; ++ else ++ i->w = (int) ((float)bh * ((float)i->w / (float)i->h)); ++ i->h = bh; ++ } ++ } ++} ++ ++void ++updatesystrayiconstate(Client *i, XPropertyEvent *ev) ++{ ++ long flags; ++ int code = 0; ++ ++ if (!showsystray || !i || ev->atom != xatom[XembedInfo] || ++ !(flags = getatomprop(i, xatom[XembedInfo]))) ++ return; ++ ++ if (flags & XEMBED_MAPPED && !i->tags) { ++ i->tags = 1; ++ code = XEMBED_WINDOW_ACTIVATE; ++ XMapRaised(dpy, i->win); ++ setclientstate(i, NormalState); ++ } ++ else if (!(flags & XEMBED_MAPPED) && i->tags) { ++ i->tags = 0; ++ code = XEMBED_WINDOW_DEACTIVATE; ++ XUnmapWindow(dpy, i->win); ++ setclientstate(i, WithdrawnState); ++ } ++ else ++ return; ++ sendevent(i->win, xatom[Xembed], StructureNotifyMask, CurrentTime, code, 0, ++ systray->win, XEMBED_EMBEDDED_VERSION); ++} ++ ++void ++updatesystray(void) ++{ ++ XSetWindowAttributes wa; ++ XWindowChanges wc; ++ Client *i; ++ Monitor *m = systraytomon(NULL); ++ unsigned int x = m->mx + m->mw; ++ unsigned int sw = TEXTW(stext) - lrpad + systrayspacing; ++ unsigned int w = 1; ++ ++ if (!showsystray) ++ return; ++ if (systrayonleft) ++ x -= sw + lrpad / 2; ++ if (!systray) { ++ /* init systray */ ++ if (!(systray = (Systray *)calloc(1, sizeof(Systray)))) ++ die("fatal: could not malloc() %u bytes\n", sizeof(Systray)); ++ systray->win = XCreateSimpleWindow(dpy, root, x, m->by, w, bh, 0, 0, scheme[SchemeSel][ColBg].pixel); ++ wa.event_mask = ButtonPressMask | ExposureMask; ++ wa.override_redirect = True; ++ wa.background_pixel = scheme[SchemeNorm][ColBg].pixel; ++ XSelectInput(dpy, systray->win, SubstructureNotifyMask); ++ XChangeProperty(dpy, systray->win, netatom[NetSystemTrayOrientation], XA_CARDINAL, 32, ++ PropModeReplace, (unsigned char *)&netatom[NetSystemTrayOrientationHorz], 1); ++ XChangeWindowAttributes(dpy, systray->win, CWEventMask|CWOverrideRedirect|CWBackPixel, &wa); ++ XMapRaised(dpy, systray->win); ++ XSetSelectionOwner(dpy, netatom[NetSystemTray], systray->win, CurrentTime); ++ if (XGetSelectionOwner(dpy, netatom[NetSystemTray]) == systray->win) { ++ sendevent(root, xatom[Manager], StructureNotifyMask, CurrentTime, netatom[NetSystemTray], systray->win, 0, 0); ++ XSync(dpy, False); ++ } ++ else { ++ fprintf(stderr, "dwm: unable to obtain system tray.\n"); ++ free(systray); ++ systray = NULL; ++ return; ++ } ++ } ++ for (w = 0, i = systray->icons; i; i = i->next) { ++ /* make sure the background color stays the same */ ++ wa.background_pixel = scheme[SchemeNorm][ColBg].pixel; ++ XChangeWindowAttributes(dpy, i->win, CWBackPixel, &wa); ++ XMapRaised(dpy, i->win); ++ w += systrayspacing; ++ i->x = w; ++ XMoveResizeWindow(dpy, i->win, i->x, 0, i->w, i->h); ++ w += i->w; ++ if (i->mon != m) ++ i->mon = m; ++ } ++ w = w ? w + systrayspacing : 1; ++ x -= w; ++ XMoveResizeWindow(dpy, systray->win, x, m->by, w, bh); ++ wc.x = x; wc.y = m->by; wc.width = w; wc.height = bh; ++ wc.stack_mode = Above; wc.sibling = m->barwin; ++ XConfigureWindow(dpy, systray->win, CWX|CWY|CWWidth|CWHeight|CWSibling|CWStackMode, &wc); ++ XMapWindow(dpy, systray->win); ++ XMapSubwindows(dpy, systray->win); ++ /* redraw background */ ++ XSetForeground(dpy, drw->gc, scheme[SchemeNorm][ColBg].pixel); ++ XFillRectangle(dpy, systray->win, drw->gc, 0, 0, w, bh); ++ XSync(dpy, False); + } + + void +@@ -2069,6 +2402,16 @@ wintoclient(Window w) + return NULL; + } + ++Client * ++wintosystrayicon(Window w) { ++ Client *i = NULL; ++ ++ if (!showsystray || !w) ++ return i; ++ for (i = systray->icons; i && i->win != w; i = i->next) ; ++ return i; ++} ++ + Monitor * + wintomon(Window w) + { +@@ -2122,6 +2465,22 @@ xerrorstart(Display *dpy, XErrorEvent *ee) + return -1; + } + ++Monitor * ++systraytomon(Monitor *m) { ++ Monitor *t; ++ int i, n; ++ if(!systraypinning) { ++ if(!m) ++ return selmon; ++ return m == selmon ? m : NULL; ++ } ++ for(n = 1, t = mons; t && t->next; n++, t = t->next) ; ++ for(i = 1, t = mons; t && t->next && i < systraypinning; i++, t = t->next) ; ++ if(systraypinningfailfirst && n < systraypinning) ++ return mons; ++ return t; ++} ++ + void + zoom(const Arg *arg) + { diff --git a/config.h/slstatus/config.h b/config.h/slstatus/config.h index c44eb2f..f3a8ca6 100644 --- a/config.h/slstatus/config.h +++ b/config.h/slstatus/config.h @@ -66,18 +66,19 @@ static const struct arg args[] = { /* function format argument */ { temp, " 🌡 %s°C | ", "/sys/class/thermal/thermal_zone1/temp"}, - { num_files, "✉ %s | ", - "/home/mrl/.local/share/offlineimap/mail/INBOX/new" }, + { num_files, "N✉ %s | ", + "/home/mrl/.local/share/offlineimap/mail/net/INBOX/new" }, + { num_files, "R✉ %s | ", + "/home/mrl/.local/share/offlineimap/mail/ru/INBOX/new" }, { keymap, "%s | ", NULL }, - { ipv4, "E %s | ", "enp0s31f6" }, #ifdef LAPTOP - { wifi_essid, "W %s ", "wlp1s0" }, - { ipv4, "(%s) | ", "wlp1s0" }, +// { wifi_essid, "W %s ", "wlp1s0" }, +// { ipv4, "(%s) | ", "wlp1s0" }, { battery_perc, "⚡%s%%", "BAT0"}, { battery_state, "(%s) | ", "BAT0"}, #else - { disk_perc, "/mnt/data: %s%% | " - ,"/mnt/data" }, + { ipv4, "E %s | ", "enp0s31f6" }, + { disk_perc, "/mnt/data: %s%% | " ,"/mnt/data" }, #endif { disk_perc, "/: %s%% | ", "/" }, { datetime, "%s", "%Y-%m-%d %H:%M" }, diff --git a/config.h/slstatus/slstatus b/config.h/slstatus/slstatus index 84a2f11..f68f492 160000 --- a/config.h/slstatus/slstatus +++ b/config.h/slstatus/slstatus @@ -1 +1 @@ -Subproject commit 84a2f117a32f0796045941260cdc4b69852b41e0 +Subproject commit f68f49273e70b3767b30c549dda04ddd4d25fc91 diff --git a/config.h/st/config.h b/config.h/st/config.h index 7d82da8..45b6943 100644 --- a/config.h/st/config.h +++ b/config.h/st/config.h @@ -175,7 +175,9 @@ static uint forcemousemod = ShiftMask; static MouseShortcut mshortcuts[] = { /* mask button function argument release */ { XK_ANY_MOD, Button2, selpaste, {.i = 0}, 1 }, + { ShiftMask, Button4, ttysend, {.s = "\033[5;2~"} }, { XK_ANY_MOD, Button4, ttysend, {.s = "\031"} }, + { ShiftMask, Button5, ttysend, {.s = "\033[6;2~"} }, { XK_ANY_MOD, Button5, ttysend, {.s = "\005"} }, }; diff --git a/email/.config/mutt/common.muttrc b/email/.config/mutt/common.muttrc new file mode 100644 index 0000000..4b40f4b --- /dev/null +++ b/email/.config/mutt/common.muttrc @@ -0,0 +1,2 @@ +set spoolfile=+/INBOX/ +set postponed=+/Drafts/ diff --git a/email/.config/mutt/muttrc b/email/.config/mutt/muttrc index 1125be8..714ecd2 100644 --- a/email/.config/mutt/muttrc +++ b/email/.config/mutt/muttrc @@ -1,14 +1,12 @@ +# source net on first open +source ~/.config/mutt/net.muttrc + # Basic information -set from="Mart Lubbers " alternates "(mart@cs\.ru\.nl|m\.lubbers@cs\.ru\.nl|mart@martlubbers\.net|Mart\.Lubbers@ru\.nl)" set use_from=yes set reverse_name=yes set envelope_from=yes set mbox_type=Maildir -set folder=~/.local/share/offlineimap/mail -set spoolfile=+/INBOX/ -set record=+/Sent/ -set postponed=+/Drafts/ set mask="!^\\.[^.]" source ~/.local/share/offlineimap/mailboxes @@ -16,17 +14,32 @@ source ~/.local/share/offlineimap/mailboxes set sendmail="checkattach.sh msmtp -a net" set send_charset="us-ascii:utf-8" macro index,pager $ "sync_mail.sh" "Force refresh" + +# viewing and printing macro attach B "firefox \"data:text/html;base64,$(base64 -w 0 <&0)\"" +set print_command='set -e; f=`mktemp -p "$HOME"/.cache/mutt`; \ + muttprint -P A4 -p TO_FILE:"$f"; evince "$f"; rm "$f"' # Set the correct msmtp account for the different addresses send2-hook '~f mart@martlubbers.net'\ 'set sendmail="checkattach.sh msmtp -a net"' -send2-hook '((~f m.lubbers@cs.ru.nl)|(~f m.lubbers@science.ru.nl)|(~f mart@cs.ru.nl)|(~f m.lubbers@cs.ru.nl))'\ +send2-hook '((~f m.lubbers@cs.ru.nl)|(~f m.lubbers@science.ru.nl)|(~f mart@cs.ru.nl))'\ + 'set sendmail="checkattach.sh msmtp -a ru"' +send2-hook '((~f mart.lubbers@ru.nl))'\ 'set sendmail="checkattach.sh msmtp -a ru"' # Macro for switching to the ru address -macro compose 1 "f^UMart Lubbers " -macro compose 2 "f^UMart Lubbers " +alias identity_1 Mart Lubbers +alias identity_2 Mart Lubbers +macro compose v "^Uidentity\_" "Select from" +macro compose 1 "f^UMart Lubbers ps" +macro compose 2 "f^UMart Lubbers ps" +macro compose 3 "f^UMart Lubbers pc" + +macro index,compose 1 "source ~/.config/mutt/net.muttrc=INBOX" +macro index,compose 2 "source ~/.config/mutt/ru.muttrc=INBOX" +folder-hook ~/.local/share/offlineimap/mail/net/* 'source ~/.config/mutt/net.muttrc' +folder-hook ~/.local/share/offlineimap/mail/ru/* 'source ~/.config/mutt/ru.muttrc' # Key bindings bind index gg first-entry @@ -40,6 +53,7 @@ bind index,pager F flag-message # Misc options set timeout=2 +set sleep_time=0 set mail_check=0 set include=yes set delete=yes @@ -52,7 +66,7 @@ unset markers set sort_browser=alpha set sort=threads set sort_aux=date -set editor=vim +set editor="vim -c '%'" set duplicate_threads=yes ignore headers * unignore headers from to subject date cc @@ -75,7 +89,7 @@ auto_view text/x-vcard # Pager options #set pager=/usr/share/vim/vim82/macros/less.sh -set pager_index_lines=20 +set pager_index_lines=5 set pager_context=3 set pager_stop set menu_scroll diff --git a/email/.config/mutt/net.muttrc b/email/.config/mutt/net.muttrc new file mode 100644 index 0000000..e6c7db5 --- /dev/null +++ b/email/.config/mutt/net.muttrc @@ -0,0 +1,6 @@ +set from="Mart Lubbers " +set folder=~/.local/share/offlineimap/mail/net +set record=+/Sent/ + +# reload common things that depend on $folder +source ~/.config/mutt/common.muttrc diff --git a/email/.config/mutt/ru.muttrc b/email/.config/mutt/ru.muttrc new file mode 100644 index 0000000..fdcb43d --- /dev/null +++ b/email/.config/mutt/ru.muttrc @@ -0,0 +1,6 @@ +set from="Mart Lubbers " +set folder=~/.local/share/offlineimap/mail/ru +set record=+/INBOX.Sent/ + +# reload common things that depend on $folder +source ~/.config/mutt/common.muttrc diff --git a/email/.config/notmuch/config b/email/.config/notmuch/config index f104340..2fcb22c 100644 --- a/email/.config/notmuch/config +++ b/email/.config/notmuch/config @@ -31,7 +31,7 @@ path=/home/mrl/.local/share/offlineimap/mail [user] name=Mart Lubbers primary_email=mart@martlubbers.net -other_email=martlubbers@gmail.com,mart-lubbers@hotmail.com,mail@rooslubbers.nl,mart@cs.ru.nl +other_email=martlubbers@gmail.com,mart-lubbers@hotmail.com,mail@rooslubbers.nl,mart@cs.ru.nl,mart.lubbers@ru.nl,mlubbers@cs.ru.nl # Configuration for "notmuch new" # diff --git a/email/.config/offlineimap/config b/email/.config/offlineimap/config index 42d5b4b..47be912 100644 --- a/email/.config/offlineimap/config +++ b/email/.config/offlineimap/config @@ -1,25 +1,44 @@ [general] -pythonfile = ~/.config/offlineimap/offlineimap.py metadata = ~/.local/share/offlineimap -accounts = net +accounts = net,ru ui = blinkenlights +pythonfile = ~/.config/offlineimap/offlineimap.py + +[mbnames] +enabled = yes +filename = ~/.local/share/offlineimap/mailboxes +header = "mailboxes " +peritem = "~/.local/share/offlineimap/mail/%(accountname)s/%(foldername)s/" +sep = " " +footer = "\n" +incremental = yes [Account net] -localrepository = Local -remoterepository = Remote +localrepository = netLocal +remoterepository = netRemote autorefresh = 6 quick = 10 postsynchook = newmail.sh -#proxy = SOCKS5:localhost:8008 -[Repository Local] +[Account ru] +localrepository = ruLocal +remoterepository = ruRemote +autorefresh = 6 +quick = 10 +postsynchook = newmail.sh + +[Repository netLocal] type = Maildir -localfolders = ~/.local/share/offlineimap/mail +localfolders = ~/.local/share/offlineimap/mail/net -[Repository Remote] +[Repository ruLocal] +type = Maildir +localfolders = ~/.local/share/offlineimap/mail/ru + +[Repository netRemote] type = IMAP folderfilter = lambda x: folderfilter(x) -remotepasseval = mailpasswd() +remotepasseval = mailpasswdnet() remotehost = lubbers.email remoteuser = mart@martlubbers.net ssl = yes @@ -28,11 +47,13 @@ keepalive = 60 holdconnectionopen = yes idlefolders = ['INBOX'] -[mbnames] -enabled = yes -filename = ~/.local/share/offlineimap/mailboxes -header = "mailboxes " -peritem = "~/.local/share/offlineimap/mail/%(foldername)s/" -sep = " " -footer = "\n" -incremental = yes +[Repository ruRemote] +type = IMAP +remotepasseval = mailpasswdru() +remotehost = post.science.ru.nl +remoteuser = mlubbers +ssl = yes +sslcacertfile = /etc/ssl/certs/ca-certificates.crt +keepalive = 60 +holdconnectionopen = yes +idlefolders = ['INBOX'] diff --git a/email/.config/offlineimap/offlineimap.py b/email/.config/offlineimap/offlineimap.py index 1a4bf03..c2fcee0 100644 --- a/email/.config/offlineimap/offlineimap.py +++ b/email/.config/offlineimap/offlineimap.py @@ -3,10 +3,12 @@ import datetime import re -def mailpasswd(): +def mailpasswdnet(): return subprocess.check_output('pass mail/mart@martlubbers.net', shell='/bin/bash').strip() - +def mailpasswdru(): + return subprocess.check_output('pass science.ru.nl/mlubbers', + shell='/bin/bash').strip() def folderfilter(x): match = re.match('archive\.(\d\d\d\d).(\d\d)', x) diff --git a/email/.local/bin/proofpoint_decoder b/email/.local/bin/proofpoint_decoder new file mode 100755 index 0000000..2c1bf23 --- /dev/null +++ b/email/.local/bin/proofpoint_decoder @@ -0,0 +1,114 @@ +#!/usr/bin/env python +__author__ = 'Eric Van Cleve; Oleksandr Vlasiuk' +__license__ = 'GPL v.3' +__version__ = '4.0' +__email__ = 'oleksandr.vlasiuk@gmail.com' +__status__ = 'beta' + + +import sys +import re +from base64 import urlsafe_b64decode +# Uncomment for Python 2 +# import string +# if sys.version_info[0] < 3: +# from urllib import unquote +# import HTMLParser +# htmlparser = HTMLParser.HTMLParser() +# unescape = htmlparser.unescape +# from string import maketrans +# else: +from urllib.parse import unquote +from html import unescape +maketrans = str.maketrans + + +class URLDecoder: + + def __init__(self): + URLDecoder.ud_pattern = re.compile(r'http.+?urldefense(?:\.proofpoint)?\.com/(v[0-9])/') + URLDecoder.v1_pattern = re.compile(r'u=(?P.+?)&k=') + URLDecoder.v2_pattern = re.compile(r'http.+?urldefense\.proofpoint\.com/v2/url\?u=(?P.+?)&[dc]=.*?&e=') + URLDecoder.v3_pattern = re.compile(r'http.+?urldefense\.com/v3/__(?P.+?)__;(?P.*?)!.*?\$') + URLDecoder.v3_token_pattern = re.compile("\*(\*.)?") + URLDecoder.v3_run_mapping = {'A': 2, 'B': 3, 'C': 4, 'D': 5, 'E': + 6, 'F': 7, 'G': 8, 'H': 9, 'I': 10, + 'J': 11, 'K': 12, 'L': 13, 'M': 14, + 'N': 15, 'O': 16, 'P': 17, 'Q': 18, + 'R': 19, 'S': 20, 'T': 21, 'U': 22, + 'V': 23, 'W': 24, 'X': 25, 'Y': 26, + 'Z': 27, 'a': 28, 'b': 29, 'c': 30, + 'd': 31, 'e': 32, 'f': 33, 'g': 34, + 'h': 35, 'i': 36, 'j': 37, 'k': 38, + 'l': 39, 'm': 40, 'n': 41, 'o': 42, + 'p': 43, 'q': 44, 'r': 45, 's': 46, + 't': 47, 'u': 48, 'v': 49, 'w': 50, + 'x': 51, 'y': 52, 'z': 53, '0': 54, + '1': 55, '2': 56, '3': 57, '4': 58, + '5': 59, '6': 60, '7': 61, '8': 62, + '9': 63, '-': 64, '_': 65} + URLDecoder.safelinks = re.compile(r'http.+?\.safelinks\.protection\.outlook\.com/\?url=(?P.+?)&(?:amp;)?data=.*?reserved=0') + + def decode(self, line): + match = self.ud_pattern.search(line) + match_safelinks = self.safelinks.search(line) + if match: + if match.group(1) == 'v1': + line = self.v1_pattern.sub(self.unescquote, line) + elif match.group(1) == 'v2': + line = self.v2_pattern.sub(self.decode_v2, line) + elif match.group(1) == 'v3': + line = self.v3_pattern.sub(self.decode_v3, line) + if match_safelinks: + line = self.safelinks.sub(self.unescquote, line) + return line + + def unescquote(self, match): + return unescape(unquote(match.group('url'))) + + def decode_v2(self, match): + trans = maketrans('-_', '%/') + url_encoded_url = match.group('url').translate(trans) + return unescape(unquote(url_encoded_url)) + + def decode_v3(self, match): + def replace_token(token): + if token == '*': + character = self.dec_bytes[self.current_marker] + self.current_marker += 1 + return character + if token.startswith('**'): + run_length = self.v3_run_mapping[token[-1]]//2 + run = self.dec_bytes[self.current_marker:self.current_marker+run_length] + self.current_marker += run_length + return run + + def substitute_tokens(text, start_pos=0): + match = self.v3_token_pattern.search(text, start_pos) + if match: + start = text[start_pos:match.start()] + built_string = start + token = text[match.start():match.end()] + built_string += replace_token(token) + built_string += substitute_tokens(text, match.end()) + return built_string + else: + return text[start_pos:len(text)] + + url = match.group('url') + encoded_url = unquote(url) + enc_bytes = match.group('enc_bytes') + enc_bytes += '==' + self.dec_bytes = (urlsafe_b64decode(enc_bytes)).decode('utf-8') + self.current_marker = 0 + return substitute_tokens(encoded_url) + + + +def main(): + urldec = URLDecoder() + for line in sys.stdin: +# sys.stdout.write(urldec.decode(line)) + sys.stdout.write(line) +if __name__ == '__main__': + main() diff --git a/interfaces b/interfaces new file mode 100644 index 0000000..b57f4eb --- /dev/null +++ b/interfaces @@ -0,0 +1,20 @@ +# This file describes the network interfaces available on your system +# and how to activate them. For more information, see interfaces(5). + +source /etc/network/interfaces.d/* + +# The loopback network interface +auto lo +iface lo inet loopback + +# The primary network interface +allow-hotplug enp0s31f6 +iface enp0s31f6 inet dhcp + +allow-hotplug enx0c37961e72c9 +iface enx0c37961e72c9 inet dhcp + +allow-hotplug wlp2s0 +iface wlp1s0 inet manual + wpa-roam /etc/wpa_supplicant/wpa_supplicant.conf +iface default inet dhcp diff --git a/music/.local/bin/music_toggle b/music/.local/bin/music_toggle index eaddd60..5cb654f 100755 --- a/music/.local/bin/music_toggle +++ b/music/.local/bin/music_toggle @@ -8,6 +8,12 @@ then elif cmus-remote -Q then cmus-remote --pause +elif dbus-send --session --dest=org.freedesktop.DBus --type=method_call \ + --print-reply /org/freedesktop/DBus org.freedesktop.DBus.ListNames\ + | grep -q "org\.mpris\.MediaPlayer2\.spotify" +then + dbus-send --print-reply --dest=org.mpris.MediaPlayer2.spotify\ + /org/mpris/MediaPlayer2 org.mpris.MediaPlayer2.Player.PlayPause else echo "$(date) $0: no music player detected" fi diff --git a/pkgs.sh b/pkgs.sh index 079bc06..b750f3c 100644 --- a/pkgs.sh +++ b/pkgs.sh @@ -18,7 +18,6 @@ sudo apt-get install \ pass \ pinentry-qt \ psmisc \ - slop \ stow \ suckless-tools \ tmux \ diff --git a/shell/.bashrc b/shell/.bashrc index 979ba98..a2db357 100644 --- a/shell/.bashrc +++ b/shell/.bashrc @@ -22,29 +22,22 @@ export NOTMUCH_CONFIG="${XDG_CONFIG_HOME:-$HOME/.config}"/notmuch/config export PASSWORD_STORE_DIR="${XDG_DATA_HOME:-$HOME/.local/share}"/pass export TMUX_TMPDIR="$XDG_RUNTIME_DIR" -if [ "$SCHROOT_CHROOT_NAME" = "x86" ] -then - export CLEAN_HOME=/opt/clean-x86 -else - export CLEAN_HOME=/opt/clean-x64 -fi +export PATH=~/.local/bin:~/.nitrile/bin:~/.cabal/bin:/opt/firefox:$PATH +export PATH=/opt/texlive/2024/bin/x86_64-linux:$PATH +export PATH=/opt/Zotero_linux-x86_64:$PATH +export PATH=/opt/arduino/arduino-1.8.19:$PATH -export PATH=$CLEAN_HOME/bin:~/.local/bin:$PATH -export PATH=/opt/texlive/2021/bin/x86_64-linux:/opt/zotero:/opt/arduino:/opt/beets/bin:/opt/firefox:$PATH - -export MANPATH=~/.local/share/man:/opt/texlive/2021/texmf-dist/doc/man:/opt/arduino/java/man:$MANPATH +export MANPATH=~/.local/share/man:/opt/texlive/2024/texmf-dist/doc/man:/opt/arduino/java/man:$MANPATH +export INFOPATH=/opt/texlive/2024/texmf-dist/doc/info:$INFOPATH #export GTK_IM_MODULE=xim #export QT_IM_MODULE=xim #export QT_QPA_PLATFORMTHEME=qt5ct -export NNTPSERVER=news.tweak.nl -alias slrn="slrn -i \"${XDG_CONFIG_HOME:-$HOME/.config}/slrn/slrnrc\"" - alias ls='ls --color=auto' alias grep='grep --color=auto' alias vi='vim' -alias shutdown="echo \"Are you sure? I\'m Ygdrassil\" && read && shutdown" +alias kmfbmagp=tmuxmail if [ -f /etc/bash_completion ] then diff --git a/shell/.local/bin/tmuxmail b/shell/.local/bin/tmuxmail index a0ff713..50d4ad0 100755 --- a/shell/.local/bin/tmuxmail +++ b/shell/.local/bin/tmuxmail @@ -1,9 +1,10 @@ #!/bin/sh tmux -f ~/.config/tmux/config\ - new-session -s mail -d 'update && offlineimap' \;\ - new-window 'mutt' \;\ - new-window 'ssh ygdrassil' \;\ - new-session -s work \;\ - attach-session -t mail \;\ + new-session -s mail -d 'offlineimap -a net' \;\ + split-window -h 'offlineimap -a ru' \;\ + split-window -v 'update' \;\ + new-window 'mutt' \;\ + new-session -s work \;\ + attach-session -t mail \;\ select-window -t:1 exec tmux attach diff --git a/shell/.local/bin/update b/shell/.local/bin/update index 946edc8..0321d45 100755 --- a/shell/.local/bin/update +++ b/shell/.local/bin/update @@ -1,8 +1,7 @@ #!/bin/sh NUL=">/dev/null 2>&1" -offlineimap -o -u ttyui -vdirsyncer sync --max-workers=1 +vdirsyncer sync cmd() { echo -n 'apt-get update && apt-get dist-upgrade && ' diff --git a/udev/backlight.rules b/udev/backlight.rules new file mode 100644 index 0000000..5440ae6 --- /dev/null +++ b/udev/backlight.rules @@ -0,0 +1 @@ +ACTION=="add", SUBSYSTEM=="backlight", RUN+="/bin/chgrp video $sys$devpath/brightness", RUN+="/bin/chmod g+w $sys$devpath/brightness" diff --git a/vim/.vim/after/ftplugin/tex.vim b/vim/.vim/after/ftplugin/tex.vim index 4743f66..8c8e004 100644 --- a/vim/.vim/after/ftplugin/tex.vim +++ b/vim/.vim/after/ftplugin/tex.vim @@ -6,7 +6,11 @@ setlocal colorcolumn=0 let g:vimtex_toc_enabled = 1 let g:vimtex_toc_help = 0 let g:vimtex_toc_refresh_always = 1 +let g:vimtex_subfile_start_local = 1 -let g:vimtex_view_general_viewer = 'okular' -let g:vimtex_view_general_options = '--unique file:@pdf\#src:@line@tex' -let g:vimtex_view_general_options_latexmk = '--unique' +let g:vimtex_view_general_viewer = 'evince' + +"let g:vimtex_indent_ignored_envs = [ +" \ 'document', +" \ 'lst.*', +" \] diff --git a/vim/.vim/after/plugin/vimwiki-git.vim b/vim/.vim/after/plugin/vimwiki-git.vim new file mode 100644 index 0000000..680190e --- /dev/null +++ b/vim/.vim/after/plugin/vimwiki-git.vim @@ -0,0 +1,18 @@ +" vim:tabstop=2:shiftwidth=2:expandtab:textwidth=99 +" Vimwiki support for having your wiki directory as a git repo. + +" We add to the vimwiki group +if exists("g:vimwiki_list") + for w in g:vimwiki_list + augroup vimwiki + let home = w['path']."/index.wiki" + " Make sure this window's working dir is the wiki repo dir whenever home.md is opened + au! BufRead home lcd w['path']; echo "enabling vimwiki autogit"; + " Also do a git pull whenever home.md is opened + au BufRead home !git pull + let wikifiles = w['path'] . "/*" + " After writing to any file in the wiki dir, add all files in the repo, commit and push + au! BufWritePost wikifiles !git add .;git commit -m "Autocommit and push"; git push + augroup END + endfor +endif diff --git a/vim/.vim/pack/plugins/start/vim-LanguageTool b/vim/.vim/pack/plugins/start/vim-LanguageTool new file mode 160000 index 0000000..0372ffa --- /dev/null +++ b/vim/.vim/pack/plugins/start/vim-LanguageTool @@ -0,0 +1 @@ +Subproject commit 0372ffae78aa3eac3bfa48ba3bf2f4015a86385a diff --git a/vim/.vim/pack/plugins/start/vim-spl b/vim/.vim/pack/plugins/start/vim-spl deleted file mode 160000 index 6b49975..0000000 --- a/vim/.vim/pack/plugins/start/vim-spl +++ /dev/null @@ -1 +0,0 @@ -Subproject commit 6b4997596f0c1a891dd08745a68cbcc4bbf68bdf diff --git a/vim/.vim/pack/plugins/start/vimtex b/vim/.vim/pack/plugins/start/vimtex index cf6ac50..c77ec4e 160000 --- a/vim/.vim/pack/plugins/start/vimtex +++ b/vim/.vim/pack/plugins/start/vimtex @@ -1 +1 @@ -Subproject commit cf6ac500f45d7cce4a52d6bdb4ecbec811922fbc +Subproject commit c77ec4e15768ffcb97a96d1bf2df1ef58e94acdd diff --git a/vim/.vim/pack/plugins/start/vimwiki b/vim/.vim/pack/plugins/start/vimwiki new file mode 160000 index 0000000..09804c2 --- /dev/null +++ b/vim/.vim/pack/plugins/start/vimwiki @@ -0,0 +1 @@ +Subproject commit 09804c2a5f1009fde29e32c5f3a6093e4684433a diff --git a/vim/.vim/spell/en.utf-8.add b/vim/.vim/spell/en.utf-8.add index d0c03a5..8457f37 100644 --- a/vim/.vim/spell/en.utf-8.add +++ b/vim/.vim/spell/en.utf-8.add @@ -29,3 +29,13 @@ tagless Brightspace GitLab metaprogramming +quasiquotion +quasiquotation +quasiquoter +Radboud +Nijmegen +quasiquoters +capturable +reification +reifies +tierless diff --git a/vim/.vimrc b/vim/.vimrc index d2a798e..4eeb400 100644 --- a/vim/.vimrc +++ b/vim/.vimrc @@ -1,7 +1,6 @@ " Some general options syntax enable filetype indent plugin on -color torte " Settings set encoding=utf-8 @@ -62,13 +61,6 @@ map Q set foldmethod=marker set foldlevelstart=99 -" Unbind arrow keys, who has them anyway on the keyboard... -for prefix in ['i', 'n', 'v'] - for key in ['', '', '', ''] - exe prefix . "noremap " . key . " " - endfor -endfor - " GPG options let g:GPGPreferArmor=1 let g:GPGPreferSign=1 @@ -85,3 +77,6 @@ let g:syntastic_check_on_wq = 0 " Vimwiki let g:vimwiki_list = [{'path': '~/projects/kaartenbak'}] + +" Language tools +let g:languagetool_jar = '/opt/LanguageTool-5.5/languagetool-commandline.jar' diff --git a/x/.XCompose b/x/.XCompose index cd02517..4543f3d 100644 --- a/x/.XCompose +++ b/x/.XCompose @@ -160,6 +160,7 @@ include "%L" : "∃" U2203 : "∄" U2204 : "∀" U2200 + : "⊥" U2200 # Genders : "♂" U2642 diff --git a/x/.local/bin/dock.sh b/x/.local/bin/dock.sh index b05de71..91d5037 100755 --- a/x/.local/bin/dock.sh +++ b/x/.local/bin/dock.sh @@ -5,4 +5,10 @@ setxkbmap dvorak,ru ,phonetic_dvorak compose:ralt,grp:shifts_toggle,grp_led:scro sudo ifdown enp0s31f6 sudo ifdown wlp1s0 sudo ifup enp0s31f6 +if ! ping -w 3 192.168.1.101 +then + echo "ygdrassil wasn't awake, waking up" + wakeonlan 78:F2:9E:90:8B:3A + sleep 5 +fi mount /mnt/data diff --git a/x/.local/bin/music_toggle b/x/.local/bin/music_toggle new file mode 100755 index 0000000..a6eeafd --- /dev/null +++ b/x/.local/bin/music_toggle @@ -0,0 +1,16 @@ +#!/bin/sh + +# quodlibet +if hash quodlibet && quodlibet --status +then + quodlibet --play-pause + # or: + # dbus-send --print-reply --dest=net.sacredchao.QuodLibet /net/sacredchao/QuodLibet net.sacredchao.QuodLibet.PlayPause +fi + + +# spotify +if dbus-send --print-reply --dest=org.freedesktop.DBus /org/freedesktop/DBus org.freedesktop.DBus.ListNames | grep -q '"org.mpris.MediaPlayer2.spotify"' +then + dbus-send --print-reply --dest=org.mpris.MediaPlayer2.spotify /org/mpris/MediaPlayer2 org.mpris.MediaPlayer2.Player.PlayPause +fi diff --git a/x/.local/bin/scr b/x/.local/bin/scr index bcbbda3..c54bf98 100755 --- a/x/.local/bin/scr +++ b/x/.local/bin/scr @@ -2,4 +2,4 @@ [ "$#" -ne 1 ] && CROP="" || CROP="-window root" URL="scr/$(date +%F_%H-%M-%S).png" import $CROP png:- | ssh helheim2 cat \> /var/www/martlubbers.net/$URL -echo "http://martlubbers.net/$URL" | cloo.gl | xclip -f | xargs -I{} notify-send {} +echo "http://martlubbers.net/$URL" | xclip -f | xargs -I{} notify-send {} diff --git a/x/.local/bin/undock.sh b/x/.local/bin/undock.sh index 6b3e0af..63bdc0a 100755 --- a/x/.local/bin/undock.sh +++ b/x/.local/bin/undock.sh @@ -7,5 +7,5 @@ setxkbmap -option setxkbmap dvorak,ru ,phonetic_dvorak ctrl:swapcaps,compose:ralt,grp:shifts_toggle,grp_led:scroll if mountpoint /mnt/data then - umount /mnt/data + umount -l /mnt/data fi diff --git a/x/.local/bin/xrandr-extend-hdmi.sh b/x/.local/bin/xrandr-extend-hdmi.sh index e567214..eec88a8 100755 --- a/x/.local/bin/xrandr-extend-hdmi.sh +++ b/x/.local/bin/xrandr-extend-hdmi.sh @@ -1,2 +1,11 @@ #!/bin/sh -xrandr --output eDP-1 --auto --output HDMI-1 --right-of eDP-1 --auto +for ex in DP2-1 DP2 DP1 HDMI1 HDMI-1 HDMI2 HDMI-2 +do + if xrandr | grep -q "$ex connected" + then + echo "$ex detected" + xrandr --output eDP1 --auto --output $ex --right-of eDP1 --auto + exit 0 + fi +done +echo "No external screen detected" diff --git a/x/.local/bin/xrandr-only-laptop.sh b/x/.local/bin/xrandr-only-laptop.sh index 3060bbd..7c68941 100755 --- a/x/.local/bin/xrandr-only-laptop.sh +++ b/x/.local/bin/xrandr-only-laptop.sh @@ -1,2 +1,2 @@ #!/bin/sh -xrandr --output eDP-1 --auto --output HDMI-1 --off +xrandr --output eDP1 --auto --output HDMI1 --off --output DP2-1 --off diff --git a/x/.local/share/dwm/autostart.sh b/x/.local/share/dwm/autostart.sh new file mode 100755 index 0000000..c6a6cdf --- /dev/null +++ b/x/.local/share/dwm/autostart.sh @@ -0,0 +1,3 @@ +#!/bin/sh +sleep 2 +setxkbmap dvorak,ru ,phonetic_dvorak ctrl:swapcaps,compose:ralt,grp:shifts_toggle,grp_led:scroll diff --git a/x/.xinitrc b/x/.xinitrc index d807ad9..a4b5ea8 100755 --- a/x/.xinitrc +++ b/x/.xinitrc @@ -16,7 +16,15 @@ slstatus & # compositor xcompmgr -a -c -l0 -t0 -r0 -o.00 & -setxkbmap dvorak,ru ,phonetic_dvorak compose:ralt,grp:shifts_toggle,grp_led:scroll,ctrl:swapcaps +# network manager applet +nm-applet & + +# slack........................ +export BROWSER=firefox +slack -u -s & + +# signal....................... +signal --use-tray-icon --start-in-tray # Other system wide xinit files if [ -f /etc/X11/xinit/xinitrc ]; then diff --git a/xorg.conf.d/20-intel.conf b/xorg.conf.d/20-intel.conf new file mode 100644 index 0000000..27c5d8a --- /dev/null +++ b/xorg.conf.d/20-intel.conf @@ -0,0 +1,5 @@ +Section "Device" + Identifier "Intel Graphics" + Driver "intel" + Option "Backlight" "intel_backlight" +EndSection diff --git a/20-keyboard.conf b/xorg.conf.d/30-keyboard.conf similarity index 100% rename from 20-keyboard.conf rename to xorg.conf.d/30-keyboard.conf