main.py 1.8 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556
  1. import sys
  2. import os
  3. import asyncio
  4. from pathlib import Path
  5. from PySide6.QtCore import QUrl
  6. from PySide6.QtGui import QGuiApplication
  7. from PySide6.QtQml import QQmlApplicationEngine, qmlRegisterType
  8. from qasync import QEventLoop
  9. from backend import Backend
  10. from models.pattern_model import PatternModel
  11. from models.playlist_model import PlaylistModel
  12. def main():
  13. # Check for kiosk mode flag
  14. kiosk_mode = '--kiosk' in sys.argv or os.environ.get('KIOSK_MODE', '0') == '1'
  15. if kiosk_mode:
  16. # Set Qt platform for fullscreen framebuffer mode
  17. # Use linuxfb (software rendering) instead of eglfs due to EGL compatibility issues
  18. os.environ['QT_QPA_PLATFORM'] = 'linuxfb'
  19. os.environ['QT_QPA_FB_DRM'] = '0' # Disable DRM
  20. print("🖥️ Running in KIOSK MODE (fullscreen 800x480 - linuxfb)")
  21. else:
  22. print("🪟 Running in WINDOWED MODE (development)")
  23. print(" Use --kiosk flag or set KIOSK_MODE=1 for fullscreen")
  24. # Enable virtual keyboard
  25. os.environ['QT_IM_MODULE'] = 'qtvirtualkeyboard'
  26. app = QGuiApplication(sys.argv)
  27. # Setup async event loop
  28. loop = QEventLoop(app)
  29. asyncio.set_event_loop(loop)
  30. # Register types
  31. qmlRegisterType(Backend, "DuneWeaver", 1, 0, "Backend")
  32. qmlRegisterType(PatternModel, "DuneWeaver", 1, 0, "PatternModel")
  33. qmlRegisterType(PlaylistModel, "DuneWeaver", 1, 0, "PlaylistModel")
  34. # Load QML
  35. engine = QQmlApplicationEngine()
  36. qml_file = Path(__file__).parent / "qml" / "main.qml"
  37. engine.load(QUrl.fromLocalFile(str(qml_file)))
  38. if not engine.rootObjects():
  39. return -1
  40. with loop:
  41. loop.run_forever()
  42. return 0
  43. if __name__ == "__main__":
  44. sys.exit(main())