aboutsummaryrefslogtreecommitdiffhomepage
path: root/freedowm.py
diff options
context:
space:
mode:
authorMarvin Borner2019-06-07 16:24:14 +0200
committerMarvin Borner2019-06-07 16:24:14 +0200
commitaee9b49284b64bc8ccb8adb93af20d85ac036043 (patch)
tree19558b15eff5a50b732c33871a7aa7764740f316 /freedowm.py
parent2cc65aff936ea473432281a414bcd387a40e3d58 (diff)
Added tag based multi-desktop support
Diffstat (limited to 'freedowm.py')
-rw-r--r--freedowm.py56
1 files changed, 47 insertions, 9 deletions
diff --git a/freedowm.py b/freedowm.py
index d8688de..7ee10a1 100644
--- a/freedowm.py
+++ b/freedowm.py
@@ -36,6 +36,7 @@ class FreedoWM(object):
self.startup = True
self.program_stack = []
self.program_stack_index = -1
+ self.current_tag = 1
self.monitors = []
self.monitor_id = self.zero_coordinate = self.x_center = self.y_center = 0
@@ -92,14 +93,21 @@ class FreedoWM(object):
self.log(self.monitors)
window.destroy()
+ def to_key(self, key_name):
+ """
+ Returns the keycode of the requested key
+ :param key_name: The key as string (e.g. "T")
+ :return:
+ """
+ return self.display.keysym_to_keycode(XK.string_to_keysym(key_name))
+
def is_key(self, key_name):
"""
Checks whether a key has been pressed
:param key_name: The key that should be checked
:return:
"""
- return self.event.type == X.KeyPress and \
- self.event.detail == self.display.keysym_to_keycode(XK.string_to_keysym(key_name))
+ return self.event.type == X.KeyPress and self.event.detail == self.to_key(key_name)
def window_focused(self):
"""
@@ -156,6 +164,19 @@ class FreedoWM(object):
if child not in self.tiling_windows[self.monitor_id]:
self.tiling_windows[self.monitor_id].append(child)
+ def update_tags(self):
+ """
+ Updates the appearance of different tags/desktops
+ :return:
+ """
+ for program in self.program_stack:
+ if program["tag"] == self.current_tag:
+ self.log("SHOW WINDOW")
+ program["window"].map()
+ else:
+ self.log("HIDE WINDOW")
+ program["window"].unmap()
+
def update_windows(self):
"""
Handles several window events
@@ -168,7 +189,7 @@ class FreedoWM(object):
if not self.ignore_actions:
self.log("NEW WINDOW")
window = self.event.window
- self.program_stack.append(window)
+ self.program_stack.append({"window": window, "tag": self.current_tag})
self.program_stack_index = len(self.program_stack) - 1
if self.tiling_state:
self.tiling_windows[self.monitor_id].append(window)
@@ -189,13 +210,16 @@ class FreedoWM(object):
try:
if not self.ignore_actions:
self.log("CLOSE WINDOW")
- if self.event.window in self.program_stack:
- self.program_stack.remove(self.event.window)
+ if {"window": self.event.window, "tag": self.current_tag} \
+ in self.program_stack:
+ self.program_stack.remove(
+ {"window": self.event.window, "tag": self.current_tag}
+ )
if self.tiling_state:
self.tiling_windows[self.monitor_id].remove(self.event.window)
self.update_tiling()
elif len(self.program_stack) > 0:
- focused_window = self.program_stack[0]
+ focused_window = self.program_stack[0]["window"]
focused_window.configure(stack_mode=X.Above)
self.root.warp_pointer(
round(focused_window.get_geometry().x + focused_window.get_geometry().width / 2),
@@ -217,7 +241,9 @@ class FreedoWM(object):
self.currently_focused = self.event.child
self.set_border(self.currently_focused, self.colors["ACTIVE_BORDER"])
self.currently_focused.configure(stack_mode=X.Above)
- self.program_stack_index = self.program_stack.index(self.currently_focused)
+ self.program_stack_index = self.program_stack.index(
+ {"window": self.currently_focused, "tag": self.current_tag}
+ )
elif self.root.query_pointer().child not in (self.currently_focused, X.NONE):
if self.currently_focused is not None:
self.log("RESET BORDER")
@@ -226,7 +252,9 @@ class FreedoWM(object):
self.currently_focused = self.root.query_pointer().child
self.set_border(self.currently_focused, self.colors["ACTIVE_BORDER"])
self.currently_focused.configure(stack_mode=X.Above)
- self.program_stack_index = self.program_stack.index(self.currently_focused)
+ self.program_stack_index = self.program_stack.index(
+ {"window": self.currently_focused, "tag": self.current_tag}
+ )
# Update current monitor
if self.event.type == X.NotifyPointerRoot or self.startup:
@@ -281,7 +309,9 @@ class FreedoWM(object):
self.program_stack_index = 0
else:
self.program_stack_index += 1
- active_window = self.program_stack[self.program_stack_index]
+ self.current_tag = self.program_stack[self.program_stack_index]["tag"]
+ self.update_tags()
+ active_window = self.program_stack[self.program_stack_index]["window"]
active_window.configure(stack_mode=X.Above)
self.root.warp_pointer(
round(active_window.get_geometry().x + active_window.get_geometry().width / 2),
@@ -342,6 +372,14 @@ class FreedoWM(object):
self.display.close()
sys.exit()
+ elif self.event.type == X.KeyPress and self.event.detail in \
+ [self.to_key(self.keys["TAG0"]), self.to_key(self.keys["TAG1"]), self.to_key(self.keys["TAG2"]),
+ self.to_key(self.keys["TAG3"]), self.to_key(self.keys["TAG4"]), self.to_key(self.keys["TAG5"]),
+ self.to_key(self.keys["TAG6"]), self.to_key(self.keys["TAG7"]), self.to_key(self.keys["TAG8"])]:
+ self.current_tag = int(XK.keysym_to_string(self.display.keycode_to_keysym(self.event.detail, 0)))
+ self.log("SHIFT TAG TO " + str(self.current_tag))
+ self.update_tags()
+
elif self.event.type == X.ButtonRelease:
self.start = None