guest@dotshare [~/groups/wms/monster] $ ls Monster-IV/ | cat

Monster IV (scrot) (+2 likes)

Shinryuu Mar 06, 2013 (wms/monster)

config.def.h_monsterwm(raw, dl)

SCROT

  1
  2
  3
  4
  5
  6
  7
  8
  9
 10
 11
 12
 13
 14
 15
 16
 17
 18
 19
 20
 21
 22
 23
 24
 25
 26
 27
 28
 29
 30
 31
 32
 33
 34
 35
 36
 37
 38
 39
 40
 41
 42
 43
 44
 45
 46
 47
 48
 49
 50
 51
 52
 53
 54
 55
 56
 57
 58
 59
 60
 61
 62
 63
 64
 65
 66
 67
 68
 69
 70
 71
 72
 73
 74
 75
 76
 77
 78
 79
 80
 81
 82
 83
 84
 85
 86
 87
 88
 89
 90
 91
 92
 93
 94
 95
 96
 97
 98
 99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
/* see LICENSE for copyright and license */

#ifndef CONFIG_H
#define CONFIG_H

/** modifiers **/
#define MOD1            Mod1Mask
#define MOD4            Mod4Mask
#define MOD5            Mod5Mask
#define CONTROL         ControlMask
#define SHIFT           ShiftMask

/** generic settings **/
#define MASTER_SIZE     0.72
#define SHOW_PANEL      True
#define TOP_PANEL       True
#define PANEL_HEIGHT    14
#define DEFAULT_MODE    TILE
#define ATTACH_ASIDE    True
#define FOLLOW_WINDOW   False
#define FOLLOW_MONITOR  False
#define FOLLOW_MOUSE    False
#define CLICK_TO_FOCUS  True
#define FOCUS_BUTTON    Button3
#define BORDER_WIDTH    1
#define FOCUS           "#191920"
#define UNFOCUS         "#161718"
#define INFOCUS         "#191919"
#define MINWSZ          50
#define DEFAULT_MONITOR 0
#define DEFAULT_DESKTOP 0
#define DESKTOPS        3

/**
 * layouts for monitors, terminate with -1
 */
static const int monitor1[] = { FLOAT, TILE, BSTACK, MONOCLE, -1 };
static const int monitor2[] = { TILE, BSTACK, BSTACK, BSTACK, -1 };

/**
 * monitor configuration
 */
static const MonitorCfg monitorcfg[] = {
    /* show panel, layouts */
    { True,  monitor1 },
    { False, monitor2 },
};

/**
 * open applications to specified monitor and desktop
 * with the specified properties.
 * if monitor is negative, then current is assumed
 * if desktop is negative, then current is assumed
 */
static const AppRule rules[] = { \
    /*  class     monitor  desktop  follow  float */
    { "MPlayer",     0,       0,    True,   False },
    { "mplayer2",    0,       0,    True,   False },
    { "mpv",         0,       0,    True,   False },
    { "dwb",        -1,       0,    False,  False },
    { "winecfg",    -1,      -1,    False,  True },
    { "nitrogen",   -1,      -1,    False,  True },
    { "medit",       0,      -1,    False,  True },
    { "Gimp",        0,       2,    False,  False },
    { "gimp-image-window", 0,       2,    False,  False },
};

/* helper for spawning shell commands */
#define SHCMD(cmd) {.com = (const char*[]){"/bin/sh", "-c", cmd, NULL}}

/** commands **/
static const char *menucmd[]	   = { "dmenu_run", "-fn", "terminus 9", NULL};
static const char *gtkmenucmd[]	   = { "mygtkmenu", "/home/shn/.menu", NULL };
static const char *termcmd[]	   = { "termite", NULL };
static const char *filecmd[]	   = { "termite", "-e", "ranger", NULL };
static const char *webcmd[]	   = { "dwb", NULL };
static const char *lolicmd[]       = { "lolictrl", NULL };
static const char *mpdcmd[]        = { "lolimpdnu", NULL };
static const char *voldowncmd[]	   = { "dvol", "-d", "2", NULL };
static const char *volupcmd[]	   = { "dvol", "-i", "2", NULL };

#define STR_EXPAND(tok) #tok
#define STR(tok) STR_EXPAND(tok)

/* PRNTS: file name syntax
 * PRNTF: fullscreen print command
 * PRNTW: window print command */
#define PRNTS "/home/shn/monsterwm-$(date +'%H:%M-%d-%m-%Y').png, notify-send 'Screenshot taken'"
#define PRNTF "ffcast -x "STR(DEFAULT_MONITOR)" % scrot -g %wx%h+%x+%y "PRNTS
#define PRNTW "scrotwin "PRNTS

#define MONITORCHANGE(K,N) \
    {  MOD5,             K,              change_monitor, {.i = N}}, \
    {  CONTROL|ShiftMask, K,             client_to_monitor, {.i = N}},

#define DESKTOPCHANGE(K,N) \
    {  MOD1,             K,              change_desktop, {.i = N}}, \
    {  MOD1|ShiftMask,   K,              client_to_desktop, {.i = N}},

/**
 * keyboard shortcuts
 */
static Key keys[] = {
    /* modifier         key            function           argument */
    {  CONTROL,         XK_d,          spawn,             {.com = lolicmd}},
    {  CONTROL,         XK_l,          spawn,             {.com = mpdcmd}},
    {  MOD1,            XK_p,          spawn,             {.com = menucmd}},
    {  MOD1,            XK_1,          spawn,             {.com = webcmd}},
    {  MOD1,            XK_2,          spawn,             {.com = filecmd}},
    {  MOD1,            XK_dead_acute, spawn,             {.com = volupcmd}},
    {  MOD1,            XK_plus,       spawn,             {.com = voldowncmd}},
    {  MOD1|SHIFT,      XK_Return,     spawn,             {.com = termcmd}},
    {  MOD1,            XK_b,          togglepanel,       {NULL}},
    {  MOD1,            XK_BackSpace,  focusurgent,       {NULL}},
    {  MOD1|SHIFT,      XK_c,          killclient,        {NULL}},
    {  MOD1,            XK_j,          next_win,          {NULL}},
    {  MOD1,            XK_k,          prev_win,          {NULL}},
    {  MOD1,            XK_h,          resize_master,     {.i = -10}}, /* decrease size in px */
    {  MOD1,            XK_l,          resize_master,     {.i = +10}}, /* increase size in px */
    {  MOD1,            XK_i,          resize_stack,      {.i = -10}}, /* shrink   size in px */
    {  MOD1,            XK_o,          resize_stack,      {.i = +10}}, /* grow     size in px */
    {  MOD1|CONTROL,    XK_h,          rotate,            {.i = -1}},
    {  MOD1|CONTROL,    XK_l,          rotate,            {.i = +1}},
    {  MOD1|SHIFT,      XK_h,          rotate_filled,     {.i = -1}},
    {  MOD1|SHIFT,      XK_l,          rotate_filled,     {.i = +1}},
    {  MOD1,            XK_Tab,        last_desktop,      {NULL}},
    {  MOD1,            XK_m,	       swap_master,       {NULL}},
    {  MOD1|SHIFT,      XK_j,          move_down,         {NULL}},
    {  MOD1|SHIFT,      XK_k,          move_up,           {NULL}},
    {  MOD1|SHIFT,      XK_t,          switch_mode,       {.i = TILE}},
    {  MOD1|SHIFT,      XK_m,          switch_mode,       {.i = MONOCLE}},
    {  MOD1|SHIFT,      XK_b,          switch_mode,       {.i = BSTACK}},
    {  MOD1|SHIFT,      XK_g,          switch_mode,       {.i = GRID}},
    {  MOD1|SHIFT,      XK_f,          switch_mode,       {.i = FLOAT}},
    {  MOD1|CONTROL,    XK_r,          quit,              {.i = 0}}, /* quit with exit value 0 */
    {  MOD1|CONTROL,    XK_q,          quit,              {.i = 1}}, /* quit with exit value 1 */
    {  CONTROL,         XK_Down,       moveresize,        {.v = (int []){   0,  20,   0,   0 }}}, /* move down*/ 
    {  CONTROL,         XK_Up,         moveresize,        {.v = (int []){   0, -20,   0,   0 }}}, /* move up */
    {  CONTROL,         XK_Right,      moveresize,        {.v = (int []){  20,  -0,   0,   0 }}}, /* move right */
    {  CONTROL,         XK_Left,       moveresize,        {.v = (int []){ -20,   0,   0,   0 }}}, /* move left  */
    {  MOD5,		XK_k,          moveresize,        {.v = (int []){   0,   0,   0,  20 }}}, /* height grow   */
    {  MOD5,		XK_i,          moveresize,        {.v = (int []){   0,   0,   0, -20 }}}, /* height shrink */
    {  MOD5,		XK_l,          moveresize,        {.v = (int []){   0,   0,  20,   0 }}}, /* width grow    */
    {  MOD5,		XK_j,          moveresize,        {.v = (int []){   0,   0, -20,   0 }}}, /* width shrink  */
       DESKTOPCHANGE(   XK_F1,                             0)
       DESKTOPCHANGE(   XK_F2,                             1)
       DESKTOPCHANGE(   XK_F3,                             2)

    /* monitor shortcuts */
       MONITORCHANGE(   XK_period,                          0)
       MONITORCHANGE(   XK_comma,                           1)

    { 0,                XK_Print,      spawn,             SHCMD(PRNTF) },
    { MOD1,             XK_Print,      spawn,             SHCMD(PRNTW) },
    { MOD5,             XK_F10,        togglefullscreen,  {NULL}},
};

/**
 * mouse shortcuts
 */
static Button buttons[] = {
    {  MOD1,    Button1,     mousemotion,   {.i = MOVE}},
    {  MOD1,    Button3,     mousemotion,   {.i = RESIZE}},
    {  CONTROL,	Button3,     spawn,         {.com = gtkmenucmd}},
};
#endif

/* vim: set expandtab ts=4 sts=4 sw=4 : */

CLICK TO VIEW

x

config.def.h_bar(raw, dl)

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
/* The height of the bar (in pixels) */
#define BAR_HEIGHT  14
/* The width of the bar. Set to -1 to fit screen */
#define BAR_WIDTH   -1
/* Offset from the left. Set to 0 to have no effect */
#define BAR_OFFSET 1280
/* Choose between an underline or an overline */
#define BAR_UNDERLINE 1
/* The thickness of the underline (in pixels). Set to 0 to disable. */
#define BAR_UNDERLINE_HEIGHT 3
/* Default bar position, overwritten by '-b' switch */
#define BAR_BOTTOM 0
/* The fonts used for the bar, comma separated. Only the first 2 will be used. */
#define BAR_FONT	"-*-stlarch-medium-r-normal-*-10-*-*-*-*-*-*-*","-*-cure.se-medium-r-*-*-12-*-*-*-*-*-*-*"
/* Some fonts don't set the right width for some chars, pheex it */
#define BAR_FONT_FALLBACK_WIDTH 4
/* Color palette */
#define COLOR0	0x141516 /* Background */
#define COLOR1	0xa0a0a0 /* Foreground */
#define COLOR2	0x283B5D /* Blue */
#define COLOR3	0x8c1924 /* Red */
#define COLOR4	0xb7416e /* Pink */
#define COLOR5	0x404042 /* Grayish */
#define COLOR6	0x6b0f38 /* Magenta */
#define COLOR7	0x252525 /* Black'n'Gray I */
#define COLOR8	0x424242 /* Black'n'Gray II */
#define COLOR9	0x1a1a1a /* overlay */
 

x

wmrun.sh(raw, dl)

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
#!/usr/bin/env sh

: "${wm:=monsterwm}"
: "${ff:="/tmp/${wm}.fifo"}"
[ -p "$ff" ] || mkfifo -m 600 "$ff"

# spawn a statusbar
while read -t 60 -r line || true; do
    echo "$line" | grep -qEx "(([[:digit:]]+:){4,6}[[:digit:]]+ ?)+" && prev="$line" || line=
    statusinfo.sh ${line:-$prev}
done < "$ff" | bar &

"$wm" > "$ff"
 

x

statusinfo.sh(raw, dl)

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
#!/usr/bin/env bash

# desktop status
for desk; do
    m="${desk%%:*}" desk="${desk#*:}" # monitor id 
    [ "$m" -ne 0 ] && continue
    n="${desk%%:*}" desk="${desk#*:}" # is current monitor
    d="${desk%%:*}" desk="${desk#*:}" # desktop id
    w="${desk%%:*}" desk="${desk#*:}" # window count
    l="${desk%%:*}" desk="${desk#*:}" # layout mode
    c="${desk%%:*}" desk="${desk#*:}" # is current desktop
    u="$desk"                         # has urgent hint

    # desktop id
    case "$d" in
        0) d=" term" ;; 1) d=" web" ;;
        2) d=" img" ;;
    esac

    # current desktop
    if [ $c -ne 0 ]
    then bg="\b9" un="\u6" fg="\f1"
        case "$l" in
            0) s="Classic Tiling Mode" ;; 1) s="Monocle Mode" ;; 2) s="Bstack Mode" ;;
            3) s="Grid Mode" ;; 4) s="Bloat Mode" ;;
        esac && s="\b7\u7 $s \br\ur"
    fi

    # has urgent hint or no windows
    [ $u -ne 0 ] && un="\u2"
    [ $w -eq 0 ] && w="-"
    
    in="$in$bg$fg$un $d \f7[$w] \ur\br\fr"
    unset bg fg un
done

# music status
music="$(mpc current -f "%artist% - [%title%|%file%]")"
if [ -z "$music" ]; then music="nothing to see here" mstat=""
else
    mstat="$(mpc | sed -rn '2s/\[([[:alpha:]]+)].*/\1/p')"
    [ "$mstat" == "paused" ] && mstat="" || mstat=""
fi

# volume status
if [ "$(amixer get Master | sed -nr '$ s:.*\[(.+)]$:\1:p')" == "off" ]
then vol="[m]" vstat=""
else
    vol="$(amixer get PCM | sed -nr '$ s:.*\[(.+%)].*:\1:p')"
    if   [ "${vol%\%}" -le 10 ]; then vstat=""
    elif [ "${vol%\%}" -le 20 ]; then vstat=""; else vstat=""; fi
fi

# date and time
date="$(date +"%a %d %b %R")" dstat=""

printf '%s %s %s' "$in" "$s" "\r"
printf ' \\b7\\u6\\f1 %s \\br\\ur\\fr %s' "$mstat" "$music" "$vstat" "$vol" "$dstat" "$date "
printf '\n'
 

x

Notes

Monster IV

This is my most recent setup with monsterwm and it feels pretty damn nice. It’s been a long road modify things with monsterwm and/or lemonboy’s bar. I think I’ll slow things down a bit. Feel free to ask if you have something in your mind.

EDIT. I added smaller screenshot file.

applications

web: dwb
irc: weechat
file manager: ranger
editor: vim
music player: ncmpcpp

fonts

To display “icons” in the bar you should get “Stlarch_font” because “icons” are just fonts alone. I use “berry” font for terminal(s) and cure for panel which is part of artwiz fonts

scripts

Remember to add “wmrun.sh” into .xinitrc (…exec wmrun.sh) and place both statusinfo.sh and wmrun.sh into your $PATH like ~/bin

github

I use Cloudef’s personal multi-monitor monsterwm branch
$ git clone git://github.com/Cloudef/monsterwm.git

LemonBoy’s bar
$ git clone git://github.com/LemonBoy/bar.git

Comments

gregwittman said about 10 years ago

Cool desktop.. Can you share the script you are using for the dwb browser?

Shinryuu said about 9 years ago

Oh.. I haven’t logged in for a while. Hope you won’t kill me but here’s the script I used to make my homepage https://github.com/ok100/homepage.py :)