Files
SDG-DRIFT/Ax-Shell/main.py
T
2026-06-03 21:32:45 +02:00

151 lines
5.1 KiB
Python

import os
import gi
gi.require_version("GLib", "2.0")
import setproctitle
from fabric import Application
from fabric.utils import exec_shell_command_async, get_relative_path
from gi.repository import GLib
from config.data import APP_NAME, APP_NAME_CAP, CACHE_DIR, CONFIG_FILE, HOME_DIR
from modules.bar import Bar
from modules.corners import Corners
from modules.dock import Dock
from modules.notch import Notch
from modules.notifications import NotificationPopup
from modules.updater import run_updater
fonts_updated_file = f"{CACHE_DIR}/fonts_updated"
if __name__ == "__main__":
setproctitle.setproctitle(APP_NAME)
if not os.path.isfile(CONFIG_FILE):
config_script_path = get_relative_path("config/config.py")
exec_shell_command_async(f"python {config_script_path}")
current_wallpaper = os.path.expanduser("~/.current.wall")
if not os.path.exists(current_wallpaper):
example_wallpaper = os.path.expanduser(
f"~/.config/{APP_NAME_CAP}/assets/wallpapers_example/example-1.jpg"
)
os.symlink(example_wallpaper, current_wallpaper)
# Load configuration
from config.data import load_config
config = load_config()
GLib.idle_add(run_updater)
# Every hour
GLib.timeout_add(3600000, run_updater)
# Initialize multi-monitor services
try:
from utils.monitor_manager import get_monitor_manager
from services.monitor_focus import get_monitor_focus_service
from utils.global_keybinds import init_global_keybind_objects
monitor_manager = get_monitor_manager()
monitor_focus_service = get_monitor_focus_service()
monitor_manager.set_monitor_focus_service(monitor_focus_service)
init_global_keybind_objects()
# Get all available monitors
all_monitors = monitor_manager.get_monitors()
multi_monitor_enabled = True
except ImportError:
# Fallback to single monitor mode
all_monitors = [{'id': 0, 'name': 'default'}]
monitor_manager = None
multi_monitor_enabled = False
# Filter monitors based on selected_monitors configuration
selected_monitors_config = config.get("selected_monitors", [])
# If selected_monitors is empty, show on all monitors (current behavior)
if not selected_monitors_config:
monitors = all_monitors
print("Ax-Shell: No specific monitors selected, showing on all monitors")
else:
# Filter monitors to only include selected ones
monitors = []
selected_monitor_names = set(selected_monitors_config)
for monitor in all_monitors:
monitor_name = monitor.get('name', f'monitor-{monitor.get("id", 0)}')
if monitor_name in selected_monitor_names:
monitors.append(monitor)
print(f"Ax-Shell: Including monitor '{monitor_name}' (selected)")
else:
print(f"Ax-Shell: Excluding monitor '{monitor_name}' (not selected)")
# Fallback: if no valid monitors found, use all monitors
if not monitors:
print("Ax-Shell: No valid selected monitors found, falling back to all monitors")
monitors = all_monitors
# Create application components list
app_components = []
corners = None
notification = None
# Create components for each monitor
for monitor in monitors:
monitor_id = monitor['id']
# Create corners only for the first monitor (shared across all)
if monitor_id == 0:
corners = Corners()
# Set corners visibility based on config
corners_visible = config.get("corners_visible", True)
corners.set_visible(corners_visible)
app_components.append(corners)
# Create monitor-specific components
if multi_monitor_enabled:
bar = Bar(monitor_id=monitor_id)
notch = Notch(monitor_id=monitor_id)
dock = Dock(monitor_id=monitor_id)
else:
# Single monitor fallback
bar = Bar()
notch = Notch()
dock = Dock()
# Connect bar and notch
bar.notch = notch
notch.bar = bar
# Create notification popup for the first monitor only
if monitor_id == 0:
notification = NotificationPopup(widgets=notch.dashboard.widgets)
app_components.append(notification)
# Register instances in monitor manager if available
if multi_monitor_enabled and monitor_manager:
monitor_manager.register_monitor_instances(monitor_id, {
'bar': bar,
'notch': notch,
'dock': dock,
'corners': corners if monitor_id == 0 else None
})
# Add components to app list
app_components.extend([bar, notch, dock])
# Create the application with all components
app = Application(f"{APP_NAME}", *app_components)
def set_css():
app.set_stylesheet_from_file(
get_relative_path("main.css"),
)
app.set_css = set_css
app.set_css()
app.run()