From f5062dc7183c69cfdc1d036f16d3e3ccdd83d1d7 Mon Sep 17 00:00:00 2001 From: crecher Date: Wed, 2 Sep 2026 15:19:37 +0200 Subject: started new tag system --- main.go | 46 ++++++++++++++++++++++++++++++++++++++-------- 1 file changed, 38 insertions(+), 8 deletions(-) diff --git a/main.go b/main.go index f7a85d2..c4f6905 100644 --- a/main.go +++ b/main.go @@ -23,14 +23,18 @@ 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 ( @@ -194,7 +198,7 @@ func setupKeys(conn *xgb.Conn) { Mod: mod, Sym: keysym.XK_Return, Fn: func(conn *xgb.Conn) { - spawn("st", "-Z", "32") + spawn("st") }, }, { @@ -469,6 +473,7 @@ func switchTags(conn *xgb.Conn, tags BitMask) { GlobalTags = tags // unmap everything + for _, client := range clients { xproto.UnmapWindow(conn, client.Win) } @@ -476,6 +481,24 @@ func switchTags(conn *xgb.Conn, tags BitMask) { updateWindows(conn) } +func switchTagsNew(conn *xgb.Conn, tags BitMask) { + GlobalTags = tags + // master := nil + // unmap everything + // + for _, client := range clients { + xproto.UnmapWindow(conn, client.Win) + if client.Tags >= tags && client.MasterTags != tags { + client.MasterTags = tags + master := client + } + } + + updateNew(conn, master) + + // find and map master window -> map next until next == nil +} + func tileVertical(conn *xgb.Conn) { screen := xproto.Setup(conn).DefaultScreen(conn) screenWidth := int(screen.WidthInPixels) @@ -702,6 +725,13 @@ func getWindowTitle(conn *xgb.Conn, win xproto.Window) string { return string(prop.Value) } +func updateNew(conn *xgb.Conn, client Client) { + xproto.MapWindow(conn, client.Win) + if client.Next != nil { + updateNew(conn, *client.Next) + } +} + func updateWindows(conn *xgb.Conn) { ActiveClients = ActiveClients[:0] for _, client := range clients { -- cgit v1.2.3 From 30aed3099e557d7096ac05b532415795e1b0ac39 Mon Sep 17 00:00:00 2001 From: crecher Date: Thu, 17 Sep 2026 18:50:53 +0200 Subject: BAR ACTUALLY KIS THE CORRECT COLOR NOW!!1 1 im an idiot :D --- config/config.go | 1 + main.go | 28 +--------------------------- 2 files changed, 2 insertions(+), 27 deletions(-) diff --git a/config/config.go b/config/config.go index 9539280..c8f58f6 100644 --- a/config/config.go +++ b/config/config.go @@ -2,6 +2,7 @@ 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 c4f6905..373e87c 100644 --- a/main.go +++ b/main.go @@ -481,24 +481,6 @@ func switchTags(conn *xgb.Conn, tags BitMask) { updateWindows(conn) } -func switchTagsNew(conn *xgb.Conn, tags BitMask) { - GlobalTags = tags - // master := nil - // unmap everything - // - for _, client := range clients { - xproto.UnmapWindow(conn, client.Win) - if client.Tags >= tags && client.MasterTags != tags { - client.MasterTags = tags - master := client - } - } - - updateNew(conn, master) - - // find and map master window -> map next until next == nil -} - func tileVertical(conn *xgb.Conn) { screen := xproto.Setup(conn).DefaultScreen(conn) screenWidth := int(screen.WidthInPixels) @@ -647,10 +629,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{ + config.BarColor, // should be black background xproto.EventMaskExposure, // redraw on expose - uint32(0x00000000), // "black" background (its green) } barWindow, _ = xproto.NewWindowId(conn) @@ -725,13 +706,6 @@ func getWindowTitle(conn *xgb.Conn, win xproto.Window) string { return string(prop.Value) } -func updateNew(conn *xgb.Conn, client Client) { - xproto.MapWindow(conn, client.Win) - if client.Next != nil { - updateNew(conn, *client.Next) - } -} - func updateWindows(conn *xgb.Conn) { ActiveClients = ActiveClients[:0] for _, client := range clients { -- cgit v1.2.3 From 829b3b3de104c9aea3a16258a08a5337111d5efb Mon Sep 17 00:00:00 2001 From: crecher Date: Thu, 17 Sep 2026 19:09:23 +0200 Subject: new tag system :) gonna merge branch to master now ig --- config.go | 163 ++++++++++++++++++++++++++++++++++++++++++++++++ config/config.go | 8 --- main.go | 185 ++++++------------------------------------------------- 3 files changed, 183 insertions(+), 173 deletions(-) create mode 100644 config.go delete mode 100644 config/config.go 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) -- cgit v1.2.3