Merge branch 'master' into dependabot/github_actions/DeterminateSystems/magic-nix-cache-action-8
This commit is contained in:
commit
86fed9ef3e
85 changed files with 2740 additions and 12679 deletions
4
.github/workflows/flake-update.yml
vendored
4
.github/workflows/flake-update.yml
vendored
|
@ -14,9 +14,9 @@ jobs:
|
|||
- uses: actions/checkout@v4
|
||||
with:
|
||||
fetch-depth: 0
|
||||
- uses: DeterminateSystems/nix-installer-action@v13
|
||||
- uses: DeterminateSystems/nix-installer-action@v14
|
||||
- uses: DeterminateSystems/magic-nix-cache-action@v8
|
||||
- uses: DeterminateSystems/update-flake-lock@v23
|
||||
- uses: DeterminateSystems/update-flake-lock@v24
|
||||
with:
|
||||
pr-title: "chore: update flake.lock"
|
||||
# Labels to be set on the PR
|
||||
|
|
|
@ -1,8 +0,0 @@
|
|||
keys:
|
||||
- &host_sakotop age1nhj5fz9cakgd6rrkwpjkndra6fd4rqxgfvcrap5g0anwxgmh4yqspvf22y
|
||||
|
||||
creation_rules:
|
||||
- path_regex: hosts/sakotop/secrets/[^/]+\.(yaml|json|env|ini)$
|
||||
key_groups:
|
||||
- age:
|
||||
- *host_sakotop
|
12
README.md
12
README.md
|
@ -1,3 +1,4 @@
|
|||
|
||||
# My Dotfiles!
|
||||
|
||||
[![built with nix](https://builtwithnix.org/badge.svg)](https://builtwithnix.org)
|
||||
|
@ -5,14 +6,3 @@
|
|||
|
||||
TODO:: Make this better lmfao
|
||||
TODO::TODO:: Get markdown preview for emacs silly!
|
||||
|
||||
## Credits
|
||||
|
||||
[Misterio77/nix-starter-configs2](https://github.com/Misterio77/nix-starter-configs)
|
||||
[pull request for a bug](https://github.com/Misterio77/nix-starter-configs/pull/34/commits/2a5f3ca3dde606b83ea30b5507347bf989819301)<br></br>
|
||||
[doom emacs guy -> hlissner/dotfiles](https://github.com/hlissner/dotfiles)<br></br>
|
||||
^ reason i found out about nixos <br></br>
|
||||
[nixos.wiki (unofficial)](https://nixos.wiki/)
|
||||
[colemickens/nixcfg](https://github.com/colemickens/nixcfg)
|
||||
[NotAShelf](https://github.com/NotAShelf) - config really helps, also helped me setup nix for a couple of things
|
||||
[Fsnkty](https://github.com/fsnkty)
|
||||
|
|
|
@ -15,20 +15,53 @@ const date = Variable("", {
|
|||
// so to make a reuseable widget, make it a function
|
||||
// then you can simply instantiate one by calling it
|
||||
|
||||
function Workspaces() {
|
||||
const activeId = hyprland.active.workspace.bind("id")
|
||||
const workspaces = hyprland.bind("workspaces")
|
||||
.as(ws => ws.map(({ id }) => Widget.Button({
|
||||
on_clicked: () => hyprland.messageAsync(`dispatch workspace ${id}`),
|
||||
child: Widget.Label(`${id}`),
|
||||
class_name: activeId.as(i => `${i === id ? "focused" : ""}`),
|
||||
})))
|
||||
// function Workspaces() {
|
||||
// const activeId = hyprland.active.workspace.bind("id")
|
||||
// const workspaces = hyprland.bind("workspaces")
|
||||
// .as(ws => ws.map(({ id }) => Widget.Button({
|
||||
// on_clicked: () => hyprland.messageAsync(`dispatch workspace ${id}`),
|
||||
// child: Widget.Label(`${id}`),
|
||||
// class_name: activeId.as(i => `${i === id ? "focused" : ""}`),
|
||||
// })))
|
||||
|
||||
return Widget.Box({
|
||||
class_name: "workspaces",
|
||||
children: workspaces,
|
||||
// return Widget.Box({
|
||||
// class_name: "workspaces",
|
||||
// children: workspaces,
|
||||
// })
|
||||
// }
|
||||
|
||||
const dispatch = ws => hyprland.sendMessage(`dispatch workspace ${ws}`);
|
||||
|
||||
export const Workspaces = () => Widget.EventBox({
|
||||
child: Widget.Box({
|
||||
children: Array.from({ length: 10 }, (_, i) => i + 1).map(i => Widget.Button({
|
||||
class_name: "workspace-buttons",
|
||||
attribute: i,
|
||||
// Keeps button from expanding to fit its container
|
||||
onClicked: () => dispatch(i),
|
||||
child: Widget.Box({
|
||||
class_name: "workspace-indicator",
|
||||
// vpack: "start",
|
||||
vpack: "center",
|
||||
hpack: "center",
|
||||
children: [
|
||||
Widget.Label({
|
||||
label: `${i}`,
|
||||
justification: "center",
|
||||
})
|
||||
}
|
||||
],
|
||||
setup: self => self.hook(hyprland, () => {
|
||||
// The "?" is used here to return "undefined" if the workspace doesn't exist
|
||||
self.toggleClassName('workspace-inactive', (hyprland.getWorkspace(i)?.windows || 0) === 0);
|
||||
self.toggleClassName('workspace-occupied', (hyprland.getWorkspace(i)?.windows || 0) > 0);
|
||||
self.toggleClassName('workspace-active', hyprland.active.workspace.id === i);
|
||||
// self.toggleClassName('workspace-large', (hyprland.getWorkspace(i)?.windows || 0) > 1);
|
||||
}),
|
||||
}),
|
||||
|
||||
})),
|
||||
}),
|
||||
});
|
||||
|
||||
|
||||
function ClientTitle() {
|
||||
|
@ -128,22 +161,38 @@ function Volume() {
|
|||
|
||||
|
||||
function BatteryLabel() {
|
||||
const value = battery.bind("percent").as(p => p > 0 ? p / 100 : 0)
|
||||
const icon = battery.bind("percent").as(p =>
|
||||
`battery-level-${Math.floor(p / 10) * 10}-symbolic`)
|
||||
const icons = {
|
||||
80: "full",
|
||||
50: "good",
|
||||
30: "low",
|
||||
10: "empty",
|
||||
};
|
||||
const value = battery.bind("percent").as(p => p > 0 ? p / 100 : 0);
|
||||
// const icon = battery.bind("percent").as(p =>
|
||||
// `battery-level-${Math.floor(p / 10) * 10}-symbolic`)
|
||||
|
||||
const percent = battery.bind("percent").as(x => x.toString()) + "%"
|
||||
const percent = battery.bind("percent").as(x => x.toString()) + "%";
|
||||
|
||||
function getIcon() {
|
||||
const icon = [80, 50, 30, 10].find(threshold => threshold <= battery.percent);
|
||||
|
||||
return `battery-${icons[icon]}-symbolic`;
|
||||
}
|
||||
|
||||
const icon = Widget.Icon({
|
||||
icon: Utils.watch(getIcon(), battery, getIcon),
|
||||
});
|
||||
|
||||
return Widget.Box({
|
||||
class_name: "battery",
|
||||
visible: battery.bind("available"),
|
||||
children: [
|
||||
Widget.Icon({ icon }),
|
||||
icon,
|
||||
Widget.Label({
|
||||
label: battery.bind('percent').as(x => x.toString()),
|
||||
})
|
||||
],
|
||||
})
|
||||
});
|
||||
}
|
||||
|
||||
|
||||
|
@ -168,7 +217,7 @@ function Left() {
|
|||
spacing: 8,
|
||||
children: [
|
||||
Workspaces(),
|
||||
ClientTitle(),
|
||||
// ClientTitle(),
|
||||
],
|
||||
})
|
||||
}
|
||||
|
@ -201,8 +250,8 @@ function Bar(monitor = 0) {
|
|||
name: `bar-${monitor}`, // name has to be unique
|
||||
class_name: "bar",
|
||||
monitor,
|
||||
anchor: ["top", "left", "right"],
|
||||
margins: [5, 10, 0, 10],
|
||||
anchor: ["bottom", "left", "right"],
|
||||
margins: [0, 10, 0, 10],
|
||||
exclusivity: "exclusive",
|
||||
child: Widget.CenterBox({
|
||||
start_widget: Left(),
|
||||
|
|
|
@ -3,43 +3,69 @@
|
|||
}
|
||||
|
||||
window.bar {
|
||||
background-color: @theme_bg_color;
|
||||
/* background-color: @theme_bg_color; */
|
||||
background: rgba(0, 0, 0, .1);
|
||||
color: @theme_fg_color;
|
||||
min-height: 10rem;
|
||||
border: 2px solid #ea4c88;
|
||||
border-bottom: none;
|
||||
border-radius: 6px 6px 0px 0px;
|
||||
}
|
||||
|
||||
button {
|
||||
min-width: 0;
|
||||
padding-top: 0;
|
||||
padding-bottom: 0;
|
||||
border: none;
|
||||
/* padding-top: 0;
|
||||
padding-bottom: 0; */
|
||||
background-color: transparent;
|
||||
border-bottom: 3px solid transparent;
|
||||
padding: 5px;
|
||||
padding-left: 10px;
|
||||
padding-right: 10px;
|
||||
border: none;
|
||||
background: none;
|
||||
}
|
||||
|
||||
button:active {
|
||||
background-color: @theme_selected_bg_color;
|
||||
background-color: #ea4c88;
|
||||
}
|
||||
|
||||
button:hover {
|
||||
border-bottom: 3px solid @theme_fg_color;
|
||||
/* border-bottom: 1px solid @theme_fg_color; */
|
||||
}
|
||||
|
||||
label {
|
||||
font-weight: bold;
|
||||
}
|
||||
|
||||
.workspaces button.focused {
|
||||
border-bottom: 3px solid @theme_selected_bg_color;
|
||||
}
|
||||
|
||||
.client-title {
|
||||
color: @theme_selected_bg_color;
|
||||
color: #ea4c88;
|
||||
}
|
||||
|
||||
.notification {
|
||||
color: yellow;
|
||||
}
|
||||
|
||||
.workspace-indicator {
|
||||
min-width: 0;
|
||||
padding-top: 0;
|
||||
padding-bottom: 0;
|
||||
margin: 0;
|
||||
background-color: transparent;
|
||||
padding-bottom: 2px;
|
||||
}
|
||||
|
||||
.workspace-inactive {
|
||||
opacity: 0.5;
|
||||
}
|
||||
|
||||
.workspace-occupied {
|
||||
opacity: 1;
|
||||
}
|
||||
|
||||
.workspace-active {
|
||||
border-bottom: 2px solid #ea4c88;
|
||||
padding-bottom: 0;
|
||||
}
|
||||
|
||||
levelbar block,
|
||||
highlight {
|
||||
min-height: 10px;
|
||||
|
|
Binary file not shown.
Before Width: | Height: | Size: 8.4 KiB After Width: | Height: | Size: 69 KiB |
BIN
config/background5.png
Normal file
BIN
config/background5.png
Normal file
Binary file not shown.
After Width: | Height: | Size: 8.4 KiB |
|
@ -1,38 +0,0 @@
|
|||
MIT/X Consortium License
|
||||
|
||||
© 2006-2019 Anselm R Garbe <anselm@garbe.ca>
|
||||
© 2006-2009 Jukka Salmi <jukka at salmi dot ch>
|
||||
© 2006-2007 Sander van Dijk <a dot h dot vandijk at gmail dot com>
|
||||
© 2007-2011 Peter Hartlich <sgkkr at hartlich dot com>
|
||||
© 2007-2009 Szabolcs Nagy <nszabolcs at gmail dot com>
|
||||
© 2007-2009 Christof Musik <christof at sendfax dot de>
|
||||
© 2007-2009 Premysl Hruby <dfenze at gmail dot com>
|
||||
© 2007-2008 Enno Gottox Boland <gottox at s01 dot de>
|
||||
© 2008 Martin Hurton <martin dot hurton at gmail dot com>
|
||||
© 2008 Neale Pickett <neale dot woozle dot org>
|
||||
© 2009 Mate Nagy <mnagy at port70 dot net>
|
||||
© 2010-2016 Hiltjo Posthuma <hiltjo@codemadness.org>
|
||||
© 2010-2012 Connor Lane Smith <cls@lubutu.com>
|
||||
© 2011 Christoph Lohmann <20h@r-36.net>
|
||||
© 2015-2016 Quentin Rameau <quinq@fifth.space>
|
||||
© 2015-2016 Eric Pruitt <eric.pruitt@gmail.com>
|
||||
© 2016-2017 Markus Teich <markus.teich@stusta.mhn.de>
|
||||
© 2020-2022 Chris Down <chris@chrisdown.name>
|
||||
|
||||
Permission is hereby granted, free of charge, to any person obtaining a
|
||||
copy of this software and associated documentation files (the "Software"),
|
||||
to deal in the Software without restriction, including without limitation
|
||||
the rights to use, copy, modify, merge, publish, distribute, sublicense,
|
||||
and/or sell copies of the Software, and to permit persons to whom the
|
||||
Software is furnished to do so, subject to the following conditions:
|
||||
|
||||
The above copyright notice and this permission notice shall be included in
|
||||
all copies or substantial portions of the Software.
|
||||
|
||||
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
||||
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
||||
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
|
||||
THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
||||
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
|
||||
FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
|
||||
DEALINGS IN THE SOFTWARE.
|
|
@ -1,51 +0,0 @@
|
|||
# dwm - dynamic window manager
|
||||
# See LICENSE file for copyright and license details.
|
||||
|
||||
include config.mk
|
||||
|
||||
SRC = drw.c dwm.c util.c
|
||||
OBJ = ${SRC:.c=.o}
|
||||
|
||||
all: options dwm
|
||||
|
||||
options:
|
||||
@echo dwm build options:
|
||||
@echo "CFLAGS = ${CFLAGS}"
|
||||
@echo "LDFLAGS = ${LDFLAGS}"
|
||||
@echo "CC = ${CC}"
|
||||
|
||||
.c.o:
|
||||
${CC} -c ${CFLAGS} $<
|
||||
|
||||
${OBJ}: config.h config.mk
|
||||
|
||||
config.h:
|
||||
cp config.def.h $@
|
||||
|
||||
dwm: ${OBJ}
|
||||
${CC} -o $@ ${OBJ} ${LDFLAGS}
|
||||
|
||||
clean:
|
||||
rm -f dwm ${OBJ} dwm-${VERSION}.tar.gz
|
||||
|
||||
dist: clean
|
||||
mkdir -p dwm-${VERSION}
|
||||
cp -R LICENSE Makefile README config.def.h config.mk\
|
||||
dwm.1 drw.h util.h ${SRC} dwm.png transient.c dwm-${VERSION}
|
||||
tar -cf dwm-${VERSION}.tar dwm-${VERSION}
|
||||
gzip dwm-${VERSION}.tar
|
||||
rm -rf dwm-${VERSION}
|
||||
|
||||
install: all
|
||||
mkdir -p ${DESTDIR}${PREFIX}/bin
|
||||
cp -f dwm ${DESTDIR}${PREFIX}/bin
|
||||
chmod 755 ${DESTDIR}${PREFIX}/bin/dwm
|
||||
mkdir -p ${DESTDIR}${MANPREFIX}/man1
|
||||
sed "s/VERSION/${VERSION}/g" < dwm.1 > ${DESTDIR}${MANPREFIX}/man1/dwm.1
|
||||
chmod 644 ${DESTDIR}${MANPREFIX}/man1/dwm.1
|
||||
|
||||
uninstall:
|
||||
rm -f ${DESTDIR}${PREFIX}/bin/dwm\
|
||||
${DESTDIR}${MANPREFIX}/man1/dwm.1
|
||||
|
||||
.PHONY: all options clean dist install uninstall
|
|
@ -1,48 +0,0 @@
|
|||
dwm - dynamic window manager
|
||||
============================
|
||||
dwm is an extremely fast, small, and dynamic window manager for X.
|
||||
|
||||
|
||||
Requirements
|
||||
------------
|
||||
In order to build dwm you need the Xlib header files.
|
||||
|
||||
|
||||
Installation
|
||||
------------
|
||||
Edit config.mk to match your local setup (dwm is installed into
|
||||
the /usr/local namespace by default).
|
||||
|
||||
Afterwards enter the following command to build and install dwm (if
|
||||
necessary as root):
|
||||
|
||||
make clean install
|
||||
|
||||
|
||||
Running dwm
|
||||
-----------
|
||||
Add the following line to your .xinitrc to start dwm using startx:
|
||||
|
||||
exec dwm
|
||||
|
||||
In order to connect dwm to a specific display, make sure that
|
||||
the DISPLAY environment variable is set correctly, e.g.:
|
||||
|
||||
DISPLAY=foo.bar:1 exec dwm
|
||||
|
||||
(This will start dwm on display :1 of the host foo.bar.)
|
||||
|
||||
In order to display status info in the bar, you can do something
|
||||
like this in your .xinitrc:
|
||||
|
||||
while xsetroot -name "`date` `uptime | sed 's/.*,//'`"
|
||||
do
|
||||
sleep 1
|
||||
done &
|
||||
exec dwm
|
||||
|
||||
|
||||
Configuration
|
||||
-------------
|
||||
The configuration of dwm is done by creating a custom config.h
|
||||
and (re)compiling the source code.
|
|
@ -1,131 +0,0 @@
|
|||
/* See LICENSE file for copyright and license details. */
|
||||
|
||||
/* 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[] = { "JetBrainsMono NF:size=10" };
|
||||
static const char dmenufont[] = "monospace:size=10";
|
||||
// default colors
|
||||
static const char col_gray1[] = "#222222";
|
||||
static const char col_gray2[] = "#444444";
|
||||
static const char col_gray3[] = "#bbbbbb";
|
||||
static const char col_gray4[] = "#eeeeee";
|
||||
static const char col_cyan[] = "#005577";
|
||||
// default colors
|
||||
static const char *colors[][3] = {
|
||||
/* fg bg border */
|
||||
[SchemeNorm] = { col_gray3, col_gray1, col_gray2 },
|
||||
[SchemeSel] = { col_gray4, col_cyan, col_cyan },
|
||||
};
|
||||
|
||||
static const char *const autostart[] = {
|
||||
"picom", NULL,
|
||||
"keepassxc", NULL,
|
||||
"nm-applet", NULL,
|
||||
"blueman-applet", NULL,
|
||||
NULL /* terminate */
|
||||
};
|
||||
|
||||
/* tagging */
|
||||
static const char *tags[] = { "1", "2", "3", "4", "5", "6", "7", "8", "9" };
|
||||
|
||||
static const Rule rules[] = {
|
||||
/* xprop(1):
|
||||
* WM_CLASS(STRING) = instance, class
|
||||
* WM_NAME(STRING) = title
|
||||
*/
|
||||
/* class instance title tags mask isfloating monitor */
|
||||
{ "Gimp", NULL, NULL, 0, 1, -1 },
|
||||
{ "Firefox", NULL, NULL, 1 << 8, 0, -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 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 */
|
||||
{ "[]=", tile }, /* first entry is default */
|
||||
{ "><>", NULL }, /* no layout function means floating behavior */
|
||||
{ "[M]", monocle },
|
||||
};
|
||||
|
||||
/* key definitions */
|
||||
#define MODKEY Mod4Mask
|
||||
#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 char dmenumon[2] = "0"; /* component of dmenucmd, manipulated in spawn() */
|
||||
static const char *dmenucmd[] = { "dmenu_run", "-m", dmenumon, "-fn", dmenufont, "-nb", col_gray1, "-nf", col_gray3, "-sb", col_cyan, "-sf", col_gray4, NULL };
|
||||
static const char *roficmd[] = { "rofi", "-show-icons", "-show", "drun", NULL };
|
||||
static const char *termcmd[] = { "kitty", NULL };
|
||||
|
||||
static const Key keys[] = {
|
||||
/* modifier key function argument */
|
||||
{ MODKEY, XK_space, spawn, {.v = roficmd } },
|
||||
{ MODKEY, XK_Return, spawn, {.v = termcmd } },
|
||||
{ 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|ShiftMask, XK_Return, zoom, {0} },
|
||||
{ MODKEY, XK_Tab, view, {0} },
|
||||
{ MODKEY, XK_w, 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_p, setlayout, {0} },
|
||||
{ MODKEY|ShiftMask, XK_p, 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 } },
|
||||
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 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]} },
|
||||
{ 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} },
|
||||
};
|
|
@ -1,123 +0,0 @@
|
|||
/* See LICENSE file for copyright and license details. */
|
||||
|
||||
/* 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[] = { "JetBrainsMono NF:size=10" };
|
||||
static const char dmenufont[] = "monospace:size=10";
|
||||
// default colors
|
||||
static const char col_gray1[] = "#222222";
|
||||
static const char col_gray2[] = "#444444";
|
||||
static const char col_gray3[] = "#bbbbbb";
|
||||
static const char col_gray4[] = "#eeeeee";
|
||||
static const char col_cyan[] = "#005577";
|
||||
// default colors
|
||||
static const char *colors[][3] = {
|
||||
/* fg bg border */
|
||||
[SchemeNorm] = { col_gray3, col_gray1, col_gray2 },
|
||||
[SchemeSel] = { col_gray4, col_cyan, col_cyan },
|
||||
};
|
||||
|
||||
/* tagging */
|
||||
static const char *tags[] = { "1", "2", "3", "4", "5", "6", "7", "8", "9" };
|
||||
|
||||
static const Rule rules[] = {
|
||||
/* xprop(1):
|
||||
* WM_CLASS(STRING) = instance, class
|
||||
* WM_NAME(STRING) = title
|
||||
*/
|
||||
/* class instance title tags mask isfloating monitor */
|
||||
{ "Gimp", NULL, NULL, 0, 1, -1 },
|
||||
{ "Firefox", NULL, NULL, 1 << 8, 0, -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 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 */
|
||||
{ "[]=", tile }, /* first entry is default */
|
||||
{ "><>", NULL }, /* no layout function means floating behavior */
|
||||
{ "[M]", monocle },
|
||||
};
|
||||
|
||||
/* key definitions */
|
||||
#define MODKEY Mod4Mask
|
||||
#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 char dmenumon[2] = "0"; /* component of dmenucmd, manipulated in spawn() */
|
||||
static const char *dmenucmd[] = { "dmenu_run", "-m", dmenumon, "-fn", dmenufont, "-nb", col_gray1, "-nf", col_gray3, "-sb", col_cyan, "-sf", col_gray4, NULL };
|
||||
static const char *roficmd[] = { "rofi", "-show-icons", "-show", "drun", NULL };
|
||||
static const char *termcmd[] = { "kitty", NULL };
|
||||
|
||||
static const Key keys[] = {
|
||||
/* modifier key function argument */
|
||||
{ MODKEY, XK_space, spawn, {.v = roficmd } },
|
||||
{ MODKEY, XK_Return, spawn, {.v = termcmd } },
|
||||
{ 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|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_p, setlayout, {0} },
|
||||
{ MODKEY|ShiftMask, XK_p, 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 } },
|
||||
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 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]} },
|
||||
{ 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} },
|
||||
};
|
|
@ -1,39 +0,0 @@
|
|||
# dwm version
|
||||
VERSION = 6.4
|
||||
|
||||
# Customize below to fit your system
|
||||
|
||||
# paths
|
||||
PREFIX = /usr/local
|
||||
MANPREFIX = ${PREFIX}/share/man
|
||||
|
||||
X11INC = /usr/X11R6/include
|
||||
X11LIB = /usr/X11R6/lib
|
||||
|
||||
# Xinerama, comment if you don't want it
|
||||
XINERAMALIBS = -lXinerama
|
||||
XINERAMAFLAGS = -DXINERAMA
|
||||
|
||||
# freetype
|
||||
FREETYPELIBS = -lfontconfig -lXft
|
||||
FREETYPEINC = /usr/include/freetype2
|
||||
# OpenBSD (uncomment)
|
||||
#FREETYPEINC = ${X11INC}/freetype2
|
||||
#MANPREFIX = ${PREFIX}/man
|
||||
|
||||
# includes and libs
|
||||
INCS = -I${X11INC} -I${FREETYPEINC}
|
||||
LIBS = -L${X11LIB} -lX11 ${XINERAMALIBS} ${FREETYPELIBS}
|
||||
|
||||
# flags
|
||||
CPPFLAGS = -D_DEFAULT_SOURCE -D_BSD_SOURCE -D_XOPEN_SOURCE=700L -DVERSION=\"${VERSION}\" ${XINERAMAFLAGS}
|
||||
#CFLAGS = -g -std=c99 -pedantic -Wall -O0 ${INCS} ${CPPFLAGS}
|
||||
CFLAGS = -std=c99 -pedantic -Wall -Wno-deprecated-declarations -Os ${INCS} ${CPPFLAGS}
|
||||
LDFLAGS = ${LIBS}
|
||||
|
||||
# Solaris
|
||||
#CFLAGS = -fast ${INCS} -DVERSION=\"${VERSION}\"
|
||||
#LDFLAGS = ${LIBS}
|
||||
|
||||
# compiler and linker
|
||||
CC = cc
|
|
@ -1,450 +0,0 @@
|
|||
/* See LICENSE file for copyright and license details. */
|
||||
#include <stdio.h>
|
||||
#include <stdlib.h>
|
||||
#include <string.h>
|
||||
#include <X11/Xlib.h>
|
||||
#include <X11/Xft/Xft.h>
|
||||
|
||||
#include "drw.h"
|
||||
#include "util.h"
|
||||
|
||||
#define UTF_INVALID 0xFFFD
|
||||
#define UTF_SIZ 4
|
||||
|
||||
static const unsigned char utfbyte[UTF_SIZ + 1] = {0x80, 0, 0xC0, 0xE0, 0xF0};
|
||||
static const unsigned char utfmask[UTF_SIZ + 1] = {0xC0, 0x80, 0xE0, 0xF0, 0xF8};
|
||||
static const long utfmin[UTF_SIZ + 1] = { 0, 0, 0x80, 0x800, 0x10000};
|
||||
static const long utfmax[UTF_SIZ + 1] = {0x10FFFF, 0x7F, 0x7FF, 0xFFFF, 0x10FFFF};
|
||||
|
||||
static long
|
||||
utf8decodebyte(const char c, size_t *i)
|
||||
{
|
||||
for (*i = 0; *i < (UTF_SIZ + 1); ++(*i))
|
||||
if (((unsigned char)c & utfmask[*i]) == utfbyte[*i])
|
||||
return (unsigned char)c & ~utfmask[*i];
|
||||
return 0;
|
||||
}
|
||||
|
||||
static size_t
|
||||
utf8validate(long *u, size_t i)
|
||||
{
|
||||
if (!BETWEEN(*u, utfmin[i], utfmax[i]) || BETWEEN(*u, 0xD800, 0xDFFF))
|
||||
*u = UTF_INVALID;
|
||||
for (i = 1; *u > utfmax[i]; ++i)
|
||||
;
|
||||
return i;
|
||||
}
|
||||
|
||||
static size_t
|
||||
utf8decode(const char *c, long *u, size_t clen)
|
||||
{
|
||||
size_t i, j, len, type;
|
||||
long udecoded;
|
||||
|
||||
*u = UTF_INVALID;
|
||||
if (!clen)
|
||||
return 0;
|
||||
udecoded = utf8decodebyte(c[0], &len);
|
||||
if (!BETWEEN(len, 1, UTF_SIZ))
|
||||
return 1;
|
||||
for (i = 1, j = 1; i < clen && j < len; ++i, ++j) {
|
||||
udecoded = (udecoded << 6) | utf8decodebyte(c[i], &type);
|
||||
if (type)
|
||||
return j;
|
||||
}
|
||||
if (j < len)
|
||||
return 0;
|
||||
*u = udecoded;
|
||||
utf8validate(u, len);
|
||||
|
||||
return len;
|
||||
}
|
||||
|
||||
Drw *
|
||||
drw_create(Display *dpy, int screen, Window root, unsigned int w, unsigned int h)
|
||||
{
|
||||
Drw *drw = ecalloc(1, sizeof(Drw));
|
||||
|
||||
drw->dpy = dpy;
|
||||
drw->screen = screen;
|
||||
drw->root = root;
|
||||
drw->w = w;
|
||||
drw->h = h;
|
||||
drw->drawable = XCreatePixmap(dpy, root, w, h, DefaultDepth(dpy, screen));
|
||||
drw->gc = XCreateGC(dpy, root, 0, NULL);
|
||||
XSetLineAttributes(dpy, drw->gc, 1, LineSolid, CapButt, JoinMiter);
|
||||
|
||||
return drw;
|
||||
}
|
||||
|
||||
void
|
||||
drw_resize(Drw *drw, unsigned int w, unsigned int h)
|
||||
{
|
||||
if (!drw)
|
||||
return;
|
||||
|
||||
drw->w = w;
|
||||
drw->h = h;
|
||||
if (drw->drawable)
|
||||
XFreePixmap(drw->dpy, drw->drawable);
|
||||
drw->drawable = XCreatePixmap(drw->dpy, drw->root, w, h, DefaultDepth(drw->dpy, drw->screen));
|
||||
}
|
||||
|
||||
void
|
||||
drw_free(Drw *drw)
|
||||
{
|
||||
XFreePixmap(drw->dpy, drw->drawable);
|
||||
XFreeGC(drw->dpy, drw->gc);
|
||||
drw_fontset_free(drw->fonts);
|
||||
free(drw);
|
||||
}
|
||||
|
||||
/* This function is an implementation detail. Library users should use
|
||||
* drw_fontset_create instead.
|
||||
*/
|
||||
static Fnt *
|
||||
xfont_create(Drw *drw, const char *fontname, FcPattern *fontpattern)
|
||||
{
|
||||
Fnt *font;
|
||||
XftFont *xfont = NULL;
|
||||
FcPattern *pattern = NULL;
|
||||
|
||||
if (fontname) {
|
||||
/* Using the pattern found at font->xfont->pattern does not yield the
|
||||
* same substitution results as using the pattern returned by
|
||||
* FcNameParse; using the latter results in the desired fallback
|
||||
* behaviour whereas the former just results in missing-character
|
||||
* rectangles being drawn, at least with some fonts. */
|
||||
if (!(xfont = XftFontOpenName(drw->dpy, drw->screen, fontname))) {
|
||||
fprintf(stderr, "error, cannot load font from name: '%s'\n", fontname);
|
||||
return NULL;
|
||||
}
|
||||
if (!(pattern = FcNameParse((FcChar8 *) fontname))) {
|
||||
fprintf(stderr, "error, cannot parse font name to pattern: '%s'\n", fontname);
|
||||
XftFontClose(drw->dpy, xfont);
|
||||
return NULL;
|
||||
}
|
||||
} else if (fontpattern) {
|
||||
if (!(xfont = XftFontOpenPattern(drw->dpy, fontpattern))) {
|
||||
fprintf(stderr, "error, cannot load font from pattern.\n");
|
||||
return NULL;
|
||||
}
|
||||
} else {
|
||||
die("no font specified.");
|
||||
}
|
||||
|
||||
font = ecalloc(1, sizeof(Fnt));
|
||||
font->xfont = xfont;
|
||||
font->pattern = pattern;
|
||||
font->h = xfont->ascent + xfont->descent;
|
||||
font->dpy = drw->dpy;
|
||||
|
||||
return font;
|
||||
}
|
||||
|
||||
static void
|
||||
xfont_free(Fnt *font)
|
||||
{
|
||||
if (!font)
|
||||
return;
|
||||
if (font->pattern)
|
||||
FcPatternDestroy(font->pattern);
|
||||
XftFontClose(font->dpy, font->xfont);
|
||||
free(font);
|
||||
}
|
||||
|
||||
Fnt*
|
||||
drw_fontset_create(Drw* drw, const char *fonts[], size_t fontcount)
|
||||
{
|
||||
Fnt *cur, *ret = NULL;
|
||||
size_t i;
|
||||
|
||||
if (!drw || !fonts)
|
||||
return NULL;
|
||||
|
||||
for (i = 1; i <= fontcount; i++) {
|
||||
if ((cur = xfont_create(drw, fonts[fontcount - i], NULL))) {
|
||||
cur->next = ret;
|
||||
ret = cur;
|
||||
}
|
||||
}
|
||||
return (drw->fonts = ret);
|
||||
}
|
||||
|
||||
void
|
||||
drw_fontset_free(Fnt *font)
|
||||
{
|
||||
if (font) {
|
||||
drw_fontset_free(font->next);
|
||||
xfont_free(font);
|
||||
}
|
||||
}
|
||||
|
||||
void
|
||||
drw_clr_create(Drw *drw, Clr *dest, const char *clrname)
|
||||
{
|
||||
if (!drw || !dest || !clrname)
|
||||
return;
|
||||
|
||||
if (!XftColorAllocName(drw->dpy, DefaultVisual(drw->dpy, drw->screen),
|
||||
DefaultColormap(drw->dpy, drw->screen),
|
||||
clrname, dest))
|
||||
die("error, cannot allocate color '%s'", clrname);
|
||||
}
|
||||
|
||||
/* Wrapper to create color schemes. The caller has to call free(3) on the
|
||||
* returned color scheme when done using it. */
|
||||
Clr *
|
||||
drw_scm_create(Drw *drw, const char *clrnames[], size_t clrcount)
|
||||
{
|
||||
size_t i;
|
||||
Clr *ret;
|
||||
|
||||
/* need at least two colors for a scheme */
|
||||
if (!drw || !clrnames || clrcount < 2 || !(ret = ecalloc(clrcount, sizeof(XftColor))))
|
||||
return NULL;
|
||||
|
||||
for (i = 0; i < clrcount; i++)
|
||||
drw_clr_create(drw, &ret[i], clrnames[i]);
|
||||
return ret;
|
||||
}
|
||||
|
||||
void
|
||||
drw_setfontset(Drw *drw, Fnt *set)
|
||||
{
|
||||
if (drw)
|
||||
drw->fonts = set;
|
||||
}
|
||||
|
||||
void
|
||||
drw_setscheme(Drw *drw, Clr *scm)
|
||||
{
|
||||
if (drw)
|
||||
drw->scheme = scm;
|
||||
}
|
||||
|
||||
void
|
||||
drw_rect(Drw *drw, int x, int y, unsigned int w, unsigned int h, int filled, int invert)
|
||||
{
|
||||
if (!drw || !drw->scheme)
|
||||
return;
|
||||
XSetForeground(drw->dpy, drw->gc, invert ? drw->scheme[ColBg].pixel : drw->scheme[ColFg].pixel);
|
||||
if (filled)
|
||||
XFillRectangle(drw->dpy, drw->drawable, drw->gc, x, y, w, h);
|
||||
else
|
||||
XDrawRectangle(drw->dpy, drw->drawable, drw->gc, x, y, w - 1, h - 1);
|
||||
}
|
||||
|
||||
int
|
||||
drw_text(Drw *drw, int x, int y, unsigned int w, unsigned int h, unsigned int lpad, const char *text, int invert)
|
||||
{
|
||||
int i, ty, ellipsis_x = 0;
|
||||
unsigned int tmpw, ew, ellipsis_w = 0, ellipsis_len;
|
||||
XftDraw *d = NULL;
|
||||
Fnt *usedfont, *curfont, *nextfont;
|
||||
int utf8strlen, utf8charlen, render = x || y || w || h;
|
||||
long utf8codepoint = 0;
|
||||
const char *utf8str;
|
||||
FcCharSet *fccharset;
|
||||
FcPattern *fcpattern;
|
||||
FcPattern *match;
|
||||
XftResult result;
|
||||
int charexists = 0, overflow = 0;
|
||||
/* keep track of a couple codepoints for which we have no match. */
|
||||
enum { nomatches_len = 64 };
|
||||
static struct { long codepoint[nomatches_len]; unsigned int idx; } nomatches;
|
||||
static unsigned int ellipsis_width = 0;
|
||||
|
||||
if (!drw || (render && (!drw->scheme || !w)) || !text || !drw->fonts)
|
||||
return 0;
|
||||
|
||||
if (!render) {
|
||||
w = invert ? invert : ~invert;
|
||||
} else {
|
||||
XSetForeground(drw->dpy, drw->gc, drw->scheme[invert ? ColFg : ColBg].pixel);
|
||||
XFillRectangle(drw->dpy, drw->drawable, drw->gc, x, y, w, h);
|
||||
d = XftDrawCreate(drw->dpy, drw->drawable,
|
||||
DefaultVisual(drw->dpy, drw->screen),
|
||||
DefaultColormap(drw->dpy, drw->screen));
|
||||
x += lpad;
|
||||
w -= lpad;
|
||||
}
|
||||
|
||||
usedfont = drw->fonts;
|
||||
if (!ellipsis_width && render)
|
||||
ellipsis_width = drw_fontset_getwidth(drw, "...");
|
||||
while (1) {
|
||||
ew = ellipsis_len = utf8strlen = 0;
|
||||
utf8str = text;
|
||||
nextfont = NULL;
|
||||
while (*text) {
|
||||
utf8charlen = utf8decode(text, &utf8codepoint, UTF_SIZ);
|
||||
for (curfont = drw->fonts; curfont; curfont = curfont->next) {
|
||||
charexists = charexists || XftCharExists(drw->dpy, curfont->xfont, utf8codepoint);
|
||||
if (charexists) {
|
||||
drw_font_getexts(curfont, text, utf8charlen, &tmpw, NULL);
|
||||
if (ew + ellipsis_width <= w) {
|
||||
/* keep track where the ellipsis still fits */
|
||||
ellipsis_x = x + ew;
|
||||
ellipsis_w = w - ew;
|
||||
ellipsis_len = utf8strlen;
|
||||
}
|
||||
|
||||
if (ew + tmpw > w) {
|
||||
overflow = 1;
|
||||
/* called from drw_fontset_getwidth_clamp():
|
||||
* it wants the width AFTER the overflow
|
||||
*/
|
||||
if (!render)
|
||||
x += tmpw;
|
||||
else
|
||||
utf8strlen = ellipsis_len;
|
||||
} else if (curfont == usedfont) {
|
||||
utf8strlen += utf8charlen;
|
||||
text += utf8charlen;
|
||||
ew += tmpw;
|
||||
} else {
|
||||
nextfont = curfont;
|
||||
}
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
if (overflow || !charexists || nextfont)
|
||||
break;
|
||||
else
|
||||
charexists = 0;
|
||||
}
|
||||
|
||||
if (utf8strlen) {
|
||||
if (render) {
|
||||
ty = y + (h - usedfont->h) / 2 + usedfont->xfont->ascent;
|
||||
XftDrawStringUtf8(d, &drw->scheme[invert ? ColBg : ColFg],
|
||||
usedfont->xfont, x, ty, (XftChar8 *)utf8str, utf8strlen);
|
||||
}
|
||||
x += ew;
|
||||
w -= ew;
|
||||
}
|
||||
if (render && overflow)
|
||||
drw_text(drw, ellipsis_x, y, ellipsis_w, h, 0, "...", invert);
|
||||
|
||||
if (!*text || overflow) {
|
||||
break;
|
||||
} else if (nextfont) {
|
||||
charexists = 0;
|
||||
usedfont = nextfont;
|
||||
} else {
|
||||
/* Regardless of whether or not a fallback font is found, the
|
||||
* character must be drawn. */
|
||||
charexists = 1;
|
||||
|
||||
for (i = 0; i < nomatches_len; ++i) {
|
||||
/* avoid calling XftFontMatch if we know we won't find a match */
|
||||
if (utf8codepoint == nomatches.codepoint[i])
|
||||
goto no_match;
|
||||
}
|
||||
|
||||
fccharset = FcCharSetCreate();
|
||||
FcCharSetAddChar(fccharset, utf8codepoint);
|
||||
|
||||
if (!drw->fonts->pattern) {
|
||||
/* Refer to the comment in xfont_create for more information. */
|
||||
die("the first font in the cache must be loaded from a font string.");
|
||||
}
|
||||
|
||||
fcpattern = FcPatternDuplicate(drw->fonts->pattern);
|
||||
FcPatternAddCharSet(fcpattern, FC_CHARSET, fccharset);
|
||||
FcPatternAddBool(fcpattern, FC_SCALABLE, FcTrue);
|
||||
|
||||
FcConfigSubstitute(NULL, fcpattern, FcMatchPattern);
|
||||
FcDefaultSubstitute(fcpattern);
|
||||
match = XftFontMatch(drw->dpy, drw->screen, fcpattern, &result);
|
||||
|
||||
FcCharSetDestroy(fccharset);
|
||||
FcPatternDestroy(fcpattern);
|
||||
|
||||
if (match) {
|
||||
usedfont = xfont_create(drw, NULL, match);
|
||||
if (usedfont && XftCharExists(drw->dpy, usedfont->xfont, utf8codepoint)) {
|
||||
for (curfont = drw->fonts; curfont->next; curfont = curfont->next)
|
||||
; /* NOP */
|
||||
curfont->next = usedfont;
|
||||
} else {
|
||||
xfont_free(usedfont);
|
||||
nomatches.codepoint[++nomatches.idx % nomatches_len] = utf8codepoint;
|
||||
no_match:
|
||||
usedfont = drw->fonts;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
if (d)
|
||||
XftDrawDestroy(d);
|
||||
|
||||
return x + (render ? w : 0);
|
||||
}
|
||||
|
||||
void
|
||||
drw_map(Drw *drw, Window win, int x, int y, unsigned int w, unsigned int h)
|
||||
{
|
||||
if (!drw)
|
||||
return;
|
||||
|
||||
XCopyArea(drw->dpy, drw->drawable, win, drw->gc, x, y, w, h, x, y);
|
||||
XSync(drw->dpy, False);
|
||||
}
|
||||
|
||||
unsigned int
|
||||
drw_fontset_getwidth(Drw *drw, const char *text)
|
||||
{
|
||||
if (!drw || !drw->fonts || !text)
|
||||
return 0;
|
||||
return drw_text(drw, 0, 0, 0, 0, 0, text, 0);
|
||||
}
|
||||
|
||||
unsigned int
|
||||
drw_fontset_getwidth_clamp(Drw *drw, const char *text, unsigned int n)
|
||||
{
|
||||
unsigned int tmp = 0;
|
||||
if (drw && drw->fonts && text && n)
|
||||
tmp = drw_text(drw, 0, 0, 0, 0, 0, text, n);
|
||||
return MIN(n, tmp);
|
||||
}
|
||||
|
||||
void
|
||||
drw_font_getexts(Fnt *font, const char *text, unsigned int len, unsigned int *w, unsigned int *h)
|
||||
{
|
||||
XGlyphInfo ext;
|
||||
|
||||
if (!font || !text)
|
||||
return;
|
||||
|
||||
XftTextExtentsUtf8(font->dpy, font->xfont, (XftChar8 *)text, len, &ext);
|
||||
if (w)
|
||||
*w = ext.xOff;
|
||||
if (h)
|
||||
*h = font->h;
|
||||
}
|
||||
|
||||
Cur *
|
||||
drw_cur_create(Drw *drw, int shape)
|
||||
{
|
||||
Cur *cur;
|
||||
|
||||
if (!drw || !(cur = ecalloc(1, sizeof(Cur))))
|
||||
return NULL;
|
||||
|
||||
cur->cursor = XCreateFontCursor(drw->dpy, shape);
|
||||
|
||||
return cur;
|
||||
}
|
||||
|
||||
void
|
||||
drw_cur_free(Drw *drw, Cur *cursor)
|
||||
{
|
||||
if (!cursor)
|
||||
return;
|
||||
|
||||
XFreeCursor(drw->dpy, cursor->cursor);
|
||||
free(cursor);
|
||||
}
|
|
@ -1,58 +0,0 @@
|
|||
/* See LICENSE file for copyright and license details. */
|
||||
|
||||
typedef struct {
|
||||
Cursor cursor;
|
||||
} Cur;
|
||||
|
||||
typedef struct Fnt {
|
||||
Display *dpy;
|
||||
unsigned int h;
|
||||
XftFont *xfont;
|
||||
FcPattern *pattern;
|
||||
struct Fnt *next;
|
||||
} Fnt;
|
||||
|
||||
enum { ColFg, ColBg, ColBorder }; /* Clr scheme index */
|
||||
typedef XftColor Clr;
|
||||
|
||||
typedef struct {
|
||||
unsigned int w, h;
|
||||
Display *dpy;
|
||||
int screen;
|
||||
Window root;
|
||||
Drawable drawable;
|
||||
GC gc;
|
||||
Clr *scheme;
|
||||
Fnt *fonts;
|
||||
} Drw;
|
||||
|
||||
/* Drawable abstraction */
|
||||
Drw *drw_create(Display *dpy, int screen, Window win, unsigned int w, unsigned int h);
|
||||
void drw_resize(Drw *drw, unsigned int w, unsigned int h);
|
||||
void drw_free(Drw *drw);
|
||||
|
||||
/* Fnt abstraction */
|
||||
Fnt *drw_fontset_create(Drw* drw, const char *fonts[], size_t fontcount);
|
||||
void drw_fontset_free(Fnt* set);
|
||||
unsigned int drw_fontset_getwidth(Drw *drw, const char *text);
|
||||
unsigned int drw_fontset_getwidth_clamp(Drw *drw, const char *text, unsigned int n);
|
||||
void drw_font_getexts(Fnt *font, const char *text, unsigned int len, unsigned int *w, unsigned int *h);
|
||||
|
||||
/* Colorscheme abstraction */
|
||||
void drw_clr_create(Drw *drw, Clr *dest, const char *clrname);
|
||||
Clr *drw_scm_create(Drw *drw, const char *clrnames[], size_t clrcount);
|
||||
|
||||
/* Cursor abstraction */
|
||||
Cur *drw_cur_create(Drw *drw, int shape);
|
||||
void drw_cur_free(Drw *drw, Cur *cursor);
|
||||
|
||||
/* Drawing context manipulation */
|
||||
void drw_setfontset(Drw *drw, Fnt *set);
|
||||
void drw_setscheme(Drw *drw, Clr *scm);
|
||||
|
||||
/* Drawing functions */
|
||||
void drw_rect(Drw *drw, int x, int y, unsigned int w, unsigned int h, int filled, int invert);
|
||||
int drw_text(Drw *drw, int x, int y, unsigned int w, unsigned int h, unsigned int lpad, const char *text, int invert);
|
||||
|
||||
/* Map functions */
|
||||
void drw_map(Drw *drw, Window win, int x, int y, unsigned int w, unsigned int h);
|
|
@ -1,176 +0,0 @@
|
|||
.TH DWM 1 dwm\-VERSION
|
||||
.SH NAME
|
||||
dwm \- dynamic window manager
|
||||
.SH SYNOPSIS
|
||||
.B dwm
|
||||
.RB [ \-v ]
|
||||
.SH DESCRIPTION
|
||||
dwm is a dynamic window manager for X. It manages windows in tiled, monocle
|
||||
and floating layouts. Either layout can be applied dynamically, optimising the
|
||||
environment for the application in use and the task performed.
|
||||
.P
|
||||
In tiled layouts windows are managed in a master and stacking area. The master
|
||||
area on the left contains one window by default, and the stacking area on the
|
||||
right contains all other windows. The number of master area windows can be
|
||||
adjusted from zero to an arbitrary number. In monocle layout all windows are
|
||||
maximised to the screen size. In floating layout windows can be resized and
|
||||
moved freely. Dialog windows are always managed floating, regardless of the
|
||||
layout applied.
|
||||
.P
|
||||
Windows are grouped by tags. Each window can be tagged with one or multiple
|
||||
tags. Selecting certain tags displays all windows with these tags.
|
||||
.P
|
||||
Each screen contains a small status bar which displays all available tags, the
|
||||
layout, the title of the focused window, and the text read from the root window
|
||||
name property, if the screen is focused. A floating window is indicated with an
|
||||
empty square and a maximised floating window is indicated with a filled square
|
||||
before the windows title. The selected tags are indicated with a different
|
||||
color. The tags of the focused window are indicated with a filled square in the
|
||||
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.
|
||||
.SH OPTIONS
|
||||
.TP
|
||||
.B \-v
|
||||
prints version information to stderr, then exits.
|
||||
.SH USAGE
|
||||
.SS Status bar
|
||||
.TP
|
||||
.B X root window name
|
||||
is read and displayed in the status text area. It can be set with the
|
||||
.BR xsetroot (1)
|
||||
command.
|
||||
.TP
|
||||
.B Button1
|
||||
click on a tag label to display all windows with that tag, click on the layout
|
||||
label toggles between tiled and floating layout.
|
||||
.TP
|
||||
.B Button3
|
||||
click on a tag label adds/removes all windows with that tag to/from the view.
|
||||
.TP
|
||||
.B Mod1\-Button1
|
||||
click on a tag label applies that tag to the focused window.
|
||||
.TP
|
||||
.B Mod1\-Button3
|
||||
click on a tag label adds/removes that tag to/from the focused window.
|
||||
.SS Keyboard commands
|
||||
.TP
|
||||
.B Mod1\-Shift\-Return
|
||||
Start
|
||||
.BR st(1).
|
||||
.TP
|
||||
.B Mod1\-p
|
||||
Spawn
|
||||
.BR dmenu(1)
|
||||
for launching other programs.
|
||||
.TP
|
||||
.B Mod1\-,
|
||||
Focus previous screen, if any.
|
||||
.TP
|
||||
.B Mod1\-.
|
||||
Focus next screen, if any.
|
||||
.TP
|
||||
.B Mod1\-Shift\-,
|
||||
Send focused window to previous screen, if any.
|
||||
.TP
|
||||
.B Mod1\-Shift\-.
|
||||
Send focused window to next screen, if any.
|
||||
.TP
|
||||
.B Mod1\-b
|
||||
Toggles bar on and off.
|
||||
.TP
|
||||
.B Mod1\-t
|
||||
Sets tiled layout.
|
||||
.TP
|
||||
.B Mod1\-f
|
||||
Sets floating layout.
|
||||
.TP
|
||||
.B Mod1\-m
|
||||
Sets monocle layout.
|
||||
.TP
|
||||
.B Mod1\-space
|
||||
Toggles between current and previous layout.
|
||||
.TP
|
||||
.B Mod1\-j
|
||||
Focus next window.
|
||||
.TP
|
||||
.B Mod1\-k
|
||||
Focus previous window.
|
||||
.TP
|
||||
.B Mod1\-i
|
||||
Increase number of windows in master area.
|
||||
.TP
|
||||
.B Mod1\-d
|
||||
Decrease number of windows in master area.
|
||||
.TP
|
||||
.B Mod1\-l
|
||||
Increase master area size.
|
||||
.TP
|
||||
.B Mod1\-h
|
||||
Decrease master area size.
|
||||
.TP
|
||||
.B Mod1\-Return
|
||||
Zooms/cycles focused window to/from master area (tiled layouts only).
|
||||
.TP
|
||||
.B Mod1\-Shift\-c
|
||||
Close focused window.
|
||||
.TP
|
||||
.B Mod1\-Shift\-space
|
||||
Toggle focused window between tiled and floating state.
|
||||
.TP
|
||||
.B Mod1\-Tab
|
||||
Toggles to the previously selected tags.
|
||||
.TP
|
||||
.B Mod1\-Shift\-[1..n]
|
||||
Apply nth tag to focused window.
|
||||
.TP
|
||||
.B Mod1\-Shift\-0
|
||||
Apply all tags to focused window.
|
||||
.TP
|
||||
.B Mod1\-Control\-Shift\-[1..n]
|
||||
Add/remove nth tag to/from focused window.
|
||||
.TP
|
||||
.B Mod1\-[1..n]
|
||||
View all windows with nth tag.
|
||||
.TP
|
||||
.B Mod1\-0
|
||||
View all windows with any tag.
|
||||
.TP
|
||||
.B Mod1\-Control\-[1..n]
|
||||
Add/remove all windows with nth tag to/from the view.
|
||||
.TP
|
||||
.B Mod1\-Shift\-q
|
||||
Quit dwm.
|
||||
.SS Mouse commands
|
||||
.TP
|
||||
.B Mod1\-Button1
|
||||
Move focused window while dragging. Tiled windows will be toggled to the floating state.
|
||||
.TP
|
||||
.B Mod1\-Button2
|
||||
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 CUSTOMIZATION
|
||||
dwm is customized by creating a custom config.h and (re)compiling the source
|
||||
code. This keeps it fast, secure and simple.
|
||||
.SH SEE ALSO
|
||||
.BR dmenu (1),
|
||||
.BR st (1)
|
||||
.SH ISSUES
|
||||
Java applications which use the XToolkit/XAWT backend may draw grey windows
|
||||
only. The XToolkit/XAWT backend breaks ICCCM-compliance in recent JDK 1.5 and early
|
||||
JDK 1.6 versions, because it assumes a reparenting window manager. Possible workarounds
|
||||
are using JDK 1.4 (which doesn't contain the XToolkit/XAWT backend) or setting the
|
||||
environment variable
|
||||
.BR AWT_TOOLKIT=MToolkit
|
||||
(to use the older Motif backend instead) or running
|
||||
.B xprop -root -f _NET_WM_NAME 32a -set _NET_WM_NAME LG3D
|
||||
or
|
||||
.B wmname LG3D
|
||||
(to pretend that a non-reparenting window manager is running that the
|
||||
XToolkit/XAWT backend can recognize) or when using OpenJDK setting the environment variable
|
||||
.BR _JAVA_AWT_WM_NONREPARENTING=1 .
|
||||
.SH BUGS
|
||||
Send all bug reports with a patch to hackers@suckless.org.
|
2684
config/dwm-old/dwm.c
2684
config/dwm-old/dwm.c
File diff suppressed because it is too large
Load diff
File diff suppressed because it is too large
Load diff
|
@ -1,29 +0,0 @@
|
|||
--- dwm.c
|
||||
+++ dwm.c
|
||||
@@ -1671,9 +1710,25 @@ showhide(Client *c)
|
||||
void
|
||||
sigchld(int unused)
|
||||
{
|
||||
+ pid_t pid;
|
||||
+
|
||||
if (signal(SIGCHLD, sigchld) == SIG_ERR)
|
||||
die("can't install SIGCHLD handler:");
|
||||
- while (0 < waitpid(-1, NULL, WNOHANG));
|
||||
+ while (0 < (pid = waitpid(-1, NULL, WNOHANG))) {
|
||||
+ pid_t *p, *lim;
|
||||
+
|
||||
+ if (!(p = autostart_pids))
|
||||
+ continue;
|
||||
+ lim = &p[autostart_len];
|
||||
+
|
||||
+ for (; p < lim; p++) {
|
||||
+ if (*p == pid) {
|
||||
+ *p = -1;
|
||||
+ break;
|
||||
+ }
|
||||
+ }
|
||||
+
|
||||
+ }
|
||||
}
|
||||
|
||||
void
|
Binary file not shown.
Before Width: | Height: | Size: 373 B |
|
@ -1,42 +0,0 @@
|
|||
/* cc transient.c -o transient -lX11 */
|
||||
|
||||
#include <stdlib.h>
|
||||
#include <unistd.h>
|
||||
#include <X11/Xlib.h>
|
||||
#include <X11/Xutil.h>
|
||||
|
||||
int main(void) {
|
||||
Display *d;
|
||||
Window r, f, t = None;
|
||||
XSizeHints h;
|
||||
XEvent e;
|
||||
|
||||
d = XOpenDisplay(NULL);
|
||||
if (!d)
|
||||
exit(1);
|
||||
r = DefaultRootWindow(d);
|
||||
|
||||
f = XCreateSimpleWindow(d, r, 100, 100, 400, 400, 0, 0, 0);
|
||||
h.min_width = h.max_width = h.min_height = h.max_height = 400;
|
||||
h.flags = PMinSize | PMaxSize;
|
||||
XSetWMNormalHints(d, f, &h);
|
||||
XStoreName(d, f, "floating");
|
||||
XMapWindow(d, f);
|
||||
|
||||
XSelectInput(d, f, ExposureMask);
|
||||
while (1) {
|
||||
XNextEvent(d, &e);
|
||||
|
||||
if (t == None) {
|
||||
sleep(5);
|
||||
t = XCreateSimpleWindow(d, r, 50, 50, 100, 100, 0, 0, 0);
|
||||
XSetTransientForHint(d, t, f);
|
||||
XStoreName(d, t, "transient");
|
||||
XMapWindow(d, t);
|
||||
XSelectInput(d, t, ExposureMask);
|
||||
}
|
||||
}
|
||||
|
||||
XCloseDisplay(d);
|
||||
exit(0);
|
||||
}
|
|
@ -1,36 +0,0 @@
|
|||
/* See LICENSE file for copyright and license details. */
|
||||
#include <stdarg.h>
|
||||
#include <stdio.h>
|
||||
#include <stdlib.h>
|
||||
#include <string.h>
|
||||
|
||||
#include "util.h"
|
||||
|
||||
void
|
||||
die(const char *fmt, ...)
|
||||
{
|
||||
va_list ap;
|
||||
|
||||
va_start(ap, fmt);
|
||||
vfprintf(stderr, fmt, ap);
|
||||
va_end(ap);
|
||||
|
||||
if (fmt[0] && fmt[strlen(fmt)-1] == ':') {
|
||||
fputc(' ', stderr);
|
||||
perror(NULL);
|
||||
} else {
|
||||
fputc('\n', stderr);
|
||||
}
|
||||
|
||||
exit(1);
|
||||
}
|
||||
|
||||
void *
|
||||
ecalloc(size_t nmemb, size_t size)
|
||||
{
|
||||
void *p;
|
||||
|
||||
if (!(p = calloc(nmemb, size)))
|
||||
die("calloc:");
|
||||
return p;
|
||||
}
|
|
@ -1,8 +0,0 @@
|
|||
/* See LICENSE file for copyright and license details. */
|
||||
|
||||
#define MAX(A, B) ((A) > (B) ? (A) : (B))
|
||||
#define MIN(A, B) ((A) < (B) ? (A) : (B))
|
||||
#define BETWEEN(X, A, B) ((A) <= (X) && (X) <= (B))
|
||||
|
||||
void die(const char *fmt, ...);
|
||||
void *ecalloc(size_t nmemb, size_t size);
|
|
@ -1,38 +0,0 @@
|
|||
MIT/X Consortium License
|
||||
|
||||
© 2006-2019 Anselm R Garbe <anselm@garbe.ca>
|
||||
© 2006-2009 Jukka Salmi <jukka at salmi dot ch>
|
||||
© 2006-2007 Sander van Dijk <a dot h dot vandijk at gmail dot com>
|
||||
© 2007-2011 Peter Hartlich <sgkkr at hartlich dot com>
|
||||
© 2007-2009 Szabolcs Nagy <nszabolcs at gmail dot com>
|
||||
© 2007-2009 Christof Musik <christof at sendfax dot de>
|
||||
© 2007-2009 Premysl Hruby <dfenze at gmail dot com>
|
||||
© 2007-2008 Enno Gottox Boland <gottox at s01 dot de>
|
||||
© 2008 Martin Hurton <martin dot hurton at gmail dot com>
|
||||
© 2008 Neale Pickett <neale dot woozle dot org>
|
||||
© 2009 Mate Nagy <mnagy at port70 dot net>
|
||||
© 2010-2016 Hiltjo Posthuma <hiltjo@codemadness.org>
|
||||
© 2010-2012 Connor Lane Smith <cls@lubutu.com>
|
||||
© 2011 Christoph Lohmann <20h@r-36.net>
|
||||
© 2015-2016 Quentin Rameau <quinq@fifth.space>
|
||||
© 2015-2016 Eric Pruitt <eric.pruitt@gmail.com>
|
||||
© 2016-2017 Markus Teich <markus.teich@stusta.mhn.de>
|
||||
© 2020-2022 Chris Down <chris@chrisdown.name>
|
||||
|
||||
Permission is hereby granted, free of charge, to any person obtaining a
|
||||
copy of this software and associated documentation files (the "Software"),
|
||||
to deal in the Software without restriction, including without limitation
|
||||
the rights to use, copy, modify, merge, publish, distribute, sublicense,
|
||||
and/or sell copies of the Software, and to permit persons to whom the
|
||||
Software is furnished to do so, subject to the following conditions:
|
||||
|
||||
The above copyright notice and this permission notice shall be included in
|
||||
all copies or substantial portions of the Software.
|
||||
|
||||
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
||||
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
||||
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
|
||||
THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
||||
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
|
||||
FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
|
||||
DEALINGS IN THE SOFTWARE.
|
|
@ -1,45 +0,0 @@
|
|||
# dwm - dynamic window manager
|
||||
# See LICENSE file for copyright and license details.
|
||||
|
||||
include config.mk
|
||||
|
||||
SRC = drw.c dwm.c util.c
|
||||
OBJ = ${SRC:.c=.o}
|
||||
|
||||
all: dwm
|
||||
|
||||
.c.o:
|
||||
${CC} -c ${CFLAGS} $<
|
||||
|
||||
${OBJ}: config.h config.mk
|
||||
|
||||
config.h:
|
||||
cp config.def.h $@
|
||||
|
||||
dwm: ${OBJ}
|
||||
${CC} -o $@ ${OBJ} ${LDFLAGS}
|
||||
|
||||
clean:
|
||||
rm -f dwm ${OBJ} dwm-${VERSION}.tar.gz
|
||||
|
||||
dist: clean
|
||||
mkdir -p dwm-${VERSION}
|
||||
cp -R LICENSE Makefile README config.def.h config.mk\
|
||||
dwm.1 drw.h util.h ${SRC} dwm.png transient.c dwm-${VERSION}
|
||||
tar -cf dwm-${VERSION}.tar dwm-${VERSION}
|
||||
gzip dwm-${VERSION}.tar
|
||||
rm -rf dwm-${VERSION}
|
||||
|
||||
install: all
|
||||
mkdir -p ${DESTDIR}${PREFIX}/bin
|
||||
cp -f dwm ${DESTDIR}${PREFIX}/bin
|
||||
chmod 755 ${DESTDIR}${PREFIX}/bin/dwm
|
||||
mkdir -p ${DESTDIR}${MANPREFIX}/man1
|
||||
sed "s/VERSION/${VERSION}/g" < dwm.1 > ${DESTDIR}${MANPREFIX}/man1/dwm.1
|
||||
chmod 644 ${DESTDIR}${MANPREFIX}/man1/dwm.1
|
||||
|
||||
uninstall:
|
||||
rm -f ${DESTDIR}${PREFIX}/bin/dwm\
|
||||
${DESTDIR}${MANPREFIX}/man1/dwm.1
|
||||
|
||||
.PHONY: all clean dist install uninstall
|
|
@ -1,48 +0,0 @@
|
|||
dwm - dynamic window manager
|
||||
============================
|
||||
dwm is an extremely fast, small, and dynamic window manager for X.
|
||||
|
||||
|
||||
Requirements
|
||||
------------
|
||||
In order to build dwm you need the Xlib header files.
|
||||
|
||||
|
||||
Installation
|
||||
------------
|
||||
Edit config.mk to match your local setup (dwm is installed into
|
||||
the /usr/local namespace by default).
|
||||
|
||||
Afterwards enter the following command to build and install dwm (if
|
||||
necessary as root):
|
||||
|
||||
make clean install
|
||||
|
||||
|
||||
Running dwm
|
||||
-----------
|
||||
Add the following line to your .xinitrc to start dwm using startx:
|
||||
|
||||
exec dwm
|
||||
|
||||
In order to connect dwm to a specific display, make sure that
|
||||
the DISPLAY environment variable is set correctly, e.g.:
|
||||
|
||||
DISPLAY=foo.bar:1 exec dwm
|
||||
|
||||
(This will start dwm on display :1 of the host foo.bar.)
|
||||
|
||||
In order to display status info in the bar, you can do something
|
||||
like this in your .xinitrc:
|
||||
|
||||
while xsetroot -name "`date` `uptime | sed 's/.*,//'`"
|
||||
do
|
||||
sleep 1
|
||||
done &
|
||||
exec dwm
|
||||
|
||||
|
||||
Configuration
|
||||
-------------
|
||||
The configuration of dwm is done by creating a custom config.h
|
||||
and (re)compiling the source code.
|
|
@ -1,116 +0,0 @@
|
|||
/* See LICENSE file for copyright and license details. */
|
||||
|
||||
/* appearance */
|
||||
static const unsigned int borderpx = 1; /* border pixel of windows */
|
||||
static const unsigned int snap = 32; /* snap pixel */
|
||||
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" };
|
||||
static const char dmenufont[] = "monospace:size=10";
|
||||
static const char col_gray1[] = "#222222";
|
||||
static const char col_gray2[] = "#444444";
|
||||
static const char col_gray3[] = "#bbbbbb";
|
||||
static const char col_gray4[] = "#eeeeee";
|
||||
static const char col_cyan[] = "#005577";
|
||||
static const char *colors[][3] = {
|
||||
/* fg bg border */
|
||||
[SchemeNorm] = { col_gray3, col_gray1, col_gray2 },
|
||||
[SchemeSel] = { col_gray4, col_cyan, col_cyan },
|
||||
};
|
||||
|
||||
/* tagging */
|
||||
static const char *tags[] = { "1", "2", "3", "4", "5", "6", "7", "8", "9" };
|
||||
|
||||
static const Rule rules[] = {
|
||||
/* xprop(1):
|
||||
* WM_CLASS(STRING) = instance, class
|
||||
* WM_NAME(STRING) = title
|
||||
*/
|
||||
/* class instance title tags mask isfloating monitor */
|
||||
{ "Gimp", NULL, NULL, 0, 1, -1 },
|
||||
{ "Firefox", NULL, NULL, 1 << 8, 0, -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 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 */
|
||||
{ "[]=", 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 char dmenumon[2] = "0"; /* component of dmenucmd, manipulated in spawn() */
|
||||
static const char *dmenucmd[] = { "dmenu_run", "-m", dmenumon, "-fn", dmenufont, "-nb", col_gray1, "-nf", col_gray3, "-sb", col_cyan, "-sf", col_gray4, NULL };
|
||||
static const char *termcmd[] = { "st", NULL };
|
||||
|
||||
static const Key keys[] = {
|
||||
/* modifier key function argument */
|
||||
{ MODKEY, XK_p, spawn, {.v = dmenucmd } },
|
||||
{ MODKEY|ShiftMask, XK_Return, spawn, {.v = termcmd } },
|
||||
{ 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_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 } },
|
||||
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 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]} },
|
||||
{ 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} },
|
||||
};
|
||||
|
|
@ -1,113 +0,0 @@
|
|||
/* See LICENSE file for copyright and license details. */
|
||||
|
||||
/* appearance */
|
||||
static const unsigned int borderpx = 1; /* border pixel of windows */
|
||||
static const unsigned int snap = 32; /* snap pixel */
|
||||
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"};
|
||||
static const char dmenufont[] = "monospace:size=10";
|
||||
static const char col_gray1[] = "#222222";
|
||||
static const char col_gray2[] = "#444444";
|
||||
static const char col_gray3[] = "#bbbbbb";
|
||||
static const char col_gray4[] = "#eeeeee";
|
||||
static const char col_cyan[] = "#005577";
|
||||
static const char *colors[][3] = {
|
||||
/* fg bg border */
|
||||
[SchemeNorm] = {col_gray3, col_gray1, col_gray2},
|
||||
[SchemeSel] = {col_gray4, col_cyan, col_cyan},
|
||||
};
|
||||
|
||||
/* tagging */
|
||||
static const char *tags[] = {"1", "2", "3", "4", "5", "6", "7", "8", "9"};
|
||||
|
||||
static const Rule rules[] = {
|
||||
/* xprop(1):
|
||||
* WM_CLASS(STRING) = instance, class
|
||||
* WM_NAME(STRING) = title
|
||||
*/
|
||||
/* class instance title tags mask isfloating monitor */
|
||||
{"Gimp", NULL, NULL, 0, 1, -1},
|
||||
{"Firefox", NULL, NULL, 1 << 8, 0, -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 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 */
|
||||
{"[]=", 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 *roficmd[] = {"rofi", "-show", "drun", NULL};
|
||||
static const char *termcmd[] = {"wezterm", NULL};
|
||||
|
||||
static const Key keys[] = {
|
||||
/* modifier key function argument */
|
||||
{MODKEY, XK_p, spawn, {.v = roficmd}},
|
||||
{MODKEY | ShiftMask, XK_Return, spawn, {.v = termcmd}},
|
||||
{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_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}},
|
||||
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 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]}},
|
||||
{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}},
|
||||
};
|
|
@ -1,39 +0,0 @@
|
|||
# dwm version
|
||||
VERSION = 6.5
|
||||
|
||||
# Customize below to fit your system
|
||||
|
||||
# paths
|
||||
PREFIX = /usr/local
|
||||
MANPREFIX = ${PREFIX}/share/man
|
||||
|
||||
X11INC = /usr/X11R6/include
|
||||
X11LIB = /usr/X11R6/lib
|
||||
|
||||
# Xinerama, comment if you don't want it
|
||||
XINERAMALIBS = -lXinerama
|
||||
XINERAMAFLAGS = -DXINERAMA
|
||||
|
||||
# freetype
|
||||
FREETYPELIBS = -lfontconfig -lXft
|
||||
FREETYPEINC = /usr/include/freetype2
|
||||
# OpenBSD (uncomment)
|
||||
#FREETYPEINC = ${X11INC}/freetype2
|
||||
#MANPREFIX = ${PREFIX}/man
|
||||
|
||||
# includes and libs
|
||||
INCS = -I${X11INC} -I${FREETYPEINC}
|
||||
LIBS = -L${X11LIB} -lX11 ${XINERAMALIBS} ${FREETYPELIBS}
|
||||
|
||||
# flags
|
||||
CPPFLAGS = -D_DEFAULT_SOURCE -D_BSD_SOURCE -D_XOPEN_SOURCE=700L -DVERSION=\"${VERSION}\" ${XINERAMAFLAGS}
|
||||
#CFLAGS = -g -std=c99 -pedantic -Wall -O0 ${INCS} ${CPPFLAGS}
|
||||
CFLAGS = -std=c99 -pedantic -Wall -Wno-deprecated-declarations -Os ${INCS} ${CPPFLAGS}
|
||||
LDFLAGS = ${LIBS}
|
||||
|
||||
# Solaris
|
||||
#CFLAGS = -fast ${INCS} -DVERSION=\"${VERSION}\"
|
||||
#LDFLAGS = ${LIBS}
|
||||
|
||||
# compiler and linker
|
||||
CC = cc
|
450
config/dwm/drw.c
450
config/dwm/drw.c
|
@ -1,450 +0,0 @@
|
|||
/* See LICENSE file for copyright and license details. */
|
||||
#include <stdio.h>
|
||||
#include <stdlib.h>
|
||||
#include <string.h>
|
||||
#include <X11/Xlib.h>
|
||||
#include <X11/Xft/Xft.h>
|
||||
|
||||
#include "drw.h"
|
||||
#include "util.h"
|
||||
|
||||
#define UTF_INVALID 0xFFFD
|
||||
#define UTF_SIZ 4
|
||||
|
||||
static const unsigned char utfbyte[UTF_SIZ + 1] = {0x80, 0, 0xC0, 0xE0, 0xF0};
|
||||
static const unsigned char utfmask[UTF_SIZ + 1] = {0xC0, 0x80, 0xE0, 0xF0, 0xF8};
|
||||
static const long utfmin[UTF_SIZ + 1] = { 0, 0, 0x80, 0x800, 0x10000};
|
||||
static const long utfmax[UTF_SIZ + 1] = {0x10FFFF, 0x7F, 0x7FF, 0xFFFF, 0x10FFFF};
|
||||
|
||||
static long
|
||||
utf8decodebyte(const char c, size_t *i)
|
||||
{
|
||||
for (*i = 0; *i < (UTF_SIZ + 1); ++(*i))
|
||||
if (((unsigned char)c & utfmask[*i]) == utfbyte[*i])
|
||||
return (unsigned char)c & ~utfmask[*i];
|
||||
return 0;
|
||||
}
|
||||
|
||||
static size_t
|
||||
utf8validate(long *u, size_t i)
|
||||
{
|
||||
if (!BETWEEN(*u, utfmin[i], utfmax[i]) || BETWEEN(*u, 0xD800, 0xDFFF))
|
||||
*u = UTF_INVALID;
|
||||
for (i = 1; *u > utfmax[i]; ++i)
|
||||
;
|
||||
return i;
|
||||
}
|
||||
|
||||
static size_t
|
||||
utf8decode(const char *c, long *u, size_t clen)
|
||||
{
|
||||
size_t i, j, len, type;
|
||||
long udecoded;
|
||||
|
||||
*u = UTF_INVALID;
|
||||
if (!clen)
|
||||
return 0;
|
||||
udecoded = utf8decodebyte(c[0], &len);
|
||||
if (!BETWEEN(len, 1, UTF_SIZ))
|
||||
return 1;
|
||||
for (i = 1, j = 1; i < clen && j < len; ++i, ++j) {
|
||||
udecoded = (udecoded << 6) | utf8decodebyte(c[i], &type);
|
||||
if (type)
|
||||
return j;
|
||||
}
|
||||
if (j < len)
|
||||
return 0;
|
||||
*u = udecoded;
|
||||
utf8validate(u, len);
|
||||
|
||||
return len;
|
||||
}
|
||||
|
||||
Drw *
|
||||
drw_create(Display *dpy, int screen, Window root, unsigned int w, unsigned int h)
|
||||
{
|
||||
Drw *drw = ecalloc(1, sizeof(Drw));
|
||||
|
||||
drw->dpy = dpy;
|
||||
drw->screen = screen;
|
||||
drw->root = root;
|
||||
drw->w = w;
|
||||
drw->h = h;
|
||||
drw->drawable = XCreatePixmap(dpy, root, w, h, DefaultDepth(dpy, screen));
|
||||
drw->gc = XCreateGC(dpy, root, 0, NULL);
|
||||
XSetLineAttributes(dpy, drw->gc, 1, LineSolid, CapButt, JoinMiter);
|
||||
|
||||
return drw;
|
||||
}
|
||||
|
||||
void
|
||||
drw_resize(Drw *drw, unsigned int w, unsigned int h)
|
||||
{
|
||||
if (!drw)
|
||||
return;
|
||||
|
||||
drw->w = w;
|
||||
drw->h = h;
|
||||
if (drw->drawable)
|
||||
XFreePixmap(drw->dpy, drw->drawable);
|
||||
drw->drawable = XCreatePixmap(drw->dpy, drw->root, w, h, DefaultDepth(drw->dpy, drw->screen));
|
||||
}
|
||||
|
||||
void
|
||||
drw_free(Drw *drw)
|
||||
{
|
||||
XFreePixmap(drw->dpy, drw->drawable);
|
||||
XFreeGC(drw->dpy, drw->gc);
|
||||
drw_fontset_free(drw->fonts);
|
||||
free(drw);
|
||||
}
|
||||
|
||||
/* This function is an implementation detail. Library users should use
|
||||
* drw_fontset_create instead.
|
||||
*/
|
||||
static Fnt *
|
||||
xfont_create(Drw *drw, const char *fontname, FcPattern *fontpattern)
|
||||
{
|
||||
Fnt *font;
|
||||
XftFont *xfont = NULL;
|
||||
FcPattern *pattern = NULL;
|
||||
|
||||
if (fontname) {
|
||||
/* Using the pattern found at font->xfont->pattern does not yield the
|
||||
* same substitution results as using the pattern returned by
|
||||
* FcNameParse; using the latter results in the desired fallback
|
||||
* behaviour whereas the former just results in missing-character
|
||||
* rectangles being drawn, at least with some fonts. */
|
||||
if (!(xfont = XftFontOpenName(drw->dpy, drw->screen, fontname))) {
|
||||
fprintf(stderr, "error, cannot load font from name: '%s'\n", fontname);
|
||||
return NULL;
|
||||
}
|
||||
if (!(pattern = FcNameParse((FcChar8 *) fontname))) {
|
||||
fprintf(stderr, "error, cannot parse font name to pattern: '%s'\n", fontname);
|
||||
XftFontClose(drw->dpy, xfont);
|
||||
return NULL;
|
||||
}
|
||||
} else if (fontpattern) {
|
||||
if (!(xfont = XftFontOpenPattern(drw->dpy, fontpattern))) {
|
||||
fprintf(stderr, "error, cannot load font from pattern.\n");
|
||||
return NULL;
|
||||
}
|
||||
} else {
|
||||
die("no font specified.");
|
||||
}
|
||||
|
||||
font = ecalloc(1, sizeof(Fnt));
|
||||
font->xfont = xfont;
|
||||
font->pattern = pattern;
|
||||
font->h = xfont->ascent + xfont->descent;
|
||||
font->dpy = drw->dpy;
|
||||
|
||||
return font;
|
||||
}
|
||||
|
||||
static void
|
||||
xfont_free(Fnt *font)
|
||||
{
|
||||
if (!font)
|
||||
return;
|
||||
if (font->pattern)
|
||||
FcPatternDestroy(font->pattern);
|
||||
XftFontClose(font->dpy, font->xfont);
|
||||
free(font);
|
||||
}
|
||||
|
||||
Fnt*
|
||||
drw_fontset_create(Drw* drw, const char *fonts[], size_t fontcount)
|
||||
{
|
||||
Fnt *cur, *ret = NULL;
|
||||
size_t i;
|
||||
|
||||
if (!drw || !fonts)
|
||||
return NULL;
|
||||
|
||||
for (i = 1; i <= fontcount; i++) {
|
||||
if ((cur = xfont_create(drw, fonts[fontcount - i], NULL))) {
|
||||
cur->next = ret;
|
||||
ret = cur;
|
||||
}
|
||||
}
|
||||
return (drw->fonts = ret);
|
||||
}
|
||||
|
||||
void
|
||||
drw_fontset_free(Fnt *font)
|
||||
{
|
||||
if (font) {
|
||||
drw_fontset_free(font->next);
|
||||
xfont_free(font);
|
||||
}
|
||||
}
|
||||
|
||||
void
|
||||
drw_clr_create(Drw *drw, Clr *dest, const char *clrname)
|
||||
{
|
||||
if (!drw || !dest || !clrname)
|
||||
return;
|
||||
|
||||
if (!XftColorAllocName(drw->dpy, DefaultVisual(drw->dpy, drw->screen),
|
||||
DefaultColormap(drw->dpy, drw->screen),
|
||||
clrname, dest))
|
||||
die("error, cannot allocate color '%s'", clrname);
|
||||
}
|
||||
|
||||
/* Wrapper to create color schemes. The caller has to call free(3) on the
|
||||
* returned color scheme when done using it. */
|
||||
Clr *
|
||||
drw_scm_create(Drw *drw, const char *clrnames[], size_t clrcount)
|
||||
{
|
||||
size_t i;
|
||||
Clr *ret;
|
||||
|
||||
/* need at least two colors for a scheme */
|
||||
if (!drw || !clrnames || clrcount < 2 || !(ret = ecalloc(clrcount, sizeof(XftColor))))
|
||||
return NULL;
|
||||
|
||||
for (i = 0; i < clrcount; i++)
|
||||
drw_clr_create(drw, &ret[i], clrnames[i]);
|
||||
return ret;
|
||||
}
|
||||
|
||||
void
|
||||
drw_setfontset(Drw *drw, Fnt *set)
|
||||
{
|
||||
if (drw)
|
||||
drw->fonts = set;
|
||||
}
|
||||
|
||||
void
|
||||
drw_setscheme(Drw *drw, Clr *scm)
|
||||
{
|
||||
if (drw)
|
||||
drw->scheme = scm;
|
||||
}
|
||||
|
||||
void
|
||||
drw_rect(Drw *drw, int x, int y, unsigned int w, unsigned int h, int filled, int invert)
|
||||
{
|
||||
if (!drw || !drw->scheme)
|
||||
return;
|
||||
XSetForeground(drw->dpy, drw->gc, invert ? drw->scheme[ColBg].pixel : drw->scheme[ColFg].pixel);
|
||||
if (filled)
|
||||
XFillRectangle(drw->dpy, drw->drawable, drw->gc, x, y, w, h);
|
||||
else
|
||||
XDrawRectangle(drw->dpy, drw->drawable, drw->gc, x, y, w - 1, h - 1);
|
||||
}
|
||||
|
||||
int
|
||||
drw_text(Drw *drw, int x, int y, unsigned int w, unsigned int h, unsigned int lpad, const char *text, int invert)
|
||||
{
|
||||
int i, ty, ellipsis_x = 0;
|
||||
unsigned int tmpw, ew, ellipsis_w = 0, ellipsis_len;
|
||||
XftDraw *d = NULL;
|
||||
Fnt *usedfont, *curfont, *nextfont;
|
||||
int utf8strlen, utf8charlen, render = x || y || w || h;
|
||||
long utf8codepoint = 0;
|
||||
const char *utf8str;
|
||||
FcCharSet *fccharset;
|
||||
FcPattern *fcpattern;
|
||||
FcPattern *match;
|
||||
XftResult result;
|
||||
int charexists = 0, overflow = 0;
|
||||
/* keep track of a couple codepoints for which we have no match. */
|
||||
enum { nomatches_len = 64 };
|
||||
static struct { long codepoint[nomatches_len]; unsigned int idx; } nomatches;
|
||||
static unsigned int ellipsis_width = 0;
|
||||
|
||||
if (!drw || (render && (!drw->scheme || !w)) || !text || !drw->fonts)
|
||||
return 0;
|
||||
|
||||
if (!render) {
|
||||
w = invert ? invert : ~invert;
|
||||
} else {
|
||||
XSetForeground(drw->dpy, drw->gc, drw->scheme[invert ? ColFg : ColBg].pixel);
|
||||
XFillRectangle(drw->dpy, drw->drawable, drw->gc, x, y, w, h);
|
||||
d = XftDrawCreate(drw->dpy, drw->drawable,
|
||||
DefaultVisual(drw->dpy, drw->screen),
|
||||
DefaultColormap(drw->dpy, drw->screen));
|
||||
x += lpad;
|
||||
w -= lpad;
|
||||
}
|
||||
|
||||
usedfont = drw->fonts;
|
||||
if (!ellipsis_width && render)
|
||||
ellipsis_width = drw_fontset_getwidth(drw, "...");
|
||||
while (1) {
|
||||
ew = ellipsis_len = utf8strlen = 0;
|
||||
utf8str = text;
|
||||
nextfont = NULL;
|
||||
while (*text) {
|
||||
utf8charlen = utf8decode(text, &utf8codepoint, UTF_SIZ);
|
||||
for (curfont = drw->fonts; curfont; curfont = curfont->next) {
|
||||
charexists = charexists || XftCharExists(drw->dpy, curfont->xfont, utf8codepoint);
|
||||
if (charexists) {
|
||||
drw_font_getexts(curfont, text, utf8charlen, &tmpw, NULL);
|
||||
if (ew + ellipsis_width <= w) {
|
||||
/* keep track where the ellipsis still fits */
|
||||
ellipsis_x = x + ew;
|
||||
ellipsis_w = w - ew;
|
||||
ellipsis_len = utf8strlen;
|
||||
}
|
||||
|
||||
if (ew + tmpw > w) {
|
||||
overflow = 1;
|
||||
/* called from drw_fontset_getwidth_clamp():
|
||||
* it wants the width AFTER the overflow
|
||||
*/
|
||||
if (!render)
|
||||
x += tmpw;
|
||||
else
|
||||
utf8strlen = ellipsis_len;
|
||||
} else if (curfont == usedfont) {
|
||||
utf8strlen += utf8charlen;
|
||||
text += utf8charlen;
|
||||
ew += tmpw;
|
||||
} else {
|
||||
nextfont = curfont;
|
||||
}
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
if (overflow || !charexists || nextfont)
|
||||
break;
|
||||
else
|
||||
charexists = 0;
|
||||
}
|
||||
|
||||
if (utf8strlen) {
|
||||
if (render) {
|
||||
ty = y + (h - usedfont->h) / 2 + usedfont->xfont->ascent;
|
||||
XftDrawStringUtf8(d, &drw->scheme[invert ? ColBg : ColFg],
|
||||
usedfont->xfont, x, ty, (XftChar8 *)utf8str, utf8strlen);
|
||||
}
|
||||
x += ew;
|
||||
w -= ew;
|
||||
}
|
||||
if (render && overflow)
|
||||
drw_text(drw, ellipsis_x, y, ellipsis_w, h, 0, "...", invert);
|
||||
|
||||
if (!*text || overflow) {
|
||||
break;
|
||||
} else if (nextfont) {
|
||||
charexists = 0;
|
||||
usedfont = nextfont;
|
||||
} else {
|
||||
/* Regardless of whether or not a fallback font is found, the
|
||||
* character must be drawn. */
|
||||
charexists = 1;
|
||||
|
||||
for (i = 0; i < nomatches_len; ++i) {
|
||||
/* avoid calling XftFontMatch if we know we won't find a match */
|
||||
if (utf8codepoint == nomatches.codepoint[i])
|
||||
goto no_match;
|
||||
}
|
||||
|
||||
fccharset = FcCharSetCreate();
|
||||
FcCharSetAddChar(fccharset, utf8codepoint);
|
||||
|
||||
if (!drw->fonts->pattern) {
|
||||
/* Refer to the comment in xfont_create for more information. */
|
||||
die("the first font in the cache must be loaded from a font string.");
|
||||
}
|
||||
|
||||
fcpattern = FcPatternDuplicate(drw->fonts->pattern);
|
||||
FcPatternAddCharSet(fcpattern, FC_CHARSET, fccharset);
|
||||
FcPatternAddBool(fcpattern, FC_SCALABLE, FcTrue);
|
||||
|
||||
FcConfigSubstitute(NULL, fcpattern, FcMatchPattern);
|
||||
FcDefaultSubstitute(fcpattern);
|
||||
match = XftFontMatch(drw->dpy, drw->screen, fcpattern, &result);
|
||||
|
||||
FcCharSetDestroy(fccharset);
|
||||
FcPatternDestroy(fcpattern);
|
||||
|
||||
if (match) {
|
||||
usedfont = xfont_create(drw, NULL, match);
|
||||
if (usedfont && XftCharExists(drw->dpy, usedfont->xfont, utf8codepoint)) {
|
||||
for (curfont = drw->fonts; curfont->next; curfont = curfont->next)
|
||||
; /* NOP */
|
||||
curfont->next = usedfont;
|
||||
} else {
|
||||
xfont_free(usedfont);
|
||||
nomatches.codepoint[++nomatches.idx % nomatches_len] = utf8codepoint;
|
||||
no_match:
|
||||
usedfont = drw->fonts;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
if (d)
|
||||
XftDrawDestroy(d);
|
||||
|
||||
return x + (render ? w : 0);
|
||||
}
|
||||
|
||||
void
|
||||
drw_map(Drw *drw, Window win, int x, int y, unsigned int w, unsigned int h)
|
||||
{
|
||||
if (!drw)
|
||||
return;
|
||||
|
||||
XCopyArea(drw->dpy, drw->drawable, win, drw->gc, x, y, w, h, x, y);
|
||||
XSync(drw->dpy, False);
|
||||
}
|
||||
|
||||
unsigned int
|
||||
drw_fontset_getwidth(Drw *drw, const char *text)
|
||||
{
|
||||
if (!drw || !drw->fonts || !text)
|
||||
return 0;
|
||||
return drw_text(drw, 0, 0, 0, 0, 0, text, 0);
|
||||
}
|
||||
|
||||
unsigned int
|
||||
drw_fontset_getwidth_clamp(Drw *drw, const char *text, unsigned int n)
|
||||
{
|
||||
unsigned int tmp = 0;
|
||||
if (drw && drw->fonts && text && n)
|
||||
tmp = drw_text(drw, 0, 0, 0, 0, 0, text, n);
|
||||
return MIN(n, tmp);
|
||||
}
|
||||
|
||||
void
|
||||
drw_font_getexts(Fnt *font, const char *text, unsigned int len, unsigned int *w, unsigned int *h)
|
||||
{
|
||||
XGlyphInfo ext;
|
||||
|
||||
if (!font || !text)
|
||||
return;
|
||||
|
||||
XftTextExtentsUtf8(font->dpy, font->xfont, (XftChar8 *)text, len, &ext);
|
||||
if (w)
|
||||
*w = ext.xOff;
|
||||
if (h)
|
||||
*h = font->h;
|
||||
}
|
||||
|
||||
Cur *
|
||||
drw_cur_create(Drw *drw, int shape)
|
||||
{
|
||||
Cur *cur;
|
||||
|
||||
if (!drw || !(cur = ecalloc(1, sizeof(Cur))))
|
||||
return NULL;
|
||||
|
||||
cur->cursor = XCreateFontCursor(drw->dpy, shape);
|
||||
|
||||
return cur;
|
||||
}
|
||||
|
||||
void
|
||||
drw_cur_free(Drw *drw, Cur *cursor)
|
||||
{
|
||||
if (!cursor)
|
||||
return;
|
||||
|
||||
XFreeCursor(drw->dpy, cursor->cursor);
|
||||
free(cursor);
|
||||
}
|
|
@ -1,58 +0,0 @@
|
|||
/* See LICENSE file for copyright and license details. */
|
||||
|
||||
typedef struct {
|
||||
Cursor cursor;
|
||||
} Cur;
|
||||
|
||||
typedef struct Fnt {
|
||||
Display *dpy;
|
||||
unsigned int h;
|
||||
XftFont *xfont;
|
||||
FcPattern *pattern;
|
||||
struct Fnt *next;
|
||||
} Fnt;
|
||||
|
||||
enum { ColFg, ColBg, ColBorder }; /* Clr scheme index */
|
||||
typedef XftColor Clr;
|
||||
|
||||
typedef struct {
|
||||
unsigned int w, h;
|
||||
Display *dpy;
|
||||
int screen;
|
||||
Window root;
|
||||
Drawable drawable;
|
||||
GC gc;
|
||||
Clr *scheme;
|
||||
Fnt *fonts;
|
||||
} Drw;
|
||||
|
||||
/* Drawable abstraction */
|
||||
Drw *drw_create(Display *dpy, int screen, Window win, unsigned int w, unsigned int h);
|
||||
void drw_resize(Drw *drw, unsigned int w, unsigned int h);
|
||||
void drw_free(Drw *drw);
|
||||
|
||||
/* Fnt abstraction */
|
||||
Fnt *drw_fontset_create(Drw* drw, const char *fonts[], size_t fontcount);
|
||||
void drw_fontset_free(Fnt* set);
|
||||
unsigned int drw_fontset_getwidth(Drw *drw, const char *text);
|
||||
unsigned int drw_fontset_getwidth_clamp(Drw *drw, const char *text, unsigned int n);
|
||||
void drw_font_getexts(Fnt *font, const char *text, unsigned int len, unsigned int *w, unsigned int *h);
|
||||
|
||||
/* Colorscheme abstraction */
|
||||
void drw_clr_create(Drw *drw, Clr *dest, const char *clrname);
|
||||
Clr *drw_scm_create(Drw *drw, const char *clrnames[], size_t clrcount);
|
||||
|
||||
/* Cursor abstraction */
|
||||
Cur *drw_cur_create(Drw *drw, int shape);
|
||||
void drw_cur_free(Drw *drw, Cur *cursor);
|
||||
|
||||
/* Drawing context manipulation */
|
||||
void drw_setfontset(Drw *drw, Fnt *set);
|
||||
void drw_setscheme(Drw *drw, Clr *scm);
|
||||
|
||||
/* Drawing functions */
|
||||
void drw_rect(Drw *drw, int x, int y, unsigned int w, unsigned int h, int filled, int invert);
|
||||
int drw_text(Drw *drw, int x, int y, unsigned int w, unsigned int h, unsigned int lpad, const char *text, int invert);
|
||||
|
||||
/* Map functions */
|
||||
void drw_map(Drw *drw, Window win, int x, int y, unsigned int w, unsigned int h);
|
176
config/dwm/dwm.1
176
config/dwm/dwm.1
|
@ -1,176 +0,0 @@
|
|||
.TH DWM 1 dwm\-VERSION
|
||||
.SH NAME
|
||||
dwm \- dynamic window manager
|
||||
.SH SYNOPSIS
|
||||
.B dwm
|
||||
.RB [ \-v ]
|
||||
.SH DESCRIPTION
|
||||
dwm is a dynamic window manager for X. It manages windows in tiled, monocle
|
||||
and floating layouts. Either layout can be applied dynamically, optimising the
|
||||
environment for the application in use and the task performed.
|
||||
.P
|
||||
In tiled layouts windows are managed in a master and stacking area. The master
|
||||
area on the left contains one window by default, and the stacking area on the
|
||||
right contains all other windows. The number of master area windows can be
|
||||
adjusted from zero to an arbitrary number. In monocle layout all windows are
|
||||
maximised to the screen size. In floating layout windows can be resized and
|
||||
moved freely. Dialog windows are always managed floating, regardless of the
|
||||
layout applied.
|
||||
.P
|
||||
Windows are grouped by tags. Each window can be tagged with one or multiple
|
||||
tags. Selecting certain tags displays all windows with these tags.
|
||||
.P
|
||||
Each screen contains a small status bar which displays all available tags, the
|
||||
layout, the title of the focused window, and the text read from the root window
|
||||
name property, if the screen is focused. A floating window is indicated with an
|
||||
empty square and a maximised floating window is indicated with a filled square
|
||||
before the windows title. The selected tags are indicated with a different
|
||||
color. The tags of the focused window are indicated with a filled square in the
|
||||
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.
|
||||
.SH OPTIONS
|
||||
.TP
|
||||
.B \-v
|
||||
prints version information to stderr, then exits.
|
||||
.SH USAGE
|
||||
.SS Status bar
|
||||
.TP
|
||||
.B X root window name
|
||||
is read and displayed in the status text area. It can be set with the
|
||||
.BR xsetroot (1)
|
||||
command.
|
||||
.TP
|
||||
.B Button1
|
||||
click on a tag label to display all windows with that tag, click on the layout
|
||||
label toggles between tiled and floating layout.
|
||||
.TP
|
||||
.B Button3
|
||||
click on a tag label adds/removes all windows with that tag to/from the view.
|
||||
.TP
|
||||
.B Mod1\-Button1
|
||||
click on a tag label applies that tag to the focused window.
|
||||
.TP
|
||||
.B Mod1\-Button3
|
||||
click on a tag label adds/removes that tag to/from the focused window.
|
||||
.SS Keyboard commands
|
||||
.TP
|
||||
.B Mod1\-Shift\-Return
|
||||
Start
|
||||
.BR st(1).
|
||||
.TP
|
||||
.B Mod1\-p
|
||||
Spawn
|
||||
.BR dmenu(1)
|
||||
for launching other programs.
|
||||
.TP
|
||||
.B Mod1\-,
|
||||
Focus previous screen, if any.
|
||||
.TP
|
||||
.B Mod1\-.
|
||||
Focus next screen, if any.
|
||||
.TP
|
||||
.B Mod1\-Shift\-,
|
||||
Send focused window to previous screen, if any.
|
||||
.TP
|
||||
.B Mod1\-Shift\-.
|
||||
Send focused window to next screen, if any.
|
||||
.TP
|
||||
.B Mod1\-b
|
||||
Toggles bar on and off.
|
||||
.TP
|
||||
.B Mod1\-t
|
||||
Sets tiled layout.
|
||||
.TP
|
||||
.B Mod1\-f
|
||||
Sets floating layout.
|
||||
.TP
|
||||
.B Mod1\-m
|
||||
Sets monocle layout.
|
||||
.TP
|
||||
.B Mod1\-space
|
||||
Toggles between current and previous layout.
|
||||
.TP
|
||||
.B Mod1\-j
|
||||
Focus next window.
|
||||
.TP
|
||||
.B Mod1\-k
|
||||
Focus previous window.
|
||||
.TP
|
||||
.B Mod1\-i
|
||||
Increase number of windows in master area.
|
||||
.TP
|
||||
.B Mod1\-d
|
||||
Decrease number of windows in master area.
|
||||
.TP
|
||||
.B Mod1\-l
|
||||
Increase master area size.
|
||||
.TP
|
||||
.B Mod1\-h
|
||||
Decrease master area size.
|
||||
.TP
|
||||
.B Mod1\-Return
|
||||
Zooms/cycles focused window to/from master area (tiled layouts only).
|
||||
.TP
|
||||
.B Mod1\-Shift\-c
|
||||
Close focused window.
|
||||
.TP
|
||||
.B Mod1\-Shift\-space
|
||||
Toggle focused window between tiled and floating state.
|
||||
.TP
|
||||
.B Mod1\-Tab
|
||||
Toggles to the previously selected tags.
|
||||
.TP
|
||||
.B Mod1\-Shift\-[1..n]
|
||||
Apply nth tag to focused window.
|
||||
.TP
|
||||
.B Mod1\-Shift\-0
|
||||
Apply all tags to focused window.
|
||||
.TP
|
||||
.B Mod1\-Control\-Shift\-[1..n]
|
||||
Add/remove nth tag to/from focused window.
|
||||
.TP
|
||||
.B Mod1\-[1..n]
|
||||
View all windows with nth tag.
|
||||
.TP
|
||||
.B Mod1\-0
|
||||
View all windows with any tag.
|
||||
.TP
|
||||
.B Mod1\-Control\-[1..n]
|
||||
Add/remove all windows with nth tag to/from the view.
|
||||
.TP
|
||||
.B Mod1\-Shift\-q
|
||||
Quit dwm.
|
||||
.SS Mouse commands
|
||||
.TP
|
||||
.B Mod1\-Button1
|
||||
Move focused window while dragging. Tiled windows will be toggled to the floating state.
|
||||
.TP
|
||||
.B Mod1\-Button2
|
||||
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 CUSTOMIZATION
|
||||
dwm is customized by creating a custom config.h and (re)compiling the source
|
||||
code. This keeps it fast, secure and simple.
|
||||
.SH SEE ALSO
|
||||
.BR dmenu (1),
|
||||
.BR st (1)
|
||||
.SH ISSUES
|
||||
Java applications which use the XToolkit/XAWT backend may draw grey windows
|
||||
only. The XToolkit/XAWT backend breaks ICCCM-compliance in recent JDK 1.5 and early
|
||||
JDK 1.6 versions, because it assumes a reparenting window manager. Possible workarounds
|
||||
are using JDK 1.4 (which doesn't contain the XToolkit/XAWT backend) or setting the
|
||||
environment variable
|
||||
.BR AWT_TOOLKIT=MToolkit
|
||||
(to use the older Motif backend instead) or running
|
||||
.B xprop -root -f _NET_WM_NAME 32a -set _NET_WM_NAME LG3D
|
||||
or
|
||||
.B wmname LG3D
|
||||
(to pretend that a non-reparenting window manager is running that the
|
||||
XToolkit/XAWT backend can recognize) or when using OpenJDK setting the environment variable
|
||||
.BR _JAVA_AWT_WM_NONREPARENTING=1 .
|
||||
.SH BUGS
|
||||
Send all bug reports with a patch to hackers@suckless.org.
|
2049
config/dwm/dwm.c
2049
config/dwm/dwm.c
File diff suppressed because it is too large
Load diff
Binary file not shown.
Before Width: | Height: | Size: 373 B |
|
@ -1,42 +0,0 @@
|
|||
/* cc transient.c -o transient -lX11 */
|
||||
|
||||
#include <stdlib.h>
|
||||
#include <unistd.h>
|
||||
#include <X11/Xlib.h>
|
||||
#include <X11/Xutil.h>
|
||||
|
||||
int main(void) {
|
||||
Display *d;
|
||||
Window r, f, t = None;
|
||||
XSizeHints h;
|
||||
XEvent e;
|
||||
|
||||
d = XOpenDisplay(NULL);
|
||||
if (!d)
|
||||
exit(1);
|
||||
r = DefaultRootWindow(d);
|
||||
|
||||
f = XCreateSimpleWindow(d, r, 100, 100, 400, 400, 0, 0, 0);
|
||||
h.min_width = h.max_width = h.min_height = h.max_height = 400;
|
||||
h.flags = PMinSize | PMaxSize;
|
||||
XSetWMNormalHints(d, f, &h);
|
||||
XStoreName(d, f, "floating");
|
||||
XMapWindow(d, f);
|
||||
|
||||
XSelectInput(d, f, ExposureMask);
|
||||
while (1) {
|
||||
XNextEvent(d, &e);
|
||||
|
||||
if (t == None) {
|
||||
sleep(5);
|
||||
t = XCreateSimpleWindow(d, r, 50, 50, 100, 100, 0, 0, 0);
|
||||
XSetTransientForHint(d, t, f);
|
||||
XStoreName(d, t, "transient");
|
||||
XMapWindow(d, t);
|
||||
XSelectInput(d, t, ExposureMask);
|
||||
}
|
||||
}
|
||||
|
||||
XCloseDisplay(d);
|
||||
exit(0);
|
||||
}
|
|
@ -1,36 +0,0 @@
|
|||
/* See LICENSE file for copyright and license details. */
|
||||
#include <stdarg.h>
|
||||
#include <stdio.h>
|
||||
#include <stdlib.h>
|
||||
#include <string.h>
|
||||
|
||||
#include "util.h"
|
||||
|
||||
void
|
||||
die(const char *fmt, ...)
|
||||
{
|
||||
va_list ap;
|
||||
|
||||
va_start(ap, fmt);
|
||||
vfprintf(stderr, fmt, ap);
|
||||
va_end(ap);
|
||||
|
||||
if (fmt[0] && fmt[strlen(fmt)-1] == ':') {
|
||||
fputc(' ', stderr);
|
||||
perror(NULL);
|
||||
} else {
|
||||
fputc('\n', stderr);
|
||||
}
|
||||
|
||||
exit(1);
|
||||
}
|
||||
|
||||
void *
|
||||
ecalloc(size_t nmemb, size_t size)
|
||||
{
|
||||
void *p;
|
||||
|
||||
if (!(p = calloc(nmemb, size)))
|
||||
die("calloc:");
|
||||
return p;
|
||||
}
|
|
@ -1,8 +0,0 @@
|
|||
/* See LICENSE file for copyright and license details. */
|
||||
|
||||
#define MAX(A, B) ((A) > (B) ? (A) : (B))
|
||||
#define MIN(A, B) ((A) < (B) ? (A) : (B))
|
||||
#define BETWEEN(X, A, B) ((A) <= (X) && (X) <= (B))
|
||||
|
||||
void die(const char *fmt, ...);
|
||||
void *ecalloc(size_t nmemb, size_t size);
|
|
@ -1,30 +0,0 @@
|
|||
#!/bin/sh
|
||||
|
||||
blue=#0000ff
|
||||
|
||||
battery() {
|
||||
get_capacity="$(cat /sys/class/power_supply/BAT1/capacity)"
|
||||
get_status="$(cat /sys/class/power_supply/BAT1/status)"
|
||||
case "$get_status" in
|
||||
Charging) printf " $get_capacity" ;;
|
||||
Discharging) printf " $get_capacity" ;;
|
||||
esac
|
||||
}
|
||||
|
||||
audio() {
|
||||
get_vol=$(pamixer --get-volume-human)
|
||||
if [ $get_vol = 'muted' ]; then
|
||||
printf " Muted"
|
||||
else
|
||||
printf " $get_vol"
|
||||
fi
|
||||
}
|
||||
|
||||
clock() {
|
||||
printf "$(date '+%H:%M') "
|
||||
}
|
||||
|
||||
while true; do
|
||||
xsetroot -name " $(clock) $(audio) $(battery) "
|
||||
sleep 1
|
||||
done
|
|
@ -1,9 +1,10 @@
|
|||
IMAPAccount outlook
|
||||
AuthMechs XOAUTH2
|
||||
Host outlook.office365.com
|
||||
Port 993
|
||||
UserCmd "pass Microsoft | awk 'BEGIN {ORS=\"\"} FNR == 2{gsub(\"login: \", \"\"); gsub(/ /, \"\"); print}'"
|
||||
PassCmd "pass Microsoft"
|
||||
SSLType IMAPS
|
||||
UserCmd "pass Microsoft | grep 'login:' | sed 's/login: //'"
|
||||
PassCmd "oama access $(pass Microsoft | grep 'login:' | sed 's/login: //')"
|
||||
TLSType IMAPS
|
||||
|
||||
IMAPStore outlook-remote
|
||||
Account outlook
|
||||
|
@ -21,20 +22,68 @@ Create Both
|
|||
Expunge Both
|
||||
SyncState *
|
||||
|
||||
IMAPAccount gmail-1
|
||||
AuthMechs XOAUTH2
|
||||
Host imap.gmail.com
|
||||
Port 993
|
||||
UserCmd "pass accounts.google.com/one | grep 'login:' | sed 's/login: //'"
|
||||
PassCmd "oama access $(pass accounts.google.com/one | grep 'login:' | sed 's/login: //')"
|
||||
TLSType IMAPS
|
||||
|
||||
IMAPStore gmail-1-remote
|
||||
Account gmail-1
|
||||
|
||||
MaildirStore gmail-1-local
|
||||
Subfolders Verbatim
|
||||
Path ~/Mail/gmail-one/
|
||||
Inbox ~/Mail/gmail-one/Inbox
|
||||
|
||||
Channel gmail-1
|
||||
Far :gmail-1-remote:
|
||||
Near :gmail-1-local:
|
||||
Patterns * !"[Gmail]/All Mail" !"[Gmail]/Important" !"[Gmail]/Starred" !"[Gmail]/Bin"
|
||||
Create Both
|
||||
Expunge Both
|
||||
SyncState *
|
||||
|
||||
IMAPAccount gmail-2
|
||||
AuthMechs XOAUTH2
|
||||
Host imap.gmail.com
|
||||
Port 993
|
||||
UserCmd "pass accounts.google.com/two| grep 'login:' | sed 's/login: //'"
|
||||
PassCmd "oama access $(pass accounts.google.com/two | grep 'login:' | sed 's/login: //')"
|
||||
TLSType IMAPS
|
||||
|
||||
IMAPStore gmail-2-remote
|
||||
Account gmail-2
|
||||
|
||||
MaildirStore gmail-2-local
|
||||
Subfolders Verbatim
|
||||
Path ~/Mail/gmail-two/
|
||||
Inbox ~/Mail/gmail-two/Inbox
|
||||
|
||||
Channel gmail-2
|
||||
Far :gmail-2-remote:
|
||||
Near :gmail-2-local:
|
||||
Patterns * !"[Gmail]/All Mail" !"[Gmail]/Important" !"[Gmail]/Starred" !"[Gmail]/Bin"
|
||||
Create Both
|
||||
Expunge Both
|
||||
SyncState *
|
||||
|
||||
IMAPAccount proton
|
||||
Host 127.0.0.1
|
||||
Port 1143
|
||||
UserCmd "pass 'Proton Account' | awk 'BEGIN {ORS=\"\"} FNR == 2{gsub(\"login: \", \"\"); gsub(/ /, \"\"); print}'"
|
||||
UserCmd "pass 'Proton Account' | grep 'login:' | sed 's/login: //'"
|
||||
PassCmd "cat ~/.hydroxide-bridge-pass"
|
||||
SSLType none
|
||||
TLSType None
|
||||
|
||||
IMAPStore proton-remote
|
||||
Account proton
|
||||
|
||||
MailDirStore proton-local
|
||||
SubFolders Verbatim
|
||||
Path ~/Mail/Proton/
|
||||
Inbox ~/Mail/Proton/Inbox
|
||||
Path ~/.mail/proton/
|
||||
Inbox ~/.mail/proton/Inbox
|
||||
|
||||
Channel proton
|
||||
Far :proton-remote:
|
||||
|
@ -43,3 +92,25 @@ Patterns *
|
|||
Create Both
|
||||
Expunge Both
|
||||
SyncState *
|
||||
|
||||
IMAPAccount li
|
||||
AuthMechs *
|
||||
UserCmd "pass show email/li | grep 'login: ' | sed 's/login: //'"
|
||||
PassCmd "pass show email/li"
|
||||
Tunnel "nc -T protocols=all -T ciphers=compat -X 5 -x <PROXY> <HOST> <PORT>"
|
||||
|
||||
IMAPStore li-remote
|
||||
Account li
|
||||
|
||||
MailDirStore li-local
|
||||
SubFolders Verbatim
|
||||
Path ~/.mail/li/
|
||||
Inbox ~/.mail/li/Inbox
|
||||
|
||||
Channel li
|
||||
Far :li-remote:
|
||||
Near :li-local:
|
||||
Patterns *
|
||||
Create Both
|
||||
Expunge Both
|
||||
SyncState *
|
||||
|
|
52
config/emacs/.offlineimap.py
Normal file
52
config/emacs/.offlineimap.py
Normal file
|
@ -0,0 +1,52 @@
|
|||
#! /usr/bin/env python
|
||||
from subprocess import check_output
|
||||
import re
|
||||
|
||||
|
||||
def get_pass(account):
|
||||
return check_output("pass " + account, shell=True).splitlines()[0]
|
||||
|
||||
|
||||
def get_user(account):
|
||||
usercmd = check_output("pass " + account, shell=True)
|
||||
|
||||
return re.search(rb"login: (.*)", usercmd, flags=0).group(1).decode("utf-8")
|
||||
|
||||
|
||||
def get_host(account):
|
||||
usercmd = check_output("pass " + account, shell=True)
|
||||
|
||||
return re.search(rb"host: (.*)", usercmd, flags=0).group(1).decode("utf-8")
|
||||
|
||||
|
||||
def hydroxide(path):
|
||||
|
||||
file = open(path, "r")
|
||||
|
||||
pword = file.read()
|
||||
|
||||
return pword
|
||||
|
||||
|
||||
def get_client_id(account):
|
||||
cmd = check_output("pass " + account, shell=True)
|
||||
|
||||
output = re.search("client_id: (.*)", cmd.decode(), flags=0).group(1)
|
||||
|
||||
return output
|
||||
|
||||
|
||||
def get_client_secret(account):
|
||||
cmd = check_output("pass " + account, shell=True)
|
||||
|
||||
output = re.search("client_secret: (.*)", cmd.decode(), flags=0).group(1)
|
||||
|
||||
return output
|
||||
|
||||
|
||||
def get_client_refresh_token(account):
|
||||
cmd = check_output("pass " + account, shell=True)
|
||||
|
||||
output = re.search("client_refresh_token: (.*)", cmd.decode(), flags=0).group(1)
|
||||
|
||||
return output
|
112
config/emacs/.offlineimaprc
Normal file
112
config/emacs/.offlineimaprc
Normal file
|
@ -0,0 +1,112 @@
|
|||
[general]
|
||||
pythonfile = ~/.offlineimap.py
|
||||
accounts = Proton, Outlook, Gmail-personal-1, Gmail-personal-2, li
|
||||
socktimeout = 60
|
||||
|
||||
[Account Proton]
|
||||
localrepository = Proton-local
|
||||
remoterepository = Proton-remote
|
||||
|
||||
[Repository Proton-local]
|
||||
type = Maildir
|
||||
localfolders = ~/.mail/protonmail
|
||||
|
||||
[Repository Proton-remote]
|
||||
type = IMAP
|
||||
ssl = no
|
||||
remotehost = 127.0.0.1
|
||||
remoteport = 1143
|
||||
remoteusereval = get_user("Proton\ Account")
|
||||
remotepasseval = hydroxide("/home/sako/.hydroxide-bridge-pass")
|
||||
folderfilter = lambda foldername: foldername in [ "All Mail", "Archive", "Drafts", "INBOX", "Sent", "Spam", "Starred", "Trash" ]
|
||||
|
||||
[Account Outlook]
|
||||
localrepository = Outlook-local
|
||||
remoterepository = Outlook-remote
|
||||
|
||||
[Repository Outlook-local]
|
||||
type = Maildir
|
||||
localfolders = ~/.mail/outlook
|
||||
|
||||
[Repository Outlook-remote]
|
||||
ssl = yes
|
||||
sslcacertfile = /etc/ssl/certs/ca-certificates.crt
|
||||
type = IMAP
|
||||
remoteusereval = get_user("Microsoft")
|
||||
remotehost = outlook.office365.com
|
||||
remoteport = 993
|
||||
auth_mechanisms = XOAUTH2
|
||||
oauth2_request_url = https://login.microsoftonline.com/common/oauth2/v2.0/token
|
||||
# Thunderbird client_id below
|
||||
oauth2_client_id = 9e5f94bc-e8a4-4e73-b8be-63364c29d753
|
||||
# Do not need client_secret :D
|
||||
oauth2_client_secret =
|
||||
oauth2_refresh_token_eval = get_client_refresh_token("Microsoft")
|
||||
folderfilter = lambda folder: not folder.startswith('Calendar') and not folder.startswith('Contacts')
|
||||
|
||||
[Account Gmail-personal-1]
|
||||
localrepository = Gmail-personal-1-local
|
||||
remoterepository = Gmail-personal-1-remote
|
||||
|
||||
[Repository Gmail-personal-1-local]
|
||||
type = GmailMaildir
|
||||
localfolders = ~/.mail/gmail1
|
||||
# Google IMAP weirdness
|
||||
nametrans = lambda f: '[Gmail]/' + f if f in ['Drafts', 'Starred', 'Important', 'Spam', 'Trash', 'All Mail', 'Sent Mail'] else f
|
||||
|
||||
[Repository Gmail-personal-1-remote]
|
||||
ssl = yes
|
||||
sslcacertfile = /etc/ssl/certs/ca-certificates.crt
|
||||
type = Gmail
|
||||
remotehost = imap.gmail.com
|
||||
auth_mechanisms = XOAUTH2
|
||||
remoteusereval = get_user("accounts.google.com/one")
|
||||
oauth2_request_url = https://accounts.google.com/o/oauth2/token
|
||||
oauth2_client_id_eval = get_client_id("email/oauth/gmail")
|
||||
oauth2_client_secret_eval = get_client_secret("email/oauth/gmail")
|
||||
oauth2_refresh_token_eval = get_client_refresh_token("accounts.google.com/one")
|
||||
# Google IMAP weirdness
|
||||
nametrans = lambda f: f.replace('[Gmail]/', '') if f.startswith('[Gmail]/') else f
|
||||
|
||||
[Account Gmail-personal-2]
|
||||
localrepository = Gmail-personal-2-local
|
||||
remoterepository = Gmail-personal-2-remote
|
||||
|
||||
[Repository Gmail-personal-2-local]
|
||||
type = GmailMaildir
|
||||
localfolders = ~/.mail/gmail2
|
||||
# Google IMAP weirdness
|
||||
nametrans = lambda f: '[Gmail]/' + f if f in ['Drafts', 'Starred', 'Important', 'Spam', 'Trash', 'All Mail', 'Sent Mail'] else f
|
||||
|
||||
[Repository Gmail-personal-2-remote]
|
||||
ssl = yes
|
||||
sslcacertfile = /etc/ssl/certs/ca-certificates.crt
|
||||
type = Gmail
|
||||
remotehost = imap.gmail.com
|
||||
auth_mechanisms = XOAUTH2
|
||||
remoteusereval = get_user("accounts.google.com/two")
|
||||
oauth2_request_url = https://accounts.google.com/o/oauth2/token
|
||||
oauth2_client_id_eval = get_client_id("email/oauth/gmail")
|
||||
oauth2_client_secret_eval = get_client_secret("email/oauth/gmail")
|
||||
oauth2_refresh_token_eval = get_client_refresh_token("accounts.google.com/two")
|
||||
# Google IMAP weirdness
|
||||
nametrans = lambda f: f.replace('[Gmail]/', '') if f.startswith('[Gmail]/') else f
|
||||
|
||||
[Account li]
|
||||
localrepository = li-local
|
||||
remoterepository = li-remote
|
||||
proxy = SOCKS5:localhost:9050
|
||||
|
||||
[Repository li-local]
|
||||
type = Maildir
|
||||
localfolders = ~/.mail/li
|
||||
|
||||
[Repository li-remote]
|
||||
type = IMAP
|
||||
ssl = yes
|
||||
sslcacertfile = /etc/ssl/certs/ca-certificates.crt
|
||||
remotehosteval = get_host("email/li")
|
||||
remoteport = 993
|
||||
remoteusereval = get_user("email/li")
|
||||
remotepasseval = get_pass("email/li")
|
||||
|
|
@ -13,9 +13,7 @@
|
|||
(setq package-archives `(("mepla" . "https://melpa.org/packages/")
|
||||
("org" . "https://orgmode.org/elpa/")
|
||||
("elpa" . "https://elpa.gnu.org/packages/")))
|
||||
|
||||
(package-initialize)
|
||||
|
||||
(unless (package-installed-p 'use-package)
|
||||
(progn
|
||||
(package-refresh-contents)
|
||||
|
@ -201,9 +199,29 @@ kept-old-versions 5)
|
|||
#+end_src
|
||||
** Appearance
|
||||
#+begin_src emacs-lisp
|
||||
(use-package doom-themes
|
||||
;; (use-package doom-themes
|
||||
;; :config
|
||||
;; (load-theme 'doom-sourcerer t))
|
||||
|
||||
;; (use-package grandshell-theme
|
||||
;; :config
|
||||
;; (load-theme 'grandshell t))
|
||||
|
||||
;; (use-package ef-themes
|
||||
;; :config
|
||||
;; (load-theme 'ef-dark t))
|
||||
|
||||
;; (use-package kanagawa-themes
|
||||
;; :config
|
||||
;; (load-theme 'kanagawa-dragon t))
|
||||
|
||||
;; (use-package klere-theme
|
||||
;; :config
|
||||
;; (load-theme 'klere t))
|
||||
|
||||
(use-package kaolin-themes
|
||||
:config
|
||||
(load-theme 'doom-sourcerer t))
|
||||
(load-theme 'kaolin-shiva t))
|
||||
|
||||
;; emacsclient things
|
||||
(setq frame-resize-pixelwise t)
|
||||
|
@ -239,14 +257,14 @@ kept-old-versions 5)
|
|||
#+end_src
|
||||
** Modeline
|
||||
#+begin_src emacs-lisp
|
||||
(use-package nerd-icons
|
||||
:custom
|
||||
(nerd-icons-font-family "JetBrainsMono NF"))
|
||||
(use-package doom-modeline
|
||||
:custom
|
||||
(doom-modeline-height 35)
|
||||
(doom-modeline-modal-modern-icon nil)
|
||||
:init (doom-modeline-mode 1))
|
||||
;; (use-package nerd-icons
|
||||
;; :custom
|
||||
;; (nerd-icons-font-family "JetBrainsMono NF"))
|
||||
;; (use-package doom-modeline
|
||||
;; :custom
|
||||
;; (doom-modeline-height 35)
|
||||
;; (doom-modeline-modal-modern-icon nil)
|
||||
;; :init (doom-modeline-mode 1))
|
||||
#+end_src
|
||||
** Editor Configuration
|
||||
#+begin_src emacs-lisp
|
||||
|
@ -321,141 +339,141 @@ kept-old-versions 5)
|
|||
#+end_src
|
||||
** General
|
||||
#+begin_src emacs-lisp
|
||||
(use-package general
|
||||
:config
|
||||
(general-create-definer sk/leader-keys
|
||||
:keymaps '(normal insert visual emacs)
|
||||
:prefix "SPC"
|
||||
:global-prefix "C-SPC")
|
||||
;; (use-package general
|
||||
;; :config
|
||||
;; (general-create-definer sk/leader-keys
|
||||
;; :keymaps '(normal insert visual emacs)
|
||||
;; :prefix "SPC"
|
||||
;; :global-prefix "C-SPC")
|
||||
|
||||
(sk/leader-keys
|
||||
;; code
|
||||
"c" '(:ignore c :which-key "code")
|
||||
"cc" '(compile :which-key "compile")
|
||||
"cC" '(recompile :which-key "compile")
|
||||
"cX" '(lsp-treeemacs-errors-list :which-ley "list errors")
|
||||
;; toggles
|
||||
"t" '(:ignore t :which-key "toggles")
|
||||
"tt" '(counsel-load-theme :which-key "choose theme")
|
||||
"ts" '(hydra-text-scale/body :which-key "scale text")
|
||||
;; search
|
||||
"s" '(:ignore s :which-key "search")
|
||||
"sb" '(swiper :which-key "search buffer")
|
||||
;; insert
|
||||
"i" '(:ignore i :which-key "insert")
|
||||
"ie" '(emoji-search :which-key "Emoji")
|
||||
;; project
|
||||
"p" '(:ignore p :which-key "projects")
|
||||
"pp" '(project-switch-project :which-key "open project")
|
||||
"pk" '(project-kill-buffers :which-key "close project")
|
||||
"pt" '(magit-todos-list :which-key "list project todos")
|
||||
"po" '(project-find-file :which-key "find file")
|
||||
"pc" '(project-compile :which-key "compile project")
|
||||
;; open
|
||||
"o" '(:ignore o :which-key "open")
|
||||
"op" '(treemacs :which-key "treemacs")
|
||||
"oP" '(treemacs-find-file :which-key "treemacs find file")
|
||||
"oe" '(eshell :which-key "eshell")
|
||||
"ov" '(vterm :which-key "vterm")
|
||||
"or" '(elfeed :which-key "rss")
|
||||
;; notes
|
||||
"n" '(:ignore o :which-key "notes")
|
||||
"na" '(org-agenda :which-key "agenda")
|
||||
"nf" '(org-roam-node-find :which-key "find node")
|
||||
"nc" '(org-capture :which-key "capture")
|
||||
"np" '(org-pomodoro :which-key "pomodoro")
|
||||
"ne" '(:ignore ne :which-key "export")
|
||||
"nep" '(org-latex-export-to-pdf :which-key "pdf")
|
||||
;; quit
|
||||
"q" '(:ignore q :which-key "quit")
|
||||
"qq" '(delete-frame :which-key "close emacs")
|
||||
"qK" '(kill-emacs :which-key "quit emacs")
|
||||
;; git
|
||||
"g" '(:ignore g :which-key "git")
|
||||
"gs" '(magit-status :which-key "status")
|
||||
"gc" '(:ignore gc :which-key "create")
|
||||
"gcr" '(magit-init :which-key "init repo")
|
||||
"gcR" '(magit-clone :which-key "clone repo")
|
||||
"gcc" '(magit-commit-create :which-key "commit")
|
||||
"gci" '(forge-create-issue :which-key "issue")
|
||||
"gcp" '(forge-create-pullreq :which-key "pull request")
|
||||
;; mail
|
||||
"m" '(mu4e :which-key "mu4e")))
|
||||
;; (sk/leader-keys
|
||||
;; ;; code
|
||||
;; "c" '(:ignore c :which-key "code")
|
||||
;; "cc" '(compile :which-key "compile")
|
||||
;; "cC" '(recompile :which-key "compile")
|
||||
;; "cX" '(lsp-treeemacs-errors-list :which-ley "list errors")
|
||||
;; ;; toggles
|
||||
;; "t" '(:ignore t :which-key "toggles")
|
||||
;; "tt" '(counsel-load-theme :which-key "choose theme")
|
||||
;; "ts" '(hydra-text-scale/body :which-key "scale text")
|
||||
;; ;; search
|
||||
;; "s" '(:ignore s :which-key "search")
|
||||
;; "sb" '(swiper :which-key "search buffer")
|
||||
;; ;; insert
|
||||
;; "i" '(:ignore i :which-key "insert")
|
||||
;; "ie" '(emoji-search :which-key "Emoji")
|
||||
;; ;; project
|
||||
;; "p" '(:ignore p :which-key "projects")
|
||||
;; "pp" '(project-switch-project :which-key "open project")
|
||||
;; "pk" '(project-kill-buffers :which-key "close project")
|
||||
;; "pt" '(magit-todos-list :which-key "list project todos")
|
||||
;; "po" '(project-find-file :which-key "find file")
|
||||
;; "pc" '(project-compile :which-key "compile project")
|
||||
;; ;; open
|
||||
;; "o" '(:ignore o :which-key "open")
|
||||
;; "op" '(treemacs :which-key "treemacs")
|
||||
;; "oP" '(treemacs-find-file :which-key "treemacs find file")
|
||||
;; "oe" '(eshell :which-key "eshell")
|
||||
;; "ov" '(vterm :which-key "vterm")
|
||||
;; "or" '(elfeed :which-key "rss")
|
||||
;; ;; notes
|
||||
;; "n" '(:ignore o :which-key "notes")
|
||||
;; "na" '(org-agenda :which-key "agenda")
|
||||
;; "nf" '(org-roam-node-find :which-key "find node")
|
||||
;; "nc" '(org-capture :which-key "capture")
|
||||
;; "np" '(org-pomodoro :which-key "pomodoro")
|
||||
;; "ne" '(:ignore ne :which-key "export")
|
||||
;; "nep" '(org-latex-export-to-pdf :which-key "pdf")
|
||||
;; ;; quit
|
||||
;; "q" '(:ignore q :which-key "quit")
|
||||
;; "qq" '(delete-frame :which-key "close emacs")
|
||||
;; "qK" '(kill-emacs :which-key "quit emacs")
|
||||
;; ;; git
|
||||
;; "g" '(:ignore g :which-key "git")
|
||||
;; "gs" '(magit-status :which-key "status")
|
||||
;; "gc" '(:ignore gc :which-key "create")
|
||||
;; "gcr" '(magit-init :which-key "init repo")
|
||||
;; "gcR" '(magit-clone :which-key "clone repo")
|
||||
;; "gcc" '(magit-commit-create :which-key "commit")
|
||||
;; "gci" '(forge-create-issue :which-key "issue")
|
||||
;; "gcp" '(forge-create-pullreq :which-key "pull request")
|
||||
;; ;; mail
|
||||
;; "m" '(mu4e :which-key "mu4e")))
|
||||
|
||||
#+end_src
|
||||
** Evil
|
||||
#+begin_src emacs-lisp
|
||||
|
||||
(use-package evil
|
||||
:init
|
||||
;; Pre-load configuration
|
||||
(setq evil-want-integration t)
|
||||
(setq evil-want-keybinding nil)
|
||||
(setq evil-want-C-u-scroll t)
|
||||
(setq evil-want-C-i-jump nil)
|
||||
(setq evil-respect-visual-line-mode t)
|
||||
(setq evil-undo-system 'undo-tree)
|
||||
:config
|
||||
(evil-mode 1)
|
||||
;; (use-package evil
|
||||
;; :init
|
||||
;; ;; Pre-load configuration
|
||||
;; (setq evil-want-integration t)
|
||||
;; (setq evil-want-keybinding nil)
|
||||
;; (setq evil-want-C-u-scroll t)
|
||||
;; (setq evil-want-C-i-jump nil)
|
||||
;; (setq evil-respect-visual-line-mode t)
|
||||
;; (setq evil-undo-system 'undo-tree)
|
||||
;; :config
|
||||
;; (evil-mode 1)
|
||||
|
||||
;; use emacs state for these mods
|
||||
(dolist (mode '(custom-mode
|
||||
eshell-mode
|
||||
git-rebase-mode
|
||||
erc-mode
|
||||
circe-server-mode
|
||||
circe-chat-mode
|
||||
circe-query-mode
|
||||
term-mode))
|
||||
(add-to-list 'evil-emacs-state-modes mode))
|
||||
;; ;; use emacs state for these mods
|
||||
;; (dolist (mode '(custom-mode
|
||||
;; eshell-mode
|
||||
;; git-rebase-mode
|
||||
;; erc-mode
|
||||
;; circe-server-mode
|
||||
;; circe-chat-mode
|
||||
;; circe-query-mode
|
||||
;; term-mode))
|
||||
;; (add-to-list 'evil-emacs-state-modes mode))
|
||||
|
||||
(defun sk/dont-arrow-me-bro ()
|
||||
(interactive)
|
||||
(message "STOP USING THE ARROW KEYS!!!!!!!!!!!!!!!!!!!!!!!"))
|
||||
;; (defun sk/dont-arrow-me-bro ()
|
||||
;; (interactive)
|
||||
;; (message "STOP USING THE ARROW KEYS!!!!!!!!!!!!!!!!!!!!!!!"))
|
||||
|
||||
;; Disable arrow keys in normal and visual modes
|
||||
(define-key evil-normal-state-map (kbd "<left>") 'sk/dont-arrow-me-bro)
|
||||
(define-key evil-normal-state-map (kbd "<right>") 'sk/dont-arrow-me-bro)
|
||||
(define-key evil-normal-state-map (kbd "<down>") 'sk/dont-arrow-me-bro)
|
||||
(define-key evil-normal-state-map (kbd "<up>") 'sk/dont-arrow-me-bro)
|
||||
(evil-global-set-key 'motion (kbd "<left>") 'sk/dont-arrow-me-bro)
|
||||
(evil-global-set-key 'motion (kbd "<right>") 'sk/dont-arrow-me-bro)
|
||||
(evil-global-set-key 'motion (kbd "<down>") 'sk/dont-arrow-me-bro)
|
||||
(evil-global-set-key 'motion (kbd "<up>") 'sk/dont-arrow-me-bro)
|
||||
;; ;; Disable arrow keys in normal and visual modes
|
||||
;; (define-key evil-normal-state-map (kbd "<left>") 'sk/dont-arrow-me-bro)
|
||||
;; (define-key evil-normal-state-map (kbd "<right>") 'sk/dont-arrow-me-bro)
|
||||
;; (define-key evil-normal-state-map (kbd "<down>") 'sk/dont-arrow-me-bro)
|
||||
;; (define-key evil-normal-state-map (kbd "<up>") 'sk/dont-arrow-me-bro)
|
||||
;; (evil-global-set-key 'motion (kbd "<left>") 'sk/dont-arrow-me-bro)
|
||||
;; (evil-global-set-key 'motion (kbd "<right>") 'sk/dont-arrow-me-bro)
|
||||
;; (evil-global-set-key 'motion (kbd "<down>") 'sk/dont-arrow-me-bro)
|
||||
;; (evil-global-set-key 'motion (kbd "<up>") 'sk/dont-arrow-me-bro)
|
||||
|
||||
(evil-set-initial-state 'messages-buffer-mode 'normal)
|
||||
(evil-set-initial-state 'dashboard-mode 'normal))
|
||||
;; (evil-set-initial-state 'messages-buffer-mode 'normal)
|
||||
;; (evil-set-initial-state 'dashboard-mode 'normal))
|
||||
|
||||
(use-package evil-collection
|
||||
:after evil
|
||||
:custom
|
||||
(evil-collection-outline-bind-tab-p nil)
|
||||
:config
|
||||
;; Is this a bug in evil-collection?
|
||||
(setq evil-collection-company-use-tng nil)
|
||||
(delete 'lispy evil-collection-mode-list)
|
||||
(delete 'org-present evil-collection-mode-list)
|
||||
;; (delete 'mu4e evil-collection-mode-list)
|
||||
;; (delete 'mu4e-conversation evil-collection-mode-list)
|
||||
(evil-collection-init))
|
||||
;; (use-package evil-collection
|
||||
;; :after evil
|
||||
;; :custom
|
||||
;; (evil-collection-outline-bind-tab-p nil)
|
||||
;; :config
|
||||
;; ;; Is this a bug in evil-collection?
|
||||
;; (setq evil-collection-company-use-tng nil)
|
||||
;; (delete 'lispy evil-collection-mode-list)
|
||||
;; (delete 'org-present evil-collection-mode-list)
|
||||
;; ;; (delete 'mu4e evil-collection-mode-list)
|
||||
;; ;; (delete 'mu4e-conversation evil-collection-mode-list)
|
||||
;; (evil-collection-init))
|
||||
|
||||
(use-package evil-org
|
||||
:after (evil org)
|
||||
:hook ((org-mode . evil-org-mode)
|
||||
(org-agenda-mode . evil-org-mode))
|
||||
:config
|
||||
(require 'evil-org-agenda)
|
||||
(evil-org-set-key-theme '(navigation todo insert textobjects additional))
|
||||
(evil-org-agenda-set-keys))
|
||||
;; (use-package evil-org
|
||||
;; :after (evil org)
|
||||
;; :hook ((org-mode . evil-org-mode)
|
||||
;; (org-agenda-mode . evil-org-mode))
|
||||
;; :config
|
||||
;; (require 'evil-org-agenda)
|
||||
;; (evil-org-set-key-theme '(navigation todo insert textobjects additional))
|
||||
;; (evil-org-agenda-set-keys))
|
||||
|
||||
(use-package evil-nerd-commenter
|
||||
:bind ("M-/" . evilnc-comment-or-uncomment-lines))
|
||||
;; (use-package evil-nerd-commenter
|
||||
;; :bind ("M-/" . evilnc-comment-or-uncomment-lines))
|
||||
|
||||
(with-eval-after-load 'org
|
||||
(evil-define-key '(normal insert visual) org-mode-map (kbd "C-j") 'org-next-visible-heading)
|
||||
(evil-define-key '(normal insert visual) org-mode-map (kbd "C-k") 'org-previous-visible-heading)
|
||||
(evil-define-key '(normal insert visual) org-mode-map (kbd "M-j") 'org-metadown)
|
||||
(evil-define-key '(normal insert visual) org-mode-map (kbd "M-k") 'org-metaup))
|
||||
;; (with-eval-after-load 'org
|
||||
;; (evil-define-key '(normal insert visual) org-mode-map (kbd "C-j") 'org-next-visible-heading)
|
||||
;; (evil-define-key '(normal insert visual) org-mode-map (kbd "C-k") 'org-previous-visible-heading)
|
||||
;; (evil-define-key '(normal insert visual) org-mode-map (kbd "M-j") 'org-metadown)
|
||||
;; (evil-define-key '(normal insert visual) org-mode-map (kbd "M-k") 'org-metaup))
|
||||
#+end_src
|
||||
* Interface
|
||||
#+begin_src emacs-lisp
|
||||
|
@ -588,8 +606,8 @@ kept-old-versions 5)
|
|||
:init
|
||||
(setq initial-buffer-choice 'dashboard-open)
|
||||
;; Set the title
|
||||
(setq dashboard-banner-logo-title "GET ME OUT GET ME OUT GET ME OUT")
|
||||
(setq dashboard-image-banner-max-height 200)
|
||||
(setq dashboard-banner-logo-title "Welcome to Emacs!")
|
||||
(setq dashboard-image-banner-max-height 100)
|
||||
;; Set the banner
|
||||
(setq dashboard-startup-banner '"~/.emacs.d/icon.png")
|
||||
(setq dashboard-center-content t)
|
||||
|
@ -601,9 +619,7 @@ kept-old-versions 5)
|
|||
(setq dashboard-icon-type 'nerd-icons) ; use `nerd-icons' package
|
||||
|
||||
;; list stuff
|
||||
(setq dashboard-items '((recents . 3)
|
||||
(projects . 3)
|
||||
(agenda . 3)))
|
||||
(setq dashboard-items '((projects . 3)))
|
||||
:config
|
||||
(dashboard-setup-startup-hook))
|
||||
#+end_src
|
||||
|
@ -616,8 +632,9 @@ kept-old-versions 5)
|
|||
(unless (eq system-type 'windows-nt)
|
||||
(use-package pinentry
|
||||
:config
|
||||
(setq epa-pinentry-mode 'loopback))
|
||||
(setq epa-pinentry-mode 'loopback)
|
||||
(pinentry-start))
|
||||
)
|
||||
#+end_src
|
||||
** Password-Store
|
||||
#+begin_src emacs-lisp
|
||||
|
@ -628,9 +645,9 @@ kept-old-versions 5)
|
|||
:config
|
||||
(setq password-store-password-length 12))
|
||||
|
||||
(use-package auth-source-pass
|
||||
:config
|
||||
(auth-source-pass-enable))
|
||||
(use-package pass)
|
||||
|
||||
(auth-source-pass-enable)
|
||||
#+end_src
|
||||
** OAuth2
|
||||
this should be useful later
|
||||
|
@ -675,6 +692,7 @@ this should be useful later
|
|||
** VTerm
|
||||
#+begin_src emacs-lisp
|
||||
(use-package vterm
|
||||
:bind ("<f1>" . vterm)
|
||||
:commands vterm
|
||||
:config
|
||||
(setq vterm-max-scrollback 10000))
|
||||
|
@ -774,12 +792,6 @@ this should be useful later
|
|||
:config
|
||||
(global-flycheck-mode +1))
|
||||
#+end_src
|
||||
** Docker
|
||||
#+begin_src emacs-lisp
|
||||
(use-package docker
|
||||
:ensure t
|
||||
:bind ("C-c d" . docker))
|
||||
#+end_src
|
||||
** Treemacs
|
||||
#+begin_src emacs-lisp
|
||||
(use-package treemacs
|
||||
|
@ -884,9 +896,26 @@ this should be useful later
|
|||
** Direnv
|
||||
#+begin_src emacs-lisp
|
||||
(when (eq system-type 'gnu/linux)
|
||||
(use-package direnv
|
||||
(use-package envrc
|
||||
:hook (after-init . envrc-global-mode)))
|
||||
#+end_src
|
||||
** Color Picker
|
||||
#+begin_src emacs-lisp
|
||||
(use-package zenity-color-picker)
|
||||
#+end_src
|
||||
** editorconfig
|
||||
people will probably get mad at me if i dont have this and i try to contribute
|
||||
#+begin_src emacs-lisp
|
||||
(use-package editorconfig
|
||||
:config
|
||||
(direnv-mode)))
|
||||
(editorconfig-mode 1))
|
||||
#+end_src
|
||||
** wakatime
|
||||
the feds are watching
|
||||
#+begin_src emacs-lisp
|
||||
(use-package wakatime-mode
|
||||
:config
|
||||
(global-wakatime-mode))
|
||||
#+end_src
|
||||
* Languages
|
||||
#+begin_src emacs-lisp
|
||||
|
@ -1019,16 +1048,6 @@ this should be useful later
|
|||
#+end_src
|
||||
** Rust
|
||||
#+begin_src emacs-lisp
|
||||
;; (use-package rust-mode
|
||||
;; :hook (rust-mode . eglot-ensure)
|
||||
;; :mode "\\.rs\\'")
|
||||
|
||||
;; (use-package cargo-mode
|
||||
;; :hook
|
||||
;; (rust-mode . cargo-minor-mode)
|
||||
;; :config
|
||||
;; (setq compilation-scroll-output t))
|
||||
|
||||
(use-package rustic
|
||||
:ensure t
|
||||
:config
|
||||
|
@ -1055,11 +1074,13 @@ this should be useful later
|
|||
#+end_src
|
||||
** Elcord (Discord rich precense)
|
||||
#+begin_src emacs-lisp
|
||||
(use-package elcord
|
||||
(use-package elcord
|
||||
:init
|
||||
(setq elcord-display-buffer-details nil)
|
||||
(setq elcord-use-major-mode-as-main-icon t)
|
||||
)
|
||||
(setq elcord-quiet t)
|
||||
:config
|
||||
(elcord-mode))
|
||||
#+end_src
|
||||
** Telegram
|
||||
does NOT WORK ON WINDOWS
|
||||
|
@ -1067,12 +1088,7 @@ does NOT WORK ON WINDOWS
|
|||
(unless (eq system-type 'windows-nt)
|
||||
(use-package telega))
|
||||
#+end_src
|
||||
** IRC
|
||||
Will configure later
|
||||
#+begin_src emacs-lisp
|
||||
(use-package rcirc)
|
||||
#+end_src
|
||||
** RSS
|
||||
** elfeed (rss)
|
||||
Will configure later, (use elfeed protocol ok ty)
|
||||
#+begin_src emacs-lisp
|
||||
(use-package elfeed
|
||||
|
@ -1094,6 +1110,29 @@ Will configure later, (use elfeed protocol ok ty)
|
|||
(setq elfeed-protocol-enabled-protocols '(fever))
|
||||
(elfeed-protocol-enable))
|
||||
#+end_src
|
||||
** IRC (erc)
|
||||
#+begin_src emacs-lisp
|
||||
(require 'erc)
|
||||
|
||||
(setq erc-server "znc.sako.box")
|
||||
(setq erc-port "7000")
|
||||
(setq erc-prompt "(^w^)->")
|
||||
|
||||
(defun sakomacs/erc-znc-detach-channel ()
|
||||
(when (erc-server-process-alive)
|
||||
(let ((tgt (erc-default-target)))
|
||||
(erc-server-send (format "DETACH %s" tgt)
|
||||
nil tgt))))
|
||||
|
||||
(add-hook 'erc-kill-channel-hook (sakomacs/erc-znc-detach-channel))
|
||||
|
||||
(defun sakomacs/begin-irc ()
|
||||
(interactive)
|
||||
(erc-tls :server "znc.sako.box" :port "7000" :nick "sako" :password (concat "sako@emacs/Libera:" (password-store-get "SelfHosted/ZNC"))))
|
||||
|
||||
;; (advice-add 'irc :override
|
||||
;; (sakomacs/begin-irc))
|
||||
#+end_src
|
||||
** Matrix
|
||||
Ill set this up later as well
|
||||
#+begin_src emacs-lisp
|
||||
|
@ -1151,6 +1190,8 @@ its over the machines took over guys can i get my likes now
|
|||
** mu4e
|
||||
GNU patch review metho dor sometihng idk
|
||||
#+begin_src emacs-lisp
|
||||
|
||||
(use-package auth-source-xoauth2)
|
||||
(use-package mu4e
|
||||
:config
|
||||
|
||||
|
@ -1158,27 +1199,46 @@ GNU patch review metho dor sometihng idk
|
|||
(setq mu4e-change-filenames-when-moving t)
|
||||
|
||||
;; sending mail
|
||||
(setq message-send-mail-function 'smtpmail-send-it)
|
||||
;;(setq message-send-mail-function 'smtpmail-send-it)
|
||||
;;(add-to-list 'smtpmail-auth-supported 'xoauth2)
|
||||
(setq send-mail-function 'sendmail-send-it)
|
||||
(setq message-send-mail-function 'sendmail-sent-it)
|
||||
(setq sendmail-program (executable-find "msmtp"))
|
||||
|
||||
;; select the right sender email from the context.
|
||||
(setq message-sendmail-envelope-from 'header)
|
||||
|
||||
(setq mu4e-update-interval (* 10 60))
|
||||
(setq mu4e-get-mail-command "mbsync -a")
|
||||
(setq mu4e-maildir "~/Mail")
|
||||
(setq mu4e-get-mail-command (format "INSIDE_EMACS=%s offlineimap" emacs-version)
|
||||
epa-pinentry-mode 'ask)
|
||||
(setq mu4e-maildir "~/.mail")
|
||||
|
||||
(setq outlook-mail-address
|
||||
(string-trim (shell-command-to-string "pass mail | awk 'BEGIN {ORS=\"\"} FNR == 2{gsub(\"login: \", \"\"); gsub(/ /, \"\"); print}'")))
|
||||
;; for mail accounts
|
||||
(setq sakomacs-mail-accounts (json-read-file "~/.mail/accounts.json"))
|
||||
|
||||
(defvar proton-mail-address nil)
|
||||
(defun sakomacs/set-msmtp-account ()
|
||||
(if (message-mail-p)
|
||||
(save-excursion
|
||||
(let*
|
||||
((from (save-restriction
|
||||
(message-narrow-to-headers)
|
||||
(message-fetch-field "from")))
|
||||
(account
|
||||
(cond
|
||||
((string-match (cdr (assoc 'gmail-1 sakomacs-mail-accounts)) from) "gmail-1")
|
||||
((string-match (cdr (assoc 'gmail-2 sakomacs-mail-accounts)) from) "gmail-2")
|
||||
((string-match (cdr (assoc 'protonmail sakomacs-mail-accounts)) from) "protonmail")
|
||||
((string-match (cdr (assoc 'li sakomacs-mail-accounts)) from) "li")
|
||||
((string-match (cdr (assoc 'outlook sakomacs-mail-accounts)) from)))))
|
||||
(setq message-sendmail-extra-arguments (list '"-a" account))))))
|
||||
|
||||
(defun get-proton-mail-address-from-pass (command)
|
||||
"Execute COMMAND, concatenate its output with 'hello', and store it in my-greeting."
|
||||
(let ((output (shell-command-to-string command)))
|
||||
;; Trim whitespace from the output
|
||||
(setq output (string-trim output))
|
||||
;; Concatenate 'hello' with the command output
|
||||
(setq my-greeting (concat "@proton.me" output))))
|
||||
(add-hook 'message-send-mail-hook 'sakomacs/set-msmtp-account)
|
||||
|
||||
(get-proton-mail-address-from-pass "pass Proton\ Account | awk 'BEGIN {ORS=\"\"} FNR == 2{gsub(\"login: \", \"\"); gsub(/ /, \"\"); print}'")
|
||||
;; kill message buffers
|
||||
(setq message-kill-buffer-on-exit t)
|
||||
|
||||
(setq mu4e-context-policy 'pick-first)
|
||||
(setq mu4e-compose-context-policy 'always-ask)
|
||||
(setq mu4e-contexts
|
||||
(list
|
||||
;; outlook
|
||||
|
@ -1187,27 +1247,77 @@ GNU patch review metho dor sometihng idk
|
|||
:match-func
|
||||
(lambda (msg)
|
||||
(when msg
|
||||
(string-prefix-p "/Outlook" (mu4e-message-field msg :maildir))))
|
||||
:vars `((user-mail-address . ,outlook-mail-address)
|
||||
(string-prefix-p "/outlook" (mu4e-message-field msg :maildir))))
|
||||
:vars `((user-mail-address . ,(cdr (assoc 'outlook sakomacs-mail-accounts)))
|
||||
(user-full-name . "Sako")
|
||||
(mu4e-drafts-folder . "/Outlook/Drafts")
|
||||
(mu4e-sent-folder . "/Outlook/Sent")
|
||||
(mu4e-refile-folder . "/Outlook/Inbox")
|
||||
(mu4e-trash-folder . "/Outlook/Deleted")))
|
||||
(mu4e-drafts-folder . "/outlook/Drafts")
|
||||
(mu4e-sent-folder . "/outlook/Sent")
|
||||
(mu4e-refile-folder . "/outlook/Inbox")
|
||||
(mu4e-trash-folder . "/outlook/Deleted")
|
||||
;; todo stmpmail and compose signatures
|
||||
))
|
||||
(make-mu4e-context
|
||||
:name "Proton"
|
||||
:match-func
|
||||
(lambda (msg)
|
||||
(when msg
|
||||
(string-prefix-p "/Proton" (mu4e-message-field msg :maildir))))
|
||||
:vars `((user-mail-address . ,proton-mail-address)
|
||||
(string-prefix-p "/protonmail" (mu4e-message-field msg :maildir))))
|
||||
:vars `((user-mail-address . ,(cdr (assoc 'protonmail sakomacs-mail-accounts)))
|
||||
(user-full-name . "Sako")
|
||||
(mu4e-drafts-folder . "/Proton/Drafts")
|
||||
(mu4e-sent-folder . "/Proton/Sent")
|
||||
(mu4e-refile-folder . "/Proton/Inbox")
|
||||
(mu4e-trash-folder . "/Proton/Trash")))
|
||||
(mu4e-drafts-folder . "/protonmail/Drafts")
|
||||
(mu4e-sent-folder . "/protonmail/Sent")
|
||||
(mu4e-refile-folder . "/protonmail/Inbox")
|
||||
(mu4e-trash-folder . "/protonmail/Trash"))
|
||||
;; todo stmpmail and compose signatures
|
||||
)
|
||||
(make-mu4e-context
|
||||
:name "Gmail Personal 1"
|
||||
:match-func
|
||||
(lambda (msg)
|
||||
(when msg
|
||||
(string-prefix-p "/gmail1" (mu4e-message-field msg :maildir))))
|
||||
:vars `((user-mail-address . ,(cdr (assoc 'gmail-1 sakomacs-mail-accounts)))
|
||||
(user-full-name . "Sako")
|
||||
(mu4e-drafts-folder . "/gmail1/Drafts")
|
||||
(mu4e-sent-folder . "/gmail1/Sent Mail")
|
||||
(mu4e-refile-folder . "/gmail1/Inbox")
|
||||
(mu4e-trash-folder . "gmail1/Trash")
|
||||
;; todo stmpmail and compose signatures
|
||||
))
|
||||
(make-mu4e-context
|
||||
:name "Second Personal Gmail"
|
||||
:match-func
|
||||
(lambda (msg)
|
||||
(when msg
|
||||
(string-prefix-p "/gmail2" (mu4e-message-field msg :maildir))))
|
||||
:vars `((user-mail-address . ,(cdr (assoc 'gmail-2 sakomacs-mail-accounts)))
|
||||
(user-full-name . "Sako")
|
||||
(mu4e-drafts-folder . "/gmail2/Drafts")
|
||||
(mu4e-sent-folder . "/gmail2/Sent Mail")
|
||||
(mu4e-refile-folder . "/gmail2/Inbox")
|
||||
(mu4e-trash-folder . "gmail2/Trash")
|
||||
))
|
||||
(make-mu4e-context
|
||||
:name "li"
|
||||
:match-func
|
||||
(lambda (msg)
|
||||
(when msg
|
||||
(string-prefix-p "/li" (mu4e-message-field msg :maildir))))
|
||||
:vars `((user-mail-address . ,(cdr (assoc 'li sakomacs-mail-accounts)))
|
||||
(user-full-name . "user")
|
||||
(mu4e-sent-folder . "/li/Sent Mail")
|
||||
(mu4e-refile-folder . "/li/INBOX")
|
||||
(mu4e-trash-folder . "/li/Trash")
|
||||
))
|
||||
|
||||
))
|
||||
)
|
||||
|
||||
(use-package mu4e-alert
|
||||
:after mu4e
|
||||
:config
|
||||
(setq mu4e-alert-notify-repeated-mails nil)
|
||||
(mu4e-alert-enable-notifications))
|
||||
#+end_src
|
||||
* Org
|
||||
#+begin_src emacs-lisp
|
||||
|
@ -1250,6 +1360,10 @@ GNU patch review metho dor sometihng idk
|
|||
(setq org-hide-leading-stars t)
|
||||
(setq org-hide-emphasis-markers nil)
|
||||
|
||||
;; org latex pdf options
|
||||
(setq org-latex-compiler "lualatex")
|
||||
(setq org-preview-latex-default-process 'dvisvgm)
|
||||
|
||||
;; templates
|
||||
(require 'org-tempo)
|
||||
|
||||
|
@ -1288,8 +1402,10 @@ GNU patch review metho dor sometihng idk
|
|||
#+end_src
|
||||
** Org-wild-notifier
|
||||
#+begin_src emacs-lisp
|
||||
(use-package org-wild-notifier
|
||||
(use-package org-wild-notifier
|
||||
:config
|
||||
(setq alert-default-style 'libnotify)
|
||||
(setq org-wild-notifier-alert-time 30)
|
||||
(org-wild-notifier-mode))
|
||||
#+end_src
|
||||
** Org-Pomodoro
|
||||
|
|
|
@ -1,236 +0,0 @@
|
|||
# -*- conf -*-
|
||||
|
||||
# shell=$SHELL (if set, otherwise user's default shell from /etc/passwd)
|
||||
term=xterm-256color
|
||||
# login-shell=no
|
||||
|
||||
# app-id=foot # globally set wayland app-id. Default values are "foot" and "footclient" for desktop and server mode
|
||||
# title=foot
|
||||
# locked-title=no
|
||||
|
||||
font=JetBrainsMono NF:size=12
|
||||
# font-bold=<bold variant of regular font>
|
||||
# font-italic=<italic variant of regular font>
|
||||
# font-bold-italic=<bold+italic variant of regular font>
|
||||
# font-size-adjustment=0.5
|
||||
# line-height=<font metrics>
|
||||
# letter-spacing=0
|
||||
# horizontal-letter-offset=0
|
||||
# vertical-letter-offset=0
|
||||
# underline-offset=<font metrics>
|
||||
# underline-thickness=<font underline thickness>
|
||||
# box-drawings-uses-font-glyphs=no
|
||||
# dpi-aware=no
|
||||
|
||||
# initial-window-size-pixels=700x500 # Or,
|
||||
# initial-window-size-chars=<COLSxROWS>
|
||||
# initial-window-mode=windowed
|
||||
# pad=0x0 # optionally append 'center'
|
||||
# resize-by-cells=yes
|
||||
# resize-delay-ms=100
|
||||
|
||||
# bold-text-in-bright=no
|
||||
# word-delimiters=,│`|:"'()[]{}<>
|
||||
# selection-target=primary
|
||||
# workers=<number of logical CPUs>
|
||||
# utmp-helper=/usr/lib/utempter/utempter # When utmp backend is ‘libutempter’ (Linux)
|
||||
# utmp-helper=/usr/libexec/ulog-helper # When utmp backend is ‘ulog’ (FreeBSD)
|
||||
|
||||
[environment]
|
||||
# name=value
|
||||
|
||||
[bell]
|
||||
# urgent=no
|
||||
# notify=no
|
||||
# visual=no
|
||||
# command=
|
||||
# command-focused=no
|
||||
|
||||
#[desktop-notifications]
|
||||
# command=notify-send --wait --app-name ${app-id} --icon ${app-id} --category ${category} --urgency ${urgency} --expire-time ${expire-time} --hint STRING:image-path:${icon} --replace-id ${replace-id} ${action-argument} --print-id -- ${title} ${body}
|
||||
# command-action-argument=--action ${action-name}=${action-label}
|
||||
# close=""
|
||||
# inhibit-when-focused=yes
|
||||
|
||||
|
||||
[scrollback]
|
||||
lines=1000
|
||||
# multiplier=3.0
|
||||
# indicator-position=relative
|
||||
# indicator-format=""
|
||||
|
||||
[url]
|
||||
# launch=xdg-open ${url}
|
||||
# label-letters=sadfjklewcmpgh
|
||||
# osc8-underline=url-mode
|
||||
# protocols=http, https, ftp, ftps, file, gemini, gopher
|
||||
# uri-characters=abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789-_.,~:;/?#@!$&%*+="'()[]
|
||||
|
||||
[cursor]
|
||||
# style=block
|
||||
# color=<inverse foreground/background>
|
||||
# blink=no
|
||||
# blink-rate=500
|
||||
# beam-thickness=1.5
|
||||
# underline-thickness=<font underline thickness>
|
||||
|
||||
[mouse]
|
||||
# hide-when-typing=no
|
||||
# alternate-scroll-mode=yes
|
||||
|
||||
[touch]
|
||||
# long-press-delay=400
|
||||
|
||||
[colors]
|
||||
# alpha=1.0
|
||||
# background=242424
|
||||
# foreground=ffffff
|
||||
# flash=7f7f00
|
||||
# flash-alpha=0.5
|
||||
|
||||
## Normal/regular colors (color palette 0-7)
|
||||
# regular0=242424 # black
|
||||
# regular1=f62b5a # red
|
||||
# regular2=47b413 # green
|
||||
# regular3=e3c401 # yellow
|
||||
# regular4=24acd4 # blue
|
||||
# regular5=f2affd # magenta
|
||||
# regular6=13c299 # cyan
|
||||
# regular7=e6e6e6 # white
|
||||
|
||||
## Bright colors (color palette 8-15)
|
||||
# bright0=616161 # bright black
|
||||
# bright1=ff4d51 # bright red
|
||||
# bright2=35d450 # bright green
|
||||
# bright3=e9e836 # bright yellow
|
||||
# bright4=5dc5f8 # bright blue
|
||||
# bright5=feabf2 # bright magenta
|
||||
# bright6=24dfc4 # bright cyan
|
||||
# bright7=ffffff # bright white
|
||||
|
||||
## dimmed colors (see foot.ini(5) man page)
|
||||
# dim0=<not set>
|
||||
# ...
|
||||
# dim7=<not-set>
|
||||
|
||||
## The remaining 256-color palette
|
||||
# 16 = <256-color palette #16>
|
||||
# ...
|
||||
# 255 = <256-color palette #255>
|
||||
|
||||
## Misc colors
|
||||
# selection-foreground=<inverse foreground/background>
|
||||
# selection-background=<inverse foreground/background>
|
||||
# jump-labels=<regular0> <regular3> # black-on-yellow
|
||||
# scrollback-indicator=<regular0> <bright4> # black-on-bright-blue
|
||||
# search-box-no-match=<regular0> <regular1> # black-on-red
|
||||
# search-box-match=<regular0> <regular3> # black-on-yellow
|
||||
# urls=<regular3>
|
||||
|
||||
[csd]
|
||||
# preferred=server
|
||||
# size=26
|
||||
# font=<primary font>
|
||||
# color=<foreground color>
|
||||
# hide-when-maximized=no
|
||||
# double-click-to-maximize=yes
|
||||
# border-width=0
|
||||
# border-color=<csd.color>
|
||||
# button-width=26
|
||||
# button-color=<background color>
|
||||
# button-minimize-color=<regular4>
|
||||
# button-maximize-color=<regular2>
|
||||
# button-close-color=<regular1>
|
||||
|
||||
[key-bindings]
|
||||
# scrollback-up-page=Shift+Page_Up
|
||||
# scrollback-up-half-page=none
|
||||
# scrollback-up-line=none
|
||||
# scrollback-down-page=Shift+Page_Down
|
||||
# scrollback-down-half-page=none
|
||||
# scrollback-down-line=none
|
||||
# scrollback-home=none
|
||||
# scrollback-end=none
|
||||
# clipboard-copy=Control+Shift+c XF86Copy
|
||||
# clipboard-paste=Control+Shift+v XF86Paste
|
||||
# primary-paste=Shift+Insert
|
||||
# search-start=Control+Shift+r
|
||||
# font-increase=Control+plus Control+equal Control+KP_Add
|
||||
# font-decrease=Control+minus Control+KP_Subtract
|
||||
# font-reset=Control+0 Control+KP_0
|
||||
# spawn-terminal=Control+Shift+n
|
||||
# minimize=none
|
||||
# maximize=none
|
||||
# fullscreen=none
|
||||
# pipe-visible=[sh -c "xurls | fuzzel | xargs -r firefox"] none
|
||||
# pipe-scrollback=[sh -c "xurls | fuzzel | xargs -r firefox"] none
|
||||
# pipe-selected=[xargs -r firefox] none
|
||||
# pipe-command-output=[wl-copy] none # Copy last command's output to the clipboard
|
||||
# show-urls-launch=Control+Shift+o
|
||||
# show-urls-copy=none
|
||||
# show-urls-persistent=none
|
||||
# prompt-prev=Control+Shift+z
|
||||
# prompt-next=Control+Shift+x
|
||||
# unicode-input=Control+Shift+u
|
||||
# noop=none
|
||||
|
||||
[search-bindings]
|
||||
# cancel=Control+g Control+c Escape
|
||||
# commit=Return
|
||||
# find-prev=Control+r
|
||||
# find-next=Control+s
|
||||
# cursor-left=Left Control+b
|
||||
# cursor-left-word=Control+Left Mod1+b
|
||||
# cursor-right=Right Control+f
|
||||
# cursor-right-word=Control+Right Mod1+f
|
||||
# cursor-home=Home Control+a
|
||||
# cursor-end=End Control+e
|
||||
# delete-prev=BackSpace
|
||||
# delete-prev-word=Mod1+BackSpace Control+BackSpace
|
||||
# delete-next=Delete
|
||||
# delete-next-word=Mod1+d Control+Delete
|
||||
# extend-char=Shift+Right
|
||||
# extend-to-word-boundary=Control+w Control+Shift+Right
|
||||
# extend-to-next-whitespace=Control+Shift+w
|
||||
# extend-line-down=Shift+Down
|
||||
# extend-backward-char=Shift+Left
|
||||
# extend-backward-to-word-boundary=Control+Shift+Left
|
||||
# extend-backward-to-next-whitespace=none
|
||||
# extend-line-up=Shift+Up
|
||||
# clipboard-paste=Control+v Control+Shift+v Control+y XF86Paste
|
||||
# primary-paste=Shift+Insert
|
||||
# unicode-input=none
|
||||
# quit=none
|
||||
# scrollback-up-page=Shift+Page_Up
|
||||
# scrollback-up-half-page=none
|
||||
# scrollback-up-line=none
|
||||
# scrollback-down-page=Shift+Page_Down
|
||||
# scrollback-down-half-page=none
|
||||
# scrollback-down-line=none
|
||||
# scrollback-home=none
|
||||
# scrollback-end=none
|
||||
|
||||
[url-bindings]
|
||||
# cancel=Control+g Control+c Control+d Escape
|
||||
# toggle-url-visible=t
|
||||
|
||||
[text-bindings]
|
||||
# \x03=Mod4+c # Map Super+c -> Ctrl+c
|
||||
|
||||
[mouse-bindings]
|
||||
# scrollback-up-mouse=BTN_WHEEL_BACK
|
||||
# scrollback-down-mouse=BTN_WHEEL_FORWARD
|
||||
# font-increase=Control+BTN_WHEEL_BACK
|
||||
# font-decrease=Control+BTN_WHEEL_FORWARD
|
||||
# selection-override-modifiers=Shift
|
||||
# primary-paste=BTN_MIDDLE
|
||||
# select-begin=BTN_LEFT
|
||||
# select-begin-block=Control+BTN_LEFT
|
||||
# select-extend=BTN_RIGHT
|
||||
# select-extend-character-wise=Control+BTN_RIGHT
|
||||
# select-word=BTN_LEFT-2
|
||||
# select-word-whitespace=Control+BTN_LEFT-2
|
||||
# select-quote = BTN_LEFT-3
|
||||
# select-row=BTN_LEFT-4
|
||||
|
||||
# vim: ft=dosini
|
|
@ -56,9 +56,11 @@ input {
|
|||
kb_layout = us, ara
|
||||
kb_variant =
|
||||
kb_model =
|
||||
kb_options = grp:alt_shift_toggle, ctrl:nocaps
|
||||
kb_options = grp:ctrls_toggle, ctrl:nocaps
|
||||
kb_rules =
|
||||
|
||||
numlock_by_default = true
|
||||
|
||||
# no mouse acceleration pls :)
|
||||
accel_profile = flat
|
||||
|
||||
|
@ -77,9 +79,9 @@ general {
|
|||
|
||||
gaps_in = 10
|
||||
gaps_out = 10
|
||||
border_size = 1
|
||||
col.active_border = rgba(33ccffee) rgba(00ff99ee) 45deg
|
||||
col.inactive_border = rgba(595959aa)
|
||||
border_size = 2
|
||||
col.active_border = rgba(ea4c88ee) rgba(e691b1ee) 45deg
|
||||
col.inactive_border = rgb(6F2440) rgb(734959) 45deg
|
||||
|
||||
layout = dwindle
|
||||
}
|
||||
|
|
|
@ -3,18 +3,38 @@ background {
|
|||
path = /home/sako/background.png
|
||||
}
|
||||
|
||||
general {
|
||||
no_fade_in = true
|
||||
no_fade_out = true
|
||||
}
|
||||
|
||||
# Time
|
||||
label {
|
||||
monitor =
|
||||
text = $TIME
|
||||
text_align = center # center/right or any value for default left. multi-line text alignment inside label container
|
||||
color = rgba(200, 200, 200, 1.0)
|
||||
font_size = 25
|
||||
font_family = JetBrains Mono
|
||||
rotate = 0 # degrees, counter-clockwise
|
||||
|
||||
position = 0, 80
|
||||
halign = center
|
||||
valign = center
|
||||
}
|
||||
|
||||
input-field {
|
||||
monitor =
|
||||
size = 300, 50
|
||||
outline_thickness = 4
|
||||
outline_thickness = 1
|
||||
dots_size = 0.1
|
||||
dots_spacing = 0.2
|
||||
dots_center = true
|
||||
outer_color = $accent
|
||||
outer_color =rgb(ea4c88)
|
||||
inner_color = $surface0
|
||||
font_color = $text
|
||||
fade_on_empty = false
|
||||
placeholder_text = silly!
|
||||
placeholder_text = placeholder
|
||||
rounding = 0
|
||||
hide_input = false
|
||||
check_color = $accent
|
||||
|
|
|
@ -1,3 +1,3 @@
|
|||
require("core.keymaps")
|
||||
require("core.plugins")
|
||||
require("core.plugin_config")
|
||||
-- require("core.plugin_config")
|
||||
|
|
|
@ -15,121 +15,11 @@ vim.opt.rtp:prepend(lazypath)
|
|||
vim.g.mapleader = " "
|
||||
|
||||
local plugins = {
|
||||
|
||||
-- whats an ide without a file explorer
|
||||
"nvim-tree/nvim-tree.lua",
|
||||
"nvim-tree/nvim-web-devicons",
|
||||
|
||||
-- colorscheme
|
||||
-- { "bluz71/vim-moonfly-colors", name = "moonfly", lazy = false, priority = 1000 },
|
||||
"savq/melange-nvim",
|
||||
|
||||
-- default bar only looks good on linux
|
||||
"nvim-lualine/lualine.nvim",
|
||||
|
||||
-- syntax highlighting apparently
|
||||
"nvim-treesitter/nvim-treesitter",
|
||||
"windwp/nvim-ts-autotag",
|
||||
|
||||
-- org mode
|
||||
{
|
||||
'nvim-orgmode/orgmode',
|
||||
event = 'VeryLazy',
|
||||
config = function()
|
||||
-- Setup orgmode
|
||||
require('orgmode').setup({
|
||||
org_agenda_files = '~/orgfiles/**/*',
|
||||
org_default_notes_file = '~/orgfiles/refile.org',
|
||||
})
|
||||
|
||||
-- NOTE: If you are using nvim-treesitter with `ensure_installed = "all"` option
|
||||
-- add `org` to ignore_install
|
||||
-- require('nvim-treesitter.configs').setup({
|
||||
-- ensure_installed = 'all',
|
||||
-- ignore_install = { 'org' },
|
||||
-- })
|
||||
end,
|
||||
},
|
||||
|
||||
-- like fzf but goofier
|
||||
{
|
||||
"nvim-telescope/telescope.nvim",
|
||||
version = "0.1.1",
|
||||
dependencies = { { "nvim-lua/plenary.nvim" } },
|
||||
},
|
||||
-- lsp stuff
|
||||
{
|
||||
"williamboman/mason.nvim",
|
||||
"williamboman/mason-lspconfig.nvim",
|
||||
"neovim/nvim-lspconfig",
|
||||
},
|
||||
|
||||
-- completion
|
||||
"hrsh7th/nvim-cmp",
|
||||
"hrsh7th/cmp-buffer",
|
||||
"hrsh7th/cmp-path",
|
||||
"hrsh7th/cmp-nvim-lsp",
|
||||
"onsails/lspkind.nvim",
|
||||
|
||||
-- snippet
|
||||
"L3MON4D3/LuaSnip",
|
||||
"saadparwaiz1/cmp_luasnip",
|
||||
|
||||
-- auto close to prevent carpal tunnel :
|
||||
"windwp/nvim-autopairs",
|
||||
|
||||
-- git stuff lol
|
||||
"lewis6991/gitsigns.nvim",
|
||||
|
||||
-- flex
|
||||
"andweeb/presence.nvim",
|
||||
|
||||
-- color picker
|
||||
"ziontee113/color-picker.nvim",
|
||||
|
||||
-- startup
|
||||
{
|
||||
"glepnir/dashboard-nvim",
|
||||
config = function()
|
||||
require("dashboard").setup({
|
||||
theme = "doom", -- theme is doom and hyper default is hyper
|
||||
config = {
|
||||
-- todo https://github.com/nvimdev/dashboard-nvim
|
||||
center = {
|
||||
{
|
||||
icon = " ",
|
||||
icon_hl = "Title",
|
||||
desc = "Find File ",
|
||||
desc_hl = "String",
|
||||
keymap = "SPC SPC",
|
||||
key_hl = "Number",
|
||||
action = "lua print(2)",
|
||||
},
|
||||
},
|
||||
},
|
||||
})
|
||||
end,
|
||||
event = "VimEnter",
|
||||
dependencies = { { "nvim-tree/nvim-web-devicons" } },
|
||||
},
|
||||
|
||||
-- floating terminal, useful to mimic/be better than vscode
|
||||
"voldikss/vim-floaterm",
|
||||
|
||||
-- git client
|
||||
{
|
||||
"NeogitOrg/neogit",
|
||||
dependencies = {
|
||||
"nvim-lua/plenary.nvim", -- required
|
||||
"sindrets/diffview.nvim", -- optional - Diff integration
|
||||
|
||||
-- Only one of these is needed, not both.
|
||||
"nvim-telescope/telescope.nvim", -- optional
|
||||
"ibhagwan/fzf-lua", -- optional
|
||||
},
|
||||
config = true
|
||||
},
|
||||
|
||||
{ "wakatime/vim-wakatime", lazy = false },
|
||||
}
|
||||
|
||||
require("lazy").setup(plugins, {})
|
||||
|
|
|
@ -1,213 +0,0 @@
|
|||
# Copyright (c) 2010 Aldo Cortesi
|
||||
# Copyright (c) 2010, 2014 dequis
|
||||
# Copyright (c) 2012 Randall Ma
|
||||
# Copyright (c) 2012-2014 Tycho Andersen
|
||||
# Copyright (c) 2012 Craig Barnes
|
||||
# Copyright (c) 2013 horsik
|
||||
# Copyright (c) 2013 Tao Sauvage
|
||||
#
|
||||
# Permission is hereby granted, free of charge, to any person obtaining a copy
|
||||
# of this software and associated documentation files (the "Software"), to deal
|
||||
# in the Software without restriction, including without limitation the rights
|
||||
# to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
||||
# copies of the Software, and to permit persons to whom the Software is
|
||||
# furnished to do so, subject to the following conditions:
|
||||
#
|
||||
# The above copyright notice and this permission notice shall be included in
|
||||
# all copies or substantial portions of the Software.
|
||||
#
|
||||
# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
||||
# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
||||
# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
||||
# AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
||||
# LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
||||
# OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
||||
# SOFTWARE.
|
||||
|
||||
from libqtile import bar, layout, widget
|
||||
from libqtile.config import Click, Drag, Group, Key, Match, Screen
|
||||
from libqtile.lazy import lazy
|
||||
from libqtile.utils import guess_terminal
|
||||
|
||||
mod = "mod4"
|
||||
terminal = "kitty"
|
||||
|
||||
keys = [
|
||||
# A list of available commands that can be bound to keys can be found
|
||||
# at https://docs.qtile.org/en/latest/manual/config/lazy.html
|
||||
# Switch between windows
|
||||
Key([mod], "h", lazy.layout.left(), desc="Move focus to left"),
|
||||
Key([mod], "l", lazy.layout.right(), desc="Move focus to right"),
|
||||
Key([mod], "j", lazy.layout.down(), desc="Move focus down"),
|
||||
Key([mod], "k", lazy.layout.up(), desc="Move focus up"),
|
||||
Key([mod], "space", lazy.layout.next(), desc="Move window focus to other window"),
|
||||
# Move windows between left/right columns or move up/down in current stack.
|
||||
# Moving out of range in Columns layout will create new column.
|
||||
Key(
|
||||
[mod, "shift"], "h", lazy.layout.shuffle_left(), desc="Move window to the left"
|
||||
),
|
||||
Key(
|
||||
[mod, "shift"],
|
||||
"l",
|
||||
lazy.layout.shuffle_right(),
|
||||
desc="Move window to the right",
|
||||
),
|
||||
Key([mod, "shift"], "j", lazy.layout.shuffle_down(), desc="Move window down"),
|
||||
Key([mod, "shift"], "k", lazy.layout.shuffle_up(), desc="Move window up"),
|
||||
# Grow windows. If current window is on the edge of screen and direction
|
||||
# will be to screen edge - window would shrink.
|
||||
Key([mod, "control"], "h", lazy.layout.grow_left(), desc="Grow window to the left"),
|
||||
Key(
|
||||
[mod, "control"], "l", lazy.layout.grow_right(), desc="Grow window to the right"
|
||||
),
|
||||
Key([mod, "control"], "j", lazy.layout.grow_down(), desc="Grow window down"),
|
||||
Key([mod, "control"], "k", lazy.layout.grow_up(), desc="Grow window up"),
|
||||
Key([mod], "n", lazy.layout.normalize(), desc="Reset all window sizes"),
|
||||
# Toggle between split and unsplit sides of stack.
|
||||
# Split = all windows displayed
|
||||
# Unsplit = 1 window displayed, like Max layout, but still with
|
||||
# multiple stack panes
|
||||
Key(
|
||||
[mod, "shift"],
|
||||
"Return",
|
||||
lazy.layout.toggle_split(),
|
||||
desc="Toggle between split and unsplit sides of stack",
|
||||
),
|
||||
Key([mod], "Return", lazy.spawn(terminal), desc="Launch terminal"),
|
||||
# Toggle between different layouts as defined below
|
||||
Key([mod], "Tab", lazy.next_layout(), desc="Toggle between layouts"),
|
||||
Key([mod], "w", lazy.window.kill(), desc="Kill focused window"),
|
||||
Key([mod, "control"], "r", lazy.reload_config(), desc="Reload the config"),
|
||||
Key([mod, "control"], "q", lazy.shutdown(), desc="Shutdown Qtile"),
|
||||
Key([mod], "r", lazy.spawncmd(), desc="Spawn a command using a prompt widget"),
|
||||
]
|
||||
|
||||
groups = [Group(i) for i in "123456789"]
|
||||
|
||||
for i in groups:
|
||||
keys.extend(
|
||||
[
|
||||
# mod1 + letter of group = switch to group
|
||||
Key(
|
||||
[mod],
|
||||
i.name,
|
||||
lazy.group[i.name].toscreen(),
|
||||
desc="Switch to group {}".format(i.name),
|
||||
),
|
||||
# mod1 + shift + letter of group = switch to & move focused window to group
|
||||
Key(
|
||||
[mod, "shift"],
|
||||
i.name,
|
||||
lazy.window.togroup(i.name, switch_group=True),
|
||||
desc="Switch to & move focused window to group {}".format(i.name),
|
||||
),
|
||||
# Or, use below if you prefer not to switch to that group.
|
||||
# # mod1 + shift + letter of group = move focused window to group
|
||||
# Key([mod, "shift"], i.name, lazy.window.togroup(i.name),
|
||||
# desc="move focused window to group {}".format(i.name)),
|
||||
]
|
||||
)
|
||||
|
||||
layouts = [
|
||||
layout.Columns(border_focus_stack=["#d75f5f", "#8f3d3d"], border_width=4),
|
||||
layout.Max(),
|
||||
# Try more layouts by unleashing below layouts.
|
||||
# layout.Stack(num_stacks=2),
|
||||
# layout.Bsp(),
|
||||
# layout.Matrix(),
|
||||
# layout.MonadTall(),
|
||||
# layout.MonadWide(),
|
||||
# layout.RatioTile(),
|
||||
# layout.Tile(),
|
||||
# layout.TreeTab(),
|
||||
# layout.VerticalTile(),
|
||||
# layout.Zoomy(),
|
||||
]
|
||||
|
||||
widget_defaults = dict(
|
||||
font="sans",
|
||||
fontsize=12,
|
||||
padding=3,
|
||||
)
|
||||
extension_defaults = widget_defaults.copy()
|
||||
|
||||
screens = [
|
||||
Screen(
|
||||
bottom=bar.Bar(
|
||||
[
|
||||
widget.CurrentLayout(),
|
||||
widget.GroupBox(),
|
||||
widget.Prompt(),
|
||||
widget.WindowName(),
|
||||
widget.Chord(
|
||||
chords_colors={
|
||||
"launch": ("#ff0000", "#ffffff"),
|
||||
},
|
||||
name_transform=lambda name: name.upper(),
|
||||
),
|
||||
widget.TextBox("default config", name="default"),
|
||||
widget.TextBox("Press <M-r> to spawn", foreground="#d75f5f"),
|
||||
# NB Systray is incompatible with Wayland, consider using StatusNotifier instead
|
||||
# widget.StatusNotifier(),
|
||||
widget.Systray(),
|
||||
widget.Clock(format="%Y-%m-%d %a %I:%M %p"),
|
||||
widget.QuickExit(),
|
||||
],
|
||||
24,
|
||||
# border_width=[2, 0, 2, 0], # Draw top and bottom borders
|
||||
# border_color=["ff00ff", "000000", "ff00ff", "000000"] # Borders are magenta
|
||||
),
|
||||
),
|
||||
]
|
||||
|
||||
# Drag floating layouts.
|
||||
mouse = [
|
||||
Drag(
|
||||
[mod],
|
||||
"Button1",
|
||||
lazy.window.set_position_floating(),
|
||||
start=lazy.window.get_position(),
|
||||
),
|
||||
Drag(
|
||||
[mod], "Button3", lazy.window.set_size_floating(), start=lazy.window.get_size()
|
||||
),
|
||||
Click([mod], "Button2", lazy.window.bring_to_front()),
|
||||
]
|
||||
|
||||
dgroups_key_binder = None
|
||||
dgroups_app_rules = [] # type: list
|
||||
follow_mouse_focus = True
|
||||
bring_front_click = False
|
||||
cursor_warp = False
|
||||
floating_layout = layout.Floating(
|
||||
float_rules=[
|
||||
# Run the utility of `xprop` to see the wm class and name of an X client.
|
||||
*layout.Floating.default_float_rules,
|
||||
Match(wm_class="confirmreset"), # gitk
|
||||
Match(wm_class="makebranch"), # gitk
|
||||
Match(wm_class="maketag"), # gitk
|
||||
Match(wm_class="ssh-askpass"), # ssh-askpass
|
||||
Match(title="branchdialog"), # gitk
|
||||
Match(title="pinentry"), # GPG key password entry
|
||||
]
|
||||
)
|
||||
auto_fullscreen = True
|
||||
focus_on_window_activation = "smart"
|
||||
reconfigure_screens = True
|
||||
|
||||
# If things like steam games want to auto-minimize themselves when losing
|
||||
# focus, should we respect this or not?
|
||||
auto_minimize = True
|
||||
|
||||
# When using the Wayland backend, this can be used to configure input devices.
|
||||
wl_input_rules = None
|
||||
|
||||
# XXX: Gasp! We're lying here. In fact, nobody really uses or cares about this
|
||||
# string besides java UI toolkits; you can see several discussions on the
|
||||
# mailing lists, GitHub issues, and other WM documentation that suggest setting
|
||||
# this string if your java app doesn't work correctly. We may as well just lie
|
||||
# and say that we're a working one by default.
|
||||
#
|
||||
# We choose LG3D to maximize irony: it is a 3D non-reparenting WM written in
|
||||
# java that happens to be on java's whitelist.
|
||||
wmname = "LG3D"
|
51
default.nix
51
default.nix
|
@ -1,20 +1,12 @@
|
|||
{
|
||||
config,
|
||||
inputs,
|
||||
outputs,
|
||||
pkgs,
|
||||
lib,
|
||||
home-manager,
|
||||
...
|
||||
}: {
|
||||
{ config, inputs, outputs, pkgs, lib, home-manager, ... }: {
|
||||
imports = [
|
||||
# home manager
|
||||
inputs.home-manager.nixosModules.default
|
||||
# modules
|
||||
inputs.agenix.nixosModules.default
|
||||
# TODO:: GET RID OF THIS PLEASE
|
||||
# my modules modules
|
||||
# import for each folder
|
||||
# modules/desktop IMPORT
|
||||
# modules/desktop/example DO NOT IMPORT,
|
||||
# add entry to module's default.nix
|
||||
# add entry to module category's default.nix
|
||||
outputs.nixosModules.desktop
|
||||
outputs.nixosModules.shell
|
||||
outputs.nixosModules.hardware
|
||||
|
@ -28,7 +20,7 @@
|
|||
# nix settings that should 100% be global
|
||||
#nix.settings.experimental-features = ["nix-command" "flakes"];
|
||||
nix.settings = {
|
||||
experimental-features = ["nix-command" "flakes"];
|
||||
experimental-features = [ "nix-command" "flakes" ];
|
||||
substituters = [
|
||||
# garnix
|
||||
"https://cache.garnix.io"
|
||||
|
@ -67,7 +59,7 @@
|
|||
efiSysMountPoint = "/boot/efi";
|
||||
};
|
||||
grub = {
|
||||
devices = ["nodev"];
|
||||
devices = [ "nodev" ];
|
||||
efiSupport = true;
|
||||
enable = true;
|
||||
useOSProber = true;
|
||||
|
@ -99,13 +91,12 @@
|
|||
|
||||
users.users.sako = {
|
||||
isNormalUser = true;
|
||||
extraGroups = ["wheel" "networkmanager"]; # Enable ‘sudo’ for the user.
|
||||
extraGroups = [ "wheel" "networkmanager" "audio" ];
|
||||
};
|
||||
|
||||
home-manager.useUserPackages = true;
|
||||
home-manager.users.sako = {pkgs, ...}: {
|
||||
# CHANGE THIS WHEN THE SYSTEM VERSION CHANGES TOO!!!
|
||||
home.packages = [];
|
||||
home-manager.users.sako = { pkgs, ... }: {
|
||||
home.packages = [ ];
|
||||
home.username = "sako";
|
||||
home.homeDirectory = "/home/sako";
|
||||
programs.bash.enable = true;
|
||||
|
@ -118,11 +109,7 @@
|
|||
enable = true;
|
||||
userName = "Sakooooo";
|
||||
userEmail = "78461130+Sakooooo@users.noreply.github.com";
|
||||
includes = [
|
||||
{
|
||||
path = "~/.config/git/config.local";
|
||||
}
|
||||
];
|
||||
includes = [{ path = "~/.config/git/config.local"; }];
|
||||
extraConfig = {
|
||||
color.ui = "auto";
|
||||
init.defaultBranch = "master";
|
||||
|
@ -134,18 +121,18 @@
|
|||
# bare minimum
|
||||
environment.systemPackages = with pkgs; [
|
||||
vim # backup
|
||||
wget #double u get
|
||||
wget # double u get
|
||||
killall # die processes
|
||||
alsa-utils # unsupported application
|
||||
pulseaudio # unsupported application
|
||||
pamixer # unsupported application
|
||||
feh # im different
|
||||
unzip # zip file
|
||||
gh # github
|
||||
htop # htop
|
||||
tree # trees
|
||||
ripgrep # better grep may help later
|
||||
inputs.agenix.packages.${system}.default
|
||||
];
|
||||
|
||||
age.secretsDir = "/run/secrets";
|
||||
|
||||
# you phisiclally cannot live without this
|
||||
# litearlly! ! ! ! ! !
|
||||
programs.gnupg.agent = {
|
||||
|
@ -154,6 +141,8 @@
|
|||
settings = {
|
||||
allow-emacs-pinentry = "";
|
||||
allow-loopback-pinentry = "";
|
||||
default-cache-ttl = "28800";
|
||||
max-cache-ttl = "28800";
|
||||
};
|
||||
# enableSSHSupport = true;
|
||||
};
|
||||
|
@ -163,8 +152,4 @@
|
|||
# package = pkgs.gitFull;
|
||||
# };
|
||||
|
||||
# read stable version patch notes and fix any issues
|
||||
# then you can change this
|
||||
#system.stateVersion = "23.05";
|
||||
# read comment you read the comment?
|
||||
}
|
||||
|
|
353
flake.lock
353
flake.lock
|
@ -9,11 +9,11 @@
|
|||
]
|
||||
},
|
||||
"locked": {
|
||||
"lastModified": 1725358307,
|
||||
"narHash": "sha256-su/Nzp2X8JlaD9wPYQGXeTilaVa5H06X7A3kqCLJNuo=",
|
||||
"lastModified": 1728588346,
|
||||
"narHash": "sha256-P1j+Nf+pzxPYK2Qe7lF2yB0vR3YvW8Td5sD0ZvrKIq8=",
|
||||
"owner": "nix-community",
|
||||
"repo": "NixOS-WSL",
|
||||
"rev": "8a89995f745b1a9029d654c391a0f62ca03f7fe7",
|
||||
"rev": "0fc8d9bb51cc46b31d950513df6d088905c8fe55",
|
||||
"type": "github"
|
||||
},
|
||||
"original": {
|
||||
|
@ -22,19 +22,42 @@
|
|||
"type": "github"
|
||||
}
|
||||
},
|
||||
"ags": {
|
||||
"agenix": {
|
||||
"inputs": {
|
||||
"darwin": "darwin",
|
||||
"home-manager": "home-manager",
|
||||
"nixpkgs": [
|
||||
"nixpkgs"
|
||||
],
|
||||
"systems": "systems_2"
|
||||
},
|
||||
"locked": {
|
||||
"lastModified": 1721306136,
|
||||
"narHash": "sha256-VKPsIGf3/a+RONBipx4lEE4LXG2sdMNkWQu22LNQItg=",
|
||||
"lastModified": 1723293904,
|
||||
"narHash": "sha256-b+uqzj+Wa6xgMS9aNbX4I+sXeb5biPDi39VgvSFqFvU=",
|
||||
"owner": "ryantm",
|
||||
"repo": "agenix",
|
||||
"rev": "f6291c5935fdc4e0bef208cfc0dcab7e3f7a1c41",
|
||||
"type": "github"
|
||||
},
|
||||
"original": {
|
||||
"owner": "ryantm",
|
||||
"repo": "agenix",
|
||||
"type": "github"
|
||||
}
|
||||
},
|
||||
"ags": {
|
||||
"inputs": {
|
||||
"nixpkgs": [
|
||||
"nixpkgs"
|
||||
],
|
||||
"systems": "systems_3"
|
||||
},
|
||||
"locked": {
|
||||
"lastModified": 1728326430,
|
||||
"narHash": "sha256-tV1ABHuA1HItMdCTuNdA8fMB+qw7LpjvI945VwMSABI=",
|
||||
"owner": "Aylur",
|
||||
"repo": "ags",
|
||||
"rev": "344ea72cd3b8d4911f362fec34bce7d8fb37028c",
|
||||
"rev": "60180a184cfb32b61a1d871c058b31a3b9b0743d",
|
||||
"type": "github"
|
||||
},
|
||||
"original": {
|
||||
|
@ -63,11 +86,11 @@
|
|||
]
|
||||
},
|
||||
"locked": {
|
||||
"lastModified": 1725199881,
|
||||
"narHash": "sha256-jsmipf/u1GFZE5tBUkr56CHMN6VpUWCAjfLIhvQijU0=",
|
||||
"lastModified": 1728326504,
|
||||
"narHash": "sha256-dQXAj+4d6neY7ldCiH6gNym3upP49PVxRzEPxXlD9Aw=",
|
||||
"owner": "hyprwm",
|
||||
"repo": "aquamarine",
|
||||
"rev": "f8a687dd29ff019657498f1bd14da2fbbf0e604b",
|
||||
"rev": "65dd97b5d21e917295159bbef1d52e06963f4eb0",
|
||||
"type": "github"
|
||||
},
|
||||
"original": {
|
||||
|
@ -76,6 +99,28 @@
|
|||
"type": "github"
|
||||
}
|
||||
},
|
||||
"darwin": {
|
||||
"inputs": {
|
||||
"nixpkgs": [
|
||||
"agenix",
|
||||
"nixpkgs"
|
||||
]
|
||||
},
|
||||
"locked": {
|
||||
"lastModified": 1700795494,
|
||||
"narHash": "sha256-gzGLZSiOhf155FW7262kdHo2YDeugp3VuIFb4/GGng0=",
|
||||
"owner": "lnl7",
|
||||
"repo": "nix-darwin",
|
||||
"rev": "4b9b83d5a92e8c1fbfd8eb27eda375908c11ec4d",
|
||||
"type": "github"
|
||||
},
|
||||
"original": {
|
||||
"owner": "lnl7",
|
||||
"ref": "master",
|
||||
"repo": "nix-darwin",
|
||||
"type": "github"
|
||||
}
|
||||
},
|
||||
"emacs-overlay": {
|
||||
"inputs": {
|
||||
"flake-utils": "flake-utils_2",
|
||||
|
@ -83,11 +128,11 @@
|
|||
"nixpkgs-stable": "nixpkgs-stable"
|
||||
},
|
||||
"locked": {
|
||||
"lastModified": 1725674458,
|
||||
"narHash": "sha256-AeemHTjtU56bXUCXJ4CrEJmIOfXfALkIR8Ix+AVlclg=",
|
||||
"lastModified": 1728753084,
|
||||
"narHash": "sha256-OgpebVl9jecLspSckK9xeYk804z9GM2ROClCJbmPpac=",
|
||||
"owner": "nix-community",
|
||||
"repo": "emacs-overlay",
|
||||
"rev": "0442d57ffa83985ec2ffaec95db9c0fe742f5182",
|
||||
"rev": "5921ff72aa8019353091f0e63b3e34db28fa757f",
|
||||
"type": "github"
|
||||
},
|
||||
"original": {
|
||||
|
@ -112,16 +157,32 @@
|
|||
"type": "github"
|
||||
}
|
||||
},
|
||||
"flake-compat_2": {
|
||||
"flake": false,
|
||||
"locked": {
|
||||
"lastModified": 1696426674,
|
||||
"narHash": "sha256-kvjfFW7WAETZlt09AgDn1MrtKzP7t90Vf7vypd3OL1U=",
|
||||
"owner": "edolstra",
|
||||
"repo": "flake-compat",
|
||||
"rev": "0f9255e01c2351cc7d116c072cb317785dd33b33",
|
||||
"type": "github"
|
||||
},
|
||||
"original": {
|
||||
"owner": "edolstra",
|
||||
"repo": "flake-compat",
|
||||
"type": "github"
|
||||
}
|
||||
},
|
||||
"flake-utils": {
|
||||
"inputs": {
|
||||
"systems": "systems"
|
||||
},
|
||||
"locked": {
|
||||
"lastModified": 1710146030,
|
||||
"narHash": "sha256-SZ5L6eA7HJ/nmkzGG7/ISclqe6oZdOZTNoesiInkXPQ=",
|
||||
"lastModified": 1726560853,
|
||||
"narHash": "sha256-X6rJYSESBVr3hBoH0WbKE5KvhPU5bloyZ2L4K60/fPQ=",
|
||||
"owner": "numtide",
|
||||
"repo": "flake-utils",
|
||||
"rev": "b1d9ab70662946ef0850d488da1c9019f3a9752a",
|
||||
"rev": "c1dfcf08411b08f6b8615f7d8971a2bfa81d5e8a",
|
||||
"type": "github"
|
||||
},
|
||||
"original": {
|
||||
|
@ -132,14 +193,14 @@
|
|||
},
|
||||
"flake-utils_2": {
|
||||
"inputs": {
|
||||
"systems": "systems_3"
|
||||
"systems": "systems_4"
|
||||
},
|
||||
"locked": {
|
||||
"lastModified": 1710146030,
|
||||
"narHash": "sha256-SZ5L6eA7HJ/nmkzGG7/ISclqe6oZdOZTNoesiInkXPQ=",
|
||||
"lastModified": 1726560853,
|
||||
"narHash": "sha256-X6rJYSESBVr3hBoH0WbKE5KvhPU5bloyZ2L4K60/fPQ=",
|
||||
"owner": "numtide",
|
||||
"repo": "flake-utils",
|
||||
"rev": "b1d9ab70662946ef0850d488da1c9019f3a9752a",
|
||||
"rev": "c1dfcf08411b08f6b8615f7d8971a2bfa81d5e8a",
|
||||
"type": "github"
|
||||
},
|
||||
"original": {
|
||||
|
@ -148,18 +209,61 @@
|
|||
"type": "github"
|
||||
}
|
||||
},
|
||||
"gitignore": {
|
||||
"inputs": {
|
||||
"nixpkgs": [
|
||||
"hyprland",
|
||||
"pre-commit-hooks",
|
||||
"nixpkgs"
|
||||
]
|
||||
},
|
||||
"locked": {
|
||||
"lastModified": 1709087332,
|
||||
"narHash": "sha256-HG2cCnktfHsKV0s4XW83gU3F57gaTljL9KNSuG6bnQs=",
|
||||
"owner": "hercules-ci",
|
||||
"repo": "gitignore.nix",
|
||||
"rev": "637db329424fd7e46cf4185293b9cc8c88c95394",
|
||||
"type": "github"
|
||||
},
|
||||
"original": {
|
||||
"owner": "hercules-ci",
|
||||
"repo": "gitignore.nix",
|
||||
"type": "github"
|
||||
}
|
||||
},
|
||||
"home-manager": {
|
||||
"inputs": {
|
||||
"nixpkgs": [
|
||||
"agenix",
|
||||
"nixpkgs"
|
||||
]
|
||||
},
|
||||
"locked": {
|
||||
"lastModified": 1703113217,
|
||||
"narHash": "sha256-7ulcXOk63TIT2lVDSExj7XzFx09LpdSAPtvgtM7yQPE=",
|
||||
"owner": "nix-community",
|
||||
"repo": "home-manager",
|
||||
"rev": "3bfaacf46133c037bb356193bd2f1765d9dc82c1",
|
||||
"type": "github"
|
||||
},
|
||||
"original": {
|
||||
"owner": "nix-community",
|
||||
"repo": "home-manager",
|
||||
"type": "github"
|
||||
}
|
||||
},
|
||||
"home-manager_2": {
|
||||
"inputs": {
|
||||
"nixpkgs": [
|
||||
"nixpkgs"
|
||||
]
|
||||
},
|
||||
"locked": {
|
||||
"lastModified": 1725694918,
|
||||
"narHash": "sha256-+HsjshXpqNiJHLaJaK0JnIicJ/a1NquKcfn4YZ3ILgg=",
|
||||
"lastModified": 1728726232,
|
||||
"narHash": "sha256-8ZWr1HpciQsrFjvPMvZl0W+b0dilZOqXPoKa2Ux36bc=",
|
||||
"owner": "nix-community",
|
||||
"repo": "home-manager",
|
||||
"rev": "aaebdea769a5c10f1c6e50ebdf5924c1a13f0cda",
|
||||
"rev": "d57112db877f07387ce7104b5ac346ede556d2d7",
|
||||
"type": "github"
|
||||
},
|
||||
"original": {
|
||||
|
@ -184,11 +288,11 @@
|
|||
]
|
||||
},
|
||||
"locked": {
|
||||
"lastModified": 1722623071,
|
||||
"narHash": "sha256-sLADpVgebpCBFXkA1FlCXtvEPu1tdEsTfqK1hfeHySE=",
|
||||
"lastModified": 1727821604,
|
||||
"narHash": "sha256-hNw5J6xatedqytYowx0mJKgctjA4lQARZFdgnzM2RpM=",
|
||||
"owner": "hyprwm",
|
||||
"repo": "hyprcursor",
|
||||
"rev": "912d56025f03d41b1ad29510c423757b4379eb1c",
|
||||
"rev": "d60e1e01e6e6633ef1c87148b9137cc1dd39263d",
|
||||
"type": "github"
|
||||
},
|
||||
"original": {
|
||||
|
@ -201,19 +305,21 @@
|
|||
"inputs": {
|
||||
"aquamarine": "aquamarine",
|
||||
"hyprcursor": "hyprcursor",
|
||||
"hyprland-protocols": "hyprland-protocols",
|
||||
"hyprlang": "hyprlang",
|
||||
"hyprutils": "hyprutils",
|
||||
"hyprwayland-scanner": "hyprwayland-scanner",
|
||||
"nixpkgs": "nixpkgs_2",
|
||||
"systems": "systems_4",
|
||||
"pre-commit-hooks": "pre-commit-hooks",
|
||||
"systems": "systems_5",
|
||||
"xdph": "xdph"
|
||||
},
|
||||
"locked": {
|
||||
"lastModified": 1725667615,
|
||||
"narHash": "sha256-ksmD1gNS/AX4qHvcCS7u+agvB+0fg2wCukFr3Hy4A3I=",
|
||||
"lastModified": 1728752206,
|
||||
"narHash": "sha256-r5xU/LqU4TrUOIouhYqrTZc1VY1zLQOOzbLsFCDlfpI=",
|
||||
"ref": "refs/heads/main",
|
||||
"rev": "0500213086f8402ccbdb2acb4748dbc6d22e21f6",
|
||||
"revCount": 5192,
|
||||
"rev": "1822707c7e7394ce8c7572f2fe890763a307f499",
|
||||
"revCount": 5332,
|
||||
"submodules": true,
|
||||
"type": "git",
|
||||
"url": "https://github.com/hyprwm/Hyprland"
|
||||
|
@ -228,21 +334,19 @@
|
|||
"inputs": {
|
||||
"nixpkgs": [
|
||||
"hyprland",
|
||||
"xdph",
|
||||
"nixpkgs"
|
||||
],
|
||||
"systems": [
|
||||
"hyprland",
|
||||
"xdph",
|
||||
"systems"
|
||||
]
|
||||
},
|
||||
"locked": {
|
||||
"lastModified": 1721326555,
|
||||
"narHash": "sha256-zCu4R0CSHEactW9JqYki26gy8h9f6rHmSwj4XJmlHgg=",
|
||||
"lastModified": 1728345020,
|
||||
"narHash": "sha256-xGbkc7U/Roe0/Cv3iKlzijIaFBNguasI31ynL2IlEoM=",
|
||||
"owner": "hyprwm",
|
||||
"repo": "hyprland-protocols",
|
||||
"rev": "5a11232266bf1a1f5952d5b179c3f4b2facaaa84",
|
||||
"rev": "a7c183800e74f337753de186522b9017a07a8cee",
|
||||
"type": "github"
|
||||
},
|
||||
"original": {
|
||||
|
@ -267,11 +371,11 @@
|
|||
]
|
||||
},
|
||||
"locked": {
|
||||
"lastModified": 1725188252,
|
||||
"narHash": "sha256-yBH8c4GDaEAtBrh+BqIlrx5vp6gG/Gu8fQQK63KAQgs=",
|
||||
"lastModified": 1728168612,
|
||||
"narHash": "sha256-AnB1KfiXINmuiW7BALYrKqcjCnsLZPifhb/7BsfPbns=",
|
||||
"owner": "hyprwm",
|
||||
"repo": "hyprlang",
|
||||
"rev": "c12ab785ce1982f82594aff03b3104c598186ddd",
|
||||
"rev": "f054f2e44d6a0b74607a6bc0f52dba337a3db38e",
|
||||
"type": "github"
|
||||
},
|
||||
"original": {
|
||||
|
@ -315,7 +419,7 @@
|
|||
"hyprutils": "hyprutils_2",
|
||||
"hyprwayland-scanner": "hyprwayland-scanner_2",
|
||||
"nixpkgs": "nixpkgs_3",
|
||||
"systems": "systems_5"
|
||||
"systems": "systems_6"
|
||||
},
|
||||
"locked": {
|
||||
"lastModified": 1725200438,
|
||||
|
@ -343,11 +447,11 @@
|
|||
]
|
||||
},
|
||||
"locked": {
|
||||
"lastModified": 1724966483,
|
||||
"narHash": "sha256-WXDgKIbzjYKczxSZOsJplCS1i1yrTUpsDPuJV/xpYLo=",
|
||||
"lastModified": 1727300645,
|
||||
"narHash": "sha256-OvAtVLaSRPnbXzOwlR1fVqCXR7i+ICRX3aPMCdIiv+c=",
|
||||
"owner": "hyprwm",
|
||||
"repo": "hyprutils",
|
||||
"rev": "8976e3f6a5357da953a09511d0c7f6a890fb6ec2",
|
||||
"rev": "3f5293432b6dc6a99f26aca2eba3876d2660665c",
|
||||
"type": "github"
|
||||
},
|
||||
"original": {
|
||||
|
@ -393,11 +497,11 @@
|
|||
]
|
||||
},
|
||||
"locked": {
|
||||
"lastModified": 1721324119,
|
||||
"narHash": "sha256-SOOqIT27/X792+vsLSeFdrNTF+OSRp5qXv6Te+fb2Qg=",
|
||||
"lastModified": 1726874836,
|
||||
"narHash": "sha256-VKR0sf0PSNCB0wPHVKSAn41mCNVCnegWmgkrneKDhHM=",
|
||||
"owner": "hyprwm",
|
||||
"repo": "hyprwayland-scanner",
|
||||
"rev": "a048a6cb015340bd82f97c1f40a4b595ca85cc30",
|
||||
"rev": "500c81a9e1a76760371049a8d99e008ea77aa59e",
|
||||
"type": "github"
|
||||
},
|
||||
"original": {
|
||||
|
@ -433,11 +537,11 @@
|
|||
},
|
||||
"nixpkgs": {
|
||||
"locked": {
|
||||
"lastModified": 1725432240,
|
||||
"narHash": "sha256-+yj+xgsfZaErbfYM3T+QvEE2hU7UuE+Jf0fJCJ8uPS0=",
|
||||
"lastModified": 1728492678,
|
||||
"narHash": "sha256-9UTxR8eukdg+XZeHgxW5hQA9fIKHsKCdOIUycTryeVw=",
|
||||
"owner": "NixOS",
|
||||
"repo": "nixpkgs",
|
||||
"rev": "ad416d066ca1222956472ab7d0555a6946746a80",
|
||||
"rev": "5633bcff0c6162b9e4b5f1264264611e950c8ec7",
|
||||
"type": "github"
|
||||
},
|
||||
"original": {
|
||||
|
@ -449,11 +553,11 @@
|
|||
},
|
||||
"nixpkgs-stable": {
|
||||
"locked": {
|
||||
"lastModified": 1725407940,
|
||||
"narHash": "sha256-tiN5Rlg/jiY0tyky+soJZoRzLKbPyIdlQ77xVgREDNM=",
|
||||
"lastModified": 1728627514,
|
||||
"narHash": "sha256-r+SF9AnHrTg+bk6YszoKfV9lgyw+yaFUQe0dOjI0Z2o=",
|
||||
"owner": "NixOS",
|
||||
"repo": "nixpkgs",
|
||||
"rev": "6f6c45b5134a8ee2e465164811e451dcb5ad86e3",
|
||||
"rev": "c505ebf777526041d792a49d5f6dd4095ea391a7",
|
||||
"type": "github"
|
||||
},
|
||||
"original": {
|
||||
|
@ -465,11 +569,27 @@
|
|||
},
|
||||
"nixpkgs-stable_2": {
|
||||
"locked": {
|
||||
"lastModified": 1725407940,
|
||||
"narHash": "sha256-tiN5Rlg/jiY0tyky+soJZoRzLKbPyIdlQ77xVgREDNM=",
|
||||
"lastModified": 1720386169,
|
||||
"narHash": "sha256-NGKVY4PjzwAa4upkGtAMz1npHGoRzWotlSnVlqI40mo=",
|
||||
"owner": "NixOS",
|
||||
"repo": "nixpkgs",
|
||||
"rev": "194846768975b7ad2c4988bdb82572c00222c0d7",
|
||||
"type": "github"
|
||||
},
|
||||
"original": {
|
||||
"owner": "NixOS",
|
||||
"ref": "nixos-24.05",
|
||||
"repo": "nixpkgs",
|
||||
"type": "github"
|
||||
}
|
||||
},
|
||||
"nixpkgs-stable_3": {
|
||||
"locked": {
|
||||
"lastModified": 1728627514,
|
||||
"narHash": "sha256-r+SF9AnHrTg+bk6YszoKfV9lgyw+yaFUQe0dOjI0Z2o=",
|
||||
"owner": "nixos",
|
||||
"repo": "nixpkgs",
|
||||
"rev": "6f6c45b5134a8ee2e465164811e451dcb5ad86e3",
|
||||
"rev": "c505ebf777526041d792a49d5f6dd4095ea391a7",
|
||||
"type": "github"
|
||||
},
|
||||
"original": {
|
||||
|
@ -479,13 +599,13 @@
|
|||
"type": "github"
|
||||
}
|
||||
},
|
||||
"nixpkgs-stable_3": {
|
||||
"nixpkgs-stable_4": {
|
||||
"locked": {
|
||||
"lastModified": 1721524707,
|
||||
"narHash": "sha256-5NctRsoE54N86nWd0psae70YSLfrOek3Kv1e8KoXe/0=",
|
||||
"lastModified": 1728156290,
|
||||
"narHash": "sha256-uogSvuAp+1BYtdu6UWuObjHqSbBohpyARXDWqgI12Ss=",
|
||||
"owner": "NixOS",
|
||||
"repo": "nixpkgs",
|
||||
"rev": "556533a23879fc7e5f98dd2e0b31a6911a213171",
|
||||
"rev": "17ae88b569bb15590549ff478bab6494dde4a907",
|
||||
"type": "github"
|
||||
},
|
||||
"original": {
|
||||
|
@ -497,11 +617,11 @@
|
|||
},
|
||||
"nixpkgs_2": {
|
||||
"locked": {
|
||||
"lastModified": 1725103162,
|
||||
"narHash": "sha256-Ym04C5+qovuQDYL/rKWSR+WESseQBbNAe5DsXNx5trY=",
|
||||
"lastModified": 1728018373,
|
||||
"narHash": "sha256-NOiTvBbRLIOe5F6RbHaAh6++BNjsb149fGZd1T4+KBg=",
|
||||
"owner": "NixOS",
|
||||
"repo": "nixpkgs",
|
||||
"rev": "12228ff1752d7b7624a54e9c1af4b222b3c1073b",
|
||||
"rev": "bc947f541ae55e999ffdb4013441347d83b00feb",
|
||||
"type": "github"
|
||||
},
|
||||
"original": {
|
||||
|
@ -529,11 +649,11 @@
|
|||
},
|
||||
"nixpkgs_4": {
|
||||
"locked": {
|
||||
"lastModified": 1725432240,
|
||||
"narHash": "sha256-+yj+xgsfZaErbfYM3T+QvEE2hU7UuE+Jf0fJCJ8uPS0=",
|
||||
"lastModified": 1728492678,
|
||||
"narHash": "sha256-9UTxR8eukdg+XZeHgxW5hQA9fIKHsKCdOIUycTryeVw=",
|
||||
"owner": "NixOS",
|
||||
"repo": "nixpkgs",
|
||||
"rev": "ad416d066ca1222956472ab7d0555a6946746a80",
|
||||
"rev": "5633bcff0c6162b9e4b5f1264264611e950c8ec7",
|
||||
"type": "github"
|
||||
},
|
||||
"original": {
|
||||
|
@ -543,16 +663,41 @@
|
|||
"type": "github"
|
||||
}
|
||||
},
|
||||
"pre-commit-hooks": {
|
||||
"inputs": {
|
||||
"flake-compat": "flake-compat_2",
|
||||
"gitignore": "gitignore",
|
||||
"nixpkgs": [
|
||||
"hyprland",
|
||||
"nixpkgs"
|
||||
],
|
||||
"nixpkgs-stable": "nixpkgs-stable_2"
|
||||
},
|
||||
"locked": {
|
||||
"lastModified": 1728092656,
|
||||
"narHash": "sha256-eMeCTJZ5xBeQ0f9Os7K8DThNVSo9gy4umZLDfF5q6OM=",
|
||||
"owner": "cachix",
|
||||
"repo": "git-hooks.nix",
|
||||
"rev": "1211305a5b237771e13fcca0c51e60ad47326a9a",
|
||||
"type": "github"
|
||||
},
|
||||
"original": {
|
||||
"owner": "cachix",
|
||||
"repo": "git-hooks.nix",
|
||||
"type": "github"
|
||||
}
|
||||
},
|
||||
"root": {
|
||||
"inputs": {
|
||||
"NixOS-WSL": "NixOS-WSL",
|
||||
"agenix": "agenix",
|
||||
"ags": "ags",
|
||||
"emacs-overlay": "emacs-overlay",
|
||||
"home-manager": "home-manager",
|
||||
"home-manager": "home-manager_2",
|
||||
"hyprland": "hyprland",
|
||||
"hyprpaper": "hyprpaper",
|
||||
"nixpkgs": "nixpkgs_4",
|
||||
"nixpkgs-stable": "nixpkgs-stable_2",
|
||||
"nixpkgs-stable": "nixpkgs-stable_3",
|
||||
"sops-nix": "sops-nix"
|
||||
}
|
||||
},
|
||||
|
@ -561,14 +706,14 @@
|
|||
"nixpkgs": [
|
||||
"nixpkgs"
|
||||
],
|
||||
"nixpkgs-stable": "nixpkgs-stable_3"
|
||||
"nixpkgs-stable": "nixpkgs-stable_4"
|
||||
},
|
||||
"locked": {
|
||||
"lastModified": 1725540166,
|
||||
"narHash": "sha256-htc9rsTMSAY5ek+DB3tpntdD/es0eam2hJgO92bWSys=",
|
||||
"lastModified": 1728345710,
|
||||
"narHash": "sha256-lpunY1+bf90ts+sA2/FgxVNIegPDKCpEoWwOPu4ITTQ=",
|
||||
"owner": "Mic92",
|
||||
"repo": "sops-nix",
|
||||
"rev": "d9d781523a1463965cd1e1333a306e70d9feff07",
|
||||
"rev": "06535d0e3d0201e6a8080dd32dbfde339b94f01b",
|
||||
"type": "github"
|
||||
},
|
||||
"original": {
|
||||
|
@ -593,21 +738,6 @@
|
|||
}
|
||||
},
|
||||
"systems_2": {
|
||||
"locked": {
|
||||
"lastModified": 1689347949,
|
||||
"narHash": "sha256-12tWmuL2zgBgZkdoB6qXZsgJEH9LR3oUgpaQq2RbI80=",
|
||||
"owner": "nix-systems",
|
||||
"repo": "default-linux",
|
||||
"rev": "31732fcf5e8fea42e59c2488ad31a0e651500f68",
|
||||
"type": "github"
|
||||
},
|
||||
"original": {
|
||||
"owner": "nix-systems",
|
||||
"repo": "default-linux",
|
||||
"type": "github"
|
||||
}
|
||||
},
|
||||
"systems_3": {
|
||||
"locked": {
|
||||
"lastModified": 1681028828,
|
||||
"narHash": "sha256-Vy1rq5AaRuLzOxct8nz4T6wlgyUR7zLU309k9mBC768=",
|
||||
|
@ -622,7 +752,7 @@
|
|||
"type": "github"
|
||||
}
|
||||
},
|
||||
"systems_4": {
|
||||
"systems_3": {
|
||||
"locked": {
|
||||
"lastModified": 1689347949,
|
||||
"narHash": "sha256-12tWmuL2zgBgZkdoB6qXZsgJEH9LR3oUgpaQq2RbI80=",
|
||||
|
@ -637,6 +767,21 @@
|
|||
"type": "github"
|
||||
}
|
||||
},
|
||||
"systems_4": {
|
||||
"locked": {
|
||||
"lastModified": 1681028828,
|
||||
"narHash": "sha256-Vy1rq5AaRuLzOxct8nz4T6wlgyUR7zLU309k9mBC768=",
|
||||
"owner": "nix-systems",
|
||||
"repo": "default",
|
||||
"rev": "da67096a3b9bf56a91d16901293e51ba5b49a27e",
|
||||
"type": "github"
|
||||
},
|
||||
"original": {
|
||||
"owner": "nix-systems",
|
||||
"repo": "default",
|
||||
"type": "github"
|
||||
}
|
||||
},
|
||||
"systems_5": {
|
||||
"locked": {
|
||||
"lastModified": 1689347949,
|
||||
|
@ -652,13 +797,39 @@
|
|||
"type": "github"
|
||||
}
|
||||
},
|
||||
"systems_6": {
|
||||
"locked": {
|
||||
"lastModified": 1689347949,
|
||||
"narHash": "sha256-12tWmuL2zgBgZkdoB6qXZsgJEH9LR3oUgpaQq2RbI80=",
|
||||
"owner": "nix-systems",
|
||||
"repo": "default-linux",
|
||||
"rev": "31732fcf5e8fea42e59c2488ad31a0e651500f68",
|
||||
"type": "github"
|
||||
},
|
||||
"original": {
|
||||
"owner": "nix-systems",
|
||||
"repo": "default-linux",
|
||||
"type": "github"
|
||||
}
|
||||
},
|
||||
"xdph": {
|
||||
"inputs": {
|
||||
"hyprland-protocols": "hyprland-protocols",
|
||||
"hyprland-protocols": [
|
||||
"hyprland",
|
||||
"hyprland-protocols"
|
||||
],
|
||||
"hyprlang": [
|
||||
"hyprland",
|
||||
"hyprlang"
|
||||
],
|
||||
"hyprutils": [
|
||||
"hyprland",
|
||||
"hyprutils"
|
||||
],
|
||||
"hyprwayland-scanner": [
|
||||
"hyprland",
|
||||
"hyprwayland-scanner"
|
||||
],
|
||||
"nixpkgs": [
|
||||
"hyprland",
|
||||
"nixpkgs"
|
||||
|
@ -669,11 +840,11 @@
|
|||
]
|
||||
},
|
||||
"locked": {
|
||||
"lastModified": 1725203932,
|
||||
"narHash": "sha256-VLULC/OnI+6R9KEP2OIGk+uLJJsfRlaLouZ5gyFd2+Y=",
|
||||
"lastModified": 1728166987,
|
||||
"narHash": "sha256-w6dVTguAn9zJ+7aPOhBQgDz8bn6YZ7b56cY8Kg5HJRI=",
|
||||
"owner": "hyprwm",
|
||||
"repo": "xdg-desktop-portal-hyprland",
|
||||
"rev": "2425e8f541525fa7409d9f26a8ffaf92a3767251",
|
||||
"rev": "fb9c8d665af0588bb087f97d0f673ddf0d501787",
|
||||
"type": "github"
|
||||
},
|
||||
"original": {
|
||||
|
|
71
flake.nix
71
flake.nix
|
@ -3,8 +3,10 @@
|
|||
description = "Sako's NixOS Configuration";
|
||||
|
||||
inputs = {
|
||||
nixpkgs.url = "github:NixOS/nixpkgs/nixos-unstable"; # nixpkgs unstable branch
|
||||
nixpkgs-stable.url = "github:nixos/nixpkgs/nixos-24.05"; # nixpkgs stable branch because some things break
|
||||
nixpkgs.url =
|
||||
"github:NixOS/nixpkgs/nixos-unstable"; # nixpkgs unstable branch
|
||||
nixpkgs-stable.url =
|
||||
"github:nixos/nixpkgs/nixos-24.05"; # nixpkgs stable branch because some things break
|
||||
home-manager = {
|
||||
# this manages your dotfiles for the most part
|
||||
url = "github:nix-community/home-manager";
|
||||
|
@ -20,9 +22,11 @@
|
|||
url = "github:Mic92/sops-nix";
|
||||
inputs.nixpkgs.follows = "nixpkgs";
|
||||
};
|
||||
emacs-overlay = {
|
||||
url = "github:nix-community/emacs-overlay";
|
||||
agenix = {
|
||||
url = "github:ryantm/agenix";
|
||||
inputs.nixpkgs.follows = "nixpkgs";
|
||||
};
|
||||
emacs-overlay = { url = "github:nix-community/emacs-overlay"; };
|
||||
ags = {
|
||||
url = "github:Aylur/ags";
|
||||
inputs.nixpkgs.follows = "nixpkgs";
|
||||
|
@ -31,59 +35,35 @@
|
|||
hyprpaper.url = "github:hyprwm/hyprpaper";
|
||||
};
|
||||
|
||||
outputs = {
|
||||
self,
|
||||
nixpkgs,
|
||||
home-manager,
|
||||
NixOS-WSL,
|
||||
sops-nix,
|
||||
emacs-overlay,
|
||||
hyprland,
|
||||
hyprpaper,
|
||||
ags,
|
||||
...
|
||||
} @ inputs: let
|
||||
outputs = { self, nixpkgs, home-manager, NixOS-WSL, agenix, emacs-overlay
|
||||
, hyprland, hyprpaper, ags, ... }@inputs:
|
||||
let
|
||||
inherit (self) outputs;
|
||||
forAllSystems = nixpkgs.lib.genAttrs [
|
||||
"x86_64-linux"
|
||||
];
|
||||
forAllSystems = nixpkgs.lib.genAttrs [ "x86_64-linux" ];
|
||||
in rec {
|
||||
# custom packages
|
||||
packages = forAllSystems (
|
||||
system: let
|
||||
pkgs = nixpkgs.legacyPackages.${system};
|
||||
in
|
||||
import ./packages {inherit pkgs;}
|
||||
);
|
||||
packages = forAllSystems (system:
|
||||
let pkgs = nixpkgs.legacyPackages.${system};
|
||||
in import ./packages { inherit pkgs; });
|
||||
# dev shell for bootstrap
|
||||
devShells = forAllSystems (
|
||||
system: let
|
||||
pkgs = nixpkgs.legacyPackages.${system};
|
||||
in
|
||||
import ./shell.nix {inherit pkgs;}
|
||||
);
|
||||
devShells = forAllSystems (system:
|
||||
let pkgs = nixpkgs.legacyPackages.${system};
|
||||
in import ./shell.nix { inherit pkgs; });
|
||||
|
||||
# overlays here
|
||||
overlays = import ./overlays {inherit inputs;};
|
||||
overlays = import ./overlays { inherit inputs; };
|
||||
|
||||
# modules :D
|
||||
nixosModules = import ./modules;
|
||||
|
||||
nixosConfigurations = {
|
||||
sakotop = nixpkgs.lib.nixosSystem {
|
||||
specialArgs = {inherit inputs outputs;};
|
||||
modules = [
|
||||
./default.nix
|
||||
./hosts/sakotop/configuration.nix
|
||||
sops-nix.nixosModules.sops
|
||||
];
|
||||
specialArgs = { inherit inputs outputs; };
|
||||
modules = [ ./default.nix ./hosts/sakotop/configuration.nix ];
|
||||
};
|
||||
sakopc = nixpkgs.lib.nixosSystem {
|
||||
specialArgs = {inherit inputs outputs;};
|
||||
modules = [
|
||||
./default.nix
|
||||
./hosts/sakopc/configuration.nix
|
||||
];
|
||||
specialArgs = { inherit inputs outputs; };
|
||||
modules = [ ./default.nix ./hosts/sakopc/configuration.nix ];
|
||||
};
|
||||
#sakoserver = nixpkgs.lib.nixosSystem {
|
||||
# specialArgs = {inherit inputs outputs;};
|
||||
|
@ -95,12 +75,11 @@
|
|||
sakowsl = nixpkgs.lib.nixosSystem {
|
||||
# because theres no hardware-configuration.nix
|
||||
system = "x86_64-linux";
|
||||
specialArgs = {inherit inputs outputs;};
|
||||
specialArgs = { inherit inputs outputs; };
|
||||
modules = [
|
||||
{nix.registry.nixpkgs.flake = nixpkgs;}
|
||||
{ nix.registry.nixpkgs.flake = nixpkgs; }
|
||||
./hosts/sakowsl/configuration.nix
|
||||
NixOS-WSL.nixosModules.wsl
|
||||
sops-nix.nixosModules.sops
|
||||
];
|
||||
};
|
||||
};
|
||||
|
|
|
@ -1,10 +1,4 @@
|
|||
{
|
||||
config, pkgs,
|
||||
lib,
|
||||
inputs,
|
||||
outputs,
|
||||
...
|
||||
}: {
|
||||
{ config, pkgs, lib, inputs, outputs, ... }: {
|
||||
imports = [
|
||||
# Hardware Configuration
|
||||
# TODO:: Add this back once generated!!!!!!!
|
||||
|
@ -25,8 +19,8 @@
|
|||
hyprland.enable = true;
|
||||
foot.enable = true;
|
||||
kitty.enable = true;
|
||||
picom.enable = true;
|
||||
dunst.enable = true;
|
||||
picom.enable = false;
|
||||
dunst.enable = false;
|
||||
apps = {
|
||||
nextcloud.enable = true;
|
||||
rssguard.enable = true;
|
||||
|
@ -39,7 +33,7 @@
|
|||
browsers = {
|
||||
firefox.enable = true;
|
||||
qutebrowser.enable = false;
|
||||
chromium.enable = true;
|
||||
chromium.enable = false;
|
||||
};
|
||||
chat = {
|
||||
zoom.enable = true;
|
||||
|
@ -49,6 +43,8 @@
|
|||
weechat.enable = true;
|
||||
signal.enable = true;
|
||||
element.enable = true;
|
||||
gajim.enable = true;
|
||||
psi-plus.enable = true;
|
||||
};
|
||||
game = {
|
||||
lutris.enable = true;
|
||||
|
@ -58,10 +54,11 @@
|
|||
};
|
||||
media = {
|
||||
mpv.enable = true;
|
||||
ardour.enable = true;
|
||||
kdenlive.enable = true;
|
||||
blender.enable = true;
|
||||
feishin.enable = true;
|
||||
jellyfin.enable = true;
|
||||
jellyfin.enable = false;
|
||||
};
|
||||
};
|
||||
dev = {
|
||||
|
@ -78,7 +75,7 @@
|
|||
lua.enable = true;
|
||||
python.enable = true;
|
||||
rust.enable = true;
|
||||
nil.enable = true;
|
||||
nixd.enable = true;
|
||||
};
|
||||
hardware = {
|
||||
bluetooth.enable = false;
|
||||
|
@ -107,8 +104,8 @@
|
|||
onlyoffice.enable = true;
|
||||
};
|
||||
security = {
|
||||
sops.enable = true;
|
||||
certs.enable = true;
|
||||
tor.enable = true;
|
||||
};
|
||||
};
|
||||
|
||||
|
@ -118,6 +115,11 @@
|
|||
${pkgs.xorg.xrandr}/bin/xrandr --output DP-0 --mode 1920x1080 --rate 239.96 --primary --output HDMI-0 --mode 1920x1080 --left-of DP-0
|
||||
'';
|
||||
|
||||
# secrets
|
||||
age.identityPaths = [ "/home/sako/.ssh/id_ed25519" ];
|
||||
|
||||
age.secrets.test.file = ../../secrets/test.age;
|
||||
|
||||
# lol
|
||||
services.xserver.dpi = 100;
|
||||
|
||||
|
|
|
@ -1,13 +1,6 @@
|
|||
# Edit this configuration file to define what should be installed on
|
||||
# your system. Help is available in the configuration.nix(5) man page and in the NixOS manual (accessible by running `nixos-help`).
|
||||
{
|
||||
config,
|
||||
pkgs,
|
||||
lib,
|
||||
inputs,
|
||||
outputs,
|
||||
...
|
||||
}: {
|
||||
{ config, pkgs, lib, inputs, outputs, ... }: {
|
||||
imports = [
|
||||
# Include the results of the hardware scan.
|
||||
./hardware-configuration.nix
|
||||
|
@ -46,6 +39,8 @@
|
|||
telegram.enable = true;
|
||||
weechat.enable = true;
|
||||
element.enable = true;
|
||||
gajim.enable = true;
|
||||
psi-plus.enable = true;
|
||||
};
|
||||
apps = {
|
||||
nemo.enable = true;
|
||||
|
@ -64,6 +59,7 @@
|
|||
lutris.enable = true;
|
||||
steam.enable = true;
|
||||
tetrio.enable = true;
|
||||
osu.enable = true;
|
||||
prismlauncher.enable = true;
|
||||
};
|
||||
media = {
|
||||
|
@ -75,9 +71,7 @@
|
|||
mpv.enable = true;
|
||||
jellyfin.enable = true;
|
||||
};
|
||||
security = {
|
||||
wireshark.enable = true;
|
||||
};
|
||||
security = { wireshark.enable = true; };
|
||||
};
|
||||
hardware = {
|
||||
nvidia = {
|
||||
|
@ -101,7 +95,7 @@
|
|||
package = pkgs.emacs-unstable-pgtk;
|
||||
};
|
||||
};
|
||||
nil.enable = true;
|
||||
nixd.enable = true;
|
||||
cc.enable = true;
|
||||
csharp.enable = true;
|
||||
javascript.enable = true;
|
||||
|
@ -138,27 +132,18 @@
|
|||
};
|
||||
security = {
|
||||
age.enable = true;
|
||||
sops.enable = true;
|
||||
certs.enable = true;
|
||||
tor.enable = true;
|
||||
};
|
||||
virtualization = {
|
||||
waydroid.enable = true;
|
||||
};
|
||||
virtualization = { waydroid.enable = true; };
|
||||
};
|
||||
|
||||
# Enable CUPS to print documents.
|
||||
# services.printing.enable = true;
|
||||
|
||||
services.xserver.videoDrivers = ["nvidia"];
|
||||
services.xserver.videoDrivers = [ "nvidia" ];
|
||||
|
||||
# homelab
|
||||
sops = {
|
||||
# we need to setup wireguard with this soon
|
||||
age.sshKeyPaths = ["/home/sako/.ssh/id_ed25519"];
|
||||
};
|
||||
|
||||
networking.wireguard.interfaces = {
|
||||
};
|
||||
networking.wireguard.interfaces = { };
|
||||
|
||||
services.logind.extraConfig = ''
|
||||
# don’t shutdown when power button is short-pressed
|
||||
|
@ -168,6 +153,10 @@
|
|||
# set laptop dpi
|
||||
services.xserver.dpi = 100;
|
||||
|
||||
age.identityPaths = [ "/home/sako/.ssh/id_ed25519" ];
|
||||
|
||||
age.secrets.test.file = ../../secrets/test.age;
|
||||
|
||||
# Enable the OpenSSH daemon.
|
||||
# services.openssh.enable = true;
|
||||
|
||||
|
|
|
@ -1,12 +1,4 @@
|
|||
{
|
||||
lib,
|
||||
pkgs,
|
||||
config,
|
||||
modulesPath,
|
||||
inputs,
|
||||
outputs,
|
||||
...
|
||||
}: {
|
||||
{ lib, pkgs, config, modulesPath, inputs, outputs, ... }: {
|
||||
imports = [
|
||||
inputs.home-manager.nixosModules.default
|
||||
"${modulesPath}/profiles/minimal.nix"
|
||||
|
@ -49,38 +41,31 @@
|
|||
nix.extraOptions = ''
|
||||
experimental-features = nix-command flakes
|
||||
'';
|
||||
# nix.settings.experimental-features = ["nix-command" "flakes"];
|
||||
# nix.settings.experimental-features = ["nix-command" "flakes"];
|
||||
nix.settings = {
|
||||
experimental-features = ["nix-command" "flakes"];
|
||||
substituters = [
|
||||
"https://cache.garnix.io"
|
||||
"https://nix-community.cachix.org"
|
||||
];
|
||||
experimental-features = [ "nix-command" "flakes" ];
|
||||
substituters =
|
||||
[ "https://cache.garnix.io" "https://nix-community.cachix.org" ];
|
||||
trusted-public-keys = [
|
||||
"cache.garnix.io:CTFPyKSLcx5RMJKfLo5EEPUObbA78b0YQ2DTCJXqr9g="
|
||||
"nix-community.cachix.org-1:mB9FSh9qf2dCimDSUo8Zy7bkq5CX+/rkCWyvRCYg3Fs="
|
||||
];
|
||||
};
|
||||
|
||||
|
||||
# Home manager setup
|
||||
home-manager.useUserPackages = true;
|
||||
home-manager.users.sako = {pkgs, ...}: {
|
||||
home-manager.users.sako = { pkgs, ... }: {
|
||||
home.stateVersion = "22.05";
|
||||
home.packages = [];
|
||||
home.packages = [ ];
|
||||
home.username = "sako";
|
||||
home.homeDirectory = "/home/sako";
|
||||
xdg.configFile.git = {
|
||||
source = ../../config/git;
|
||||
};
|
||||
xdg.configFile.git = { source = ../../config/git; };
|
||||
|
||||
# cure my sanity
|
||||
home.pointerCursor = {
|
||||
name = "Catppuccin-Mocha-Dark";
|
||||
size = 16;
|
||||
x11 = {
|
||||
enable = true;
|
||||
};
|
||||
x11 = { enable = true; };
|
||||
gtk.enable = true;
|
||||
package = pkgs.catppuccin-cursors.mochaDark;
|
||||
};
|
||||
|
@ -106,7 +91,7 @@
|
|||
# bare minimum
|
||||
environment.systemPackages = with pkgs; [
|
||||
vim # backup
|
||||
wget #double u get
|
||||
wget # double u get
|
||||
killall # die processes
|
||||
unzip # zip file
|
||||
gh # github
|
||||
|
@ -115,8 +100,6 @@
|
|||
wsl-open # wsl-open
|
||||
];
|
||||
|
||||
environment.noXlibs = lib.mkForce false;
|
||||
|
||||
programs.git = {
|
||||
enable = true;
|
||||
package = pkgs.gitFull;
|
||||
|
@ -128,9 +111,7 @@
|
|||
nextcloud.enable = true;
|
||||
pass.enable = true;
|
||||
};
|
||||
chat = {
|
||||
weechat.enable = true;
|
||||
};
|
||||
chat = { weechat.enable = true; };
|
||||
};
|
||||
dev = {
|
||||
editors = {
|
||||
|
@ -157,17 +138,13 @@
|
|||
search.enable = true;
|
||||
};
|
||||
};
|
||||
security = {
|
||||
certs.enable = true;
|
||||
};
|
||||
security = { certs.enable = true; };
|
||||
};
|
||||
|
||||
services.gnome.gnome-keyring.enable = true;
|
||||
|
||||
# for wsl-open
|
||||
environment.sessionVariables = rec {
|
||||
BROWSER = "wsl-open";
|
||||
};
|
||||
environment.sessionVariables = rec { BROWSER = "wsl-open"; };
|
||||
|
||||
security.sudo.wheelNeedsPassword = true;
|
||||
|
||||
|
|
|
@ -1,11 +1,5 @@
|
|||
{
|
||||
options,
|
||||
config,
|
||||
lib,
|
||||
pkgs,
|
||||
...
|
||||
}: let
|
||||
cfg = config.modules.desktop.browsers.firefox;
|
||||
{ options, config, lib, pkgs, ... }:
|
||||
let cfg = config.modules.desktop.browsers.firefox;
|
||||
in {
|
||||
options.modules.desktop.browsers.firefox = {
|
||||
enable = lib.mkEnableOption false;
|
||||
|
@ -34,38 +28,63 @@ in {
|
|||
# userChrome = ''
|
||||
# '';
|
||||
|
||||
search.default = "DuckDuckGo";
|
||||
# search.default = "DuckDuckGo";
|
||||
search.default = "sakosearch";
|
||||
search.force = true;
|
||||
search.engines = {
|
||||
"Nix Packages" = {
|
||||
urls = [
|
||||
{
|
||||
template = "https://search.nixos.org/packages?channel=unstable";
|
||||
params = [
|
||||
{
|
||||
urls = [{
|
||||
template =
|
||||
"https://search.nixos.org/packages?channel=unstable";
|
||||
params = [{
|
||||
name = "query";
|
||||
value = "{searchTerms}";
|
||||
}
|
||||
];
|
||||
}
|
||||
];
|
||||
icon = "${pkgs.nixos-icons}/share/icons/hicolor/scalable/apps/nix-snowflake.svg";
|
||||
definedAliases = ["@nixpkgs"];
|
||||
}];
|
||||
}];
|
||||
icon =
|
||||
"${pkgs.nixos-icons}/share/icons/hicolor/scalable/apps/nix-snowflake.svg";
|
||||
definedAliases = [ "@nixpkgs" ];
|
||||
};
|
||||
"Nix Options" = {
|
||||
definedAliases = ["@nixopts"];
|
||||
icon = "${pkgs.nixos-icons}/share/icons/hicolor/scalable/apps/nix-snowflake.svg";
|
||||
urls = [
|
||||
{
|
||||
template = "https://search.nixos.org/options?channel=unstable";
|
||||
params = [
|
||||
{
|
||||
definedAliases = [ "@nixopts" ];
|
||||
icon =
|
||||
"${pkgs.nixos-icons}/share/icons/hicolor/scalable/apps/nix-snowflake.svg";
|
||||
urls = [{
|
||||
template =
|
||||
"https://search.nixos.org/options?channel=unstable";
|
||||
params = [{
|
||||
name = "query";
|
||||
value = "{searchTerms}";
|
||||
}
|
||||
];
|
||||
}
|
||||
];
|
||||
}];
|
||||
}];
|
||||
};
|
||||
"Home Manager Options" = {
|
||||
definedAliases = [ "@homemgropts" ];
|
||||
icon =
|
||||
"${pkgs.nixos-icons}/share/icons/hicolor/scalable/apps/nix-snowflake.svg";
|
||||
urls = [{
|
||||
template =
|
||||
"https://home-manager-options.extranix.com/?release=master";
|
||||
params = [{
|
||||
name = "query";
|
||||
value = "{searchTerms}";
|
||||
}];
|
||||
}];
|
||||
};
|
||||
"sakosearch" = {
|
||||
definedAliases = [ "@sakosearch" ];
|
||||
icon = pkgs.fetchurl {
|
||||
url =
|
||||
"https://raw.githubusercontent.com/searxng/searxng/refs/heads/master/src/brand/searxng-wordmark.svg";
|
||||
hash = "sha256-TwwPUNL+IRRjLY7Xmd466F474vglkvpJUYa+fBwDzFI=";
|
||||
};
|
||||
urls = [{
|
||||
template = "https://search.sako.box/search";
|
||||
params = [{
|
||||
name = "q";
|
||||
value = "{searchTerms}";
|
||||
}];
|
||||
}];
|
||||
};
|
||||
};
|
||||
};
|
||||
|
|
|
@ -8,5 +8,8 @@
|
|||
./signal
|
||||
./cinny
|
||||
./element
|
||||
./gajim
|
||||
./pidgin
|
||||
./psiplus
|
||||
];
|
||||
}
|
||||
|
|
10
modules/desktop/chat/gajim/default.nix
Normal file
10
modules/desktop/chat/gajim/default.nix
Normal file
|
@ -0,0 +1,10 @@
|
|||
{ outputs, options, config, lib, pkgs, ... }:
|
||||
let cfg = config.modules.desktop.chat.gajim;
|
||||
in {
|
||||
options.modules.desktop.chat.gajim = { enable = lib.mkEnableOption false; };
|
||||
|
||||
config = lib.mkIf cfg.enable {
|
||||
users.users.sako.packages = with pkgs; [ gajim ];
|
||||
|
||||
};
|
||||
}
|
15
modules/desktop/chat/pidgin/default.nix
Normal file
15
modules/desktop/chat/pidgin/default.nix
Normal file
|
@ -0,0 +1,15 @@
|
|||
{ outputs, options, config, lib, pkgs, ... }:
|
||||
let cfg = config.modules.desktop.chat.pidgin;
|
||||
in {
|
||||
options.modules.desktop.chat.pidgin = { enable = lib.mkEnableOption false; };
|
||||
|
||||
config = lib.mkIf cfg.enable {
|
||||
users.users.sako.packages = with pkgs;
|
||||
[
|
||||
(pidgin.override {
|
||||
plugins =
|
||||
[ pidginPackages.pidgin-otr pidginPackages.pidgin-indicator ];
|
||||
})
|
||||
];
|
||||
};
|
||||
}
|
12
modules/desktop/chat/psiplus/default.nix
Normal file
12
modules/desktop/chat/psiplus/default.nix
Normal file
|
@ -0,0 +1,12 @@
|
|||
{ outputs, options, config, lib, pkgs, ... }:
|
||||
let cfg = config.modules.desktop.chat.psi-plus;
|
||||
in {
|
||||
options.modules.desktop.chat.psi-plus = {
|
||||
enable = lib.mkEnableOption false;
|
||||
};
|
||||
|
||||
config = lib.mkIf cfg.enable {
|
||||
users.users.sako.packages = with pkgs; [ psi-plus ];
|
||||
|
||||
};
|
||||
}
|
|
@ -3,10 +3,8 @@
|
|||
# window managers
|
||||
./awesome
|
||||
./bspwm
|
||||
./dwm
|
||||
./hyprland
|
||||
./xmonad
|
||||
./qtile
|
||||
./exwm
|
||||
./i3
|
||||
# desktop environ men t s s s s
|
||||
|
|
|
@ -1,110 +0,0 @@
|
|||
{
|
||||
outputs,
|
||||
options,
|
||||
config,
|
||||
lib,
|
||||
pkgs,
|
||||
...
|
||||
}:
|
||||
let
|
||||
cfg = config.modules.desktop.dwm;
|
||||
in {
|
||||
options.modules.desktop.dwm = {
|
||||
enable = lib.mkEnableOption false;
|
||||
};
|
||||
|
||||
config = lib.mkIf cfg.enable {
|
||||
# this needs to be enabled for gtk apps
|
||||
programs.dconf.enable = true;
|
||||
# enable dwm
|
||||
services.displayManager.defaultSession = "none+dwm";
|
||||
|
||||
services.xserver = {
|
||||
enable = true;
|
||||
windowManager = {
|
||||
dwm.enable = true;
|
||||
};
|
||||
displayManager = {
|
||||
lightdm = {
|
||||
enable = true;
|
||||
background = ../../../config/background.png;
|
||||
greeters.gtk = {
|
||||
enable = true;
|
||||
theme = {
|
||||
name = "vimix-dark-ruby";
|
||||
package = pkgs.vimix-gtk-themes;
|
||||
};
|
||||
cursorTheme = {
|
||||
name = "Catppuccin-Mocha-Dark";
|
||||
size = 16;
|
||||
package = pkgs.catppuccin-cursors.mochaDark;
|
||||
};
|
||||
};
|
||||
# greeters.mini = {
|
||||
# enable = true;
|
||||
# user = "sako";
|
||||
# extraConfig = ''
|
||||
# [greeter]
|
||||
# show-password-label = true
|
||||
# password-label-text = magic word
|
||||
# invalid-password-text = skull issue
|
||||
# '';
|
||||
# };
|
||||
};
|
||||
};
|
||||
};
|
||||
|
||||
services.libinput = {
|
||||
mouse = {
|
||||
accelProfile = "flat";
|
||||
};
|
||||
|
||||
touchpad = {
|
||||
accelProfile = "flat";
|
||||
};
|
||||
};
|
||||
users.users.sako.packages = with pkgs; [
|
||||
rofi
|
||||
# network
|
||||
networkmanagerapplet
|
||||
# brightness
|
||||
brightnessctl
|
||||
# gee tee k
|
||||
vimix-gtk-themes
|
||||
vimix-icon-theme
|
||||
lxappearance
|
||||
catppuccin-cursors.mochaDark
|
||||
# screen shot (s)
|
||||
flameshot
|
||||
# clipboard
|
||||
xclip
|
||||
];
|
||||
home-manager.users.sako = {pkgs, ...}: {
|
||||
home.file = {
|
||||
"background.png" = {
|
||||
enable = true;
|
||||
source = ../../../config/background.png;
|
||||
};
|
||||
".dwmscripts" = {
|
||||
enable = true;
|
||||
recursive = true;
|
||||
source = ../../../config/dwmbar;
|
||||
};
|
||||
};
|
||||
home.pointerCursor = {
|
||||
name = "Catppuccin-Mocha-Dark";
|
||||
size = 16;
|
||||
x11 = {
|
||||
enable = true;
|
||||
};
|
||||
gtk.enable = true;
|
||||
package = pkgs.catppuccin-cursors.mochaDark;
|
||||
};
|
||||
gtk = {
|
||||
enable = true;
|
||||
theme.name = "vimix-dark-ruby";
|
||||
iconTheme.name = "Vimix Ruby Dark";
|
||||
};
|
||||
};
|
||||
};
|
||||
}
|
|
@ -1,21 +1,53 @@
|
|||
{ options, config, lib, pkgs, ...}:
|
||||
let
|
||||
cfg = config.modules.desktop.foot;
|
||||
{ options, config, lib, pkgs, ... }:
|
||||
let cfg = config.modules.desktop.foot;
|
||||
in {
|
||||
options.modules.desktop.foot = {
|
||||
enable = lib.mkEnableOption false;
|
||||
};
|
||||
options.modules.desktop.foot = { enable = lib.mkEnableOption false; };
|
||||
|
||||
config = lib.mkIf cfg.enable {
|
||||
|
||||
users.users.sako.packages = with pkgs; [
|
||||
foot
|
||||
];
|
||||
users.users.sako.packages = with pkgs; [ foot ];
|
||||
|
||||
home-manager.users.sako = {pkgs, ...}: {
|
||||
xdg.configFile = {
|
||||
foot = {
|
||||
source = ../../../config/foot;
|
||||
home-manager.users.sako = { pkgs, ... }: {
|
||||
programs.foot = {
|
||||
enable = true;
|
||||
server.enable = false;
|
||||
settings = {
|
||||
main = {
|
||||
term = "xterm-256color";
|
||||
font = "JetBrainsMono NF:size=12";
|
||||
};
|
||||
scrollback = { lines = 1000; };
|
||||
cursor = {
|
||||
style = "block";
|
||||
blink = "yes";
|
||||
blink-rate = "1000";
|
||||
};
|
||||
mouse = { hide-when-typing = "yes"; };
|
||||
colors = {
|
||||
alpha = "1.0";
|
||||
background = "010000";
|
||||
foreground = "bfbfbf";
|
||||
|
||||
# Normal/Regular colors (0-7)
|
||||
regular0 = "010000";
|
||||
regular1 = "67514A";
|
||||
regular2 = "6A5D4E";
|
||||
regular3 = "9B686A";
|
||||
regular4 = "9F8975";
|
||||
regular5 = "BD7D81";
|
||||
regular6 = "D07789";
|
||||
regular7 = "bfbfbf";
|
||||
|
||||
# Bright colors (8-15)
|
||||
bright0 = "615050";
|
||||
bright1 = "67514A";
|
||||
bright2 = "6A5D4E";
|
||||
bright3 = "9B686A";
|
||||
bright4 = "9F8975";
|
||||
bright5 = "BD7D81";
|
||||
bright6 = "D07788";
|
||||
bright7 = "bfbfbf";
|
||||
};
|
||||
};
|
||||
};
|
||||
};
|
||||
|
|
|
@ -1,10 +1,4 @@
|
|||
{
|
||||
imports = [
|
||||
./steam
|
||||
./lutris
|
||||
./wine
|
||||
./grapejuice
|
||||
./tetrio
|
||||
./prismlauncher
|
||||
];
|
||||
imports =
|
||||
[ ./steam ./lutris ./wine ./grapejuice ./tetrio ./prismlauncher ./osu ];
|
||||
}
|
||||
|
|
9
modules/desktop/game/osu/default.nix
Normal file
9
modules/desktop/game/osu/default.nix
Normal file
|
@ -0,0 +1,9 @@
|
|||
{ outputs, options, config, lib, pkgs, ... }:
|
||||
let cfg = config.modules.desktop.game.osu;
|
||||
in {
|
||||
options.modules.desktop.game.osu = { enable = lib.mkEnableOption false; };
|
||||
|
||||
config = lib.mkIf cfg.enable {
|
||||
users.users.sako.packages = with pkgs; [ osu-lazer-bin ];
|
||||
};
|
||||
}
|
|
@ -15,9 +15,10 @@ in {
|
|||
|
||||
config = lib.mkIf cfg.enable {
|
||||
users.users.sako.packages = with pkgs; [
|
||||
(tetrio-desktop.override {
|
||||
withTetrioPlus = true;
|
||||
})
|
||||
# (tetrio-desktop.override {
|
||||
# withTetrioPlus = true;
|
||||
# })
|
||||
tetrio-desktop
|
||||
];
|
||||
};
|
||||
}
|
||||
|
|
|
@ -1,15 +1,9 @@
|
|||
{ inputs, outputs, options, config, lib, pkgs, ...}:
|
||||
let
|
||||
cfg = config.modules.desktop.hyprland;
|
||||
in
|
||||
{
|
||||
imports = [
|
||||
inputs.hyprland.nixosModules.default
|
||||
];
|
||||
{ inputs, outputs, options, config, lib, pkgs, ... }:
|
||||
let cfg = config.modules.desktop.hyprland;
|
||||
in {
|
||||
imports = [ inputs.hyprland.nixosModules.default ];
|
||||
|
||||
options.modules.desktop.hyprland = {
|
||||
enable = lib.mkEnableOption false;
|
||||
};
|
||||
options.modules.desktop.hyprland = { enable = lib.mkEnableOption false; };
|
||||
|
||||
config = lib.mkIf cfg.enable {
|
||||
|
||||
|
@ -20,11 +14,10 @@ in
|
|||
services.greetd = {
|
||||
enable = true;
|
||||
settings = {
|
||||
terminal = {
|
||||
vt = 2;
|
||||
};
|
||||
terminal = { vt = 2; };
|
||||
default_session = {
|
||||
command = "${pkgs.greetd.tuigreet}/bin/tuigreet --time --time-format '%I:%M %p | %a • %h | %F' --cmd Hyprland";
|
||||
command =
|
||||
"${pkgs.greetd.tuigreet}/bin/tuigreet --time --time-format '%I:%M %p | %a • %h | %F' --cmd Hyprland";
|
||||
user = "greeter";
|
||||
};
|
||||
};
|
||||
|
@ -46,17 +39,17 @@ in
|
|||
services.xserver = {
|
||||
enable = true;
|
||||
# displayManager = {
|
||||
# # lightdm = {
|
||||
# # enable = true;
|
||||
# # background = ../../../config/background.png;
|
||||
# # greeters.gtk = {
|
||||
# # enable = true;
|
||||
# # theme = {
|
||||
# # name = "vimix-dark-ruby";
|
||||
# # package = pkgs.vimix-gtk-themes;
|
||||
# # };
|
||||
# # };
|
||||
# # };
|
||||
# # lightdm = {
|
||||
# # enable = true;
|
||||
# # background = ../../../config/background.png;
|
||||
# # greeters.gtk = {
|
||||
# # enable = true;
|
||||
# # theme = {
|
||||
# # name = "vimix-dark-ruby";
|
||||
# # package = pkgs.vimix-gtk-themes;
|
||||
# # };
|
||||
# # };
|
||||
# # };
|
||||
# gdm = {
|
||||
# enable = true;
|
||||
# };
|
||||
|
@ -66,14 +59,10 @@ in
|
|||
enable = true;
|
||||
|
||||
# no mouse accel
|
||||
mouse = {
|
||||
accelProfile = "flat";
|
||||
};
|
||||
mouse = { accelProfile = "flat"; };
|
||||
|
||||
# no touchpad accel
|
||||
touchpad = {
|
||||
accelProfile = "flat";
|
||||
};
|
||||
touchpad = { accelProfile = "flat"; };
|
||||
};
|
||||
|
||||
users.users.sako.packages = with pkgs; [
|
||||
|
@ -114,9 +103,7 @@ in
|
|||
wl-clipboard
|
||||
];
|
||||
|
||||
programs.hyprland = {
|
||||
enable = true;
|
||||
};
|
||||
programs.hyprland = { enable = true; };
|
||||
|
||||
programs.hyprlock.enable = true;
|
||||
|
||||
|
@ -126,7 +113,7 @@ in
|
|||
# piece of shit thanks!
|
||||
services.emacs.startWithGraphical = false;
|
||||
|
||||
home-manager.users.sako = { pkgs , ...}: {
|
||||
home-manager.users.sako = { pkgs, ... }: {
|
||||
home.pointerCursor = {
|
||||
# name = "Catppuccin-Mocha-Dark";
|
||||
name = "catppuccin-mocha-dark-cursors";
|
||||
|
@ -136,8 +123,8 @@ in
|
|||
};
|
||||
gtk = {
|
||||
enable = true;
|
||||
theme.name = "Fluent-red-Dark";
|
||||
iconTheme.name = "Fluent-red-dark";
|
||||
theme.name = "Fluent-pink-Dark";
|
||||
iconTheme.name = "Fluent-pink-dark";
|
||||
};
|
||||
home.file = {
|
||||
"background.png" = {
|
||||
|
@ -148,7 +135,8 @@ in
|
|||
# thanks PartyWumpus
|
||||
# https://github.com/PartyWumpus/dotfiles/blob/277949d84d53a58a3f52be935cd3c581c89d5d7c/modules/hyprland/hyprland.nix#L492
|
||||
"/nixos/config/ags/types" = {
|
||||
source = "${inputs.ags.packages.x86_64-linux.agsWithTypes.out}/share/com.github.Aylur.ags/types";
|
||||
source =
|
||||
"${inputs.ags.packages.x86_64-linux.agsWithTypes.out}/share/com.github.Aylur.ags/types";
|
||||
};
|
||||
};
|
||||
xdg.configFile = {
|
||||
|
|
15
modules/desktop/media/ardour/default.nix
Normal file
15
modules/desktop/media/ardour/default.nix
Normal file
|
@ -0,0 +1,15 @@
|
|||
{ outputs, options, config, lib, pkgs, ...}:
|
||||
let
|
||||
cfg = config.modules.desktop.media.ardour;
|
||||
in
|
||||
{
|
||||
options.modules.desktop.media.ardour = {
|
||||
enable = lib.mkEnableOption false;
|
||||
};
|
||||
|
||||
config = lib.mkIf cfg.enable {
|
||||
users.users.sako.packages = with pkgs; [
|
||||
ardour
|
||||
];
|
||||
};
|
||||
}
|
|
@ -6,6 +6,7 @@
|
|||
./blender
|
||||
./kdenlive
|
||||
./lmms
|
||||
./ardour
|
||||
./mpv
|
||||
./jellyfin
|
||||
./feishin
|
||||
|
|
|
@ -1,97 +0,0 @@
|
|||
{
|
||||
outputs,
|
||||
options,
|
||||
config,
|
||||
lib,
|
||||
pkgs,
|
||||
...
|
||||
}:
|
||||
let
|
||||
cfg = config.modules.desktop.qtile;
|
||||
in {
|
||||
options.modules.desktop.qtile = {
|
||||
enable = lib.mkEnableOption false;
|
||||
};
|
||||
|
||||
#TODO Do this
|
||||
|
||||
config = lib.mkIf cfg.enable {
|
||||
services.xserver = {
|
||||
enable = true;
|
||||
windowManager.qtile = {
|
||||
enable = true;
|
||||
};
|
||||
displayManager = {
|
||||
defaultSession = "none+qtile";
|
||||
lightdm = {
|
||||
enable = true;
|
||||
background = ../../../config/background.png;
|
||||
greeters.gtk = {
|
||||
enable = true;
|
||||
theme = {
|
||||
name = "vimix-dark-ruby";
|
||||
package = pkgs.vimix-gtk-themes;
|
||||
};
|
||||
};
|
||||
};
|
||||
};
|
||||
libinput = {
|
||||
enable = true;
|
||||
|
||||
# no mouse accel
|
||||
mouse = {
|
||||
accelProfile = "flat";
|
||||
};
|
||||
|
||||
# no touchpad accel
|
||||
touchpad = {
|
||||
accelProfile = "flat";
|
||||
};
|
||||
};
|
||||
};
|
||||
users.users.sako.packages = with pkgs; [
|
||||
rofi
|
||||
# network
|
||||
networkmanagerapplet
|
||||
# brightness
|
||||
brightnessctl
|
||||
# gee tee k
|
||||
vimix-gtk-themes
|
||||
vimix-icon-theme
|
||||
lxappearance
|
||||
catppuccin-cursors.mochaDark
|
||||
# screen shot (s)
|
||||
flameshot
|
||||
];
|
||||
|
||||
home-manager.users.sako = {pkgs, ...}: {
|
||||
home.pointerCursor = {
|
||||
name = "Catppuccin-Mocha-Dark";
|
||||
size = 16;
|
||||
x11 = {
|
||||
enable = true;
|
||||
};
|
||||
gtk.enable = true;
|
||||
package = pkgs.catppuccin-cursors.mochaDark;
|
||||
};
|
||||
gtk = {
|
||||
enable = true;
|
||||
theme.name = "vimix-dark-ruby";
|
||||
iconTheme.name = "Vimix Ruby Dark";
|
||||
};
|
||||
home.file = {
|
||||
"background.png" = {
|
||||
enable = true;
|
||||
source = ../../../config/background.png;
|
||||
};
|
||||
};
|
||||
#xdg.configFile = {
|
||||
# qtile = {
|
||||
# enable = true;
|
||||
# source = ../../../config/qtile;
|
||||
# recursive = true;
|
||||
# };
|
||||
#};
|
||||
};
|
||||
};
|
||||
}
|
|
@ -16,5 +16,10 @@ in {
|
|||
config = lib.mkIf cfg.enable {
|
||||
# todo declaritivly setting it up
|
||||
networking.wireguard.enable = true;
|
||||
|
||||
users.users.sako.packages = with pkgs; [
|
||||
openresolv
|
||||
];
|
||||
|
||||
};
|
||||
}
|
||||
|
|
|
@ -1,15 +1,15 @@
|
|||
{
|
||||
outputs,
|
||||
options,
|
||||
config,
|
||||
lib,
|
||||
pkgs,
|
||||
inputs,
|
||||
...
|
||||
}:
|
||||
{ outputs, options, config, lib, pkgs, inputs, ... }:
|
||||
let
|
||||
cfg = config.modules.dev.editors.emacs;
|
||||
|
||||
inherit (lib) mkForce;
|
||||
|
||||
# so we dont cry later on why texLive is MASSIVE
|
||||
tex = (pkgs.texlive.combine {
|
||||
inherit (pkgs.texlive)
|
||||
scheme-basic dvisvgm dvipng # for preview and export as html
|
||||
wrapfig amsmath ulem hyperref capt-of fontspec inputenx graphics etoolbox;
|
||||
});
|
||||
|
||||
myEmacs = pkgs.emacsWithPackagesFromUsePackage {
|
||||
config = ../../../../config/emacs/emacs.org;
|
||||
|
@ -21,12 +21,13 @@ let
|
|||
epkgs.mu4e
|
||||
# TODO make this check if EXWM is enabled or not
|
||||
epkgs.exwm
|
||||
# epkgs.sakomodules
|
||||
# epkgs.sakomodules
|
||||
epkgs.eglot-booster
|
||||
epkgs.app-launcher
|
||||
];
|
||||
# add eglot-lsp-booster package
|
||||
override = epkgs: epkgs // {
|
||||
override = epkgs:
|
||||
epkgs // {
|
||||
eglot-booster = epkgs.trivialBuild {
|
||||
pname = "eglot-booster";
|
||||
version = "e19dd7ea81bada84c66e8bdd121408d9c0761fe6";
|
||||
|
@ -44,7 +45,6 @@ let
|
|||
pname = "app-launcher";
|
||||
version = "1.0";
|
||||
|
||||
|
||||
commit = "d5015e394b0a666a8c7c4d4bdf786266e773b145";
|
||||
|
||||
recipe = pkgs.writeText "recipe" ''
|
||||
|
@ -60,15 +60,15 @@ let
|
|||
};
|
||||
};
|
||||
# override for modules
|
||||
# override = epkgs: epkgs // {
|
||||
# sakomodules = epkgs.trivialBuild {
|
||||
# pname = "sakomodules";
|
||||
# version = "lol";
|
||||
# override = epkgs: epkgs // {
|
||||
# sakomodules = epkgs.trivialBuild {
|
||||
# pname = "sakomodules";
|
||||
# version = "lol";
|
||||
|
||||
# src = ../../../../config/emacs/modules;
|
||||
# src = ../../../../config/emacs/modules;
|
||||
|
||||
# };
|
||||
# };
|
||||
# };
|
||||
# };
|
||||
};
|
||||
in {
|
||||
options.modules.dev.editors.emacs = {
|
||||
|
@ -82,9 +82,7 @@ in {
|
|||
};
|
||||
|
||||
config = lib.mkIf cfg.enable {
|
||||
nixpkgs.overlays = [
|
||||
inputs.emacs-overlay.overlay
|
||||
];
|
||||
nixpkgs.overlays = [ inputs.emacs-overlay.overlay ];
|
||||
# ues daemon
|
||||
services.emacs = {
|
||||
enable = cfg.daemon;
|
||||
|
@ -107,18 +105,27 @@ in {
|
|||
direnv
|
||||
# mu for email
|
||||
mu
|
||||
# sync
|
||||
isync
|
||||
cyrus-sasl-xoauth2
|
||||
# email sync
|
||||
offlineimap
|
||||
(isync.override { withCyrusSaslXoauth2 = true; })
|
||||
# oauth
|
||||
oama
|
||||
# protonmail
|
||||
hydroxide
|
||||
# send mail
|
||||
msmtp
|
||||
# doc-view
|
||||
unoconv
|
||||
# org to pdf
|
||||
# this might be bloat...
|
||||
texliveMinimal
|
||||
tex
|
||||
# lsp
|
||||
emacs-lsp-booster
|
||||
# zenity-color-picker
|
||||
zenity
|
||||
# org-wild-notifier
|
||||
libnotify
|
||||
# wakatime-mode
|
||||
wakatime-cli
|
||||
];
|
||||
|
||||
systemd.services.hydroxide = {
|
||||
|
@ -140,20 +147,24 @@ in {
|
|||
# };
|
||||
# };
|
||||
|
||||
home-manager.users.sako = {lib, ...}: {
|
||||
home-manager.users.sako = { lib, ... }: {
|
||||
home.file = {
|
||||
".emacs.d/init.el".source = pkgs.runCommand "init.el" {} ''
|
||||
".emacs.d/init.el".source = pkgs.runCommand "init.el" { } ''
|
||||
cp ${../../../../config/emacs/emacs.org} emacs.org
|
||||
${pkgs.emacs}/bin/emacs -Q --batch ./emacs.org -f org-babel-tangle
|
||||
${myEmacs}/bin/emacs -Q --batch ./emacs.org -f org-babel-tangle
|
||||
mv init.el $out
|
||||
'';
|
||||
".emacs.d/icon.png".source = ../../../../config/emacs/icon.png;
|
||||
".mbsyncrc".source = ../../../../config/emacs/.mbsyncrc;
|
||||
# ".mbsyncrc".source = ../../../../config/emacs/.mbsyncrc;
|
||||
".offlineimaprc".source = ../../../../config/emacs/.offlineimaprc;
|
||||
".offlineimap.py".source = ../../../../config/emacs/.offlineimap.py;
|
||||
};
|
||||
};
|
||||
|
||||
programs.gnupg.agent.pinentryPackage = mkForce pkgs.pinentry-emacs;
|
||||
|
||||
fonts.packages = with pkgs; [
|
||||
(nerdfonts.override {fonts = ["JetBrainsMono"];})
|
||||
(nerdfonts.override { fonts = [ "JetBrainsMono" ]; })
|
||||
jetbrains-mono
|
||||
];
|
||||
};
|
||||
|
|
|
@ -11,6 +11,7 @@ in
|
|||
environment.systemPackages = with pkgs; [
|
||||
nil
|
||||
alejandra
|
||||
nixfmt
|
||||
];
|
||||
};
|
||||
}
|
||||
|
|
|
@ -1,26 +1,13 @@
|
|||
# nixd nix lsp using nix and nixpkgs
|
||||
# where has this been my whole life
|
||||
{
|
||||
outputs,
|
||||
options,
|
||||
config,
|
||||
lib,
|
||||
pkgs,
|
||||
...
|
||||
}:
|
||||
let
|
||||
cfg = config.modules.dev.nixd;
|
||||
{ outputs, options, config, lib, pkgs, ... }:
|
||||
let cfg = config.modules.dev.nixd;
|
||||
in {
|
||||
options.modules.dev.nixd = {
|
||||
enable = lib.mkEnableOption false;
|
||||
};
|
||||
options.modules.dev.nixd = { enable = lib.mkEnableOption false; };
|
||||
|
||||
# TODO(sako):: figure out how .nixd.json works
|
||||
|
||||
config = lib.mkIf cfg.enable {
|
||||
environment.systemPackages = with pkgs; [
|
||||
unstable.nixd
|
||||
alejandra
|
||||
];
|
||||
environment.systemPackages = with pkgs; [ nixd alejandra nixfmt ];
|
||||
};
|
||||
}
|
||||
|
|
|
@ -1,11 +1,7 @@
|
|||
{ outputs, options, config, lib, pkgs, ...}:
|
||||
let
|
||||
cfg = config.modules.hardware.pipewire;
|
||||
in
|
||||
{
|
||||
options.modules.hardware.pipewire = {
|
||||
enable = lib.mkEnableOption false;
|
||||
};
|
||||
{ outputs, options, config, lib, pkgs, ... }:
|
||||
let cfg = config.modules.hardware.pipewire;
|
||||
in {
|
||||
options.modules.hardware.pipewire = { enable = lib.mkEnableOption false; };
|
||||
|
||||
config = lib.mkIf cfg.enable {
|
||||
# resolve racial conflict between
|
||||
|
@ -23,9 +19,13 @@ in
|
|||
enable = true;
|
||||
alsa.enable = true;
|
||||
alsa.support32Bit = true;
|
||||
jack.enable = true;
|
||||
pulse.enable = true;
|
||||
};
|
||||
|
||||
# unsupported apps that use these
|
||||
environment.systemPackages = with pkgs; [ pulseaudio alsa-utils pamixer ];
|
||||
|
||||
};
|
||||
}
|
||||
|
||||
|
|
|
@ -1,7 +1 @@
|
|||
{
|
||||
imports = [
|
||||
./age.nix
|
||||
./sops.nix
|
||||
./certs
|
||||
];
|
||||
}
|
||||
{ imports = [ ./age.nix ./certs ./tor.nix ]; }
|
||||
|
|
|
@ -1,21 +0,0 @@
|
|||
{
|
||||
outputs,
|
||||
options,
|
||||
config,
|
||||
lib,
|
||||
pkgs,
|
||||
...
|
||||
}:
|
||||
let
|
||||
cfg = config.modules.security.age;
|
||||
in {
|
||||
options.modules.security.sops = {
|
||||
enable = lib.mkEnableOption false;
|
||||
};
|
||||
|
||||
config = lib.mkIf cfg.enable {
|
||||
environment.systemPackages = with pkgs; [
|
||||
sops
|
||||
];
|
||||
};
|
||||
}
|
25
modules/security/tor.nix
Normal file
25
modules/security/tor.nix
Normal file
|
@ -0,0 +1,25 @@
|
|||
{ outputs, options, config, lib, pkgs, ... }:
|
||||
let cfg = config.modules.security.tor;
|
||||
in {
|
||||
options.modules.security.tor = { enable = lib.mkEnableOption false; };
|
||||
|
||||
config = lib.mkIf cfg.enable {
|
||||
|
||||
age.secrets.torrc = {
|
||||
file = ../../secrets/shared/torrc.age;
|
||||
owner = "tor";
|
||||
group = "tor";
|
||||
};
|
||||
|
||||
users.users.sako.packages = with pkgs; [ tor-browser ];
|
||||
|
||||
services.tor = {
|
||||
enable = true;
|
||||
torsocks.enable = true;
|
||||
client = { enable = true; };
|
||||
};
|
||||
|
||||
environment.etc = { "tor/torrc".source = config.age.secrets.torrc.path; };
|
||||
|
||||
};
|
||||
}
|
|
@ -1,17 +1,10 @@
|
|||
{
|
||||
config,
|
||||
lib,
|
||||
...
|
||||
}:
|
||||
with lib; let
|
||||
cfg = config.modules.server;
|
||||
{ config, lib, ... }:
|
||||
with lib;
|
||||
let cfg = config.modules.server;
|
||||
in {
|
||||
imports = [
|
||||
];
|
||||
imports = [ ];
|
||||
|
||||
options.modules.server = {
|
||||
isServer = mkEnableOption false;
|
||||
};
|
||||
options.modules.server = { isServer = mkEnableOption false; };
|
||||
|
||||
config = mkIf cfg.isServer {
|
||||
# we need this if you say otherwise ill throw you
|
||||
|
@ -23,11 +16,13 @@ in {
|
|||
PermitRootLogin = "no";
|
||||
# its so easy to use keys your grandmother could use it
|
||||
PasswordAuthentication = false;
|
||||
ports = [
|
||||
69
|
||||
];
|
||||
ports = [ 69 ];
|
||||
openFirewall = true;
|
||||
};
|
||||
};
|
||||
|
||||
users.users.sako.openssh.authorizedKeys.keys = [
|
||||
"ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAIPGAwG2Fqs3xNF/6/9GdznH/jUIqxW3aTYvmteuq9odZ sako@sakotop"
|
||||
];
|
||||
};
|
||||
}
|
||||
|
|
|
@ -1,5 +1,6 @@
|
|||
{
|
||||
imports = [
|
||||
./waydroid.nix
|
||||
./virt-manager.nix
|
||||
];
|
||||
}
|
||||
|
|
|
@ -8,12 +8,8 @@ in
|
|||
};
|
||||
|
||||
config = lib.mkIf cfg.enable {
|
||||
virtualization.libvirtd.enable = true;
|
||||
programs.dconf.enable = true;
|
||||
environtment.systemPackages = with pkgs; [
|
||||
virt-manager
|
||||
];
|
||||
|
||||
virtualisation.libvirtd.enable = true;
|
||||
programs.virt-manager.enable = true;
|
||||
users.users.sako.extraGroups = [ "libvirtd" ];
|
||||
};
|
||||
}
|
||||
|
|
|
@ -1,10 +1,8 @@
|
|||
{inputs, ...}: {
|
||||
{ inputs, ... }: {
|
||||
# This one brings our custom packages from the 'pkgs' directory
|
||||
additions = final: _prev: import ../packages {pkgs = final;};
|
||||
additions = final: _prev: import ../packages { pkgs = final; };
|
||||
|
||||
nixpkgs.overlays = [
|
||||
inputs.emacs-overlay
|
||||
];
|
||||
nixpkgs.overlays = [ inputs.emacs-overlay ];
|
||||
# This one contains whatever you want to overlay
|
||||
# You can change versions, add patches, set compilation flags, anything really.
|
||||
# https://nixos.wiki/wiki/Overlays
|
||||
|
@ -12,35 +10,23 @@
|
|||
# example = prev.example.overrideAttrs (oldAttrs: rec {
|
||||
# ...
|
||||
# });
|
||||
polybar = prev.polybar.override {
|
||||
pulseSupport = true;
|
||||
};
|
||||
qutebrowser = prev.qutebrowser.override {
|
||||
enableWideVine = true;
|
||||
};
|
||||
vimix-gtk-themes = prev.vimix-gtk-themes.override {
|
||||
themeVariants = ["ruby"];
|
||||
};
|
||||
polybar = prev.polybar.override { pulseSupport = true; };
|
||||
qutebrowser = prev.qutebrowser.override { enableWideVine = true; };
|
||||
vimix-gtk-themes =
|
||||
prev.vimix-gtk-themes.override { themeVariants = [ "ruby" ]; };
|
||||
fluent-gtk-theme = prev.fluent-gtk-theme.override {
|
||||
colorVariants = [ "dark" ];
|
||||
themeVariants = [ "red" ];
|
||||
themeVariants = [ "pink" ];
|
||||
tweaks = [ "square" ];
|
||||
};
|
||||
fluent-icon-theme = prev.fluent-icon-theme.override {
|
||||
colorVariants = [ "red" ];
|
||||
};
|
||||
dwm = prev.dwm.overrideAttrs (old: {
|
||||
src = ../config/dwm;
|
||||
});
|
||||
fluent-icon-theme =
|
||||
prev.fluent-icon-theme.override { colorVariants = [ "pink" ]; };
|
||||
dwm = prev.dwm.overrideAttrs (old: { src = ../config/dwm; });
|
||||
ags = prev.ags.overrideAttrs (old: {
|
||||
buildInputs = old.buildInputs ++ [ inputs.nixpkgs.legacyPackages.x86_64-linux.libdbusmenu-gtk3 ];
|
||||
});
|
||||
isync = prev.isync.overrideAttrs (old: {
|
||||
withCyrusSaslXoauth2 = true;
|
||||
});
|
||||
blender = prev.blender.overrideAttrs (old: {
|
||||
nativeBuildInputs = (old.nativeBuildInputs or []) ++ [ inputs.nixpkgs.legacyPackages.x86_64-linux.pkg-config inputs.nixpkgs.legacyPackages.x86_64-linux.wayland-scanner ];
|
||||
buildInputs = old.buildInputs
|
||||
++ [ inputs.nixpkgs.legacyPackages.x86_64-linux.libdbusmenu-gtk3 ];
|
||||
});
|
||||
isync = prev.isync.overrideAttrs (old: { withCyrusSaslXoauth2 = true; });
|
||||
};
|
||||
|
||||
# incase something breaks
|
||||
|
|
12
secrets/secrets.nix
Normal file
12
secrets/secrets.nix
Normal file
|
@ -0,0 +1,12 @@
|
|||
let
|
||||
sakotop =
|
||||
"ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAIPGAwG2Fqs3xNF/6/9GdznH/jUIqxW3aTYvmteuq9odZ sako@sakotop";
|
||||
sakopc =
|
||||
"ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAIDjPSt4TykAJgafU9Trk7sr9wzXhBZxawDIZir0CPyDN sako@sakopc";
|
||||
|
||||
shared = [ sakotop sakopc ];
|
||||
|
||||
in {
|
||||
"test.age".publicKeys = shared;
|
||||
"shared/torrc.age".publicKeys = shared;
|
||||
}
|
BIN
secrets/shared/torrc.age
Normal file
BIN
secrets/shared/torrc.age
Normal file
Binary file not shown.
BIN
secrets/test.age
Normal file
BIN
secrets/test.age
Normal file
Binary file not shown.
Loading…
Reference in a new issue