diff --git a/README.md b/README.md index be118dd..2357c6c 100644 --- a/README.md +++ b/README.md @@ -29,6 +29,7 @@ DWN is a **window manager** - the program that controls how windows look and beh - 3 window layouts: Tiling (windows don't overlap), Floating (like normal), Monocle (fullscreen) - 9 virtual workspaces to organize your windows - Built-in panels with clock, taskbar, and system tray +- XDG Autostart support (automatically starts nm-applet, blueman, etc.) - WiFi network selector with dropdown menu (like XFCE) - Audio volume indicator with scroll-to-adjust - Desktop notifications @@ -102,6 +103,7 @@ sudo make install | `Super + Backspace` | **Exit DWN** (important!) | | `Super + S` | **Show all shortcuts** | | `Super + T` | **Start interactive tutorial** | +| `Super + Shift + D` | **Demo mode** (automated feature showcase) | ### Workspaces @@ -116,9 +118,10 @@ sudo make install | Keys | What it does | |------|--------------| -| `Super + F9` | Toggle floating mode | +| `Alt + F9` | Toggle minimize/restore | | `Alt + F10` | Toggle maximize | | `Alt + F11` | Toggle fullscreen | +| `Super + F9` | Toggle floating mode | | `Alt + Tab` | Cycle windows forward | | `Alt + Shift + Tab` | Cycle windows backward | @@ -131,6 +134,8 @@ sudo make install | `Super + L` | Expand main area | | `Super + I` | Add window to main area | | `Super + D` | Remove window from main area | +| `Super + Left` | Snap window to left half (50% width) | +| `Super + Right` | Snap window to right half (50% width) | ### AI Features (Optional) @@ -160,7 +165,22 @@ The bottom panel displays a scrolling news ticker. Navigate articles with these ## System Tray -The top panel includes a system tray on the right side with battery, audio, and WiFi indicators. +The top panel includes a system tray on the right side with support for external application icons plus built-in battery, audio, and WiFi indicators. + +### XEmbed System Tray (External Application Icons) + +DWN implements the freedesktop.org XEmbed System Tray protocol, allowing external applications to dock their status icons in the panel - just like XFCE, GNOME, or KDE. This means applications like: + +- **Telegram** - Shows notification icon when messages arrive +- **nm-applet** - NetworkManager GUI applet +- **blueman-applet** - Bluetooth manager +- **pasystray** - PulseAudio volume control +- **udiskie** - USB device automounter +- **clipit/parcellite** - Clipboard managers + +...will automatically appear in your system tray when launched. + +Simply start any application with tray icon support and it will dock itself in the panel. Click on icons to interact with them - clicks are forwarded to the application. ### Battery Indicator @@ -243,6 +263,25 @@ gap = 10 border_width = 2 ``` +**Configure autostart:** +```ini +[autostart] +enabled = true +xdg_autostart = true +path = ~/.config/dwn/autostart.d +``` + +DWN automatically starts applications from XDG autostart directories: +- `/etc/xdg/autostart/` - System apps (nm-applet, blueman, etc.) +- `~/.config/autostart/` - User apps +- `~/.config/dwn/autostart.d/` - DWN-specific symlinks + +To add custom autostart apps: +```bash +mkdir -p ~/.config/dwn/autostart.d +ln -s /usr/bin/telegram-desktop ~/.config/dwn/autostart.d/ +``` + --- ## AI Features (Optional) diff --git a/bin/dwn b/bin/dwn index 08a379b..1a1b4c0 100755 Binary files a/bin/dwn and b/bin/dwn differ diff --git a/build/ai.o b/build/ai.o index 99bdaca..b176314 100644 Binary files a/build/ai.o and b/build/ai.o differ diff --git a/build/atoms.o b/build/atoms.o index bfcc609..92f6d58 100644 Binary files a/build/atoms.o and b/build/atoms.o differ diff --git a/build/autostart.d b/build/autostart.d new file mode 100644 index 0000000..71d1116 --- /dev/null +++ b/build/autostart.d @@ -0,0 +1,7 @@ +build/autostart.o: src/autostart.c include/autostart.h include/dwn.h \ + include/config.h include/dwn.h include/util.h +include/autostart.h: +include/dwn.h: +include/config.h: +include/dwn.h: +include/util.h: diff --git a/build/autostart.o b/build/autostart.o new file mode 100644 index 0000000..b31f73a Binary files /dev/null and b/build/autostart.o differ diff --git a/build/client.o b/build/client.o index abf18c7..7f284f0 100644 Binary files a/build/client.o and b/build/client.o differ diff --git a/build/config.o b/build/config.o index 4d7415e..ddc2281 100644 Binary files a/build/config.o and b/build/config.o differ diff --git a/build/decorations.o b/build/decorations.o index 9e3a5b6..47ec16a 100644 Binary files a/build/decorations.o and b/build/decorations.o differ diff --git a/build/demo.d b/build/demo.d new file mode 100644 index 0000000..bfd718e --- /dev/null +++ b/build/demo.d @@ -0,0 +1,52 @@ +build/demo.o: src/demo.c include/demo.h include/dwn.h \ + include/notifications.h include/dwn.h /usr/include/dbus-1.0/dbus/dbus.h \ + /usr/lib/x86_64-linux-gnu/dbus-1.0/include/dbus/dbus-arch-deps.h \ + /usr/include/dbus-1.0/dbus/dbus-macros.h \ + /usr/include/dbus-1.0/dbus/dbus-address.h \ + /usr/include/dbus-1.0/dbus/dbus-types.h \ + /usr/include/dbus-1.0/dbus/dbus-errors.h \ + /usr/include/dbus-1.0/dbus/dbus-protocol.h \ + /usr/include/dbus-1.0/dbus/dbus-bus.h \ + /usr/include/dbus-1.0/dbus/dbus-connection.h \ + /usr/include/dbus-1.0/dbus/dbus-memory.h \ + /usr/include/dbus-1.0/dbus/dbus-message.h \ + /usr/include/dbus-1.0/dbus/dbus-shared.h \ + /usr/include/dbus-1.0/dbus/dbus-misc.h \ + /usr/include/dbus-1.0/dbus/dbus-pending-call.h \ + /usr/include/dbus-1.0/dbus/dbus-server.h \ + /usr/include/dbus-1.0/dbus/dbus-signature.h \ + /usr/include/dbus-1.0/dbus/dbus-syntax.h \ + /usr/include/dbus-1.0/dbus/dbus-threads.h include/workspace.h \ + include/client.h include/layout.h include/keys.h include/ai.h \ + include/news.h include/util.h include/panel.h include/config.h +include/demo.h: +include/dwn.h: +include/notifications.h: +include/dwn.h: +/usr/include/dbus-1.0/dbus/dbus.h: +/usr/lib/x86_64-linux-gnu/dbus-1.0/include/dbus/dbus-arch-deps.h: +/usr/include/dbus-1.0/dbus/dbus-macros.h: +/usr/include/dbus-1.0/dbus/dbus-address.h: +/usr/include/dbus-1.0/dbus/dbus-types.h: +/usr/include/dbus-1.0/dbus/dbus-errors.h: +/usr/include/dbus-1.0/dbus/dbus-protocol.h: +/usr/include/dbus-1.0/dbus/dbus-bus.h: +/usr/include/dbus-1.0/dbus/dbus-connection.h: +/usr/include/dbus-1.0/dbus/dbus-memory.h: +/usr/include/dbus-1.0/dbus/dbus-message.h: +/usr/include/dbus-1.0/dbus/dbus-shared.h: +/usr/include/dbus-1.0/dbus/dbus-misc.h: +/usr/include/dbus-1.0/dbus/dbus-pending-call.h: +/usr/include/dbus-1.0/dbus/dbus-server.h: +/usr/include/dbus-1.0/dbus/dbus-signature.h: +/usr/include/dbus-1.0/dbus/dbus-syntax.h: +/usr/include/dbus-1.0/dbus/dbus-threads.h: +include/workspace.h: +include/client.h: +include/layout.h: +include/keys.h: +include/ai.h: +include/news.h: +include/util.h: +include/panel.h: +include/config.h: diff --git a/build/demo.o b/build/demo.o new file mode 100644 index 0000000..6ff6f6b Binary files /dev/null and b/build/demo.o differ diff --git a/build/keys.d b/build/keys.d index 885058c..94fa0ec 100644 --- a/build/keys.d +++ b/build/keys.d @@ -18,7 +18,7 @@ build/keys.o: src/keys.c include/keys.h include/dwn.h include/client.h \ /usr/include/dbus-1.0/dbus/dbus-signature.h \ /usr/include/dbus-1.0/dbus/dbus-syntax.h \ /usr/include/dbus-1.0/dbus/dbus-threads.h include/news.h \ - include/applauncher.h + include/applauncher.h include/decorations.h include/demo.h include/keys.h: include/dwn.h: include/client.h: @@ -47,3 +47,5 @@ include/notifications.h: /usr/include/dbus-1.0/dbus/dbus-threads.h: include/news.h: include/applauncher.h: +include/decorations.h: +include/demo.h: diff --git a/build/keys.o b/build/keys.o index 59b81d4..4e9c12b 100644 Binary files a/build/keys.o and b/build/keys.o differ diff --git a/build/main.d b/build/main.d index 1fdc703..e3b9a48 100644 --- a/build/main.d +++ b/build/main.d @@ -19,7 +19,8 @@ build/main.o: src/main.c include/dwn.h include/config.h include/dwn.h \ /usr/include/dbus-1.0/dbus/dbus-signature.h \ /usr/include/dbus-1.0/dbus/dbus-syntax.h \ /usr/include/dbus-1.0/dbus/dbus-threads.h include/systray.h \ - include/news.h include/applauncher.h include/ai.h include/util.h + include/news.h include/applauncher.h include/ai.h include/autostart.h \ + include/demo.h include/util.h include/dwn.h: include/config.h: include/dwn.h: @@ -53,4 +54,6 @@ include/systray.h: include/news.h: include/applauncher.h: include/ai.h: +include/autostart.h: +include/demo.h: include/util.h: diff --git a/build/main.o b/build/main.o index dff840f..261813d 100644 Binary files a/build/main.o and b/build/main.o differ diff --git a/build/news.o b/build/news.o index 5993552..a414091 100644 Binary files a/build/news.o and b/build/news.o differ diff --git a/build/notifications.o b/build/notifications.o index 83bacb5..4dc1e10 100644 Binary files a/build/notifications.o and b/build/notifications.o differ diff --git a/build/panel.o b/build/panel.o index 3e45e4a..6cc1a11 100644 Binary files a/build/panel.o and b/build/panel.o differ diff --git a/build/systray.d b/build/systray.d index 99b72c6..00de802 100644 --- a/build/systray.d +++ b/build/systray.d @@ -17,7 +17,7 @@ build/systray.o: src/systray.c include/systray.h include/dwn.h \ /usr/include/dbus-1.0/dbus/dbus-server.h \ /usr/include/dbus-1.0/dbus/dbus-signature.h \ /usr/include/dbus-1.0/dbus/dbus-syntax.h \ - /usr/include/dbus-1.0/dbus/dbus-threads.h + /usr/include/dbus-1.0/dbus/dbus-threads.h include/atoms.h include/systray.h: include/dwn.h: include/panel.h: @@ -42,3 +42,4 @@ include/notifications.h: /usr/include/dbus-1.0/dbus/dbus-signature.h: /usr/include/dbus-1.0/dbus/dbus-syntax.h: /usr/include/dbus-1.0/dbus/dbus-threads.h: +include/atoms.h: diff --git a/build/systray.o b/build/systray.o index 12fc721..8b8e820 100644 Binary files a/build/systray.o and b/build/systray.o differ diff --git a/build/workspace.d b/build/workspace.d index bf10441..d774e11 100644 --- a/build/workspace.d +++ b/build/workspace.d @@ -1,6 +1,6 @@ build/workspace.o: src/workspace.c include/workspace.h include/dwn.h \ include/client.h include/layout.h include/atoms.h include/util.h \ - include/config.h + include/config.h include/panel.h include/workspace.h: include/dwn.h: include/client.h: @@ -8,3 +8,4 @@ include/layout.h: include/atoms.h: include/util.h: include/config.h: +include/panel.h: diff --git a/build/workspace.o b/build/workspace.o index cf10d4b..3a772ae 100644 Binary files a/build/workspace.o and b/build/workspace.o differ diff --git a/config/config.example b/config/config.example index c53dcbe..100eedd 100644 --- a/config/config.example +++ b/config/config.example @@ -91,3 +91,16 @@ model = google/gemini-2.0-flash-exp:free # Can also be set via EXA_API_KEY environment variable # Sign up and get your key at: https://dashboard.exa.ai/api-keys # exa_api_key = your-exa-key-here + +[autostart] +# Enable XDG autostart support (default: true) +# Automatically starts applications from XDG autostart directories +enabled = true + +# Scan XDG .desktop files (default: true) +# Directories: /etc/xdg/autostart and ~/.config/autostart +xdg_autostart = true + +# Additional directory for symlinks and scripts (default: ~/.config/dwn/autostart.d) +# Create symlinks to binaries you want to start: ln -s /usr/bin/telegram-desktop ~/.config/dwn/autostart.d/ +path = ~/.config/dwn/autostart.d diff --git a/include/atoms.h b/include/atoms.h index e05dd44..fb76db1 100644 --- a/include/atoms.h +++ b/include/atoms.h @@ -76,6 +76,8 @@ typedef struct { Atom NET_SYSTEM_TRAY_OPCODE; Atom NET_SYSTEM_TRAY_S0; + Atom NET_SYSTEM_TRAY_ORIENTATION; + Atom NET_SYSTEM_TRAY_VISUAL; Atom MANAGER; Atom XEMBED; Atom XEMBED_INFO; @@ -130,4 +132,6 @@ void atoms_send_protocol(Window window, Atom protocol, Time timestamp); void atoms_send_client_message(Window window, Atom message_type, long data0, long data1, long data2, long data3, long data4); +bool atoms_update_wm_state(Window window, Atom state, bool add); + #endif diff --git a/include/autostart.h b/include/autostart.h new file mode 100644 index 0000000..34b58ab --- /dev/null +++ b/include/autostart.h @@ -0,0 +1,14 @@ +/* + * DWN - Desktop Window Manager + * retoor + * XDG Autostart support + */ + +#ifndef DWN_AUTOSTART_H +#define DWN_AUTOSTART_H + +void autostart_init(void); +void autostart_run(void); +void autostart_cleanup(void); + +#endif diff --git a/include/config.h b/include/config.h index 60a34f8..b7d4ba6 100644 --- a/include/config.h +++ b/include/config.h @@ -54,6 +54,10 @@ struct Config { char config_path[512]; char log_path[512]; + + bool autostart_enabled; + bool autostart_xdg; + char autostart_path[512]; }; Config *config_create(void); diff --git a/include/demo.h b/include/demo.h new file mode 100644 index 0000000..d2de378 --- /dev/null +++ b/include/demo.h @@ -0,0 +1,36 @@ +/* + * DWN - Desktop Window Manager + * retoor + * Demo mode - automated feature showcase + */ + +#ifndef DWN_DEMO_H +#define DWN_DEMO_H + +#include + +typedef enum { + DEMO_IDLE, + DEMO_INTRO, + DEMO_WINDOW_MGMT, + DEMO_WORKSPACES, + DEMO_LAYOUTS, + DEMO_SNAPPING, + DEMO_PANELS, + DEMO_AI, + DEMO_NEWS, + DEMO_SHORTCUTS, + DEMO_COMPLETE +} DemoPhase; + +void demo_init(void); +void demo_cleanup(void); +void demo_start(void); +void demo_stop(void); +void demo_update(void); +bool demo_is_active(void); +DemoPhase demo_get_phase(void); +int demo_get_step(void); +const char *demo_get_phase_name(DemoPhase phase); + +#endif diff --git a/include/keys.h b/include/keys.h index abcfa67..cba08ee 100644 --- a/include/keys.h +++ b/include/keys.h @@ -50,6 +50,7 @@ void key_cycle_layout(void); void key_toggle_floating(void); void key_toggle_fullscreen(void); void key_toggle_maximize(void); +void key_toggle_minimize(void); void key_focus_next(void); void key_focus_prev(void); void key_workspace_next(void); @@ -80,6 +81,9 @@ void key_toggle_ai(void); void key_ai_command(void); void key_show_shortcuts(void); void key_start_tutorial(void); +void key_snap_left(void); +void key_snap_right(void); +void key_start_demo(void); void tutorial_start(void); void tutorial_stop(void); diff --git a/include/panel.h b/include/panel.h index a58ebc7..4be2bdb 100644 --- a/include/panel.h +++ b/include/panel.h @@ -45,6 +45,7 @@ Client *panel_hit_test_taskbar(Panel *panel, int x, int y); void panel_show(Panel *panel); void panel_hide(Panel *panel); void panel_toggle(Panel *panel); +void panel_raise_all(void); void panel_update_clock(void); diff --git a/include/systray.h b/include/systray.h index 2ffde53..f7f79d3 100644 --- a/include/systray.h +++ b/include/systray.h @@ -1,7 +1,7 @@ /* * DWN - Desktop Window Manager * retoor - * System tray widgets (WiFi, Audio, etc.) + * System tray widgets (WiFi, Audio, etc.) and XEmbed protocol */ #ifndef DWN_SYSTRAY_H @@ -11,6 +11,35 @@ #include #define MAX_WIFI_NETWORKS 20 +#define MAX_TRAY_ICONS 32 +#define TRAY_ICON_SIZE 22 +#define TRAY_ICON_SPACING 4 + +#define SYSTEM_TRAY_REQUEST_DOCK 0 +#define SYSTEM_TRAY_BEGIN_MESSAGE 1 +#define SYSTEM_TRAY_CANCEL_MESSAGE 2 + +#define XEMBED_EMBEDDED_NOTIFY 0 +#define XEMBED_WINDOW_ACTIVATE 1 +#define XEMBED_WINDOW_DEACTIVATE 2 +#define XEMBED_REQUEST_FOCUS 3 +#define XEMBED_FOCUS_IN 4 +#define XEMBED_FOCUS_OUT 5 + +#define XEMBED_MAPPED (1 << 0) +#define XEMBED_PROTOCOL_VERSION 0 + +typedef struct { + Window window; + int x; + int width; + int height; + bool mapped; +} TrayIcon; + +extern TrayIcon tray_icons[MAX_TRAY_ICONS]; +extern int tray_icon_count; +extern Window tray_selection_owner; typedef struct { char ssid[64]; @@ -114,4 +143,16 @@ void systray_unlock(void); BatteryState systray_get_battery_snapshot(void); AudioState systray_get_audio_snapshot(void); +void xembed_init(void); +void xembed_cleanup(void); +bool xembed_dock_icon(Window icon_win); +void xembed_remove_icon(Window icon_win); +TrayIcon *xembed_find_icon(Window icon_win); +void xembed_send_message(Window icon, long message, long detail, long data1, long data2); +int xembed_get_icons_width(void); +void xembed_render_icons(Panel *panel, int x); +void xembed_handle_click(int x, int y, int button); +int xembed_hit_test(int x); +void xembed_update_icon_state(Window icon_win); + #endif diff --git a/site/ai-features.html b/site/ai-features.html index 04e7761..dbeee75 100644 --- a/site/ai-features.html +++ b/site/ai-features.html @@ -26,6 +26,7 @@ Configuration AI Features Architecture + Design Patterns
  • Git
  • @@ -389,6 +390,7 @@ model = google/gemini-2.0-flash-exp:free
  • Keyboard Shortcuts
  • Configuration
  • Architecture
  • +
  • Design Patterns
  • Git
  • @@ -62,7 +63,7 @@
    Lines of Code
    -
    12
    +
    13
    Core Modules
    @@ -170,6 +171,11 @@ ai.c Async OpenRouter API integration, Exa semantic search + + Autostart + autostart.c + XDG Autostart support, .desktop file parsing, concurrent app launch + Util util.c @@ -196,6 +202,8 @@ │ └── config.c ├── notifications.c (independent) ├── ai.c (independent) + ├── autostart.c + │ └── config.c └── keys.c └── config.c
    @@ -490,6 +498,7 @@ extern DWNState *dwn; // Global singleton
  • Keyboard Shortcuts
  • Configuration
  • Architecture
  • +
  • Design Patterns
  • Git
  • @@ -387,6 +388,50 @@ exa_api_key = your-exa-key-here

    For better security, use environment variables instead of storing API keys in the config file: export OPENROUTER_API_KEY=sk-or-v1-...

    +

    [autostart] - XDG Autostart

    +

    + Configure automatic application startup. DWN follows the XDG Autostart specification. +

    +
    + + + + + + + + + + + + + + + + + + + + + +
    OptionDescription
    enabledEnable/disable all autostart functionality (default: true)
    xdg_autostartScan XDG .desktop files from /etc/xdg/autostart and ~/.config/autostart (default: true)
    pathAdditional directory for symlinks/scripts (default: ~/.config/dwn/autostart.d)
    +
    +
    + Example + +
    +
    [autostart]
    +enabled = true
    +xdg_autostart = true
    +path = ~/.config/dwn/autostart.d
    +

    + Directories scanned: +

    +
      +
    • /etc/xdg/autostart/ - System defaults (nm-applet, blueman, power-manager)
    • +
    • ~/.config/autostart/ - User XDG autostart entries
    • +
    • ~/.config/dwn/autostart.d/ - DWN-specific symlinks and scripts
    • +

    Complete Configuration Example

    ~/.config/dwn/config @@ -429,7 +474,11 @@ notification_bg = #2a2a3e notification_fg = #ffffff [ai] model = google/gemini-2.0-flash-exp:free -# API keys via environment variables recommended +# API keys via environment variables recommended +[autostart] +enabled = true +xdg_autostart = true +path = ~/.config/dwn/autostart.d
    @@ -450,6 +499,7 @@ model = google/gemini-2.0-flash-exp:free
  • Keyboard Shortcuts
  • Configuration
  • Architecture
  • +
  • Design Patterns
  • Git
  • @@ -366,6 +367,7 @@
  • Keyboard Shortcuts
  • Configuration
  • Architecture
  • +
  • Design Patterns
  • Git
  • @@ -168,7 +169,42 @@ at 80 pixels per second keeps you informed without distraction.

    -

    System Tray Features

    +

    XEmbed System Tray

    +
    +

    📱 External Application Icons

    +

    DWN implements the freedesktop.org XEmbed System Tray protocol, allowing external applications + to dock their status icons in the panel - just like XFCE, GNOME, or KDE.

    +

    Supported applications include:

    +
      +
    • Telegram - Notification icons for messages
    • +
    • nm-applet - NetworkManager GUI
    • +
    • blueman-applet - Bluetooth manager
    • +
    • pasystray - PulseAudio control
    • +
    • udiskie - USB automounter
    • +
    • Any application with tray icon support
    • +
    +

    + Simply launch any tray-enabled application and its icon will automatically appear in the panel. + Click on icons to interact - all events are forwarded to the application. +

    +
    +

    XDG Autostart

    +
    +

    Automatic Application Startup

    +

    DWN follows the XDG Autostart specification, automatically starting system services + and tray applications - just like traditional desktop environments.

    +

    Directories scanned at startup:

    +
      +
    • /etc/xdg/autostart/ - System defaults (nm-applet, blueman, power-manager)
    • +
    • ~/.config/autostart/ - User XDG autostart entries
    • +
    • ~/.config/dwn/autostart.d/ - DWN-specific symlinks and scripts
    • +
    +

    + All applications launch concurrently for fastest boot time. Properly handles .desktop + file fields including Hidden, TryExec, OnlyShowIn, and NotShowIn. +

    +
    +

    Built-in Widgets

    🔋 Battery Monitor

    @@ -336,6 +372,37 @@
    +
    +
    +

    Learning DWN

    +

    + Two built-in modes help you learn DWN quickly: an interactive tutorial and + an automated demo that showcases all features. +

    +
    +
    +

    📚 Interactive Tutorial

    +

    Press Super + T to start a hands-on tutorial that:

    +
      +
    • Guides you through essential shortcuts step-by-step
    • +
    • Waits for you to press the correct key combination
    • +
    • Automatically advances when you complete each step
    • +
    • Can be restarted at any time
    • +
    +
    +
    +

    🎬 Demo Mode

    +

    Press Super + Shift + D for an automated showcase:

    +
      +
    • Demonstrates window management, workspaces, and layouts
    • +
    • Shows panel features and system tray
    • +
    • Highlights AI integration and news ticker
    • +
    • Displays complete keyboard shortcut reference
    • +
    +
    +
    +
    +

    Ready to Try DWN?

    @@ -366,6 +433,7 @@
  • Keyboard Shortcuts
  • Configuration
  • Architecture
  • +
  • Design Patterns
  • Git
  • @@ -93,8 +94,14 @@
    💻

    System Tray

    -

    Integrated system tray with battery, volume, and WiFi indicators. - Volume slider and network selection dropdowns included.

    +

    XEmbed protocol for external app icons (Telegram, Bluetooth, etc.) plus + built-in battery, volume, and WiFi widgets with interactive controls.

    +
    +
    +
    +

    XDG Autostart

    +

    Automatic startup of system services and tray applications following the + XDG Autostart spec. Works with nm-applet, blueman, and more.

    @@ -249,6 +256,7 @@ echo "exec dwn" >> ~/.xinitrc
  • Keyboard Shortcuts
  • Configuration
  • Architecture
  • +
  • Design Patterns
  • Git
  • @@ -528,6 +529,7 @@ sudo dnf install dejavu-fonts-all liberation-fonts # Fedora
  • Keyboard Shortcuts
  • Configuration
  • Architecture
  • +
  • Design Patterns
  • Git
  • @@ -107,6 +108,10 @@ Alt + Shift + Tab Cycle to previous window + + Alt + F9 + Toggle minimize/restore + Alt + F10 Toggle maximize @@ -245,6 +250,14 @@ Super + D Decrease master window count + + Super + Left + Snap window to left half (50% width) + + + Super + Right + Snap window to right half (50% width) + @@ -322,6 +335,10 @@ Super + T Start/continue interactive tutorial + + Super + Shift + D + Start/stop demo mode + Super + Backspace Quit DWN @@ -363,10 +380,10 @@ Super+H/L Resize master
  • - Shift+F1-9 Move to workspace + Super+Left/Right Snap 50%
  • - Super+Shift+A AI command + Shift+F1-9 Move to workspace
  • Super+S Show shortcuts @@ -395,6 +412,7 @@
  • Keyboard Shortcuts
  • Configuration
  • Architecture
  • +
  • Design Patterns