aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--config.go163
-rw-r--r--config/config.go8
-rw-r--r--main.go185
3 files changed, 183 insertions, 173 deletions
diff --git a/config.go b/config.go
new file mode 100644
index 0000000..1f70409
--- /dev/null
+++ b/config.go
@@ -0,0 +1,163 @@
+package main
+
+import (
+ "os"
+
+ "github.com/BurntSushi/xgb"
+ "github.com/BurntSushi/xgb/xproto"
+
+ "github.com/crecheer/wm/keysym"
+)
+
+// appearance
+var barHeight uint16 = 20
+var gapSize int = 10
+var barColor uint32 = 0x000000
+
+var mod = uint16(xproto.ModMask1)
+
+// commands that get executed on startup
+var startup = []string{"notify-send hello world!"}
+
+var keys = []Key{
+ {
+ Mod: mod,
+ Sym: keysym.XK_Return,
+ Fn: func(conn *xgb.Conn) {
+ spawn("st")
+ },
+ },
+ {
+ Mod: mod | xproto.ModMaskShift,
+ Sym: keysym.XK_q,
+ Fn: func(conn *xgb.Conn) {
+ os.Exit(0)
+ },
+ },
+ {
+ Mod: mod,
+ Sym: keysym.XK_q,
+ Fn: func(conn *xgb.Conn) {
+ killActiveWindow(conn, focused)
+ },
+ },
+ {
+ Mod: mod,
+ Sym: keysym.XK_d,
+ Fn: func(conn *xgb.Conn) {
+ spawn("dmenu_run")
+ },
+ },
+ {
+ Mod: mod,
+ Sym: keysym.XK_l,
+ Fn: func(conn *xgb.Conn) {
+ layout = "tileHorizontal"
+ updateWindows(conn)
+ },
+ },
+ {
+ Mod: mod | xproto.ModMaskShift,
+ Sym: keysym.XK_l,
+ Fn: func(conn *xgb.Conn) {
+ layout = "tileVertical"
+ updateWindows(conn)
+ },
+ },
+ {
+ Mod: mod,
+ Sym: keysym.XK_m,
+ Fn: func(conn *xgb.Conn) {
+ layout = "tileWithMaster"
+ updateWindows(conn)
+ },
+ },
+ {
+ Mod: mod,
+ Sym: keysym.XK_0,
+ Fn: func(conn *xgb.Conn) {
+ var tags BitMask = 2 ^ 32 - 1
+ switchTags(conn, tags)
+ },
+ },
+ {
+ Mod: mod,
+ Sym: keysym.XK_1,
+ Fn: func(conn *xgb.Conn) {
+ var tags BitMask = 1
+ switchTags(conn, tags)
+ },
+ },
+ {
+ Mod: mod,
+ Sym: keysym.XK_2,
+ Fn: func(conn *xgb.Conn) {
+ var tags BitMask = 2
+ switchTags(conn, tags)
+ },
+ },
+ {
+ Mod: mod,
+ Sym: keysym.XK_3,
+ Fn: func(conn *xgb.Conn) {
+ var tags BitMask = 4
+ switchTags(conn, tags)
+ },
+ },
+ {
+ Mod: mod,
+ Sym: keysym.XK_4,
+ Fn: func(conn *xgb.Conn) {
+ var tags BitMask = 8
+ switchTags(conn, tags)
+ },
+ },
+ {
+ Mod: mod,
+ Sym: keysym.XK_5,
+ Fn: func(conn *xgb.Conn) {
+ var tags BitMask = 16
+ switchTags(conn, tags)
+ },
+ },
+ {
+ Mod: mod,
+ Sym: keysym.XK_6,
+ Fn: func(conn *xgb.Conn) {
+ var tags BitMask = 32
+ switchTags(conn, tags)
+ },
+ },
+ {
+ Mod: mod,
+ Sym: keysym.XK_7,
+ Fn: func(conn *xgb.Conn) {
+ var tags BitMask = 64
+ switchTags(conn, tags)
+ },
+ },
+ {
+ Mod: mod,
+ Sym: keysym.XK_8,
+ Fn: func(conn *xgb.Conn) {
+ var tags BitMask = 128
+ switchTags(conn, tags)
+ },
+ },
+ {
+ Mod: mod,
+ Sym: keysym.XK_9,
+ Fn: func(conn *xgb.Conn) {
+ var tags BitMask = 256
+ switchTags(conn, tags)
+ },
+ },
+ {
+ Mod: mod,
+ Sym: keysym.XK_0,
+ Fn: func(conn *xgb.Conn) {
+ var tags BitMask = 511
+ switchTags(conn, tags)
+ },
+ },
+}
diff --git a/config/config.go b/config/config.go
deleted file mode 100644
index c8f58f6..0000000
--- a/config/config.go
+++ /dev/null
@@ -1,8 +0,0 @@
-package config
-
-var BarHeight uint16 = 20
-var GapSize int = 10
-var BarColor uint32 = 0x000000
-
-// commands that get executed on startup
-var Startup = []string{"notify-send hello world!"}
diff --git a/main.go b/main.go
index 373e87c..f48ce61 100644
--- a/main.go
+++ b/main.go
@@ -3,14 +3,10 @@ package main
import (
"fmt"
"log"
- "os"
"os/exec"
"github.com/BurntSushi/xgb"
"github.com/BurntSushi/xgb/xproto"
-
- "github.com/crecheer/wm/config"
- "github.com/crecheer/wm/keysym"
)
// types
@@ -38,23 +34,19 @@ type Client struct {
}
var (
- keys []Key
- clients = make(map[xproto.Window]*Client)
- focused xproto.Window
+ clients = make(map[xproto.Window]*Client)
+ clientList []*Client
+ focused xproto.Window
)
// bar
var (
barWindow xproto.Window
barGC xproto.Gcontext
- barHeight uint16 = config.BarHeight
)
// layout
-var (
- layout string = "tileWithMaster"
- gapSize = config.GapSize
-)
+var layout string = "tileWithMaster"
// tags
var (
@@ -123,12 +115,12 @@ func setup(conn *xgb.Conn) {
log.Fatal(err)
}
- setupKeys(conn)
+ grabKeys(conn)
if barHeight != 0 {
createBar(conn)
}
- for _, cmd := range config.Startup {
+ for _, cmd := range startup {
exec.Command(cmd)
log.Println("Running startup command: " + cmd)
}
@@ -184,160 +176,12 @@ func killActiveWindow(conn *xgb.Conn, win xproto.Window) {
xproto.DestroyWindow(conn, win)
}
+ removeClient(win)
delete(clients, win)
focused = 0
updateWindows(conn)
}
-func setupKeys(conn *xgb.Conn) {
- mod := uint16(xproto.ModMask1)
-
- // keybinds
- keys = []Key{
- {
- Mod: mod,
- Sym: keysym.XK_Return,
- Fn: func(conn *xgb.Conn) {
- spawn("st")
- },
- },
- {
- Mod: mod | xproto.ModMaskShift,
- Sym: keysym.XK_q,
- Fn: func(conn *xgb.Conn) {
- os.Exit(0)
- },
- },
- {
- Mod: mod,
- Sym: keysym.XK_q,
- Fn: func(conn *xgb.Conn) {
- killActiveWindow(conn, focused)
- },
- },
- {
- Mod: mod,
- Sym: keysym.XK_d,
- Fn: func(conn *xgb.Conn) {
- spawn("dmenu_run")
- },
- },
- {
- Mod: mod,
- Sym: keysym.XK_l,
- Fn: func(conn *xgb.Conn) {
- layout = "tileHorizontal"
- updateWindows(conn)
- },
- },
- {
- Mod: mod | xproto.ModMaskShift,
- Sym: keysym.XK_l,
- Fn: func(conn *xgb.Conn) {
- layout = "tileVertical"
- updateWindows(conn)
- },
- },
- {
- Mod: mod,
- Sym: keysym.XK_m,
- Fn: func(conn *xgb.Conn) {
- layout = "tileWithMaster"
- updateWindows(conn)
- },
- },
- {
- Mod: mod,
- Sym: keysym.XK_0,
- Fn: func(conn *xgb.Conn) {
- var tags BitMask = 2 ^ 32 - 1
- switchTags(conn, tags)
- },
- },
- {
- Mod: mod,
- Sym: keysym.XK_1,
- Fn: func(conn *xgb.Conn) {
- var tags BitMask = 1
- switchTags(conn, tags)
- },
- },
- {
- Mod: mod,
- Sym: keysym.XK_2,
- Fn: func(conn *xgb.Conn) {
- var tags BitMask = 2
- switchTags(conn, tags)
- },
- },
- {
- Mod: mod,
- Sym: keysym.XK_3,
- Fn: func(conn *xgb.Conn) {
- var tags BitMask = 4
- switchTags(conn, tags)
- },
- },
- {
- Mod: mod,
- Sym: keysym.XK_4,
- Fn: func(conn *xgb.Conn) {
- var tags BitMask = 8
- switchTags(conn, tags)
- },
- },
- {
- Mod: mod,
- Sym: keysym.XK_5,
- Fn: func(conn *xgb.Conn) {
- var tags BitMask = 16
- switchTags(conn, tags)
- },
- },
- {
- Mod: mod,
- Sym: keysym.XK_6,
- Fn: func(conn *xgb.Conn) {
- var tags BitMask = 32
- switchTags(conn, tags)
- },
- },
- {
- Mod: mod,
- Sym: keysym.XK_7,
- Fn: func(conn *xgb.Conn) {
- var tags BitMask = 64
- switchTags(conn, tags)
- },
- },
- {
- Mod: mod,
- Sym: keysym.XK_8,
- Fn: func(conn *xgb.Conn) {
- var tags BitMask = 128
- switchTags(conn, tags)
- },
- },
- {
- Mod: mod,
- Sym: keysym.XK_9,
- Fn: func(conn *xgb.Conn) {
- var tags BitMask = 256
- switchTags(conn, tags)
- },
- },
- {
- Mod: mod,
- Sym: keysym.XK_0,
- Fn: func(conn *xgb.Conn) {
- var tags BitMask = 511
- switchTags(conn, tags)
- },
- },
- }
- grabKeys(conn)
-}
-
func grabKeys(conn *xgb.Conn) {
root := xproto.Setup(conn).DefaultScreen(conn).Root
@@ -438,6 +282,7 @@ func manageWindow(conn *xgb.Conn, win xproto.Window) {
}
clients[win] = client
+ clientList = append([]*Client{client}, clientList...)
log.Println("managing window:", win)
// listen for events on this window
@@ -461,9 +306,19 @@ func manageWindow(conn *xgb.Conn, win xproto.Window) {
updateWindows(conn)
}
+func removeClient(win xproto.Window) {
+ for i, c := range clientList {
+ if c.Win == win {
+ clientList = append(clientList[:i], clientList[i+1:]...)
+ return
+ }
+ }
+}
+
func unmanageWindow(conn *xgb.Conn, win xproto.Window) {
if _, ok := clients[win]; ok {
log.Println("unmanaging window:", win)
+ removeClient(win)
delete(clients, win)
updateWindows(conn)
}
@@ -630,7 +485,7 @@ func createBar(conn *xgb.Conn) {
// create the window
cw := []uint32{
- config.BarColor, // should be black background
+ barColor, // should be black background
xproto.EventMaskExposure, // redraw on expose
}
@@ -708,7 +563,7 @@ func getWindowTitle(conn *xgb.Conn, win xproto.Window) string {
func updateWindows(conn *xgb.Conn) {
ActiveClients = ActiveClients[:0]
- for _, client := range clients {
+ for _, client := range clientList {
log.Println(client.Tags & GlobalTags)
if (client.Tags & GlobalTags) >= 1 {
xproto.MapWindow(conn, client.Win)