aboutsummaryrefslogtreecommitdiffhomepage
diff options
context:
space:
mode:
-rw-r--r--.gitignore70
-rw-r--r--README.md1
-rw-r--r--freedowm-session5
-rw-r--r--freedowm.desktop11
-rw-r--r--freedowm.py79
-rwxr-xr-xinstall.sh5
-rw-r--r--setup.py25
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",
+ ]
+)