aboutsummaryrefslogtreecommitdiff
path: root/main.go
diff options
context:
space:
mode:
Diffstat (limited to 'main.go')
-rw-r--r--main.go205
1 files changed, 32 insertions, 173 deletions
diff --git a/main.go b/main.go
index f7a85d2..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
@@ -23,34 +19,34 @@ type Key struct {
Fn func(*xgb.Conn)
}
+// TODO rewrite tagging system
type Client struct {
- Win xproto.Window
- X int16
- Y int16
- Width uint16
- Height uint16
- Floating bool
- Tags BitMask
+ Win xproto.Window
+ X int16
+ Y int16
+ Width uint16
+ Height uint16
+ Floating bool
+ Tags BitMask
+ Next *Client
+ Previous *Client
+ MasterTags BitMask
}
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 (
@@ -119,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)
}
@@ -180,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", "-Z", "32")
- },
- },
- {
- 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
@@ -434,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
@@ -457,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)
}
@@ -469,6 +328,7 @@ func switchTags(conn *xgb.Conn, tags BitMask) {
GlobalTags = tags
// unmap everything
+
for _, client := range clients {
xproto.UnmapWindow(conn, client.Win)
}
@@ -624,10 +484,9 @@ func createBar(conn *xgb.Conn) {
root := screen.Root
// create the window
- // TODO: make this actually black and not green for some reason :D
cw := []uint32{
+ barColor, // should be black background
xproto.EventMaskExposure, // redraw on expose
- uint32(0x00000000), // "black" background (its green)
}
barWindow, _ = xproto.NewWindowId(conn)
@@ -704,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)