diff --git a/AUTHORS b/AUTHORS
index a66be6d..abb6e1f 100644
--- a/AUTHORS
+++ b/AUTHORS
@@ -4,7 +4,7 @@ Upstream Authors:
Copyright:
Copyright (c) 2010-2012 Razor team
- Copyright (c) 2012-2016 LXQt team
+ Copyright (c) 2012-2017 LXQt team
License: LGPL-2.1+
The full text of the licenses can be found in the 'COPYING' file.
diff --git a/CHANGELOG b/CHANGELOG
index d7841c0..a7feecd 100644
--- a/CHANGELOG
+++ b/CHANGELOG
@@ -1,7 +1,121 @@
-lxqt-session-0.11.1 / 2017-01-01
+lxqt-session-0.12.0 / 2017-10-21
================================
+ * Set patch version
+ * lxqt-session: Unify arguments parsing
+ * Don't export github templates
+ * Add/Update Lithuanian language
+ * c'n'p bug
+ * add basic cli to lxqt-session
+ * lxqt-session: Provide reboot/powerOff methods
+ * Drops Qt5Core_VERSION_STRING
+ * lxqt-config-session: set Qt::AA_UseHighDpiPixmaps to true
+ * lxqt-leave: set Qt::AA_UseHighDpiPixmaps to true
+ * improved --version
+ * Added QCommandLineParser and basic cli interface to lxqt-conf-session
+ * Added default CMAKE_BUILD_TYPE and LXQT_SESSION_PATCH_VERSION
+ * String encoding (#103)
+ * Fixes a FTBFS in superbuild mode (#102)
+ * lxqt-leave: Fix "disabled items" key navigation
+ * Address "unused parameter" compiler warnings
+ * lxqt-leave: Redesign dialog for good key navigation
+ * Removed superfluous include(LXQtTranslateDesktop)
+ * fixed config/CMakeLists.txt
+ * Merged relevant parts of CMakeLists.txt.lxqt-common into CMakeLists.txt
+ * Rename CMakeLists.txt -> CMakeLists.txt.lxqt-common
+ * Add Basque translation of lxqt-leave and update Basque translation of lxqt-config-session
+ * leavedialog: Use "expected" tab order
+ * LeaveDialog: Accept enter key for action/cancel firing
+ * LeaveDialog: Use "override" keyword
+ * leavedialog: Don't trigger "cancel" on Enter
+ * LeaveDialog: Use correct method
+ * startlxqt: Consider $XDG_RUNTIME_DIR/bus for DBus
+ * Updated *_da.desktop files and removed *_da_DK.desktop files
+ * Bump year
+ * Update desktop entries and Replace fr_FR by fr
+ * Use the LXQtConfigVars module
+ * Fixed typo
+ * Remove cpack (#61)
+ * startlxqt: Consider LXQT_DEFAULT_OPENBOX_CONFIG
+ * startlxqt: Honor the pre-defined SAL_USE_VLCPLUGIN
+ * Replace lxqt-rc.xml with latest openbox version
+ * startlxqt: Consider pre-exising LXDE OB config also
+ * build: Revert @6d6d2bef54
+ * build: Add xmessage as "dependency"
+ * Openbox: Fix informational message about adoption of rc.xml
+ * lxqt-rc.xml: Change default config install path
+ * startlxqt: Copy existing openbox config preferably
+ * Improves changed Openbox default path startup message (#51)
+ * Disable gtk+ 3 overlay scrollbars by default.
+ * Don't add XDG_DATA_HOME to XDG_DATA_DIRS (#47)
+ * Message about Openbox default path changed.
+ * Warning message about openbox settings path changed.
+ * startlxqt: Force XDG_CONFIG_DIRS to contain @LXQT_ETC_XDG_DIR@
+ * Copy openbox defaults at session start.
+ * Rename openbox/rc.xml to openbox/lxqt-openbox-rc.xml
+ * Openbox aero snap using mouse wheel over title bar.
+ * Settings Openbox updated.
+ * Default key shortcuts added to lxqt-globalkeysd.
+ * CMakeLists: Use LXQT_GRAPHICS_DIR for graphics
+ * Add startlxqt man page
+ * Fixes #807 – Add XDG_CACHE_HOME definition
+ * startlxqt: optimization of XDG_DATA_DIRS
+ * corrected indentation
+ * startlxqt: Set proper prefix for XDG_DATA_DIRS
+ * Update Greek translation (el) Remove country variant from language code
+ * Rename LxQt to LXQt everywhere
+ * CMake: Adds Runtime and Devel install COMPONENTs
+ * Coding style changes
+ * Removes no added value comments
+ * Adds double quotes to everything that may break
+ * Use GNUINnstallDirs
+ * Updates the build system to use the Targets infrastructure
+ * Enable the "leave confirmation dialog" by default
+ * TryExec to detect proper installed lxqt-session
+ * Uniforms indentation
+ * Sets env variable XDG_CONFIG_DIRS
+ * Drops hardcoded /etc/xdg paths
+ * Set LibreOffice's plugin env var to kde4
+ * config: auto-detect succesfully kwin on recent kwin versions
+ * Updated german translation, replaced Qt4 by Qt in all xsession/translations
+ * Adds an scalable start-here-lxqt icon
+ * use LXQt-specific menu file
+ * Renames some .desktop files
+ * Portuguese update for .desktop files
+ * - Unify naming for a unique lxqt. No more suffixes
+ * Make frost the default theme
+ * Defines XDG_DATA_HOME and XDG_DATA_DIRS environment variables
+ * Updates translations infrastructure
+ * Update the required minimum cmake version
+ * Clean up CMakeLists.txt and drop Qt 4 support
+ * Set environment variable GTK_CSD=0 to turn off the default client side decoration for gtk+ 3 programs. (This will not always work if a gtk+3 program explicitly sets a title bar and turns on CSD.)
+ * Add some more default values for Qt settings.
+ * Update default config file.
+ * Add Qt5 support.
+ * Support Qt5 platform plugin and add some more comments.
+ * Remove XDG_CURRENT_DESKTOP=Razor from environment variables.
+ * Set XDG_CURRENT_DESKTOP to LXQt
+ * remove dead template lines switch OnlyShowIn from Razor -> LXQt stringchanges LxQt -> LXQt
+ * Use LXQt as desktop name
+ * Add CPack rules for creating tarball
+ * Add session.conf and windowmanagers.conf.
+ * Change XDG_CURRENT_DESKTOP to Razor for now. (May rename to LxQt or something else in the future.)
+ * Export environment varialbe QT_PLATFORM_PLUGIN=lxqt to let all Qt programs load lxqt-qtplugin and apply lxqt settings.
+ * Support lxqt-session and add necessary xdg autostart desktop entry files.
+ * Run lxde-qt with XDG_CURRENT_DESKTOP=RAZOR
+ * Fix renaming bugs, replacing lxqt-qt with lxde-qt
+ * Finish the crazy razor=>lxqt renaming tasks.
+ * Rename dirs and replace razor with lxqt. Install lxqt.conf to /etc/xdg/lxqt and provide theme config.
+ * Properly set default wallpaper for pcmanfm-qt. Comment out openbox config handling in startlxde-qt since it's not needed.
+ * Remove custom openbox config file in desktop.conf temporarily until lxsession is fixed.
+ * Fix file paths, replacing razor with lxqt. * Remove Alt+F2 and Ctrl+Esc from openbox config file to avoid conflicts with lxqt-panel & lxqt-globalkeys.
+ * Add default configuration files for lxde-qt session.
+
+0.11.1 / 2017-01-01
+===================
+
+ * Release 0.11.1: Update changelog
* Adds an nullptr check when restarting a module (#90)
* Fixes a session logout crash (#88)
* Updated da.desktop files and removed da_DK.desktop files
diff --git a/CMakeLists.txt b/CMakeLists.txt
index d62552f..3cd4112 100644
--- a/CMakeLists.txt
+++ b/CMakeLists.txt
@@ -17,10 +17,10 @@ option(WITH_LIBUDEV "Build with libudev support" ON)
find_package(X11 REQUIRED)
find_package(Qt5DBus REQUIRED)
-find_package(Qt5LinguistTools REQUIRED QUIET)
+find_package(Qt5LinguistTools REQUIRED)
find_package(Qt5Widgets REQUIRED)
find_package(Qt5X11Extras REQUIRED)
-message(STATUS "Building with Qt${Qt5Core_VERSION_STRING}")
+message(STATUS "Building with Qt${Qt5Core_VERSION}")
find_package(KF5WindowSystem REQUIRED)
@@ -29,6 +29,16 @@ find_package(lxqt REQUIRED)
# Please don't move, must be after lxqt
find_package(XdgUserDirs REQUIRED)
+if(NOT CMAKE_BUILD_TYPE)
+ set(CMAKE_BUILD_TYPE Release)
+endif()
+
+# Patch Version
+set(LXQT_SESSION_PATCH_VERSION 0)
+
+set(LXQT_SESSION_VERSION ${LXQT_MAJOR_VERSION}.${LXQT_MINOR_VERSION}.${LXQT_SESSION_PATCH_VERSION})
+add_definitions("-DLXQT_SESSION_VERSION=\"${LXQT_SESSION_VERSION}\"")
+
include(LXQtCompilerSettings NO_POLICY_SCOPE)
# Translations **********************************
@@ -37,3 +47,32 @@ include(LXQtTranslate)
add_subdirectory(lxqt-session)
add_subdirectory(lxqt-config-session)
add_subdirectory(lxqt-leave)
+
+# merged from lxqt-common
+include(LXQtConfigVars)
+
+# startlxqt script
+set(PREDEF_XDG_DATA_DIRS "$XDG_DATA_HOME")
+if(NOT("${LXQT_DATA_DIR}" MATCHES "^/usr(/local)?/share$"))
+ set(PREDEF_XDG_DATA_DIRS "${PREDEF_XDG_DATA_DIRS}:${LXQT_DATA_DIR}")
+endif()
+set(PREDEF_XDG_DATA_DIRS "${PREDEF_XDG_DATA_DIRS}:/usr/local/share:/usr/share")
+configure_file(startlxqt.in startlxqt @ONLY)
+install(PROGRAMS
+ "${CMAKE_CURRENT_BINARY_DIR}/startlxqt"
+ DESTINATION "${CMAKE_INSTALL_BINDIR}"
+ COMPONENT Runtime
+)
+install(FILES
+ startlxqt.1
+ DESTINATION "${CMAKE_INSTALL_MANDIR}/man1"
+ COMPONENT Runtime
+)
+
+# default config files
+add_subdirectory(config)
+add_subdirectory(autostart)
+
+# xsession *.desktop file for display managers
+add_subdirectory(xsession)
+
diff --git a/CMakeLists.txt.lxqt-common b/CMakeLists.txt.lxqt-common
new file mode 100644
index 0000000..4415fc6
--- /dev/null
+++ b/CMakeLists.txt.lxqt-common
@@ -0,0 +1,27 @@
+include(LXQtTranslateDesktop)
+include(LXQtConfigVars)
+
+# startlxqt script
+set(PREDEF_XDG_DATA_DIRS "$XDG_DATA_HOME")
+if(NOT("${LXQT_DATA_DIR}" MATCHES "^/usr(/local)?/share$"))
+ set(PREDEF_XDG_DATA_DIRS "${PREDEF_XDG_DATA_DIRS}:${LXQT_DATA_DIR}")
+endif()
+set(PREDEF_XDG_DATA_DIRS "${PREDEF_XDG_DATA_DIRS}:/usr/local/share:/usr/share")
+configure_file(startlxqt.in startlxqt @ONLY)
+install(PROGRAMS
+ "${CMAKE_CURRENT_BINARY_DIR}/startlxqt"
+ DESTINATION "${CMAKE_INSTALL_BINDIR}"
+ COMPONENT Runtime
+)
+install(FILES
+ startlxqt.1
+ DESTINATION "${CMAKE_INSTALL_MANDIR}/man1"
+ COMPONENT Runtime
+)
+
+# default config files
+add_subdirectory(config)
+add_subdirectory(autostart)
+
+# xsession *.desktop file for display managers
+add_subdirectory(xsession)
diff --git a/autostart/CMakeLists.txt b/autostart/CMakeLists.txt
new file mode 100644
index 0000000..5fb270d
--- /dev/null
+++ b/autostart/CMakeLists.txt
@@ -0,0 +1,17 @@
+cmake_minimum_required(VERSION 3.0.2 FATAL_ERROR)
+
+file(GLOB DESKTOP_FILES_IN *.desktop.in)
+
+# Translations **********************************
+lxqt_translate_desktop(DESKTOP_FILES
+ SOURCES
+ ${DESKTOP_FILES_IN}
+)
+add_custom_target(lxqt_sesstion_autostart_desktop_files ALL DEPENDS ${DESKTOP_FILES})
+#************************************************
+
+install(FILES
+ ${DESKTOP_FILES}
+ DESTINATION "${LXQT_ETC_XDG_DIR}/autostart"
+ COMPONENT Runtime
+)
diff --git a/autostart/lxqt-xscreensaver-autostart.desktop.in b/autostart/lxqt-xscreensaver-autostart.desktop.in
new file mode 100644
index 0000000..199a759
--- /dev/null
+++ b/autostart/lxqt-xscreensaver-autostart.desktop.in
@@ -0,0 +1,9 @@
+[Desktop Entry]
+Type=Application
+Version=1.0
+Name=XScreenSaver
+TryExec=xscreensaver
+Exec=xscreensaver -no-splash
+OnlyShowIn=LXQt;
+
+#TRANSLATIONS_DIR=translations
diff --git a/autostart/translations/lxqt-xscreensaver-autostart_ar.desktop b/autostart/translations/lxqt-xscreensaver-autostart_ar.desktop
new file mode 100644
index 0000000..f118d67
--- /dev/null
+++ b/autostart/translations/lxqt-xscreensaver-autostart_ar.desktop
@@ -0,0 +1,2 @@
+# Translations
+Name[ar]=حافظ الشَّاشة
diff --git a/autostart/translations/lxqt-xscreensaver-autostart_cs.desktop b/autostart/translations/lxqt-xscreensaver-autostart_cs.desktop
new file mode 100644
index 0000000..0b613dd
--- /dev/null
+++ b/autostart/translations/lxqt-xscreensaver-autostart_cs.desktop
@@ -0,0 +1,2 @@
+# Translations
+Name[cs]=Šetřič obrazovky
diff --git a/autostart/translations/lxqt-xscreensaver-autostart_cs_CZ.desktop b/autostart/translations/lxqt-xscreensaver-autostart_cs_CZ.desktop
new file mode 100644
index 0000000..6faaf82
--- /dev/null
+++ b/autostart/translations/lxqt-xscreensaver-autostart_cs_CZ.desktop
@@ -0,0 +1,2 @@
+# Translations
+Name[cs_CZ]=Šetřič obrazovky
diff --git a/autostart/translations/lxqt-xscreensaver-autostart_da.desktop b/autostart/translations/lxqt-xscreensaver-autostart_da.desktop
new file mode 100644
index 0000000..3977f00
--- /dev/null
+++ b/autostart/translations/lxqt-xscreensaver-autostart_da.desktop
@@ -0,0 +1,2 @@
+# Translations
+Name[da]=Pauseskærm
diff --git a/autostart/translations/lxqt-xscreensaver-autostart_de.desktop b/autostart/translations/lxqt-xscreensaver-autostart_de.desktop
new file mode 100644
index 0000000..d357c12
--- /dev/null
+++ b/autostart/translations/lxqt-xscreensaver-autostart_de.desktop
@@ -0,0 +1,2 @@
+# Translations
+Name[de]=Bildschirmschoner
diff --git a/autostart/translations/lxqt-xscreensaver-autostart_el.desktop b/autostart/translations/lxqt-xscreensaver-autostart_el.desktop
new file mode 100644
index 0000000..db70514
--- /dev/null
+++ b/autostart/translations/lxqt-xscreensaver-autostart_el.desktop
@@ -0,0 +1,2 @@
+# Translations
+Name[el]=ΠροφύλαξηOθόνηςΧ
diff --git a/autostart/translations/lxqt-xscreensaver-autostart_eo.desktop b/autostart/translations/lxqt-xscreensaver-autostart_eo.desktop
new file mode 100644
index 0000000..ff5188c
--- /dev/null
+++ b/autostart/translations/lxqt-xscreensaver-autostart_eo.desktop
@@ -0,0 +1,2 @@
+# Translations
+Name[eo]=XEkranKurteno
diff --git a/autostart/translations/lxqt-xscreensaver-autostart_es.desktop b/autostart/translations/lxqt-xscreensaver-autostart_es.desktop
new file mode 100644
index 0000000..990c7ba
--- /dev/null
+++ b/autostart/translations/lxqt-xscreensaver-autostart_es.desktop
@@ -0,0 +1,2 @@
+# Translations
+Name[es]=XScreenSaver
diff --git a/autostart/translations/lxqt-xscreensaver-autostart_es_VE.desktop b/autostart/translations/lxqt-xscreensaver-autostart_es_VE.desktop
new file mode 100644
index 0000000..cf3ffbb
--- /dev/null
+++ b/autostart/translations/lxqt-xscreensaver-autostart_es_VE.desktop
@@ -0,0 +1,2 @@
+# Translations
+Name[es_VE]=XScreenSaver
diff --git a/autostart/translations/lxqt-xscreensaver-autostart_eu.desktop b/autostart/translations/lxqt-xscreensaver-autostart_eu.desktop
new file mode 100644
index 0000000..1c27510
--- /dev/null
+++ b/autostart/translations/lxqt-xscreensaver-autostart_eu.desktop
@@ -0,0 +1,2 @@
+# Translations
+Name[eu]=XScreenSaver
diff --git a/autostart/translations/lxqt-xscreensaver-autostart_fi.desktop b/autostart/translations/lxqt-xscreensaver-autostart_fi.desktop
new file mode 100644
index 0000000..9de2c06
--- /dev/null
+++ b/autostart/translations/lxqt-xscreensaver-autostart_fi.desktop
@@ -0,0 +1,2 @@
+# Translations
+Name[fi]=XScreenSaver
diff --git a/autostart/translations/lxqt-xscreensaver-autostart_fr.desktop b/autostart/translations/lxqt-xscreensaver-autostart_fr.desktop
new file mode 100644
index 0000000..a15c487
--- /dev/null
+++ b/autostart/translations/lxqt-xscreensaver-autostart_fr.desktop
@@ -0,0 +1,2 @@
+# Translations
+Name[fr_FR]=XScreenSaver
diff --git a/autostart/translations/lxqt-xscreensaver-autostart_hu.desktop b/autostart/translations/lxqt-xscreensaver-autostart_hu.desktop
new file mode 100644
index 0000000..26b0d99
--- /dev/null
+++ b/autostart/translations/lxqt-xscreensaver-autostart_hu.desktop
@@ -0,0 +1 @@
+# Translations
diff --git a/autostart/translations/lxqt-xscreensaver-autostart_ia.desktop b/autostart/translations/lxqt-xscreensaver-autostart_ia.desktop
new file mode 100644
index 0000000..26b0d99
--- /dev/null
+++ b/autostart/translations/lxqt-xscreensaver-autostart_ia.desktop
@@ -0,0 +1 @@
+# Translations
diff --git a/autostart/translations/lxqt-xscreensaver-autostart_id_ID.desktop b/autostart/translations/lxqt-xscreensaver-autostart_id_ID.desktop
new file mode 100644
index 0000000..d9e7d2e
--- /dev/null
+++ b/autostart/translations/lxqt-xscreensaver-autostart_id_ID.desktop
@@ -0,0 +1,2 @@
+# Translations
+Name[id_ID]=XScreenSaver
diff --git a/autostart/translations/lxqt-xscreensaver-autostart_it_IT.desktop b/autostart/translations/lxqt-xscreensaver-autostart_it_IT.desktop
new file mode 100644
index 0000000..73eb838
--- /dev/null
+++ b/autostart/translations/lxqt-xscreensaver-autostart_it_IT.desktop
@@ -0,0 +1,2 @@
+# Translations
+Name[it_IT]=XScreenSaver
diff --git a/autostart/translations/lxqt-xscreensaver-autostart_ja.desktop b/autostart/translations/lxqt-xscreensaver-autostart_ja.desktop
new file mode 100644
index 0000000..90c84a5
--- /dev/null
+++ b/autostart/translations/lxqt-xscreensaver-autostart_ja.desktop
@@ -0,0 +1,2 @@
+# Translations
+Name[ja]=Xスクリーンセーバ
diff --git a/autostart/translations/lxqt-xscreensaver-autostart_ko.desktop b/autostart/translations/lxqt-xscreensaver-autostart_ko.desktop
new file mode 100644
index 0000000..26b0d99
--- /dev/null
+++ b/autostart/translations/lxqt-xscreensaver-autostart_ko.desktop
@@ -0,0 +1 @@
+# Translations
diff --git a/autostart/translations/lxqt-xscreensaver-autostart_lt.desktop b/autostart/translations/lxqt-xscreensaver-autostart_lt.desktop
new file mode 100644
index 0000000..6744cc9
--- /dev/null
+++ b/autostart/translations/lxqt-xscreensaver-autostart_lt.desktop
@@ -0,0 +1,2 @@
+# Translations
+Name[lt]=XScreenSaver
diff --git a/autostart/translations/lxqt-xscreensaver-autostart_nl.desktop b/autostart/translations/lxqt-xscreensaver-autostart_nl.desktop
new file mode 100644
index 0000000..a368b1c
--- /dev/null
+++ b/autostart/translations/lxqt-xscreensaver-autostart_nl.desktop
@@ -0,0 +1,2 @@
+# Translations
+Name[nl]=X-schermbeveiliging
diff --git a/autostart/translations/lxqt-xscreensaver-autostart_pl_PL.desktop b/autostart/translations/lxqt-xscreensaver-autostart_pl_PL.desktop
new file mode 100644
index 0000000..51f0c85
--- /dev/null
+++ b/autostart/translations/lxqt-xscreensaver-autostart_pl_PL.desktop
@@ -0,0 +1,2 @@
+# Translations
+Name[pl_PL]=XScreenSaver
diff --git a/autostart/translations/lxqt-xscreensaver-autostart_pt.desktop b/autostart/translations/lxqt-xscreensaver-autostart_pt.desktop
new file mode 100644
index 0000000..2bcf851
--- /dev/null
+++ b/autostart/translations/lxqt-xscreensaver-autostart_pt.desktop
@@ -0,0 +1,2 @@
+# Translations
+Name[pt]=Proteção de ecrã
diff --git a/autostart/translations/lxqt-xscreensaver-autostart_pt_BR.desktop b/autostart/translations/lxqt-xscreensaver-autostart_pt_BR.desktop
new file mode 100644
index 0000000..482dd1d
--- /dev/null
+++ b/autostart/translations/lxqt-xscreensaver-autostart_pt_BR.desktop
@@ -0,0 +1,2 @@
+# Translations
+Name[pt_BR]=XScreenSaver
diff --git a/autostart/translations/lxqt-xscreensaver-autostart_ro_RO.desktop b/autostart/translations/lxqt-xscreensaver-autostart_ro_RO.desktop
new file mode 100644
index 0000000..1349bc4
--- /dev/null
+++ b/autostart/translations/lxqt-xscreensaver-autostart_ro_RO.desktop
@@ -0,0 +1,2 @@
+# Translations
+Name[ro_RO]=XScreenSaver
diff --git a/autostart/translations/lxqt-xscreensaver-autostart_ru.desktop b/autostart/translations/lxqt-xscreensaver-autostart_ru.desktop
new file mode 100644
index 0000000..bffcef1
--- /dev/null
+++ b/autostart/translations/lxqt-xscreensaver-autostart_ru.desktop
@@ -0,0 +1,2 @@
+# Translations
+Name[ru]=XэкранCпаситель
diff --git a/autostart/translations/lxqt-xscreensaver-autostart_ru_RU.desktop b/autostart/translations/lxqt-xscreensaver-autostart_ru_RU.desktop
new file mode 100644
index 0000000..789e9d7
--- /dev/null
+++ b/autostart/translations/lxqt-xscreensaver-autostart_ru_RU.desktop
@@ -0,0 +1,2 @@
+# Translations
+Name[ru_RU]=XScreenSaver
diff --git a/autostart/translations/lxqt-xscreensaver-autostart_sl.desktop b/autostart/translations/lxqt-xscreensaver-autostart_sl.desktop
new file mode 100644
index 0000000..470b430
--- /dev/null
+++ b/autostart/translations/lxqt-xscreensaver-autostart_sl.desktop
@@ -0,0 +1,2 @@
+# Translations
+Name[sl]=XScreenSaver
diff --git a/autostart/translations/lxqt-xscreensaver-autostart_sr.desktop b/autostart/translations/lxqt-xscreensaver-autostart_sr.desktop
new file mode 100644
index 0000000..694caf2
--- /dev/null
+++ b/autostart/translations/lxqt-xscreensaver-autostart_sr.desktop
@@ -0,0 +1,2 @@
+# Translations
+Name[sr]=Икс-ЧуварЕкрана
diff --git a/autostart/translations/lxqt-xscreensaver-autostart_sr@ijekavian.desktop b/autostart/translations/lxqt-xscreensaver-autostart_sr@ijekavian.desktop
new file mode 100644
index 0000000..ba7db07
--- /dev/null
+++ b/autostart/translations/lxqt-xscreensaver-autostart_sr@ijekavian.desktop
@@ -0,0 +1 @@
+Name[sr@ijekavian]=Икс-ЧуварЕкрана
diff --git a/autostart/translations/lxqt-xscreensaver-autostart_sr@ijekavianlatin.desktop b/autostart/translations/lxqt-xscreensaver-autostart_sr@ijekavianlatin.desktop
new file mode 100644
index 0000000..adf75e0
--- /dev/null
+++ b/autostart/translations/lxqt-xscreensaver-autostart_sr@ijekavianlatin.desktop
@@ -0,0 +1 @@
+Name[sr@ijekavianlatin]=Iks-ČuvarEkrana
diff --git a/autostart/translations/lxqt-xscreensaver-autostart_sr@latin.desktop b/autostart/translations/lxqt-xscreensaver-autostart_sr@latin.desktop
new file mode 100644
index 0000000..6f0e4f0
--- /dev/null
+++ b/autostart/translations/lxqt-xscreensaver-autostart_sr@latin.desktop
@@ -0,0 +1,2 @@
+# Translations
+Name[sr@latin]=Iks-ČuvarEkrana
diff --git a/autostart/translations/lxqt-xscreensaver-autostart_th_TH.desktop b/autostart/translations/lxqt-xscreensaver-autostart_th_TH.desktop
new file mode 100644
index 0000000..d9f982a
--- /dev/null
+++ b/autostart/translations/lxqt-xscreensaver-autostart_th_TH.desktop
@@ -0,0 +1,2 @@
+# Translations
+Name[th_TH]=โปรแกรมรักษาหน้าจอของX
diff --git a/autostart/translations/lxqt-xscreensaver-autostart_tr.desktop b/autostart/translations/lxqt-xscreensaver-autostart_tr.desktop
new file mode 100644
index 0000000..abb0253
--- /dev/null
+++ b/autostart/translations/lxqt-xscreensaver-autostart_tr.desktop
@@ -0,0 +1,2 @@
+# Translations
+Name[tr]=XScreenSaver
diff --git a/autostart/translations/lxqt-xscreensaver-autostart_uk.desktop b/autostart/translations/lxqt-xscreensaver-autostart_uk.desktop
new file mode 100644
index 0000000..f491066
--- /dev/null
+++ b/autostart/translations/lxqt-xscreensaver-autostart_uk.desktop
@@ -0,0 +1,2 @@
+# Translations
+Name[uk]=XScreenSaver
diff --git a/autostart/translations/lxqt-xscreensaver-autostart_zh_CN.GB2312.desktop b/autostart/translations/lxqt-xscreensaver-autostart_zh_CN.GB2312.desktop
new file mode 100644
index 0000000..26b0d99
--- /dev/null
+++ b/autostart/translations/lxqt-xscreensaver-autostart_zh_CN.GB2312.desktop
@@ -0,0 +1 @@
+# Translations
diff --git a/autostart/translations/lxqt-xscreensaver-autostart_zh_CN.desktop b/autostart/translations/lxqt-xscreensaver-autostart_zh_CN.desktop
new file mode 100644
index 0000000..fc4c9e6
--- /dev/null
+++ b/autostart/translations/lxqt-xscreensaver-autostart_zh_CN.desktop
@@ -0,0 +1,2 @@
+# Translations
+Name[zh_CN]=屏保
diff --git a/autostart/translations/lxqt-xscreensaver-autostart_zh_TW.desktop b/autostart/translations/lxqt-xscreensaver-autostart_zh_TW.desktop
new file mode 100644
index 0000000..0eaf52a
--- /dev/null
+++ b/autostart/translations/lxqt-xscreensaver-autostart_zh_TW.desktop
@@ -0,0 +1,2 @@
+# Translations
+Name[zh_TW]=螢幕保護程式
diff --git a/config/CMakeLists.txt b/config/CMakeLists.txt
new file mode 100644
index 0000000..caabdf2
--- /dev/null
+++ b/config/CMakeLists.txt
@@ -0,0 +1,12 @@
+# install default config files to /etc/xdg
+install(FILES
+ lxqt.conf
+ session.conf
+ windowmanagers.conf
+ DESTINATION "${LXQT_ETC_XDG_DIR}/lxqt"
+ COMPONENT Runtime
+)
+install(DIRECTORY openbox
+ DESTINATION "${LXQT_ETC_XDG_DIR}"
+ COMPONENT Runtime
+)
diff --git a/config/lxqt.conf b/config/lxqt.conf
new file mode 100644
index 0000000..1d48e56
--- /dev/null
+++ b/config/lxqt.conf
@@ -0,0 +1,11 @@
+[General]
+theme=frost
+icon_theme=oxygen
+single_click_activate=false
+tool_button_style=ToolButtonTextBesideIcon
+
+[Qt]
+font="Sans,11,-1,5,50,0,0,0,0,0"
+doubleClickInterval=400
+style=Fusion
+wheelScrollLines=3
diff --git a/config/openbox/lxqt-rc.xml b/config/openbox/lxqt-rc.xml
new file mode 100644
index 0000000..5c19f5e
--- /dev/null
+++ b/config/openbox/lxqt-rc.xml
@@ -0,0 +1,744 @@
+
+
+
+
+
+
+
+ 10
+ 20
+
+
+
+ yes
+
+ no
+
+ yes
+
+ no
+
+ 200
+
+ no
+
+
+
+
+ Smart
+
+ yes
+
+ Primary
+
+ 1
+
+
+
+
+ Onyx
+ NLIMC
+
+ yes
+ yes
+
+ sans
+ 10
+
+ bold
+
+ normal
+
+
+
+ sans
+ 10
+
+ bold
+
+ normal
+
+
+
+ sans
+ 9
+
+ normal
+
+ normal
+
+
+
+ sans
+ 9
+
+ normal
+
+ normal
+
+
+
+ sans
+ 9
+
+ bold
+
+ normal
+
+
+
+ sans
+ 9
+
+ bold
+
+ normal
+
+
+
+
+
+
+ 2
+ 1
+
+
+
+ 875
+
+
+
+
+ yes
+ Nonpixel
+
+ Center
+
+
+
+
+ 10
+
+ 10
+
+
+
+
+
+
+ 0
+ 0
+ 0
+ 0
+
+
+
+ TopLeft
+
+ 0
+ 0
+ no
+ Above
+
+ Vertical
+
+ no
+ 300
+
+ 300
+
+ Middle
+
+
+
+
+ C-g
+
+
+
+ leftno
+
+
+ rightno
+
+
+ upno
+
+
+ downno
+
+
+ leftno
+
+
+ rightno
+
+
+ upno
+
+
+ downno
+
+
+ 1
+
+
+ 2
+
+
+ 3
+
+
+ 4
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ yesyes
+
+
+
+
+
+
+
+
+
+
+
+ right
+
+
+
+
+ left
+
+
+
+
+ up
+
+
+
+
+ down
+
+
+
+
+
+
+
+ 1
+
+ 500
+
+ 400
+
+ false
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ previous
+
+
+ next
+
+
+ previous
+
+
+ next
+
+
+ previous
+
+
+ next
+
+
+
+
+
+
+
+
+
+
+
+
+
+ no
+
+
+
+
+
+
+
+
+
+
+ yes
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ top
+
+
+
+
+
+ left
+
+
+
+
+
+ right
+
+
+
+
+
+ bottom
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ vertical
+
+
+ horizontal
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ previous
+
+
+ next
+
+
+
+ previous
+
+
+ next
+
+
+ previous
+
+
+ next
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ previous
+
+
+ next
+
+
+ previous
+
+
+ next
+
+
+
+
+
+
+
+
+
+
+
diff --git a/config/session.conf b/config/session.conf
new file mode 100644
index 0000000..ded6aa8
--- /dev/null
+++ b/config/session.conf
@@ -0,0 +1,24 @@
+[General]
+window_manager=openbox
+leave_confirmation=true
+
+[Environment]
+GTK_CSD=0
+GTK_OVERLAY_SCROLLING=0
+
+[Mouse]
+cursor_size=18
+cursor_theme=whiteglass
+acc_factor=20
+acc_threshold=10
+left_handed=false
+
+[Keyboard]
+delay=500
+interval=30
+beep=false
+
+[Font]
+antialias=true
+hinting=true
+dpi=96
diff --git a/config/windowmanagers.conf b/config/windowmanagers.conf
new file mode 100644
index 0000000..7545908
--- /dev/null
+++ b/config/windowmanagers.conf
@@ -0,0 +1,26 @@
+[KnownManagers]
+openbox/Name=Openbox
+openbox/Comment=Light-weight window manager
+
+kwin/Name=KWin
+kwin/Comment=Window manager of the KDE Software Compilation
+
+kwin_x11/Name=KWin
+kwin_x11/Comment=Window manager of the KDE Software Compilation
+
+metacity/Name=Metacity
+metacity/Comment=Window manager of the GNOME desktop environment
+
+windowmaker/Name=Windowmaker
+windowmaker/Comment=A classical lightweight window manager
+
+e16/Name=Enlightenement 16
+
+fvwm2/Name=Fvwm2
+fvwm2/Comment=A classical lightweight window manager
+
+xfwm4/Name=Xfwm4
+xfwm4/Comment=A window manager for the Xfce desktop environment
+
+sawfish/Name=Sawfish
+sawfish/Comment="A lightweight, flexible window manager"
diff --git a/debian/changelog b/debian/changelog
index 7a534e8..b0094e8 100644
--- a/debian/changelog
+++ b/debian/changelog
@@ -1,3 +1,14 @@
+lxqt-session (0.12.0-1) experimental; urgency=medium
+
+ * Cherry-picking upstream release 0.12.0.
+ * Switched to experimental
+ * Bumped Standards to 4.1.1 - no changes needed
+ * Bumped liblxqt dependency to >= 0.12.0
+ * Breaks and Replaces lxqt-common << 0.12.0
+ * Added dependency to lxqt-themes | lxqt-theme instead
+
+ -- Alf Gaida Tue, 24 Oct 2017 21:17:51 +0200
+
lxqt-session (0.11.1-6) unstable; urgency=medium
* Moved lxqt-qtplugin to dependencies (Closes: #870138)
diff --git a/debian/control b/debian/control
index e765e0f..3f09e65 100644
--- a/debian/control
+++ b/debian/control
@@ -7,22 +7,22 @@ Section: x11
Priority: optional
Build-Depends: debhelper (>= 10),
libkf5windowsystem-dev,
- liblxqt0-dev (>= 0.11.1),
+ liblxqt0-dev (>= 0.12.0),
libqt5svg5-dev,
libqt5x11extras5-dev,
libudev-dev [linux-any],
libx11-dev,
xdg-user-dirs
-Standards-Version: 4.0.0
-Vcs-Browser: https://anonscm.debian.org/cgit/pkg-lxqt/lxqt-session.git/?h=debian/sid
-Vcs-Git: https://anonscm.debian.org/git/pkg-lxqt/lxqt-session.git -b debian/sid
+Standards-Version: 4.1.1
+Vcs-Browser: https://anonscm.debian.org/cgit/pkg-lxqt/lxqt-session.git/?h=debian/experimental
+Vcs-Git: https://anonscm.debian.org/git/pkg-lxqt/lxqt-session.git -b debian/experimental
Homepage: https://github.com/lxde/lxqt-session
Package: lxqt-session
Architecture: any
Depends: ${misc:Depends},
${shlibs:Depends},
- lxqt-common,
+ lxqt-themes | lxqt-theme,
lxqt-qtplugin,
x11-xkb-utils
Recommends: lxqt-session-l10n,
@@ -36,6 +36,8 @@ Recommends: lxqt-session-l10n,
qps [linux-any],
xscreensaver | gnome-screensaver | light-locker | i3lock | suckless-tools
Provides: x-session-manager
+Breaks: lxqt-common (<< 0.12.0)
+Replaces: lxqt-common (<< 0.12.0)
Description: session manager component for LXQt
LXQt is an advanced, easy-to-use, and fast desktop environment based on
Qt technologies. It has been tailored for users who value simplicity,
diff --git a/lxqt-config-session/main.cpp b/lxqt-config-session/main.cpp
index a0313e6..483efd5 100644
--- a/lxqt-config-session/main.cpp
+++ b/lxqt-config-session/main.cpp
@@ -29,12 +29,24 @@
#include
#include
+#include
#include "sessionconfigwindow.h"
int main(int argc, char** argv)
{
LXQt::SingleApplication a(argc, argv);
+ a.setAttribute(Qt::AA_UseHighDpiPixmaps, true);
+
+ QCommandLineParser parser;
+ parser.setApplicationDescription(QStringLiteral("LXQt Config Session"));
+ const QString VERINFO = QStringLiteral(LXQT_SESSION_VERSION
+ "\nliblxqt " LXQT_VERSION
+ "\nQt " QT_VERSION_STR);
+ a.setApplicationVersion(VERINFO);
+ parser.addVersionOption();
+ parser.addHelpOption();
+ parser.process(a);
SessionConfigWindow w;
a.setActivationWindow(&w);
diff --git a/lxqt-config-session/translations/lxqt-config-session_eu.desktop b/lxqt-config-session/translations/lxqt-config-session_eu.desktop
index 95a0d42..0e22683 100644
--- a/lxqt-config-session/translations/lxqt-config-session_eu.desktop
+++ b/lxqt-config-session/translations/lxqt-config-session_eu.desktop
@@ -1,4 +1,4 @@
# Translations
-Comment[eu]=Konfiguratu LXQt saioaren modulua
-GenericName[eu]=LXQt saioaren konfiguratzailea
-Name[eu]=LXQt saioaren konfiguratzailea
+Comment[eu]=LXQt saioen konfigurazioa
+GenericName[eu]=LXQt saioaren ezarpenak
+Name[eu]=Saioaren ezarpenak
diff --git a/lxqt-config-session/translations/lxqt-config-session_lt.desktop b/lxqt-config-session/translations/lxqt-config-session_lt.desktop
index 38f405b..59dac09 100644
--- a/lxqt-config-session/translations/lxqt-config-session_lt.desktop
+++ b/lxqt-config-session/translations/lxqt-config-session_lt.desktop
@@ -1,4 +1,4 @@
# Translations
-Comment[lt]=Konfigūruoti LXQt sesijų modulį
-GenericName[lt]=LXQt sesijų konfigūravimas
-Name[lt]=LXQt sesijų konfigūravimas
+Comment[lt]=LXQt seansų konfigūravimas
+GenericName[lt]=LXQt seansų nustatymai
+Name[lt]=Seanso nustatymai
diff --git a/lxqt-leave/CMakeLists.txt b/lxqt-leave/CMakeLists.txt
index 0f8038f..12d2241 100644
--- a/lxqt-leave/CMakeLists.txt
+++ b/lxqt-leave/CMakeLists.txt
@@ -3,10 +3,12 @@ project(lxqt-leave)
set(CPP_FILES
main.cpp
leavedialog.cpp
+ listwidget.cpp
)
set(H_FILES
leavedialog.h
+ listwidget.h
)
set(UI_FILES
diff --git a/lxqt-leave/leavedialog.cpp b/lxqt-leave/leavedialog.cpp
index 351ce14..073a880 100644
--- a/lxqt-leave/leavedialog.cpp
+++ b/lxqt-leave/leavedialog.cpp
@@ -26,6 +26,7 @@
* END_COMMON_COPYRIGHT_HEADER */
#include "leavedialog.h"
+#include
LeaveDialog::LeaveDialog(QWidget* parent)
: QDialog(parent, Qt::Dialog | Qt::WindowStaysOnTopHint | Qt::CustomizeWindowHint),
@@ -46,47 +47,76 @@ LeaveDialog::LeaveDialog(QWidget* parent)
setWindowFlags((Qt::CustomizeWindowHint | Qt::FramelessWindowHint |
Qt::WindowStaysOnTopHint | Qt::X11BypassWindowManagerHint));
- ui->logoutButton->setEnabled(mPower->canAction(LXQt::Power::PowerLogout));
- ui->rebootButton->setEnabled(mPower->canAction(LXQt::Power::PowerReboot));
- ui->shutdownButton->setEnabled(mPower->canAction(LXQt::Power::PowerShutdown));
- ui->suspendButton->setEnabled(mPower->canAction(LXQt::Power::PowerSuspend));
- ui->hibernateButton->setEnabled(mPower->canAction(LXQt::Power::PowerHibernate));
+ // populate the items
+ QListWidgetItem * item = new QListWidgetItem{QIcon::fromTheme(QStringLiteral("system-log-out")), tr("Logout")};
+ item->setData(Qt::UserRole, LXQt::Power::PowerLogout);
+ if (!mPower->canAction(LXQt::Power::PowerLogout))
+ item->setFlags(item->flags() & ~Qt::ItemIsEnabled);
+ ui->listWidget->addItem(item);
+ item = new QListWidgetItem{QIcon::fromTheme(QStringLiteral("system-shutdown")), tr("Shutdown")};
+ item->setData(Qt::UserRole, LXQt::Power::PowerShutdown);
+ if (!mPower->canAction(LXQt::Power::PowerShutdown))
+ item->setFlags(item->flags() & ~Qt::ItemIsEnabled);
+ ui->listWidget->addItem(item);
+ item = new QListWidgetItem{QIcon::fromTheme(QStringLiteral("system-suspend")), tr("Suspend")};
+ item->setData(Qt::UserRole, LXQt::Power::PowerSuspend);
+ if (!mPower->canAction(LXQt::Power::PowerSuspend))
+ item->setFlags(item->flags() & ~Qt::ItemIsEnabled);
+ ui->listWidget->addItem(item);
+ item = new QListWidgetItem{QIcon::fromTheme(QStringLiteral("system-lock-screen")), tr("Lock screen")};
+ item->setData(Qt::UserRole, -1);
+ ui->listWidget->addItem(item);
+ item = new QListWidgetItem{QIcon::fromTheme(QStringLiteral("system-reboot")), tr("Reboot")};
+ item->setData(Qt::UserRole, LXQt::Power::PowerReboot);
+ if (!mPower->canAction(LXQt::Power::PowerReboot))
+ item->setFlags(item->flags() & ~Qt::ItemIsEnabled);
+ ui->listWidget->addItem(item);
+ item = new QListWidgetItem{QIcon::fromTheme(QStringLiteral("system-suspend-hibernate")), tr("Hibernate")};
+ item->setData(Qt::UserRole, LXQt::Power::PowerHibernate);
+ if (!mPower->canAction(LXQt::Power::PowerHibernate))
+ item->setFlags(item->flags() & ~Qt::ItemIsEnabled);
+ ui->listWidget->addItem(item);
- /*
- * Make all the buttons have equal widths
- */
- QVector buttons(6);
- buttons[0] = ui->logoutButton;
- buttons[1] = ui->lockscreenButton;
- buttons[2] = ui->suspendButton;
- buttons[3] = ui->hibernateButton;
- buttons[4] = ui->rebootButton;
- buttons[5] = ui->shutdownButton;
+ ui->listWidget->setRows(2);
+ ui->listWidget->setColumns(3);
- int maxWidth = 0;
- const int N = buttons.size();
- for (int i = 0; i < N; ++i) {
- // Make sure that the button size is adjusted to the text width
- buttons.at(i)->adjustSize();
- maxWidth = qMax(maxWidth, buttons.at(i)->width());
- }
- for (int i = 0; i < N; ++i)
- buttons.at(i)->setMinimumWidth(maxWidth);
-
- connect(ui->logoutButton, &QPushButton::clicked, [&] { close(); mPowerManager->logout(); });
- connect(ui->rebootButton, &QPushButton::clicked, [&] { close(); mPowerManager->reboot(); });
- connect(ui->shutdownButton, &QPushButton::clicked, [&] { close(); mPowerManager->shutdown(); });
- connect(ui->suspendButton, &QPushButton::clicked, [&] { close(); mPowerManager->suspend(); });
- connect(ui->hibernateButton, &QPushButton::clicked, [&] { close(); mPowerManager->hibernate(); });
- connect(ui->cancelButton, &QPushButton::clicked, [&] { close(); });
- connect(ui->lockscreenButton, &QPushButton::clicked, [&] {
+ connect(ui->listWidget, &QAbstractItemView::activated, this, [this] (const QModelIndex & index) {
+ bool ok = false;
+ const int action = index.data(Qt::UserRole).toInt(&ok);
+ if (!ok)
+ {
+ qWarning("Invalid internal logic, no UserRole set!?");
+ return;
+ }
close();
- QEventLoop loop;
- connect(mScreensaver, &LXQt::ScreenSaver::done, &loop, &QEventLoop::quit);
- mScreensaver->lockScreen();
- loop.exec();
+ switch (action)
+ {
+ case LXQt::Power::PowerLogout:
+ mPowerManager->logout();
+ break;
+ case LXQt::Power::PowerShutdown:
+ mPowerManager->shutdown();
+ break;
+ case LXQt::Power::PowerSuspend:
+ mPowerManager->suspend();
+ break;
+ case -1:
+ {
+ QEventLoop loop;
+ connect(mScreensaver, &LXQt::ScreenSaver::done, &loop, &QEventLoop::quit);
+ mScreensaver->lockScreen();
+ loop.exec();
+ }
+ break;
+ case LXQt::Power::PowerReboot:
+ mPowerManager->reboot();
+ break;
+ case LXQt::Power::PowerHibernate:
+ mPowerManager->hibernate();
+ break;
+ }
});
-
+ connect(ui->cancelButton, &QAbstractButton::clicked, this, [this] { close(); });
}
LeaveDialog::~LeaveDialog()
@@ -94,7 +124,7 @@ LeaveDialog::~LeaveDialog()
delete ui;
}
-void LeaveDialog::resizeEvent(QResizeEvent* event)
+void LeaveDialog::resizeEvent(QResizeEvent* /*event*/)
{
QRect screen = QApplication::desktop()->screenGeometry();
move((screen.width() - this->width()) / 2,
diff --git a/lxqt-leave/leavedialog.h b/lxqt-leave/leavedialog.h
index 00bb391..75b1f74 100644
--- a/lxqt-leave/leavedialog.h
+++ b/lxqt-leave/leavedialog.h
@@ -49,7 +49,7 @@ public:
~LeaveDialog();
protected:
- virtual void resizeEvent(QResizeEvent* event);
+ virtual void resizeEvent(QResizeEvent* event) override;
private:
Ui::LeaveDialog *ui;
diff --git a/lxqt-leave/leavedialog.ui b/lxqt-leave/leavedialog.ui
index f768dcf..c418949 100644
--- a/lxqt-leave/leavedialog.ui
+++ b/lxqt-leave/leavedialog.ui
@@ -20,7 +20,16 @@
Leave
- -
+
+ 9
+
+
+ 0
+
+
+ 18
+
+
-
-
@@ -37,7 +46,7 @@
-
-
+
Cancel
@@ -45,6 +54,9 @@
..
+
+ Qt::ToolButtonTextBesideIcon
+
@@ -67,192 +79,73 @@
-
-
-
-
- 12
-
-
-
-
-
- 6
-
-
-
-
-
-
- 0
- 0
-
-
-
- Qt::NoContextMenu
-
-
- Logout
-
-
-
- ..
-
-
-
- 64
- 64
-
-
-
- Qt::ToolButtonTextUnderIcon
-
-
-
- -
-
-
- Lock screen
-
-
-
- ..
-
-
-
- 64
- 64
-
-
-
- Qt::ToolButtonTextUnderIcon
-
-
-
-
-
- -
-
-
- 6
-
-
-
-
-
- Suspend
-
-
-
- ..
-
-
-
- 64
- 64
-
-
-
- Qt::ToolButtonTextUnderIcon
-
-
-
- -
-
-
- Hibernate
-
-
-
- ..
-
-
-
- 64
- 64
-
-
-
- Qt::ToolButtonTextUnderIcon
-
-
-
-
-
- -
-
-
- 6
-
-
-
-
-
- Shutdown
-
-
-
- ..
-
-
-
- 64
- 64
-
-
-
- Qt::ToolButtonTextUnderIcon
-
-
-
- -
-
-
- Reboot
-
-
-
- ..
-
-
-
- 64
- 64
-
-
-
- Qt::ToolButtonTextUnderIcon
-
-
-
-
-
- -
-
-
- Qt::Vertical
-
-
-
- -
-
-
- Qt::Vertical
-
-
-
-
+
+
+ Qt::NoContextMenu
+
+
+ #listWidget { background-color: palette(window); }
+QAbstractItemView { activate-on-singleclick: 1; }
+
+
+ QFrame::NoFrame
+
+
+ Qt::ScrollBarAlwaysOff
+
+
+ Qt::ScrollBarAlwaysOff
+
+
+ QAbstractScrollArea::AdjustToContents
+
+
+ false
+
+
+ QAbstractItemView::NoEditTriggers
+
+
+ true
+
+
+ QAbstractItemView::NoSelection
+
+
+
+ 64
+ 64
+
+
+
+ Qt::ElideNone
+
+
+ QListView::LeftToRight
+
+
+ true
+
+
+ 7
+
+
+ true
+
label
- buttonsWidget
+ listWidget
widget_2
-
- cancelButton
- logoutButton
- lockscreenButton
- shutdownButton
- rebootButton
- suspendButton
- hibernateButton
-
+
+
+ ListWidget
+ QListWidget
+
+
+
diff --git a/lxqt-leave/listwidget.cpp b/lxqt-leave/listwidget.cpp
new file mode 100644
index 0000000..84826ce
--- /dev/null
+++ b/lxqt-leave/listwidget.cpp
@@ -0,0 +1,241 @@
+/* BEGIN_COMMON_COPYRIGHT_HEADER
+ * (c)LGPL2+
+ *
+ * LXQt - a lightweight, Qt based, desktop toolset
+ * http://lxqt.org/
+ *
+ * Copyright: 2017 LXQt team
+ * Authors:
+ * Palo Kisa
+ *
+ * This program or library is free software; you can redistribute it
+ * and/or modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2.1 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General
+ * Public License along with this library; if not, write to the
+ * Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
+ * Boston, MA 02110-1301 USA
+ *
+ * END_COMMON_COPYRIGHT_HEADER */
+
+#include "listwidget.h"
+#include
+#include
+#include
+
+/*!
+ * This private delegate does:
+ * - returns unified sizeHint() -> maximum of all items in (list) model
+ * - cahes the sizeHint() to not iterate over all items and checking their size
+ * - overrides decoration position to Qt::Top
+ * - gives the items margins (increasing sizeHint()) ~~and mimics Button visual~~
+ * - overrides painting the focus around the whole item (with the decoration)
+ *
+ * \note It is a single purpose delegate and expects, that the model
+ * never changes (cached sizeHint() is never invalidated).
+ */
+class ItemDelegate : public QItemDelegate
+{
+public:
+ static constexpr QMargins MARGINS{5, 5, 5, 5};
+public:
+ using QItemDelegate::QItemDelegate;
+ virtual QSize sizeHint(const QStyleOptionViewItem &option, const QModelIndex &index) const override
+ {
+ if (mItemSize.isValid())
+ return mItemSize;
+
+ // compute maximum item size
+ QStyleOptionViewItem opt = option;
+ opt.decorationPosition = QStyleOptionViewItem::Top;
+ QAbstractListModel const * model = qobject_cast(index.model());
+ for (QModelIndex i = model->index(0); i.isValid(); i = model->index(i.row() + 1))
+ {
+ mItemSize = mItemSize.expandedTo(QItemDelegate::sizeHint(opt, i));
+ }
+ mItemSize += {MARGINS.left() + MARGINS.right(), MARGINS.top() + MARGINS.bottom()}; // add some margins
+ return mItemSize;
+ }
+
+ virtual void paint(QPainter *painter, const QStyleOptionViewItem &option, const QModelIndex &index) const override
+ {
+ /*
+ // mimic the button visual
+ QStyleOption button_option;
+ button_option.initFrom(option.widget);
+ button_option.rect = option.rect;
+ if (!(option.state & QStyle::State_HasFocus))
+ button_option.state &= ~QStyle::State_HasFocus;
+ QStyle * style = option.widget->style() ? option.widget->style() : QApplication::style();
+ style->drawPrimitive(QStyle::PE_PanelButtonTool, &button_option, painter, option.widget);
+ */
+ QStyleOptionViewItem opt = option;
+ opt.decorationPosition = QStyleOptionViewItem::Top;
+ opt.displayAlignment = Qt::AlignHCenter | Qt::AlignTop;
+ return QItemDelegate::paint(painter, opt, index);
+ }
+
+protected:
+ // Note: We want to paint the focus rectangle around the whole (text+icon)
+ // (default in QItemDelegate is to draw the focus only in text rectangle)
+ virtual void drawFocus(QPainter *painter
+ , const QStyleOptionViewItem &option
+ , const QRect &/*rect*/) const override
+ {
+ // don't override the rectangle to the text-only
+ return QItemDelegate::drawFocus(painter, option, option.rect);
+ }
+
+ virtual void drawDisplay(QPainter *painter
+ , const QStyleOptionViewItem &option
+ , const QRect &rect
+ , const QString &text) const override
+ {
+ // shrink (and move to bottom) the text rectangle
+ QRect r = rect.adjusted(0, MARGINS.top(), 0, 0);
+ return QItemDelegate::drawDisplay(painter, option, r, text);
+ }
+
+ virtual void drawDecoration(QPainter *painter
+ , const QStyleOptionViewItem &option
+ , const QRect &rect
+ , const QPixmap &pixmap) const override
+ {
+ // move to bottom the pixmap rectangle
+ QRect r = rect.translated(0, MARGINS.top());
+ return QItemDelegate::drawDecoration(painter, option, r, pixmap);
+ }
+private:
+ mutable QSize mItemSize; //!< the cached (unified/max) item size
+};
+constexpr QMargins ItemDelegate::MARGINS;
+
+ListWidget::ListWidget(QWidget * parent/* = nullptr*/)
+ : QListWidget{parent}
+ , mRows(3)
+ , mColumns(3)
+{
+ ItemDelegate * delegate = new ItemDelegate{this};
+ {
+ QScopedPointer old_del{itemDelegate()};
+ setItemDelegate(delegate);
+ }
+}
+
+void ListWidget::setRows(int rows)
+{
+ mRows = rows;
+}
+
+void ListWidget::setColumns(int columns)
+{
+ mColumns = columns;
+}
+
+QSize ListWidget::viewportSizeHint() const
+{
+ QSize size = sizeHintForIndex(model()->index(0, 0));
+ size.rwidth() = size.width() * mColumns + spacing() * mColumns * 2 + 1;
+ size.rheight() = size.height() * mRows + spacing() * mRows * 2 + 1;
+ return size;
+}
+
+QModelIndex ListWidget::moveCursor(CursorAction cursorAction, Qt::KeyboardModifiers/* modifiers*/)
+{
+ QModelIndex index = currentIndex();
+ int count = model()->rowCount(rootIndex());
+ int current = 0;
+ if (index.isValid())
+ {
+ current = index.row();
+ index = QModelIndex{}; // setting to invalid to get inside the for loop (move the position)
+ } else
+ {
+ current = cursorAction == MovePrevious ? count - 1 : 0;
+ index = model()->index(current, 0, rootIndex());
+ }
+
+ // if not enabled, try to find any next enabled
+ for (int tries = 1; tries < count && 0 == (model()->flags(index) & Qt::ItemIsEnabled); ++tries)
+ {
+ int next;
+ switch (cursorAction)
+ {
+ case MoveUp:
+ case MovePageUp:
+ next = (current - mColumns) % count;
+ break;
+ case MoveDown:
+ case MovePageDown:
+ next = (current + mColumns) % count;
+ break;
+ case MoveLeft:
+ if (0 == (current % mColumns))
+ current += mColumns;
+ // fall through
+ case MovePrevious:
+ if (current == 0)
+ return QModelIndex{};
+ next = (current - 1) % count;
+ break;
+ case MoveRight:
+ if ((mColumns - 1) == (current % mColumns))
+ current -= mColumns;
+ // fall through
+ case MoveNext:
+ if (current == count - 1)
+ return QModelIndex{};
+ next = (current + 1) % count;
+ break;
+ case MoveHome:
+ next = 0;
+ break;
+ case MoveEnd:
+ next = count - 1;
+ break;
+ }
+ if (next < 0)
+ next += count;
+
+ index = model()->index(next, 0, rootIndex());
+ current = next;
+ }
+ return index;
+
+}
+
+void ListWidget::keyPressEvent(QKeyEvent * event)
+{
+ if (event->key() == Qt::Key_Space)
+ {
+ // mimic the "enter" to fire activated
+ QKeyEvent k{event->type(), Qt::Key_Enter, event->modifiers(), event->text(), event->isAutoRepeat(), static_cast(event->count())};
+ QListWidget::keyPressEvent(&k);
+ event->setAccepted(k.isAccepted());
+ return;
+ }
+ return QListWidget::keyPressEvent(event);
+}
+
+void ListWidget::focusInEvent(QFocusEvent * event)
+{
+ switch (event->reason())
+ {
+ case Qt::TabFocusReason:
+ setCurrentIndex(model()->index(0, 0, rootIndex()));
+ break;
+ case Qt::BacktabFocusReason:
+ setCurrentIndex(model()->index(model()->rowCount(rootIndex()) - 1, 0, rootIndex()));
+ break;
+ default:
+ break;
+ }
+ return QListWidget::focusInEvent(event);
+}
diff --git a/lxqt-leave/listwidget.h b/lxqt-leave/listwidget.h
new file mode 100644
index 0000000..02d9c1e
--- /dev/null
+++ b/lxqt-leave/listwidget.h
@@ -0,0 +1,52 @@
+/* BEGIN_COMMON_COPYRIGHT_HEADER
+ * (c)LGPL2+
+ *
+ * LXQt - a lightweight, Qt based, desktop toolset
+ * http://lxqt.org/
+ *
+ * Copyright: 2017 LXQt team
+ * Authors:
+ * Palo Kisa
+ *
+ * This program or library is free software; you can redistribute it
+ * and/or modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2.1 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General
+ * Public License along with this library; if not, write to the
+ * Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
+ * Boston, MA 02110-1301 USA
+ *
+ * END_COMMON_COPYRIGHT_HEADER */
+
+#include
+
+/*!
+ * Single purpose QListWidget with unified item sizes (based on the
+ * biggest item) and showing rows x columns items.
+ *
+ * \note It expects that items aren't ever changed after show().
+ */
+class ListWidget : public QListWidget
+{
+public:
+ ListWidget(QWidget * parent = nullptr);
+ void setRows(int rows);
+ void setColumns(int columns);
+
+protected:
+ virtual QSize viewportSizeHint() const override;
+ virtual QModelIndex moveCursor(CursorAction cursorAction, Qt::KeyboardModifiers modifiers) override;
+ virtual void keyPressEvent(QKeyEvent * event) override;
+ virtual void focusInEvent(QFocusEvent * event) override;
+
+private:
+ int mRows;
+ int mColumns;
+};
diff --git a/lxqt-leave/main.cpp b/lxqt-leave/main.cpp
index aad9d4c..ebec59c 100644
--- a/lxqt-leave/main.cpp
+++ b/lxqt-leave/main.cpp
@@ -38,13 +38,20 @@
int main(int argc, char *argv[])
{
LXQt::SingleApplication a(argc, argv);
+ a.setAttribute(Qt::AA_UseHighDpiPixmaps, true);
+
LXQt::Translator::translateApplication();
LXQt::PowerManager powermanager(&a);
LXQt::ScreenSaver screensaver(&a);
QCommandLineParser parser;
- parser.setApplicationDescription(QStringLiteral("lxqt-leave"));
+ parser.setApplicationDescription(QStringLiteral("LXQt Leave"));
+ const QString VERINFO = QStringLiteral(LXQT_SESSION_VERSION
+ "\nliblxqt " LXQT_VERSION
+ "\nQt " QT_VERSION_STR);
+ a.setApplicationVersion(VERINFO);
+
parser.addHelpOption();
parser.addVersionOption();
diff --git a/lxqt-leave/translations/lxqt-hibernate_eu.desktop b/lxqt-leave/translations/lxqt-hibernate_eu.desktop
new file mode 100644
index 0000000..973ea02
--- /dev/null
+++ b/lxqt-leave/translations/lxqt-hibernate_eu.desktop
@@ -0,0 +1,4 @@
+#Translations
+Name[eu]=Hibernatu
+GenericName[eu]=Hibernatu
+Comment[eu]=Hibernatu ordenagailua
diff --git a/lxqt-leave/translations/lxqt-hibernate_lt.desktop b/lxqt-leave/translations/lxqt-hibernate_lt.desktop
new file mode 100644
index 0000000..00c83f1
--- /dev/null
+++ b/lxqt-leave/translations/lxqt-hibernate_lt.desktop
@@ -0,0 +1,3 @@
+Name[lt]=Užmigdyti
+GenericName[lt]=Užmigdyti
+Comment[lt]=Užmigdyti kompiuterį
diff --git a/lxqt-leave/translations/lxqt-leave_eu.desktop b/lxqt-leave/translations/lxqt-leave_eu.desktop
new file mode 100644
index 0000000..920e90a
--- /dev/null
+++ b/lxqt-leave/translations/lxqt-leave_eu.desktop
@@ -0,0 +1,4 @@
+#Translation
+Name[eu]=Utzi
+GenericName[eu]=Utzi
+Comment[eu]=Utzi elkarrizketa-koadroa
diff --git a/lxqt-leave/translations/lxqt-leave_lt.desktop b/lxqt-leave/translations/lxqt-leave_lt.desktop
new file mode 100644
index 0000000..e7beaee
--- /dev/null
+++ b/lxqt-leave/translations/lxqt-leave_lt.desktop
@@ -0,0 +1,3 @@
+Name[lt]=Išeiti
+GenericName[lt]=Išeiti
+Comment[lt]=Išėjimo dialogas
diff --git a/lxqt-leave/translations/lxqt-lockscreen_eu.desktop b/lxqt-leave/translations/lxqt-lockscreen_eu.desktop
new file mode 100644
index 0000000..3f9d72a
--- /dev/null
+++ b/lxqt-leave/translations/lxqt-lockscreen_eu.desktop
@@ -0,0 +1,4 @@
+#Translation
+Name[eu]=Blokeatu pantaila
+GenericName[eu]=Blokeatu pantaila
+Comment[eu]=Blokeatu uneko saioa
diff --git a/lxqt-leave/translations/lxqt-lockscreen_lt.desktop b/lxqt-leave/translations/lxqt-lockscreen_lt.desktop
new file mode 100644
index 0000000..56441b7
--- /dev/null
+++ b/lxqt-leave/translations/lxqt-lockscreen_lt.desktop
@@ -0,0 +1,3 @@
+Name[lt]=Užrakinti ekraną
+GenericName[lt]=Užrakinti ekraną
+Comment[lt]=Užrakinti esamą seansą
diff --git a/lxqt-leave/translations/lxqt-logout_eu.desktop b/lxqt-leave/translations/lxqt-logout_eu.desktop
new file mode 100644
index 0000000..3dbcd21
--- /dev/null
+++ b/lxqt-leave/translations/lxqt-logout_eu.desktop
@@ -0,0 +1,4 @@
+#Translation
+Name[eu]=Itxi saioa
+GenericName[eu]=Itxi saioa
+Comment[eu]=Itxi uneko saioa
diff --git a/lxqt-leave/translations/lxqt-logout_lt.desktop b/lxqt-leave/translations/lxqt-logout_lt.desktop
new file mode 100644
index 0000000..21621cc
--- /dev/null
+++ b/lxqt-leave/translations/lxqt-logout_lt.desktop
@@ -0,0 +1,4 @@
+#Translation
+Name[lt]=Atsijungti
+GenericName[lt]=Atsijungti
+Comment[lt]=Atsijungti iš esamo seanso
diff --git a/lxqt-leave/translations/lxqt-reboot_eu.desktop b/lxqt-leave/translations/lxqt-reboot_eu.desktop
new file mode 100644
index 0000000..ddf2595
--- /dev/null
+++ b/lxqt-leave/translations/lxqt-reboot_eu.desktop
@@ -0,0 +1,4 @@
+#Translation
+Name[eu]=Berrabiarazi
+GenericName[eu]=Berrabiarazi
+Comment[eu]=Berrabiarazi ordenagailua
diff --git a/lxqt-leave/translations/lxqt-reboot_lt.desktop b/lxqt-leave/translations/lxqt-reboot_lt.desktop
new file mode 100644
index 0000000..902e807
--- /dev/null
+++ b/lxqt-leave/translations/lxqt-reboot_lt.desktop
@@ -0,0 +1,4 @@
+#Translation
+Name[lt]=Paleisti iš naujo
+GenericName[lt]=Paleisti iš naujo
+Comment[lt]=Paleisti kompiuterį iš naujo
diff --git a/lxqt-leave/translations/lxqt-shutdown_eu.desktop b/lxqt-leave/translations/lxqt-shutdown_eu.desktop
new file mode 100644
index 0000000..ce0f878
--- /dev/null
+++ b/lxqt-leave/translations/lxqt-shutdown_eu.desktop
@@ -0,0 +1,4 @@
+#Translation
+Name[eu]=Itzali
+GenericName[eu]=Itzali
+Comment[eu]=Itzali ordenagailua
diff --git a/lxqt-leave/translations/lxqt-shutdown_lt.desktop b/lxqt-leave/translations/lxqt-shutdown_lt.desktop
new file mode 100644
index 0000000..5051308
--- /dev/null
+++ b/lxqt-leave/translations/lxqt-shutdown_lt.desktop
@@ -0,0 +1,4 @@
+#Translation
+Name[lt]=Išjungti
+GenericName[lt]=Išjungti
+Comment[lt]=Išjungti kompiuterį
diff --git a/lxqt-leave/translations/lxqt-suspend_eu.desktop b/lxqt-leave/translations/lxqt-suspend_eu.desktop
new file mode 100644
index 0000000..fd550cc
--- /dev/null
+++ b/lxqt-leave/translations/lxqt-suspend_eu.desktop
@@ -0,0 +1,4 @@
+#Translation
+Name[eu]=Eseki
+GenericName[eu]=Eseki
+Comment[eu]=Eseki ordenagailua
diff --git a/lxqt-leave/translations/lxqt-suspend_lt.desktop b/lxqt-leave/translations/lxqt-suspend_lt.desktop
new file mode 100644
index 0000000..b79502f
--- /dev/null
+++ b/lxqt-leave/translations/lxqt-suspend_lt.desktop
@@ -0,0 +1,4 @@
+#Translation
+Name[lt]=Pristabdyti
+GenericName[lt]=Pristabdyti
+Comment[lt]=Pristabdyti kompiuterį
diff --git a/lxqt-session/src/UdevNotifier.cpp b/lxqt-session/src/UdevNotifier.cpp
index eb32d40..3b87f87 100644
--- a/lxqt-session/src/UdevNotifier.cpp
+++ b/lxqt-session/src/UdevNotifier.cpp
@@ -52,7 +52,7 @@ UdevNotifier::UdevNotifier(QString const & subsystem, QObject * parent/* = nullp
return;
}
- int ret = udev_monitor_filter_add_match_subsystem_devtype(d->monitor, subsystem.toUtf8().constData(), nullptr);
+ int ret = udev_monitor_filter_add_match_subsystem_devtype(d->monitor, subsystem.toLatin1().constData(), nullptr);
if (0 != ret)
qCWarning(SESSION) << QStringLiteral("UdevNotifier: unable to add match subsystem, monitor will receive all devices");
@@ -75,7 +75,7 @@ UdevNotifier::~UdevNotifier()
udev_unref(d->udev);
}
-void UdevNotifier::eventReady(int socket)
+void UdevNotifier::eventReady(int /*socket*/)
{
struct udev_device * dev;
while (nullptr != (dev = udev_monitor_receive_device(d->monitor)))
diff --git a/lxqt-session/src/lockscreenmanager.cpp b/lxqt-session/src/lockscreenmanager.cpp
index 1874857..ab436ff 100644
--- a/lxqt-session/src/lockscreenmanager.cpp
+++ b/lxqt-session/src/lockscreenmanager.cpp
@@ -34,6 +34,7 @@
LockScreenManager::LockScreenManager(QObject *parent) :
QObject(parent)
+ , mProvider{nullptr}
{
}
diff --git a/lxqt-session/src/lxqtmodman.cpp b/lxqt-session/src/lxqtmodman.cpp
index fbb8ab8..d2954cd 100644
--- a/lxqt-session/src/lxqtmodman.cpp
+++ b/lxqt-session/src/lxqtmodman.cpp
@@ -57,9 +57,8 @@ using namespace LXQt;
/**
* @brief the constructor, needs a valid modules.conf
*/
-LXQtModuleManager::LXQtModuleManager(const QString & windowManager, QObject* parent)
+LXQtModuleManager::LXQtModuleManager(QObject* parent)
: QObject(parent),
- mWindowManager(windowManager),
mWmProcess(new QProcess(this)),
mThemeWatcher(new QFileSystemWatcher(this)),
mWmStarted(false),
@@ -72,6 +71,11 @@ LXQtModuleManager::LXQtModuleManager(const QString & windowManager, QObject* par
qApp->installNativeEventFilter(this);
}
+void LXQtModuleManager::setWindowManager(const QString & windowManager)
+{
+ mWindowManager = windowManager;
+}
+
void LXQtModuleManager::startup(LXQt::Settings& s)
{
// The lxqt-confupdate can update the settings of the WM, so run it first.
@@ -277,7 +281,7 @@ void LXQtModuleManager::startConfUpdate()
startProcess(desktop);
}
-void LXQtModuleManager::restartModules(int exitCode, QProcess::ExitStatus exitStatus)
+void LXQtModuleManager::restartModules(int /*exitCode*/, QProcess::ExitStatus exitStatus)
{
LXQtModule* proc = qobject_cast(sender());
if (nullptr == proc) {
@@ -347,7 +351,7 @@ LXQtModuleManager::~LXQtModuleManager()
/**
* @brief this logs us out by terminating our session
**/
-void LXQtModuleManager::logout()
+void LXQtModuleManager::logout(bool doExit)
{
// modules
ModulesMapIterator i(mNameMap);
@@ -377,7 +381,8 @@ void LXQtModuleManager::logout()
mWmProcess->kill();
}
- QCoreApplication::exit(0);
+ if (doExit)
+ QCoreApplication::exit(0);
}
QString LXQtModuleManager::showWmSelectDialog()
@@ -396,7 +401,7 @@ void LXQtModuleManager::resetCrashReport()
mCrashReport.clear();
}
-bool LXQtModuleManager::nativeEventFilter(const QByteArray & eventType, void * message, long * result)
+bool LXQtModuleManager::nativeEventFilter(const QByteArray & eventType, void * /*message*/, long * /*result*/)
{
if (eventType != "xcb_generic_event_t") // We only want to handle XCB events
return false;
diff --git a/lxqt-session/src/lxqtmodman.h b/lxqt-session/src/lxqtmodman.h
index 1650cf3..fbebc15 100644
--- a/lxqt-session/src/lxqtmodman.h
+++ b/lxqt-session/src/lxqtmodman.h
@@ -72,9 +72,12 @@ class LXQtModuleManager : public QObject, public QAbstractNativeEventFilter
public:
//! \brief Construct LXQtModuleManager
- LXQtModuleManager(const QString& windowManager, QObject* parent = 0);
+ LXQtModuleManager(QObject* parent = 0);
virtual ~LXQtModuleManager();
+ //! \brief Set the window manager (e.g. "/usr/bin/openbox")
+ void setWindowManager(const QString & windowManager);
+
//! \brief Start a module given its file name (e.g. "lxqt-panel.desktop")
void startProcess(const QString& name);
@@ -96,7 +99,7 @@ public slots:
gracefully (to kill it if it is not possible). Then the session
exits - it returns to the kdm/gdm in most cases.
*/
- void logout();
+ void logout(bool doExit);
signals:
void moduleStateChanged(QString moduleName, bool state);
diff --git a/lxqt-session/src/main.cpp b/lxqt-session/src/main.cpp
index b7d2a87..435660b 100644
--- a/lxqt-session/src/main.cpp
+++ b/lxqt-session/src/main.cpp
@@ -26,6 +26,7 @@
* END_COMMON_COPYRIGHT_HEADER */
#include "sessionapplication.h"
+#include
/**
* @file main.cpp
@@ -48,6 +49,22 @@ int main(int argc, char **argv)
{
SessionApplication app(argc, argv);
//qDebug() << "LXQt Session start";
+ QCommandLineParser parser;
+ parser.setApplicationDescription(QStringLiteral("LXQt Session"));
+ const QString VERINFO = QStringLiteral(LXQT_SESSION_VERSION
+ "\nliblxqt " LXQT_VERSION
+ "\nQt " QT_VERSION_STR);
+ app.setApplicationVersion(VERINFO);
+ const QCommandLineOption config_opt{{"c", "config"}, SessionApplication::tr("Configuration file path."), SessionApplication::tr("file")};
+ const QCommandLineOption wm_opt{{"w", "window-manager"}, SessionApplication::tr("Window manager to use."), SessionApplication::tr("file")};
+ const auto version_opt = parser.addVersionOption();
+ const auto help_opt = parser.addHelpOption();
+ parser.addOptions({config_opt, wm_opt});
+ parser.process(app);
+
+ app.setConfigName(parser.value(config_opt));
+ app.setWindowManager(parser.value(wm_opt));
+
app.setQuitOnLastWindowClosed(false);
return app.exec();
}
diff --git a/lxqt-session/src/numlock.cpp b/lxqt-session/src/numlock.cpp
index 5430f7f..18fd20e 100644
--- a/lxqt-session/src/numlock.cpp
+++ b/lxqt-session/src/numlock.cpp
@@ -38,7 +38,7 @@
/* the XKB stuff is based on code created by Oswald Buddenhagen */
-static unsigned int xkb_mask_modifier(Display* dpy, XkbDescPtr xkb, const char *name )
+static unsigned int xkb_mask_modifier(Display* /*dpy*/, XkbDescPtr xkb, const char *name )
{
int i;
if( !xkb || !xkb->names )
diff --git a/lxqt-session/src/sessionapplication.cpp b/lxqt-session/src/sessionapplication.cpp
index cf6ed74..570558b 100644
--- a/lxqt-session/src/sessionapplication.cpp
+++ b/lxqt-session/src/sessionapplication.cpp
@@ -38,30 +38,9 @@ SessionApplication::SessionApplication(int& argc, char** argv) :
lockScreenManager(new LockScreenManager(this))
{
listenToUnixSignals({SIGINT, SIGTERM, SIGQUIT, SIGHUP});
- char* winmanager = NULL;
- int c;
- while ((c = getopt (argc, argv, "c:w:")) != -1)
- {
- if (c == 'c')
- {
- configName = optarg;
- break;
- }
- else if (c == 'w')
- {
- winmanager = optarg;
- break;
- }
- }
-
- if(configName.isEmpty())
- configName = "session";
-
- // tell the world which config file we're using.
- qputenv("LXQT_SESSION_CONFIG", configName.toUtf8());
- modman = new LXQtModuleManager(winmanager);
- connect(this, &LXQt::Application::unixSignal, modman, &LXQtModuleManager::logout);
+ modman = new LXQtModuleManager;
+ connect(this, &LXQt::Application::unixSignal, modman, [this] { modman->logout(true); });
new SessionDBusAdaptor(modman);
// connect to D-Bus and register as an object:
QDBusConnection::sessionBus().registerService("org.lxqt.session");
@@ -76,6 +55,20 @@ SessionApplication::~SessionApplication()
delete modman;
}
+void SessionApplication::setWindowManager(const QString& windowManager)
+{
+ modman->setWindowManager(windowManager);
+}
+
+void SessionApplication::setConfigName(const QString& configName)
+{
+ if(configName.isEmpty())
+ this->configName = "session";
+
+ // tell the world which config file we're using.
+ qputenv("LXQT_SESSION_CONFIG", this->configName.toLocal8Bit());
+}
+
bool SessionApplication::startup()
{
LXQt::Settings settings(configName);
@@ -135,7 +128,7 @@ void SessionApplication::loadEnvironmentSettings(LXQt::Settings& settings)
Q_FOREACH (QString i, settings.childKeys())
{
envVal = settings.value(i).toByteArray();
- lxqt_setenv(i.toUtf8().constData(), envVal);
+ lxqt_setenv(i.toLocal8Bit().constData(), envVal);
}
settings.endGroup();
}
diff --git a/lxqt-session/src/sessionapplication.h b/lxqt-session/src/sessionapplication.h
index f65da0a..421f705 100644
--- a/lxqt-session/src/sessionapplication.h
+++ b/lxqt-session/src/sessionapplication.h
@@ -32,6 +32,8 @@ class SessionApplication : public LXQt::Application
public:
SessionApplication(int& argc, char** argv);
~SessionApplication();
+ void setWindowManager(const QString & windowManager);
+ void setConfigName(const QString & configName);
private Q_SLOTS:
bool startup();
diff --git a/lxqt-session/src/sessiondbusadaptor.h b/lxqt-session/src/sessiondbusadaptor.h
index 283e6f0..ecb1f3f 100644
--- a/lxqt-session/src/sessiondbusadaptor.h
+++ b/lxqt-session/src/sessiondbusadaptor.h
@@ -29,6 +29,7 @@
#define SESSIONDBUS_H
#include
+#include
#include "lxqtmodman.h"
@@ -46,7 +47,8 @@ class SessionDBusAdaptor : public QDBusAbstractAdaptor
public:
SessionDBusAdaptor(LXQtModuleManager * manager)
: QDBusAbstractAdaptor(manager),
- m_manager(manager)
+ m_manager(manager),
+ m_power(false/*don't use ourself, just all other power providers*/)
{
connect(m_manager, SIGNAL(moduleStateChanged(QString,bool)), SIGNAL(moduleStateChanged(QString,bool)));
}
@@ -63,9 +65,33 @@ public slots:
return true;
}
+ bool canReboot()
+ {
+ return m_power.canReboot();
+ }
+
+ bool canPowerOff()
+ {
+ return m_power.canShutdown();
+ }
+
Q_NOREPLY void logout()
{
- m_manager->logout();
+ m_manager->logout(true);
+ }
+
+ Q_NOREPLY void reboot()
+ {
+ m_manager->logout(false);
+ m_power.reboot();
+ QCoreApplication::exit(0);
+ }
+
+ Q_NOREPLY void powerOff()
+ {
+ m_manager->logout(false);
+ m_power.shutdown();
+ QCoreApplication::exit(0);
}
QDBusVariant listModules()
@@ -85,6 +111,7 @@ public slots:
private:
LXQtModuleManager * m_manager;
+ LXQt::Power m_power;
};
#endif
diff --git a/lxqt-session/src/wmselectdialog.cpp b/lxqt-session/src/wmselectdialog.cpp
index f320977..7292c05 100644
--- a/lxqt-session/src/wmselectdialog.cpp
+++ b/lxqt-session/src/wmselectdialog.cpp
@@ -107,7 +107,7 @@ void WmSelectDialog::addWindowManager(const WindowManager &wm)
}
-void WmSelectDialog::selectFileDialog(const QModelIndex &index)
+void WmSelectDialog::selectFileDialog(const QModelIndex &/*index*/)
{
QTreeWidget *wmList = ui->wmList;
QTreeWidgetItem *item = wmList->currentItem();
@@ -130,7 +130,7 @@ void WmSelectDialog::selectFileDialog(const QModelIndex &index)
ui->wmList->setCurrentItem(wmItem);
}
-void WmSelectDialog::changeBtnStatus(const QModelIndex &index)
+void WmSelectDialog::changeBtnStatus(const QModelIndex &/*index*/)
{
QString wm = windowManager();
ui->buttonBox->setEnabled(!wm.isEmpty() && findProgram(wm));
diff --git a/startlxqt.1 b/startlxqt.1
new file mode 100644
index 0000000..9eaba03
--- /dev/null
+++ b/startlxqt.1
@@ -0,0 +1,48 @@
+.TH STARTLXQT 1 2015-11-03 "LXQt 0.10.0" "LXQt session management"
+.SH NAME
+startlxqt \- script to initialize and launch LXQt sessions
+.SH SYNOPSIS
+.B startlxqt
+.SH DESCRIPTION
+\fBstartlxqt\fR is a shell script meant to initialize and launch LXQt sessions.
+It is as such similar to counterparts of other desktop environments like startlxde in
+LXDE or startkde in KDE.
+.P
+It's main tasks are exporting environment variables, partly after performing
+corresponding checks, and launching \fBlxqt-session\fR, the LXQt session manager.
+.P
+It is not meant to be run by users.
+Rather, it is invoked as backend, e. g. by script \fBstartx\fR on virtual terminals or display
+managers like SDDM or LightDM, see section \fIEXAMPLE\fR.
+.SH FILES
+.I $XDG_DATA_DIRS/xsessions/lxqt.desktop
+.RS 5
+Desktop entry file stating startlxqt as binary needed to start LXQt sessions. Sourced e. g.
+by display managers.
+.RE
+.SH BUGS
+None at the time of this writing. Bugs can be reported on https://github.com/lxde/lxqt/issues.
+.SH EXAMPLE
+To start an LXQt session from a virtual terminal (virtual console) add a line
+.P
+.RS 5
+exec startlxqt
+.RE
+.P
+to file \fI~/.xinitrc\fR. An LXQt session will then be launched by running \fBstartx\fR.
+.P
+Display managers are making use of scripts like \fBstartlxqt\fR automatically. Information about
+available desktop environments is provided by files \fI$XDG_DATA_DIRS/xsessions/*.desktop\fR, typically
+\fI/usr/share/xessions/*.desktop\fR.
+.br
+File \fIlxqt.desktop\fR provided by LXQt is stating \fBstartlxqt\fR in key \fIExec\fR while making sure the session
+manager \fBlxqt-session\fR does exist by stating it in key \fITryExec\fR.
+.SH SEE ALSO
+.BR lxqt-session (1)
+.BR startx (1)
+.BR sddm (1)
+.P
+.B http://www.freedesktop.org/wiki/Specifications/desktop-entry-spec/
+.RS 5
+Desktop Entry Specification defining desktop entry files (*.desktop).
+.RE
diff --git a/startlxqt.in b/startlxqt.in
new file mode 100755
index 0000000..02ef0c2
--- /dev/null
+++ b/startlxqt.in
@@ -0,0 +1,99 @@
+#!/bin/sh
+
+contains()
+{
+ local str="$1" substr="$2"
+ [ "$str" = "$substr" -o -z "${str##$substr:*}" -o -z "${str##*:$substr:*}" -o -z "${str%%*:$substr}" ]
+}
+
+if [ -z "$XDG_DATA_HOME" ]; then
+ export XDG_DATA_HOME="$HOME/.local/share"
+fi
+
+if [ -z "$XDG_CONFIG_HOME" ]; then
+ export XDG_CONFIG_HOME="$HOME/.config"
+fi
+
+if [ -z "$XDG_DATA_DIRS" ]; then
+ XDG_DATA_DIRS="@PREDEF_XDG_DATA_DIRS@"
+else
+ if ! contains "$XDG_DATA_DIRS" "@LXQT_DATA_DIR@"; then
+ XDG_DATA_DIRS="$XDG_DATA_DIRS:@LXQT_DATA_DIR@"
+ fi
+fi
+export XDG_DATA_DIRS
+
+if [ -z "$XDG_CONFIG_DIRS" ]; then
+ export XDG_CONFIG_DIRS="@LXQT_ETC_XDG_DIR@"
+else
+ if ! contains "$XDG_CONFIG_DIRS" '@LXQT_ETC_XDG_DIR@'; then
+ XDG_CONFIG_DIRS="$XDG_CONFIG_DIRS:@LXQT_ETC_XDG_DIR@"
+ fi
+fi
+
+if [ -z "$XDG_CACHE_HOME" ]; then
+ export XDG_CACHE_HOME="$HOME/.cache"
+fi
+
+# Ensure the existance of the 'Desktop' folder
+if [ -e "$XDG_CONFIG_HOME/user-dirs.dirs" ]; then
+ . "$XDG_CONFIG_HOME/user-dirs.dirs"
+else
+ XDG_DESKTOP_DIR="$HOME/Desktop"
+fi
+mkdir -p "$XDG_DESKTOP_DIR"
+
+# Clean up after GDM (GDM sets the number of desktops to one)
+xprop -root -remove _NET_NUMBER_OF_DESKTOPS -remove _NET_DESKTOP_NAMES -remove _NET_CURRENT_DESKTOP 2> /dev/null
+
+# Enable Qt integration for OpenOffice.org, if available.
+if [ -z "$SAL_USE_VCLPLUGIN" ]; then
+ export SAL_USE_VCLPLUGIN=kde4
+fi
+
+# Launch DBus if needed
+if [ -z "$DBUS_SESSION_BUS_ADDRESS" ]; then
+ if [ -z "$XDG_RUNTIME_DIR" ] || ! [ -S "$XDG_RUNTIME_DIR/bus" ] || ! [ -O "$XDG_RUNTIME_DIR/bus" ]; then
+ eval "$(dbus-launch --sh-syntax --exit-with-session)" || echo "startlxqt: error executing dbus-launch" >&2
+ fi
+fi
+
+# Copy default settings of openbox
+if [ ! -e "$XDG_CONFIG_HOME/openbox/lxqt-rc.xml" ] ; then
+ ob_config_copied=0
+ for considered_file in 'lxde-rc.xml' 'rc.xml'; do
+ if [ -e "$XDG_CONFIG_HOME/openbox/$considered_file" ]; then
+ #copy existing configuration of openbox
+ cp "$XDG_CONFIG_HOME/openbox/$considered_file" "$XDG_CONFIG_HOME/openbox/lxqt-rc.xml"
+ message="Your existing configuration for openbox '$XDG_CONFIG_HOME/openbox/$considered_file' was used to
+fill the LXQt's openbox configuration '$XDG_CONFIG_HOME/openbox/lxqt-rc.xml'.
+If you want to use the predefined LXQt's openbox configuration, run:
+ cp '@LXQT_ETC_XDG_DIR@/openbox/lxqt-rc.xml' '$XDG_CONFIG_HOME/openbox'"
+ echo "$message" >&2
+ xmessage -center -title "LXQt Openbox configuration" "$message" &
+ ob_config_copied=1
+ break
+ fi
+ done
+ if [ 0 -eq "$ob_config_copied" ]; then
+ #copy predefined configuration
+ mkdir -p "$XDG_CONFIG_HOME/openbox"
+ #user/distribution can change the default configuration via LXQT_DEFAULT_OPENBOX_CONFIG
+ [ -r "$LXQT_DEFAULT_OPENBOX_CONFIG" ] || LXQT_DEFAULT_OPENBOX_CONFIG='@LXQT_ETC_XDG_DIR@/openbox/lxqt-rc.xml'
+ cp "$LXQT_DEFAULT_OPENBOX_CONFIG" "$XDG_CONFIG_HOME/openbox"
+ fi
+fi
+
+# Qt4 platform plugin
+export QT_PLATFORM_PLUGIN=lxqt
+
+# Qt5 platform plugin
+export QT_QPA_PLATFORMTHEME=lxqt
+
+# use lxqt-applications.menu for main app menu
+export XDG_MENU_PREFIX="lxqt-"
+
+export XDG_CURRENT_DESKTOP="LXQt"
+
+# Start the LXQt session
+exec lxqt-session
diff --git a/xsession/CMakeLists.txt b/xsession/CMakeLists.txt
new file mode 100644
index 0000000..00b94ab
--- /dev/null
+++ b/xsession/CMakeLists.txt
@@ -0,0 +1,29 @@
+# TODO/FIXME: install kdm/gdm files too
+# this file should be enough but it needs testing...
+file(GLOB SESSION_FILES_IN *.desktop.in)
+
+# Translations **********************************
+lxqt_translate_desktop(SESSION_FILES
+ SOURCES
+ ${SESSION_FILES_IN}
+)
+add_custom_target(xsession_desktop_files ALL DEPENDS ${SESSION_FILES})
+#************************************************
+
+MACRO(INSTALL_SESSION_FILES directory)
+# if(EXISTS ${directory})
+ install(FILES
+ ${SESSION_FILES}
+ DESTINATION "${directory}"
+ COMPONENT Runtime
+ )
+# endif()
+ENDMACRO(INSTALL_SESSION_FILES)
+
+#INSTALL_SESSION_FILES("/etc/X11/sessions")
+#INSTALL_SESSION_FILES("/usr/share/sessions")
+INSTALL_SESSION_FILES("${CMAKE_INSTALL_DATAROOTDIR}/xsessions")
+INSTALL_SESSION_FILES("${CMAKE_INSTALL_DATAROOTDIR}/kdm/sessions")
+#INSTALL_SESSION_FILES("/usr/local/share/apps/kdm/sessions")
+#INSTALL_SESSION_FILES("/usr/share/config/kdm/sessions")
+#INSTALL_SESSION_FILES("/usr/local/share/config/kdm/sessions")
diff --git a/xsession/lxqt.desktop.in b/xsession/lxqt.desktop.in
new file mode 100644
index 0000000..42fa78f
--- /dev/null
+++ b/xsession/lxqt.desktop.in
@@ -0,0 +1,8 @@
+[Desktop Entry]
+Type=Application
+Exec=startlxqt
+TryExec=lxqt-session
+Name=LXQt Desktop
+Comment=Lightweight Qt Desktop
+
+#TRANSLATIONS_DIR=translations
diff --git a/xsession/translations/lxqt_ar.desktop b/xsession/translations/lxqt_ar.desktop
new file mode 100644
index 0000000..59dd8c3
--- /dev/null
+++ b/xsession/translations/lxqt_ar.desktop
@@ -0,0 +1,3 @@
+# Translations
+Name[ar]=سطح المكتب ريزر
+Comment[ar]=سطح المكتب كيوت٤
diff --git a/xsession/translations/lxqt_cs.desktop b/xsession/translations/lxqt_cs.desktop
new file mode 100644
index 0000000..01c0039
--- /dev/null
+++ b/xsession/translations/lxqt_cs.desktop
@@ -0,0 +1,3 @@
+# Translations
+Name[cs]=Plocha LXQt
+Comment[cs]=Pracovní plocha na Qt
diff --git a/xsession/translations/lxqt_cs_CZ.desktop b/xsession/translations/lxqt_cs_CZ.desktop
new file mode 100644
index 0000000..e22341a
--- /dev/null
+++ b/xsession/translations/lxqt_cs_CZ.desktop
@@ -0,0 +1,3 @@
+# Translations
+Name[cs_CZ]=Pracovní plocha LXQt
+Comment[cs_CZ]=Pracovní plocha Qt
diff --git a/xsession/translations/lxqt_da.desktop b/xsession/translations/lxqt_da.desktop
new file mode 100644
index 0000000..7786f96
--- /dev/null
+++ b/xsession/translations/lxqt_da.desktop
@@ -0,0 +1,3 @@
+# Translations
+Name[da]=LXQt-skrivebord
+Comment[da]=Letvægts Qt-skrivebord
diff --git a/xsession/translations/lxqt_de.desktop b/xsession/translations/lxqt_de.desktop
new file mode 100644
index 0000000..1805817
--- /dev/null
+++ b/xsession/translations/lxqt_de.desktop
@@ -0,0 +1,3 @@
+# Translations
+Name[de]=LXQt Arbeitsumgebung
+Comment[de]=Leichtgewichtige Qt Arbeitsumgebung
diff --git a/xsession/translations/lxqt_el.desktop b/xsession/translations/lxqt_el.desktop
new file mode 100644
index 0000000..d5d0205
--- /dev/null
+++ b/xsession/translations/lxqt_el.desktop
@@ -0,0 +1,3 @@
+# Translations
+Name[el]=Επιφάνεια εργασίας LXQt
+Comment[el]=Ελαφριά επιφάνεια εργασίας Qt
diff --git a/xsession/translations/lxqt_eo.desktop b/xsession/translations/lxqt_eo.desktop
new file mode 100644
index 0000000..c82a81d
--- /dev/null
+++ b/xsession/translations/lxqt_eo.desktop
@@ -0,0 +1,3 @@
+# Translations
+Name[eo]=LXQta labortablo
+Comment[eo]=Qt-labortablo
diff --git a/xsession/translations/lxqt_es.desktop b/xsession/translations/lxqt_es.desktop
new file mode 100644
index 0000000..ca698b2
--- /dev/null
+++ b/xsession/translations/lxqt_es.desktop
@@ -0,0 +1,3 @@
+# Translations
+Name[es]=Escritorio LXQt
+Comment[es]=Escritorio Qt
diff --git a/xsession/translations/lxqt_es_VE.desktop b/xsession/translations/lxqt_es_VE.desktop
new file mode 100644
index 0000000..428daa9
--- /dev/null
+++ b/xsession/translations/lxqt_es_VE.desktop
@@ -0,0 +1,3 @@
+# Translations
+Name[es_VE]=Escritorio LXQt
+Comment[es_VE]=Escritorio Qt
diff --git a/xsession/translations/lxqt_eu.desktop b/xsession/translations/lxqt_eu.desktop
new file mode 100644
index 0000000..2da53be
--- /dev/null
+++ b/xsession/translations/lxqt_eu.desktop
@@ -0,0 +1,3 @@
+# Translations
+Name[eu]=LXQt mahaigaina
+Comment[eu]=Qt mahaigaina
diff --git a/xsession/translations/lxqt_fi.desktop b/xsession/translations/lxqt_fi.desktop
new file mode 100644
index 0000000..29bc2c4
--- /dev/null
+++ b/xsession/translations/lxqt_fi.desktop
@@ -0,0 +1,3 @@
+# Translations
+Name[fi]=LXQt-työpöytä
+Comment[fi]=Qt-työpöytä
diff --git a/xsession/translations/lxqt_fr.desktop b/xsession/translations/lxqt_fr.desktop
new file mode 100644
index 0000000..2d8006a
--- /dev/null
+++ b/xsession/translations/lxqt_fr.desktop
@@ -0,0 +1,3 @@
+# Translations
+Name[fr]=Bureau LXQt
+Comment[fr]=Bureau léger pour Qt
diff --git a/xsession/translations/lxqt_hu.desktop b/xsession/translations/lxqt_hu.desktop
new file mode 100644
index 0000000..91da4e9
--- /dev/null
+++ b/xsession/translations/lxqt_hu.desktop
@@ -0,0 +1,3 @@
+# Translations
+Name[hu]=LXQt asztal
+Comment[hu]=Qt asztali környezet
diff --git a/xsession/translations/lxqt_ia.desktop b/xsession/translations/lxqt_ia.desktop
new file mode 100644
index 0000000..26b0d99
--- /dev/null
+++ b/xsession/translations/lxqt_ia.desktop
@@ -0,0 +1 @@
+# Translations
diff --git a/xsession/translations/lxqt_id_ID.desktop b/xsession/translations/lxqt_id_ID.desktop
new file mode 100644
index 0000000..26b0d99
--- /dev/null
+++ b/xsession/translations/lxqt_id_ID.desktop
@@ -0,0 +1 @@
+# Translations
diff --git a/xsession/translations/lxqt_it_IT.desktop b/xsession/translations/lxqt_it_IT.desktop
new file mode 100644
index 0000000..e9157c1
--- /dev/null
+++ b/xsession/translations/lxqt_it_IT.desktop
@@ -0,0 +1,3 @@
+# Translations
+Name[it_IT]=Desktop LXQt
+Comment[it_IT]=Desktop Qt
diff --git a/xsession/translations/lxqt_ja.desktop b/xsession/translations/lxqt_ja.desktop
new file mode 100644
index 0000000..0e4e77b
--- /dev/null
+++ b/xsession/translations/lxqt_ja.desktop
@@ -0,0 +1,3 @@
+# Translations
+Name[ja]=LXQt デスクトップ
+Comment[ja]=Qt デスクトップ
diff --git a/xsession/translations/lxqt_ko.desktop b/xsession/translations/lxqt_ko.desktop
new file mode 100644
index 0000000..26b0d99
--- /dev/null
+++ b/xsession/translations/lxqt_ko.desktop
@@ -0,0 +1 @@
+# Translations
diff --git a/xsession/translations/lxqt_lt.desktop b/xsession/translations/lxqt_lt.desktop
new file mode 100644
index 0000000..22bd113
--- /dev/null
+++ b/xsession/translations/lxqt_lt.desktop
@@ -0,0 +1,3 @@
+# Translations
+Name[lt]=LXQt darbalaukis
+Comment[lt]=Supaprastintas Qt darbalaukis
diff --git a/xsession/translations/lxqt_nl.desktop b/xsession/translations/lxqt_nl.desktop
new file mode 100644
index 0000000..f02be27
--- /dev/null
+++ b/xsession/translations/lxqt_nl.desktop
@@ -0,0 +1,3 @@
+# Translations
+Name[nl]=LXQt Bureaublad
+Comment[nl]=Qt Bureaublad
diff --git a/xsession/translations/lxqt_pl.desktop b/xsession/translations/lxqt_pl.desktop
new file mode 100644
index 0000000..9f49161
--- /dev/null
+++ b/xsession/translations/lxqt_pl.desktop
@@ -0,0 +1,3 @@
+# Translations
+Name[pl]=Pulpit LXQt
+Comment[pl]=Pulpit Qt
diff --git a/xsession/translations/lxqt_pl_PL.desktop b/xsession/translations/lxqt_pl_PL.desktop
new file mode 100644
index 0000000..746f5fb
--- /dev/null
+++ b/xsession/translations/lxqt_pl_PL.desktop
@@ -0,0 +1,3 @@
+# Translations
+Name[pl_PL]=Pulpit LXQt
+Comment[pl_PL]=Środowisko graficzne Qt
diff --git a/xsession/translations/lxqt_pt.desktop b/xsession/translations/lxqt_pt.desktop
new file mode 100644
index 0000000..3a601b5
--- /dev/null
+++ b/xsession/translations/lxqt_pt.desktop
@@ -0,0 +1,3 @@
+# Translations
+Name[pt]=Ambiente de trabalho LXQt
+Comment[pt]=Ambiente de trabalho em Qt
diff --git a/xsession/translations/lxqt_pt_BR.desktop b/xsession/translations/lxqt_pt_BR.desktop
new file mode 100644
index 0000000..1b9ef6a
--- /dev/null
+++ b/xsession/translations/lxqt_pt_BR.desktop
@@ -0,0 +1,3 @@
+# Translations
+Name[pt_BR]=Área de trabalho LXQt
+Comment[pt_BR]=Área de trabalho Qt
diff --git a/xsession/translations/lxqt_ro_RO.desktop b/xsession/translations/lxqt_ro_RO.desktop
new file mode 100644
index 0000000..d427c49
--- /dev/null
+++ b/xsession/translations/lxqt_ro_RO.desktop
@@ -0,0 +1,3 @@
+# Translations
+Name[ro_RO]=Desktop LXQt
+Comment[ro_RO]=Desktop Qt
diff --git a/xsession/translations/lxqt_ru.desktop b/xsession/translations/lxqt_ru.desktop
new file mode 100644
index 0000000..89612a1
--- /dev/null
+++ b/xsession/translations/lxqt_ru.desktop
@@ -0,0 +1,3 @@
+# Translations
+Name[ru]=Рабочий стол LXQt
+Comment[ru]=Рабочий стол на Qt
diff --git a/xsession/translations/lxqt_ru_RU.desktop b/xsession/translations/lxqt_ru_RU.desktop
new file mode 100644
index 0000000..bbe6fa2
--- /dev/null
+++ b/xsession/translations/lxqt_ru_RU.desktop
@@ -0,0 +1,3 @@
+# Translations
+Name[ru_RU]=Рабочий стол LXQt
+Comment[ru_RU]=Среда рабочего стола, использующая Qt
diff --git a/xsession/translations/lxqt_sk.desktop b/xsession/translations/lxqt_sk.desktop
new file mode 100644
index 0000000..7997dd5
--- /dev/null
+++ b/xsession/translations/lxqt_sk.desktop
@@ -0,0 +1,3 @@
+# Translations
+Name[sk]=Prostredie LXQt
+Comment[sk]=Pracovné prostredie v Qt
diff --git a/xsession/translations/lxqt_sl.desktop b/xsession/translations/lxqt_sl.desktop
new file mode 100644
index 0000000..5390fd9
--- /dev/null
+++ b/xsession/translations/lxqt_sl.desktop
@@ -0,0 +1,3 @@
+# Translations
+Name[sl]=Namizje LXQt
+Comment[sl]=Namizje, ustvarjeno s Qt
diff --git a/xsession/translations/lxqt_sr.desktop b/xsession/translations/lxqt_sr.desktop
new file mode 100644
index 0000000..1edb09b
--- /dev/null
+++ b/xsession/translations/lxqt_sr.desktop
@@ -0,0 +1,3 @@
+# Translations
+Name[sr]=Рејзорова радна површ
+Comment[sr]=Кјут4 радна површ
diff --git a/xsession/translations/lxqt_sr@latin.desktop b/xsession/translations/lxqt_sr@latin.desktop
new file mode 100644
index 0000000..e8437df
--- /dev/null
+++ b/xsession/translations/lxqt_sr@latin.desktop
@@ -0,0 +1,3 @@
+# Translations
+Name[sr@latin]=Rejzorova radna površ
+Comment[sr@latin]=Qt radna površ
diff --git a/xsession/translations/lxqt_th_TH.desktop b/xsession/translations/lxqt_th_TH.desktop
new file mode 100644
index 0000000..b10e310
--- /dev/null
+++ b/xsession/translations/lxqt_th_TH.desktop
@@ -0,0 +1,3 @@
+# Translations
+Name[th_TH]=เดสก์ท็อป LXQt
+Comment[th_TH]=เดสก์ท็อป Qt
diff --git a/xsession/translations/lxqt_tr.desktop b/xsession/translations/lxqt_tr.desktop
new file mode 100644
index 0000000..7fdd7e0
--- /dev/null
+++ b/xsession/translations/lxqt_tr.desktop
@@ -0,0 +1,3 @@
+# Translations
+Name[tr]=LXQt Masaüstü
+Comment[tr]=Qt Masaüstü
diff --git a/xsession/translations/lxqt_uk.desktop b/xsession/translations/lxqt_uk.desktop
new file mode 100644
index 0000000..de7f29b
--- /dev/null
+++ b/xsession/translations/lxqt_uk.desktop
@@ -0,0 +1,3 @@
+# Translations
+Name[uk]=Стільниця LXQt
+Comment[uk]=Стільниця Qt
diff --git a/xsession/translations/lxqt_zh_CN.GB2312.desktop b/xsession/translations/lxqt_zh_CN.GB2312.desktop
new file mode 100644
index 0000000..26b0d99
--- /dev/null
+++ b/xsession/translations/lxqt_zh_CN.GB2312.desktop
@@ -0,0 +1 @@
+# Translations
diff --git a/xsession/translations/lxqt_zh_CN.desktop b/xsession/translations/lxqt_zh_CN.desktop
new file mode 100644
index 0000000..c6b47fe
--- /dev/null
+++ b/xsession/translations/lxqt_zh_CN.desktop
@@ -0,0 +1,3 @@
+# Translations
+Name[zh_CN]=LXQt 桌面
+Comment[zh_CN]=Qt 桌面
diff --git a/xsession/translations/lxqt_zh_TW.desktop b/xsession/translations/lxqt_zh_TW.desktop
new file mode 100644
index 0000000..758283c
--- /dev/null
+++ b/xsession/translations/lxqt_zh_TW.desktop
@@ -0,0 +1,3 @@
+# Translations
+Name[zh_TW]=LXQt桌面
+Comment[zh_TW]=輕量級Qt桌面環境