aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorToni Uhlig <matzeton@googlemail.com>2017-11-10 20:51:45 +0100
committerToni Uhlig <matzeton@googlemail.com>2017-11-10 20:51:45 +0100
commit4516416d3d0263891896488d2831f2dc4bdf79ee (patch)
treea32552685e808c4357b8fb2812aaaacd6c6d828a
parent50c27368522af16b7473e40a890ca9c29d71d63f (diff)
xmonad.hs update, basic c stacktrace handler module
-rw-r--r--btrace.c100
-rw-r--r--configs/xmonad.hs21
2 files changed, 115 insertions, 6 deletions
diff --git a/btrace.c b/btrace.c
new file mode 100644
index 0000000..e9ade89
--- /dev/null
+++ b/btrace.c
@@ -0,0 +1,100 @@
+#include <execinfo.h>
+#include <stdio.h>
+#include <unistd.h>
+#include <stdlib.h>
+#include <string.h>
+#include <sys/types.h>
+#include <sys/wait.h>
+
+#define STACKTRACES 10
+
+
+static char *exec_path = NULL;
+
+
+void bt_set_arg0(const char *arg0) {
+ if (!exec_path && arg0) {
+ exec_path = strdup(arg0);
+ }
+}
+
+static void addr_to_array(char **strings, size_t siz, char **result) {
+ char *start, *end;
+
+ for (size_t i = 0; i < siz; ++i) {
+ start = strchr(strings[i], '+');
+ if (start) {
+ end = strchr(start, ')');
+ start++;
+ if (end)
+ result[i] = strndup(start, end-start);
+ else
+ result[i] = strdup("");
+ }
+ }
+}
+
+void bt_print_trace (void) {
+ void *array[STACKTRACES];
+ size_t bt_size;
+ char **strings;
+ size_t i;
+ char **addrs;
+
+ bt_size = backtrace(array, STACKTRACES);
+ strings = backtrace_symbols(array, bt_size);
+
+ printf("\n\n[1] Obtained %zd stack frames.\n", bt_size);
+ for (i = 0; i < bt_size; ++i)
+ printf("%s\n", strings[i]);
+
+ /* addr2line -p -e ./btrace -f -i [addresses] */
+ if (exec_path) {
+ addrs = (char**) calloc(bt_size, sizeof(*addrs));
+
+ addr_to_array(strings, bt_size, addrs);
+ printf("\n\n[2] Run for more info: addr2line -p -e %s -f -i", exec_path);
+ for (i = 0; i < bt_size; ++i) {
+ printf(" %s", addrs[i]);
+ }
+ printf("%s\n", "");
+
+ for (i = 0; i < bt_size; ++i)
+ if (addrs[i])
+ free(addrs[i]);
+ free(addrs);
+ }
+
+ free(strings);
+}
+
+void bt_sighandler(int signum) {
+ bt_print_trace();
+ switch (signum) {
+ case SIGTERM:
+ case SIGABRT:
+ case SIGSEGV:
+ exit(1);
+ }
+}
+
+
+
+
+/* A dummy function to make the backtrace more interesting. */
+void dummy_function(void) {
+ bt_print_trace();
+}
+
+#include <assert.h>
+int main(int argc, char **argv) {
+ bt_set_arg0(argv[0]);
+ dummy_function();
+ signal(SIGTERM, bt_sighandler);
+ signal(SIGABRT, bt_sighandler);
+ signal(SIGSEGV, bt_sighandler);
+
+ //assert(0);
+ *(int*)(NULL) = 0;
+ return 0;
+}
diff --git a/configs/xmonad.hs b/configs/xmonad.hs
index 119072e..7ee196b 100644
--- a/configs/xmonad.hs
+++ b/configs/xmonad.hs
@@ -9,6 +9,7 @@ import XMonad.Hooks.DynamicLog
import XMonad.Hooks.ManageDocks
import XMonad.Hooks.ManageHelpers
import XMonad.Hooks.SetWMName
+import XMonad.Hooks.EwmhDesktops
import XMonad.Hooks.UrgencyHook
import XMonad.Layout.NoBorders
import XMonad.Layout.Tabbed
@@ -22,6 +23,7 @@ import XMonad.Actions.CycleWS
import XMonad.Util.Replace
import XMonad.Util.Run
import XMonad.Util.EZConfig(additionalKeys)
+import XMonad.Util.NamedScratchpad
import qualified XMonad.StackSet as W
import qualified Data.Map as M
@@ -38,10 +40,11 @@ myTerminal = "x-terminal-emulator"
-- The default number of workspaces (virtual screens) and their names.
--
comWS = "1:com"
-fileWS = "2:file"
+fileWS = "2:mail"
webWS = "3:web"
w1WS = "4:work1"
w2WS = "5:work2"
+W3WS = "6:work3"
myWorkspaces :: [WorkspaceId]
myWorkspaces = [ comWS, fileWS, webWS, w1WS, w2WS ] ++ map show [6..9]
@@ -64,6 +67,8 @@ myManageHook = composeAll
[ className =? "Seahorse" --> doShift webWS
, className =? "Iceweasel" --> doShift webWS
, className =? "chromium" --> doShift webWS
+ , className =? "Chromium" --> doShift webWS
+ , resource =? "browser" --> doShift webWS
, className =? "chromium-browser" --> doShift webWS
, className =? "Chromium-browser" --> doShift webWS
, className =? "Icedove" --> doShift webWS
@@ -83,6 +88,10 @@ myManageHook = composeAll
, className =? "MPlayer" --> doFloat
, className =? "VirtualBox" --> doShift w1WS
, className =? "Xchat" --> doShift w2WS
+ , className =? "claws-mail" --> doShift fileWS
+ , className =? "Claws-mail" --> doShift fileWS
+ , className =? "notes" --> nonFloating
+ , className =? "xmobar" --> doIgnore
, isFullscreen --> (doF W.focusDown <+> doFullFloat)]
@@ -265,6 +274,10 @@ myKeys conf@(XConfig {XMonad.modMask = modMask}) = M.fromList $
, ((modMask, xK_l),
sendMessage Expand)
+ -- ToggleStruts
+ , ((modMask, xK_b),
+ sendMessage ToggleStruts)
+
-- Push window back into tiling.
, ((modMask, xK_t),
withFocused $ windows . W.sink)
@@ -275,10 +288,6 @@ myKeys conf@(XConfig {XMonad.modMask = modMask}) = M.fromList $
-- Quit xmonad.
, ((modMask .|. shiftMask, xK_q),
spawn "/sbin/start-stop-daemon -S -b --exec /usr/bin/killall -- -TERM -u `id -nu`")
-
- -- Restart xmonad.
- , ((modMask, xK_q),
- restart "xmonad" True)
]
++
@@ -346,7 +355,7 @@ myStartupHook = do
safeSpawnProg "seahorse"
safeSpawnProg "chromium"
safeSpawnProg "pidgin"
- safeSpawnProg "qtox"
+ safeSpawnProg "claws.sh"
setWMName "LG3D"
nextWS
nextWS