diff options
-rw-r--r-- | .gitignore | 70 | ||||
-rw-r--r-- | README.md | 1 | ||||
-rw-r--r-- | freedowm-session | 5 | ||||
-rw-r--r-- | freedowm.desktop | 11 | ||||
-rw-r--r-- | freedowm.py | 79 | ||||
-rwxr-xr-x | install.sh | 5 | ||||
-rw-r--r-- | setup.py | 25 |
7 files changed, 196 insertions, 0 deletions
diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..7b7e487 --- /dev/null +++ b/.gitignore @@ -0,0 +1,70 @@ + +# Byte-compiled / optimized / DLL files +__pycache__/ +*.py[cod] +*$py.class + +# C extensions +*.so + +# Distribution / packaging +.Python +env/ +build/ +develop-eggs/ +dist/ +downloads/ +eggs/ +.eggs/ +lib/ +lib64/ +parts/ +sdist/ +var/ +*.egg-info/ +.installed.cfg +*.egg + +# PyInstaller +# Usually these files are written by a python script from a template +# before PyInstaller builds the exe, so as to inject date/other infos into it. +*.manifest +*.spec + +# Installer logs +pip-log.txt +pip-delete-this-directory.txt + +# Unit test / coverage reports +htmlcov/ +.tox/ +.coverage +.coverage.* +.cache +nosetests.xml +coverage.xml +*,cover +.hypothesis/ + +# Translations +*.mo +*.pot + +# Django stuff: +*.log +local_settings.py + +# Sphinx documentation +docs/_build/ + +# PyBuilder +target/ + +#Ipython Notebook +.ipynb_checkpoints + +# pyenv +.python-version + +# IntelliJ +.idea
\ No newline at end of file diff --git a/README.md b/README.md new file mode 100644 index 0000000..a8738d5 --- /dev/null +++ b/README.md @@ -0,0 +1 @@ +# FreedoWM
\ No newline at end of file diff --git a/freedowm-session b/freedowm-session new file mode 100644 index 0000000..06c5972 --- /dev/null +++ b/freedowm-session @@ -0,0 +1,5 @@ +#!/bin/sh +xsetroot -solid "#000000" +# feh --bg-scale /path/to/your/image.jpg +xrdb -load $HOME/.Xresources +exec freedowm
\ No newline at end of file diff --git a/freedowm.desktop b/freedowm.desktop new file mode 100644 index 0000000..0fb4145 --- /dev/null +++ b/freedowm.desktop @@ -0,0 +1,11 @@ +[Desktop Entry] +Encoding=UTF-8 +Name=FreedoWM +Comment=A free window manager +Exec=freedowm-session +Terminal=False +TryExec=freedowm +Type=Application + +[Window Manager] +SessionManaged=true
\ No newline at end of file diff --git a/freedowm.py b/freedowm.py new file mode 100644 index 0000000..14edbc8 --- /dev/null +++ b/freedowm.py @@ -0,0 +1,79 @@ +#!/usr/bin/env python3.7 + +import sys +from os import system +from Xlib.display import Display +from Xlib import X, XK + +display = Display() +num = display.get_display_name() + +# Window raiser listener +display.screen().root.grab_key(display.keysym_to_keycode(XK.string_to_keysym("k")), + X.Mod4Mask, 1, X.GrabModeAsync, X.GrabModeAsync) + +# Terminal listener +display.screen().root.grab_key(display.keysym_to_keycode(XK.string_to_keysym("enter")), + X.Mod4Mask, 1, X.GrabModeAsync, X.GrabModeAsync) + +# Dmenu listener +display.screen().root.grab_key(display.keysym_to_keycode(XK.string_to_keysym("d")), + X.Mod4Mask, 1, X.GrabModeAsync, X.GrabModeAsync) + +# Exit listener +display.screen().root.grab_key(display.keysym_to_keycode(XK.string_to_keysym("c")), + X.Mod4Mask, 1, X.GrabModeAsync, X.GrabModeAsync) + +# Window move listener +display.screen().root.grab_button(1, X.Mod4Mask, 1, + X.ButtonPressMask | X.ButtonReleaseMask | X.PointerMotionMask, + X.GrabModeAsync, X.GrabModeAsync, X.NONE, X.NONE) + +# Window resize listener +display.screen().root.grab_button(3, X.Mod4Mask, 1, + X.ButtonPressMask | X.ButtonReleaseMask | X.PointerMotionMask, + X.GrabModeAsync, X.GrabModeAsync, X.NONE, X.NONE) + +start = None + +# Check for actions until exit +while 1: + event = display.next_event() + + # Raise window under cursor (MOD + K) + if event.type == X.KeyPress and event.child != X.NONE and event.detail == 45: + event.child.configure(stack_mode=X.Above) + + # Resize window (MOD + right click) + elif event.type == X.ButtonPress and event.child != X.NONE: + attribute = event.child.get_geometry() + start = event + + # Move window (MOD + left click) + elif event.type == X.MotionNotify and start: + xDiff = event.root_x - start.root_x + yDiff = event.root_y - start.root_y + start.child.configure( + x=attribute.x + (start.detail == 1 and xDiff or 0), + y=attribute.y + (start.detail == 1 and yDiff or 0), + width=max(1, attribute.width + (start.detail == 3 and xDiff or 0)), + height=max(1, attribute.height + (start.detail == 3 and yDiff or 0))) + + # Close program (MOD + Q) + elif event.type == X.KeyPress and event.child != X.NONE and event.detail == 24: + event.child.destroy() + + # Open terminal (MOD + Enter) + elif event.type == X.KeyPress and event.detail == 36: + system("st &") + + # Open dmenu (MOD + D) + elif event.type == X.KeyPress and event.detail == 40: + system("dmenu_run &") + + # Exit window manager (MOD + C) + elif event.type == X.KeyPress and event.detail == 54: + sys.exit() + + elif event.type == X.ButtonRelease: + start = None diff --git a/install.sh b/install.sh new file mode 100755 index 0000000..e65f344 --- /dev/null +++ b/install.sh @@ -0,0 +1,5 @@ +#!/bin/sh +cp freedowm.desktop /usr/share/xsessions/ +cp freedowm-session /usr/bin/ +chmod a+x /usr/bin/freedowm-session +python3.7 setup.py install
\ No newline at end of file diff --git a/setup.py b/setup.py new file mode 100644 index 0000000..604e92e --- /dev/null +++ b/setup.py @@ -0,0 +1,25 @@ +# -*- coding: utf-8 -*- +from setuptools import setup + +try: + long_description = open("README.md").read() +except IOError: + long_description = "" + +setup( + name="FreedoWM", + version="0.1.dev0", + description="A free window manager", + license="BSD", + author="melvin", + install_requires="Xlib", + py_modules=["freedowm"], + entry_points={ + 'console_scripts': ['freedowm = freedowm:main', ] + }, + long_description=long_description, + classifiers=[ + "Programming Language :: Python", + "Programming Language :: Python :: 3.7", + ] +) |