aboutsummaryrefslogtreecommitdiff
path: root/src-qt5/core
diff options
context:
space:
mode:
Diffstat (limited to 'src-qt5/core')
-rw-r--r--src-qt5/core/README.md90
-rw-r--r--src-qt5/core/libLumina/DesktopSettings.cpp32
-rw-r--r--src-qt5/core/libLumina/DesktopSettings.h2
-rw-r--r--src-qt5/core/libLumina/LDesktopUtils.cpp110
-rw-r--r--src-qt5/core/libLumina/LIconCache.h2
-rw-r--r--src-qt5/core/libLumina/LuminaX11.cpp23
-rw-r--r--src-qt5/core/libLumina/LuminaXDG.h24
-rw-r--r--src-qt5/core/libLumina/NativeEmbedWidget.cpp208
-rw-r--r--src-qt5/core/libLumina/NativeEmbedWidget.h55
-rw-r--r--src-qt5/core/libLumina/NativeEventFilter.cpp272
-rw-r--r--src-qt5/core/libLumina/NativeEventFilter.h70
-rw-r--r--src-qt5/core/libLumina/NativeKeyToQt.cpp528
-rw-r--r--src-qt5/core/libLumina/NativeWindow.cpp65
-rw-r--r--src-qt5/core/libLumina/NativeWindow.h58
-rw-r--r--src-qt5/core/libLumina/NativeWindow.pri11
-rw-r--r--src-qt5/core/libLumina/NativeWindowSystem.cpp515
-rw-r--r--src-qt5/core/libLumina/NativeWindowSystem.h63
-rw-r--r--src-qt5/core/libLumina/RootSubWindow.cpp265
-rw-r--r--src-qt5/core/libLumina/RootSubWindow.h20
-rw-r--r--src-qt5/core/libLumina/RootWindow.cpp24
-rw-r--r--src-qt5/core/libLumina/RootWindow.h6
-rw-r--r--src-qt5/core/libLumina/RootWindow.pri3
-rw-r--r--src-qt5/core/lumina-desktop-unified/LSession.cpp192
-rw-r--r--src-qt5/core/lumina-desktop-unified/LSession.h8
-rw-r--r--src-qt5/core/lumina-desktop-unified/defaults/desktop/desktop.conf0
-rw-r--r--src-qt5/core/lumina-desktop-unified/defaults/desktop/environment.conf0
-rw-r--r--src-qt5/core/lumina-desktop-unified/defaults/desktop/favorites.conf0
-rw-r--r--src-qt5/core/lumina-desktop-unified/defaults/desktop/keys.conf8
-rw-r--r--src-qt5/core/lumina-desktop-unified/defaults/desktop/session.conf0
-rw-r--r--src-qt5/core/lumina-desktop-unified/defaults/desktop/theme.conf0
-rw-r--r--src-qt5/core/lumina-desktop-unified/global-includes.h9
-rw-r--r--src-qt5/core/lumina-desktop-unified/global-objects.h14
-rw-r--r--src-qt5/core/lumina-desktop-unified/lumina-desktop.pro9
-rw-r--r--src-qt5/core/lumina-desktop-unified/main.cpp7
-rw-r--r--src-qt5/core/lumina-desktop-unified/src-DE/panel-plugins/systemdashboard/LSysDashboard.cpp2
-rw-r--r--src-qt5/core/lumina-desktop-unified/src-WM/DEPENDENCIES17
-rw-r--r--src-qt5/core/lumina-desktop-unified/src-WM/GlobalDefines.h74
-rw-r--r--src-qt5/core/lumina-desktop-unified/src-WM/LWindow.cpp474
-rw-r--r--src-qt5/core/lumina-desktop-unified/src-WM/LWindow.h114
-rw-r--r--src-qt5/core/lumina-desktop-unified/src-WM/LWindowManager.cpp186
-rw-r--r--src-qt5/core/lumina-desktop-unified/src-WM/LWindowManager.h40
-rw-r--r--src-qt5/core/lumina-desktop-unified/src-WM/WMSession.cpp62
-rw-r--r--src-qt5/core/lumina-desktop-unified/src-WM/WMSession.h42
-rw-r--r--src-qt5/core/lumina-desktop-unified/src-WM/lumina-wm.pro107
-rw-r--r--src-qt5/core/lumina-desktop-unified/src-WM/main.cpp56
-rw-r--r--src-qt5/core/lumina-desktop-unified/src-desktop/ContextMenu.cpp7
-rw-r--r--src-qt5/core/lumina-desktop-unified/src-desktop/ContextMenu.h2
-rw-r--r--src-qt5/core/lumina-desktop-unified/src-events/LShortcutEvents.cpp106
-rw-r--r--src-qt5/core/lumina-desktop-unified/src-events/LShortcutEvents.h15
-rw-r--r--src-qt5/core/lumina-desktop-unified/src-events/LXcbEventFilter.cpp500
-rw-r--r--src-qt5/core/lumina-desktop-unified/src-events/LXcbEventFilter.h151
-rw-r--r--src-qt5/core/lumina-desktop-unified/src-events/events.pri4
-rw-r--r--src-qt5/core/lumina-desktop-unified/src-screensaver/LLockScreen.cpp24
-rw-r--r--src-qt5/core/lumina-desktop-unified/src-screensaver/LScreenSaver.cpp18
-rw-r--r--src-qt5/core/lumina-desktop-unified/src-screensaver/LScreenSaver.h3
-rw-r--r--src-qt5/core/lumina-desktop-unified/src-screensaver/SSBaseWidget.cpp14
-rw-r--r--src-qt5/core/lumina-desktop-unified/src-screensaver/animations/BaseAnimGroup.cpp15
-rw-r--r--src-qt5/core/lumina-desktop-unified/src-screensaver/animations/BaseAnimGroup.h4
-rw-r--r--src-qt5/core/lumina-desktop-unified/src-screensaver/animations/Fireflies.h6
-rw-r--r--src-qt5/core/lumina-desktop-unified/src-screensaver/animations/Grav.h185
-rw-r--r--src-qt5/core/lumina-desktop-unified/src-screensaver/animations/SampleAnimation.h2
-rw-r--r--src-qt5/core/lumina-desktop-unified/src-screensaver/animations/Text.h93
-rw-r--r--src-qt5/core/lumina-desktop-unified/src-screensaver/animations/animations.pri7
-rw-r--r--src-qt5/core/lumina-desktop/LSession.cpp4
-rw-r--r--src-qt5/core/lumina-desktop/i18n/lumina-desktop_af.ts26
-rw-r--r--src-qt5/core/lumina-desktop/i18n/lumina-desktop_ar.ts26
-rw-r--r--src-qt5/core/lumina-desktop/i18n/lumina-desktop_az.ts26
-rw-r--r--src-qt5/core/lumina-desktop/i18n/lumina-desktop_bg.ts26
-rw-r--r--src-qt5/core/lumina-desktop/i18n/lumina-desktop_bn.ts26
-rw-r--r--src-qt5/core/lumina-desktop/i18n/lumina-desktop_bs.ts26
-rw-r--r--src-qt5/core/lumina-desktop/i18n/lumina-desktop_ca.ts128
-rw-r--r--src-qt5/core/lumina-desktop/i18n/lumina-desktop_cs.ts272
-rw-r--r--src-qt5/core/lumina-desktop/i18n/lumina-desktop_cy.ts26
-rw-r--r--src-qt5/core/lumina-desktop/i18n/lumina-desktop_da.ts38
-rw-r--r--src-qt5/core/lumina-desktop/i18n/lumina-desktop_de.ts26
-rw-r--r--src-qt5/core/lumina-desktop/i18n/lumina-desktop_el.ts26
-rw-r--r--src-qt5/core/lumina-desktop/i18n/lumina-desktop_en_GB.ts44
-rw-r--r--src-qt5/core/lumina-desktop/i18n/lumina-desktop_en_ZA.ts26
-rw-r--r--src-qt5/core/lumina-desktop/i18n/lumina-desktop_es.ts44
-rw-r--r--src-qt5/core/lumina-desktop/i18n/lumina-desktop_et.ts26
-rw-r--r--src-qt5/core/lumina-desktop/i18n/lumina-desktop_eu.ts26
-rw-r--r--src-qt5/core/lumina-desktop/i18n/lumina-desktop_fa.ts26
-rw-r--r--src-qt5/core/lumina-desktop/i18n/lumina-desktop_fi.ts26
-rw-r--r--src-qt5/core/lumina-desktop/i18n/lumina-desktop_fr.ts26
-rw-r--r--src-qt5/core/lumina-desktop/i18n/lumina-desktop_fr_CA.ts26
-rw-r--r--src-qt5/core/lumina-desktop/i18n/lumina-desktop_gl.ts26
-rw-r--r--src-qt5/core/lumina-desktop/i18n/lumina-desktop_he.ts26
-rw-r--r--src-qt5/core/lumina-desktop/i18n/lumina-desktop_hi.ts26
-rw-r--r--src-qt5/core/lumina-desktop/i18n/lumina-desktop_hr.ts26
-rw-r--r--src-qt5/core/lumina-desktop/i18n/lumina-desktop_hu.ts26
-rw-r--r--src-qt5/core/lumina-desktop/i18n/lumina-desktop_id.ts26
-rw-r--r--src-qt5/core/lumina-desktop/i18n/lumina-desktop_is.ts26
-rw-r--r--src-qt5/core/lumina-desktop/i18n/lumina-desktop_it.ts26
-rw-r--r--src-qt5/core/lumina-desktop/i18n/lumina-desktop_ja.ts26
-rw-r--r--src-qt5/core/lumina-desktop/i18n/lumina-desktop_ka.ts26
-rw-r--r--src-qt5/core/lumina-desktop/i18n/lumina-desktop_ko.ts26
-rw-r--r--src-qt5/core/lumina-desktop/i18n/lumina-desktop_lt.ts38
-rw-r--r--src-qt5/core/lumina-desktop/i18n/lumina-desktop_lv.ts26
-rw-r--r--src-qt5/core/lumina-desktop/i18n/lumina-desktop_mk.ts26
-rw-r--r--src-qt5/core/lumina-desktop/i18n/lumina-desktop_mn.ts26
-rw-r--r--src-qt5/core/lumina-desktop/i18n/lumina-desktop_ms.ts26
-rw-r--r--src-qt5/core/lumina-desktop/i18n/lumina-desktop_mt.ts26
-rw-r--r--src-qt5/core/lumina-desktop/i18n/lumina-desktop_nb.ts26
-rw-r--r--src-qt5/core/lumina-desktop/i18n/lumina-desktop_nl.ts26
-rw-r--r--src-qt5/core/lumina-desktop/i18n/lumina-desktop_pa.ts26
-rw-r--r--src-qt5/core/lumina-desktop/i18n/lumina-desktop_pl.ts26
-rw-r--r--src-qt5/core/lumina-desktop/i18n/lumina-desktop_pt.ts26
-rw-r--r--src-qt5/core/lumina-desktop/i18n/lumina-desktop_pt_BR.ts26
-rw-r--r--src-qt5/core/lumina-desktop/i18n/lumina-desktop_ro.ts26
-rw-r--r--src-qt5/core/lumina-desktop/i18n/lumina-desktop_ru.ts36
-rw-r--r--src-qt5/core/lumina-desktop/i18n/lumina-desktop_sk.ts26
-rw-r--r--src-qt5/core/lumina-desktop/i18n/lumina-desktop_sl.ts26
-rw-r--r--src-qt5/core/lumina-desktop/i18n/lumina-desktop_sr.ts26
-rw-r--r--src-qt5/core/lumina-desktop/i18n/lumina-desktop_sv.ts26
-rw-r--r--src-qt5/core/lumina-desktop/i18n/lumina-desktop_sw.ts26
-rw-r--r--src-qt5/core/lumina-desktop/i18n/lumina-desktop_ta.ts26
-rw-r--r--src-qt5/core/lumina-desktop/i18n/lumina-desktop_tg.ts26
-rw-r--r--src-qt5/core/lumina-desktop/i18n/lumina-desktop_th.ts26
-rw-r--r--src-qt5/core/lumina-desktop/i18n/lumina-desktop_tr.ts26
-rw-r--r--src-qt5/core/lumina-desktop/i18n/lumina-desktop_uk.ts26
-rw-r--r--src-qt5/core/lumina-desktop/i18n/lumina-desktop_uz.ts26
-rw-r--r--src-qt5/core/lumina-desktop/i18n/lumina-desktop_vi.ts26
-rw-r--r--src-qt5/core/lumina-desktop/i18n/lumina-desktop_zh_CN.ts26
-rw-r--r--src-qt5/core/lumina-desktop/i18n/lumina-desktop_zh_HK.ts26
-rw-r--r--src-qt5/core/lumina-desktop/i18n/lumina-desktop_zh_TW.ts26
-rw-r--r--src-qt5/core/lumina-desktop/i18n/lumina-desktop_zu.ts26
-rw-r--r--src-qt5/core/lumina-desktop/panel-plugins/systemdashboard/LSysDashboard.cpp2
-rw-r--r--src-qt5/core/lumina-desktop/panel-plugins/systemdashboard/SysMenuQuick.cpp4
-rw-r--r--src-qt5/core/lumina-desktop/panel-plugins/systemstart/StartMenu.cpp2
-rw-r--r--src-qt5/core/lumina-info/i18n/lumina-info_cs.ts18
-rw-r--r--src-qt5/core/lumina-open/i18n/lumina-open_cs.ts30
-rw-r--r--src-qt5/core/lumina-session/session.cpp2
-rw-r--r--src-qt5/core/lumina-theme-engine/LICENSE38
-rw-r--r--src-qt5/core/lumina-theme-engine/README.md14
-rw-r--r--src-qt5/core/lumina-theme-engine/lthemeengine.pri32
-rw-r--r--src-qt5/core/lumina-theme-engine/lthemeengine.pro57
-rw-r--r--src-qt5/core/lumina-theme-engine/src/lthemeengine-qtplugin/lthemeengine-qtplugin.pro35
-rw-r--r--src-qt5/core/lumina-theme-engine/src/lthemeengine-qtplugin/lthemeengine.json3
-rw-r--r--src-qt5/core/lumina-theme-engine/src/lthemeengine-qtplugin/lthemeengineplatformtheme.cpp366
-rw-r--r--src-qt5/core/lumina-theme-engine/src/lthemeengine-qtplugin/lthemeengineplatformtheme.h122
-rw-r--r--src-qt5/core/lumina-theme-engine/src/lthemeengine-qtplugin/main.cpp52
-rw-r--r--src-qt5/core/lumina-theme-engine/src/lthemeengine-style/lthemeengine-style.pro26
-rw-r--r--src-qt5/core/lumina-theme-engine/src/lthemeengine-style/lthemeengine.json3
-rw-r--r--src-qt5/core/lumina-theme-engine/src/lthemeengine-style/lthemeengineproxystyle.cpp63
-rw-r--r--src-qt5/core/lumina-theme-engine/src/lthemeengine-style/lthemeengineproxystyle.h50
-rw-r--r--src-qt5/core/lumina-theme-engine/src/lthemeengine-style/plugin.cpp57
-rw-r--r--src-qt5/core/lumina-theme-engine/src/lthemeengine/appearancepage.cpp418
-rw-r--r--src-qt5/core/lumina-theme-engine/src/lthemeengine/appearancepage.h79
-rw-r--r--src-qt5/core/lumina-theme-engine/src/lthemeengine/appearancepage.ui243
-rw-r--r--src-qt5/core/lumina-theme-engine/src/lthemeengine/fontconfigdialog.cpp138
-rw-r--r--src-qt5/core/lumina-theme-engine/src/lthemeengine/fontconfigdialog.h56
-rw-r--r--src-qt5/core/lumina-theme-engine/src/lthemeengine/fontconfigdialog.ui160
-rw-r--r--src-qt5/core/lumina-theme-engine/src/lthemeengine/fontspage.cpp126
-rw-r--r--src-qt5/core/lumina-theme-engine/src/lthemeengine/fontspage.h62
-rw-r--r--src-qt5/core/lumina-theme-engine/src/lthemeengine/fontspage.ui134
-rw-r--r--src-qt5/core/lumina-theme-engine/src/lthemeengine/iconthemepage.cpp214
-rw-r--r--src-qt5/core/lumina-theme-engine/src/lthemeengine/iconthemepage.h57
-rw-r--r--src-qt5/core/lumina-theme-engine/src/lthemeengine/iconthemepage.ui51
-rw-r--r--src-qt5/core/lumina-theme-engine/src/lthemeengine/interfacepage.cpp140
-rw-r--r--src-qt5/core/lumina-theme-engine/src/lthemeengine/interfacepage.h54
-rw-r--r--src-qt5/core/lumina-theme-engine/src/lthemeengine/interfacepage.ui327
-rw-r--r--src-qt5/core/lumina-theme-engine/src/lthemeengine/lthemeengine.cpp132
-rw-r--r--src-qt5/core/lumina-theme-engine/src/lthemeengine/lthemeengine.desktop9
-rw-r--r--src-qt5/core/lumina-theme-engine/src/lthemeengine/lthemeengine.h60
-rw-r--r--src-qt5/core/lumina-theme-engine/src/lthemeengine/lthemeengine.pro55
-rw-r--r--src-qt5/core/lumina-theme-engine/src/lthemeengine/main.cpp84
-rw-r--r--src-qt5/core/lumina-theme-engine/src/lthemeengine/mainwindow.cpp90
-rw-r--r--src-qt5/core/lumina-theme-engine/src/lthemeengine/mainwindow.h57
-rw-r--r--src-qt5/core/lumina-theme-engine/src/lthemeengine/mainwindow.ui47
-rw-r--r--src-qt5/core/lumina-theme-engine/src/lthemeengine/paletteeditdialog.cpp146
-rw-r--r--src-qt5/core/lumina-theme-engine/src/lthemeengine/paletteeditdialog.h68
-rw-r--r--src-qt5/core/lumina-theme-engine/src/lthemeengine/paletteeditdialog.ui120
-rw-r--r--src-qt5/core/lumina-theme-engine/src/lthemeengine/previewform.ui76
-rw-r--r--src-qt5/core/lumina-theme-engine/src/lthemeengine/qsseditordialog.cpp85
-rw-r--r--src-qt5/core/lumina-theme-engine/src/lthemeengine/qsseditordialog.h59
-rw-r--r--src-qt5/core/lumina-theme-engine/src/lthemeengine/qsseditordialog.ui47
-rw-r--r--src-qt5/core/lumina-theme-engine/src/lthemeengine/qsspage.cpp232
-rw-r--r--src-qt5/core/lumina-theme-engine/src/lthemeengine/qsspage.h66
-rw-r--r--src-qt5/core/lumina-theme-engine/src/lthemeengine/qsspage.ui84
-rw-r--r--src-qt5/core/lumina-theme-engine/src/lthemeengine/tabpage.cpp33
-rw-r--r--src-qt5/core/lumina-theme-engine/src/lthemeengine/tabpage.h43
-rw-r--r--src-qt5/core/lumina-wm-INCOMPLETE/DEPENDENCIES17
-rw-r--r--src-qt5/core/lumina-wm-INCOMPLETE/GlobalDefines.h74
-rw-r--r--src-qt5/core/lumina-wm-INCOMPLETE/LLockScreen.cpp102
-rw-r--r--src-qt5/core/lumina-wm-INCOMPLETE/LLockScreen.h42
-rw-r--r--src-qt5/core/lumina-wm-INCOMPLETE/LLockScreen.ui144
-rw-r--r--src-qt5/core/lumina-wm-INCOMPLETE/LScreenSaver.cpp181
-rw-r--r--src-qt5/core/lumina-wm-INCOMPLETE/LScreenSaver.h59
-rw-r--r--src-qt5/core/lumina-wm-INCOMPLETE/LWindow.cpp474
-rw-r--r--src-qt5/core/lumina-wm-INCOMPLETE/LWindow.h114
-rw-r--r--src-qt5/core/lumina-wm-INCOMPLETE/LWindowManager.cpp186
-rw-r--r--src-qt5/core/lumina-wm-INCOMPLETE/LWindowManager.h40
-rw-r--r--src-qt5/core/lumina-wm-INCOMPLETE/LXcbEventFilter.cpp204
-rw-r--r--src-qt5/core/lumina-wm-INCOMPLETE/LXcbEventFilter.h130
-rw-r--r--src-qt5/core/lumina-wm-INCOMPLETE/SSBaseWidget.cpp83
-rw-r--r--src-qt5/core/lumina-wm-INCOMPLETE/SSBaseWidget.h55
-rw-r--r--src-qt5/core/lumina-wm-INCOMPLETE/WMSession.cpp62
-rw-r--r--src-qt5/core/lumina-wm-INCOMPLETE/WMSession.h42
-rw-r--r--src-qt5/core/lumina-wm-INCOMPLETE/animations/BaseAnimGroup.cpp27
-rw-r--r--src-qt5/core/lumina-wm-INCOMPLETE/animations/BaseAnimGroup.h37
-rw-r--r--src-qt5/core/lumina-wm-INCOMPLETE/animations/SampleAnimation.h45
-rw-r--r--src-qt5/core/lumina-wm-INCOMPLETE/animations/animations.pri6
-rw-r--r--src-qt5/core/lumina-wm-INCOMPLETE/i18n/lumina-wm_af.ts42
-rw-r--r--src-qt5/core/lumina-wm-INCOMPLETE/i18n/lumina-wm_ar.ts42
-rw-r--r--src-qt5/core/lumina-wm-INCOMPLETE/i18n/lumina-wm_az.ts42
-rw-r--r--src-qt5/core/lumina-wm-INCOMPLETE/i18n/lumina-wm_bg.ts42
-rw-r--r--src-qt5/core/lumina-wm-INCOMPLETE/i18n/lumina-wm_bn.ts42
-rw-r--r--src-qt5/core/lumina-wm-INCOMPLETE/i18n/lumina-wm_bs.ts42
-rw-r--r--src-qt5/core/lumina-wm-INCOMPLETE/i18n/lumina-wm_ca.ts42
-rw-r--r--src-qt5/core/lumina-wm-INCOMPLETE/i18n/lumina-wm_cs.ts42
-rw-r--r--src-qt5/core/lumina-wm-INCOMPLETE/i18n/lumina-wm_cy.ts42
-rw-r--r--src-qt5/core/lumina-wm-INCOMPLETE/i18n/lumina-wm_da.ts42
-rw-r--r--src-qt5/core/lumina-wm-INCOMPLETE/i18n/lumina-wm_de.ts42
-rw-r--r--src-qt5/core/lumina-wm-INCOMPLETE/i18n/lumina-wm_el.ts42
-rw-r--r--src-qt5/core/lumina-wm-INCOMPLETE/i18n/lumina-wm_en_GB.ts42
-rw-r--r--src-qt5/core/lumina-wm-INCOMPLETE/i18n/lumina-wm_en_ZA.ts42
-rw-r--r--src-qt5/core/lumina-wm-INCOMPLETE/i18n/lumina-wm_es.ts42
-rw-r--r--src-qt5/core/lumina-wm-INCOMPLETE/i18n/lumina-wm_et.ts42
-rw-r--r--src-qt5/core/lumina-wm-INCOMPLETE/i18n/lumina-wm_eu.ts42
-rw-r--r--src-qt5/core/lumina-wm-INCOMPLETE/i18n/lumina-wm_fa.ts42
-rw-r--r--src-qt5/core/lumina-wm-INCOMPLETE/i18n/lumina-wm_fi.ts42
-rw-r--r--src-qt5/core/lumina-wm-INCOMPLETE/i18n/lumina-wm_fr.ts42
-rw-r--r--src-qt5/core/lumina-wm-INCOMPLETE/i18n/lumina-wm_fr_CA.ts42
-rw-r--r--src-qt5/core/lumina-wm-INCOMPLETE/i18n/lumina-wm_gl.ts42
-rw-r--r--src-qt5/core/lumina-wm-INCOMPLETE/i18n/lumina-wm_he.ts42
-rw-r--r--src-qt5/core/lumina-wm-INCOMPLETE/i18n/lumina-wm_hi.ts42
-rw-r--r--src-qt5/core/lumina-wm-INCOMPLETE/i18n/lumina-wm_hr.ts42
-rw-r--r--src-qt5/core/lumina-wm-INCOMPLETE/i18n/lumina-wm_hu.ts42
-rw-r--r--src-qt5/core/lumina-wm-INCOMPLETE/i18n/lumina-wm_id.ts42
-rw-r--r--src-qt5/core/lumina-wm-INCOMPLETE/i18n/lumina-wm_is.ts42
-rw-r--r--src-qt5/core/lumina-wm-INCOMPLETE/i18n/lumina-wm_it.ts42
-rw-r--r--src-qt5/core/lumina-wm-INCOMPLETE/i18n/lumina-wm_ja.ts42
-rw-r--r--src-qt5/core/lumina-wm-INCOMPLETE/i18n/lumina-wm_ka.ts42
-rw-r--r--src-qt5/core/lumina-wm-INCOMPLETE/i18n/lumina-wm_ko.ts42
-rw-r--r--src-qt5/core/lumina-wm-INCOMPLETE/i18n/lumina-wm_lt.ts42
-rw-r--r--src-qt5/core/lumina-wm-INCOMPLETE/i18n/lumina-wm_lv.ts42
-rw-r--r--src-qt5/core/lumina-wm-INCOMPLETE/i18n/lumina-wm_mk.ts42
-rw-r--r--src-qt5/core/lumina-wm-INCOMPLETE/i18n/lumina-wm_mn.ts42
-rw-r--r--src-qt5/core/lumina-wm-INCOMPLETE/i18n/lumina-wm_ms.ts42
-rw-r--r--src-qt5/core/lumina-wm-INCOMPLETE/i18n/lumina-wm_mt.ts42
-rw-r--r--src-qt5/core/lumina-wm-INCOMPLETE/i18n/lumina-wm_nb.ts42
-rw-r--r--src-qt5/core/lumina-wm-INCOMPLETE/i18n/lumina-wm_nl.ts42
-rw-r--r--src-qt5/core/lumina-wm-INCOMPLETE/i18n/lumina-wm_pa.ts42
-rw-r--r--src-qt5/core/lumina-wm-INCOMPLETE/i18n/lumina-wm_pl.ts42
-rw-r--r--src-qt5/core/lumina-wm-INCOMPLETE/i18n/lumina-wm_pt.ts42
-rw-r--r--src-qt5/core/lumina-wm-INCOMPLETE/i18n/lumina-wm_pt_BR.ts42
-rw-r--r--src-qt5/core/lumina-wm-INCOMPLETE/i18n/lumina-wm_ro.ts42
-rw-r--r--src-qt5/core/lumina-wm-INCOMPLETE/i18n/lumina-wm_ru.ts42
-rw-r--r--src-qt5/core/lumina-wm-INCOMPLETE/i18n/lumina-wm_sk.ts42
-rw-r--r--src-qt5/core/lumina-wm-INCOMPLETE/i18n/lumina-wm_sl.ts42
-rw-r--r--src-qt5/core/lumina-wm-INCOMPLETE/i18n/lumina-wm_sr.ts42
-rw-r--r--src-qt5/core/lumina-wm-INCOMPLETE/i18n/lumina-wm_sv.ts42
-rw-r--r--src-qt5/core/lumina-wm-INCOMPLETE/i18n/lumina-wm_sw.ts42
-rw-r--r--src-qt5/core/lumina-wm-INCOMPLETE/i18n/lumina-wm_ta.ts42
-rw-r--r--src-qt5/core/lumina-wm-INCOMPLETE/i18n/lumina-wm_tg.ts42
-rw-r--r--src-qt5/core/lumina-wm-INCOMPLETE/i18n/lumina-wm_th.ts42
-rw-r--r--src-qt5/core/lumina-wm-INCOMPLETE/i18n/lumina-wm_tr.ts42
-rw-r--r--src-qt5/core/lumina-wm-INCOMPLETE/i18n/lumina-wm_uk.ts42
-rw-r--r--src-qt5/core/lumina-wm-INCOMPLETE/i18n/lumina-wm_uz.ts42
-rw-r--r--src-qt5/core/lumina-wm-INCOMPLETE/i18n/lumina-wm_vi.ts42
-rw-r--r--src-qt5/core/lumina-wm-INCOMPLETE/i18n/lumina-wm_zh_CN.ts42
-rw-r--r--src-qt5/core/lumina-wm-INCOMPLETE/i18n/lumina-wm_zh_HK.ts42
-rw-r--r--src-qt5/core/lumina-wm-INCOMPLETE/i18n/lumina-wm_zh_TW.ts42
-rw-r--r--src-qt5/core/lumina-wm-INCOMPLETE/i18n/lumina-wm_zu.ts42
-rw-r--r--src-qt5/core/lumina-wm-INCOMPLETE/lumina-wm.pro107
-rw-r--r--src-qt5/core/lumina-wm-INCOMPLETE/main.cpp56
266 files changed, 8499 insertions, 8277 deletions
diff --git a/src-qt5/core/README.md b/src-qt5/core/README.md
new file mode 100644
index 00000000..6a17d900
--- /dev/null
+++ b/src-qt5/core/README.md
@@ -0,0 +1,90 @@
+## Core Components of the Lumina Desktop
+
+It is **strongly-encouraged** that the "core" of Lumina is built and distributed as a single package. Each of the utilities listed here will explicitly require/use each other for essential functionality.
+
+Binaries:
+ * `start-lumina-desktop`: (lumina-session directory) Use this to start the desktop session
+ * `lumina-desktop`: (lumina-desktop directory) Use this to communicate with the currently-running session
+ * `lumina-open`: (lumina-open directory) Use this to launch external applications. Complement to the `xdg-open` utility.
+ * `lumina-info`: (lumina-info directory) View basic information about the desktop itself such as version, license, etc.
+
+Other Files that get installed if "core" is built directly:
+ * PREFIX/share/icons/material-design-[light/dark]: Basic SVG icon theme.
+ * PREFIX/share/lumina-desktop/themes: Built-in themes for the Lumina desktop
+ * PREFIX/share/lumina-desktop/colors: Built-in color schemes for the Lumina desktop
+ * PREFIX/share/lumina-desktop/menu-scripts: Built-in scripts for creating menu entries on-demand.
+ * PREFIX/share/lumina-desktop/globs2: Fallback XDG mimetype database (in case the system does not have one available)
+
+### Library Dependencies
+
+1. Qt 5.2+ (specific modules listed below)
+ * concurrent
+ * core
+ * gui
+ * network
+ * multimedia
+ * multimediawidgets
+ * svg
+ * widgets
+ * x11extras
+2. X11 Libraries
+ * libXdamage
+3. XCB Libraries
+ * libxcb
+ * libxcb-ewmh
+ * libxcb-image
+ * libxcb-composite
+ * libxcb-damage
+ * libxcb-randr
+ * libxcb-util
+4. Other Libraries
+ * libc
+
+### Runtime Dependencies (utilities)
+1. Required Utilities
+ * `xinit`: Used by `start-lumina-desktop` for launching an X11 session if needed.
+ * `fluxbox`: Used for window management within the desktop session
+ * `xscreensaver`: Screensaver/locker for the desktop session
+2. Optional (but recommended) Utilities
+ * `numlockx`: Used to toggle the numlock key on session start
+ * `compton` *or* `xcompmgr`: Compositor to provide cross-application transparency effects and graphical smoothing
+ * `xterm`, `qterminal` or some other graphical terminal: XDG standards require the availability of a graphical terminal to launch particular types of applications.
+3. OS-specific utilities (optional, but allow for better OS integration)
+ 1. FreeBSD/TrueOS
+ * AppCafe (graphical package manager)
+ * SysAdm (system control panel)
+ * `pc-sysconfig`, `intel_backlight`, `xbrightness` : screen brightness control utilities
+ * `pc-mixer`: graphical front-end to `mixer`
+ * `pc-sysconfig`: Allow system into be put into suspend mode (if supported by hardware)
+ 2. DragonFlyBSD
+ * `xbrightness`: screen brightness control (fake brightness - will not change power consumption)
+ 3. OpenBSD
+ * `xbacklight`: screen brightness control
+ 4. NetBSD
+ * [No OS Integrations committed yet]
+ 5. Generic "Linux"
+ * `xbacklight`: screen brightness control
+ * `amixer`: Audio mixer control
+ * `pavucontrol`: Graphical audio mixer utility
+ * `acpi`: Battery detection/status
+ 6. Slackware Linux
+ * `xbacklight`: screen brightness control
+ * `amixer`: Audio mixer control
+ * `pavucontrol`: Graphical audio mixer utility
+ * `acpi`: Battery detection/status
+ * `dbus-send`: System shutdown/restart
+ 7. Debian GNU/kFreeBSD
+ * `xbacklight`: screen brightness control
+ * `pavucontrol`: Graphical audio mixer utility
+ 8. Gentoo Linux
+ * `xbacklight`: screen brightness control
+ * `amixer`: Audio mixer control
+ * `pavucontrol`: Graphical audio mixer utility
+ * `acpi`: Battery detection/status
+ * `dbus-send`: System shutdown/restart
+ 9. Debian GNU/Linux
+ * `xbacklight`: screen brightness control
+ * `amixer`: Audio mixer control
+ * `pavucontrol`: Graphical audio mixer utility
+ * `acpi`: Battery detection/status
+ * `dbus-send`: System shutdown/restart
diff --git a/src-qt5/core/libLumina/DesktopSettings.cpp b/src-qt5/core/libLumina/DesktopSettings.cpp
index 30bd5bc2..47dc29de 100644
--- a/src-qt5/core/libLumina/DesktopSettings.cpp
+++ b/src-qt5/core/libLumina/DesktopSettings.cpp
@@ -9,7 +9,7 @@
#include <QDir>
#include <QDebug>
-#include <unistd.h>
+#include <unistd.h>
#include <pwd.h>
#include <grp.h>
@@ -25,6 +25,16 @@ DesktopSettings::~DesktopSettings(){
if(!files.isEmpty()){ stop(); }
}
+DesktopSettings* DesktopSettings::instance(){
+ static DesktopSettings *set = 0;
+ if(set==0){
+ //First-time init
+ set = new DesktopSettings();
+ set->start();
+ }
+ return set;
+}
+
//Start/stop routines
void DesktopSettings::start(){
files.clear(); settings.clear(); //clear the internal hashes (just in case)
@@ -35,7 +45,7 @@ void DesktopSettings::start(){
}
parseSystemSettings(); //set the runmode appropriately
locateFiles(); //
-
+
}
void DesktopSettings::stop(){
@@ -111,7 +121,7 @@ void DesktopSettings::parseSystemSettings(){
//Now determine the runmode for this user
struct passwd *pw = getpwuid(getuid());
- if(pw!=0){
+ if(pw!=0){
QString cuser = QString(pw->pw_name);
free(pw); //done with this structure
if( settings[path]->value("fulluser_users", QStringList()).toStringList().contains(cuser) ){ runmode = DesktopSettings::UserFull; }
@@ -123,10 +133,10 @@ void DesktopSettings::parseSystemSettings(){
gid_t grpList[100];
int grpSize = 100;
if( getgrouplist(cuser.toLocal8Bit(), getgid(), grpList, &grpSize) > 0 ){
- QStringList groups;
- for(int i=0; i<grpSize; i++){
+ QStringList groups;
+ for(int i=0; i<grpSize; i++){
struct group *g = getgrgid(grpList[i]);
- if(g!=0){
+ if(g!=0){
groups << QString(g->gr_name);
free(g);
}
@@ -136,18 +146,18 @@ void DesktopSettings::parseSystemSettings(){
if( (fromfile+groups).removeDuplicates() > 0 ){ runmode = DesktopSettings::UserFull; }
else{
fromfile = settings[path]->value("fullsystem_groups", QStringList()).toStringList();
- fromfile.removeDuplicates();
+ fromfile.removeDuplicates();
if((fromfile+groups).removeDuplicates() > 0 ){ runmode = DesktopSettings::SystemFull; }
else{
fromfile = settings[path]->value("staticinterface_groups", QStringList()).toStringList();
- fromfile.removeDuplicates();
+ fromfile.removeDuplicates();
if((fromfile+groups).removeDuplicates() > 0 ){ runmode = DesktopSettings::SystemInterface; }
}
}
- } //end group list read
+ } //end group list read
}
}else{
- runmode = DesktopSettings::SystemFull; //could not read user name - assume system files only
+ runmode = DesktopSettings::SystemFull; //could not read user name - assume system files only
}
break; //found this file - go ahead and stop now (no hierarchy for this special file)
@@ -246,7 +256,7 @@ void DesktopSettings::fileChanged(QString file){
QList< DesktopSettings::File > types = files.keys();
for(int i=0; i<types.length(); i++){
if(files[types[i]].contains(file)){
- emit FileModified(types[i]);
+ emit FileModified(types[i]);
break;
}
}
diff --git a/src-qt5/core/libLumina/DesktopSettings.h b/src-qt5/core/libLumina/DesktopSettings.h
index 57eede9d..57a85791 100644
--- a/src-qt5/core/libLumina/DesktopSettings.h
+++ b/src-qt5/core/libLumina/DesktopSettings.h
@@ -30,6 +30,8 @@ public:
DesktopSettings(QObject *parent = 0);
~DesktopSettings();
+ static DesktopSettings* instance();
+
//Start/stop routines
void start();
void stop();
diff --git a/src-qt5/core/libLumina/LDesktopUtils.cpp b/src-qt5/core/libLumina/LDesktopUtils.cpp
index d76c68e9..4454d29b 100644
--- a/src-qt5/core/libLumina/LDesktopUtils.cpp
+++ b/src-qt5/core/libLumina/LDesktopUtils.cpp
@@ -15,12 +15,12 @@
static QStringList fav;
-QString LDesktopUtils::LuminaDesktopVersion(){
- QString ver = "1.2.2";
+QString LDesktopUtils::LuminaDesktopVersion(){
+ QString ver = "1.3.1";
#ifdef GIT_VERSION
ver.append( QString(" (Git Revision: %1)").arg(GIT_VERSION) );
#endif
- return ver;
+ return ver;
}
QString LDesktopUtils::LuminaDesktopBuildDate(){
@@ -88,7 +88,7 @@ QStringList LDesktopUtils::listFavorites(){
fav.removeDuplicates();
lastRead = cur;
}
-
+
return fav;
}
@@ -138,7 +138,7 @@ void LDesktopUtils::removeFavorite(QString path){
void LDesktopUtils::upgradeFavorites(int){ //fromoldversionnumber
//NOTE: Version number syntax: <major>*1000000 + <minor>*1000 + <revision>
// Example: 1.2.3 -> 1002003
-}
+}
void LDesktopUtils::LoadSystemDefaults(bool skipOS){
//Will create the Lumina configuration files based on the current system template (if any)
@@ -156,15 +156,15 @@ void LDesktopUtils::LoadSystemDefaults(bool skipOS){
QDesktopWidget *desk =QApplication::desktop();
QRect screenGeom;
for(int i=0; i<desk->screenCount(); i++){
- if(desk->screenGeometry(i).x()==0){
- screen = QString::number(i);
- screenGeom = desk->screenGeometry(i);
- break;
+ if(desk->screenGeometry(i).x()==0){
+ screen = QString::number(i);
+ screenGeom = desk->screenGeometry(i);
+ break;
}
}
//Now setup the default "desktopsettings.conf" and "sessionsettings.conf" files
QStringList deskset, sesset;//, lopenset;
-
+
// -- SESSION SETTINGS --
QStringList tmp = sysDefaults.filter("session_");
if(tmp.isEmpty()){ tmp = sysDefaults.filter("session."); }//for backwards compat
@@ -177,36 +177,36 @@ void LDesktopUtils::LoadSystemDefaults(bool skipOS){
if(val.isEmpty()){ continue; }
QString istrue = (val.toLower()=="true") ? "true": "false";
//Change in 0.8.5 - use "_" instead of "." within variables names - need backwards compat for a little while
- if(var.contains(".")){ var.replace(".","_"); }
- //Now parse the variable and put the value in the proper file
-
+ if(var.contains(".")){ var.replace(".","_"); }
+ //Now parse the variable and put the value in the proper file
+
if(var.contains("_default_")){ val = LUtils::AppToAbsolute(val); } //got an application/binary
//Special handling for values which need to exist first
- if(var.endsWith("_ifexists") ){
+ if(var.endsWith("_ifexists") ){
var = var.remove("_ifexists"); //remove this flag from the variable
//Check if the value exists (absolute path only)
if(!QFile::exists(val)){ continue; } //skip this line - value/file does not exist
}
-
+
//Parse/save the value
QString sset; //temporary strings
if(var=="session_enablenumlock"){ sset = "EnableNumlock="+ istrue; }
else if(var=="session_playloginaudio"){ sset = "PlayStartupAudio="+istrue; }
else if(var=="session_playlogoutaudio"){ sset = "PlayLogoutAudio="+istrue; }
- else if(var=="session_default_terminal"){
+ else if(var=="session_default_terminal"){
LXDG::setDefaultAppForMime("application/terminal", val);
- //sset = "default-terminal="+val;
- }else if(var=="session_default_filemanager"){
+ //sset = "default-terminal="+val;
+ }else if(var=="session_default_filemanager"){
LXDG::setDefaultAppForMime("inode/directory", val);
//sset = "default-filemanager="+val;
- //loset = "directory="+val;
- }else if(var=="session_default_webbrowser"){
- //loset = "webbrowser="+val;
+ //loset = "directory="+val;
+ }else if(var=="session_default_webbrowser"){
+ //loset = "webbrowser="+val;
LXDG::setDefaultAppForMime("x-scheme-handler/http", val);
LXDG::setDefaultAppForMime("x-scheme-handler/https", val);
- }else if(var=="session_default_email"){
+ }else if(var=="session_default_email"){
LXDG::setDefaultAppForMime("application/email",val);
- //loset = "email="+val;
+ //loset = "email="+val;
}
//Put the line into the file (overwriting any previous assignment as necessary)
/*if(!loset.isEmpty()){
@@ -218,7 +218,7 @@ void LDesktopUtils::LoadSystemDefaults(bool skipOS){
if(!sset.isEmpty()){
int index = sesset.indexOf(QRegExp(sset.section("=",0,0)+"=*", Qt::CaseSensitive, QRegExp::Wildcard));
if(index<0){ sesset << sset; } //new line
- else{ sesset[index] = sset; } //overwrite the other line
+ else{ sesset[index] = sset; } //overwrite the other line
}
}
//if(!lopenset.isEmpty()){ lopenset.prepend("[default]"); } //the session options exist within this set
@@ -232,11 +232,11 @@ void LDesktopUtils::LoadSystemDefaults(bool skipOS){
if(val.isEmpty()){ continue; }
QString istrue = (val.toLower()=="true") ? "true": "false";
//Change in 0.8.5 - use "_" instead of "." within variables names - need backwards compat for a little while
- if(var.contains(".")){ var.replace(".","_"); }
- //Now parse the variable and put the value in the proper file
+ if(var.contains(".")){ var.replace(".","_"); }
+ //Now parse the variable and put the value in the proper file
val = LUtils::AppToAbsolute(val);
//Special handling for values which need to exist first
- if(var.endsWith("_ifexists") ){
+ if(var.endsWith("_ifexists") ){
var = var.remove("_ifexists"); //remove this flag from the variable
//Check if the value exists (absolute path only)
if(!QFile::exists(val)){ continue; } //skip this line - value/file does not exist
@@ -259,8 +259,8 @@ void LDesktopUtils::LoadSystemDefaults(bool skipOS){
if(val.isEmpty()){ continue; }
QString istrue = (val.toLower()=="true") ? "true": "false";
//Change in 0.8.5 - use "_" instead of "." within variables names - need backwards compat for a little while
- if(var.contains(".")){ var.replace(".","_"); }
- //Now parse the variable and put the value in the proper file
+ if(var.contains(".")){ var.replace(".","_"); }
+ //Now parse the variable and put the value in the proper file
if(var=="desktop_visiblepanels"){ deskset << "panels="+val; }
else if(var=="desktop_backgroundfiles"){ deskset << "background\\filelist="+val; }
else if(var=="desktop_backgroundrotateminutes"){ deskset << "background\\minutesToChange="+val; }
@@ -282,8 +282,8 @@ void LDesktopUtils::LoadSystemDefaults(bool skipOS){
if(val.isEmpty()){ continue; }
QString istrue = (val.toLower()=="true") ? "true": "false";
//Change in 0.8.5 - use "_" instead of "." within variables names - need backwards compat for a little while
- if(var.contains(".")){ var.replace(".","_"); }
- //Now parse the variable and put the value in the proper file
+ if(var.contains(".")){ var.replace(".","_"); }
+ //Now parse the variable and put the value in the proper file
if(var==(panvar+"_pixelsize")){
//qDebug() << "Panel Size:" << val;
if(val.contains("%")){
@@ -293,7 +293,7 @@ void LDesktopUtils::LoadSystemDefaults(bool skipOS){
else if(last=="w"){ val = QString::number( qRound(screenGeom.width()*val.toDouble())/100 ); }//adjust value to a percentage of the width of the screen
}
//qDebug() << " -- Adjusted:" << val;
- deskset << "height="+val;
+ deskset << "height="+val;
}
else if(var==(panvar+"_autohide")){ deskset << "hidepanel="+istrue; }
else if(var==(panvar+"_location")){ deskset << "location="+val.toLower(); }
@@ -314,8 +314,8 @@ void LDesktopUtils::LoadSystemDefaults(bool skipOS){
QString val = tmp[i].section("=",1,1).section("#",0,0).toLower().simplified();
if(val.isEmpty()){ continue; }
//Change in 0.8.5 - use "_" instead of "." within variables names - need backwards compat for a little while
- if(var.contains(".")){ var.replace(".","_"); }
- //Now parse the variable and put the value in the proper file
+ if(var.contains(".")){ var.replace(".","_"); }
+ //Now parse the variable and put the value in the proper file
if(var=="menu_plugins"){ deskset << "itemlist="+val; }
}
if(!tmp.isEmpty()){ deskset << ""; } //space between sections
@@ -328,7 +328,7 @@ void LDesktopUtils::LoadSystemDefaults(bool skipOS){
QString var = tmp[i].section("=",0,0).toLower().simplified();
QString val = tmp[i].section("=",1,1).section("#",0,0).simplified();
//Change in 0.8.5 - use "_" instead of "." within variables names - need backwards compat for a little while
- if(var.contains(".")){ var.replace(".","_"); }
+ if(var.contains(".")){ var.replace(".","_"); }
//Now parse the variable and put the value in the proper file
qDebug() << "Favorite entry:" << var << val;
val = LUtils::AppToAbsolute(val); //turn any relative files into absolute
@@ -346,19 +346,19 @@ void LDesktopUtils::LoadSystemDefaults(bool skipOS){
QString var = tmp[i].section("=",0,0).toLower().simplified();
QString val = tmp[i].section("=",1,1).section("#",0,0).simplified();
//Change in 0.8.5 - use "_" instead of "." within variables names - need backwards compat for a little while
- if(var.contains(".")){ var.replace(".","_"); }
+ if(var.contains(".")){ var.replace(".","_"); }
//Now parse the variable and put the value in the proper file
val = LUtils::AppToAbsolute(val); //turn any relative files into absolute
if(var=="quicklaunch_add_ifexists" && QFile::exists(val)){ quickL << val; }
else if(var=="quicklaunch_add"){ quickL << val; }
}
- if(!quickL.isEmpty()){
+ if(!quickL.isEmpty()){
if(sesset.isEmpty()){ sesset << "[General]"; } //everything is in this section
- sesset << "QuicklaunchApps="+quickL.join(", ");
+ sesset << "QuicklaunchApps="+quickL.join(", ");
}
//Now do any theme settings
- QStringList themesettings = LTHEME::currentSettings();
+ QStringList themesettings = LTHEME::currentSettings();
//List: [theme path, colorspath, iconsname, font, fontsize]
//qDebug() << "Current Theme Color:" << themesettings[1];
tmp = sysDefaults.filter("theme_");
@@ -370,19 +370,19 @@ void LDesktopUtils::LoadSystemDefaults(bool skipOS){
QString val = tmp[i].section("=",1,1).section("#",0,0).simplified();
if(val.isEmpty()){ continue; }
//Change in 0.8.5 - use "_" instead of "." within variables names - need backwards compat for a little while
- if(var.contains(".")){ var.replace(".","_"); }
- //Now parse the variable and put the value in the proper file
+ if(var.contains(".")){ var.replace(".","_"); }
+ //Now parse the variable and put the value in the proper file
if(var=="theme_themefile"){ themesettings[0] = val; }
else if(var=="theme_colorfile"){ themesettings[1] = val; }
else if(var=="theme_iconset"){ themesettings[2] = val; }
else if(var=="theme_font"){ themesettings[3] = val; }
- else if(var=="theme_fontsize"){
+ else if(var=="theme_fontsize"){
if(val.endsWith("%")){ val = QString::number( (screenGeom.height()*val.section("%",0,0).toDouble())/100 )+"px"; }
- themesettings[4] = val;
+ themesettings[4] = val;
}
}
//qDebug() << " - Now Color:" << themesettings[1] << setTheme;
-
+
//Now double check that the custom theme/color files exist and reset it will the full path as necessary
if(setTheme){
QStringList systhemes = LTHEME::availableSystemThemes();
@@ -414,15 +414,15 @@ void LDesktopUtils::LoadSystemDefaults(bool skipOS){
//Ensure that the settings directory exists
QString setdir = QString(getenv("XDG_CONFIG_HOME"))+"/lumina-desktop";
- if(!QFile::exists(setdir)){
- QDir dir;
- dir.mkpath(setdir);
+ if(!QFile::exists(setdir)){
+ QDir dir;
+ dir.mkpath(setdir);
}
//Now save the settings files
if(setTheme){ LTHEME::setCurrentSettings( themesettings[0], themesettings[1], themesettings[2], themesettings[3], themesettings[4]); }
LUtils::writeFile(setdir+"/sessionsettings.conf", sesset, true);
LUtils::writeFile(setdir+"/desktopsettings.conf", deskset, true);
-
+
//Now run any extra config scripts or utilities as needed
tmp = sysDefaults.filter("usersetup_run");
if(tmp.isEmpty()){ tmp = sysDefaults.filter("usersetup.run"); }
@@ -431,25 +431,25 @@ void LDesktopUtils::LoadSystemDefaults(bool skipOS){
QString var = tmp[i].section("=",0,0).toLower().simplified();
QString val = tmp[i].section("=",1,1).section("#",0,0).simplified();
//Change in 0.8.5 - use "_" instead of "." within variables names - need backwards compat for a little while
- if(var.contains(".")){ var.replace(".","_"); }
+ if(var.contains(".")){ var.replace(".","_"); }
//Now parse the variable and put the value in the proper file
if(var=="usersetup_run"){
qDebug() << "Running user setup command:" << val;
QProcess::execute(val);
}
}
-
+
}
bool LDesktopUtils::checkUserFiles(QString lastversion){
- //internal version conversion examples:
+ //internal version conversion examples:
// [1.0.0 -> 1000000], [1.2.3 -> 1002003], [0.6.1 -> 6001]
//returns true if something changed
int oldversion = LDesktopUtils::VersionStringToNumber(lastversion);
int nversion = LDesktopUtils::VersionStringToNumber(QApplication::applicationVersion());
bool newversion = ( oldversion < nversion ); //increasing version number
bool newrelease = ( lastversion.contains("-devel", Qt::CaseInsensitive) && QApplication::applicationVersion().contains("-release", Qt::CaseInsensitive) ); //Moving from devel to release
-
+
QString confdir = QString(getenv("XDG_CONFIG_HOME"))+"/lumina-desktop/";
//Check for the desktop settings file
QString dset = confdir+"desktopsettings.conf";
@@ -461,7 +461,7 @@ bool LDesktopUtils::checkUserFiles(QString lastversion){
}
//Convert the favorites framework as necessary (change occured with 0.8.4)
if(newversion || newrelease){
- LDesktopUtils::upgradeFavorites(oldversion);
+ LDesktopUtils::upgradeFavorites(oldversion);
}
//Convert from the old desktop numbering system to the new one (change occured with 1.0.1)
if(oldversion<=1000001){
@@ -488,7 +488,7 @@ bool LDesktopUtils::checkUserFiles(QString lastversion){
}
LUtils::writeFile(dset, DS, true);
}
-
+
//Check the fluxbox configuration files
dset = QString(getenv("XDG_CONFIG_HOME"))+"/lumina-desktop/";
if(!QFile::exists(dset+"fluxbox-init")){
@@ -517,7 +517,7 @@ bool LDesktopUtils::checkUserFiles(QString lastversion){
int LDesktopUtils::VersionStringToNumber(QString version){
version = version.section("-",0,0); //trim any extra labels off the end
int maj, mid, min; //major/middle/minor version numbers (<Major>.<Middle>.<Minor>)
- maj = mid = min = 0;
+ maj = mid = min = 0;
bool ok = true;
maj = version.section(".",0,0).toInt(&ok);
if(ok){ mid = version.section(".",1,1).toInt(&ok); }else{ maj = 0; }
diff --git a/src-qt5/core/libLumina/LIconCache.h b/src-qt5/core/libLumina/LIconCache.h
index 0344e0f3..f58a5510 100644
--- a/src-qt5/core/libLumina/LIconCache.h
+++ b/src-qt5/core/libLumina/LIconCache.h
@@ -69,7 +69,7 @@ private:
private slots:
void IconLoaded(QString id, QDateTime sync, QByteArray *data);
-
+
signals:
void InternalIconLoaded(QString, QDateTime, QByteArray*); //INTERNAL SIGNAL - DO NOT USE in other classes/objects
void IconAvailable(QString); //way for classes to listen/reload icons as they change
diff --git a/src-qt5/core/libLumina/LuminaX11.cpp b/src-qt5/core/libLumina/LuminaX11.cpp
index ab6cd880..dd98d12c 100644
--- a/src-qt5/core/libLumina/LuminaX11.cpp
+++ b/src-qt5/core/libLumina/LuminaX11.cpp
@@ -75,9 +75,6 @@ void LXCB::createWMAtoms(){
i--;
}
}
-
-
-
}
// === WindowList() ===
@@ -91,13 +88,13 @@ QList<WId> LXCB::WindowList(bool rawlist){
if( 1 == xcb_ewmh_get_client_list_reply( &EWMH, cookie, &winlist, NULL) ){
//qDebug() << " - Loop over items";
unsigned int wkspace = CurrentWorkspace();
- for(unsigned int i=0; i<winlist.windows_len; i++){
+ for(unsigned int i=0; i<winlist.windows_len; i++){
//Filter out the Lumina Desktop windows
if(WindowClass(winlist.windows[i]) == "Lumina Desktop Environment"){ continue; }
//Also filter out windows not on the active workspace
else if( (WindowWorkspace(winlist.windows[i])!=wkspace) && !rawlist ){ continue; }
else{
- output << winlist.windows[i];
+ output << winlist.windows[i];
}
}
}
@@ -182,7 +179,7 @@ void LXCB::SetCurrentWorkspace(int number){
event.data.data32[4] = 0;
xcb_send_event(QX11Info::connection(), 0, QX11Info::appRootWindow(), XCB_EVENT_MASK_STRUCTURE_NOTIFY | XCB_EVENT_MASK_SUBSTRUCTURE_REDIRECT, (const char *) &event);
-
+
//EWMH function (does not seem to be recognized by Fluxbox)
xcb_ewmh_request_change_showing_desktop(&EWMH, QX11Info::appScreen(), number);
}
@@ -193,7 +190,7 @@ QString LXCB::WindowClass(WId win){
QString out;
if(win==0){ return ""; }
xcb_get_property_cookie_t cookie = xcb_icccm_get_wm_class_unchecked(QX11Info::connection(), win);
- if(cookie.sequence == 0){ return out; }
+ if(cookie.sequence == 0){ return out; }
xcb_icccm_get_wm_class_reply_t value;
if( 1== xcb_icccm_get_wm_class_reply( QX11Info::connection(), cookie, &value, NULL) ){
out = QString::fromUtf8(value.class_name);
@@ -210,7 +207,7 @@ unsigned int LXCB::WindowWorkspace(WId win){
uint32_t wkspace = 0;
xcb_get_property_cookie_t scookie = xcb_ewmh_get_wm_state_unchecked(&EWMH, win);
xcb_get_property_cookie_t cookie = xcb_ewmh_get_wm_desktop_unchecked(&EWMH, win);
- if(cookie.sequence == 0){ return wkspace; }
+ if(cookie.sequence == 0){ return wkspace; }
xcb_ewmh_get_wm_desktop_reply(&EWMH, cookie, &wkspace, NULL);
xcb_ewmh_get_atoms_reply_t reply;
if(1==xcb_ewmh_get_wm_state_reply(&EWMH,scookie, &reply, NULL)){
@@ -220,7 +217,7 @@ unsigned int LXCB::WindowWorkspace(WId win){
}
}
//qDebug() << " - done: " << wkspace;
- return wkspace;
+ return wkspace;
}
// === WindowGeometry() ===
@@ -500,7 +497,7 @@ QIcon LXCB::WindowIcon(WId win){
uint* dat = iter.data;
//dat+=2; //remember the first 2 element offset
for(int i=0; i<image.byteCount()/4; ++i, ++dat){
- ((uint*)image.bits())[i] = *dat;
+ ((uint*)image.bits())[i] = *dat;
}
icon.addPixmap(QPixmap::fromImage(image)); //layer this pixmap onto the icon
//Now see if there are any more icons available
@@ -1514,7 +1511,7 @@ void LXCB::WM_Set_Client_List(QList<WId> list, bool stacking){
xcb_ewmh_set_client_list_stacking(&EWMH, QX11Info::appScreen(), list.length(), array);
}else{
xcb_ewmh_set_client_list(&EWMH, QX11Info::appScreen(), list.length(), array);
- }
+ }
}
@@ -1528,7 +1525,7 @@ unsigned int LXCB::WM_Get_Number_Desktops(){
}
void LXCB::WM_SetNumber_Desktops(unsigned int number){
- //NOTE: number should be at least 1
+ //NOTE: number should be at least 1
xcb_ewmh_set_number_of_desktops(&EWMH, QX11Info::appScreen(), number);
}
@@ -1555,7 +1552,7 @@ QList<QPoint> LXCB::WM_Get_Desktop_Viewport(){
out << QPoint( reply.desktop_viewport[i].x, reply.desktop_viewport[i].y );
}
xcb_ewmh_get_desktop_viewport_reply_wipe(&reply); //clean up the reply structure first
- }
+ }
return out;
}
diff --git a/src-qt5/core/libLumina/LuminaXDG.h b/src-qt5/core/libLumina/LuminaXDG.h
index d159ef43..cc250c7e 100644
--- a/src-qt5/core/libLumina/LuminaXDG.h
+++ b/src-qt5/core/libLumina/LuminaXDG.h
@@ -12,8 +12,6 @@
// *.desktop Exec Compliance Updated: 9/9/2014
// Mime Application Version Compliance: 1.0.1 (11/14/14) (Skips random *.desktop parsing: ~80% compliant)
//===========================================
-
-
#ifndef _LUMINA_LIBRARY_XDG_H
#define _LUMINA_LIBRARY_XDG_H
@@ -83,7 +81,7 @@ public:
bool saveDesktopFile(bool merge = true); //This will use the "filePath" variable for where to save the file
- bool setAutoStarted(bool autostart = true);
+ bool setAutoStarted(bool autostart = true);
};
// ========================
@@ -127,29 +125,29 @@ private:
XDGDesktop *desk;
void loadExtraInfo();
-
+
public:
//Couple overloaded contructors
LFileInfo();
LFileInfo(QString filepath);
LFileInfo(QFileInfo info);
- ~LFileInfo(){
- desk->deleteLater();
+ ~LFileInfo(){
+ desk->deleteLater();
}
-
+
//Functions for accessing the extra information
// -- Return the mimetype for the file
QString mimetype();
-
+
// -- Return the icon file to use for this file
QString iconfile(); //Note: This string is auto-formatted for use in the LXDG::findIcon() routine.
-
+
// -- Check if this is an XDG desktop file
bool isDesktopFile();
-
+
// -- Allow access to the internal XDG desktop data structure
XDGDesktop* XDG();
-
+
//Other file type identification routines
bool isImage(); //Is a readable image file (for thumbnail support)
bool isAVFile(); //Is an audio/video file
@@ -165,7 +163,7 @@ public:
//static XDGDesktop* loadDesktopFile(QString filepath, bool&ok, QObject *parent = 0);
//static bool saveDesktopFile(XDGDesktop *dFile, bool merge = true);
//Check a *.desktop file for validity (showAll skips the DE-exclusivity checks)
- //static bool checkValidity(XDGDesktop *dFile, bool showAll = true);
+ //static bool checkValidity(XDGDesktop *dFile, bool showAll = true);
//Check for a valid executable
static bool checkExec(QString exec);
//Get a list of all the directories where *.desktop files exist
@@ -210,7 +208,7 @@ public:
static QStringList findAVFileExtensions();
//Load all the "globs2" mime database files
static QStringList loadMimeFileGlobs2();
-
+
//Find all the autostart *.desktop files
static QList<XDGDesktop*> findAutoStartFiles(bool includeInvalid = false);
//static bool setAutoStarted(bool autostart, XDGDesktop *app);
diff --git a/src-qt5/core/libLumina/NativeEmbedWidget.cpp b/src-qt5/core/libLumina/NativeEmbedWidget.cpp
new file mode 100644
index 00000000..80c843e0
--- /dev/null
+++ b/src-qt5/core/libLumina/NativeEmbedWidget.cpp
@@ -0,0 +1,208 @@
+//===========================================
+// Lumina-DE source code
+// Copyright (c) 2017, Ken Moore
+// Available under the 3-clause BSD license
+// See the LICENSE file for full details
+//===========================================
+#include "NativeEmbedWidget.h"
+
+#include <QPainter>
+#include <QX11Info>
+#include <QDebug>
+
+#include <xcb/xproto.h>
+#include <xcb/xcb_aux.h>
+#include <xcb/xcb_image.h>
+#include <xcb/composite.h>
+#include <X11/extensions/Xdamage.h>
+
+#define NORMAL_WIN_EVENT_MASK (XCB_EVENT_MASK_BUTTON_PRESS | \
+ XCB_EVENT_MASK_BUTTON_RELEASE | \
+ XCB_EVENT_MASK_POINTER_MOTION | \
+ XCB_EVENT_MASK_BUTTON_MOTION | \
+ XCB_EVENT_MASK_EXPOSURE | \
+ XCB_EVENT_MASK_STRUCTURE_NOTIFY | \
+ XCB_EVENT_MASK_SUBSTRUCTURE_REDIRECT | \
+ XCB_EVENT_MASK_SUBSTRUCTURE_NOTIFY | \
+ XCB_EVENT_MASK_ENTER_WINDOW| \
+ XCB_EVENT_MASK_PROPERTY_CHANGE)
+
+inline void registerClientEvents(WId id){
+ uint32_t value_list[1] = {NORMAL_WIN_EVENT_MASK};
+ xcb_change_window_attributes(QX11Info::connection(), id, XCB_CW_EVENT_MASK, value_list);
+}
+
+// ============
+// PRIVATE
+// ============
+//Simplification functions for the XCB/XLib interactions
+void NativeEmbedWidget::syncWinSize(QSize sz){
+ if(WIN==0){ return; }
+ if(!sz.isValid()){ sz = this->size(); } //use the current widget size
+ //qDebug() << "Sync Window Size:" << sz;
+ if(sz == winSize){ return; } //no change
+ const uint32_t valList[2] = {(uint32_t) sz.width(), (uint32_t) sz.height()};
+ const uint32_t mask = XCB_CONFIG_WINDOW_WIDTH | XCB_CONFIG_WINDOW_HEIGHT;
+ xcb_configure_window(QX11Info::connection(), WIN->id(), mask, valList);
+ winSize = sz; //save this for checking later
+}
+
+void NativeEmbedWidget::syncWidgetSize(QSize sz){
+ //qDebug() << "Sync Widget Size:" << sz;
+ this->resize(sz);
+}
+
+void NativeEmbedWidget::hideWindow(){
+ xcb_unmap_window(QX11Info::connection(), WIN->id());
+}
+
+void NativeEmbedWidget::showWindow(){
+ xcb_map_window(QX11Info::connection(), WIN->id());
+}
+
+QImage NativeEmbedWidget::windowImage(QRect geom){
+ //Pull the XCB pixmap out of the compositing layer
+ xcb_pixmap_t pix = xcb_generate_id(QX11Info::connection());
+ xcb_composite_name_window_pixmap(QX11Info::connection(), WIN->id(), pix);
+ if(pix==0){ return QImage(); }
+
+ //Convert this pixmap into a QImage
+ xcb_image_t *ximg = xcb_image_get(QX11Info::connection(), pix, geom.x(), geom.y(), geom.width(), geom.height(), ~0, XCB_IMAGE_FORMAT_Z_PIXMAP);
+ if(ximg == 0){ return QImage(); }
+ QImage img(ximg->data, ximg->width, ximg->height, ximg->stride, QImage::Format_ARGB32_Premultiplied);
+ img = img.copy(); //detach this image from the XCB data structures
+ xcb_image_destroy(ximg);
+
+ //Cleanup the XCB data structures
+ xcb_free_pixmap(QX11Info::connection(), pix);
+
+ return img;
+
+}
+
+// ============
+// PUBLIC
+// ============
+NativeEmbedWidget::NativeEmbedWidget(QWidget *parent) : QWidget(parent){
+ WIN = 0; //nothing embedded yet
+ this->setSizeIncrement(2,2);
+}
+
+bool NativeEmbedWidget::embedWindow(NativeWindow *window){
+ WIN = window;
+ //PIXBACK = xcb_generate_id(QX11Info::connection());
+ xcb_reparent_window(QX11Info::connection(), WIN->id(), this->winId(), 0, 0);
+ //Now send the embed event to the app
+ //qDebug() << " - send _XEMBED event";
+ /*xcb_client_message_event_t event;
+ event.response_type = XCB_CLIENT_MESSAGE;
+ event.format = 32;
+ event.window = WIN->id();
+ event.type = obj->ATOMS["_XEMBED"]; //_XEMBED
+ event.data.data32[0] = XCB_TIME_CURRENT_TIME; //CurrentTime;
+ event.data.data32[1] = 0; //XEMBED_EMBEDDED_NOTIFY
+ event.data.data32[2] = 0;
+ event.data.data32[3] = this->winId(); //WID of the container
+ event.data.data32[4] = 0;
+
+ xcb_send_event(QX11Info::connection(), 0, WIN->id(), XCB_EVENT_MASK_STRUCTURE_NOTIFY | XCB_EVENT_MASK_SUBSTRUCTURE_REDIRECT, (const char *) &event);
+ */
+ //Now setup any redirects and return
+ xcb_composite_redirect_window(QX11Info::connection(), WIN->id(), XCB_COMPOSITE_REDIRECT_MANUAL); //XCB_COMPOSITE_REDIRECT_[MANUAL/AUTOMATIC]);
+ xcb_composite_redirect_subwindows(QX11Info::connection(), WIN->id(), XCB_COMPOSITE_REDIRECT_MANUAL); //XCB_COMPOSITE_REDIRECT_[MANUAL/AUTOMATIC]);
+
+ //Now create/register the damage handler
+ // -- XCB (Note: The XCB damage registration is completely broken at the moment - 9/15/15, Ken Moore)
+ // -- Retested 6/29/17 (no change) Ken Moore
+ //xcb_damage_damage_t dmgID = xcb_generate_id(QX11Info::connection()); //This is a typedef for a 32-bit unsigned integer
+ //xcb_damage_create(QX11Info::connection(), dmgID, WIN->id(), XCB_DAMAGE_REPORT_LEVEL_RAW_RECTANGLES);
+ // -- XLib (Note: This is only used because the XCB routine above does not work - needs to be fixed upstream in XCB itself).
+ Damage dmgID = XDamageCreate(QX11Info::display(), WIN->id(), XDamageReportRawRectangles);
+
+ WIN->addDamageID( (uint) dmgID); //save this for later
+ WIN->addFrameWinID(this->winId());
+ connect(WIN, SIGNAL(VisualChanged()), this, SLOT(repaintWindow()) ); //make sure we repaint the widget on visual change
+
+ registerClientEvents(WIN->id());
+ registerClientEvents(this->winId());
+ return true;
+}
+
+bool NativeEmbedWidget::detachWindow(){
+ xcb_reparent_window(QX11Info::connection(), WIN->id(), QX11Info::appRootWindow(), -1, -1);
+ WIN = 0;
+ return true;
+}
+
+bool NativeEmbedWidget::isEmbedded(){
+ return (WIN!=0);
+}
+
+// ==============
+// PUBLIC SLOTS
+// ==============
+void NativeEmbedWidget::resyncWindow(){
+ if(WIN==0){ return; }
+ return; //skip the stuff below (not working)
+ QRect geom = WIN->geometry();
+ //Send an artificial configureNotify event to the window with the global position/size included
+ xcb_configure_notify_event_t event;
+ event.x = geom.x() + this->pos().x();
+ event.y = geom.y() + this->pos().y();
+ event.width = this->width();
+ event.height = this->height();
+ event.border_width = 0;
+ event.above_sibling = XCB_NONE;
+ event.override_redirect = false;
+ event.window = WIN->id();
+ event.event = WIN->id();
+ event.response_type = XCB_CONFIGURE_NOTIFY;
+ xcb_send_event(QX11Info::connection(), false, WIN->id(), XCB_EVENT_MASK_STRUCTURE_NOTIFY | XCB_EVENT_MASK_SUBSTRUCTURE_NOTIFY, (const char *) &event);
+
+ xcb_flush(QX11Info::connection());
+}
+
+void NativeEmbedWidget::repaintWindow(){
+ this->update();
+}
+// ==============
+// PROTECTED
+// ==============
+void NativeEmbedWidget::resizeEvent(QResizeEvent *ev){
+ QWidget::resizeEvent(ev);
+ if(WIN!=0){
+ syncWinSize(ev->size());
+ } //syncronize the window with the new widget size
+}
+
+void NativeEmbedWidget::showEvent(QShowEvent *ev){
+ if(WIN!=0){ showWindow(); }
+ QWidget::showEvent(ev);
+}
+
+void NativeEmbedWidget::hideEvent(QHideEvent *ev){
+ if(WIN!=0){ hideWindow(); }
+ QWidget::hideEvent(ev);
+}
+
+void NativeEmbedWidget::paintEvent(QPaintEvent *ev){
+ //QWidget::paintEvent(ev); //ensure all the Qt-compositing is done first
+ if(this->size()!=winSize){ return; } //do not paint here - waiting to re-sync the sizes
+ if(WIN==0){ QWidget::paintEvent(ev); return; }
+ //Need to paint the image from the window onto the widget as an overlay
+ QRect geom = QRect(0,0,this->width(), this->height()); //always paint the whole window
+ //qDebug() << "Get Paint image:" << ev->rect() << geom;
+ //geom = ev->rect(); //atomic updates
+ //geom.adjust(-1,-1,1,1); //add an additional pixel in each direction to be painted
+ //geom = geom.intersected(QRect(0,0,this->width(), this->height())); //ensure intersection with actual window
+ QImage img = windowImage(geom);
+ if(!img.isNull()){
+ if(img.size() != geom.size()){ return; }
+ QPainter P(this);
+ P.drawImage( geom , img, QRect(geom.topLeft(), img.size()), Qt::NoOpaqueDetection); //1-to-1 mapping
+ //qDebug() << "Painted Rect:" << ev->rect() << this->geometry();
+ //Note: Qt::NoOpaqueDetection Speeds up the paint by bypassing the checks to see if there are [semi-]transparent pixels
+ // Since this is an embedded image - we fully expect there to be transparency most of the time.
+ }
+ //qDebug() << "Done Painting";
+}
diff --git a/src-qt5/core/libLumina/NativeEmbedWidget.h b/src-qt5/core/libLumina/NativeEmbedWidget.h
new file mode 100644
index 00000000..78c11dfc
--- /dev/null
+++ b/src-qt5/core/libLumina/NativeEmbedWidget.h
@@ -0,0 +1,55 @@
+//===========================================
+// Lumina-DE source code
+// Copyright (c) 2017, Ken Moore
+// Available under the 3-clause BSD license
+// See the LICENSE file for full details
+//===========================================
+// This is a container object for embedding a native window into a QWidget
+// and maintaining a 1-to-1 mapping of sizing and other properties
+// while also providing compositing effects between the two windows
+//===========================================
+#ifndef _LUMINA_NATIVE_EMBED_WIDGET_H
+#define _LUMINA_NATIVE_EMBED_WIDGET_H
+
+#include "NativeWindow.h"
+#include <QWidget>
+#include <QTimer>
+#include <QResizeEvent>
+#include <QShowEvent>
+#include <QHideEvent>
+#include <QPaintEvent>
+
+class NativeEmbedWidget : public QWidget{
+ Q_OBJECT
+private:
+ NativeWindow *WIN;
+ QSize winSize;
+
+private slots:
+ //Simplification functions
+ void syncWinSize(QSize sz = QSize());
+ void syncWidgetSize(QSize sz);
+ void hideWindow();
+ void showWindow();
+ QImage windowImage(QRect geom);
+
+
+public:
+ NativeEmbedWidget(QWidget *parent);
+
+ bool embedWindow(NativeWindow *window);
+ bool detachWindow();
+ bool isEmbedded(); //status of the embed
+
+public slots:
+ void resyncWindow();
+ void repaintWindow();
+
+protected:
+ void resizeEvent(QResizeEvent *ev);
+ void showEvent(QShowEvent *ev);
+ void hideEvent(QHideEvent *ev);
+ void paintEvent(QPaintEvent *ev);
+};
+
+#endif
diff --git a/src-qt5/core/libLumina/NativeEventFilter.cpp b/src-qt5/core/libLumina/NativeEventFilter.cpp
new file mode 100644
index 00000000..d6c2da50
--- /dev/null
+++ b/src-qt5/core/libLumina/NativeEventFilter.cpp
@@ -0,0 +1,272 @@
+//===========================================
+// Lumina-desktop source code
+// Copyright (c) 2015-2017, Ken Moore
+// Available under the 3-clause BSD license
+// See the LICENSE file for full details
+//===========================================
+#include "NativeEventFilter.h"
+#include <QCoreApplication>
+#include <QDebug>
+
+//#include <xcb/xcb_aux.h>
+//#include <xcb/damage.h>
+
+//==================================================
+// NOTE: All the XCB interactions and atoms are accessed via:
+// obj->XCB->EWMH.(atom name)
+// obj->XCB->(do something)
+//==================================================
+
+/*
+List of XCB response types (since almost impossible to find good docs on XCB)
+switch (xcb_generic_event_t*->response_type & ~0x80)
+case values:
+XCB_KEY_[PRESS | RELEASE]
+XCB_BUTTON_[PRESS | RELEASE]
+XCB_MOTION_NOTIFY
+XCB_ENTER_NOTIFY
+XCB_LEAVE_NOTIFY
+XCB_FOCUS_[IN | OUT]
+XCB_KEYMAP_NOTIFY
+XCB_EXPOSE
+XCB_GRAPHICS_EXPOSURE
+XCB_VISIBILITY_NOTIFY
+XCB_CREATE_NOTIFY
+XCB_DESTROY_NOTIFY
+XCB_UNMAP_NOTIFY
+XCB_MAP_[NOTIFY | REQUEST]
+XCB_REPARENT_NOTIFY
+XCB_CONFIGURE_[NOTIFY | REQUEST]
+XCB_GRAVITY_NOTIFY
+XCB_RESIZE_REQUEST
+XCB_CIRCULATE_[NOTIFY | REQUEST]
+XCB_PROPERTY_NOTIFY
+XCB_SELECTION_[CLEAR | REQUEST | NOTIFY]
+XCB_COLORMAP_NOTIFY
+XCB_CLIENT_MESSAGE
+*/
+
+//SYSTEM TRAY STANDARD DEFINITIONS
+#define SYSTEM_TRAY_REQUEST_DOCK 0
+#define SYSTEM_TRAY_BEGIN_MESSAGE 1
+#define SYSTEM_TRAY_CANCEL_MESSAGE 2
+
+//#include <LuminaX11.h>
+#include <QX11Info>
+#include <xcb/xcb_ewmh.h>
+#include <xcb/xcb_keysyms.h>
+#include <xcb/damage.h>
+
+#define DEBUG 0
+
+//Special objects/variables for XCB parsing
+static xcb_ewmh_connection_t EWMH;
+//static LXCB *XCB = 0;
+static xcb_atom_t _NET_SYSTEM_TRAY_OPCODE = 0;
+
+inline void ParsePropertyEvent(xcb_property_notify_event_t *ev, NativeEventFilter *obj){
+ //qDebug() << "Got Property Event:" << ev->window << ev->atom;
+ NativeWindow::Property prop = NativeWindow::None;
+ //Now determine which properties are getting changed, and update the native window as appropriate
+ if(ev->atom == EWMH._NET_WM_NAME){ prop = NativeWindow::Title; }
+ else if(ev->atom == EWMH._NET_WM_ICON){ prop = NativeWindow::Icon; }
+ else if(ev->atom == EWMH._NET_WM_ICON_NAME){ prop = NativeWindow::ShortTitle; }
+ else if(ev->atom == EWMH._NET_WM_DESKTOP){ prop = NativeWindow::Workspace; }
+ else if(ev->atom == EWMH._NET_WM_WINDOW_TYPE ){ prop = NativeWindow::WinTypes; }
+ else if( ev->atom == EWMH._NET_WM_STATE){ prop = NativeWindow::States; }
+ //Send out the signal if necessary
+ if(prop!=NativeWindow::None){
+ if(DEBUG){ qDebug() << "Detected Property Change:" << ev->window << prop; }
+ obj->emit WindowPropertyChanged(ev->window, prop);
+ }else{
+ //qDebug() << "Unknown Property Change:" << ev->window << ev->atom;
+ }
+}
+
+
+//Constructor for the Event Filter wrapper
+NativeEventFilter::NativeEventFilter() : QObject(){
+ EF = new EventFilter(this);
+ if(EWMH.nb_screens <=0){
+ xcb_intern_atom_cookie_t *cookie = xcb_ewmh_init_atoms(QX11Info::connection(), &EWMH);
+ if(!xcb_ewmh_init_atoms_replies(&EWMH, cookie, NULL) ){
+ qDebug() << "Error with XCB atom initializations";
+ }
+ }
+ if(_NET_SYSTEM_TRAY_OPCODE==0){
+ //_NET_SYSTEM_TRAY_OPCODE
+ xcb_intern_atom_cookie_t cookie = xcb_intern_atom(QX11Info::connection(), 0, 23,"_NET_SYSTEM_TRAY_OPCODE");
+ xcb_intern_atom_reply_t *r = xcb_intern_atom_reply(QX11Info::connection(), cookie, NULL);
+ if(r){
+ _NET_SYSTEM_TRAY_OPCODE = r->atom;
+ free(r);
+ }
+ }
+}
+
+void NativeEventFilter::start(){
+ if(DEBUG){ qDebug() << " - Install event filter..."; }
+ QCoreApplication::instance()->installNativeEventFilter(EF);
+ if(DEBUG){ qDebug() << " - Run request check..."; }
+
+}
+
+void NativeEventFilter::stop(){
+ QCoreApplication::instance()->installNativeEventFilter(0);
+}
+
+//=============================
+// EventFilter Class
+//=============================
+
+//Constructor for the XCB event filter
+EventFilter::EventFilter(NativeEventFilter *parent) : QAbstractNativeEventFilter(){
+ obj = parent;
+}
+
+//This function format taken directly from the Qt5.3 documentation
+bool EventFilter::nativeEventFilter(const QByteArray &eventType, void *message, long *){
+ //qDebug() << "New Event";
+ if(eventType=="xcb_generic_event_t"){
+ //Convert to known event type (for X11 systems)
+ xcb_generic_event_t *ev = static_cast<xcb_generic_event_t *>(message);
+ //Now parse the event and emit signals as necessary
+ switch( ev->response_type & ~0x80){
+//==============================
+// INTERACTIVITY EVENTS
+//==============================
+ case XCB_KEY_PRESS:
+ //This is a keyboard key press
+ //qDebug() << "Key Press Event"
+ obj->emit KeyPressed( ((xcb_key_press_event_t *) ev)->detail, ((xcb_key_press_event_t *) ev)->root );
+ break;
+ case XCB_KEY_RELEASE:
+ //This is a keyboard key release
+ //qDebug() << "Key Release Event";
+ obj->emit KeyReleased( ((xcb_key_release_event_t *) ev)->detail, ((xcb_key_release_event_t *) ev)->root );
+ break;
+ case XCB_BUTTON_PRESS:
+ //This is a mouse button press
+ //qDebug() << "Button Press Event";
+ obj->emit MousePressed( ((xcb_button_press_event_t *) ev)->detail, ((xcb_button_press_event_t *) ev)->root );
+ break;
+ case XCB_BUTTON_RELEASE:
+ //This is a mouse button release
+ //qDebug() << "Button Release Event";
+ obj->emit MouseReleased( ((xcb_button_release_event_t *) ev)->detail, ((xcb_button_release_event_t *) ev)->root );
+ break;
+ case XCB_MOTION_NOTIFY:
+ //This is a mouse movement event
+ if(DEBUG){ qDebug() << "Motion Notify Event"; }
+ obj->emit MouseMovement();
+ break;
+ case XCB_ENTER_NOTIFY:
+ //This is a mouse movement event when mouse goes over a new window
+ //qDebug() << "Enter Notify Event";
+ obj->emit MouseEnterWindow( ((xcb_enter_notify_event_t *) ev)->root );
+ break;
+ case XCB_LEAVE_NOTIFY:
+ //This is a mouse movement event when mouse goes leaves a window
+ //qDebug() << "Leave Notify Event";
+ obj->emit MouseLeaveWindow( ((xcb_leave_notify_event_t *) ev)->root );
+ break;
+//==============================
+ case XCB_EXPOSE:
+ //qDebug() << "Expose Notify Event:";
+ //qDebug() << " - Given Window:" << ((xcb_property_notify_event_t*)ev)->window;
+ break;
+//==============================
+ case XCB_MAP_NOTIFY:
+ //qDebug() << "Window Map Event:" << ((xcb_map_notify_event_t *)ev)->window;
+ obj->emit WindowPropertyChanged( ((xcb_map_notify_event_t *)ev)->window, NativeWindow::Visible, true);
+ break; //This is just a notification that a window was mapped - nothing needs to change here
+ case XCB_MAP_REQUEST:
+ //qDebug() << "Window Map Request Event";
+ obj->emit WindowCreated( ((xcb_map_request_event_t *) ev)->window );
+ break;
+//==============================
+ case XCB_CREATE_NOTIFY:
+ //qDebug() << "Window Create Event";
+ break;
+//==============================
+ case XCB_UNMAP_NOTIFY:
+ //qDebug() << "Window Unmap Event:" << ((xcb_unmap_notify_event_t *)ev)->window;
+ obj->emit WindowPropertyChanged( ((xcb_map_notify_event_t *)ev)->window, NativeWindow::Visible, false);
+ break;
+//==============================
+ case XCB_DESTROY_NOTIFY:
+ //qDebug() << "Window Closed Event:" << ((xcb_destroy_notify_event_t *)ev)->window;
+ obj->emit WindowDestroyed( ((xcb_destroy_notify_event_t *) ev)->window );
+ break;
+//==============================
+ case XCB_FOCUS_IN:
+ //qDebug() << "Focus In Event:";
+ break;
+//==============================
+ case XCB_FOCUS_OUT:
+ //qDebug() << "Focus Out Event:";
+ break;
+//==============================
+ case XCB_PROPERTY_NOTIFY:
+ //qDebug() << "Property Notify Event:";
+ ParsePropertyEvent((xcb_property_notify_event_t*)ev, obj);
+ break;
+//==============================
+ case XCB_CLIENT_MESSAGE:
+ //qDebug() << "Client Message Event";
+ //qDebug() << " - Given Window:" << ((xcb_client_message_event_t*)ev)->window;
+ if( ((xcb_client_message_event_t*)ev)->type == _NET_SYSTEM_TRAY_OPCODE && ((xcb_client_message_event_t*)ev)->format == 32){
+ //data32[0] is timestamp, [1] is opcode, [2] is window handle
+ if(SYSTEM_TRAY_REQUEST_DOCK == ((xcb_client_message_event_t*)ev)->data.data32[1]){
+ obj->emit TrayWindowCreated( ((xcb_client_message_event_t*)ev)->data.data32[2] );
+ //addTrayApp( ((xcb_client_message_event_t*)ev)->data.data32[2] );
+ }
+ //Ignore the System Tray messages at the moment
+ }
+ break;
+//==============================
+ case XCB_CONFIGURE_NOTIFY:
+ //qDebug() << "Configure Notify Event";
+ /*obj->emit WindowPropertiesChanged( ((xcb_configure_notify_event_t*)ev)->window,
+ QList<NativeWindow::Property>() << NativeWindow::GlobalPos << NativeWindow::Size,
+ QList<QVariant>() << QPoint(((xcb_configure_notify_event_t*)ev)->x, ((xcb_configure_notify_event_t*)ev)->y) <<
+ QSize(((xcb_configure_notify_event_t*)ev)->width, ((xcb_configure_notify_event_t*)ev)->height) );*/
+ obj->emit WindowPropertyChanged( ((xcb_configure_notify_event_t*)ev)->window, NativeWindow::Size,
+ QSize(((xcb_configure_notify_event_t*)ev)->width, ((xcb_configure_notify_event_t*)ev)->height) );
+ break;
+//==============================
+ case XCB_CONFIGURE_REQUEST:
+ //qDebug() << "Configure Request Event";
+ obj->emit RequestWindowPropertiesChange( ((xcb_configure_request_event_t*)ev)->window,
+ QList<NativeWindow::Property>() << NativeWindow::GlobalPos << NativeWindow::Size,
+ QList<QVariant>() << QPoint(((xcb_configure_request_event_t*)ev)->x, ((xcb_configure_request_event_t*)ev)->y) <<
+ QSize(((xcb_configure_request_event_t*)ev)->width, ((xcb_configure_request_event_t*)ev)->height) );
+ break;
+//==============================
+ case XCB_RESIZE_REQUEST:
+ //qDebug() << "Resize Request Event";
+ obj->emit RequestWindowPropertyChange( ((xcb_resize_request_event_t*)ev)->window,
+ NativeWindow::Size, QSize(((xcb_resize_request_event_t*)ev)->width, ((xcb_resize_request_event_t*)ev)->height) );
+ break;
+//==============================
+ case XCB_SELECTION_CLEAR:
+ //qDebug() << "Selection Clear Event";
+ break;
+//==============================
+ case 85: //not sure what event this is - but it seems to come up very often (just hide the notice)
+ case 0:
+ case XCB_GE_GENERIC:
+ break; //generic event - don't do anything special
+ default:
+ //if( (ev->response_type & ~0x80)==TrayDmgID){
+ obj->emit PossibleDamageEvent( ((xcb_damage_notify_event_t*)ev)->drawable );
+ //checkDamageID( ((xcb_damage_notify_event_t*)ev)->drawable );
+ //}else{
+ //qDebug() << "Default Event:" << (ev->response_type & ~0x80);
+ //}
+//==============================
+ }
+ }
+ return false;
+ //never stop event handling (this will not impact the X events themselves - just the internal Qt application)
+}
diff --git a/src-qt5/core/libLumina/NativeEventFilter.h b/src-qt5/core/libLumina/NativeEventFilter.h
new file mode 100644
index 00000000..2b184f99
--- /dev/null
+++ b/src-qt5/core/libLumina/NativeEventFilter.h
@@ -0,0 +1,70 @@
+//===========================================
+// Lumina-DE source code
+// Copyright (c) 2012-2017, Ken Moore
+// Available under the 3-clause BSD license
+// See the LICENSE file for full details
+//===========================================
+// This class provides the XCB event handling/registrations that are needed
+//===========================================
+#ifndef _LUMINA_DESKTOP_NATIVE_EVENT_FILTER_H
+#define _LUMINA_DESKTOP_NATIVE_EVENT_FILTER_H
+
+#include <QAbstractNativeEventFilter>
+#include <QObject>
+#include <QByteArray>
+
+#include "NativeWindow.h"
+
+
+class NativeEventFilter : public QObject{
+ Q_OBJECT
+private:
+ QAbstractNativeEventFilter* EF;
+ WId WMFlag; //used to flag a running WM process
+
+public:
+ NativeEventFilter();
+ ~NativeEventFilter(){}
+
+ void start();
+ void stop();
+
+signals:
+ //Window Signals
+ void WindowCreated(WId);
+ void WindowDestroyed(WId);
+ void WindowPropertyChanged(WId, NativeWindow::Property);
+ void WindowPropertyChanged(WId, NativeWindow::Property, QVariant);
+ void WindowPropertiesChanged(WId, QList<NativeWindow::Property>, QList<QVariant>);
+ void RequestWindowPropertyChange(WId, NativeWindow::Property, QVariant);
+ void RequestWindowPropertiesChange(WId, QList<NativeWindow::Property>, QList<QVariant>);
+
+ //System Tray Signals
+ void TrayWindowCreated(WId);
+ void TrayWindowDestroyed(WId);
+
+ //Miscellaneos Signals
+ void PossibleDamageEvent(WId);
+
+ //Input Event Signals
+ void KeyPressed(int, WId);
+ void KeyReleased(int, WId);
+ void MousePressed(int, WId);
+ void MouseReleased(int, WId);
+ void MouseMovement();
+ void MouseEnterWindow(WId);
+ void MouseLeaveWindow(WId);
+};
+
+class EventFilter : public QAbstractNativeEventFilter{
+public:
+ EventFilter(NativeEventFilter *parent);
+ ~EventFilter(){}
+
+ virtual bool nativeEventFilter(const QByteArray &eventType, void *message, long *);
+
+private:
+ NativeEventFilter *obj;
+};
+
+#endif
diff --git a/src-qt5/core/libLumina/NativeKeyToQt.cpp b/src-qt5/core/libLumina/NativeKeyToQt.cpp
new file mode 100644
index 00000000..06056be7
--- /dev/null
+++ b/src-qt5/core/libLumina/NativeKeyToQt.cpp
@@ -0,0 +1,528 @@
+
+#include <NativeWindowSystem.h>
+
+#include <QKeySequence>
+#include <QX11Info>
+
+// XCB/X11 Includes
+#define XK_MISCELLANY
+#define XK_XKB_KEYS
+#define XK_LATIN1
+#define XK_LATIN2
+#define XK_LATIN3
+#define XK_LATIN4
+#define XK_LATIN8
+#define XK_LATIN9
+//NOTE: Look at the keysymdef.h file for additional define/characters which we may need later
+#include <X11/keysymdef.h>
+#include <xcb/xcb_keysyms.h>
+
+
+//Small simplification functions
+Qt::Key NativeWindowSystem::KeycodeToQt(int keycode){
+ static xcb_key_symbols_t *SYM = 0;
+ if(SYM==0){ SYM = xcb_key_symbols_alloc(QX11Info::connection()); }
+ xcb_keysym_t symbol = xcb_key_symbols_get_keysym(SYM, keycode,0);
+ //not sure about the "column" input - we want raw keys though so ignore the "modified" key states (columns) for now
+ //qDebug() << "Try to convert keycode to Qt::Key:" << keycode << symbol;
+ //Now map this symbol to the appropriate Qt::Key enumeration
+ switch(symbol){
+ //FUNCTION KEYS
+ case XK_F1: return Qt::Key_F1;
+ case XK_F2: return Qt::Key_F2;
+ case XK_F3: return Qt::Key_F3;
+ case XK_F4: return Qt::Key_F4;
+ case XK_F5: return Qt::Key_F5;
+ case XK_F6: return Qt::Key_F6;
+ case XK_F7: return Qt::Key_F7;
+ case XK_F8: return Qt::Key_F8;
+ case XK_F9: return Qt::Key_F9;
+ case XK_F10: return Qt::Key_F10;
+ case XK_F11: return Qt::Key_F11;
+ case XK_F12: return Qt::Key_F12;
+ case XK_F13: return Qt::Key_F13;
+ case XK_F14: return Qt::Key_F14;
+ case XK_F15: return Qt::Key_F15;
+ case XK_F16: return Qt::Key_F16;
+ case XK_F17: return Qt::Key_F17;
+ case XK_F18: return Qt::Key_F18;
+ case XK_F19: return Qt::Key_F19;
+ case XK_F20: return Qt::Key_F20;
+ case XK_F21: return Qt::Key_F21;
+ case XK_F22: return Qt::Key_F22;
+ case XK_F23: return Qt::Key_F23;
+ case XK_F24: return Qt::Key_F24;
+ case XK_F25: return Qt::Key_F25;
+ case XK_F26: return Qt::Key_F26;
+ case XK_F27: return Qt::Key_F27;
+ case XK_F28: return Qt::Key_F28;
+ case XK_F29: return Qt::Key_F29;
+ case XK_F30: return Qt::Key_F30;
+ case XK_F31: return Qt::Key_F31;
+ case XK_F32: return Qt::Key_F32;
+ case XK_F33: return Qt::Key_F33;
+ case XK_F34: return Qt::Key_F34;
+ case XK_F35: return Qt::Key_F35;
+ //Miscellaneous Keys
+ case XK_BackSpace: return Qt::Key_Backspace;
+ case XK_Delete: return Qt::Key_Delete;
+ //case XK_LineFeed: return Qt::Key_Backspace;
+ case XK_Clear: return Qt::Key_Clear;
+ case XK_Return: return Qt::Key_Return;
+ case XK_Pause: return Qt::Key_Pause;
+ case XK_Scroll_Lock: return Qt::Key_ScrollLock;
+ case XK_Sys_Req: return Qt::Key_SysReq;
+ case XK_Escape: return Qt::Key_Escape;
+ case XK_Select: return Qt::Key_Select;
+ case XK_Print: return Qt::Key_Print;
+ //case XK_Execute: return Qt::Key_Execute;
+ case XK_Insert: return Qt::Key_Insert;
+ case XK_Undo: return Qt::Key_Undo;
+ case XK_Redo: return Qt::Key_Redo;
+ case XK_Menu: return Qt::Key_Menu;
+ case XK_Find: return Qt::Key_Find;
+ case XK_Cancel: return Qt::Key_Cancel;
+ case XK_Help: return Qt::Key_Help;
+ //case XK_Break: return Qt::Key_Break;
+ //case XK_Mode_switch: return Qt::Key_Backspace;
+ //case XK_script_switch: return Qt::Key_Backspace;
+ case XK_Num_Lock: return Qt::Key_NumLock;
+ //Cursor Controls
+ case XK_Home: return Qt::Key_Home;
+ case XK_Left: return Qt::Key_Left;
+ case XK_Up: return Qt::Key_Up;
+ case XK_Right: return Qt::Key_Right;
+ case XK_Down: return Qt::Key_Down;
+ //case XK_Prior: return Qt::Key_Backspace;
+ case XK_Page_Up: return Qt::Key_PageUp;
+ case XK_Page_Down: return Qt::Key_PageDown;
+ //case XK_Next: return Qt::Key_Backspace;
+ case XK_End: return Qt::Key_End;
+ //case XK_Begin: return Qt::Key_Backspace;
+ // Keypad Functions and numbers
+ case XK_KP_Space: return Qt::Key_Space;
+ case XK_KP_Tab: return Qt::Key_Tab;
+ case XK_KP_Enter: return Qt::Key_Enter;
+ case XK_KP_F1: return Qt::Key_F1;
+ case XK_KP_F2: return Qt::Key_F2;
+ case XK_KP_F3: return Qt::Key_F3;
+ case XK_KP_F4: return Qt::Key_F4;
+ case XK_KP_Home: return Qt::Key_Home;
+ case XK_KP_Left: return Qt::Key_Left;
+ case XK_KP_Up: return Qt::Key_Up;
+ case XK_KP_Right: return Qt::Key_Right;
+ case XK_KP_Down: return Qt::Key_Down;
+ //case XK_KP_Prior: return Qt::Key_
+ case XK_KP_Page_Up: return Qt::Key_PageUp;
+ //case XK_KP_Next: return Qt::Key_
+ case XK_KP_Page_Down: return Qt::Key_PageDown;
+ case XK_KP_End: return Qt::Key_End;
+ //case XK_KP_Begin: return Qt::Key_
+ case XK_KP_Insert: return Qt::Key_Insert;
+ case XK_KP_Delete: return Qt::Key_Delete;
+ case XK_KP_Equal: return Qt::Key_Equal;
+ case XK_KP_Multiply: return Qt::Key_Asterisk;
+ case XK_KP_Add: return Qt::Key_Plus;
+ case XK_KP_Separator: return Qt::Key_Comma; //X11 definitions say this is often comma
+ case XK_KP_Subtract: return Qt::Key_Minus;
+ case XK_KP_Decimal: return Qt::Key_Period;
+ case XK_KP_Divide: return Qt::Key_Slash;
+ case XK_KP_0: return Qt::Key_0;
+ case XK_KP_1: return Qt::Key_1;
+ case XK_KP_2: return Qt::Key_2;
+ case XK_KP_3: return Qt::Key_3;
+ case XK_KP_4: return Qt::Key_4;
+ case XK_KP_5: return Qt::Key_5;
+ case XK_KP_6: return Qt::Key_6;
+ case XK_KP_7: return Qt::Key_7;
+ case XK_KP_8: return Qt::Key_8;
+ case XK_KP_9: return Qt::Key_9;
+ // Modifier Keys
+ case XK_Shift_L: return Qt::Key_Shift;
+ case XK_Shift_R: return Qt::Key_Shift;
+ case XK_Control_L: return Qt::Key_Control;
+ case XK_Control_R: return Qt::Key_Control;
+ case XK_Caps_Lock: return Qt::Key_CapsLock;
+ //case XK_Shift_Lock: return Qt::Key_ShiftLock;
+ case XK_Meta_L: return Qt::Key_Meta;
+ case XK_Meta_R: return Qt::Key_Meta;
+ case XK_Alt_L: return Qt::Key_Alt;
+ case XK_Alt_R: return Qt::Key_Alt;
+ case XK_Super_L: return Qt::Key_Super_L;
+ case XK_Super_R: return Qt::Key_Super_R;
+ case XK_Hyper_L: return Qt::Key_Hyper_L;
+ case XK_Hyper_R: return Qt::Key_Hyper_R;
+ case XK_space: return Qt::Key_Space;
+ case XK_exclam: return Qt::Key_Exclam;
+ case XK_quotedbl: return Qt::Key_QuoteDbl;
+ case XK_numbersign: return Qt::Key_NumberSign;
+ case XK_dollar: return Qt::Key_Dollar;
+ case XK_percent: return Qt::Key_Percent;
+ case XK_ampersand: return Qt::Key_Ampersand;
+ case XK_apostrophe: return Qt::Key_Apostrophe;
+ case XK_parenleft: return Qt::Key_ParenLeft;
+ case XK_parenright: return Qt::Key_ParenRight;
+ case XK_asterisk: return Qt::Key_Asterisk;
+ case XK_plus: return Qt::Key_Plus;
+ case XK_comma: return Qt::Key_Comma;
+ case XK_minus: return Qt::Key_Minus;
+ case XK_period: return Qt::Key_Period;
+ case XK_slash: return Qt::Key_Slash;
+ case XK_0: return Qt::Key_0;
+ case XK_1: return Qt::Key_1;
+ case XK_2: return Qt::Key_2;
+ case XK_3: return Qt::Key_3;
+ case XK_4: return Qt::Key_4;
+ case XK_5: return Qt::Key_5;
+ case XK_6: return Qt::Key_6;
+ case XK_7: return Qt::Key_7;
+ case XK_8: return Qt::Key_8;
+ case XK_9: return Qt::Key_9;
+ case XK_colon: return Qt::Key_Colon;
+ case XK_semicolon: return Qt::Key_Semicolon;
+ case XK_less: return Qt::Key_Less;
+ case XK_equal: return Qt::Key_Equal;
+ case XK_greater: return Qt::Key_Greater;
+ case XK_question: return Qt::Key_Question;
+ case XK_at: return Qt::Key_At;
+ case XK_A: return Qt::Key_A;
+ case XK_B: return Qt::Key_B;
+ case XK_C: return Qt::Key_C;
+ case XK_D: return Qt::Key_D;
+ case XK_E: return Qt::Key_E;
+ case XK_F: return Qt::Key_F;
+ case XK_G: return Qt::Key_G;
+ case XK_H: return Qt::Key_H;
+ case XK_I: return Qt::Key_I;
+ case XK_J: return Qt::Key_J;
+ case XK_K: return Qt::Key_K;
+ case XK_L: return Qt::Key_L;
+ case XK_M: return Qt::Key_M;
+ case XK_N: return Qt::Key_N;
+ case XK_O: return Qt::Key_O;
+ case XK_P: return Qt::Key_P;
+ case XK_Q: return Qt::Key_Q;
+ case XK_R: return Qt::Key_R;
+ case XK_S: return Qt::Key_S;
+ case XK_T: return Qt::Key_T;
+ case XK_U: return Qt::Key_U;
+ case XK_V: return Qt::Key_V;
+ case XK_W: return Qt::Key_W;
+ case XK_X: return Qt::Key_X;
+ case XK_Y : return Qt::Key_Y;
+ case XK_Z: return Qt::Key_Z;
+ case XK_bracketleft: return Qt::Key_BracketLeft;
+ case XK_backslash: return Qt::Key_Backslash;
+ case XK_bracketright: return Qt::Key_BracketRight;
+ case XK_asciicircum: return Qt::Key_AsciiCircum;
+ case XK_underscore: return Qt::Key_Underscore;
+ case XK_grave: return Qt::Key_Agrave;
+ case XK_a: return Qt::Key_A;
+ case XK_b: return Qt::Key_B;
+ case XK_c: return Qt::Key_C;
+ case XK_d: return Qt::Key_D;
+ case XK_e: return Qt::Key_E;
+ case XK_f : return Qt::Key_F;
+ case XK_g: return Qt::Key_G;
+ case XK_h: return Qt::Key_H;
+ case XK_i: return Qt::Key_I;
+ case XK_j: return Qt::Key_J;
+ case XK_k: return Qt::Key_K;
+ case XK_l: return Qt::Key_L;
+ case XK_m: return Qt::Key_M;
+ case XK_n: return Qt::Key_N;
+ case XK_o: return Qt::Key_O;
+ case XK_p: return Qt::Key_P;
+ case XK_q: return Qt::Key_Q;
+ case XK_r: return Qt::Key_R;
+ case XK_s: return Qt::Key_S;
+ case XK_t : return Qt::Key_T;
+ case XK_u: return Qt::Key_U;
+ case XK_v: return Qt::Key_V;
+ case XK_w: return Qt::Key_W;
+ case XK_x: return Qt::Key_X;
+ case XK_y: return Qt::Key_Y;
+ case XK_z: return Qt::Key_Z;
+ case XK_braceleft: return Qt::Key_BraceLeft;
+ case XK_bar: return Qt::Key_Bar;
+ case XK_braceright: return Qt::Key_BraceRight;
+ case XK_asciitilde: return Qt::Key_AsciiTilde;
+
+ case XK_nobreakspace: return Qt::Key_nobreakspace;
+ case XK_exclamdown: return Qt::Key_exclamdown;
+ case XK_cent: return Qt::Key_cent;
+ case XK_sterling: return Qt::Key_sterling;
+ case XK_currency: return Qt::Key_currency;
+ case XK_yen: return Qt::Key_yen;
+ case XK_brokenbar: return Qt::Key_brokenbar;
+ case XK_section: return Qt::Key_section;
+ case XK_diaeresis: return Qt::Key_diaeresis;
+ case XK_copyright: return Qt::Key_copyright;
+ case XK_ordfeminine: return Qt::Key_ordfeminine;
+ case XK_guillemotleft: return Qt::Key_guillemotleft;
+ case XK_notsign: return Qt::Key_notsign;
+ case XK_hyphen: return Qt::Key_hyphen;
+ case XK_registered: return Qt::Key_registered;
+ case XK_macron: return Qt::Key_macron;
+ case XK_degree: return Qt::Key_degree;
+ case XK_plusminus: return Qt::Key_plusminus;
+ case XK_twosuperior: return Qt::Key_twosuperior;
+ case XK_threesuperior: return Qt::Key_threesuperior;
+ case XK_acute: return Qt::Key_acute;
+ case XK_mu: return Qt::Key_mu;
+ case XK_paragraph: return Qt::Key_paragraph;
+ case XK_periodcentered: return Qt::Key_periodcentered;
+ case XK_cedilla: return Qt::Key_cedilla;
+ case XK_onesuperior: return Qt::Key_onesuperior;
+ case XK_masculine: return Qt::Key_masculine;
+ case XK_guillemotright: return Qt::Key_guillemotright;
+ case XK_onequarter: return Qt::Key_onequarter;
+ case XK_onehalf: return Qt::Key_onehalf;
+ case XK_threequarters: return Qt::Key_threequarters;
+ case XK_questiondown: return Qt::Key_questiondown;
+ case XK_Agrave: return Qt::Key_Agrave;
+ case XK_Aacute: return Qt::Key_Aacute;
+ case XK_Acircumflex: return Qt::Key_Acircumflex;
+ case XK_Atilde: return Qt::Key_Atilde;
+ case XK_Adiaeresis: return Qt::Key_Adiaeresis;
+ case XK_Aring: return Qt::Key_Aring;
+ case XK_AE: return Qt::Key_AE;
+ case XK_Ccedilla: return Qt::Key_Ccedilla;
+ case XK_Egrave: return Qt::Key_Egrave;
+ case XK_Eacute: return Qt::Key_Eacute;
+ case XK_Ecircumflex: return Qt::Key_Ecircumflex;
+ case XK_Ediaeresis: return Qt::Key_Ediaeresis;
+ case XK_Igrave: return Qt::Key_Igrave;
+ case XK_Iacute: return Qt::Key_Iacute;
+ case XK_Icircumflex: return Qt::Key_Icircumflex;
+ case XK_Idiaeresis: return Qt::Key_Idiaeresis;
+ case XK_ETH: return Qt::Key_ETH;
+ //case XK_Eth: return Qt::Key_Eth;
+ case XK_Ntilde: return Qt::Key_Ntilde;
+ case XK_Ograve: return Qt::Key_Ograve;
+ case XK_Oacute: return Qt::Key_Oacute;
+ case XK_Ocircumflex: return Qt::Key_Ocircumflex;
+ case XK_Otilde: return Qt::Key_Otilde;
+ case XK_Odiaeresis: return Qt::Key_Odiaeresis;
+ case XK_multiply: return Qt::Key_multiply;
+ //case XK_Oslash: return Qt::Key_AsciiTilde;
+ case XK_Ooblique: return Qt::Key_Ooblique;
+ case XK_Ugrave: return Qt::Key_Ugrave;
+ case XK_Uacute: return Qt::Key_Uacute;
+ case XK_Ucircumflex: return Qt::Key_Ucircumflex;
+ case XK_Udiaeresis: return Qt::Key_Udiaeresis;
+ case XK_Yacute: return Qt::Key_Yacute;
+ case XK_THORN: return Qt::Key_THORN;
+ //case XK_Thorn: return Qt::Key_AsciiTilde;
+ case XK_ssharp: return Qt::Key_ssharp;
+ /*case XK_agrave: return Qt::Key_AsciiTilde;
+ case XK_aacute: return Qt::Key_AsciiTilde;
+ case XK_acircumflex: return Qt::Key_AsciiTilde;
+ case XK_atilde: return Qt::Key_AsciiTilde;
+ case XK_adiaeresis: return Qt::Key_AsciiTilde;
+ case XK_aring: return Qt::Key_AsciiTilde;
+ case XK_ae: return Qt::Key_AsciiTilde;
+ case XK_ccedilla: return Qt::Key_AsciiTilde;
+ case XK_egrave: return Qt::Key_AsciiTilde;
+ case XK_eacute: return Qt::Key_AsciiTilde;
+ case XK_ecircumflex: return Qt::Key_AsciiTilde;
+ case XK_ediaeresis: return Qt::Key_AsciiTilde;
+ case XK_igrave: return Qt::Key_AsciiTilde;
+ case XK_iacute: return Qt::Key_AsciiTilde;
+ case XK_icircumflex: return Qt::Key_AsciiTilde;
+ case XK_idiaeresis: return Qt::Key_AsciiTilde;
+ case XK_eth: return Qt::Key_AsciiTilde;
+ case XK_ntilde: return Qt::Key_AsciiTilde;
+ case XK_ograve: return Qt::Key_AsciiTilde;
+ case XK_oacute: return Qt::Key_AsciiTilde;
+ case XK_ocircumflex: return Qt::Key_AsciiTilde;
+ case XK_otilde: return Qt::Key_AsciiTilde;
+ case XK_odiaeresis: return Qt::Key_AsciiTilde;
+ case XK_division: return Qt::Key_AsciiTilde;
+ case XK_oslash: return Qt::Key_AsciiTilde;
+ case XK_ooblique: return Qt::Key_AsciiTilde;
+ case XK_ugrave: return Qt::Key_AsciiTilde;
+ case XK_uacute: return Qt::Key_AsciiTilde;
+ case XK_ucircumflex: return Qt::Key_AsciiTilde;
+ case XK_udiaeresis: return Qt::Key_AsciiTilde;
+ case XK_yacute: return Qt::Key_AsciiTilde;
+ case XK_thorn: return Qt::Key_AsciiTilde;
+ case XK_ydiaeresis: return Qt::Key_AsciiTilde;
+
+ case: XK_Agonek: return Qt::Key_AsciiTilde;
+ case XK_breve: return Qt::Key_AsciiTilde;
+ case XK_Lstroke: return Qt::Key_AsciiTilde;
+ case XK_Lcaron: return Qt::Key_AsciiTilde;
+ case XK_Sacute: return Qt::Key_AsciiTilde;
+ case XK_Scaron: return Qt::Key_AsciiTilde;
+ case XK_Scedilla: return Qt::Key_AsciiTilde;
+ case XK_Tcaron: return Qt::Key_AsciiTilde;
+ case XK_Zacute: return Qt::Key_AsciiTilde;
+ case XK_Zcaron: return Qt::Key_AsciiTilde;
+ case XK_Zabovedot: return Qt::Key_AsciiTilde;
+ case XK_aogonek: return Qt::Key_AsciiTilde;
+ case XK_ogonek: return Qt::Key_AsciiTilde;
+ case XK_lstroke: return Qt::Key_AsciiTilde;
+ case XK_lcaron: return Qt::Key_AsciiTilde;
+ case XK_sacute: return Qt::Key_AsciiTilde;
+ case XK_caron: return Qt::Key_AsciiTilde;
+ case XK_scaron: return Qt::Key_AsciiTilde;
+ case XK_scedilla: return Qt::Key_AsciiTilde;
+ case XK_tcaron: return Qt::Key_AsciiTilde;
+ case XK_zacute: return Qt::Key_AsciiTilde;
+ case XK_doubleacute: return Qt::Key_AsciiTilde;
+ case XK_zcaron: return Qt::Key_AsciiTilde;
+ case XK_zabovedot: return Qt::Key_AsciiTilde;
+ case XK_Racute: return Qt::Key_AsciiTilde;
+ case XK_Abreve: return Qt::Key_AsciiTilde;
+ case XK_Lacute: return Qt::Key_AsciiTilde;
+ case XK_Cacute: return Qt::Key_AsciiTilde;
+ case XK_Ccaron: return Qt::Key_AsciiTilde;
+ case XK_Eogonek: return Qt::Key_AsciiTilde;
+ case XK_Ecaron: return Qt::Key_AsciiTilde;
+ case XK_Dcaron: return Qt::Key_AsciiTilde;
+ case XK_Dstroke: return Qt::Key_AsciiTilde;
+ case XK_Nacute: return Qt::Key_AsciiTilde;
+ case XK_Ncaron: return Qt::Key_AsciiTilde;
+ case XK_Odoubleacute: return Qt::Key_AsciiTilde;
+ case XK_Rcaron: return Qt::Key_AsciiTilde;
+ case XK_Uring: return Qt::Key_AsciiTilde;
+ case XK_Udoubleacute: return Qt::Key_AsciiTilde;
+ case XK_Tcedilla: return Qt::Key_AsciiTilde;
+ case XK_racute: return Qt::Key_AsciiTilde;
+ case XK_abreve: return Qt::Key_AsciiTilde;
+ case XK_lacute: return Qt::Key_AsciiTilde;
+ case XK_cacute: return Qt::Key_AsciiTilde;
+ case XK_ccaron: return Qt::Key_AsciiTilde;
+ case XK_eogonek: return Qt::Key_AsciiTilde;
+ case XK_ecaron: return Qt::Key_AsciiTilde;
+ case XK_dcaron: return Qt::Key_AsciiTilde;
+ case XK_dstroke: return Qt::Key_AsciiTilde;
+ case XK_nacute: return Qt::Key_AsciiTilde;
+ case XK_ncaron: return Qt::Key_AsciiTilde;
+ case XK_odoubleacute: return Qt::Key_AsciiTilde;
+ case XK_rcaron: return Qt::Key_AsciiTilde;
+ case XK_uring: return Qt::Key_AsciiTilde;
+ case XK_udoubleacute: return Qt::Key_AsciiTilde;
+ case XK_tcedilla: return Qt::Key_AsciiTilde;
+ case XK_abovedot: return Qt::Key_AsciiTilde;
+ case XK_Hstroke: return Qt::Key_AsciiTilde;
+ case XK_Hcircumflex: return Qt::Key_AsciiTilde;
+ case XK_Iabovedot: return Qt::Key_AsciiTilde;
+ case XK_Gbreve: return Qt::Key_AsciiTilde;
+ case XK_Jcircumflex: return Qt::Key_AsciiTilde;
+ case XK_hstroke: return Qt::Key_AsciiTilde;
+ case XK_hcircumflex: return Qt::Key_AsciiTilde;
+ case XK_idotless: return Qt::Key_AsciiTilde;
+ case XK_gbreve: return Qt::Key_AsciiTilde;
+ case XK_jcircumflex: return Qt::Key_AsciiTilde;
+ case XK_Cabovedot: return Qt::Key_AsciiTilde;
+ case XK_Ccircumflex: return Qt::Key_AsciiTilde;
+ case XK_Gabovedot: return Qt::Key_AsciiTilde;
+ case XK_Gcircumflex: return Qt::Key_AsciiTilde;
+ case XK_Ubreve: return Qt::Key_AsciiTilde;
+ case XK_Scircumflex: return Qt::Key_AsciiTilde;
+ case XK_cabovedot: return Qt::Key_AsciiTilde;
+ case XK_ccircumflex: return Qt::Key_AsciiTilde;
+ case XK_gabovedot: return Qt::Key_AsciiTilde;
+ case XK_gcircumflex: return Qt::Key_AsciiTilde;
+ case XK_ubreve: return Qt::Key_AsciiTilde;
+ case XK_scircumflex: return Qt::Key_AsciiTilde;
+ case XK_kra: return Qt::Key_AsciiTilde;
+ case XK_kappa: return Qt::Key_AsciiTilde;
+ case XK_Rcedilla: return Qt::Key_AsciiTilde;
+ case XK_Itilde: return Qt::Key_AsciiTilde;
+ case XK_Lcedilla: return Qt::Key_AsciiTilde;
+ case XK_Emacron: return Qt::Key_AsciiTilde;
+ case XK_Gcedilla: return Qt::Key_AsciiTilde;
+ case XK_Tslash: return Qt::Key_AsciiTilde;
+ case XK_rcedilla: return Qt::Key_AsciiTilde;
+ case XK_itilde: return Qt::Key_AsciiTilde;
+ case XK_lcedilla: return Qt::Key_AsciiTilde;
+ case XK_emacron: return Qt::Key_AsciiTilde;
+ case XK_gcedilla: return Qt::Key_AsciiTilde;
+ case XK_tslash: return Qt::Key_AsciiTilde;
+ case XK_ENG: return Qt::Key_AsciiTilde;
+ case XK_eng: return Qt::Key_AsciiTilde;
+ case XK_Amacron: return Qt::Key_AsciiTilde;
+ case XK_Iogonek: return Qt::Key_AsciiTilde;
+ case XK_Eabovedot: return Qt::Key_AsciiTilde;
+ case XK_Imacron: return Qt::Key_AsciiTilde;
+ case XK_Ncedilla: return Qt::Key_AsciiTilde;
+ case XK_Omacron: return Qt::Key_AsciiTilde;
+ case XK_Kcedilla: return Qt::Key_AsciiTilde;
+ case XK_Uogonek: return Qt::Key_AsciiTilde;
+ case XK_Utilde: return Qt::Key_AsciiTilde;
+ case XK_Umacron: return Qt::Key_AsciiTilde;
+ case XK_amacron: return Qt::Key_AsciiTilde;
+ case XK_iogonek: return Qt::Key_AsciiTilde;
+ case XK_eabovedot: return Qt::Key_AsciiTilde;
+ case XK_imacron: return Qt::Key_AsciiTilde;
+ case XK_ncedilla: return Qt::Key_AsciiTilde;
+ case XK_omacron: return Qt::Key_AsciiTilde;
+ case XK_kcedilla: return Qt::Key_AsciiTilde;
+ case XK_uogonek: return Qt::Key_AsciiTilde;
+ case XK_utilde: return Qt::Key_AsciiTilde;
+ case XK_umacron: return Qt::Key_AsciiTilde;
+ case XK_Wcircumflex: return Qt::Key_AsciiTilde;
+ case XK_wcircumflex: return Qt::Key_AsciiTilde;
+ case XK_Ycircumflex: return Qt::Key_AsciiTilde;
+ case XK_ycircumflex: return Qt::Key_AsciiTilde;
+ case XK_Babovedot: return Qt::Key_AsciiTilde;
+ case XK_babovedot: return Qt::Key_AsciiTilde;
+ case XK_Dabovedot: return Qt::Key_AsciiTilde;
+ case XK_dabovedot: return Qt::Key_AsciiTilde;
+ case XK_Fabovedot: return Qt::Key_AsciiTilde;
+ case XK_fabovedot: return Qt::Key_AsciiTilde;
+ case XK_Mabovedot: return Qt::Key_AsciiTilde;
+ case XK_mabovedot: return Qt::Key_AsciiTilde;
+ case XK_Pabovedot: return Qt::Key_AsciiTilde;
+ case XK_pabovedot: return Qt::Key_AsciiTilde;
+ case XK_Sabovedot: return Qt::Key_AsciiTilde;
+ case XK_sabovedot: return Qt::Key_AsciiTilde;
+ case XK_Tabovedot: return Qt::Key_AsciiTilde;
+ case XK_tabovedot: return Qt::Key_AsciiTilde;
+ case XK_Wgrave: return Qt::Key_AsciiTilde;
+ case XK_wgrave: return Qt::Key_AsciiTilde;
+ case XK_Wacute: return Qt::Key_AsciiTilde;
+ case XK_wacute: return Qt::Key_AsciiTilde;
+ case XK_Wdiaeresis: return Qt::Key_AsciiTilde;
+ case XK_wdiaeresis: return Qt::Key_AsciiTilde;
+ case XK_Ygrave: return Qt::Key_AsciiTilde;
+ case XK_ygrave: return Qt::Key_AsciiTilde;
+ case XK_OE: return Qt::Key_AsciiTilde;
+ case XK_oe: return Qt::Key_AsciiTilde;
+ case XK_Ydiaeresis: return Qt::Key_AsciiTilde;*/
+ default:
+ qDebug() << "Unknown Key";
+ }
+ qDebug() << " -- Simple Qt Map:" << (Qt::Key)(symbol);
+ qDebug() << " -- Key Sequence Map:" << QKeySequence(symbol);
+ qDebug() << " - Not implemented yet";
+ return Qt::Key_unknown;
+}
+
+NativeWindowSystem::MouseButton NativeWindowSystem::MouseToQt(int keycode){
+ switch(keycode){
+ case 1:
+ return NativeWindowSystem::LeftButton;
+ case 3:
+ return NativeWindowSystem::RightButton;
+ case 2:
+ return NativeWindowSystem::MidButton;
+ case 4:
+ return NativeWindowSystem::WheelUp;
+ case 5:
+ return NativeWindowSystem::WheelDown;
+ case 6:
+ return NativeWindowSystem::WheelLeft;
+ case 7:
+ return NativeWindowSystem::WheelRight;
+ case 8:
+ return NativeWindowSystem::BackButton; //Not sure if this is correct yet (1/27/17)
+ case 9:
+ return NativeWindowSystem::ForwardButton; //Not sure if this is correct yet (1/27/17)
+ default:
+ return NativeWindowSystem::NoButton;
+ }
+}
diff --git a/src-qt5/core/libLumina/NativeWindow.cpp b/src-qt5/core/libLumina/NativeWindow.cpp
index 97131b52..94d39cb7 100644
--- a/src-qt5/core/libLumina/NativeWindow.cpp
+++ b/src-qt5/core/libLumina/NativeWindow.cpp
@@ -6,59 +6,96 @@
//===========================================
#include "NativeWindow.h"
+#include <QDebug>
+
// === PUBLIC ===
NativeWindow::NativeWindow(WId id) : QObject(){
winid = id;
- WIN = QWindow::fromWinId(winid);
+ frameid = 0;
+ dmgID = 0;
}
NativeWindow::~NativeWindow(){
hash.clear();
- //WIN->deleteLater(); //This class only deals with Native windows which were created outside the app - they need to be cleaned up outside the app too
+}
+
+void NativeWindow::addFrameWinID(WId fid){
+ frameid = fid;
+}
+
+void NativeWindow::addDamageID(unsigned int dmg){
+ dmgID = dmg;
+}
+
+bool NativeWindow::isRelatedTo(WId tmp){
+ return (relatedTo.contains(tmp) || winid == tmp || frameid == tmp);
}
WId NativeWindow::id(){
return winid;
}
-QWindow* NativeWindow::window(){
- return WIN;
+WId NativeWindow::frameId(){
+ return frameid;
+}
+
+unsigned int NativeWindow::damageId(){
+ return dmgID;
}
QVariant NativeWindow::property(NativeWindow::Property prop){
if(hash.contains(prop)){ return hash.value(prop); }
+ else if(prop == NativeWindow::RelatedWindows){ return QVariant::fromValue(relatedTo); }
return QVariant(); //null variant
}
-void NativeWindow::setProperty(NativeWindow::Property prop, QVariant val){
- if(prop == NativeWindow::None || hash.value(prop)==val){ return; }
- hash.insert(prop, val);
+void NativeWindow::setProperty(NativeWindow::Property prop, QVariant val, bool force){
+ if(prop == NativeWindow::RelatedWindows){ relatedTo = val.value< QList<WId> >(); }
+ else if(prop == NativeWindow::None || (!force && hash.value(prop)==val)){ return; }
+ else{ hash.insert(prop, val); }
emit PropertiesChanged(QList<NativeWindow::Property>() << prop, QList<QVariant>() << val);
}
-void NativeWindow::setProperties(QList<NativeWindow::Property> props, QList<QVariant> vals){
+void NativeWindow::setProperties(QList<NativeWindow::Property> props, QList<QVariant> vals, bool force){
for(int i=0; i<props.length(); i++){
- if(i>=vals.length()){ props.removeAt(i); i--; continue; } //no corresponding value for this propertu
- if(props[i] == NativeWindow::None || (hash.value(props[i]) == vals[i]) ){ props.removeAt(i); vals.removeAt(i); i--; continue; } //Invalid property or identical value
+ if(i>=vals.length()){ props.removeAt(i); i--; continue; } //no corresponding value for this property
+ if(props[i] == NativeWindow::None || (!force && (hash.value(props[i]) == vals[i])) ){ props.removeAt(i); vals.removeAt(i); i--; continue; } //Invalid property or identical value
hash.insert(props[i], vals[i]);
}
emit PropertiesChanged(props, vals);
}
-void NativeWindow::requestProperty(NativeWindow::Property prop, QVariant val){
- if(prop == NativeWindow::None || hash.value(prop)==val ){ return; }
+void NativeWindow::requestProperty(NativeWindow::Property prop, QVariant val, bool force){
+ if(prop == NativeWindow::None || prop == NativeWindow::RelatedWindows || (!force && hash.value(prop)==val) ){ return; }
emit RequestPropertiesChange(winid, QList<NativeWindow::Property>() << prop, QList<QVariant>() << val);
}
-void NativeWindow::requestProperties(QList<NativeWindow::Property> props, QList<QVariant> vals){
+void NativeWindow::requestProperties(QList<NativeWindow::Property> props, QList<QVariant> vals, bool force){
//Verify/adjust inputs as needed
for(int i=0; i<props.length(); i++){
if(i>=vals.length()){ props.removeAt(i); i--; continue; } //no corresponding value for this property
- if(props[i] == NativeWindow::None || hash.value(props[i])==vals[i] ){ props.removeAt(i); vals.removeAt(i); i--; continue; } //Invalid property or identical value
+ if(props[i] == NativeWindow::None || props[i] == NativeWindow::RelatedWindows || (!force && hash.value(props[i])==vals[i]) ){ props.removeAt(i); vals.removeAt(i); i--; continue; } //Invalid property or identical value
+ /*if( (props[i] == NativeWindow::Visible || props[i] == NativeWindow::Active) && frameid !=0){
+ //These particular properties needs to change the frame - not the window itself
+ emit RequestPropertiesChange(frameid, QList<NativeWindow::Property>() << props[i], QList<QVariant>() << vals[i]);
+ props.removeAt(i); vals.removeAt(i); i--;
+ }*/
}
emit RequestPropertiesChange(winid, props, vals);
}
+QRect NativeWindow::geometry(){
+ //Calculate the "full" geometry of the window + frame (if any)
+ QRect geom( hash.value(NativeWindow::GlobalPos).toPoint(), hash.value(NativeWindow::Size).toSize() );
+ //Now adjust the window geom by the frame margins
+ QList<int> frame = hash.value(NativeWindow::FrameExtents).value< QList<int> >(); //Left,Right,Top,Bottom
+ qDebug() << "Calculate Geometry:" << geom << frame;
+ if(frame.length()==4){
+ geom = geom.adjusted( -frame[0], -frame[2], frame[1], frame[3] );
+ }
+ qDebug() << " - Total:" << geom;
+ return geom;
+}
// ==== PUBLIC SLOTS ===
void NativeWindow::requestClose(){
emit RequestClose(winid);
diff --git a/src-qt5/core/libLumina/NativeWindow.h b/src-qt5/core/libLumina/NativeWindow.h
index fbdf9e1b..47359b7d 100644
--- a/src-qt5/core/libLumina/NativeWindow.h
+++ b/src-qt5/core/libLumina/NativeWindow.h
@@ -5,8 +5,8 @@
// See the LICENSE file for full details
//===========================================
// This is a container object for setting/announcing changes
-// in a native window's properties.
-// The WM will usually run the "setProperty" function on this object,
+// in a native window's properties.
+// The WM will usually run the "setProperty" function on this object,
// and any other classes/widgets which watch this window can act appropriatly after-the-fact
// Non-WM classes should use the "Request" signals to ask the WM to do something, and listen for changes later
//===========================================
@@ -29,10 +29,10 @@ public:
enum Action {A_MOVE, A_RESIZE, A_MINIMIZE, A_SHADE, A_STICK, A_MAX_VERT, A_MAX_HORZ, A_FULLSCREEN, A_CHANGE_DESKTOP, A_CLOSE, A_ABOVE, A_BELOW};
enum Property{ /*QVariant Type*/
- None, /*null*/
- MinSize, /*QSize*/
- MaxSize, /*QSize*/
- Size, /*QSize*/
+ None=0, /*null*/
+ MinSize, /*QSize*/
+ MaxSize, /*QSize*/
+ Size, /*QSize*/
GlobalPos, /*QPoint*/
Title, /*QString*/
ShortTitle, /*QString*/
@@ -41,31 +41,41 @@ public:
Workspace, /*int*/
States, /*QList<NativeWindow::State> : Current state of the window */
WinTypes, /*QList<NativeWindow::Type> : Current type of window (typically does not change)*/
- WinActions, /*QList<NativeWindow::Action> : Current actions that the window allows (Managed/set by the WM)*/
- FrameExtents, /*QList<int> : [Left, Right, Top, Bottom] in pixels */
+ WinActions, /*QList<NativeWindow::Action> : Current actions that the window allows (Managed/set by the WM)*/
+ FrameExtents, /*QList<int> : [Left, Right, Top, Bottom] in pixels */
+ RelatedWindows, /* QList<WId> - better to use the "isRelatedTo(WId)" function instead of reading this directly*/
Active, /*bool*/
Visible /*bool*/
};
static QList<NativeWindow::Property> allProperties(){
- //Return all the available properties (excluding "None")
+ //Return all the available properties (excluding "None" and "FrameExtents" (WM control only) )
QList<NativeWindow::Property> props;
props << MinSize << MaxSize << Size << GlobalPos << Title << ShortTitle << Icon << Name << Workspace \
- << States << WinTypes << WinActions << Active << Visible;
+ << States << WinTypes << WinActions << RelatedWindows << Active << Visible;
return props;
};
NativeWindow(WId id);
~NativeWindow();
+ void addFrameWinID(WId);
+ void addDamageID(unsigned int);
+ bool isRelatedTo(WId);
+
WId id();
- QWindow* window();
+ WId frameId();
+ unsigned int damageId();
+
+ //QWindow* window();
QVariant property(NativeWindow::Property);
- void setProperty(NativeWindow::Property, QVariant);
- void setProperties(QList<NativeWindow::Property>, QList<QVariant>);
- void requestProperty(NativeWindow::Property, QVariant);
- void requestProperties(QList<NativeWindow::Property>, QList<QVariant>);
+ void setProperty(NativeWindow::Property, QVariant, bool force = false);
+ void setProperties(QList<NativeWindow::Property>, QList<QVariant>, bool force = false);
+ void requestProperty(NativeWindow::Property, QVariant, bool force = false);
+ void requestProperties(QList<NativeWindow::Property>, QList<QVariant>, bool force = false);
+
+ QRect geometry(); //this returns the "full" geometry of the window (window + frame)
public slots:
void requestClose(); //ask the app to close the window (may/not depending on activity)
@@ -74,8 +84,10 @@ public slots:
private:
QHash <NativeWindow::Property, QVariant> hash;
- QWindow *WIN;
- WId winid;
+ //QWindow *WIN;
+ WId winid, frameid;
+ QList<WId> relatedTo;
+ unsigned int dmgID;
signals:
//General Notifications
@@ -83,15 +95,23 @@ signals:
void RequestPropertiesChange(WId, QList<NativeWindow::Property>, QList<QVariant>);
void WindowClosed(WId);
void WindowNotResponding(WId); //will be sent out if a window does not respond to a ping request
+ void VisualChanged();
//Action Requests (not automatically emitted - typically used to ask the WM to do something)
//Note: "WId" should be the NativeWindow id()
void RequestClose(WId); //Close the window
- void RequestKill(WId); //Kill the window/app (usually from being unresponsive)
+ void RequestKill(WId); //Kill the window/app (usually from being unresponsive)
void RequestPing(WId); //Verify that the window is still active (such as not closing after a request
-
+ void RequestReparent(WId, WId, QPoint); //client window, frame window, relative origin point in frame
// System Tray Icon Embed/Unembed Requests
//void RequestEmbed(WId, QWidget*);
//void RequestUnEmbed(WId, QWidget*);
};
+
+// Declare the enumerations as Qt MetaTypes
+Q_DECLARE_METATYPE(NativeWindow::Type);
+Q_DECLARE_METATYPE(NativeWindow::Action);
+Q_DECLARE_METATYPE(NativeWindow::State);
+Q_DECLARE_METATYPE(NativeWindow::Property);
+
#endif
diff --git a/src-qt5/core/libLumina/NativeWindow.pri b/src-qt5/core/libLumina/NativeWindow.pri
index a5715287..c2ac0137 100644
--- a/src-qt5/core/libLumina/NativeWindow.pri
+++ b/src-qt5/core/libLumina/NativeWindow.pri
@@ -1,12 +1,17 @@
# Files
QT *= x11extras
-LIBS *= -lc -lxcb -lxcb-ewmh -lxcb-icccm -lxcb-image -lxcb-composite -lxcb-damage -lxcb-util -lXdamage
+LIBS *= -lc -lxcb -lxcb-ewmh -lxcb-icccm -lxcb-image -lxcb-composite -lxcb-damage -lxcb-util -lxcb-keysyms -lXdamage
SOURCES *= $${PWD}/NativeWindow.cpp \
- $${PWD}/NativeWindowSystem.cpp
+ $${PWD}/NativeWindowSystem.cpp \
+ $${PWD}/NativeKeyToQt.cpp \
+ $${PWD}/NativeEventFilter.cpp \
+ $${PWD}/NativeEmbedWidget.cpp
HEADERS *= $${PWD}/NativeWindow.h \
- $${PWD}/NativeWindowSystem.h
+ $${PWD}/NativeWindowSystem.h \
+ $${PWD}/NativeEventFilter.h \
+ $${PWD}/NativeEmbedWidget.h
INCLUDEPATH *= $${PWD}
diff --git a/src-qt5/core/libLumina/NativeWindowSystem.cpp b/src-qt5/core/libLumina/NativeWindowSystem.cpp
index 36a0b7f0..e0f3fe91 100644
--- a/src-qt5/core/libLumina/NativeWindowSystem.cpp
+++ b/src-qt5/core/libLumina/NativeWindowSystem.cpp
@@ -14,6 +14,10 @@
#include <QDebug>
#include <QApplication>
#include <QScreen>
+#include <QFont>
+#include <QFontMetrics>
+#include <QKeySequence>
+
//XCB Library includes
#include <xcb/xcb.h>
@@ -48,6 +52,22 @@
XCB_EVENT_MASK_FOCUS_CHANGE | \
XCB_EVENT_MASK_ENTER_WINDOW)
+#define NORMAL_WIN_EVENT_MASK (XCB_EVENT_MASK_BUTTON_PRESS | \
+ XCB_EVENT_MASK_BUTTON_RELEASE | \
+ XCB_EVENT_MASK_POINTER_MOTION | \
+ XCB_EVENT_MASK_BUTTON_MOTION | \
+ XCB_EVENT_MASK_EXPOSURE | \
+ XCB_EVENT_MASK_STRUCTURE_NOTIFY | \
+ XCB_EVENT_MASK_SUBSTRUCTURE_REDIRECT | \
+ XCB_EVENT_MASK_SUBSTRUCTURE_NOTIFY | \
+ XCB_EVENT_MASK_ENTER_WINDOW| \
+ XCB_EVENT_MASK_PROPERTY_CHANGE)
+
+inline void registerClientEvents(WId id){
+ uint32_t value_list[1] = {NORMAL_WIN_EVENT_MASK};
+ xcb_change_window_attributes(QX11Info::connection(), id, XCB_CW_EVENT_MASK, value_list);
+}
+
//Internal XCB private objects class
class NativeWindowSystem::p_objects{
public:
@@ -58,15 +78,21 @@ public:
//Functions for setting up these objects as needed
bool init_ATOMS(){
+ xcb_intern_atom_cookie_t *cookie = xcb_ewmh_init_atoms(QX11Info::connection(), &EWMH);
+ if(!xcb_ewmh_init_atoms_replies(&EWMH, cookie, NULL) ){
+ qDebug() << "Error with XCB atom initializations";
+ return false;
+ }
+
QStringList atoms;
- atoms << "WM_TAKE_FOCUS" << "WM_DELETE_WINDOW" << "WM_PROTOCOLS"
- << "WM_CHANGE_STATE" << "_NET_SYSTEM_TRAY_OPCODE" << "_NET_SYSTEM_TRAY_ORIENTATION"
+ atoms << "WM_TAKE_FOCUS" << "WM_DELETE_WINDOW" << "WM_PROTOCOLS" << "_NET_WM_WINDOW_OPACITY"
+ << "WM_CHANGE_STATE" << "_NET_SYSTEM_TRAY_OPCODE" << "_NET_SYSTEM_TRAY_ORIENTATION" << "_XEMBED"
<< "_NET_SYSTEM_TRAY_VISUAL" << QString("_NET_SYSTEM_TRAY_S%1").arg(QString::number(QX11Info::appScreen()));
//Create all the requests for the atoms
QList<xcb_intern_atom_reply_t*> reply;
for(int i=0; i<atoms.length(); i++){
reply << xcb_intern_atom_reply(QX11Info::connection(), \
- xcb_intern_atom(QX11Info::connection(), 0, atoms[i].length(), atoms[i].toLocal8Bit()), NULL);
+ xcb_intern_atom(QX11Info::connection(), 0, atoms[i].length(), atoms[i].toLocal8Bit()), NULL);
}
//Now evaluate all the requests and save the atoms
for(int i=0; i<reply.length(); i++){ //NOTE: this will always be the same length as the "atoms" list
@@ -81,9 +107,19 @@ public:
return (ATOMS.keys().length() == atoms.length());
}
+ WId getTransientFor(WId win){
+ xcb_get_property_cookie_t cookie = xcb_icccm_get_wm_transient_for_unchecked(QX11Info::connection(), win);
+ xcb_window_t trans;
+ if(1!= xcb_icccm_get_wm_transient_for_reply(QX11Info::connection(), cookie, &trans, NULL) ){
+ return win; //error in fetching transient window ID (or none found)
+ }else{
+ return trans;
+ }
+}
+
bool register_wm(){
uint32_t value_list[1] = {ROOT_WIN_EVENT_MASK};
- xcb_generic_error_t *status = xcb_request_check( QX11Info::connection(), xcb_change_window_attributes_checked(QX11Info::connection(), root_window, XCB_CW_EVENT_MASK, value_list));
+ xcb_generic_error_t *status = xcb_request_check( QX11Info::connection(), xcb_change_window_attributes_checked(QX11Info::connection(), root_window, XCB_CW_EVENT_MASK, value_list));
if(status!=0){ return false; }
uint32_t params[] = {1};
wm_window = xcb_generate_id(QX11Info::connection()); //need a new ID
@@ -97,7 +133,7 @@ public:
//Also set this property on the child window (pointing to itself)
xcb_ewmh_set_supporting_wm_check(&EWMH, wm_window, wm_window);
//Now also setup the root event mask on the wm_window
- status = xcb_request_check( QX11Info::connection(), xcb_change_window_attributes_checked(QX11Info::connection(), wm_window, XCB_CW_EVENT_MASK, value_list));
+ status = xcb_request_check( QX11Info::connection(), xcb_change_window_attributes_checked(QX11Info::connection(), wm_window, XCB_CW_EVENT_MASK, value_list));
if(status!=0){ return false; }
return true;
}
@@ -144,18 +180,18 @@ public:
xcb_visualtype_t *type = xcb_aux_find_visual_by_attrs(root_screen, XCB_VISUAL_CLASS_TRUE_COLOR, 32);
if(type!=0){
xcb_change_property(QX11Info::connection(), XCB_PROP_MODE_REPLACE, tray_window, \
- ATOMS.value("_NET_SYSTEM_TRAY_VISUAL"), XCB_ATOM_VISUALID, 32, 1, &type->visual_id);
+ ATOMS.value("_NET_SYSTEM_TRAY_VISUAL"), XCB_ATOM_VISUALID, 32, 1, &type->visual_id);
}else{
qWarning() << " - Could not set TrueColor visual for system tray";
}
-
+
//Finally, send out an X event letting others know that the system tray is up and running
xcb_client_message_event_t event;
event.response_type = XCB_CLIENT_MESSAGE;
event.format = 32;
event.window = root_screen->root;
event.type = EWMH.MANAGER; //MANAGER atom
- event.data.data32[0] = XCB_TIME_CURRENT_TIME; //CurrentTime;
+ event.data.data32[0] = XCB_TIME_CURRENT_TIME; //CurrentTime;
event.data.data32[1] = _NET_SYSTEM_TRAY_S; //_NET_SYSTEM_TRAY_S atom
event.data.data32[2] = tray_window;
event.data.data32[3] = 0;
@@ -175,6 +211,7 @@ public:
NativeWindowSystem::NativeWindowSystem() : QObject(){
obj = 0;
pingTimer = 0;
+ screenLocked = false;
}
NativeWindowSystem::~NativeWindowSystem(){
@@ -200,7 +237,12 @@ bool NativeWindowSystem::start(){
if( !obj->init_ATOMS() ){ return false; }
} //Done with private object init
bool ok = obj->register_wm();
- if(ok){ ok = obj->start_system_tray(); }
+ if(ok){
+ setRoot_supportedActions();
+ ok = obj->start_system_tray();
+ }else{
+ qWarning() << "Could not register the WM";
+ }
return ok;
}
@@ -208,37 +250,30 @@ void NativeWindowSystem::stop(){
}
-//Small simplification functions
-Qt::Key NativeWindowSystem::KeycodeToQt(int keycode){
- return Qt::Key_unknown;
-}
-
-NativeWindowSystem::MouseButton NativeWindowSystem::MouseToQt(int keycode){
- switch(keycode){
- case 1:
- return NativeWindowSystem::LeftButton;
- case 3:
- return NativeWindowSystem::RightButton;
- case 2:
- return NativeWindowSystem::MidButton;
- case 4:
- return NativeWindowSystem::WheelUp;
- case 5:
- return NativeWindowSystem::WheelDown;
- case 6:
- return NativeWindowSystem::WheelLeft;
- case 7:
- return NativeWindowSystem::WheelRight;
- case 8:
- return NativeWindowSystem::BackButton; //Not sure if this is correct yet (1/27/17)
- case 9:
- return NativeWindowSystem::ForwardButton; //Not sure if this is correct yet (1/27/17)
- default:
- return NativeWindowSystem::NoButton;
+// === PRIVATE ===
+NativeWindow* NativeWindowSystem::findWindow(WId id, bool checkRelated){
+ //qDebug() << "Find Window:" << id;
+ for(int i=0; i<NWindows.length(); i++){
+ if(id==NWindows[i]->id() || id==NWindows[i]->frameId() ){ return NWindows[i]; }
+ //if(checkRelated && NWindows[i]->isRelatedTo(id)){ return NWindows[i]; }
+ //else if(!checkRelated && id==NWindows[i]->id()){ return NWindows[i]; }
+ }
+ //Check to see if this is a transient for some other window
+ if(checkRelated){
+ //WId tid = obj->getTransientFor(id);
+ //if(tid!=id){ return findWindow(tid, checkRelated); } //call it recursively as needed
+ //qDebug() << " -- Could not find Window!";
}
+ return 0;
+}
+
+NativeWindow* NativeWindowSystem::findTrayWindow(WId id){
+ for(int i=0; i<TWindows.length(); i++){
+ if(TWindows[i]->isRelatedTo(id)){ return TWindows[i]; }
+ }
+ return 0;
}
-// === PRIVATE ===
void NativeWindowSystem::UpdateWindowProperties(NativeWindow* win, QList< NativeWindow::Property > props){
//Put the properties in logical groups as appropriate (some XCB calls return multiple properties)
if(props.contains(NativeWindow::Title)){
@@ -255,7 +290,7 @@ void NativeWindowSystem::UpdateWindowProperties(NativeWindow* win, QList< Native
if(name.isEmpty()){
//_NET_WM_VISIBLE_NAME
xcb_get_property_cookie_t cookie = xcb_ewmh_get_wm_visible_name_unchecked(&obj->EWMH, win->id());
- if(cookie.sequence != 0){
+ if(cookie.sequence != 0){
xcb_ewmh_get_utf8_strings_reply_t data;
if( 1 == xcb_ewmh_get_wm_visible_name_reply(&obj->EWMH, cookie, &data, NULL) ){
name = QString::fromUtf8(data.strings, data.strings_len);
@@ -271,7 +306,7 @@ void NativeWindowSystem::UpdateWindowProperties(NativeWindow* win, QList< Native
xcb_icccm_get_text_property_reply_wipe(&reply);
}
}
- win->setProperty(NativeWindow::Name, name);
+ win->setProperty(NativeWindow::Title, name);
} //end TITLE property
if(props.contains(NativeWindow::ShortTitle)){
@@ -288,7 +323,7 @@ void NativeWindowSystem::UpdateWindowProperties(NativeWindow* win, QList< Native
if(name.isEmpty()){
//_NET_WM_VISIBLE_ICON_NAME
xcb_get_property_cookie_t cookie = xcb_ewmh_get_wm_visible_icon_name_unchecked(&obj->EWMH, win->id());
- if(cookie.sequence != 0){
+ if(cookie.sequence != 0){
xcb_ewmh_get_utf8_strings_reply_t data;
if( 1 == xcb_ewmh_get_wm_visible_icon_name_reply(&obj->EWMH, cookie, &data, NULL) ){
name = QString::fromUtf8(data.strings, data.strings_len);
@@ -337,7 +372,7 @@ void NativeWindowSystem::UpdateWindowProperties(NativeWindow* win, QList< Native
uint* dat = iter.data;
//dat+=2; //remember the first 2 element offset
for(int i=0; i<image.byteCount()/4; ++i, ++dat){
- ((uint*)image.bits())[i] = *dat;
+ ((uint*)image.bits())[i] = *dat;
}
icon.addPixmap(QPixmap::fromImage(image)); //layer this pixmap onto the icon
//Now see if there are any more icons available
@@ -350,7 +385,7 @@ void NativeWindowSystem::UpdateWindowProperties(NativeWindow* win, QList< Native
win->setProperty(NativeWindow::Icon, icon);
} //end ICON property
- if(props.contains(NativeWindow::MinSize) || props.contains(NativeWindow::MaxSize)
+ if(props.contains(NativeWindow::MinSize) || props.contains(NativeWindow::MaxSize)
|| props.contains(NativeWindow::Size) || props.contains(NativeWindow::GlobalPos) ){
//Try the ICCCM "Normal Hints" structure first (newer spec?)
xcb_get_property_cookie_t cookie = xcb_icccm_get_wm_normal_hints_unchecked(QX11Info::connection(), win->id());
@@ -401,41 +436,244 @@ void NativeWindowSystem::UpdateWindowProperties(NativeWindow* win, QList< Native
}*/
win->setProperty(NativeWindow::Workspace, wkspace);
}
+ if(props.contains(NativeWindow::FrameExtents)){
+ //Just assign default values to this - need to automate it later
+ //win->setProperty(NativeWindow::FrameExtents, QVariant::fromValue<QList<int> >(QList<int>() << 5 << 5 << 5+QFontMetrics(QFont()).height() << 5) );
+ }
+ if(props.contains(NativeWindow::RelatedWindows)){
+ WId orig = win->id();
+ WId tid = obj->getTransientFor(orig);
+ QList<WId> list;
+ while(tid != orig){
+ list << tid;
+ orig = tid;
+ tid = obj->getTransientFor(orig);
+ }
+ win->setProperty(NativeWindow::RelatedWindows, QVariant::fromValue(list));
+ }
+ if(props.contains(NativeWindow::Visible)){
+ xcb_get_window_attributes_reply_t *attr = xcb_get_window_attributes_reply(QX11Info::connection(), xcb_get_window_attributes(QX11Info::connection(), win->id()) , NULL);
+ if(attr != 0){
+ win->setProperty(NativeWindow::Visible, attr->map_state == XCB_MAP_STATE_VIEWABLE);
+ free(attr);
+ }
+ }
+ if(props.contains(NativeWindow::WinTypes)){
+ QList< NativeWindow::Type> types;
+ types << NativeWindow::T_NORMAL; //make this load appropriately later
+ win->setProperty(NativeWindow::WinTypes, QVariant::fromValue< QList<NativeWindow::Type> >(types) );
+ }
}
+void NativeWindowSystem::ChangeWindowProperties(NativeWindow* win, QList< NativeWindow::Property > props, QList<QVariant> vals){
+ if(props.length() == 0 || vals.length()!=props.length() || win ==0 ){ return; }
+ //qDebug() << "Change Window Properties:" << props << vals;
+ if(props.contains(NativeWindow::Title)){
+
+ }
+ if(props.contains(NativeWindow::ShortTitle)){
+
+ }
+ if(props.contains(NativeWindow::Icon)){
+
+ }
+ if(props.contains(NativeWindow::Size) || props.contains(NativeWindow::GlobalPos) ){
+ xcb_configure_window_value_list_t valList;
+ valList.x = 0; //Note that this is the relative position - should always be 0,0 relative to the embed widget
+ valList.y = 0;
+ QSize sz = win->property(NativeWindow::Size).toSize();
+ if(props.contains(NativeWindow::Size)){
+ sz = vals[ props.indexOf(NativeWindow::Size) ] .toSize();
+ }
+ valList.width = sz.width();
+ valList.height = sz.height();
+ /*if(props.contains(NativeWindow::GlobalPos)){
+ QPoint pt = vals[ props.indexOf(NativeWindow::GlobalPos) ] .toPoint();
+ valList.x = pt.x();
+ valList.y = pt.y();
+ }else{
+ valList.x = win->property(NativeWindow::GlobalPos).toPoint().x();
+ valList.y = win->property(NativeWindow::GlobalPos).toPoint().y();
+ }*/
+ uint16_t mask = 0;
+ mask = mask | XCB_CONFIG_WINDOW_WIDTH | XCB_CONFIG_WINDOW_HEIGHT | XCB_CONFIG_WINDOW_X | XCB_CONFIG_WINDOW_Y;
+ qDebug() << "Configure window Geometry:" << sz;
+ xcb_configure_window_aux(QX11Info::connection(), win->id(), mask, &valList);
+ }
+ if(props.contains(NativeWindow::Name)){
+
+ }
+ if(props.contains(NativeWindow::Workspace)){
+ int num = vals[ props.indexOf(NativeWindow::Workspace) ].toInt();
+ xcb_ewmh_set_wm_desktop(&obj->EWMH, win->id(), (num<0 ? 0xFFFFFFFF : qAbs(num) ) );
+ }
+ if(props.contains(NativeWindow::RelatedWindows)){
+
+ }
+ if(props.contains(NativeWindow::Visible)){
+ //qDebug() << "Check Window Visibility:" << vals[ props.indexOf(NativeWindow::Visible) ];
+ if( vals[ props.indexOf(NativeWindow::Visible) ].toBool() ){
+ //qDebug() << " - Map it!";
+ xcb_map_window(QX11Info::connection(), win->id());
+ }else{
+ //qDebug() << " - Unmap it!";
+ xcb_unmap_window(QX11Info::connection(), win->id());
+ }
+ }
+ if(props.contains(NativeWindow::Active)){
+ //Only one window can be "Active" at a time - so only do anything if this window wants to be active
+ if(vals[props.indexOf(NativeWindow::Active)].toBool() ){
+ xcb_ewmh_set_active_window(&obj->EWMH, QX11Info::appScreen(), (win->frameId()==0 ?win->id() : win->frameId()));
+ //Also send the active window a message to take input focus
+ //Send the window a WM_TAKE_FOCUS message
+ xcb_client_message_event_t event;
+ event.response_type = XCB_CLIENT_MESSAGE;
+ event.format = 32;
+ event.window = win->id();
+ event.type = obj->ATOMS["WM_PROTOCOLS"];
+ event.data.data32[0] = obj->ATOMS["WM_TAKE_FOCUS"];
+ event.data.data32[1] = XCB_TIME_CURRENT_TIME; //CurrentTime;
+ event.data.data32[2] = 0;
+ event.data.data32[3] = 0;
+ event.data.data32[4] = 0;
+
+ xcb_send_event(QX11Info::connection(), 0, win->id(), XCB_EVENT_MASK_STRUCTURE_NOTIFY | XCB_EVENT_MASK_SUBSTRUCTURE_REDIRECT, (const char *) &event);
+ xcb_flush(QX11Info::connection());
+ }
+ }
+
+}
// === PUBLIC SLOTS ===
-//These are the slots which are only used by the desktop system itself or the NativeWindowEventFilter
-void NativeWindowSystem::RegisterVirtualRoot(WId){
+//These are the slots which are typically only used by the desktop system itself or the NativeEventFilter
+void NativeWindowSystem::RegisterVirtualRoot(WId id){
+ //Convert to XCB array
+ xcb_window_t array[1];
+ array[0] = id;
+ //Set the property
+ xcb_ewmh_set_virtual_roots(&obj->EWMH, QX11Info::appScreen(), 1, array);
+}
+
+void NativeWindowSystem::setRoot_supportedActions(){
+//NET_WM standards (ICCCM implied - no standard way to list those)
+ xcb_atom_t list[] = {obj->EWMH._NET_WM_NAME,
+ obj->EWMH._NET_WM_ICON,
+ obj->EWMH._NET_WM_ICON_NAME,
+ obj->EWMH._NET_WM_DESKTOP,
+ obj->ATOMS["_NET_WM_WINDOW_OPACITY"],
+ /*_NET_WINDOW_TYPE (and all the various types - 15 in total*/
+ obj->EWMH._NET_WM_WINDOW_TYPE, obj->EWMH._NET_WM_WINDOW_TYPE_DESKTOP, obj->EWMH._NET_WM_WINDOW_TYPE_DOCK,
+ obj->EWMH._NET_WM_WINDOW_TYPE_TOOLBAR, obj->EWMH._NET_WM_WINDOW_TYPE_MENU, obj->EWMH._NET_WM_WINDOW_TYPE_UTILITY,
+ obj->EWMH._NET_WM_WINDOW_TYPE_SPLASH, obj->EWMH._NET_WM_WINDOW_TYPE_DIALOG, obj->EWMH._NET_WM_WINDOW_TYPE_NORMAL,
+ obj->EWMH._NET_WM_WINDOW_TYPE_DROPDOWN_MENU, obj->EWMH._NET_WM_WINDOW_TYPE_POPUP_MENU, obj->EWMH._NET_WM_WINDOW_TYPE_TOOLTIP,
+ obj->EWMH._NET_WM_WINDOW_TYPE_NOTIFICATION, obj->EWMH._NET_WM_WINDOW_TYPE_COMBO, obj->EWMH._NET_WM_WINDOW_TYPE_DND,
+ };
+ xcb_ewmh_set_supported(&obj->EWMH, QX11Info::appScreen(), 20,list);
+}
+void NativeWindowSystem::setRoot_numberOfWorkspaces(QStringList names){
+ if(names.isEmpty()){ names << "one"; }
+ //First set the overall number of workspaces
+ xcb_ewmh_set_number_of_desktops(&obj->EWMH, QX11Info::appScreen(), names.length());
+ //Now set the names for the workspaces
+ //EWMH LIBRARY BROKEN - appears to be a mismatch in the function header (looking for a single char array, instead of a list of char arrays)
+ // Ken Moore - 6/27/17
+ /*
+ char *array[ names.length() ];
+ for(int i=0; i<names.length(); i++){array[i] = names[i].toUtf8().data(); } //Convert to an array of char arrays
+ xcb_ewmh_set_desktop_names(&obj->EWMH, QX11Info::appScreen(), names.length(), array);
+ */
+}
+
+void NativeWindowSystem::setRoot_currentWorkspace(int num){
+ xcb_ewmh_set_current_desktop(&obj->EWMH, QX11Info::appScreen(), num);
+}
+
+void NativeWindowSystem::setRoot_clientList(QList<WId> list, bool stackorder){
+ //convert the QList into a generic array
+ xcb_window_t array[list.length()];
+ for(int i=0; i<list.length(); i++){ array[i] = list[i]; }
+ if(stackorder){
+ xcb_ewmh_set_client_list_stacking(&obj->EWMH, QX11Info::appScreen(), list.length(), array);
+ }else{
+ xcb_ewmh_set_client_list(&obj->EWMH, QX11Info::appScreen(), list.length(), array);
+ }
+}
+
+void NativeWindowSystem::setRoot_desktopGeometry(QRect geom){
+ //This one is a combo function
+ // This will set the "DESKTOP_VIEWPORT" property (point)
+ // as well as the "DESKTOP_GEOMETRY" property (size)
+ //Turn the QList into xcb_ewmh_coordinates_t*
+ xcb_ewmh_coordinates_t array[1];
+ array[0].x=geom.x(); array[0].y=geom.y();
+ //Now set the property
+ xcb_ewmh_set_desktop_viewport(&obj->EWMH, QX11Info::appScreen(), 1, array);
+ xcb_ewmh_set_desktop_geometry(&obj->EWMH, QX11Info::appScreen(), geom.width(), geom.height());
+}
+
+void NativeWindowSystem::setRoot_desktopWorkarea(QList<QRect> list){
+ //Convert to the XCB/EWMH data structures
+ xcb_ewmh_geometry_t array[list.length()];
+ for(int i=0; i<list.length(); i++){
+ array[i].x = list[i].x(); array[i].y = list[i].y();
+ array[i].width = list[i].width(); array[i].height = list[i].height();
+ }
+ //Now set the property
+ xcb_ewmh_set_workarea(&obj->EWMH, QX11Info::appScreen(), list.length(), array);
+}
+
+void NativeWindowSystem::setRoot_activeWindow(WId win){
+ xcb_ewmh_set_active_window(&obj->EWMH, QX11Info::appScreen(), win);
+ //Also send the active window a message to take input focus
+ //Send the window a WM_TAKE_FOCUS message
+ xcb_client_message_event_t event;
+ event.response_type = XCB_CLIENT_MESSAGE;
+ event.format = 32;
+ event.window = win;
+ event.type = obj->ATOMS["WM_PROTOCOLS"];
+ event.data.data32[0] = obj->ATOMS["WM_TAKE_FOCUS"];
+ event.data.data32[1] = XCB_TIME_CURRENT_TIME; //CurrentTime;
+ event.data.data32[2] = 0;
+ event.data.data32[3] = 0;
+ event.data.data32[4] = 0;
+
+ xcb_send_event(QX11Info::connection(), 0, win, XCB_EVENT_MASK_STRUCTURE_NOTIFY | XCB_EVENT_MASK_SUBSTRUCTURE_REDIRECT, (const char *) &event);
+ xcb_flush(QX11Info::connection());
+}
+
+int NativeWindowSystem::currentWorkspace(){
+ xcb_get_property_cookie_t cookie = xcb_ewmh_get_current_desktop_unchecked(&obj->EWMH, QX11Info::appScreen());
+ uint32_t num = 0;
+ if(1==xcb_ewmh_get_current_desktop_reply(&obj->EWMH, cookie, &num, NULL) ){
+ return num;
+ }else{
+ return 0;
+ }
}
//NativeWindowEventFilter interactions
void NativeWindowSystem::NewWindowDetected(WId id){
//Make sure this can be managed first
- if(findWindow(id) != 0){ return; } //already managed
+ if(findWindow(id, false) != 0){ qDebug() << "Window Already Managed!!!!"; findWindow(id,false)->setProperty(NativeWindow::Visible, true, true); return; } //already managed
xcb_get_window_attributes_cookie_t cookie = xcb_get_window_attributes(QX11Info::connection(), id);
xcb_get_window_attributes_reply_t *attr = xcb_get_window_attributes_reply(QX11Info::connection(), cookie, NULL);
if(attr == 0){ return; } //could not get attributes of window
if(attr->override_redirect){ free(attr); return; } //window has override redirect set (do not manage)
free(attr);
- //Register for events from this window
- #define NORMAL_WIN_EVENT_MASK (XCB_EVENT_MASK_BUTTON_PRESS | \
- XCB_EVENT_MASK_BUTTON_RELEASE | \
- XCB_EVENT_MASK_POINTER_MOTION | \
- XCB_EVENT_MASK_BUTTON_MOTION | \
- XCB_EVENT_MASK_EXPOSURE | \
- XCB_EVENT_MASK_STRUCTURE_NOTIFY | \
- XCB_EVENT_MASK_SUBSTRUCTURE_REDIRECT | \
- XCB_EVENT_MASK_SUBSTRUCTURE_NOTIFY | \
- XCB_EVENT_MASK_ENTER_WINDOW)
-
- uint32_t value_list[1] = {NORMAL_WIN_EVENT_MASK};
- xcb_change_window_attributes(QX11Info::connection(), id, XCB_CW_EVENT_MASK, value_list);
//Now go ahead and create/populate the container for this window
NativeWindow *win = new NativeWindow(id);
+ //Register for events from this window
+ registerClientEvents(win->id());
NWindows << win;
UpdateWindowProperties(win, NativeWindow::allProperties());
+ qDebug() << "New Window [& associated ID's]:" << win->id() << win->property(NativeWindow::RelatedWindows);
+ //Now setup the connections with this window
+ connect(win, SIGNAL(RequestClose(WId)), this, SLOT(RequestClose(WId)) );
+ connect(win, SIGNAL(RequestKill(WId)), this, SLOT(RequestKill(WId)) );
+ connect(win, SIGNAL(RequestPing(WId)), this, SLOT(RequestPing(WId)) );
+ connect(win, SIGNAL(RequestReparent(WId, WId, QPoint)), this, SLOT(RequestReparent(WId, WId, QPoint)) );
+ connect(win, SIGNAL(RequestPropertiesChange(WId, QList<NativeWindow::Property>, QList<QVariant>)), this, SLOT(RequestPropertiesChange(WId, QList<NativeWindow::Property>, QList<QVariant>)) );
emit NewWindowAvailable(win);
}
@@ -457,7 +695,7 @@ void NativeWindowSystem::NewTrayWindowDetected(WId id){
XCB_EVENT_MASK_SUBSTRUCTURE_REDIRECT | \
XCB_EVENT_MASK_SUBSTRUCTURE_NOTIFY | \
XCB_EVENT_MASK_ENTER_WINDOW)
-
+
uint32_t value_list[1] = {TRAY_WIN_EVENT_MASK};
xcb_change_window_attributes(QX11Info::connection(), id, XCB_CW_EVENT_MASK, value_list);
//Now go ahead and create/populate the container for this window
@@ -468,30 +706,66 @@ void NativeWindowSystem::NewTrayWindowDetected(WId id){
}
void NativeWindowSystem::WindowCloseDetected(WId id){
- NativeWindow *win = findWindow(id);
+ NativeWindow *win = findWindow(id, false);
+ qDebug() << "Got Window Closed" << id << win;
+ //qDebug() << "Old Window List:" << NWindows.length();
if(win!=0){
NWindows.removeAll(win);
+ //RequestReparent(id, QX11Info::appRootWindow(), QPoint(0,0));
win->emit WindowClosed(id);
- win->deleteLater();
+ qDebug() << "Visible Window Closed!!!";
+ //win->deleteLater();
}else{
win = findTrayWindow(id);
if(win!=0){
TWindows.removeAll(win);
win->emit WindowClosed(id);
- win->deleteLater();
+ win->deleteLater();
}
}
+ //qDebug() << " - Now:" << NWindows.length();
}
void NativeWindowSystem::WindowPropertyChanged(WId id, NativeWindow::Property prop){
- //NOTE: This is triggered by the NativeWindowEventFilter - not by changes to the NativeWindow objects themselves
- NativeWindow *win = findWindow(id);
+ //NOTE: This is triggered by the NativeEventFilter - not by changes to the NativeWindow objects themselves
+ NativeWindow *win = findWindow(id, prop!=NativeWindow::Visible);
if(win==0){ win = findTrayWindow(id); }
if(win!=0){
UpdateWindowProperties(win, QList<NativeWindow::Property>() << prop);
}
}
+void NativeWindowSystem::WindowPropertyChanged(WId id, NativeWindow::Property prop, QVariant val){
+ NativeWindow *win = findWindow(id,prop!=NativeWindow::Visible);
+ if(win==0){ win = findTrayWindow(id); }
+ if(win!=0){
+ win->setProperty(prop, val);
+ }
+}
+
+void NativeWindowSystem::WindowPropertiesChanged(WId id, QList<NativeWindow::Property> props, QList<QVariant> vals){
+ NativeWindow *win = findWindow(id);
+ if(win==0){ win = findTrayWindow(id); }
+ if(win!=0){
+ for(int i=0; i<props.length() && i<vals.length(); i++){ win->setProperty(props[i], vals[i]); }
+ }
+}
+
+void NativeWindowSystem::RequestPropertyChange(WId id, NativeWindow::Property prop, QVariant val){
+ //This is just a simplified version of the multiple-property function
+ RequestPropertiesChange(id, QList<NativeWindow::Property>() << prop, QList<QVariant>() << val);
+}
+
+void NativeWindowSystem::RequestPropertiesChange(WId win, QList<NativeWindow::Property> props, QList<QVariant> vals){
+ //Find the window object associated with this id
+ bool istraywin = false; //just in case we care later if it is a tray window or a regular window
+ NativeWindow *WIN = findWindow(win);
+ if(WIN==0){ istraywin = true; WIN = findTrayWindow(win); }
+ if(WIN==0){ return; } //invalid window ID - no longer available
+ //Now make any changes as needed
+ ChangeWindowProperties(WIN, props, vals);
+}
+
void NativeWindowSystem::GotPong(WId id){
if(waitingForPong.contains(id)){
waitingForPong.remove(id);
@@ -499,56 +773,40 @@ void NativeWindowSystem::GotPong(WId id){
if(waitingForPong.isEmpty() && pingTimer!=0){ pingTimer->stop(); }
}
-/*void NativeWindowSystem::NewKeyPress(int keycode, WId win){
+void NativeWindowSystem::NewKeyPress(int keycode, WId win){
emit NewInputEvent();
+ if(screenLocked){ return; }
+ Qt::Key key = KeycodeToQt(keycode);
+ if(key!=Qt::Key_unknown){ emit KeyPressDetected(win, key); }
}
void NativeWindowSystem::NewKeyRelease(int keycode, WId win){
emit NewInputEvent();
- //Convert the native button code into a Qt keycode
- //Qt::Key key = keycode; //TODO
- //emit KeyReleaseDetected( key, win);
+ if(screenLocked){ return; }
+ Qt::Key key = KeycodeToQt(keycode);
+ if(key!=Qt::Key_unknown){ emit KeyReleaseDetected(win, key); }
}
void NativeWindowSystem::NewMousePress(int buttoncode, WId win){
emit NewInputEvent();
- //Convert the native button code into a Qt mouse button code
- Qt::MouseButton button;
- switch(buttoncode){
- case 1:
- button = Qt::LeftButton ; break;
- case 2:
- button = Qt::MiddleButton ; break;
- case 3:
- button = Qt::RightButton ; break;
- case 4:
- button = Qt::LeftButton ; break;
- default:
- return; //Unhandled button
- }
- emit MousePressDetected(button, win);
+ if(screenLocked){ return; }
+ emit MousePressDetected(win, MouseToQt(buttoncode));
}
void NativeWindowSystem::NewMouseRelease(int buttoncode, WId win){
emit NewInputEvent();
- //Convert the native button code into a Qt mouse button code
- Qt::MouseButton button;
- switch(buttoncode){
- case 1:
- button = Qt::LeftButton ; break;
- case 2:
- button = Qt::MiddleButton ; break;
- case 3:
- button = Qt::RightButton ; break;
- case 4:
- button = Qt::LeftButton ; break;
- default:
- return; //Unhandled button
- }
- emit MouseReleaseDetected(button, win);
-}*/
+ if(screenLocked){ return; }
+ emit MouseReleaseDetected(win, MouseToQt(buttoncode));
+}
void NativeWindowSystem::CheckDamageID(WId win){
+ for(int i=0; i<NWindows.length(); i++){
+ if(NWindows[i]->damageId() == win || NWindows[i]->id() == win || NWindows[i]->frameId()==win){
+ NWindows[i]->emit VisualChanged();
+ //qDebug() << "Got DAMAGE Event";
+ return;
+ }
+ }
NativeWindow *WIN = findTrayWindow(win);
if(WIN!=0){
UpdateWindowProperties(WIN, QList<NativeWindow::Property>() << NativeWindow::Icon);
@@ -557,15 +815,6 @@ void NativeWindowSystem::CheckDamageID(WId win){
// === PRIVATE SLOTS ===
//These are the slots which are built-in and automatically connected when a new NativeWindow is created
-void NativeWindowSystem::RequestPropertiesChange(WId win, QList<NativeWindow::Property> props, QList<QVariant> vals){
- //Find the window object associated with this id
- bool istraywin = false; //just in case we care later if it is a tray window or a regular window
- NativeWindow *WIN = findWindow(win);
- if(WIN==0){ istraywin = true; WIN = findTrayWindow(win); }
- if(WIN==0){ return; } //invalid window ID - no longer available
- //Now make any changes as needed
-
-}
void NativeWindowSystem::RequestClose(WId win){
//Send the window a WM_DELETE_WINDOW message
@@ -598,3 +847,53 @@ void NativeWindowSystem::RequestPing(WId win){
}
pingTimer->start();
}
+
+void NativeWindowSystem::RequestReparent(WId win, WId container, QPoint relorigin){
+ NativeWindow *WIN = findWindow(win);
+ if(WIN==0){ return; } //could not find corresponding window structure
+//Reparent the window into the container
+ xcb_reparent_window(QX11Info::connection(), win, container, relorigin.x(), relorigin.y());
+ //xcb_map_window(QX11Info::connection(), win);
+
+ //Now send the embed event to the app
+ //qDebug() << " - send _XEMBED event";
+ xcb_client_message_event_t event;
+ event.response_type = XCB_CLIENT_MESSAGE;
+ event.format = 32;
+ event.window = win;
+ event.type = obj->ATOMS["_XEMBED"]; //_XEMBED
+ event.data.data32[0] = XCB_TIME_CURRENT_TIME; //CurrentTime;
+ event.data.data32[1] = 0; //XEMBED_EMBEDDED_NOTIFY
+ event.data.data32[2] = 0;
+ event.data.data32[3] = container; //WID of the container
+ event.data.data32[4] = 0;
+
+ xcb_send_event(QX11Info::connection(), 0, win, XCB_EVENT_MASK_STRUCTURE_NOTIFY | XCB_EVENT_MASK_SUBSTRUCTURE_REDIRECT, (const char *) &event);
+
+ //Now setup any redirects and return
+ //this->SelectInput(win, true); //Notify of structure changes
+ registerClientEvents(win);
+ //xcb_composite_redirect_window(QX11Info::connection(), win, XCB_COMPOSITE_REDIRECT_MANUAL); //XCB_COMPOSITE_REDIRECT_[MANUAL/AUTOMATIC]);
+
+ //Now map the window (will be a transparent child of the container)
+ xcb_map_window(QX11Info::connection(), win);
+ xcb_map_window(QX11Info::connection(), container);
+ //Now create/register the damage handler
+ // -- XCB (Note: The XCB damage registration is completely broken at the moment - 9/15/15, Ken Moore)
+ // -- Retested 6/29/17 (no change) Ken Moore
+ //xcb_damage_damage_t dmgID = xcb_generate_id(QX11Info::connection()); //This is a typedef for a 32-bit unsigned integer
+ //xcb_damage_create(QX11Info::connection(), dmgID, win, XCB_DAMAGE_REPORT_LEVEL_RAW_RECTANGLES);
+ // -- XLib (Note: This is only used because the XCB routine above does not work - needs to be fixed upstream in XCB itself).
+ Damage dmgID = XDamageCreate(QX11Info::display(), win, XDamageReportRawRectangles);
+ WIN->addDamageID( (uint) dmgID); //save this for later
+ //qDebug() << " - Done";
+ //return ( (uint) dmgID );
+}
+/*
+ xcb_reparent_window(QX11Info::connection(), client, parent, relorigin.x(), relorigin.y());
+
+ //Now ensure that we still get event for these windows
+ registerClientEvents(client); //make sure we re-do this after reparenting
+ registerClientEvents(parent);
+ xcb_map_window(QX11Info::connection(), parent);
+}*/
diff --git a/src-qt5/core/libLumina/NativeWindowSystem.h b/src-qt5/core/libLumina/NativeWindowSystem.h
index 59e54ca4..97208c2f 100644
--- a/src-qt5/core/libLumina/NativeWindowSystem.h
+++ b/src-qt5/core/libLumina/NativeWindowSystem.h
@@ -14,6 +14,7 @@
#include "NativeWindow.h"
#include <QDateTime>
#include <QTimer>
+#include <QDebug>
class NativeWindowSystem : public QObject{
Q_OBJECT
@@ -22,21 +23,11 @@ private:
QList<NativeWindow*> TWindows;
//Simplifications to find an already-created window object
- NativeWindow* findWindow(WId id){
- for(int i=0; i<NWindows.length(); i++){
- if(id==NWindows[i]->id()){ return NWindows[i]; }
- }
- return 0;
- }
+ NativeWindow* findWindow(WId id, bool checkRelated = true);
- NativeWindow* findTrayWindow(WId id){
- for(int i=0; i<TWindows.length(); i++){
- if(id==TWindows[i]->id()){ return TWindows[i]; }
- }
- return 0;
- }
+ NativeWindow* findTrayWindow(WId id);
- //Now define a simple private_objects class so that each implementation
+ //Now define a simple private_objects class so that each implementation
// has a storage container for defining/placing private objects as needed
class p_objects;
p_objects* obj;
@@ -58,12 +49,16 @@ private:
}
}
- // Since some properties may be easier to update in bulk
+ // Since some properties may be easier to update in bulk
// let the native system interaction do them in whatever logical groups are best
void UpdateWindowProperties(NativeWindow* win, QList< NativeWindow::Property > props);
+ void ChangeWindowProperties(NativeWindow* win, QList< NativeWindow::Property > props, QList<QVariant> vals);
+
+ //Generic private variables
+ bool screenLocked;
public:
- enum Property{ None, CurrentWorkspace, Workspaces, VirtualRoots, WorkAreas };
+ //enum Property{ None, CurrentWorkspace, Workspaces, VirtualRoots, WorkAreas };
enum MouseButton{NoButton, LeftButton, RightButton, MidButton, BackButton, ForwardButton, TaskButton, WheelUp, WheelDown, WheelLeft, WheelRight};
NativeWindowSystem();
@@ -84,11 +79,25 @@ public:
public slots:
//These are the slots which are typically only used by the desktop system itself or the NativeWindowEventFilter
- //RootWindow interactions
+ //This is called by the lock screen to keep the NWS aware of the current status
+ // it is **NOT** the function to call for the user to actually lock the session (that is in the screensaver/lockscreen class)
+ void ScreenLockChanged(bool lock){
+ screenLocked = lock;
+ }
+
+ //Root Window property registrations
void RegisterVirtualRoot(WId);
+ void setRoot_supportedActions();
+ void setRoot_numberOfWorkspaces(QStringList names);
+ void setRoot_currentWorkspace(int);
+ void setRoot_clientList(QList<WId>, bool stackorder = false);
+ void setRoot_desktopGeometry(QRect);
+ void setRoot_desktopWorkarea(QList<QRect>);
+ void setRoot_activeWindow(WId);
+
+ // - Workspaces
+ int currentWorkspace();
//void GoToWorkspace(int);
- //void RegisterWorkspaces(QStringList); //Names of workspaces, in ascending order
- //void RegisterKnownInteractions();
//NativeWindowEventFilter interactions
@@ -96,29 +105,33 @@ public slots:
void NewTrayWindowDetected(WId); //will automatically create the new NativeWindow object
void WindowCloseDetected(WId); //will update the lists and make changes if needed
void WindowPropertyChanged(WId, NativeWindow::Property); //will rescan the window and update the object as needed
+ void WindowPropertyChanged(WId, NativeWindow::Property, QVariant); //will save that property/value to the right object
+ void WindowPropertiesChanged(WId, QList<NativeWindow::Property>, QList<QVariant>);
+ void RequestPropertyChange(WId, NativeWindow::Property, QVariant);
+ void RequestPropertiesChange(WId, QList<NativeWindow::Property>, QList<QVariant>);
void GotPong(WId);
-/* void NewKeyPress(int keycode, WId win = 0);
+ void NewKeyPress(int keycode, WId win = 0);
void NewKeyRelease(int keycode, WId win = 0);
void NewMousePress(int buttoncode, WId win = 0);
- void NewMouseRelease(int buttoncode, WId win = 0);*/
+ void NewMouseRelease(int buttoncode, WId win = 0);
void CheckDamageID(WId);
private slots:
//These are the slots which are built-in and automatically connected when a new NativeWindow is created
- void RequestPropertiesChange(WId, QList<NativeWindow::Property>, QList<QVariant>);
void RequestClose(WId);
void RequestKill(WId);
void RequestPing(WId);
+ void RequestReparent(WId, WId, QPoint); //client, parent, relative origin point in parent
signals:
void NewWindowAvailable(NativeWindow*);
void NewTrayWindowAvailable(NativeWindow*);
void NewInputEvent(); //a mouse or keypress was detected (lock-state independent);
- void KeyPressDetected(Qt::Key, WId); //only emitted if lockstate = false
- void KeyReleaseDetected(Qt::Key, WId); //only emitted if lockstate = false
- void MousePressDetected(Qt::MouseButton, WId); //only emitted if lockstate = false
- void MouseReleaseDetected(Qt::MouseButton, WId); //only emitted if lockstate = false
+ void KeyPressDetected(WId, Qt::Key); //only emitted if lockstate = false
+ void KeyReleaseDetected(WId, Qt::Key); //only emitted if lockstate = false
+ void MousePressDetected(WId, NativeWindowSystem::MouseButton); //only emitted if lockstate = false
+ void MouseReleaseDetected(WId, NativeWindowSystem::MouseButton); //only emitted if lockstate = false
};
diff --git a/src-qt5/core/libLumina/RootSubWindow.cpp b/src-qt5/core/libLumina/RootSubWindow.cpp
index 41c04ee1..9ef6464e 100644
--- a/src-qt5/core/libLumina/RootSubWindow.cpp
+++ b/src-qt5/core/libLumina/RootSubWindow.cpp
@@ -8,9 +8,12 @@
#include <QDebug>
#include <QApplication>
#include <QVBoxLayout>
-#include <QVBoxLayout>
+#include <QHBoxLayout>
+#include <QTimer>
+
+#define WIN_BORDER 5
-#define WIN_BORDER 3
+#include <LIconCache.h>
// === PUBLIC ===
RootSubWindow::RootSubWindow(QWidget *root, NativeWindow *win) : QFrame(root){
@@ -19,15 +22,18 @@ RootSubWindow::RootSubWindow(QWidget *root, NativeWindow *win) : QFrame(root){
//Create the QWindow and QWidget containers for the window
WIN = win;
closing = false;
- WinWidget = QWidget::createWindowContainer( WIN->window(), this);
initWindowFrame();
- LoadProperties( NativeWindow::allProperties() );
//Hookup the signals/slots
connect(WIN, SIGNAL(PropertiesChanged(QList<NativeWindow::Property>, QList<QVariant>)), this, SLOT(propertiesChanged(QList<NativeWindow::Property>, QList<QVariant>)));
+ WinWidget->embedWindow(WIN);
+ //qDebug() << "[NEW WINDOW]" << WIN->id() << WinWidget->winId() << this->winId();
+ activeState = RootSubWindow::Normal;
+ LoadAllProperties();
}
RootSubWindow::~RootSubWindow(){
-
+ //qDebug() << "Visible Window Destroyed";
+ WIN->deleteLater();
}
WId RootSubWindow::id(){
@@ -41,41 +47,57 @@ RootSubWindow::ModState RootSubWindow::getStateAtPoint(QPoint pt, bool setoffset
//above the frame itself - need to figure out which quadrant it is in (8-directions)
if(pt.y() < WIN_BORDER){
//One of the top options
- if(pt.x() < WIN_BORDER){
+ if(pt.x() < this->width()/5){
if(setoffset){ offset.setX(pt.x()); offset.setY(pt.y()); } //difference from top-left corner
return ResizeTopLeft;
- }else if(pt.x() > (this->width()-WIN_BORDER)){
+ }else if(pt.x() > (this->width()*4.0/5.0)){
if(setoffset){ offset.setX(this->width()-pt.x()); offset.setY(pt.y()); } //difference from top-right corner
return ResizeTopRight;
- }else{
+ }else{
if(setoffset){ offset.setX(0); offset.setY(pt.y()); } //difference from top edge (X does not matter)
- return ResizeTop;
- }
+ return ResizeTop;
+ }
}else if(pt.y() > (this->height()-WIN_BORDER) ){
//One of the bottom options
- if(pt.x() < WIN_BORDER){
+ if(pt.x() < this->width()/5){
if(setoffset){ offset.setX(pt.x()); offset.setY(this->height()-pt.y()); } //difference from bottom-left corner
return ResizeBottomLeft;
- }else if(pt.x() > (this->width()-WIN_BORDER)){
+ }else if(pt.x() > (this->width()*4.0/5.0)){
if(setoffset){ offset.setX(this->width()-pt.x()); offset.setY(this->height()-pt.y()); } //difference from bottom-right corner
return ResizeBottomRight;
- }else{
+ }else{
if(setoffset){ offset.setX(0); offset.setY(this->height() - pt.y()); } //difference from bottom edge (X does not matter)
- return ResizeBottom;
- }
- }else{
- //One of the side options
- if(pt.x() < WIN_BORDER){
+ return ResizeBottom;
+ }
+ }else if(pt.x() < WIN_BORDER){
+ //Left side options
+ if(pt.y() < this->height()/5){
+ if(setoffset){ offset.setX(pt.x()); offset.setY(pt.y()); } //difference from top-left corner
+ return ResizeTopLeft;
+ }else if(pt.y() > (this->height()*4.0/5.0)){
+ if(setoffset){ offset.setX(pt.x()); offset.setY(this->height()-pt.y()); } //difference from bottom-left corner
+ return ResizeBottomLeft;
+ }else{
if(setoffset){ offset.setX(pt.x()); offset.setY(0); } //difference from left edge (Y does not matter)
return ResizeLeft;
- }else if(pt.x() > (this->width()-WIN_BORDER) ){
+ }
+ }else if(pt.x() > (this->width()-WIN_BORDER) ){
+ //Right side options
+ if(pt.y() < this->height()/5){
+ if(setoffset){ offset.setX(this->width()-pt.x()); offset.setY(pt.y()); } //difference from top-right corner
+ return ResizeTopRight;
+ }else if(pt.y() > (this->height()*4.0/5.0)){
+ if(setoffset){ offset.setX(this->width()-pt.x()); offset.setY(this->height()-pt.y()); } //difference from bottom-right corner
+ return ResizeBottomRight;
+ }else{
if(setoffset){ offset.setX(this->width()-pt.x()); offset.setY(0); } //difference from right edge (Y does not matter)
return ResizeRight;
- }else{
- return Normal;
}
+ }else{
+ return Normal;
}
}
+ //if it gets this far just return normal
return Normal;
}
@@ -112,7 +134,7 @@ void RootSubWindow::setMouseCursor(ModState state, bool override){
break;
case ResizeTopLeft:
shape = Qt::SizeFDiagCursor;
- break;
+ break;
}
if(override){
QApplication::setOverrideCursor(QCursor(shape));
@@ -123,31 +145,48 @@ void RootSubWindow::setMouseCursor(ModState state, bool override){
}
void RootSubWindow::initWindowFrame(){
+ //qDebug() << "Create RootSubWindow Frame";
+ this->setContentsMargins(0,0,0,0);
mainLayout = new QVBoxLayout(this);
- titleBar = new QHBoxLayout(this);
+ mainLayout->setContentsMargins(0,0,0,0);
+ titleBar = new QWidget(this);
+ titleBar->setContentsMargins(0,0,0,0);
+ titleBarL = new QHBoxLayout(titleBar);
+ titleBarL->setContentsMargins(0,0,0,0);
closeB = new QToolButton(this);
maxB = new QToolButton(this);
minB = new QToolButton(this);
otherB = new QToolButton(this);
+ anim = new QPropertyAnimation(this);
+ anim->setTargetObject(this);
+ anim->setDuration(200); //1/5 second (appx)
+ connect(anim, SIGNAL(finished()), this, SLOT(animFinished()) );
titleLabel = new QLabel(this);
titleLabel->setSizePolicy(QSizePolicy::Expanding, QSizePolicy::Preferred);
otherM = new QMenu(this); //menu of other actions
otherB->setMenu(otherM);
otherB->setPopupMode(QToolButton::InstantPopup);
otherB->setAutoRaise(true);
+ WinWidget = new NativeEmbedWidget(this);
connect(closeB, SIGNAL(clicked()), this, SLOT(triggerClose()) );
connect(maxB, SIGNAL(clicked()), this, SLOT(toggleMaximize()) );
connect(minB, SIGNAL(clicked()), this, SLOT(toggleMinimize()) );
//Now assemble the frame layout based on the current settings
- this->setLayout(mainLayout);
- titleBar->addWidget(otherB);
- titleBar->addWidget(titleLabel);
- titleBar->addWidget(minB);
- titleBar->addWidget(maxB);
- titleBar->addWidget(closeB);
+ titleBarL->addWidget(otherB);
+ titleBarL->addWidget(titleLabel);
+ titleBarL->addWidget(minB);
+ titleBarL->addWidget(maxB);
+ titleBarL->addWidget(closeB);
WinWidget->setSizePolicy(QSizePolicy::Expanding, QSizePolicy::Expanding);
- mainLayout->addLayout(titleBar);
+ titleBar->setSizePolicy(QSizePolicy::Expanding, QSizePolicy::Preferred);
+ mainLayout->addWidget(titleBar);
mainLayout->addWidget(WinWidget);
+ //Setup the cursors for the buttons
+ closeB->setCursor(Qt::ArrowCursor);
+ minB->setCursor(Qt::ArrowCursor);
+ maxB->setCursor(Qt::ArrowCursor);
+ otherM->setCursor(Qt::ArrowCursor);
+ titleLabel->setCursor(Qt::ArrowCursor);
//Now all the stylesheet options
this->setObjectName("WindowFrame");
closeB->setObjectName("Button_Close");
@@ -155,36 +194,82 @@ void RootSubWindow::initWindowFrame(){
maxB->setObjectName("Button_Maximize");
otherM->setObjectName("Menu_Actions");
titleLabel->setObjectName("Label_Title");
- this->setStyleSheet("QWidget#WindowFrame{background-color: darkblue;} QWidget#Label_Title{background-color: transparent; color: white; }");
+ this->setStyleSheet("QFrame#WindowFrame{background-color: rgba(0,0,0,125)} QWidget#Label_Title{background-color: transparent; color: white; } QToolButton{background-color: transparent; border: 1px solid transparent; border-radius: 3px; } QToolButton::hover{background-color: rgba(255,255,255,150); } QToolButton::pressed{ background-color: white; } QToolButton::menu-arrow{ image: none; }");
//And adjust the margins
- mainLayout->setContentsMargins(WIN_BORDER,WIN_BORDER,WIN_BORDER,WIN_BORDER);
mainLayout->setSpacing(0);
- titleBar->setSpacing(1);
- titleBar->setContentsMargins(0,0,0,0);
+ titleBarL->setSpacing(1);
+ this->setFrameStyle(QFrame::NoFrame);
+ this->setLineWidth(0);
+ this->setMidLineWidth(0);
+ this->setFrameRect(QRect(0,0,0,0));
+
+ //Setup the timer object to syncronize info
+ moveTimer = new QTimer(this);
+ moveTimer->setSingleShot(true);
+ moveTimer->setInterval(100); //1/10 second
+ connect(moveTimer, SIGNAL(timeout()), WinWidget, SLOT(resyncWindow()) );
+
+ //Now load the icons for the button
+ LIconCache::instance()->loadIcon(closeB, "window-close");
+ LIconCache::instance()->loadIcon(maxB, "window-maximize");
+ LIconCache::instance()->loadIcon(minB, "window-minimize");
+ LIconCache::instance()->loadIcon(otherB, "list");
+}
+
+void RootSubWindow::enableFrame(bool on){
+ //Make the individual frame elements visible as needed
+ if(on){ this->setContentsMargins(WIN_BORDER,WIN_BORDER,WIN_BORDER,WIN_BORDER); }//default border
+ else{ this->setContentsMargins(0, 0, 0, 0); }
+ titleBar->setVisible(on);
+ //And now calculate/save the frame extents
+ QList<int> extents; extents << 0 << 0 << 0 << 0; //left, right, top, bottom
+ if(on){
+ extents[0] = WIN_BORDER;
+ extents[1] = WIN_BORDER;
+ extents[2] = WIN_BORDER + titleBar->height();
+ extents[3] = WIN_BORDER;
+ }
+ //qDebug() << "SET FRAME EXTENTS:" << extents;
+ WIN->requestProperty(NativeWindow::FrameExtents, QVariant::fromValue< QList<int> >(extents) ); //save on raw window itself
+ WIN->setProperty(NativeWindow::FrameExtents, QVariant::fromValue< QList<int> >(extents) ); //save to structure now
}
void RootSubWindow::LoadProperties( QList< NativeWindow::Property> list){
QList<QVariant> vals;
+ //Always ensure that visibility changes are evaluated last
+ bool addvisible = false;
for(int i=0; i<list.length(); i++){
+ if(list[i] == NativeWindow::Visible){ list.removeAt(i); i--; addvisible = true; continue; }
vals << WIN->property(list[i]);
}
+ //if(addvisible){ list << NativeWindow::Visible; vals << WIN->property(NativeWindow::Visible); }
propertiesChanged(list, vals);
}
// === PUBLIC SLOTS ===
void RootSubWindow::clientClosed(){
- qDebug() << "Client Closed";
+ //qDebug() << "Client Closed";
closing = true;
- this->close();
+ if(anim->state()!=QAbstractAnimation::Running){ this->close(); }
+}
+
+void RootSubWindow::LoadAllProperties(){
+ QList< NativeWindow::Property> list;
+ list << NativeWindow::WinTypes << NativeWindow::WinActions << NativeWindow::States
+ << NativeWindow::MinSize << NativeWindow::MaxSize << NativeWindow::Title << NativeWindow::ShortTitle
+ << NativeWindow::Icon << NativeWindow::Size << NativeWindow::GlobalPos << NativeWindow::Visible << NativeWindow::Active;
+ LoadProperties(list);
+ WIN->requestProperty(NativeWindow::Visible, true);
}
//Button Actions - public so they can be tied to key shortcuts and stuff as well
void RootSubWindow::toggleMinimize(){
-
+ WIN->setProperty(NativeWindow::Visible, false);
+ QTimer::singleShot(2000, this, SLOT(toggleMaximize()) );
}
void RootSubWindow::toggleMaximize(){
-
+ WIN->setProperty(NativeWindow::Visible, true);
}
void RootSubWindow::triggerClose(){
@@ -219,26 +304,62 @@ void RootSubWindow::startResizing(){
}
-
-
// === PRIVATE SLOTS ===
void RootSubWindow::propertiesChanged(QList<NativeWindow::Property> props, QList<QVariant> vals){
for(int i=0; i<props.length() && i<vals.length(); i++){
- if(vals[i].isNull()){ return; } //not the same as a default/empty value - the property has just not been set yet
- //qDebug() << "Set Window Property:" << props[i] << vals[i];
+ if(vals[i].isNull()){ continue; } //not the same as a default/empty value - the property has just not been set yet
+ //qDebug() << "RootSubWindow: Property Changed:" << props[i] << vals[i];
switch(props[i]){
case NativeWindow::Visible:
- if(vals[i].toBool()){ this->show(); }
- else{ this->hide(); }
+ //qDebug() << "Got Visibility Change:" << vals[i] << this->geometry() << WIN->geometry();
+ if(vals[i].toBool()){
+ if(lastGeom.isNull()){ animResetProp = this->geometry(); }
+ else{ animResetProp = lastGeom; }
+ anim->setPropertyName("geometry");
+ anim->setStartValue( QRect(animResetProp.toRect().center(), QSize(0,0)) );
+ anim->setEndValue(animResetProp);
+ this->setGeometry( anim->startValue().toRect() ); //ensure the window is the initial geom before it becomes visible
+ anim->start();
+ this->show();
+ }else{
+ animResetProp = this->geometry(); //hide event - should already be the right geom
+ lastGeom = this->geometry();
+ anim->setPropertyName("geometry");
+ anim->setStartValue(this->geometry());
+ anim->setEndValue( QRect(this->geometry().center(), QSize(0,0) ) );
+ anim->start();
+ QTimer::singleShot(anim->duration(), this, SLOT(hide()) );
+ }
break;
case NativeWindow::Title:
titleLabel->setText(vals[i].toString());
break;
case NativeWindow::Icon:
- otherB->setIcon(vals[i].value< QIcon>());
+ //qDebug() << "Got Icon Change:" << vals[i];
+ if(vals[i].value<QIcon>().isNull() ){ LIconCache::instance()->loadIcon(otherB, "list"); }
+ else{ otherB->setIcon(vals[i].value<QIcon>()); }
+ break;
+ case NativeWindow::GlobalPos:
+ //qDebug() << "Got Global Pos:" << this->pos() << WinWidget->mapToGlobal(QPoint(0,0)) << WIN->geometry().topLeft() << vals[i].toPoint();
+ if(activeState == RootSubWindow::Normal){
+ this->move( WIN->geometry().topLeft() );
+ }
break;
case NativeWindow::Size:
- WinWidget->resize(vals[i].toSize());
+ //qDebug() << " - SIZE CHANGE";
+ if(WIN->property(NativeWindow::FrameExtents).isNull() && (i<props.indexOf(NativeWindow::FrameExtents)) ){
+ //Frame not loaded yet - push this back until after the frame is set
+ props << props.takeAt(i);
+ vals << vals.takeAt(i);
+ i--;
+ }else if(anim->state() != QPropertyAnimation::Running ){
+ if(vals[i].toSize() != WinWidget->size() && activeState==Normal){
+ //qDebug() << "Got Widget Size Change:" << vals[i].toSize() << WinWidget->size();
+ WinWidget->resize(vals[i].toSize());
+ this->resize( WIN->geometry().size() );
+ //qDebug() << " - Size after change:" << WinWidget->size() << this->size() << WIN->geometry();
+ }
+ }
break;
case NativeWindow::MinSize:
WinWidget->setMinimumSize(vals[i].toSize());
@@ -247,19 +368,44 @@ void RootSubWindow::propertiesChanged(QList<NativeWindow::Property> props, QList
WinWidget->setMaximumSize(vals[i].toSize());
break;
case NativeWindow::Active:
- if(vals[i].toBool()){ WinWidget->setFocus(); }
+ //if(vals[i].toBool()){ WinWidget->setFocus(); }
break;
- /*case NativeWindow::WindowFlags:
- this->setWindowFlags( val.value< Qt::WindowFlags >() );
+ /*case NativeWindow::FrameExtents:
+ qDebug() << " - FRAME CHANGE";
+ if(vals[i].isNull()){
+ vals[i] = QVariant::fromValue<QList<int> >( QList<int>() << WinWidget->geometry().x() << this->width()-WinWidget->geometry().x()-WinWidget->geometry().width() << WinWidget->y() << this->height() - WinWidget->y() - WinWidget->geometry().height() );
+ WIN->setProperty(NativeWindow::FrameExtents, vals[i]);
+ }
+ qDebug() << "Setting Frame Extents:" << vals[i].value<QList<int> >();
+ mainLayout->setContentsMargins( vals[i].value< QList<int> >().at(0),vals[i].value< QList<int> >().at(2) - titleLabel->height(),vals[i].value< QList<int> >().at(1),vals[i].value< QList<int> >().at(3));
break;*/
+ case NativeWindow::WinTypes:
+ enableFrame(vals[i].value< QList<NativeWindow::Type> >().contains(NativeWindow::T_NORMAL) );
+ break;
default:
qDebug() << "Window Property Unused:" << props[i] << vals[i];
}
}
}
+void RootSubWindow::animFinished(){
+ if(closing){ this->close(); return;}
+ else if(anim->propertyName()=="geometry"){
+ if(!animResetProp.isNull()){
+ /*qDebug() << "Animation Finished, Reset Geometry:" << animResetProp;
+ qDebug() << " - Starting Value:" << anim->startValue();
+ qDebug() << " - Ending Value:" << anim->endValue();
+ qDebug() << " - Current Value:" << this->geometry();*/
+ this->setGeometry( animResetProp.toRect() );
+ }
+ }
+ animResetProp = QVariant(); //clear the variable
+}
+
// === PROTECTED ===
void RootSubWindow::mousePressEvent(QMouseEvent *ev){
+ activate();
+ this->raise();
//qDebug() << "Frame Mouse Press Event";
offset.setX(0); offset.setY(0);
if(activeState != Normal){ return; } // do nothing - already in a state of grabbed mouse
@@ -274,11 +420,11 @@ void RootSubWindow::mousePressEvent(QMouseEvent *ev){
activeState = getStateAtPoint(ev->pos(), true); //also have it set the offset variable
}
setMouseCursor(activeState, true); //this one is an override cursor
-
+ QFrame::mousePressEvent(ev);
}
void RootSubWindow::mouseMoveEvent(QMouseEvent *ev){
- ev->accept();
+ activate(); //make sure this window is "Active"
if(activeState == Normal){
setMouseCursor( getStateAtPoint(ev->pos()) ); //just update the mouse cursor
}else{
@@ -352,15 +498,15 @@ void RootSubWindow::mouseMoveEvent(QMouseEvent *ev){
default:
break;
}
-
this->setGeometry(geom);
}
+ QFrame::mouseMoveEvent(ev);
}
void RootSubWindow::mouseReleaseEvent(QMouseEvent *ev){
//Check for a right-click event
//qDebug() << "Frame Mouse Release Event";
- ev->accept();
+ QFrame::mouseReleaseEvent(ev);
if( (activeState==Normal) && (titleBar->geometry().contains(ev->pos())) && (ev->button()==Qt::RightButton) ){
otherM->popup(ev->globalPos());
return;
@@ -368,7 +514,7 @@ void RootSubWindow::mouseReleaseEvent(QMouseEvent *ev){
activeState = Normal;
QApplication::restoreOverrideCursor();
setMouseCursor( getStateAtPoint(ev->pos()) );
- if(QWidget::mouseGrabber() == this){ this->releaseMouse(); }
+ if(QFrame::mouseGrabber() == this){ this->releaseMouse(); }
}
void RootSubWindow::leaveEvent(QEvent *ev){
@@ -377,3 +523,14 @@ void RootSubWindow::leaveEvent(QEvent *ev){
setMouseCursor(Normal);
}
}
+
+void RootSubWindow::moveEvent(QMoveEvent *ev){
+ //qDebug() << "Got Move Event:" << ev->pos() << WinWidget->geometry();
+ QFrame::moveEvent(ev);
+ if(!closing && anim->state()!=QAbstractAnimation::Running){
+ moveTimer->start();
+ //WinWidget->resyncWindow();
+ //WIN->requestProperty(NativeWindow::GlobalPos, ev->pos() );
+ }
+
+}
diff --git a/src-qt5/core/libLumina/RootSubWindow.h b/src-qt5/core/libLumina/RootSubWindow.h
index 779f783b..de6aba89 100644
--- a/src-qt5/core/libLumina/RootSubWindow.h
+++ b/src-qt5/core/libLumina/RootSubWindow.h
@@ -18,8 +18,9 @@
#include <QLabel>
#include <QToolButton>
#include <QMenu>
+#include <QPropertyAnimation>
#include <NativeWindow.h>
-
+#include <NativeEmbedWidget.h>
class RootSubWindow : public QFrame{
Q_OBJECT
@@ -40,19 +41,28 @@ private:
void setMouseCursor(ModState, bool override = false); //Update the mouse cursor based on state
//Native window embed objects
NativeWindow *WIN;
- QWidget *WinWidget;
+ NativeEmbedWidget *WinWidget;
bool closing;
//Title bar objects
- QBoxLayout *titleBar, *mainLayout;
+ QBoxLayout *titleBarL, *mainLayout;
QToolButton *closeB, *maxB, *minB, *otherB;
QLabel *titleLabel;
QMenu *otherM; //menu of other actions
+ QWidget *titleBar;
+ //Other random objects (animations,etc)
+ QPropertyAnimation *anim;
+ QVariant animResetProp;
+ QTimer *moveTimer;
+ QRect lastGeom; //frame coordinates
+
void initWindowFrame();
+ void enableFrame(bool);
void LoadProperties( QList< NativeWindow::Property> list);
public slots:
void clientClosed();
+ void LoadAllProperties();
//Button Actions - public so they can be tied to key shortcuts and stuff as well
void toggleMinimize();
@@ -67,6 +77,7 @@ public slots:
private slots:
void propertiesChanged(QList<NativeWindow::Property>, QList<QVariant>);
+ void animFinished();
protected:
void mousePressEvent(QMouseEvent*);
@@ -74,6 +85,9 @@ protected:
void mouseReleaseEvent(QMouseEvent*);
void leaveEvent(QEvent *ev);
+ void moveEvent(QMoveEvent *ev);
+
+
};
#endif
diff --git a/src-qt5/core/libLumina/RootWindow.cpp b/src-qt5/core/libLumina/RootWindow.cpp
index b1f740d3..31faaf50 100644
--- a/src-qt5/core/libLumina/RootWindow.cpp
+++ b/src-qt5/core/libLumina/RootWindow.cpp
@@ -14,6 +14,7 @@
RootWindow::RootWindow() : QWidget(0, Qt::Window | Qt::BypassWindowManagerHint | Qt::WindowStaysOnBottomHint){
qRegisterMetaType<WId>("WId");
autoResizeTimer = 0;
+ this->setMouseTracking(true);
}
RootWindow::~RootWindow(){
@@ -51,7 +52,7 @@ void RootWindow::updateScreenPixmap(screeninfo *info){
QPixmap raw(info->file); //load the image from file
//Now apply the proper aspect ratio as needed
if(info->scale == RootWindow::Stretch || info->scale == RootWindow::Full || info->scale == RootWindow::Fit){
- Qt::AspectRatioMode armode = Qt::KeepAspectRatio;
+ Qt::AspectRatioMode armode = Qt::KeepAspectRatio;
if(info->scale == RootWindow::Stretch ){ armode = Qt::IgnoreAspectRatio; }
else if(info->scale == RootWindow::Full ){ armode = Qt::KeepAspectRatioByExpanding; }
if(raw.height()!=info->area.height() && raw.width() !=info->area.width()){
@@ -60,16 +61,16 @@ void RootWindow::updateScreenPixmap(screeninfo *info){
}
//Now calculate offset and draw width/height
QRect drawRect(0,0, raw.width(), raw.height());
- if(info->scale == RootWindow::Full ){
+ if(info->scale == RootWindow::Full ){
drawRect.moveTo( (info->area.width() - raw.width())/2, (info->area.height() - raw.height())/2 );
}else if(info->scale == RootWindow::Fit ){
- drawRect.moveTo( (info->area.width() - raw.width())/2, (info->area.height() - raw.height())/2 );
+ drawRect.moveTo( (info->area.width() - raw.width())/2, (info->area.height() - raw.height())/2 );
}else if(info->scale == RootWindow::Center ){
- drawRect.moveTo( (info->area.width() - raw.width())/2, (info->area.height() - raw.height())/2 );
+ drawRect.moveTo( (info->area.width() - raw.width())/2, (info->area.height() - raw.height())/2 );
}else if(info->scale == RootWindow::Tile ){
//Draw the entire area - no offset
drawRect.setHeight(info->area.height());
- drawRect.setWidth(info->area.width());
+ drawRect.setWidth(info->area.width());
}else if(info->scale == RootWindow::BottomLeft ){
drawRect.moveTo( 0 , info->area.height() - raw.height() );
}else if(info->scale == RootWindow::BottomRight ){
@@ -130,7 +131,7 @@ void RootWindow::ResizeRoot(){
//Trigger a repaint and send out any signals
this->setGeometry(fullscreen);
this->update();
- emit RootResized();
+ emit RootResized(fullscreen);
if(!valid.isEmpty()){ emit NewScreens(valid); }
if(!invalid.isEmpty()){ emit RemovedScreens(invalid); }
}
@@ -138,7 +139,7 @@ void RootWindow::ResizeRoot(){
void RootWindow::ChangeWallpaper(QString id, RootWindow::ScaleType scale, QString file){
bool found = false;
for(int i=0; i<WALLPAPERS.length() && !found; i++){
- if(WALLPAPERS[i].id == id){
+ if(WALLPAPERS[i].id == id){
WALLPAPERS[i].scale = scale;
WALLPAPERS[i].file = file;
updateScreenPixmap(&WALLPAPERS[i]);
@@ -168,20 +169,23 @@ void RootWindow::ChangeWallpaper(QString id, RootWindow::ScaleType scale, QStrin
void RootWindow::NewWindow(NativeWindow *win){
RootSubWindow *subwin = 0;
+ qDebug() << "Got New Window:" << win->property(NativeWindow::Title);
for(int i=0; i<WINDOWS.length() && subwin==0; i++){
- if(WINDOWS[i]->id() == win->id()){ subwin = WINDOWS[i]; }
+ if(WINDOWS[i]->id() == win->id()){ subwin = WINDOWS[i]; }
}
if(subwin==0){
subwin = new RootSubWindow(this, win);
connect(win, SIGNAL(WindowClosed(WId)), this, SLOT(CloseWindow(WId)) );
WINDOWS << subwin;
}
- //subwin->show();
+ //win->setProperty(NativeWindow::Visible, true);
+ //win->requestProperty( NativeWindow::Active, true);
+ win->requestProperties(QList<NativeWindow::Property>() << NativeWindow::Visible << NativeWindow::Active, QList<QVariant>() << true << true);
}
void RootWindow::CloseWindow(WId win){
for(int i=0; i<WINDOWS.length(); i++){
- if(WINDOWS[i]->id() == win){ WINDOWS.takeAt(i)->clientClosed(); break; }
+ if(WINDOWS[i]->id() == win){ qDebug() << "Remove Window From Root List"; WINDOWS.takeAt(i)->clientClosed(); break; }
}
}
diff --git a/src-qt5/core/libLumina/RootWindow.h b/src-qt5/core/libLumina/RootWindow.h
index 0ae248b5..a7792752 100644
--- a/src-qt5/core/libLumina/RootWindow.h
+++ b/src-qt5/core/libLumina/RootWindow.h
@@ -31,7 +31,7 @@ public:
RootWindow();
~RootWindow();
-
+
void start();
private:
@@ -49,7 +49,7 @@ private:
//Window Management
QList<RootSubWindow*> WINDOWS;
-
+
public slots:
void ResizeRoot();
void ChangeWallpaper(QString id, RootWindow::ScaleType scale, QString file);
@@ -65,7 +65,7 @@ protected:
signals:
void RegisterVirtualRoot(WId);
- void RootResized();
+ void RootResized(QRect);
void NewScreens(QStringList); // [screen_id_1, screen_id_2, etc..]
void RemovedScreens(QStringList); // [screen_id_1, screen_id_2, etc..]
diff --git a/src-qt5/core/libLumina/RootWindow.pri b/src-qt5/core/libLumina/RootWindow.pri
index 35e0e770..e4d5f00b 100644
--- a/src-qt5/core/libLumina/RootWindow.pri
+++ b/src-qt5/core/libLumina/RootWindow.pri
@@ -10,4 +10,5 @@ INCLUDEPATH *= ${PWD}
# include other library dependencies
include(LUtils.pri)
-include(NativeWindow.pri);
+include(NativeWindow.pri)
+include(LIconCache.pri)
diff --git a/src-qt5/core/lumina-desktop-unified/LSession.cpp b/src-qt5/core/lumina-desktop-unified/LSession.cpp
index e511d7ad..0b9a9b35 100644
--- a/src-qt5/core/lumina-desktop-unified/LSession.cpp
+++ b/src-qt5/core/lumina-desktop-unified/LSession.cpp
@@ -11,13 +11,14 @@
#include "BootSplash.h"
#ifndef DEBUG
-#define DEBUG 1
+#define DEBUG 0
#endif
//Initialize all the global objects to null pointers
-EventFilter* Lumina::EFILTER = 0;
+NativeWindowSystem* Lumina::NWS = 0;
+NativeEventFilter* Lumina::NEF = 0;
LScreenSaver* Lumina::SS = 0;
-DesktopSettings* Lumina::SETTINGS = 0;
+//DesktopSettings* Lumina::SETTINGS = 0;
//Lumina::WM = 0;
QThread* Lumina::EVThread = 0;
RootWindow* Lumina::ROOTWIN = 0;
@@ -26,6 +27,10 @@ LShortcutEvents* Lumina::SHORTCUTS = 0;
LSession::LSession(int &argc, char ** argv) : LSingleApplication(argc, argv, "lumina-desktop-unified"){
//Initialize the global objects to null pointers
+ qRegisterMetaType< Qt::Key >("Qt::Key");
+ qRegisterMetaType< NativeWindow::Property >("NativeWindow::Property");
+ qRegisterMetaType< QList< NativeWindow::Property > >("QList<NativeWindow::Property>");
+
mediaObj = 0; //private object used for playing login/logout chimes
if(this->isPrimaryProcess()){
//Setup the global registrations
@@ -38,42 +43,37 @@ LSession::LSession(int &argc, char ** argv) : LSingleApplication(argc, argv, "lu
this->setEffectEnabled( Qt::UI_AnimateMenu, true);
this->setEffectEnabled( Qt::UI_AnimateCombo, true);
this->setEffectEnabled( Qt::UI_AnimateTooltip, true);
- //this->setAttribute(Qt::AA_UseDesktopOpenGL);
+ this->setAttribute(Qt::AA_UseDesktopOpenGL);
this->setAttribute(Qt::AA_UseHighDpiPixmaps); //allow pixmaps to be scaled up as well as down
//Now initialize the global objects (but do not start them yet)
- Lumina::EFILTER = new EventFilter(); //Need the XCB Event filter first
- Lumina::SETTINGS = new DesktopSettings();
+ Lumina::NEF = new NativeEventFilter();
+ Lumina::NWS = new NativeWindowSystem();
+ //Lumina::SETTINGS = new DesktopSettings();
Lumina::SS = new LScreenSaver();
- //Lumina::WM = new LWindowManager();
- //Now put the Event Filter into it's own thread to keep things snappy
+ //Now put the Native Window System into it's own thread to keep things snappy
Lumina::EVThread = new QThread();
- Lumina::EFILTER->moveToThread(Lumina::EVThread);
+ Lumina::NWS->moveToThread(Lumina::EVThread);
Lumina::EVThread->start();
Lumina::ROOTWIN = new RootWindow();
Lumina::APPLIST = new XDGDesktopList(0, true); //keep this list up to date
Lumina::SHORTCUTS = new LShortcutEvents(); //this can be moved to it's own thread eventually as well
- //Setup the basic connections between the shortcuts class and the session itself
- connect(Lumina::SHORTCUTS, SIGNAL(StartLogout()), this, SLOT(StartLogout()) );
- connect(Lumina::SHORTCUTS, SIGNAL(StartReboot()), this, SLOT(StartReboot()) );
- connect(Lumina::SHORTCUTS, SIGNAL(StartShutdown()), this, SLOT(StartShutdown()) );
- //Setup the various connections between the global classes
- // NOTE: Most of these connections will only become "active" as the global objects get started during the setupSession routine
- connect(Lumina::ROOTWIN, SIGNAL(RegisterVirtualRoot(WId)), Lumina::EFILTER, SLOT(RegisterVirtualRoot(WId)) );
- connect(Lumina::EFILTER, SIGNAL(WindowCreated(NativeWindow*)), Lumina::ROOTWIN, SLOT(NewWindow(NativeWindow*)) );
- } //end check for primary process
+ setupGlobalConnections();
+ } //end check for primary process
}
LSession::~LSession(){
//Clean up the global objects as needed
- if(Lumina::EFILTER!=0){ Lumina::EFILTER->deleteLater(); }
+ if(Lumina::NEF!=0){ Lumina::NEF->deleteLater(); }
+ if(Lumina::NWS!=0){ Lumina::NWS->deleteLater(); }
+ //if(Lumina::EFILTER!=0){ Lumina::EFILTER->deleteLater(); }
if(Lumina::SS!=0){ Lumina::SS->deleteLater(); }
if(Lumina::EVThread!=0){
if(Lumina::EVThread->isRunning()){ Lumina::EVThread->quit(); }
Lumina::EVThread->deleteLater();
}
- if(Lumina::SETTINGS!=0){ Lumina::SETTINGS->deleteLater(); }
+ if(DesktopSettings::instance()!=0){ DesktopSettings::instance()->deleteLater(); }
if(Lumina::ROOTWIN!=0){ Lumina::ROOTWIN->deleteLater(); }
if(Lumina::APPLIST!=0){ Lumina::APPLIST->deleteLater(); }
}
@@ -92,49 +92,40 @@ void LSession::setupSession(){
//Setup the QSettings default paths
splash.showScreen("settings");
if(DEBUG){ qDebug() << " - Init QSettings:" << timer->elapsed();}
- Lumina::SETTINGS->start();
- /*sessionsettings = new QSettings("lumina-desktop", "sessionsettings");
- DPlugSettings = new QSettings("lumina-desktop","pluginsettings/desktopsettings");
- //Load the proper translation files
- if(sessionsettings->value("ForceInitialLocale",false).toBool()){
- //Some system locale override it in place - change the env first
- LUtils::setLocaleEnv( sessionsettings->value("InitLocale/LANG","").toString(), \
- sessionsettings->value("InitLocale/LC_MESSAGES","").toString(), \
- sessionsettings->value("InitLocale/LC_TIME","").toString(), \
- sessionsettings->value("InitLocale/LC_NUMERIC","").toString(), \
- sessionsettings->value("InitLocale/LC_MONETARY","").toString(), \
- sessionsettings->value("InitLocale/LC_COLLATE","").toString(), \
- sessionsettings->value("InitLocale/LC_CTYPE","").toString() );
- }*/
- if(DEBUG){ qDebug() << " - Load Localization Files:" << timer->elapsed();}
- currTranslator = LUtils::LoadTranslation(this, "lumina-desktop");
+ DesktopSettings::instance(); //don't do anything other than init/start the static object here
+ if(DEBUG){ qDebug() << " - Load Localization Files:" << timer->elapsed();}
+ currTranslator = LUtils::LoadTranslation(this, "lumina-desktop");
if(DEBUG){ qDebug() << " - Start Event Filter:" << timer->elapsed(); }
- Lumina::EFILTER->start();
+ Lumina::NEF->start();
+ if( !Lumina::NWS->start() ){
+ qWarning() << "Could not start the Lumina desktop. Is another desktop or window manager running?";
+ this->exit(1);
+ return;
+ }
//use the system settings
//Setup the user's lumina settings directory as necessary
splash.showScreen("user");
- if(DEBUG){ qDebug() << " - Init User Files:" << timer->elapsed();}
+ if(DEBUG){ qDebug() << " - Init User Files:" << timer->elapsed();}
//checkUserFiles(); //adds these files to the watcher as well
//Initialize the internal variables
//DESKTOPS.clear();
-
+
//Start the background system tray
splash.showScreen("systray");
-
//Initialize the global menus
qDebug() << " - Initialize system menus";
splash.showScreen("apps");
if(DEBUG){ qDebug() << " - Populate App List:" << timer->elapsed();}
Lumina::APPLIST->updateList();
//appmenu = new AppMenu();
-
+
splash.showScreen("menus");
//if(DEBUG){ qDebug() << " - Init SettingsMenu:" << timer->elapsed();}
//settingsmenu = new SettingsMenu();
//if(DEBUG){ qDebug() << " - Init SystemWindow:" << timer->elapsed();}
//sysWindow = new SystemWindow();
-
+
//Initialize the desktops
splash.showScreen("desktop");
if(DEBUG){ qDebug() << " - Init Desktops:" << timer->elapsed(); }
@@ -144,6 +135,9 @@ void LSession::setupSession(){
Lumina::ROOTWIN->ChangeWallpaper(scrns[i]->name(), RootWindow::Stretch, LOS::LuminaShare()+"desktop-background.jpg");
}
Lumina::ROOTWIN->start();
+ Lumina::NWS->setRoot_numberOfWorkspaces(QStringList() << "one" << "two");
+ Lumina::NWS->setRoot_currentWorkspace(0);
+
DesktopContextMenu *cmenu = new DesktopContextMenu(Lumina::ROOTWIN);
connect(cmenu, SIGNAL(showLeaveDialog()), this, SLOT(StartLogout()) );
cmenu->start();
@@ -180,7 +174,7 @@ void LSession::setupSession(){
QTimer::singleShot(500, this, SLOT(launchStartupApps()) );
splash.hide();
LSession::processEvents();
- splash.close();
+ splash.close();
LSession::processEvents();
//DEBUG: Wait a bit then close down the session
//QTimer::singleShot(15000, this, SLOT(StartLogout()) );
@@ -197,11 +191,11 @@ void LSession::CleanupSession(){
//Create a temporary flag to prevent crash dialogs from opening during cleanup
LUtils::writeFile("/tmp/.luminastopping",QStringList() << "yes", true);
//Start the logout chimes (if necessary)
- LOS::setAudioVolume( LOS::audioVolume() ); //make sure the audio volume is saved in the backend for the next login
- bool playaudio = Lumina::SETTINGS->value(DesktopSettings::Session,"PlayLogoutAudio",true).toBool();
+ //LOS::setAudioVolume( LOS::audioVolume() ); //make sure the audio volume is saved in the backend for the next login
+ bool playaudio = DesktopSettings::instance()->value(DesktopSettings::Session,"PlayLogoutAudio",true).toBool();
if( playaudio ){ playAudioFile(LOS::LuminaShare()+"Logout.ogg"); }
//Now perform any other cleanup
- Lumina::EFILTER->stop();
+ //Lumina::NEF->stop();
//Now wait a moment for things to close down before quitting
if(playaudio){
//wait a max of 5 seconds for audio to finish
@@ -219,10 +213,68 @@ void LSession::CleanupSession(){
if(QFile::exists("/tmp/.luminastopping")){ QFile::remove("/tmp/.luminastopping"); }
}
+//=================
+
+void LSession::setupGlobalConnections(){
+ //Setup the various connections between the global classes
+ // NOTE: Most of these connections will only become "active" as the global objects get started during the setupSession routine
+
+ //Setup the basic connections between the shortcuts class and the session itself
+ connect(Lumina::SHORTCUTS, SIGNAL(StartLogout()), this, SLOT(StartLogout()) );
+ connect(Lumina::SHORTCUTS, SIGNAL(StartReboot()), this, SLOT(StartReboot()) );
+ connect(Lumina::SHORTCUTS, SIGNAL(StartShutdown()), this, SLOT(StartShutdown()) );
+ connect(Lumina::SHORTCUTS, SIGNAL(LaunchApplication(QString)), this, SLOT(LaunchApplication(QString)) );
+ connect(Lumina::SHORTCUTS, SIGNAL(LaunchStandardApplication(QString)), this, SLOT(LaunchStandardApplication(QString)) );
+ connect(Lumina::SHORTCUTS, SIGNAL(LockSession()), Lumina::SS, SLOT(LockScreenNow()) );
+
+ //Root window connections
+ connect(Lumina::ROOTWIN, SIGNAL(RegisterVirtualRoot(WId)), Lumina::NWS, SLOT(RegisterVirtualRoot(WId)) );
+ connect(Lumina::ROOTWIN, SIGNAL(RootResized(QRect)), Lumina::NWS, SLOT(setRoot_desktopGeometry(QRect)) );
+
+ //Native Window Class connections
+ connect(Lumina::NEF, SIGNAL(WindowCreated(WId)), Lumina::NWS, SLOT(NewWindowDetected(WId)));
+ connect(Lumina::NEF, SIGNAL(WindowDestroyed(WId)), Lumina::NWS, SLOT(WindowCloseDetected(WId)));
+ connect(Lumina::NEF, SIGNAL(WindowPropertyChanged(WId, NativeWindow::Property)), Lumina::NWS, SLOT(WindowPropertyChanged(WId, NativeWindow::Property)));
+ connect(Lumina::NEF, SIGNAL(WindowPropertyChanged(WId, NativeWindow::Property, QVariant)), Lumina::NWS, SLOT(WindowPropertyChanged(WId, NativeWindow::Property, QVariant)));
+ connect(Lumina::NEF, SIGNAL(WindowPropertiesChanged(WId, QList<NativeWindow::Property>, QList<QVariant>)), Lumina::NWS, SLOT(WindowPropertiesChanged(WId, QList<NativeWindow::Property>, QList<QVariant>)) );
+ connect(Lumina::NEF, SIGNAL(RequestWindowPropertyChange(WId, NativeWindow::Property, QVariant)), Lumina::NWS, SLOT(RequestPropertyChange(WId, NativeWindow::Property, QVariant)));
+ connect(Lumina::NEF, SIGNAL(RequestWindowPropertiesChange(WId, QList<NativeWindow::Property>, QList<QVariant>)), Lumina::NWS, SLOT(RequestPropertiesChange(WId, QList<NativeWindow::Property>, QList<QVariant>)));
+ connect(Lumina::NEF, SIGNAL(TrayWindowCreated(WId)), Lumina::NWS, SLOT(NewTrayWindowDetected(WId)));
+ connect(Lumina::NEF, SIGNAL(TrayWindowDestroyed(WId)), Lumina::NWS, SLOT(WindowCloseDetected(WId)));
+ connect(Lumina::NEF, SIGNAL(PossibleDamageEvent(WId)), Lumina::NWS, SLOT(CheckDamageID(WId)));
+ connect(Lumina::NEF, SIGNAL(KeyPressed(int, WId)), Lumina::NWS, SLOT(NewKeyPress(int, WId)));
+ connect(Lumina::NEF, SIGNAL(KeyReleased(int, WId)), Lumina::NWS, SLOT(NewKeyRelease(int, WId)));
+ connect(Lumina::NEF, SIGNAL(MousePressed(int, WId)), Lumina::NWS, SLOT(NewMousePress(int, WId)));
+ connect(Lumina::NEF, SIGNAL(MouseReleased(int, WId)), Lumina::NWS, SLOT(NewMouseRelease(int, WId)));
+ //connect(Lumina::NEF, SIGNAL(MouseMovement(WId)), Lumina::NWS, SLOT());
+ //connect(Lumina::NEF, SIGNAL(MouseEnterWindow(WId)), Lumina::NWS, SLOT());
+ //connect(Lumina::NEF, SIGNAL(MouseLeaveWindow(WId)), Lumina::NWS, SLOT());
+
+ //Input Events for ScreenSaver
+ connect(Lumina::NEF, SIGNAL(KeyPressed(int, WId)), Lumina::SS, SLOT(newInputEvent()));
+ connect(Lumina::NEF, SIGNAL(KeyReleased(int, WId)), Lumina::SS, SLOT(newInputEvent()));
+ connect(Lumina::NEF, SIGNAL(MousePressed(int, WId)), Lumina::SS, SLOT(newInputEvent()));
+ connect(Lumina::NEF, SIGNAL(MouseReleased(int, WId)), Lumina::SS, SLOT(newInputEvent()));
+ connect(Lumina::NEF, SIGNAL(MouseMovement()), Lumina::SS, SLOT(newInputEvent()));
+
+ connect(Lumina::SS, SIGNAL(LockStatusChanged(bool)), Lumina::NWS, SLOT(ScreenLockChanged(bool)) );
+
+ //Mouse/Keyboard Shortcut Events (Make sure to connect to the NWS - the raw events need to be ignored sometimes)
+ connect(Lumina::NWS, SIGNAL(KeyPressDetected(WId, Qt::Key)), Lumina::SHORTCUTS, SLOT(KeyPress(WId, Qt::Key)) );
+ connect(Lumina::NWS, SIGNAL(KeyReleaseDetected(WId, Qt::Key)), Lumina::SHORTCUTS, SLOT(KeyRelease(WId, Qt::Key)) );
+ connect(Lumina::NWS, SIGNAL(MousePressDetected(WId, NativeWindowSystem::MouseButton)), Lumina::SHORTCUTS, SLOT(MousePress(WId, NativeWindowSystem::MouseButton)) );
+ connect(Lumina::NWS, SIGNAL(MouseReleaseDetected(WId, NativeWindowSystem::MouseButton)), Lumina::SHORTCUTS, SLOT(MouseRelease(WId, NativeWindowSystem::MouseButton)) );
+
+ //NWS Events to the window system
+ connect(Lumina::NWS, SIGNAL(NewWindowAvailable(NativeWindow*)), Lumina::ROOTWIN, SLOT(NewWindow(NativeWindow*)) );
+}
+
+//=================
+
int LSession::VersionStringToNumber(QString version){
version = version.section("-",0,0); //trim any extra labels off the end
int maj, mid, min; //major/middle/minor version numbers (<Major>.<Middle>.<Minor>)
- maj = mid = min = 0;
+ maj = mid = min = 0;
bool ok = true;
maj = version.section(".",0,0).toInt(&ok);
if(ok){ mid = version.section(".",1,1).toInt(&ok); }else{ maj = 0; }
@@ -233,6 +285,8 @@ int LSession::VersionStringToNumber(QString version){
return (maj*1000000 + mid*1000 + min);
}
+//=================
+
//Play System Audio
void LSession::playAudioFile(QString filepath){
if( !QFile::exists(filepath) ){ return; }
@@ -257,10 +311,10 @@ void LSession::NewCommunication(QStringList list){
for(int i=0; i<list.length(); i++){
if(list[i]=="--logout"){
QTimer::singleShot(0, this, SLOT(StartLogout()) );
- }else if(list[i]=="--lock-session"){
+ }else if(list[i]=="--lock-session"){
Lumina::SS->LockScreenNow();
}
- }
+ }
}
void LSession::launchStartupApps(){
@@ -269,44 +323,44 @@ void LSession::launchStartupApps(){
//Enable Numlock
if(LUtils::isValidBinary("numlockx")){ //make sure numlockx is installed
- if(Lumina::SETTINGS->value(DesktopSettings::System,"EnableNumlock",false).toBool()){
+ if(DesktopSettings::instance()->value(DesktopSettings::System,"EnableNumlock",false).toBool()){
QProcess::startDetached("numlockx on");
}else{
QProcess::startDetached("numlockx off");
}
}
- int tmp = LOS::ScreenBrightness();
- if(tmp>0){
+ /*int tmp = LOS::ScreenBrightness();
+ if(tmp>0){
LOS::setScreenBrightness( tmp );
qDebug() << " - - Screen Brightness:" << QString::number(tmp)+"%";
}
//ExternalProcess::launch("nice lumina-open -autostart-apps");
-
+
//Re-load the screen brightness and volume settings from the previous session
// Wait until after the XDG-autostart functions, since the audio system might be started that way
qDebug() << " - Loading previous settings";
tmp = LOS::audioVolume();
LOS::setAudioVolume(tmp);
qDebug() << " - - Audio Volume:" << QString::number(tmp)+"%";
-
+ */
//Now play the login music since we are finished
- if(Lumina::SETTINGS->value(DesktopSettings::System,"PlayStartupAudio",true).toBool()){
+ if(DesktopSettings::instance()->value(DesktopSettings::System,"PlayStartupAudio",true).toBool()){
//Make sure to re-set the system volume to the last-used value at outset
- int vol = LOS::audioVolume();
- if(vol>=0){ LOS::setAudioVolume(vol); }
+ /*int vol = LOS::audioVolume();
+ if(vol>=0){ LOS::setAudioVolume(vol); }*/
LSession::playAudioFile(LOS::LuminaShare()+"Login.ogg");
}
qDebug() << " - Finished with startup routines";
}
void LSession::checkUserFiles(){
- //internal version conversion examples:
+ //internal version conversion examples:
// [1.0.0 -> 1000000], [1.2.3 -> 1002003], [0.6.1 -> 6001]
- QString OVS = Lumina::SETTINGS->value(DesktopSettings::System,"DesktopVersion","0").toString(); //Old Version String
+ QString OVS = DesktopSettings::instance()->value(DesktopSettings::System,"DesktopVersion","0").toString(); //Old Version String
bool changed = LDesktopUtils::checkUserFiles(OVS);
if(changed){
//Save the current version of the session to the settings file (for next time)
- Lumina::SETTINGS->setValue(DesktopSettings::System,"DesktopVersion", this->applicationVersion());
+ DesktopSettings::instance()->setValue(DesktopSettings::System,"DesktopVersion", this->applicationVersion());
}
}
@@ -322,26 +376,34 @@ void LSession::StartLogout(){
void LSession::StartShutdown(bool skipupdates){
CleanupSession();
LOS::systemShutdown(skipupdates);
- QCoreApplication::exit(0);
+ QCoreApplication::exit(0);
}
void LSession::StartReboot(bool skipupdates){
CleanupSession();
LOS::systemRestart(skipupdates);
- QCoreApplication::exit(0);
+ QCoreApplication::exit(0);
+}
+
+void LSession::LaunchApplication(QString app){
+
+}
+
+void LSession::LaunchStandardApplication(QString app){
+
}
void LSession::reloadIconTheme(){
//Wait a moment for things to settle before sending out the signal to the interfaces
QApplication::processEvents();
QApplication::processEvents();
- emit IconThemeChanged();
+ emit IconThemeChanged();
}
//Temporarily change the session locale (nothing saved between sessions)
void LSession::switchLocale(QString localeCode){
- currTranslator = LUtils::LoadTranslation(this, "lumina-desktop", localeCode, currTranslator);
- if(currTranslator!=0 || localeCode=="en_US"){
+ currTranslator = LUtils::LoadTranslation(this, "lumina-desktop", localeCode, currTranslator);
+ if(currTranslator!=0 || localeCode=="en_US"){
LUtils::setLocaleEnv(localeCode); //will set everything to this locale (no custom settings)
}
emit LocaleChanged();
diff --git a/src-qt5/core/lumina-desktop-unified/LSession.h b/src-qt5/core/lumina-desktop-unified/LSession.h
index c791c66b..0d666bfa 100644
--- a/src-qt5/core/lumina-desktop-unified/LSession.h
+++ b/src-qt5/core/lumina-desktop-unified/LSession.h
@@ -17,7 +17,8 @@ public:
private:
void CleanupSession();
-
+ void setupGlobalConnections();
+
int VersionStringToNumber(QString version);
QMediaPlayer *mediaObj;
void playAudioFile(QString filepath);
@@ -27,9 +28,12 @@ private:
public slots:
void setupSession(); //called during startup only
+ //Slots for public access/usage
void StartLogout();
void StartShutdown(bool skipupdates = false);
void StartReboot(bool skipupdates = false);
+ void LaunchApplication(QString app);
+ void LaunchStandardApplication(QString app);
void reloadIconTheme(); //will emit the IconThemeChanged signal when ready
void switchLocale(QString localeCode); //will emit the LocaleChanged signal when ready
@@ -45,7 +49,7 @@ signals:
//General Signals
void LocaleChanged();
void IconThemeChanged();
-
+
};
#endif
diff --git a/src-qt5/core/lumina-desktop-unified/defaults/desktop/desktop.conf b/src-qt5/core/lumina-desktop-unified/defaults/desktop/desktop.conf
new file mode 100644
index 00000000..e69de29b
--- /dev/null
+++ b/src-qt5/core/lumina-desktop-unified/defaults/desktop/desktop.conf
diff --git a/src-qt5/core/lumina-desktop-unified/defaults/desktop/environment.conf b/src-qt5/core/lumina-desktop-unified/defaults/desktop/environment.conf
new file mode 100644
index 00000000..e69de29b
--- /dev/null
+++ b/src-qt5/core/lumina-desktop-unified/defaults/desktop/environment.conf
diff --git a/src-qt5/core/lumina-desktop-unified/defaults/desktop/favorites.conf b/src-qt5/core/lumina-desktop-unified/defaults/desktop/favorites.conf
new file mode 100644
index 00000000..e69de29b
--- /dev/null
+++ b/src-qt5/core/lumina-desktop-unified/defaults/desktop/favorites.conf
diff --git a/src-qt5/core/lumina-desktop-unified/defaults/desktop/keys.conf b/src-qt5/core/lumina-desktop-unified/defaults/desktop/keys.conf
new file mode 100644
index 00000000..c1417b85
--- /dev/null
+++ b/src-qt5/core/lumina-desktop-unified/defaults/desktop/keys.conf
@@ -0,0 +1,8 @@
+[strict]
+Ctrl+Alt+Backspace=Logout
+Pause=Lockscreen
+Alt+L=Lockscreen
+
+[desktop]
+Alt+F1=Launch: terminal
+Print=Launch: screenshot
diff --git a/src-qt5/core/lumina-desktop-unified/defaults/desktop/session.conf b/src-qt5/core/lumina-desktop-unified/defaults/desktop/session.conf
new file mode 100644
index 00000000..e69de29b
--- /dev/null
+++ b/src-qt5/core/lumina-desktop-unified/defaults/desktop/session.conf
diff --git a/src-qt5/core/lumina-desktop-unified/defaults/desktop/theme.conf b/src-qt5/core/lumina-desktop-unified/defaults/desktop/theme.conf
new file mode 100644
index 00000000..e69de29b
--- /dev/null
+++ b/src-qt5/core/lumina-desktop-unified/defaults/desktop/theme.conf
diff --git a/src-qt5/core/lumina-desktop-unified/global-includes.h b/src-qt5/core/lumina-desktop-unified/global-includes.h
index 867076db..1d0ab068 100644
--- a/src-qt5/core/lumina-desktop-unified/global-includes.h
+++ b/src-qt5/core/lumina-desktop-unified/global-includes.h
@@ -33,6 +33,7 @@
#include <QPropertyAnimation>
#include <QAnimationGroup>
#include <QParallelAnimationGroup>
+#include <QSequentialAnimationGroup>
#include <QWindow>
#include <QWidget>
#include <QWidgetAction>
@@ -59,15 +60,13 @@
#include <RootWindow.h>
#include <ExternalProcess.h>
#include <NativeWindow.h>
+#include <NativeWindowSystem.h>
+#include <NativeEventFilter.h>
// Standard C includes
#include <unistd.h>
//Setup any global defines (no classes or global objects: use "global-objects.h" for that)
-namespace Lumina{
- //Flags/enumerations
- enum WindowAction{MoveResize, Show, Hide, TryClose, Closed, WA_NONE};
- enum MouseButton{NoButton, LeftButton, RightButton, MidButton, BackButton, ForwardButton, TaskButton, WheelUp, WheelDown, WheelLeft, WheelRight};
-};
+
#endif
diff --git a/src-qt5/core/lumina-desktop-unified/global-objects.h b/src-qt5/core/lumina-desktop-unified/global-objects.h
index 2f298e27..474412eb 100644
--- a/src-qt5/core/lumina-desktop-unified/global-objects.h
+++ b/src-qt5/core/lumina-desktop-unified/global-objects.h
@@ -19,7 +19,7 @@
//Load the appropriate "EventFilter" class for the graphics subsystem
//#ifndef USE_WAYLAND
-#include "src-events/LXcbEventFilter.h"
+//#include "src-events/LXcbEventFilter.h"
//#endif
#include "src-events/LShortcutEvents.h"
@@ -30,11 +30,15 @@
#define ANIMTIME 80 //animation time in milliseconds
//Global flags/structures
-namespace Lumina{
+namespace Lumina{
//Data structures and objects
- extern EventFilter *EFILTER; //Native Event Watcher
+ // -- Native Window System Objects
+ extern NativeWindowSystem *NWS;
+ extern NativeEventFilter *NEF;
+
+ //extern EventFilter *EFILTER; //Native Event Watcher
extern LShortcutEvents *SHORTCUTS; //Keyboard/mouse shortcut events
- extern DesktopSettings *SETTINGS; //All Settings files
+ //extern DesktopSettings *SETTINGS; //All Settings files
//ScreenSaver
extern LScreenSaver *SS;
//Root Window
@@ -43,7 +47,7 @@ namespace Lumina{
//LWindowManager *WM;
//Application List
extern XDGDesktopList *APPLIST;
-
+
extern QThread *EVThread; //X Event thread
};
diff --git a/src-qt5/core/lumina-desktop-unified/lumina-desktop.pro b/src-qt5/core/lumina-desktop-unified/lumina-desktop.pro
index 1de8308d..defa66f4 100644
--- a/src-qt5/core/lumina-desktop-unified/lumina-desktop.pro
+++ b/src-qt5/core/lumina-desktop-unified/lumina-desktop.pro
@@ -12,12 +12,13 @@ target.path = $${L_BINDIR}
include(../libLumina/ResizeMenu.pri)
include(../libLumina/LDesktopUtils.pri) #includes LUtils and LOS
include(../libLumina/LuminaXDG.pri)
-include(../libLumina/LuminaX11.pri)
+#include(../libLumina/LuminaX11.pri)
include(../libLumina/LuminaSingleApplication.pri)
include(../libLumina/LuminaThemes.pri)
include(../libLumina/DesktopSettings.pri)
include(../libLumina/RootWindow.pri)
include(../libLumina/ExternalProcess.pri)
+include(../libLumina/NativeWindow.pri)
#include all the main individual source groups
include(src-screensaver/screensaver.pri)
@@ -43,10 +44,12 @@ FORMS += BootSplash.ui
#include(panel-plugins/panel-plugins.pri)
#include(desktop-plugins/desktop-plugins.pri)
-
+# Install all the various files for the desktop itself
desktop.path = $${L_SESSDIR}
desktop.files = lumina-desktop.desktop
+defaults.path = $${L_SHAREDIR}/lumina-desktop
+defaults.files = defaults/*
TRANSLATIONS = i18n/lumina-desktop_af.ts \
i18n/lumina-desktop_ar.ts \
@@ -114,7 +117,7 @@ TRANSLATIONS = i18n/lumina-desktop_af.ts \
dotrans.path=$${L_SHAREDIR}/lumina-desktop/i18n/
dotrans.extra=cd i18n && $${LRELEASE} -nounfinished *.ts && cp *.qm $(INSTALL_ROOT)$${L_SHAREDIR}/lumina-desktop/i18n/
-INSTALLS += target desktop
+INSTALLS += target desktop defaults
WITH_I18N{
INSTALLS += dotrans
diff --git a/src-qt5/core/lumina-desktop-unified/main.cpp b/src-qt5/core/lumina-desktop-unified/main.cpp
index 6141f1ea..0b67de46 100644
--- a/src-qt5/core/lumina-desktop-unified/main.cpp
+++ b/src-qt5/core/lumina-desktop-unified/main.cpp
@@ -8,10 +8,11 @@
#include "global-includes.h"
#include "LSession.h"
-#define DEBUG 0
+#define DEBUG 1
int main(int argc, char ** argv)
{
+ qDebug() << "Starting lumina-desktop-unified...";
if (argc > 1) {
if (QString(argv[1]) == QString("--version")){
qDebug() << LDesktopUtils::LuminaDesktopVersion();
@@ -27,8 +28,10 @@ int main(int argc, char ** argv)
LXDG::setEnvironmentVars();
setenv("DESKTOP_SESSION","Lumina",1);
setenv("XDG_CURRENT_DESKTOP","Lumina",1);
+ setenv("QT_NO_GLIB", "1", 1); //Disable the glib event loop within Qt at runtime (performance hit + bugs)
unsetenv("QT_QPA_PLATFORMTHEME"); //causes issues with Lumina themes - not many people have this by default...
//Startup the session
+ if(DEBUG){ qDebug() << "Starting unified session"; }
LSession a(argc, argv);
if(!a.isPrimaryProcess()){ return 0; }
QTime *timer=0;
@@ -41,6 +44,6 @@ int main(int argc, char ** argv)
theme.refresh();
if(DEBUG){ qDebug() << "Exec Time:" << timer->elapsed(); delete timer;}
int retCode = a.exec();
- qDebug() << "Finished Closing Down Lumina";
+ qDebug() << "Finished Closing Down Unified Lumina";
return retCode;
}
diff --git a/src-qt5/core/lumina-desktop-unified/src-DE/panel-plugins/systemdashboard/LSysDashboard.cpp b/src-qt5/core/lumina-desktop-unified/src-DE/panel-plugins/systemdashboard/LSysDashboard.cpp
index 267a7cb0..b9d70e97 100644
--- a/src-qt5/core/lumina-desktop-unified/src-DE/panel-plugins/systemdashboard/LSysDashboard.cpp
+++ b/src-qt5/core/lumina-desktop-unified/src-DE/panel-plugins/systemdashboard/LSysDashboard.cpp
@@ -77,7 +77,7 @@ void LSysDashboard::updateIcon(bool force){
}
void LSysDashboard::resetIcon(){
- button->setIcon( LXDG::findIcon("dashboard-show",""));
+ button->setIcon( LXDG::findIcon("arrow-down-drop-circle",""));
}
void LSysDashboard::openMenu(){
diff --git a/src-qt5/core/lumina-desktop-unified/src-WM/DEPENDENCIES b/src-qt5/core/lumina-desktop-unified/src-WM/DEPENDENCIES
deleted file mode 100644
index fa0ce486..00000000
--- a/src-qt5/core/lumina-desktop-unified/src-WM/DEPENDENCIES
+++ /dev/null
@@ -1,17 +0,0 @@
-Most dependencies required to build Lumina are listed in the
-DEPENDENCIES file in the directory above this one. The following
-are dependencies specific to Lumina's window manager.
-
-
-FreeBSD/TrueOS
-=======================
-
-
-
-
-Linux (Debian/Ubuntu)
-=======================
-
-libxcb-screensaver0-dev
-
-
diff --git a/src-qt5/core/lumina-desktop-unified/src-WM/GlobalDefines.h b/src-qt5/core/lumina-desktop-unified/src-WM/GlobalDefines.h
deleted file mode 100644
index 3ec278ac..00000000
--- a/src-qt5/core/lumina-desktop-unified/src-WM/GlobalDefines.h
+++ /dev/null
@@ -1,74 +0,0 @@
-//===========================================
-// Lumina-DE source code
-// Copyright (c) 2015, Ken Moore
-// Available under the 3-clause BSD license
-// See the LICENSE file for full details
-//===========================================
-// Global defines and enumerations for the window manager
-//===========================================
-#ifndef _LUMINA_WINDOW_MANAGER_GLOBAL_DEFINES_H
-#define _LUMINA_WINDOW_MANAGER_GLOBAL_DEFINES_H
-
-//Qt includes
-#include <QObject>
-#include <QFrame>
-#include <QLabel>
-#include <QToolButton>
-#include <QMenu>
-#include <QHBoxLayout>
-#include <QMouseEvent>
-#include <QAction>
-#include <QPoint>
-#include <QFile>
-#include <QDir>
-#include <QString>
-#include <QTextStream>
-#include <QUrl>
-#include <QDebug>
-#include <QStringList>
-#include <QAbstractNativeEventFilter>
-#include <QList>
-#include <QX11Info>
-#include <QCoreApplication>
-#include <QPropertyAnimation>
-#include <QAnimationGroup>
-#include <QParallelAnimationGroup>
-#include <QWindow>
-#include <QWidget>
-#include <QBackingStore>
-#include <QPaintEvent>
-#include <QPainter>
-#include <QSettings>
-#include <QHostInfo>
-#include <QDesktopWidget>
-#include <QStyleOption>
-#include <QThread>
-
-// libLumina includes
-#include <LuminaX11.h>
-#include <LuminaXDG.h>
-#include <LuminaOS.h>
-#include <LuminaThemes.h>
-#include <LuminaUtils.h>
-#include <LuminaSingleApplication.h>
-
-//XCB Includes
-#include <xcb/xcb.h>
-#include <xcb/xproto.h>
-#include <xcb/damage.h>
-#include <xcb/xcb_atom.h>
-#include <xcb/xcb_aux.h> //included in libxcb-util.so
-
-#define ANIMTIME 80 //animation time in milliseconds
-//Global flags/structures
-namespace LWM{
- //Flags/enumerations
- enum WindowAction{MoveResize, Show, Hide, TryClose, Closed, WA_NONE};
-
- //Data structures
- extern LXCB *SYSTEM;
-};
-
-
-
-#endif
diff --git a/src-qt5/core/lumina-desktop-unified/src-WM/LWindow.cpp b/src-qt5/core/lumina-desktop-unified/src-WM/LWindow.cpp
deleted file mode 100644
index 84ff2ffd..00000000
--- a/src-qt5/core/lumina-desktop-unified/src-WM/LWindow.cpp
+++ /dev/null
@@ -1,474 +0,0 @@
-//===========================================
-// Lumina-DE source code
-// Copyright (c) 2015, Ken Moore
-// Available under the 3-clause BSD license
-// See the LICENSE file for full details
-//===========================================
-#include "LWindow.h"
-
-LWindowFrame::LWindowFrame(WId client, QWidget *parent) : QFrame(parent, Qt::X11BypassWindowManagerHint){
- activeState = LWindowFrame::Normal;
- CID = client;
- lastAction = LWM::WA_NONE;
- Closing = false;
- //qDebug() << "New Window:" << CID << "Frame:" << this->winId();
- this->setMouseTracking(true); //need this to determine mouse location when not clicked
- this->setObjectName("LWindowFrame");
- this->setStyleSheet("LWindowFrame#LWindowFrame{ border: 2px solid white; border-radius:3px; } QWidget#TitleBar{background: grey; } QLabel{ color: black; }");
- InitWindow(); //initially create all the child widgets
- //LWM::SYSTEM->setupEventsForFrame(this->winId());
- updateAppearance(); //this loads the appearance based on window/theme settings
- //QApplication::processEvents();
- //Now set the frame size on this window
- SyncSize();
- SyncText();
- this->show();
-}
-
-LWindowFrame::~LWindowFrame(){
-}
-
-// =================
-// PRIVATE
-// =================
-void LWindowFrame::InitWindow(){
- anim = new QPropertyAnimation(this); //For simple window animations
- anim->setTargetObject(this);
- anim->setDuration(ANIMTIME); //In milliseconds
- connect(anim, SIGNAL(finished()), this, SLOT(finishedAnimation()) );
- titleBar = new QLabel(this); //This is the "container" for all the title buttons/widgets
- titleBar->setObjectName("TitleBar");
- titleBar->setSizePolicy(QSizePolicy::Minimum,QSizePolicy::Minimum);
- titleBar->setFocusPolicy(Qt::NoFocus);
- titleBar->setCursor(Qt::ArrowCursor);
- title = new QLabel(this); //Shows the window title/text
- title->setObjectName("Title");
- title->setSizePolicy(QSizePolicy::Expanding, QSizePolicy::Preferred);
- title->setCursor(Qt::ArrowCursor);
- title->setFocusPolicy(Qt::NoFocus);
- icon = new QLabel(this); //Contains the window icon
- icon->setObjectName("Icon");
- icon->setCursor(Qt::ArrowCursor);
- icon->setFocusPolicy(Qt::NoFocus);
- minB = new QToolButton(this); //Minimize Button
- minB->setObjectName("Minimize");
- minB->setCursor(Qt::ArrowCursor);
- minB->setFocusPolicy(Qt::NoFocus);
- connect(minB, SIGNAL(clicked()), this, SLOT(minClicked()) );
- maxB = new QToolButton(this); //Maximize Button
- maxB->setObjectName("Maximize");
- maxB->setCursor(Qt::ArrowCursor);
- maxB->setFocusPolicy(Qt::NoFocus);
- connect(maxB, SIGNAL(clicked()), this, SLOT(maxClicked()) );
- closeB = new QToolButton(this);
- closeB->setObjectName("Close");
- closeB->setCursor(Qt::ArrowCursor);
- closeB->setFocusPolicy(Qt::NoFocus);
- connect(closeB, SIGNAL(clicked()), this, SLOT(closeClicked()) );
- otherB = new QToolButton(this); //Button to place any other actions
- otherB->setObjectName("Options");
- otherB->setCursor(Qt::ArrowCursor);
- otherB->setPopupMode(QToolButton::InstantPopup);
- otherB->setStyleSheet("QToolButton::menu-indicator{ image: none; }");
- otherB->setFocusPolicy(Qt::NoFocus);
- otherM = new QMenu(this); //menu of "other" actions for the window
- otherB->setMenu(otherM);
- connect(otherM, SIGNAL(triggered(QAction*)), this, SLOT(otherClicked(QAction*)) );
- //Now assemble the titlebar
- QHBoxLayout *HL = new QHBoxLayout(this);
- HL->setContentsMargins(0,0,0,0);
- HL->addWidget(otherB);
- HL->addWidget(icon);
- HL->addWidget(title);
- HL->addWidget(minB);
- HL->addWidget(maxB);
- HL->addWidget(closeB);
- titleBar->setLayout(HL);
- QVBoxLayout *VL = new QVBoxLayout(this);
- this->setLayout(VL);
- //The WinWidget container appears shifted right/down by 1 pixel for some reason
- // Adjust the margins to account for this variation
- VL->setContentsMargins(1,1,2,2);
- VL->setSpacing(0);
- //Have the window take the same initial size of the client window
- QRect geom = LWM::SYSTEM->WM_Window_Geom(CID);
- qDebug() << " - Load Size Hints" << "initial size:" << geom.size();
- icccm_size_hints SH = LWM::SYSTEM->WM_ICCCM_GetNormalHints(CID);
- qDebug() << " - - Got Normal Hints";
- if(!SH.isValid()){ SH = LWM::SYSTEM->WM_ICCCM_GetSizeHints(CID); }
- qDebug() << " - - Start resizing...";
- if(SH.base_width>geom.width() && SH.base_height>geom.height()){ this->resize(SH.base_width, SH.base_height); }
- else if(SH.min_width>geom.width() && SH.min_height>geom.height()){ this->resize(SH.min_width, SH.min_height); }
- else if(SH.width>geom.width() && SH.height>geom.height()){ this->resize(SH.width, SH.height); }
- else if(geom.isNull()){ this->resize(100,80); }
- else{ this->resize( geom.size() ); }
- qDebug() << " - done";
-
- //Now embed the native window into the frame
- WIN = QWindow::fromWinId(CID);
- WinWidget = QWidget::createWindowContainer( WIN, this);
- WinWidget->setCursor(Qt::ArrowCursor); //this is just a fallback - the window itself will adjust it
- //WINBACK = new QBackingStore(WIN); //create a data backup for the widget
-
- //Now assemble te initial layout for the window (all while still invisible)
- /*VL->addWidget(titleBar);
- VL->addWidget(WinWidget);
- VL->setStretch(1,1);*/
-}
-
-LWindowFrame::ModState LWindowFrame::getStateAtPoint(QPoint pt, bool setoffset){
- //Note: pt should be in widget-relative coordinates, not global
- if(!this->layout()->geometry().contains(pt)){
- //above the frame itself - need to figure out which quadrant it is in (8-directions)
- if(pt.y() < 3){
- //One of the top options
- if(pt.x() < 3){
- if(setoffset){ offset.setX(pt.x()); offset.setY(pt.y()); } //difference from top-left corner
- return ResizeTopLeft;
- }else if(pt.x() > (this->width()-3)){
- if(setoffset){ offset.setX(this->width()-pt.x()); offset.setY(pt.y()); } //difference from top-right corner
- return ResizeTopRight;
- }else{
- if(setoffset){ offset.setX(0); offset.setY(pt.y()); } //difference from top edge (X does not matter)
- return ResizeTop;
- }
- }else if(pt.y() > (this->height()-3) ){
- //One of the bottom options
- if(pt.x() < 3){
- if(setoffset){ offset.setX(pt.x()); offset.setY(this->height()-pt.y()); } //difference from bottom-left corner
- return ResizeBottomLeft;
- }else if(pt.x() > (this->width()-3)){
- if(setoffset){ offset.setX(this->width()-pt.x()); offset.setY(this->height()-pt.y()); } //difference from bottom-right corner
- return ResizeBottomRight;
- }else{
- if(setoffset){ offset.setX(0); offset.setY(this->height() - pt.y()); } //difference from bottom edge (X does not matter)
- return ResizeBottom;
- }
- }else{
- //One of the side options
- if(pt.x() < 3){
- if(setoffset){ offset.setX(pt.x()); offset.setY(0); } //difference from left edge (Y does not matter)
- return ResizeLeft;
- }else if(pt.x() > (this->width()-3) ){
- if(setoffset){ offset.setX(this->width()-pt.x()); offset.setY(0); } //difference from right edge (Y does not matter)
- return ResizeRight;
- }else{
- return Normal;
- }
- }
- }
- return Normal;
-}
-
-void LWindowFrame::setMouseCursor(ModState state, bool override){
- Qt::CursorShape shape;
- switch(state){
- case Normal:
- shape = Qt::ArrowCursor;
- break;
- case Move:
- shape = Qt::SizeAllCursor;
- break;
- case ResizeTop:
- shape = Qt::SizeVerCursor;
- break;
- case ResizeTopRight:
- shape = Qt::SizeBDiagCursor;
- break;
- case ResizeRight:
- shape = Qt::SizeHorCursor;
- break;
- case ResizeBottomRight:
- shape = Qt::SizeFDiagCursor;
- break;
- case ResizeBottom:
- shape = Qt::SizeVerCursor;
- break;
- case ResizeBottomLeft:
- shape = Qt::SizeBDiagCursor;
- break;
- case ResizeLeft:
- shape = Qt::SizeHorCursor;
- break;
- case ResizeTopLeft:
- shape = Qt::SizeFDiagCursor;
- break;
- }
- if(override){
- QApplication::setOverrideCursor(QCursor(shape));
- }else{
- this->setCursor(shape);
- }
-}
-
-// ==========================
-// WINDOW INTERACTIONS
-//==========================
-void LWindowFrame::SyncSize(bool fromwin){
- //sync the window/frame geometries (generally only done before embedding the client window)
- int frame = this->frameWidth();
- int TH = titleBar->height();
- //Now load the information about the window and adjust the frame to match
- if(fromwin){ lastGeom = LWM::SYSTEM->WM_Window_Geom(CID); }
- else{ lastGeom = this->geometry(); }
- qDebug() << "Initial Size:" << lastGeom << frame << TH;
- //Add in the frame size
- lastGeom.moveTop(lastGeom.y()-frame-TH);
- lastGeom.setHeight(lastGeom.height()+(2*frame)+TH);
- lastGeom.moveLeft(lastGeom.x()-frame);
- lastGeom.setWidth( lastGeom.width()+(2*frame));
- QList<unsigned int> margins;
- margins << frame << frame << frame+TH << frame; //L/R/Top/Bottom
- qDebug() << " - With Frame:" << lastGeom;
- //Now adjust for a out-of-bounds location
- if(lastGeom.x() < 0){ lastGeom.moveLeft(0); }
- if(lastGeom.y() < 0){ lastGeom.moveTop(0); }
- qDebug() << " - Adjusted:" << lastGeom;
- this->setGeometry(lastGeom);
- LWM::SYSTEM->WM_Set_Frame_Extents(CID, margins);
-}
-
-void LWindowFrame::SyncText(){
- QString txt = WIN->title();
- if(txt.isEmpty()){ txt = LWM::SYSTEM->WindowName(CID); }
- if(txt.isEmpty()){ txt = LWM::SYSTEM->OldWindowName(CID); }
- if(txt.isEmpty()){ txt = LWM::SYSTEM->WindowVisibleName(CID); }
- if(txt.isEmpty()){ txt = LWM::SYSTEM->WindowIconName(CID); }
- if(txt.isEmpty()){ txt = LWM::SYSTEM->WindowVisibleIconName(CID); }
- if(txt.isEmpty()){ txt = LWM::SYSTEM->WM_ICCCM_GetClass(CID); }
- title->setText(txt);
-}
-
-// SIMPLE ANIMATIONS
-void LWindowFrame::showAnimation(LWM::WindowAction act){
- bool useanimation = (act!=lastAction);
- if(anim->state()==QAbstractAnimation::Running){
- qDebug() << "New Animation Event:" << act;
- return;
- }
- //Setup the animation routine
- if(act==LWM::Show){
- if(useanimation){
- lastGeom = this->geometry();
- //Expand out from center point
- anim->setPropertyName("geometry");
- anim->setStartValue( QRect(lastGeom.center(), QSize(0,0) ) );
- anim->setEndValue( this->geometry() );
- //Fade in gradually
- //anim->setPropertyName("windowOpacity");
- //anim->setStartValue( 0.0 );
- //anim->setEndValue( 1.0 );
- }else{
- ShowClient(true);
- this->raise();
- this->show(); //just show it right away
- }
-
- }else if(act==LWM::Hide){
- if(useanimation){
- //Collapse in on center point
- lastGeom = this->geometry();
- anim->setPropertyName("geometry");
- anim->setStartValue( QRect(this->geometry()) );
- anim->setEndValue( QRect(this->geometry().center(), QSize(0,0) ) );
- }else{
- this->hide(); //just hide it right away
- }
- }else if(act==LWM::Closed){
- //Need to clean up the container widget first to prevent XCB errors
- //qDebug() << "Window Closed:" << WIN->winId() << CID;
- if(useanimation){
- //Collapse in on center line
- lastGeom = this->geometry();
- anim->setPropertyName("geometry");
- anim->setStartValue( QRect(this->geometry()) );
- anim->setEndValue( QRect(this->geometry().x(), this->geometry().center().y(), this->width(), 0 ) );
- }else{
- CloseAll(); //just hide it right away
- }
- }
- if(useanimation){
- ShowClient(false);
- this->show();
- qDebug() << " - Starting Animation:" << act;
- lastAction = act;
- anim->start();
- };
-}
-
-void LWindowFrame::ShowClient(bool show){
- if(show && this->layout()->indexOf(WinWidget)<0 && !Closing){
- while(this->layout()->count()>0){ this->layout()->removeItem(0); }
- this->layout()->addWidget(titleBar);
- this->layout()->setAlignment(titleBar, Qt::AlignTop);
- this->layout()->addWidget(WinWidget);
- static_cast<QVBoxLayout*>(this->layout())->setStretch(1,1);
- LWM::SYSTEM->WM_ShowWindow(CID);
- }else if( !show && this->layout()->indexOf(WinWidget)>=0){
- LWM::SYSTEM->WM_HideWindow(CID);
- this->layout()->removeWidget(WinWidget);
- }
-}
-
-void LWindowFrame::finishedAnimation(){
- //Also set any final values
- qDebug() << " - Finished Animation:" << lastAction;
- switch(lastAction){
- case LWM::Show:
- ShowClient(true);
- break;
- case LWM::Closed:
- case LWM::Hide:
- this->lower();
- this->hide();
- LWM::SYSTEM->WM_HideWindow(this->winId());
- default:
- break;
- }
- if(Closing){
- qDebug() << "Emitting finished signal";
- emit Finished();
- }
-}
-
-// =================
-// PUBLIC SLOTS
-// =================
-void LWindowFrame::updateAppearance(){
- //Reload any button icons and such
- minB->setIcon(LXDG::findIcon("window-suppressed",""));
- maxB->setIcon(LXDG::findIcon("view-fullscreen",""));
- closeB->setIcon(LXDG::findIcon("application-exit",""));
- otherB->setIcon(LXDG::findIcon("configure",""));
-}
-
-void LWindowFrame::windowChanged(LWM::WindowAction act){
- //A window property was changed - update accordingly
- switch(act){
- case LWM::Closed:
- Closing = true;
- case LWM::Hide:
- case LWM::Show:
- showAnimation(act);
- break;
- case LWM::MoveResize:
- //Re-adjust to the new position/size of the window
- SyncSize(true);
- break;
- default:
- break; //do nothing
- }
-}
-// =================
-// PRIVATE SLOTS
-// =================
-void LWindowFrame::closeClicked(){
- qDebug() << "Closing Window" << LWM::SYSTEM->WM_ICCCM_GetClass(CID);
- //First try the close event to let the client app do cleanup/etc
- LWM::SYSTEM->WM_CloseWindow(CID);
-}
-
-void LWindowFrame::minClicked(){
- qDebug() << "Minimize Window";
- windowChanged(LWM::Hide);
-}
-
-void LWindowFrame::maxClicked(){
- if(normalGeom.isNull()){
- qDebug() << "Maximize Window";
- normalGeom = this->geometry(); //save for later
- this->showMaximized();
- }else{
- qDebug() << "Restore Window";
- this->showNormal();
- this->setGeometry(normalGeom);
- normalGeom = QRect(); //clear it
- }
-}
-
-void LWindowFrame::otherClicked(QAction* act){
- QString action = act->whatsThis();
-}
-
-void LWindowFrame::CloseAll(){
- qDebug() << " - Closing Frame";
- this->hide();
- emit Finished();
-}
-// =====================
-// PROTECTED
-// =====================
-void LWindowFrame::mousePressEvent(QMouseEvent *ev){
- qDebug() << "Frame Mouse Press Event";
- offset.setX(0); offset.setY(0);
- if(activeState != Normal){ return; } // do nothing - already in a state of grabbed mouse
- this->activateWindow();
- LWM::SYSTEM->WM_Set_Active_Window(CID);
- if(this->childAt(ev->pos())!=0){
- //Check for any non-left-click event and skip it
- if(ev->button()!=Qt::LeftButton){ return; }
- activeState = Move;
- offset.setX(ev->pos().x()); offset.setY(ev->pos().y());
- }else{
- //Clicked on the frame somewhere
- activeState = getStateAtPoint(ev->pos(), true); //also have it set the offset variable
- }
- setMouseCursor(activeState, true); //this one is an override cursor
-
-}
-
-void LWindowFrame::mouseMoveEvent(QMouseEvent *ev){
- ev->accept();
- if(activeState == Normal){
- setMouseCursor( getStateAtPoint(ev->pos()) ); //just update the mouse cursor
-
- }else{
- //Currently in a modification state
- QRect geom = this->geometry();
- switch(activeState){
- case Move:
- geom.moveTopLeft(ev->globalPos()-offset); //will not change size
- break;
- case ResizeTop:
- geom.setTop(ev->globalPos().y()-offset.y());
- break;
- case ResizeTopRight:
- geom.setTopRight(ev->globalPos()-offset);
- break;
- case ResizeRight:
- geom.setRight(ev->globalPos().x()-offset.x());
- break;
- case ResizeBottomRight:
- geom.setBottomRight(ev->globalPos()-offset);
- break;
- case ResizeBottom:
- geom.setBottom(ev->globalPos().y()-offset.y());
- break;
- case ResizeBottomLeft:
- geom.setBottomLeft(ev->globalPos()-offset);
- break;
- case ResizeLeft:
- geom.setLeft(ev->globalPos().x()-offset.x());
- break;
- case ResizeTopLeft:
- geom.setTopLeft(ev->globalPos()-offset);
- break;
- default:
- break;
- }
- this->setGeometry(geom);
- }
-}
-
-void LWindowFrame::mouseReleaseEvent(QMouseEvent *ev){
- //Check for a right-click event
- qDebug() << "Frame Mouse Release Event";
- ev->accept();
- if( (activeState==Normal) && (this->childAt(ev->pos())==titleBar) && (ev->button()==Qt::RightButton) ){
- otherM->popup(ev->globalPos());
- return;
- }
- activeState = Normal;
- QApplication::restoreOverrideCursor();
- setMouseCursor( getStateAtPoint(ev->pos()) );
-}
diff --git a/src-qt5/core/lumina-desktop-unified/src-WM/LWindow.h b/src-qt5/core/lumina-desktop-unified/src-WM/LWindow.h
deleted file mode 100644
index ceefca83..00000000
--- a/src-qt5/core/lumina-desktop-unified/src-WM/LWindow.h
+++ /dev/null
@@ -1,114 +0,0 @@
-//===========================================
-// Lumina-DE source code
-// Copyright (c) 2015, Ken Moore
-// Available under the 3-clause BSD license
-// See the LICENSE file for full details
-//===========================================
-#ifndef _LUMINA_DESKTOP_WINDOW_FRAME_H
-#define _LUMINA_DESKTOP_WINDOW_FRAME_H
-
-#include "GlobalDefines.h"
-
-class LWindowFrame : public QFrame{
- Q_OBJECT
-public:
- LWindowFrame(WId client, QWidget *parent = 0); //MUST have a valid client window
- ~LWindowFrame();
-
-private:
- void InitWindow(); //Initialize all the internal widgets
-
- //Window status
- enum ModState{Normal, Move, ResizeTop, ResizeTopRight, ResizeRight, ResizeBottomRight, ResizeBottom, ResizeBottomLeft, ResizeLeft, ResizeTopLeft};
- ModState activeState;
- QPoint offset; //needed for movement calculations (offset from mouse click to movement point)
- //Functions for getting/setting state
- ModState getStateAtPoint(QPoint pt, bool setoffset = false); //generally used for mouse location detection
- void setMouseCursor(ModState, bool override = false); //Update the mouse cursor based on state
-
- //General Properties/Modifications
- WId CID; //Client ID
- QWindow *WIN; //Embedded window container
- QWidget *WinWidget;
- bool Closing;
- LWM::WindowAction lastAction;
- //QBackingStore *WINBACK;
- void SyncSize(bool fromwin = false); //sync the window/frame geometries
- void SyncText();
-
- //Window Frame Widgets/Items
- QLabel *titleBar, *title, *icon;
- QToolButton *minB, *maxB, *closeB, *otherB;
- QMenu *otherM; //menu of "other" actions for the window
- QRect normalGeom; //used for restoring back to original size after maximization/fullscreen
-
- //Animations
- QPropertyAnimation *anim; //used for appear/disappear animations
- QRect lastGeom; //used for appear/disappear animations
- void showAnimation(LWM::WindowAction); //sets lastAction
- void ShowClient(bool show);
-
-public slots:
- //These slots are generally used for the outside event watcher to prod for changes
- void updateAppearance(); //reload the theme and change styling as necessary
- void windowChanged(LWM::WindowAction);
-
-private slots:
- void finishedAnimation(); //uses lastAction
- void closeClicked();
- void minClicked();
- void maxClicked();
- void otherClicked(QAction*);
-
- void CloseAll();
-
-protected:
- void mousePressEvent(QMouseEvent*);
- void mouseMoveEvent(QMouseEvent*);
- void mouseReleaseEvent(QMouseEvent*);
-
-signals:
- void Finished(); //This means the window is completely finished (with animations and such) and should be removed from any lists
-
-};
-
-class LWindow : public QObject{
- Q_OBJECT
-signals:
- void Finished(WId client); //ready to be removed
-private:
- WId CID;
- LWindowFrame *FID;
- bool needsFrame(QList<LXCB::WINDOWTYPE> list){
- if(list.isEmpty()){ return !LWM::SYSTEM->WM_ICCCM_GetClass(CID).contains("Lumina-DE"); } //assume a normal window (fallback)
- return !(list.contains(LXCB::T_DESKTOP) || list.contains(LXCB::T_DOCK) || list.contains(LXCB::T_TOOLBAR) \
- || list.contains(LXCB::T_SPLASH) || list.contains(LXCB::T_DROPDOWN_MENU) \
- || list.contains(LXCB::T_TOOLTIP) || list.contains(LXCB::T_POPUP_MENU) || list.contains(LXCB::T_TOOLTIP) \
- || list.contains(LXCB::T_COMBO) || list.contains(LXCB::T_DND) );
- }
-private slots:
- void frameclosed(){
- qDebug() << " - Window got frame closed signal";
- //FID->close();
- //delete FID;
- emit Finished(CID);
- }
-public:
- LWindow(WId client){
- FID= 0;
- CID = client;
- if( needsFrame(LWM::SYSTEM->WM_Get_Window_Type(CID)) ){
- FID = new LWindowFrame(CID);
- connect(FID, SIGNAL(Finished()), this, SLOT(frameclosed()) );
- }
- }
- ~LWindow(){
- if(FID!=0){delete FID;}
- }
-
- WId clientID(){ return CID; }
- bool hasFrame(){ return FID!=0; }
- LWindowFrame* frame(){ return FID; }
-
-};
-#endif
diff --git a/src-qt5/core/lumina-desktop-unified/src-WM/LWindowManager.cpp b/src-qt5/core/lumina-desktop-unified/src-WM/LWindowManager.cpp
deleted file mode 100644
index 14ce6897..00000000
--- a/src-qt5/core/lumina-desktop-unified/src-WM/LWindowManager.cpp
+++ /dev/null
@@ -1,186 +0,0 @@
-//===========================================
-// Lumina-DE source code
-// Copyright (c) 2015, Ken Moore
-// Available under the 3-clause BSD license
-// See the LICENSE file for full details
-//===========================================
-#include "LWindowManager.h"
-
-#define DEBUG 1
-
-LWindowManager::LWindowManager(){
-
-}
-
-LWindowManager::~LWindowManager(){
-
-}
-
-bool LWindowManager::start(){
- //Setup the initial screen/session values
- LWM::SYSTEM->WM_Set_Root_Supported();
- LWM::SYSTEM->WM_SetNumber_Desktops(1);
- LWM::SYSTEM->WM_Set_Current_Desktop(0);
- LWM::SYSTEM->WM_Set_Desktop_Names(QStringList() << "one");
- QRect totgeom;
- QList<QPoint> viewports;
- QList<QRect> geoms;
- for(int i=0; i<QApplication::desktop()->screenCount(); i++){
- geoms << QApplication::desktop()->screen(i)->geometry();
- viewports << QPoint(0,0);
- totgeom = QApplication::desktop()->screen(i)->geometry();
- }
- LWM::SYSTEM->WM_Set_Desktop_Geometry(totgeom.size());
- LWM::SYSTEM->WM_Set_Desktop_Viewport(viewports);
- LWM::SYSTEM->WM_Set_Workarea(geoms);
- //Should probably do a quick loop over any existing windows with the root as parent (just in case)
- QList<WId> initial = LWM::SYSTEM->WM_RootWindows();
- for(int i=0; i<initial.length(); i++){
- NewWindow(initial[i], false); //These ones did not explicitly request to be mapped
- }
- RestackWindows();
- return true;
-}
-
-void LWindowManager::stop(){
- for(int i=0; i<WINS.length(); i++){
- if(WINS[i]->hasFrame()){
- LWM::SYSTEM->UnembedWindow(WINS[i]->clientID());
- WINS[i]->frame()->close();
- }
- }
-}
-//===============
-// PUBLIC SLOTS
-//===============
-void LWindowManager::NewWindow(WId win, bool requested){
- //Verify that this window can/should be managed first
- //if(DEBUG){ qDebug() << "New Window:" << LWM::SYSTEM->WM_ICCCM_GetClass(win); }
- QString wclass = LWM::SYSTEM->WM_ICCCM_GetClass(win);
- if( wclass.contains("lumina-wm",Qt::CaseInsensitive) ){ return; } //just in case: prevent recursion
- else{
- bool ok = (wclass.isEmpty() ? false : LWM::SYSTEM->WM_ManageWindow(win, requested) );
- if(!ok){
- //See if this window is just a transient pointing to some other window
- WId tran = LWM::SYSTEM->WM_ICCCM_GetTransientFor(win);
- if(tran!=win && tran!=0){
- win = tran;
- ok = LWM::SYSTEM->WM_ManageWindow(win);
- }
- }
- if(!ok){ return; }
- }
- if(DEBUG){ qDebug() << "New Managed Window:" << LWM::SYSTEM->WM_ICCCM_GetClass(win); }
- LWM::SYSTEM->WM_Set_Active_Window(win);
- LWindow *lwin = new LWindow(win);
- connect(lwin, SIGNAL(Finished(WId)), this, SLOT(FinishedWindow(WId)) );
- WINS << lwin;
- if(lwin->hasFrame()){
- lwin->frame()->windowChanged(LWM::Show); //Make sure to show it right away
- }else{
- LWM::SYSTEM->WM_ShowWindow(win); //just map the window right now
- }
-}
-
-void LWindowManager::ClosedWindow(WId win){
- for(int i=0; i<WINS.length(); i++){
- if(WINS[i]->clientID()==win){
- qDebug() << " - Closed Window";
- if(WINS[i]->hasFrame()){ WINS[i]->frame()->windowChanged(LWM::Closed); } //do any animations/cleanup
- else{ FinishedWindow(win); }
- break;
- }
- }
-}
-
-void LWindowManager::ModifyWindow(WId win, LWM::WindowAction act){
- for(int i=0; i<WINS.length(); i++){
- if(WINS[i]->clientID()==win){
- if(WINS[i]->hasFrame()){ WINS[i]->frame()->windowChanged(act); }
- return;
- }
- }
- //If it gets this far - it is an unmanaged window
- if(act==LWM::Show){
- NewWindow(win);
- }
- RestackWindows();
-}
-
-void LWindowManager::RestackWindows(){
- Stack_Desktop.clear(); Stack_Below.clear(); Stack_Normal.clear(); Stack_Above.clear(); Stack_Fullscreen.clear();
- QList<WId> currwins;
- int cwork = LWM::SYSTEM->WM_Get_Current_Desktop();
- int winwork = -1;
- QList<LXCB::WINDOWSTATE> states;
- QList<LXCB::WINDOWTYPE> types;
- for(int i=0; i<WINS.length(); i++){
- //Only show windows on the current desktop
- winwork = LWM::SYSTEM->WM_Get_Desktop(WINS[i]->clientID());
- states = LWM::SYSTEM->WM_Get_Window_States(WINS[i]->clientID());
- types = LWM::SYSTEM->WM_Get_Window_Type(WINS[i]->clientID());
- WId id = WINS[i]->clientID();
- if(WINS[i]->hasFrame()){ id = WINS[i]->frame()->winId(); }
- if(winwork<0 || winwork == cwork || states.contains(LXCB::S_STICKY) ){
- //Now check the state/type and put it in the proper stack
- currwins << WINS[i]->clientID(); //add this to the overall "age" list
- //Now add it to the proper stack
- if(types.contains(LXCB::T_DESKTOP)){ Stack_Desktop << id; }
- else if(states.contains(LXCB::S_BELOW)){ Stack_Below << id; }
- else if(types.contains(LXCB::T_DOCK) || states.contains(LXCB::S_ABOVE) ){ Stack_Above << id; }
- else if(states.contains(LXCB::S_FULLSCREEN)){ Stack_Fullscreen << id; }
- else{ Stack_Normal << id; }
- }
- }
- //Active Window management
- WId active = LWM::SYSTEM->WM_Get_Active_Window();
- if(Stack_Desktop.contains(active)){ Stack_Desktop.removeAll(active); Stack_Desktop << active; }
- else if(Stack_Below.contains(active)){ Stack_Below.removeAll(active); Stack_Below << active; }
- else if(Stack_Normal.contains(active)){ Stack_Normal.removeAll(active); Stack_Normal << active; }
- else if(Stack_Above.contains(active)){ Stack_Above.removeAll(active); Stack_Above << active; }
- else if(Stack_Fullscreen.contains(active)){ Stack_Fullscreen.removeAll(active); Stack_Fullscreen << active; }
-
- //Now set the root properties for these lists
- LWM::SYSTEM->WM_Set_Client_List(currwins, false); //age-ordered version
- LWM::SYSTEM->WM_Set_Client_List(QList<WId>() << Stack_Desktop << Stack_Below << Stack_Normal << Stack_Above << Stack_Fullscreen, true); //stacking order version
- //Now re-paint (in order) the windows
- RepaintWindows();
-}
-
-void LWindowManager::RepaintWindows(){
- //Go through all the current windows (in stacking order) and re-paint them
- for(int i=0; i<Stack_Desktop.length(); i++){
- LWM::SYSTEM->WM_ShowWindow(Stack_Desktop[i]);
- }
- for(int i=0; i<Stack_Below.length(); i++){
- LWM::SYSTEM->WM_ShowWindow(Stack_Below[i]);
- }
- for(int i=0; i<Stack_Normal.length(); i++){
- LWM::SYSTEM->WM_ShowWindow(Stack_Normal[i]);
- }
- for(int i=0; i<Stack_Above.length(); i++){
- LWM::SYSTEM->WM_ShowWindow(Stack_Above[i]);
- }
- for(int i=0; i<Stack_Fullscreen.length(); i++){
- LWM::SYSTEM->WM_ShowWindow(Stack_Fullscreen[i]);
- }
-}
-
-//=================
-// PRIVATE SLOTS
-//=================
-void LWindowManager::FinishedWindow(WId win){
- for(int i=0; i<WINS.length(); i++){
- if(WINS[i]->clientID() == win){
- qDebug() << " - Finished Window";
- if(win == LWM::SYSTEM->WM_Get_Active_Window()){
- if(i==0 && WINS.length()>1){ LWM::SYSTEM->WM_Set_Active_Window(WINS[i+1]->clientID()); }
- else if(i>0){ LWM::SYSTEM->WM_Set_Active_Window(WINS[i-1]->clientID()); }
- else{ LWM::SYSTEM->WM_Set_Active_Window( QX11Info::appRootWindow()); }
- }
- delete WINS.takeAt(i); break;
- }
- }
- //Now update the list of clients
- RestackWindows();
-}
diff --git a/src-qt5/core/lumina-desktop-unified/src-WM/LWindowManager.h b/src-qt5/core/lumina-desktop-unified/src-WM/LWindowManager.h
deleted file mode 100644
index 203efa1b..00000000
--- a/src-qt5/core/lumina-desktop-unified/src-WM/LWindowManager.h
+++ /dev/null
@@ -1,40 +0,0 @@
-//===========================================
-// Lumina-DE source code
-// Copyright (c) 2015, Ken Moore
-// Available under the 3-clause BSD license
-// See the LICENSE file for full details
-//===========================================
-#ifndef _LUMINA_DESKTOP_WINDOW_MANAGER_MAIN_CLASS_H
-#define _LUMINA_DESKTOP_WINDOW_MANAGER_MAIN_CLASS_H
-
-#include "GlobalDefines.h"
-#include "LWindow.h"
-
-class LWindowManager : public QObject{
- Q_OBJECT
-public:
- LWindowManager();
- ~LWindowManager();
-
- bool start();
- void stop();
-
-private:
- QList<LWindow*> WINS;
- QList<WId> Stack_Desktop, Stack_Below, Stack_Normal, Stack_Above, Stack_Fullscreen;
-public slots:
- void NewWindow(WId win, bool requested = true);
- void ClosedWindow(WId win);
- void ModifyWindow(WId win, LWM::WindowAction act);
-
- void RestackWindows();
- void RepaintWindows();
-
-private slots:
- void FinishedWindow(WId win); //This is used for LWindow connections/animations
-
-signals:
- void NewFullScreenWindows(QList<WId>);
-};
-
-#endif
diff --git a/src-qt5/core/lumina-desktop-unified/src-WM/WMSession.cpp b/src-qt5/core/lumina-desktop-unified/src-WM/WMSession.cpp
deleted file mode 100644
index 4a7c6e02..00000000
--- a/src-qt5/core/lumina-desktop-unified/src-WM/WMSession.cpp
+++ /dev/null
@@ -1,62 +0,0 @@
-//===========================================
-// Lumina-DE source code
-// Copyright (c) 2015, Ken Moore
-// Available under the 3-clause BSD license
-// See the LICENSE file for full details
-//===========================================
-#include "WMSession.h"
-
-#define DEBUG 1
-// ==========
-// PUBLIC
-// ==========
-WMSession::WMSession(){
- if(DEBUG){ qDebug() << "Creating Event Filter..."; }
- EFILTER = new EventFilter();
- if(DEBUG){ qDebug() << "Creating Screen Saver..."; }
- SS = new LScreenSaver();
- if(DEBUG){ qDebug() << "Creating Window Manager..."; }
- WM = new LWindowManager();
- EVThread = new QThread();
- EFILTER->moveToThread(EVThread);
- //Setup connections
- connect(EFILTER, SIGNAL(NewInputEvent()), SS, SLOT(newInputEvent()) );
- connect(EFILTER, SIGNAL(NewManagedWindow(WId)), WM, SLOT(NewWindow(WId)) );
- connect(EFILTER, SIGNAL(WindowClosed(WId)), WM, SLOT(ClosedWindow(WId)) );
- connect(EFILTER, SIGNAL(ModifyWindow(WId, LWM::WindowAction)), WM, SLOT(ModifyWindow(WId,LWM::WindowAction)) );
- connect(SS, SIGNAL(StartingScreenSaver()), EFILTER, SLOT(StartedSS()) );
- connect(SS, SIGNAL(ClosingScreenSaver()), EFILTER, SLOT(StoppedSS()) );
- connect(WM, SIGNAL(NewFullScreenWindows(QList<WId>)), EFILTER, SLOT(FullScreenChanged(QList<WId>)) );
-}
-
-WMSession::~WMSession(){
-}
-
-void WMSession::start(bool SSONLY){
- //Get the screensaver initialized/ready
- if(DEBUG){ qDebug() << "Starting Screen Saver..."; }
- SS->start();
- if(SSONLY){ return; }
- //Now start pulling/filtering events
- if(DEBUG){ qDebug() << "Starting Window Manager..."; }
- WM->start();
- if(DEBUG){ qDebug() << "Starting Event Filter..."; }
- EVThread->start();
- EFILTER->start();
- if(DEBUG){ qDebug() << "Done Starting WM session..."; }
-}
-
-// ==========
-// Public Slots
-// ==========
-void WMSession::reloadIcons(){
-
-}
-
-void WMSession::newInputsAvailable(QStringList inputs){
- for(int i=0; i<inputs.length(); i++){
- if(inputs[i]=="--lock-now" || inputs[i]=="--test-ss"){
- QTimer::singleShot(0,SS, SLOT(LockScreenNow()) );
- }
- }
-}
diff --git a/src-qt5/core/lumina-desktop-unified/src-WM/WMSession.h b/src-qt5/core/lumina-desktop-unified/src-WM/WMSession.h
deleted file mode 100644
index 5b511326..00000000
--- a/src-qt5/core/lumina-desktop-unified/src-WM/WMSession.h
+++ /dev/null
@@ -1,42 +0,0 @@
-//===========================================
-// Lumina-DE source code
-// Copyright (c) 2015, Ken Moore
-// Available under the 3-clause BSD license
-// See the LICENSE file for full details
-//===========================================
-#ifndef _LUMINA_DESKTOP_WINDOW_MANAGER_SESSION_H
-#define _LUMINA_DESKTOP_WINDOW_MANAGER_SESSION_H
-
-#include "GlobalDefines.h"
-
-#include "LScreenSaver.h"
-#include "LXcbEventFilter.h"
-#include "LWindowManager.h"
-
-class WMSession : public QObject{
- Q_OBJECT
-public:
- WMSession();
- ~WMSession();
-
- void start(bool SSONLY = false);
-
-private:
- //XCB Event Watcher
- EventFilter *EFILTER;
- //ScreenSaver
- LScreenSaver *SS;
- //Window Manager
- LWindowManager *WM;
-
- QThread *EVThread; //X Event thread
-
-public slots:
- void reloadIcons();
- void newInputsAvailable(QStringList);
-
-private slots:
-
-};
-
-#endif \ No newline at end of file
diff --git a/src-qt5/core/lumina-desktop-unified/src-WM/lumina-wm.pro b/src-qt5/core/lumina-desktop-unified/src-WM/lumina-wm.pro
deleted file mode 100644
index 928f8744..00000000
--- a/src-qt5/core/lumina-desktop-unified/src-WM/lumina-wm.pro
+++ /dev/null
@@ -1,107 +0,0 @@
-include("$${PWD}/../../OS-detect.pri")
-
-QT += core gui network
-greaterThan(QT_MAJOR_VERSION, 4): QT += widgets x11extras
-
-TARGET = lumina-wm
-target.path = $${L_BINDIR}
-
-LIBS += -lLuminaUtils -lxcb -lxcb-damage -lxcb-composite -lxcb-screensaver -lxcb-util
-
-DEPENDPATH += ../libLumina
-
-SOURCES += main.cpp \
- WMSession.cpp \
- LScreenSaver.cpp \
- SSBaseWidget.cpp \
- LLockScreen.cpp \
- LXcbEventFilter.cpp \
- LWindow.cpp \
- LWindowManager.cpp
-
-
-HEADERS += GlobalDefines.h \
- WMSession.h \
- LScreenSaver.h \
- SSBaseWidget.h \
- LLockScreen.h \
- LXcbEventFilter.h \
- LWindow.h \
- LWindowManager.h
-
-FORMS += LLockScreen.ui
-
-#Now add in all the screensaver animation plugins
-include(animations/animations.pri)
-
-TRANSLATIONS = i18n/lumina-wm_af.ts \
- i18n/lumina-wm_ar.ts \
- i18n/lumina-wm_az.ts \
- i18n/lumina-wm_bg.ts \
- i18n/lumina-wm_bn.ts \
- i18n/lumina-wm_bs.ts \
- i18n/lumina-wm_ca.ts \
- i18n/lumina-wm_cs.ts \
- i18n/lumina-wm_cy.ts \
- i18n/lumina-wm_da.ts \
- i18n/lumina-wm_de.ts \
- i18n/lumina-wm_el.ts \
- i18n/lumina-wm_en_GB.ts \
- i18n/lumina-wm_en_ZA.ts \
- i18n/lumina-wm_es.ts \
- i18n/lumina-wm_et.ts \
- i18n/lumina-wm_eu.ts \
- i18n/lumina-wm_fa.ts \
- i18n/lumina-wm_fi.ts \
- i18n/lumina-wm_fr.ts \
- i18n/lumina-wm_fr_CA.ts \
- i18n/lumina-wm_gl.ts \
- i18n/lumina-wm_he.ts \
- i18n/lumina-wm_hi.ts \
- i18n/lumina-wm_hr.ts \
- i18n/lumina-wm_hu.ts \
- i18n/lumina-wm_id.ts \
- i18n/lumina-wm_is.ts \
- i18n/lumina-wm_it.ts \
- i18n/lumina-wm_ja.ts \
- i18n/lumina-wm_ka.ts \
- i18n/lumina-wm_ko.ts \
- i18n/lumina-wm_lt.ts \
- i18n/lumina-wm_lv.ts \
- i18n/lumina-wm_mk.ts \
- i18n/lumina-wm_mn.ts \
- i18n/lumina-wm_ms.ts \
- i18n/lumina-wm_mt.ts \
- i18n/lumina-wm_nb.ts \
- i18n/lumina-wm_nl.ts \
- i18n/lumina-wm_pa.ts \
- i18n/lumina-wm_pl.ts \
- i18n/lumina-wm_pt.ts \
- i18n/lumina-wm_pt_BR.ts \
- i18n/lumina-wm_ro.ts \
- i18n/lumina-wm_ru.ts \
- i18n/lumina-wm_sk.ts \
- i18n/lumina-wm_sl.ts \
- i18n/lumina-wm_sr.ts \
- i18n/lumina-wm_sv.ts \
- i18n/lumina-wm_sw.ts \
- i18n/lumina-wm_ta.ts \
- i18n/lumina-wm_tg.ts \
- i18n/lumina-wm_th.ts \
- i18n/lumina-wm_tr.ts \
- i18n/lumina-wm_uk.ts \
- i18n/lumina-wm_uz.ts \
- i18n/lumina-wm_vi.ts \
- i18n/lumina-wm_zh_CN.ts \
- i18n/lumina-wm_zh_HK.ts \
- i18n/lumina-wm_zh_TW.ts \
- i18n/lumina-wm_zu.ts
-
-dotrans.path=$${L_SHAREDIR}/lumina-desktop/i18n/
-dotrans.extra=cd i18n && $${LRELEASE} -nounfinished *.ts && cp *.qm $(INSTALL_ROOT)$${L_SHAREDIR}/lumina-desktop/i18n/
-
-INSTALLS += target
-
-WITH_I18N{
- INSTALLS += dotrans
-}
diff --git a/src-qt5/core/lumina-desktop-unified/src-WM/main.cpp b/src-qt5/core/lumina-desktop-unified/src-WM/main.cpp
deleted file mode 100644
index 02e48b7b..00000000
--- a/src-qt5/core/lumina-desktop-unified/src-WM/main.cpp
+++ /dev/null
@@ -1,56 +0,0 @@
-//===========================================
-// Lumina-DE source code
-// Copyright (c) 2015, Ken Moore
-// Available under the 3-clause BSD license
-// See the LICENSE file for full details
-//===========================================
-
-#include "GlobalDefines.h"
-//Initialize any global structures here
-LXCB *LWM::SYSTEM = 0;
-
-//Local includes
-#include "WMSession.h"
-#include "LWindow.h"
-#include <QDialog>
-
-
-//#define DEBUG 0
-int main(int argc, char ** argv)
-{
- qDebug() << "Starting lumina-wm...";
- LTHEME::LoadCustomEnvSettings();
- LSingleApplication a(argc, argv, "lumina-wm");
- if(!a.isPrimaryProcess()){ return 0; } //Inputs forwarded on to the primary already
- LuminaThemeEngine themes(&a);
-
- //Setup the global structures
- LWM::SYSTEM = new LXCB();
- if( a.inputlist.contains("--test-win") ){
- //Simple override to test out the window class
- qDebug() << "Starting window test...";
- QLabel dlg(0, Qt::Window | Qt::BypassWindowManagerHint); //this test should be ignored by the current WM
- dlg.setText("Sample Window");
- dlg.setWindowTitle("Test");
- dlg.resize(200,100);
- dlg.setStyleSheet("background: rgba(255,255,255,100); color: black;");
- dlg.move(100,100);
- dlg.show();
- //dlg.move(100,100);
- qDebug() << " - Loading window frame...";
- LWindow win(dlg.winId()); //have it wrap around the dialog
- qDebug() << " - Show frame...";
- win.frame()->windowChanged(LWM::Show);
- qDebug() << " - Start event loop...";
- a.setQuitOnLastWindowClosed(true);
- return a.exec();
- }
- WMSession w;
- w.start(a.inputlist.contains("--test-ss"));
- QObject::connect(&themes, SIGNAL(updateIcons()), &w, SLOT(reloadIcons()) );
- QObject::connect(&a, SIGNAL(InputsAvailable(QStringList)), &w, SLOT(newInputsAvailable(QStringList)) );
- if(!a.inputlist.isEmpty()){ w.newInputsAvailable(a.inputlist); }
- int retCode = a.exec();
-
- return retCode;
-}
diff --git a/src-qt5/core/lumina-desktop-unified/src-desktop/ContextMenu.cpp b/src-qt5/core/lumina-desktop-unified/src-desktop/ContextMenu.cpp
index e363af01..c3e9a1db 100644
--- a/src-qt5/core/lumina-desktop-unified/src-desktop/ContextMenu.cpp
+++ b/src-qt5/core/lumina-desktop-unified/src-desktop/ContextMenu.cpp
@@ -13,13 +13,13 @@ void DesktopContextMenu::SettingsChanged(DesktopSettings::File file){
void DesktopContextMenu::UpdateMenu(){
//Put a label at the top
- unsigned int num = Lumina::EFILTER->currentWorkspace(); //LX11::GetCurrentDesktop();
+ unsigned int num = Lumina::NWS->currentWorkspace();
workspaceLabel->setText( "<b>"+QString(tr("Workspace %1")).arg(QString::number(num+1))+"</b>");
this->clear(); //clear it for refresh
this->addAction(wkspaceact);
this->addSeparator();
//Now load the user's menu setup and fill the menu
- QStringList items = Lumina::SETTINGS->value(DesktopSettings::ContextMenu, "itemlist", QStringList()<< "terminal" << "filemanager" << "line" << "settings" <<"lockdesktop").toStringList();
+ QStringList items = DesktopSettings::instance()->value(DesktopSettings::ContextMenu, "itemlist", QStringList()<< "terminal" << "filemanager" << "line" << "settings" <<"lockdesktop").toStringList();
//usewinmenu=false;
for(int i=0; i<items.length(); i++){
if(items[i]=="terminal"){ this->addAction(LXDG::findIcon("utilities-terminal",""), tr("Terminal"))->setWhatsThis("lumina-open -terminal"); }
@@ -76,7 +76,7 @@ DesktopContextMenu::~DesktopContextMenu(){
}
void DesktopContextMenu::start(){
- connect(Lumina::SETTINGS, SIGNAL(FileModified(DesktopSettings::File)), this, SLOT(SettingsChanged(DesktopSettings::File)) );
+ connect(DesktopSettings::instance(), SIGNAL(FileModified(DesktopSettings::File)), this, SLOT(SettingsChanged(DesktopSettings::File)) );
connect(this, SIGNAL(LockSession()), Lumina::SS, SLOT(LockScreenNow()) );
//Still need to connect to some "workspaceChanged(int)" signal
@@ -85,6 +85,7 @@ void DesktopContextMenu::start(){
// === PRIVATE SLOTS ===
void DesktopContextMenu::LaunchAction(QAction *act){
+ //qDebug() << "Launch Action Triggered:" << act->whatsThis();
if(act->whatsThis().isEmpty() || act->parent()!=this ){ return; }
qDebug() << "Launch Menu Action:" << act->whatsThis();
QString cmd = act->whatsThis();
diff --git a/src-qt5/core/lumina-desktop-unified/src-desktop/ContextMenu.h b/src-qt5/core/lumina-desktop-unified/src-desktop/ContextMenu.h
index 8b0509fb..1e3165ec 100644
--- a/src-qt5/core/lumina-desktop-unified/src-desktop/ContextMenu.h
+++ b/src-qt5/core/lumina-desktop-unified/src-desktop/ContextMenu.h
@@ -19,7 +19,7 @@ private:
QLabel *workspaceLabel;
QWidgetAction *wkspaceact;
-public:
+public:
DesktopContextMenu(QWidget *parent = 0);
~DesktopContextMenu();
diff --git a/src-qt5/core/lumina-desktop-unified/src-events/LShortcutEvents.cpp b/src-qt5/core/lumina-desktop-unified/src-events/LShortcutEvents.cpp
index b09a1a5b..3d50112c 100644
--- a/src-qt5/core/lumina-desktop-unified/src-events/LShortcutEvents.cpp
+++ b/src-qt5/core/lumina-desktop-unified/src-events/LShortcutEvents.cpp
@@ -25,18 +25,9 @@ void LShortcutEvents::start(){
clearTimer->setSingleShot(true);
connect(clearTimer, SIGNAL(timeout()), this, SLOT(clearKeys()) );
}
- //Now connect this object to the global EFILTER object signals
- connect(Lumina::EFILTER, SIGNAL(KeyPressed(WId, int)), this, SLOT(KeyPress(WId, int)) );
- connect(Lumina::EFILTER, SIGNAL(KeyReleased(WId, int)), this, SLOT(KeyRelease(WId, int)) );
- connect(Lumina::EFILTER, SIGNAL(MousePressed(WId, Lumina::MouseButton)), this, SLOT(MousePress(WId, Lumina::MouseButton)) );
- connect(Lumina::EFILTER, SIGNAL(MouseReleased(WId, Lumina::MouseButton)), this, SLOT(MouseRelease(WId, Lumina::MouseButton)) );
}
void LShortcutEvents::stop(){
- disconnect(Lumina::EFILTER, SIGNAL(KeyPressed(WId, int)), this, SLOT(KeyPress(WId, int)) );
- disconnect(Lumina::EFILTER, SIGNAL(KeyReleased(WId, int)), this, SLOT(KeyRelease(WId, int)) );
- disconnect(Lumina::EFILTER, SIGNAL(MousePressed(WId, Lumina::MouseButton)), this, SLOT(MousePress(WId, Lumina::MouseButton)) );
- disconnect(Lumina::EFILTER, SIGNAL(MouseReleased(WId, Lumina::MouseButton)), this, SLOT(MouseRelease(WId, Lumina::MouseButton)) );
clearKeys();
}
@@ -46,11 +37,11 @@ void LShortcutEvents::CheckKeySequence(WId win){
QString shortcut = keylistToString();
//Now see if there is a match for this shortcut
// "strict" actions (operate even if a non-desktop window is active/focused)
- QString action = Lumina::SETTINGS->value(DesktopSettings::Keys, "strict/"+shortcut, "").toString();
+ QString action = DesktopSettings::instance()->value(DesktopSettings::Keys, "strict/"+shortcut, "").toString();
qDebug() << "Strict Action:" << "strict/"+shortcut << action;
if(action.isEmpty() && win==0){
//"loose" actions (operating on the desktop or root window itself)
- action = Lumina::SETTINGS->value(DesktopSettings::Keys, "desktop/"+shortcut, "").toString();
+ action = DesktopSettings::instance()->value(DesktopSettings::Keys, "desktop/"+shortcut, "").toString();
qDebug() << "Desktop Action:" << "desktop/"+shortcut << action;
}
if(!action.isEmpty()){
@@ -59,42 +50,42 @@ void LShortcutEvents::CheckKeySequence(WId win){
}
}
-void LShortcutEvents::CheckMouseSequence(WId win, Lumina::MouseButton button, bool release){
- if(release && (button == Lumina::WheelUp || button == Lumina::WheelDown || button == Lumina::WheelLeft || button == Lumina::WheelRight)){
+void LShortcutEvents::CheckMouseSequence(WId win, NativeWindowSystem::MouseButton button, bool release){
+ if(release && (button == NativeWindowSystem::WheelUp || button == NativeWindowSystem::WheelDown || button == NativeWindowSystem::WheelLeft || button == NativeWindowSystem::WheelRight)){
return; //skip mouse release events for wheel actions (always come in pairs of press/release)
- }else if(keylist.isEmpty() || button == Lumina::NoButton){ return; } //Never overwrite mouse clicks themselves - just combinations with key presses
+ }else if(keylist.isEmpty() || button == NativeWindowSystem::NoButton){ return; } //Never overwrite mouse clicks themselves - just combinations with key presses
//Get the keyboard modifiers
QString shortcut = keylistToString();
//Add the mouse button to the shortcut
switch(button){
- case Lumina::LeftButton:
+ case NativeWindowSystem::LeftButton:
shortcut.append("+LeftMouse");
break;
- case Lumina::RightButton:
+ case NativeWindowSystem::RightButton:
shortcut.append("+RightMouse");
break;
- case Lumina::MidButton:
+ case NativeWindowSystem::MidButton:
shortcut.append("+MiddleMouse");
break;
- case Lumina::BackButton:
+ case NativeWindowSystem::BackButton:
shortcut.append("+BackMouse");
break;
- case Lumina::ForwardButton:
+ case NativeWindowSystem::ForwardButton:
shortcut.append("+ForwardMouse");
break;
- case Lumina::TaskButton:
+ case NativeWindowSystem::TaskButton:
shortcut.append("+TaskMouse");
break;
- case Lumina::WheelUp:
+ case NativeWindowSystem::WheelUp:
shortcut.append("+WheelUp");
break;
- case Lumina::WheelDown:
+ case NativeWindowSystem::WheelDown:
shortcut.append("+WheelDown");
break;
- case Lumina::WheelLeft:
+ case NativeWindowSystem::WheelLeft:
shortcut.append("+WheelLeft");
break;
- case Lumina::WheelRight:
+ case NativeWindowSystem::WheelRight:
shortcut.append("+WheelRight");
break;
default:
@@ -103,10 +94,10 @@ void LShortcutEvents::CheckMouseSequence(WId win, Lumina::MouseButton button, bo
if(shortcut.isEmpty()){ return; }
//Now see if there is a match for this shortcut
// "strict" actions (operate even if a non-desktop window is active/focused)
- QString action = Lumina::SETTINGS->value(DesktopSettings::Keys, "strict/"+shortcut, "").toString();
+ QString action = DesktopSettings::instance()->value(DesktopSettings::Keys, "strict/"+shortcut, "").toString();
if(action.isEmpty() && win==0){
//"loose" actions (operating on the desktop or root window itself)
- action = Lumina::SETTINGS->value(DesktopSettings::Keys, "desktop/"+shortcut, "").toString();
+ action = DesktopSettings::instance()->value(DesktopSettings::Keys, "desktop/"+shortcut, "").toString();
}
if(!action.isEmpty()){
//Found a valid action - go ahead and evaluate it
@@ -115,23 +106,44 @@ void LShortcutEvents::CheckMouseSequence(WId win, Lumina::MouseButton button, bo
}
QString LShortcutEvents::keylistToString(){
+ if(keylist.isEmpty()){ return ""; }
QString shortcut;
+ QList<int> keys; int ckey = 0;
for(int i=0; i<keylist.length(); i++){
- if(i>0){ shortcut.append("+"); }
- shortcut.append( QString::number(keylist[i]) );
+ if(i == keylist.length()-1){ ckey+=keylist[i]; } //always treat the last key as a non-modifier
+ else if(keylist[i] == Qt::Key_Control){ ckey+=Qt::CTRL; } //use the modifier form of the key
+ else if(keylist[i] == Qt::Key_Alt){ ckey += Qt::ALT; }
+ else if(keylist[i] == Qt::Key_Shift){ ckey += Qt::SHIFT; }
+ else if(keylist[i] == Qt::Key_Meta){ ckey += Qt::META; }
+ else{ ckey+= keylist[i]; keys << ckey; ckey = 0; } //non-modifier - need to finish current mod+key combo and start a new one
+ }
+ if(ckey!=0){ keys << ckey; } //add in the last one as well
+ if(keys.length() < 1){ return ""; }
+ QKeySequence seq;
+ switch(keys.length()){
+ case 1:
+ seq = QKeySequence(keys[0]); break;
+ case 2:
+ seq = QKeySequence(keys[0], keys[1]); break;
+ case 3:
+ seq = QKeySequence(keys[0], keys[1], keys[2]); break;
+ default:
+ seq = QKeySequence(keys[0],keys[1], keys[2], keys[3]); break;
}
/*qDebug() << "KeyList to String:";
- qDebug() << " keys:" << keylist;
- qDebug() << " string:" << shortcut;*/
- return shortcut;
+ qDebug() << " keys:" << seq;
+ qDebug() << " string:" << seq.toString();*/
+ return seq.toString();
}
void LShortcutEvents::evaluateShortcutAction(QString action){
qDebug() << "Found Shortcut Action:" << action;
evaluated = true;
- if(action.startsWith("Exec=")){
- emit LaunchApplication(action.section("=",1,-1));
+ if(action.startsWith("Exec:")){
+ emit LaunchApplication(action.section(":",1,-1));
return;
+ }else if(action.startsWith("Launch:")){
+ emit LaunchStandardApplication(action.section(":",1,-1));
}
//Specific Internal actions
action = action.toLower();
@@ -140,13 +152,14 @@ void LShortcutEvents::evaluateShortcutAction(QString action){
else if(action=="reboot"){ emit StartReboot(); }
else if(action=="shutdown"){ emit StartShutdown(); }
else if(action=="show_leave_options"){ emit OpenLeaveDialog(); }
+ else if(action=="lockscreen"){ emit LockSession(); }
}
// === PUBLIC SLOTS ===
-void LShortcutEvents::KeyPress(WId window, int key){
+void LShortcutEvents::KeyPress(WId window, Qt::Key key){
if(window!=WIN){ keylist.clear(); WIN = window; }
- if(!keylist.contains(key)){
+ /*if(!keylist.contains(key)){
//Put it in the list in ascending order
bool found = false;
for(int i=0; i<keylist.length() && !found; i++){
@@ -154,28 +167,35 @@ void LShortcutEvents::KeyPress(WId window, int key){
}
if(!found){ keylist << key; }
evaluated = false;
+ }*/
+ if(!keylist.isEmpty()){
+ if( keylist.last()!=key ){ keylist << key; }
+ }else{
+ keylist << key;
}
//Evaluate the key sequence only when the first one is released
- clearTimer->start(); //will "restart" if already running
+ clearTimer->start(); //will "restart" if already running
}
-void LShortcutEvents::KeyRelease(WId window, int key){
+void LShortcutEvents::KeyRelease(WId window, Qt::Key key){
if(window!=WIN){ keylist.clear(); return; }
if(!evaluated){ CheckKeySequence(WIN); } //run this "before" removing the key from the list
- keylist.removeAll(key);
- clearTimer->start(); //will "restart" if already running
+ for(int i=keylist.length()-1; i>=0; i--){
+ if(keylist[i] == key){ keylist.removeAt(i); break; }
+ }
+ clearTimer->start(); //will "restart" if already running
}
-void LShortcutEvents::MousePress(WId window, Lumina::MouseButton button){
+void LShortcutEvents::MousePress(WId window, NativeWindowSystem::MouseButton button){
//We do not provide shortcuts for combinations of mouse buttons - just mouse+keyboard combinations
CheckMouseSequence(window, button, false);
- clearTimer->start(); //will "restart" if already running
+ clearTimer->start(); //will "restart" if already running
}
-void LShortcutEvents::MouseRelease(WId window, Lumina::MouseButton button){
+void LShortcutEvents::MouseRelease(WId window, NativeWindowSystem::MouseButton button){
//We do not provide shortcuts for combinations of mouse buttons - just mouse+keyboard combinations
CheckMouseSequence(window, button, true);
- clearTimer->start(); //will "restart" if already running
+ clearTimer->start(); //will "restart" if already running
}
void LShortcutEvents::clearKeys(){
diff --git a/src-qt5/core/lumina-desktop-unified/src-events/LShortcutEvents.h b/src-qt5/core/lumina-desktop-unified/src-events/LShortcutEvents.h
index d1c3b4e0..4560cb1f 100644
--- a/src-qt5/core/lumina-desktop-unified/src-events/LShortcutEvents.h
+++ b/src-qt5/core/lumina-desktop-unified/src-events/LShortcutEvents.h
@@ -22,22 +22,22 @@ public:
void stop();
private:
- QList<int> keylist; //keys currently held down (NOTE: QKeySequence has a max of 4 keys for combinations)
+ QList< Qt::Key > keylist; //keys currently held down
WId WIN; //current window being acted on by the keys
QTimer *clearTimer; //used to clear the internal keylist every once in a while if no events come in.
bool evaluated;
//Actual check functions
void CheckKeySequence(WId win);
- void CheckMouseSequence(WId win, Lumina::MouseButton, bool release);
+ void CheckMouseSequence(WId win, NativeWindowSystem::MouseButton, bool release);
QString keylistToString();
void evaluateShortcutAction(QString action);
public slots:
- void KeyPress(WId window, int key);
- void KeyRelease(WId window, int key);
- void MousePress(WId window, Lumina::MouseButton);
- void MouseRelease(WId window, Lumina::MouseButton);
+ void KeyPress(WId window, Qt::Key key);
+ void KeyRelease(WId window, Qt::Key key);
+ void MousePress(WId window, NativeWindowSystem::MouseButton);
+ void MouseRelease(WId window, NativeWindowSystem::MouseButton);
void clearKeys();
signals:
@@ -50,7 +50,7 @@ signals:
// Session Options
void ChangeWorkspace(int); // +/- 1 from current
void LockSession();
-
+
//Active Window Options
void ActiveWindowMoveToWorkspace(int); //number of workspace
void ActiveWindowTakeToWorkspace(int); //number of workspace
@@ -66,6 +66,7 @@ signals:
//General Utility Launch
void LaunchApplication(QString exec);
+ void LaunchStandardApplication(QString app); //standard app like "terminal", "browser", "email", "settings", etc..
};
diff --git a/src-qt5/core/lumina-desktop-unified/src-events/LXcbEventFilter.cpp b/src-qt5/core/lumina-desktop-unified/src-events/LXcbEventFilter.cpp
deleted file mode 100644
index 7031f3df..00000000
--- a/src-qt5/core/lumina-desktop-unified/src-events/LXcbEventFilter.cpp
+++ /dev/null
@@ -1,500 +0,0 @@
-//===========================================
-// Lumina-desktop source code
-// Copyright (c) 2015-2017, Ken Moore
-// Available under the 3-clause BSD license
-// See the LICENSE file for full details
-//===========================================
-#include "LXcbEventFilter.h"
-
-#include <xcb/xcb_aux.h>
-#include <xcb/damage.h>
-
-//==================================================
-// NOTE: All the XCB interactions and atoms are accessed via:
-// obj->XCB->EWMH.(atom name)
-// obj->XCB->(do something)
-//==================================================
-#include "global-objects.h"
-
-//SYSTEM TRAY STANDARD DEFINITIONS
-#define SYSTEM_TRAY_REQUEST_DOCK 0
-#define SYSTEM_TRAY_BEGIN_MESSAGE 1
-#define SYSTEM_TRAY_CANCEL_MESSAGE 2
-
-#include <xcb/xcb_keysyms.h>
-
-#define DEBUG 0
-
-// Also keep the root window/screen around for use in the filters
-namespace L_XCB{
- xcb_screen_t *root_screen;
- xcb_window_t root;
-}
-
-//Constructor for the Event Filter wrapper
-EventFilter::EventFilter() : QObject(){
- XCB = new LXCB();
- EF = new XCBEventFilter(this);
- L_XCB::root_screen = xcb_aux_get_screen(QX11Info::connection(), QX11Info::appScreen());
- L_XCB::root = L_XCB::root_screen->root;
- WMFlag = 0;
-}
-
-void EventFilter::start(){
- if(DEBUG){ qDebug() << " - Install event filter..."; }
- QCoreApplication::instance()->installNativeEventFilter(EF);
- if(DEBUG){ qDebug() << " - Run request check..."; }
- if(!XCB->setupEventsForRoot()){
- qCritical() << "[ERROR] Unable to setup WM event retrieval. Is another WM running?";
- exit(1);
- }
- if(DEBUG){ qDebug() << " - Create WM ID Window"; }
- WMFlag = XCB->WM_CreateWindow();
- XCB->setupEventsForRoot(WMFlag);
- XCB->WM_Set_Supporting_WM(WMFlag);
-
- XCB->WM_Set_Root_Supported(); //announce all the various options that the WM supports
- static_cast<XCBEventFilter*>(EF)->startSystemTray();
-
- QCoreApplication::instance()->flush();
-}
-
-void EventFilter::stop(){
- static_cast<XCBEventFilter*>(EF)->stopSystemTray();
-}
-
-//Session Interaction/Information
-QList<WId> EventFilter::currentTrayApps(){
- return static_cast<XCBEventFilter*>(EF)->trayApps();
-}
-
-unsigned int EventFilter::currentWorkspace(){
-return XCB->CurrentWorkspace();
-}
-
-QList<NativeWindow*> EventFilter::currentWindows(){
- return static_cast<XCBEventFilter*>(EF)->windowList();
-}
-
-// === PUBLIC SLOTS ===
-void EventFilter::RegisterVirtualRoot(WId id){
- XCB->WM_Set_Virtual_Roots( QList<WId>() << id );
-}
-
-void EventFilter::TryCloseWindow(WId id){
- XCB->WM_CloseWindow(id, false); //do not force close
-}
-
-void EventFilter::TryActivateWindow(WId id){
- XCB->WM_Set_Active_Window(id);
-}
-//=============================
-// XCBEventFilter Class
-//=============================
-
-//Constructor for the XCB event filter
-XCBEventFilter::XCBEventFilter(EventFilter *parent) : QAbstractNativeEventFilter(){
- obj = parent;
- SystemTrayID = 0;
- TrayDmgID = 0;
- InitAtoms();
-}
-
-void XCBEventFilter::InitAtoms(){
- //Initialize any special atoms that we need to save/use regularly
- //NOTE: All the EWMH atoms are already saved globally in obj->XCB->EWMH
- WinNotifyAtoms.clear();
- WinNotifyAtoms << obj->XCB->EWMH._NET_WM_NAME \
- << obj->XCB->EWMH._NET_WM_VISIBLE_NAME \
- << obj->XCB->EWMH._NET_WM_ICON_NAME \
- << obj->XCB->EWMH._NET_WM_VISIBLE_ICON_NAME \
- << obj->XCB->EWMH._NET_WM_ICON \
- << obj->XCB->EWMH._NET_WM_ICON_GEOMETRY;
-
- SysNotifyAtoms.clear();
- SysNotifyAtoms << obj->XCB->EWMH._NET_CLIENT_LIST \
- << obj->XCB->EWMH._NET_CLIENT_LIST_STACKING \
- << obj->XCB->EWMH._NET_CURRENT_DESKTOP \
- << obj->XCB->EWMH._NET_WM_STATE \
- << obj->XCB->EWMH._NET_ACTIVE_WINDOW \
- << obj->XCB->EWMH._NET_WM_ICON \
- << obj->XCB->EWMH._NET_WM_ICON_GEOMETRY;
-
- //_NET_SYSTEM_TRAY_OPCODE
- xcb_intern_atom_cookie_t cookie = xcb_intern_atom(QX11Info::connection(), 0, 23,"_NET_SYSTEM_TRAY_OPCODE");
- xcb_intern_atom_reply_t *r = xcb_intern_atom_reply(QX11Info::connection(), cookie, NULL);
- if(r){
- _NET_SYSTEM_TRAY_OPCODE = r->atom;
- free(r);
- }
-}
-
-//This function format taken directly from the Qt5.3 documentation
-bool XCBEventFilter::nativeEventFilter(const QByteArray &eventType, void *message, long *){
- //if(stopping){ return false; } //don't do any parsing
- //qDebug() << "New Event";
- bool stopevent = false;
- if(eventType=="xcb_generic_event_t"){
- //Convert to known event type (for X11 systems)
- xcb_generic_event_t *ev = static_cast<xcb_generic_event_t *>(message);
- //Now parse the event and emit signals as necessary
- switch( ev->response_type & ~0x80){
-//==============================
-// INTERACTIVITY EVENTS
-//==============================
- case XCB_KEY_PRESS:
- //This is a keyboard key press
- //qDebug() << "Key Press Event";
- stopevent = BlockInputEvent( ((xcb_key_press_event_t *) ev)->root ); //use the main "root" window - not the child widget
- if(!stopevent){ obj->emit KeyPressed( InputWindow(((xcb_key_press_event_t *) ev)->root), ((xcb_key_press_event_t *) ev)->detail ); }
- break;
- case XCB_KEY_RELEASE:
- //This is a keyboard key release
- //qDebug() << "Key Release Event";
- stopevent = BlockInputEvent( ((xcb_key_release_event_t *) ev)->root ); //use the main "root" window - not the child widget
- if(!stopevent){ obj->emit KeyReleased( InputWindow(((xcb_key_release_event_t *) ev)->root), ((xcb_key_release_event_t *) ev)->detail ); }
- break;
- case XCB_BUTTON_PRESS:
- //This is a mouse button press
- qDebug() << "Button Press Event";
- stopevent = BlockInputEvent( ((xcb_button_press_event_t *) ev)->root ); //use the main "root" window - not the child widget
- if(!stopevent){
- //Activate the window right now if needed
- obj->emit MousePressed( InputWindow(((xcb_button_press_event_t *) ev)->root), MouseKey(((xcb_key_press_event_t *) ev)->detail) );
- if(obj->XCB->WM_Get_Active_Window()!=((xcb_button_press_event_t *) ev)->root){
- obj->XCB->WM_Set_Active_Window( ((xcb_button_press_event_t *) ev)->root);
- }
- }
- break;
- case XCB_BUTTON_RELEASE:
- //This is a mouse button release
- qDebug() << "Button Release Event";
- //xcb_button_release_event_t *tmp = (xcb_button_release_event_t *)ev;
- stopevent = BlockInputEvent( ((xcb_button_release_event_t *) ev)->root ); //use the main "root" window - not the child widget
- if(!stopevent){ obj->emit MouseReleased( InputWindow(((xcb_button_release_event_t *) ev)->root), MouseKey(((xcb_key_press_event_t *) ev)->detail) ); }
- break;
- case XCB_MOTION_NOTIFY:
- //This is a mouse movement event
- //qDebug() << "Motion Notify Event";
- stopevent = BlockInputEvent( ((xcb_motion_notify_event_t *) ev)->root ); //use the main "root" window - not the child widget);
- break;
- case XCB_ENTER_NOTIFY:
- //This is a mouse movement event when mouse goes over a new window
- //qDebug() << "Enter Notify Event";
- stopevent = BlockInputEvent( ((xcb_enter_notify_event_t *) ev)->root );
- break;
- case XCB_LEAVE_NOTIFY:
- //This is a mouse movement event when mouse goes leaves a window
- //qDebug() << "Leave Notify Event";
- stopevent = BlockInputEvent();
- break;
-//==============================
- case XCB_EXPOSE:
- //qDebug() << "Expose Notify Event:";
- //qDebug() << " - Given Window:" << ((xcb_property_notify_event_t*)ev)->window;
- break;
-//==============================
- case XCB_MAP_NOTIFY:
- //qDebug() << "Window Map Event:" << ((xcb_map_notify_event_t *)ev)->window;
- if(Lumina::SS->isLocked()){ waitingToShow << ((xcb_map_notify_event_t *)ev)->window ; }
- else{
- for(int i=0; i<windows.length(); i++){
- if(windows[i]->id() == ((xcb_map_notify_event_t *)ev)->window){ windows[i]->setProperty(NativeWindow::Visible, true); break; }
- }
- }
- break; //This is just a notification that a window was mapped - nothing needs to change here
- case XCB_MAP_REQUEST:
- //qDebug() << "Window Map Request Event";
- SetupNewWindow( ((xcb_map_request_event_t *) ev) );
- break;
-//==============================
- case XCB_CREATE_NOTIFY:
- //qDebug() << "Window Create Event";
- break;
-//==============================
- case XCB_UNMAP_NOTIFY:
- //qDebug() << "Window Unmap Event:" << ((xcb_unmap_notify_event_t *)ev)->window;
- if(waitingToShow.contains(((xcb_unmap_notify_event_t *)ev)->window)){ waitingToShow.removeAll(((xcb_unmap_notify_event_t *)ev)->window); }
- for(int i=0; i<windows.length(); i++){
- if(windows[i]->id() == ((xcb_unmap_notify_event_t *)ev)->window){ windows[i]->setProperty(NativeWindow::Visible, false); break; }
- }
- break;
-//==============================
- case XCB_DESTROY_NOTIFY:
- //qDebug() << "Window Closed Event:" << ((xcb_destroy_notify_event_t *)ev)->window;
- if( !rmTrayApp( ((xcb_destroy_notify_event_t *) ev)->window ) ){
- //qDebug() <<" - Non-tray window";
- for(int i=0; i<windows.length(); i++){
- if(windows[i]->id() == ((xcb_destroy_notify_event_t *)ev)->window){
- windows[i]->emit WindowClosed(windows[i]->id());
- QTimer::singleShot(500, windows.takeAt(i), SLOT(deleteLater()) ); //give a few moments first, then clean up the object
- break;
- }
- }
- }
- break;
-//==============================
- case XCB_FOCUS_IN:
- //qDebug() << "Focus In Event:";
- break;
-//==============================
- case XCB_FOCUS_OUT:
- //qDebug() << "Focus Out Event:";
- break;
-//==============================
- case XCB_PROPERTY_NOTIFY:
- //qDebug() << "Property Notify Event:";
- ParsePropertyEvent((xcb_property_notify_event_t*)ev);
- break;
-//==============================
- case XCB_CLIENT_MESSAGE:
- //qDebug() << "Client Message Event";
- //qDebug() << " - Given Window:" << ((xcb_client_message_event_t*)ev)->window;
- if( ((xcb_client_message_event_t*)ev)->type == _NET_SYSTEM_TRAY_OPCODE && ((xcb_client_message_event_t*)ev)->format == 32){
- //data32[0] is timestamp, [1] is opcode, [2] is window handle
- if(SYSTEM_TRAY_REQUEST_DOCK == ((xcb_client_message_event_t*)ev)->data.data32[1]){
- addTrayApp( ((xcb_client_message_event_t*)ev)->data.data32[2] );
- }
- //Ignore the System Tray messages at the moment
-
- }
- break;
-//==============================
- case XCB_CONFIGURE_NOTIFY:
- //qDebug() << "Configure Notify Event";
- break;
-//==============================
- case XCB_CONFIGURE_REQUEST:
- //qDebug() << "Configure Request Event";
- break;
-//==============================
- case XCB_SELECTION_CLEAR:
- //qDebug() << "Selection Clear Event";
- break;
-//==============================
- case 85: //not sure what event this is - but it seems to come up very often (just hide the notice)
- case 0:
- case XCB_GE_GENERIC:
- break; //generic event - don't do anything special
- default:
- //if( (ev->response_type & ~0x80)==TrayDmgID){
- checkDamageID( ((xcb_damage_notify_event_t*)ev)->drawable );
- //}else{
- qDebug() << "Default Event:" << (ev->response_type & ~0x80);
- //}
-//==============================
- }
- }
- return false;
- //never stop event handling (this will not impact the X events themselves - just the internal screensaver/WM/widgets)
-}
-
-//System Tray Functions
-QList<WId> XCBEventFilter::trayApps(){
- //return the list of all current tray apps
- //Check the validity of all the current tray apps (make sure nothing closed erratically)
- for(int i=0; i<RunningTrayApps.length(); i++){
- if(obj->XCB->WindowClass(RunningTrayApps[i]).isEmpty()){
- obj->emit Tray_AppClosed(RunningTrayApps.takeAt(i) );
- i--;
- }
- }
- return RunningTrayApps;
-}
-
-bool XCBEventFilter::startSystemTray(){
- if(SystemTrayID != 0){ return true; } //already started
- RunningTrayApps.clear(); //nothing running yet
- SystemTrayID = obj->XCB->startSystemTray(0);
- if(SystemTrayID!=0){
- obj->XCB->SelectInput(SystemTrayID); //make sure TrayID events get forwarded here
- TrayDmgID = obj->XCB->GenerateDamageID(SystemTrayID);
- qDebug() << "System Tray Started Successfully";
- if(DEBUG){ qDebug() << " - System Tray Flags:" << TrayDmgID; }
- }
- return (SystemTrayID!=0);
-}
-
-bool XCBEventFilter::stopSystemTray(){
- if(SystemTrayID==0){ return true; } //already stopped
- qDebug() << "Stopping system tray...";
- //Close all the running Tray Apps
- QList<WId> tmpApps = RunningTrayApps;
- //RunningTrayApps.clear(); //clear this ahead of time so tray's do not attempt to re-access the apps
- //Close all the running tray apps
- for(int i=0; i<tmpApps.length(); i++){
- qDebug() << " - Stopping tray app:" << obj->XCB->WindowClass(tmpApps[i]);
- //Tray apps are special and closing the window does not close the app
- obj->XCB->KillClient(tmpApps[i]);
- }
- //Now close down the tray backend
- obj->XCB->closeSystemTray(SystemTrayID);
- SystemTrayID = 0;
- TrayDmgID = 0;
- return true;
-}
-
-QList<NativeWindow*> XCBEventFilter::windowList(){
- return windows;
-}
-
-//=========
-// PRIVATE
-//=========
-bool XCBEventFilter::BlockInputEvent(WId){
- //Checks the current state of the WM and sets the stop flag as needed
- // - Always let the screensaver know about the event first (need to reset timers and such)
- obj->emit NewInputEvent();
- // - Check the state of the screensaver
- if(Lumina::SS->isLocked()){ qDebug() << "SS Locked"; return true; }
- // - Check the state of any fullscreen apps
- /*else if( win!=0 && !obj->FS_WINS.isEmpty()){
- if(!obj->FS_WINS.contains(win) ){
- //If this event is for an app underneath a fullscreen window - stop it
- if(obj->FS_WINS.length() == QApplication::desktop()->screenCount()){ qDebug() << "Screens Covered"; return true; } //all screens covered right now
- }
- }*/
- return false;
-}
-
-WId XCBEventFilter::InputWindow(WId win){
- //check window and see if it is a desktop/root window (return 0) or an external app window
- if(win == L_XCB::root){ return 0; }
- QString cl = obj->XCB->WindowClass(win);
- qDebug() << "Got Input Event on window:" << cl;
- if(cl.toLower()=="lumina-desktop"){ return 0; }
- return win; //external app window
-}
-
-Lumina::MouseButton XCBEventFilter::MouseKey(int keycode){
- switch(keycode){
- case 1:
- return Lumina::LeftButton;
- case 3:
- return Lumina::RightButton;
- case 2:
- return Lumina::MidButton;
- case 4:
- return Lumina::WheelUp;
- case 5:
- return Lumina::WheelDown;
- case 6:
- return Lumina::WheelLeft;
- case 7:
- return Lumina::WheelRight;
- case 8:
- return Lumina::BackButton; //Not sure if this is correct yet (1/27/17)
- case 9:
- return Lumina::ForwardButton; //Not sure if this is correct yet (1/27/17)
- default:
- return Lumina::NoButton;
- }
-}
-
-//System Tray functions
-void XCBEventFilter::addTrayApp(WId win){
- if(SystemTrayID==0){ return; }
- if(RunningTrayApps.contains(win)){ return; } //already managed
- qDebug() << "Session Tray: Window Added" << obj->XCB->WindowClass(win);
- RunningTrayApps << win;
- if(DEBUG){ qDebug() << "Tray List Changed"; }
- obj->emit Tray_AppAdded(win);
-}
-
-bool XCBEventFilter::rmTrayApp(WId win){
- //returns "true" if the tray app was found and removed
- if(SystemTrayID==0){ return false; }
- for(int i=0; i<RunningTrayApps.length(); i++){
- if(win==RunningTrayApps[i]){
- qDebug() << "Session Tray: Window Removed";
- RunningTrayApps.removeAt(i);
- obj->emit Tray_AppClosed(win);
- return true;
- }
- }
- return false;
-}
-
-void XCBEventFilter::checkDamageID(WId id){
- if(RunningTrayApps.contains(id)){
- obj->emit Tray_AppUpdated(id);
- }else{
- //Could check for window damage ID's - but we should not need this
- }
-}
-
-// WINDOW HANDLING FUNCTIONS
-void XCBEventFilter::SetupNewWindow(xcb_map_request_event_t *ev){
- WId win = ev->window;
-
- bool ok = obj->XCB->WM_ManageWindow(win, true);
- //Quick check if this is a transient window if we could not manage it directly
- if(!ok){
- WId tran = obj->XCB->WM_ICCCM_GetTransientFor(win);
- if(tran!=win && tran!=0){
- win = tran;
- ok = obj->XCB->WM_ManageWindow(win);
- }
- }
- qDebug() << "New Window:" << win << obj->XCB->WM_ICCCM_GetClass(win) << " Managed:" << ok;
- obj->XCB->WM_Set_Active_Window(win);
- //Determing the requested geometry/location/management within the event,
- NativeWindow *nwin = new NativeWindow(win);
- QObject::connect(nwin, SIGNAL(RequestClose(WId)), obj, SLOT(TryCloseWindow(WId)) );
- QObject::connect(nwin, SIGNAL(RequestActivate(WId)), obj, SLOT(TryActivateWindow(WId)) );
- windows << nwin;
- bool show_now = !Lumina::SS->isLocked();
- if(!show_now){ waitingToShow << win; } //add to the list to get set visible later
- //populate the native window settings as they are right now
- nwin->setProperty(NativeWindow::Active, true);
- nwin->setProperty(NativeWindow::Visible, show_now);
- nwin->setProperty(NativeWindow::Workspace, obj->XCB->CurrentWorkspace());
- icccm_size_hints hints = obj->XCB->WM_ICCCM_GetNormalHints(win);
- if(!hints.isValid()){ hints = obj->XCB->WM_ICCCM_GetSizeHints(win); }
- if(hints.validMinSize()){ nwin->setProperty(NativeWindow::MinSize, QSize(hints.min_width,hints.min_height)); }
- if(hints.validMaxSize()){ nwin->setProperty(NativeWindow::MaxSize, QSize(hints.max_width,hints.max_height)); }
- if(hints.validBaseSize()){ nwin->setProperty(NativeWindow::Size, QSize(hints.base_width,hints.base_height)); }
- else if(hints.validSize()){ nwin->setProperty(NativeWindow::Size, QSize(hints.width, hints.height)); }
- nwin->setProperty(NativeWindow::Icon, obj->XCB->WM_Get_Icon(win));
- QString title = obj->XCB->WM_Get_Name(win);
- if(title.isEmpty()){ title = obj->XCB->WM_Get_Visible_Name(win); }
- if(title.isEmpty()){ title = obj->XCB->WM_ICCCM_GetName(win); }
- nwin->setProperty(NativeWindow::Title, title);
- title = obj->XCB->WM_Get_Icon_Name(win);
- if(title.isEmpty()){ title = obj->XCB->WM_Get_Visible_Icon_Name(win); }
- if(title.isEmpty()){ title = obj->XCB->WM_ICCCM_GetIconName(win); }
- nwin->setProperty(NativeWindow::ShortTitle, title);
-
- obj->emit WindowCreated(nwin);
-}
-
-void XCBEventFilter::ParsePropertyEvent(xcb_property_notify_event_t *ev){
- //First find the NativeWindow associated with the event
- NativeWindow *nwin = 0;
- for(int i=0; i<windows.length() && nwin==0; i++){
- if(windows[i]->id() == ev->window){ nwin = windows[i]; }
- }
- if(nwin==0){ return; } //unmanaged window - ignore this event
- qDebug() << "Got Property Event:" << ev->window << ev->atom;
- //Now determine which properties are getting changed, and update the native window as appropriate
- if(ev->atom == obj->XCB->EWMH._NET_WM_NAME){
- qDebug() << " - Found _NET_WM_NAME atom";
- nwin->setProperty(NativeWindow::Title, obj->XCB->WM_Get_Name(nwin->id()));
- }else if(ev->atom == obj->XCB->EWMH._NET_WM_ICON){
- qDebug() << " - Found _NET_WM_ICON atom";
- nwin->setProperty(NativeWindow::Icon, obj->XCB->WM_Get_Icon(nwin->id()));
- }else if(ev->atom == obj->XCB->EWMH._NET_WM_ICON_NAME){
- qDebug() << " - Found _NET_WM_ICON_NAME atom";
- nwin->setProperty(NativeWindow::ShortTitle, obj->XCB->WM_Get_Icon_Name(nwin->id()));
- }else if(ev->atom == obj->XCB->EWMH._NET_WM_DESKTOP){
- qDebug() << " - Found _NET_WM_DESKTOP atom";
- nwin->setProperty(NativeWindow::Workspace, obj->XCB->WM_Get_Desktop(nwin->id()));
- }else if(ev->atom == obj->XCB->EWMH._NET_WM_WINDOW_TYPE ){
- qDebug() << " - Found _NET_WM_WINDOW_TYPE atom";
-
- }else if( ev->atom == obj->XCB->EWMH._NET_WM_STATE){
- qDebug() << " - Found _NET_WM_STATE atom";
-
- }
-
-}
diff --git a/src-qt5/core/lumina-desktop-unified/src-events/LXcbEventFilter.h b/src-qt5/core/lumina-desktop-unified/src-events/LXcbEventFilter.h
deleted file mode 100644
index 9f2530e8..00000000
--- a/src-qt5/core/lumina-desktop-unified/src-events/LXcbEventFilter.h
+++ /dev/null
@@ -1,151 +0,0 @@
-//===========================================
-// Lumina-DE source code
-// Copyright (c) 2012-2017, Ken Moore
-// Available under the 3-clause BSD license
-// See the LICENSE file for full details
-//===========================================
-// This class provides the XCB event handling/registrations that are needed
-//===========================================
-#ifndef _LUMINA_DESKTOP_XCB_FILTER_H
-#define _LUMINA_DESKTOP_XCB_FILTER_H
-
-#include "global-includes.h"
-
-
-/*
-List of XCB response types (since almost impossible to find good docs on XCB)
-switch (xcb_generic_event_t*->response_type & ~0x80)
-case values:
-XCB_KEY_[PRESS | RELEASE]
-XCB_BUTTON_[PRESS | RELEASE]
-XCB_MOTION_NOTIFY
-XCB_ENTER_NOTIFY
-XCB_LEAVE_NOTIFY
-XCB_FOCUS_[IN | OUT]
-XCB_KEYMAP_NOTIFY
-XCB_EXPOSE
-XCB_GRAPHICS_EXPOSURE
-XCB_VISIBILITY_NOTIFY
-XCB_CREATE_NOTIFY
-XCB_DESTROY_NOTIFY
-XCB_UNMAP_NOTIFY
-XCB_MAP_[NOTIFY | REQUEST]
-XCB_REPARENT_NOTIFY
-XCB_CONFIGURE_[NOTIFY | REQUEST]
-XCB_GRAVITY_NOTIFY
-XCB_RESIZE_REQUEST
-XCB_CIRCULATE_[NOTIFY | REQUEST]
-XCB_PROPERTY_NOTIFY
-XCB_SELECTION_[CLEAR | REQUEST | NOTIFY]
-XCB_COLORMAP_NOTIFY
-XCB_CLIENT_MESSAGE
-*/
-
-
-class EventFilter : public QObject{
- Q_OBJECT
-private:
- QAbstractNativeEventFilter* EF;
- WId WMFlag; //used to flag a running WM process
-
-public:
- EventFilter();
- ~EventFilter(){}
-
- void start();
- void stop();
-
- //Public System Tray Functions
- QList<WId> currentTrayApps();
-
- //Public Session Interaction Functions
- unsigned int currentWorkspace();
-
- //Public Window Management Lists
- QList<NativeWindow*> currentWindows(); //always returned in creation-order (oldest first)
-
- //Variables/Functions needed by the XCBEventFilter class only (not really needed by anything else)
- LXCB *XCB; //used to interact with the X11 graphics subsystem
-
-public slots:
- void RegisterVirtualRoot(WId);
- void TryCloseWindow(WId);
- void TryActivateWindow(WId);
-
-signals:
- void NewInputEvent();
- void WindowCreated(NativeWindow*);
-
- // Session Signals
- void WorkspaceChanged(unsigned int);
-
- // System Tray Signals
- void Tray_AppAdded(WId); //new tray app registered
- void Tray_AppClosed(WId); //tray app de-registered
- void Tray_AppUpdated(WId); //tray app appearance changed (damage event)
- // Shortcut Signals
- void KeyPressed(WId, int);
- void KeyReleased(WId, int);
- void MousePressed(WId, Lumina::MouseButton);
- void MouseReleased(WId, Lumina::MouseButton);
-};
-
-class XCBEventFilter : public QAbstractNativeEventFilter{
-public:
- XCBEventFilter(EventFilter *parent);
- ~XCBEventFilter(){}
-
- virtual bool nativeEventFilter(const QByteArray &eventType, void *message, long *);
-
- //System Tray Functions
- QList<WId> trayApps(); //return the list of all current tray apps
- bool startSystemTray();
- bool stopSystemTray();
-
- //Window List Functions
- QList<NativeWindow*> windowList();
-
-private:
- EventFilter *obj;
- QList<xcb_atom_t> WinNotifyAtoms, SysNotifyAtoms;
- xcb_atom_t _NET_SYSTEM_TRAY_OPCODE;
- void InitAtoms();
-
- bool BlockInputEvent(WId win = 0); //Checks the current state of the system to see if the event should be stopped
- WId InputWindow(WId win = 0); //Checks the window ID and determines if this is an external window or returns 0 (for desktop/root windows)
- Lumina::MouseButton MouseKey(int keycode); //convert the keycode into the mouse button code
-
-
- //System Tray Variables
- WId SystemTrayID;
- int TrayDmgID;
- QList<WId> RunningTrayApps;
- //System Tray functions
- void addTrayApp(WId);
- bool rmTrayApp(WId); //returns "true" if the tray app was found and removed
- void checkDamageID(WId);
-
- //Window List Variables
- QList<NativeWindow*> windows;
- QList<WId> waitingToShow;
-
- //Longer Event handling functions
- void SetupNewWindow(xcb_map_request_event_t *ev);
-
- //bool ParseKeyPressEvent();
- //bool ParseKeyReleaseEvent();
- //bool ParseButtonPressEvent();
- //bool ParseButtonReleaseEvent();
- //bool ParseMotionEvent();
- void ParsePropertyEvent(xcb_property_notify_event_t *ev);
- //bool ParseClientMessageEvent();
- //bool ParseDestroyEvent();
- //bool ParseConfigureEvent();
- //bool ParseKeySelectionClearEvent();
-
-
-
-
-};
-
-#endif
diff --git a/src-qt5/core/lumina-desktop-unified/src-events/events.pri b/src-qt5/core/lumina-desktop-unified/src-events/events.pri
index 9eec91ca..48d500ed 100644
--- a/src-qt5/core/lumina-desktop-unified/src-events/events.pri
+++ b/src-qt5/core/lumina-desktop-unified/src-events/events.pri
@@ -1,6 +1,6 @@
-SOURCES *= $${PWD}/LXcbEventFilter.cpp
+#SOURCES *= $${PWD}/LXcbEventFilter.cpp
-HEADERS *= $${PWD}/LXcbEventFilter.h
+#HEADERS *= $${PWD}/LXcbEventFilter.h
#Shortcut event files
SOURCES *= $${PWD}/LShortcutEvents.cpp
diff --git a/src-qt5/core/lumina-desktop-unified/src-screensaver/LLockScreen.cpp b/src-qt5/core/lumina-desktop-unified/src-screensaver/LLockScreen.cpp
index cdcf2434..0ff70142 100644
--- a/src-qt5/core/lumina-desktop-unified/src-screensaver/LLockScreen.cpp
+++ b/src-qt5/core/lumina-desktop-unified/src-screensaver/LLockScreen.cpp
@@ -10,17 +10,15 @@
#include <unistd.h>
#define NUMTRIES 3
-//#define WAITMINS 1
#define DEBUG 1
LLockScreen::LLockScreen(QWidget *parent) : QWidget(parent), ui(new Ui::LLockScreen()){
ui->setupUi(this);
waittime = new QTimer(this);
- //waittime->setInterval(WAITMINS*60000); //(too many attempts in short time)
waittime->setSingleShot(true);
refreshtime = new QTimer(this); //timer to update the wait time display
refreshtime->setInterval(6000); //6 seconds (1/10 second)
-
+
connect(ui->tool_unlock, SIGNAL(clicked()), this, SLOT(TryUnlock()) );
connect(ui->line_password, SIGNAL(returnPressed()), this, SLOT(TryUnlock()) );
connect(ui->line_password, SIGNAL(textEdited(QString)), this, SIGNAL(InputDetected()) );
@@ -30,7 +28,7 @@ LLockScreen::LLockScreen(QWidget *parent) : QWidget(parent), ui(new Ui::LLockScr
}
LLockScreen::~LLockScreen(){
-
+
}
void LLockScreen::LoadSystemDetails(){
@@ -47,7 +45,7 @@ void LLockScreen::aboutToHide(){
ui->line_password->clear();
ui->line_password->clearFocus();
if(refreshtime->isActive()){ refreshtime->stop(); }
-}
+}
void LLockScreen::aboutToShow(){
if(!waittime->isActive()){
@@ -61,21 +59,17 @@ void LLockScreen::aboutToShow(){
UpdateLockInfo();
ui->line_password->clear();
ui->line_password->setFocus();
-}
+}
// =================
// PRIVATE SLOTS
// =================
void LLockScreen::UpdateLockInfo(){
QString info;
- /*if(triesleft>0 && triesleft<NUMTRIES ){
- if(triesleft==1){info = tr("1 Attempt Left"); }
- else{info = QString(tr("%1 Attempts Left")).arg(QString::number(triesleft)); }
- }else*/
- if(waittime->isActive()){
+ if(waittime->isActive()){
info = tr("Too Many Failures")+"\n"+ QString(tr("Wait %1 Minutes")).arg( QString::number(qRound(waittime->remainingTime()/6000.0)/10.0) );
}else if(attempts>0){ info.append("\n"+QString(tr("Failed Attempts: %1")).arg(QString::number(attempts)) ); }
- ui->label_info->setText(info);
+ ui->label_info->setText(info);
}
void LLockScreen::TryUnlock(){
@@ -89,11 +83,11 @@ void LLockScreen::TryUnlock(){
this->setEnabled(true);
}else{
triesleft--;
- if(triesleft>0){
+ if(triesleft>0){
this->setEnabled(true);
- }else{
+ }else{
waittime->setInterval( (attempts/NUMTRIES)*60000);
- waittime->start();
+ waittime->start();
refreshtime->start();
}
ui->line_password->setFocus();
diff --git a/src-qt5/core/lumina-desktop-unified/src-screensaver/LScreenSaver.cpp b/src-qt5/core/lumina-desktop-unified/src-screensaver/LScreenSaver.cpp
index 3dcbf85e..bfcfa54d 100644
--- a/src-qt5/core/lumina-desktop-unified/src-screensaver/LScreenSaver.cpp
+++ b/src-qt5/core/lumina-desktop-unified/src-screensaver/LScreenSaver.cpp
@@ -8,7 +8,7 @@
#include <QScreen>
#include <QApplication>
-#define DEBUG 1
+#define DEBUG 0
LScreenSaver::LScreenSaver() : QWidget(0,Qt::BypassWindowManagerHint | Qt::WindowStaysOnTopHint){
starttimer = new QTimer(this);
@@ -17,7 +17,7 @@ LScreenSaver::LScreenSaver() : QWidget(0,Qt::BypassWindowManagerHint | Qt::Windo
locktimer->setSingleShot(true);
hidetimer = new QTimer(this);
hidetimer->setSingleShot(true);
-
+
LOCKER = new LLockScreen(this);
LOCKER->hide();
settings = new QSettings("lumina-desktop","lumina-screensaver",this);
@@ -33,7 +33,7 @@ LScreenSaver::LScreenSaver() : QWidget(0,Qt::BypassWindowManagerHint | Qt::Windo
}
LScreenSaver::~LScreenSaver(){
-
+
}
bool LScreenSaver::isLocked(){
@@ -66,7 +66,7 @@ void LScreenSaver::reloadSettings(){
hidetimer->setInterval( settings->value("hidesecs",15).toInt() * 1000 );
}
-void LScreenSaver::newInputEvent(){
+void LScreenSaver::newInputEvent(){
if(updating){ return; } //in the middle of making changes which could cause an event
if(DEBUG){ qDebug() << "New Input Event"; }
if(SSRunning && SSLocked){
@@ -79,7 +79,6 @@ void LScreenSaver::newInputEvent(){
HideScreenSaver();
}
UpdateTimers();
-
}
void LScreenSaver::LockScreenNow(){
@@ -119,7 +118,7 @@ void LScreenSaver::ShowScreenSaver(){
if(!this->isActiveWindow()){
this->raise();
this->show();
- this->activateWindow();
+ this->activateWindow();
}
for(int i=0; i<BASES.length(); i++){
BASES[i]->show();
@@ -149,10 +148,11 @@ void LScreenSaver::HideScreenSaver(){
if(!SSLocked){
this->hide();
emit ClosingScreenSaver();
+ emit LockStatusChanged(false);
}
- for(int i=0; i<BASES.length(); i++){
+ for(int i=0; i<BASES.length(); i++){
BASES[i]->hide();
- BASES[i]->stopPainting();
+ BASES[i]->stopPainting();
}
UpdateTimers();
}
@@ -171,6 +171,7 @@ void LScreenSaver::LockScreen(){
if(SSLocked){ return; }
if(DEBUG){ qDebug() << "Locking Screen:" << QDateTime::currentDateTime().toString(); }
SSLocked = true;
+ emit LockStatusChanged(true);
LOCKER->LoadSystemDetails();
UpdateTimers();
}
@@ -178,6 +179,7 @@ void LScreenSaver::LockScreen(){
void LScreenSaver::SSFinished(){
if(DEBUG){ qDebug() << "Screensaver Finished:" << QDateTime::currentDateTime().toString(); }
SSLocked = false;
+ emit LockStatusChanged(false);
HideLockScreen();
HideScreenSaver();
}
diff --git a/src-qt5/core/lumina-desktop-unified/src-screensaver/LScreenSaver.h b/src-qt5/core/lumina-desktop-unified/src-screensaver/LScreenSaver.h
index d27db37e..18f12fab 100644
--- a/src-qt5/core/lumina-desktop-unified/src-screensaver/LScreenSaver.h
+++ b/src-qt5/core/lumina-desktop-unified/src-screensaver/LScreenSaver.h
@@ -19,7 +19,7 @@ public:
~LScreenSaver();
bool isLocked();
-
+
private:
QTimer *starttimer, *locktimer, *hidetimer;
QSettings *settings;
@@ -48,6 +48,7 @@ private slots:
signals:
void StartingScreenSaver();
void ClosingScreenSaver();
+ void LockStatusChanged(bool locked);
protected:
void mouseMoveEvent(QMouseEvent*){
diff --git a/src-qt5/core/lumina-desktop-unified/src-screensaver/SSBaseWidget.cpp b/src-qt5/core/lumina-desktop-unified/src-screensaver/SSBaseWidget.cpp
index 943fe0a1..b31ef793 100644
--- a/src-qt5/core/lumina-desktop-unified/src-screensaver/SSBaseWidget.cpp
+++ b/src-qt5/core/lumina-desktop-unified/src-screensaver/SSBaseWidget.cpp
@@ -25,7 +25,7 @@ SSBaseWidget::SSBaseWidget(QWidget *parent, QSettings *set) : QWidget(parent){
SSBaseWidget::~SSBaseWidget(){
if(ANIM!=0){ this->stopPainting(); }
}
-
+
void SSBaseWidget::setPlugin(QString plug){
plug = plug.toLower();
if(validPlugs.contains(plug) || plug=="random"){ plugType = plug; }
@@ -38,12 +38,12 @@ void SSBaseWidget::setPlugin(QString plug){
void SSBaseWidget::startPainting(){
cplug = plugType;
//free up any old animation instance
- if(ANIM!=0){
+ if(ANIM!=0){
ANIM->stop(); ANIM->clear();
- delete ANIM; ANIM = 0;
- }
+ delete ANIM; ANIM = 0;
+ }
//If a random plugin - grab one of the known plugins
- if(cplug=="random"){
+ if(cplug=="random"){
QStringList valid = BaseAnimGroup::KnownAnimations();
valid.removeAll("none"); //they want a screensaver - remove the "none" option from the valid list
if(valid.isEmpty()){ cplug = "none"; } //no known plugins
@@ -67,9 +67,9 @@ void SSBaseWidget::startPainting(){
}
//Now start the animation(s)
if(ANIM!=0){
- if(ANIM->animationCount()>0){
+ if(ANIM->animationCount()>0){
if(DEBUG){ qDebug() << " - Starting SS Plugin:" << cplug << ANIM->animationCount() << ANIM->duration() << ANIM->loopCount(); }
- ANIM->start();
+ ANIM->start();
}
}
}
diff --git a/src-qt5/core/lumina-desktop-unified/src-screensaver/animations/BaseAnimGroup.cpp b/src-qt5/core/lumina-desktop-unified/src-screensaver/animations/BaseAnimGroup.cpp
index 2abd1f90..017eaf9f 100644
--- a/src-qt5/core/lumina-desktop-unified/src-screensaver/animations/BaseAnimGroup.cpp
+++ b/src-qt5/core/lumina-desktop-unified/src-screensaver/animations/BaseAnimGroup.cpp
@@ -9,6 +9,9 @@
//Include all the known subclasses here, then add a unique ID for it to the functions at the bottom
//#include "SampleAnimation.h"
#include "Fireflies.h"
+#include "Grav.h"
+#include "SampleAnimation.h"
+#include "Text.h"
//==============================
// PLUGIN LOADING/LISTING
@@ -17,14 +20,16 @@ BaseAnimGroup* BaseAnimGroup::NewAnimation(QString type, QWidget *parent, QSetti
//This is where we place all the known plugin ID's, and load the associated subclass
if(type=="fireflies"){
return (new FirefliesAnimation(parent,set));
- /*}else if(type == "sample"){
- return (new SampleAnimation(parent, set));*/
- }else{
+ }else if(type == "grav") {
+ return (new GravAnimation(parent, set));
+ }else if(type == "text") {
+ return (new TextAnimation(parent, set));
+ }else {
//Unknown screensaver, return a blank animation group
return (new BaseAnimGroup(parent, set));
}
}
-
+
QStringList BaseAnimGroup::KnownAnimations(){
- return (QStringList() << "fireflies" << "none");
+ return (QStringList() << "fireflies" << "grav" << "text");
}
diff --git a/src-qt5/core/lumina-desktop-unified/src-screensaver/animations/BaseAnimGroup.h b/src-qt5/core/lumina-desktop-unified/src-screensaver/animations/BaseAnimGroup.h
index 8798577f..b1324e78 100644
--- a/src-qt5/core/lumina-desktop-unified/src-screensaver/animations/BaseAnimGroup.h
+++ b/src-qt5/core/lumina-desktop-unified/src-screensaver/animations/BaseAnimGroup.h
@@ -26,13 +26,13 @@ public:
canvas->setCursor( QCursor(Qt::BlankCursor) );
}
~BaseAnimGroup(){}
-
+
//==============================
// PLUGIN LOADING/LISTING (Change in the .cpp file)
//==============================
static BaseAnimGroup* NewAnimation(QString type, QWidget *parent, QSettings *set);
static QStringList KnownAnimations();
-
+
};
#endif
diff --git a/src-qt5/core/lumina-desktop-unified/src-screensaver/animations/Fireflies.h b/src-qt5/core/lumina-desktop-unified/src-screensaver/animations/Fireflies.h
index f1ef5fa3..75dfb1ae 100644
--- a/src-qt5/core/lumina-desktop-unified/src-screensaver/animations/Fireflies.h
+++ b/src-qt5/core/lumina-desktop-unified/src-screensaver/animations/Fireflies.h
@@ -46,7 +46,7 @@ public:
fly = new QWidget(parent);
range = parent->size();
maxX = range.width()/4; maxY = range.height()/4;
- fly->setStyleSheet("background-color: qradialgradient(spread:pad, cx:0.5, cy:0.5, radius:0.5, fx:0.5, fy:0.5, stop:0 rgba(215, 215, 143, 255), stop:0.83871 rgba(221, 235, 64, 140), stop:1 rgba(0, 0, 0, 255));");
+ fly->setStyleSheet("background-color: qradialgradient(spread:pad, cx:0.5, cy:0.5, radius:0.5, fx:0.5, fy:0.5, stop:0 rgba(215, 215, 143, 255), stop:0.83871 rgba(221, 235, 64, 140), stop:0.99 rgba(0, 0, 0, 255), stop:1 transparent);");
//setup the movement animation
movement = new QPropertyAnimation(fly);
movement->setTargetObject(fly);
@@ -79,8 +79,8 @@ private:
public:
FirefliesAnimation(QWidget *parent, QSettings *set) : BaseAnimGroup(parent, set){}
- ~FirefliesAnimation(){
- this->stop();
+ ~FirefliesAnimation(){
+ this->stop();
//while(fireflies.length()>0){ fireflies.takeAt(0)->deleteLater(); }
}
diff --git a/src-qt5/core/lumina-desktop-unified/src-screensaver/animations/Grav.h b/src-qt5/core/lumina-desktop-unified/src-screensaver/animations/Grav.h
new file mode 100644
index 00000000..ad1b1122
--- /dev/null
+++ b/src-qt5/core/lumina-desktop-unified/src-screensaver/animations/Grav.h
@@ -0,0 +1,185 @@
+//===========================================
+// Lumina-DE source code
+// Copyright (c) 2015, Ken Moore
+// Available under the 3-clause BSD license
+// See the LICENSE file for full details
+//===========================================
+#ifndef _LUMINA_DESKTOP_SCREEN_SAVER_GRAV_ANIMATION_H
+#define _LUMINA_DESKTOP_SCREEN_SAVER_GRAV_ANIMATION_H
+
+//PI is equal to 2*pi
+#define PI 6.2832
+
+#include "global-includes.h"
+#include "BaseAnimGroup.h"
+#include <QParallelAnimationGroup>
+#include <QtMath>
+
+class Grav: public QParallelAnimationGroup{
+ Q_OBJECT
+private:
+ QWidget *planet;
+ QPropertyAnimation *orbit;
+ QSize range;
+ QList<QPoint> path;
+ double radius;
+
+ void setupLoop(QPoint start, QPoint *ref){
+ orbit->setStartValue(start);
+
+ //Used to find overall speed. Distance from the planet to the sun
+ radius = qSqrt( (qPow(start.x()-ref->x(),2) + qPow(start.y()-ref->y(),2) ));
+
+ //Number of frames in animation. Increase for smother motion
+ double step = 1000.0;
+
+ //Random values that give the eliptical pattern to the orbit. Between 0.4 and 2.3
+ double xrand = (qrand()%20+4)/10.0;
+ double yrand = (qrand()%20+4)/10.0;
+
+ QPoint firstP = QPoint(ref->x() + xrand*start.x()*(qCos(0/step) -qSin(0/step)), ref->y() + yrand*start.y()*(qCos(0/step) -qSin(0/step)));
+ QPoint lastP = QPoint(ref->x() + xrand*start.x()*(qCos(PI/step) -qSin(PI/step)), ref->y() + yrand*start.y()*(qCos(PI/step) -qSin(PI/step)));
+ //orbit->setKeyValueAt(0, firstP);
+ //orbit->setKeyValueAt(1, lastP);
+ path.push_back(firstP);
+
+ //Loops through all steps and creates all the points of the orbit
+ for(int i=1; i<step; i++) {
+ //Calculates the new point, including gravitational pull and eccentricity. Goes from 0 to 2PI in steps.
+ double newX = ref->x() + xrand*start.x()*(qCos((PI*i)/step) -qSin((PI*i)/step));
+ double newY = ref->y() + yrand*start.y()*(qSin((PI*i)/step) + qCos((PI*i)/step));
+
+ //Calculates the radius from the sun as the distance between the points
+ radius = (qSqrt( (qPow(newX-ref->x(),2) + qPow(newY-ref->y(),2) )));
+
+ //Creates a new point and creates a key as part of the animation
+ QPoint newLoc = QPoint(newX, newY);
+ //orbit->setKeyValueAt(i/step, newLoc);
+ path.push_back(newLoc);
+ }
+
+ //Sets the time for a full orbit. Increasing makes the orbit slower.
+ path.push_back(lastP);
+ }
+private slots:
+ void LoopChanged(int loop){
+ //Adjust the orbit animation a bit
+ if(loop >= 0) {
+ orbit->setStartValue(orbit->endValue()); //start at the previous end point
+ orbit->setEndValue(path.at(loop%1000));
+ orbit->setDuration(10);
+ }
+ }
+ void stopped(){ qDebug() << "Planet stopped"; planet->hide();}
+
+public:
+ Grav(QWidget *parent) : QParallelAnimationGroup(parent){
+ planet = new QWidget(parent);
+ range = parent->size();
+ QPoint center = parent->geometry().center();
+
+ //Creates a random planet size. Between 12 and 45 pixels
+ double planet_radius = 1.75* ((qrand()%20)+7);
+
+ //Creates a random color in RGB, then creates a circular gradient
+ QString color = "rgba(" + QString::number(qrand() % 256) + ", " + QString::number(qrand() % 256) + ", " + QString::number(qrand() % 256);
+ QString style = "background-color: qradialgradient(spread:pad, cx:0.5, cy:0.5, radius:0.5, fx:0.5, fy:0.5, stop:0 " + color+
+ ", 255)" + " , stop:0.83871 " + color + ", 140)" + " , stop:0.99 rgba(0, 0, 0, 255), stop:1 transparent);";
+ planet->setStyleSheet(style);
+
+ //setup the orbit animation
+ orbit = new QPropertyAnimation(planet);
+ orbit->setPropertyName("pos");
+ orbit->setTargetObject(planet);
+
+ //Creates the random position of the planet, making sure it isn't too close to the sun
+ int randwidth = qrand()%(range.width()/2);
+ if(randwidth < range.width() + 100 and randwidth > range.width() - 100) randwidth = 100;
+ int randheight= qrand()%(range.height()/2);
+ if(randheight < range.height() + 100 and randheight > range.height() - 100) randheight = 100;
+
+ //Creates all frames for the animation
+ setupLoop(QPoint(randwidth, randheight), &center);
+ this->addAnimation(orbit);
+ planet->show();
+
+ //Ensures the screensaver will not stop until the user wishes to login or it times out
+ this->setLoopCount(2000); //number of orbits
+ orbit->setEndValue(path.at(0));
+ LoopChanged(0); //load initial values
+
+ //Sets the initial size and location of the planet
+ planet->setGeometry(QRect(orbit->startValue().toPoint(), QSize(planet_radius, planet_radius)));
+ connect(this, SIGNAL(currentLoopChanged(int)), this, SLOT(LoopChanged(int)) );
+ connect(this, SIGNAL(finished()), this, SLOT(stopped()) );
+ }
+ ~Grav(){}
+
+};
+
+class GravAnimation : public BaseAnimGroup{
+ Q_OBJECT
+private:
+ QList<Grav*> planets;
+ QWidget *sun;
+ QPropertyAnimation *wobble;
+
+private slots:
+ void checkFinished(){
+ int running = 0;
+ for(int i=0; i<this->animationCount(); i++){
+ if(this->animationAt(i)->state()==QAbstractAnimation::Running){ running++; }
+ }
+ if(running<=1){ wobble->stop(); emit wobble->finished();}
+ }
+
+public:
+ GravAnimation(QWidget *parent, QSettings *set) : BaseAnimGroup(parent, set){}
+ ~GravAnimation(){
+ //this->stop();
+ }
+
+ void LoadAnimations(){
+ //Creates the sun, which is a thin shell with a gradient from green to yellow
+ sun = new QWidget(canvas);
+ QPoint center = canvas->geometry().center();
+ QString sunstyle = QStringLiteral("background-color:qradialgradient(spread:pad, cx:0.5, cy:0.5, radius:0.5, fx:0.5, fy:0.5, ") +
+ QStringLiteral("stop:0 rgba(0, 0, 0, 0), stop:0.38 rgba(0, 0, 0, 0), stop:0.4 rgba(82, 121, 76, 33), stop:0.5 rgba(159, 235, 148, 64), ") +
+ QStringLiteral("stop:0.6 rgba(255, 238, 150, 129), stop:0.7 rgba(0, 0, 0, 0));");
+ sun->setStyleSheet(sunstyle);
+
+ //Creates the sun's pulsing animation
+ wobble = new QPropertyAnimation(sun);
+ wobble->setPropertyName("geometry");
+ wobble->setTargetObject(sun);
+ QRect initgeom = QRect(center-QPoint(12,12), QSize(60, 60));
+ wobble->setStartValue(initgeom);
+ wobble->setKeyValueAt(0, initgeom ); //starting point
+ wobble->setKeyValueAt(1, initgeom ); //starting point
+ wobble->setKeyValueAt(0.5, QRect(center-QPoint(18,18), QSize(90, 90))); //starting point
+ wobble->setDuration(2000);
+ wobble->setLoopCount(-1);
+ this->addAnimation(wobble);
+ sun->show();
+ sun->setGeometry(initgeom);
+ while(planets.length()>0){ planets.takeAt(0)->deleteLater(); }
+
+ //Gives the screensaver a black background
+ canvas->setStyleSheet("background: black;");
+
+ //Pulls number of planets from settings, with 10 as default
+ int number = settings->value("planets/number",10).toInt();
+
+ //Loops through all planets and sets up the animations, then adds them to the base group and vector, which
+ for(int i=0; i<number; i++){
+ if(planets.length()>number){ continue; }
+ Grav *tmp = new Grav(canvas);
+ this->addAnimation(tmp);
+ connect(tmp, SIGNAL(finished()), this, SLOT(checkFinished()));
+ planets << tmp;
+ }
+ while(planets.length()>number){planets.takeAt(number)->deleteLater(); }
+ }
+
+};
+#endif
diff --git a/src-qt5/core/lumina-desktop-unified/src-screensaver/animations/SampleAnimation.h b/src-qt5/core/lumina-desktop-unified/src-screensaver/animations/SampleAnimation.h
index 972a5109..c2bb0c96 100644
--- a/src-qt5/core/lumina-desktop-unified/src-screensaver/animations/SampleAnimation.h
+++ b/src-qt5/core/lumina-desktop-unified/src-screensaver/animations/SampleAnimation.h
@@ -20,7 +20,7 @@ private:
public:
SampleAnimation(QWidget *parent, QSettings *set) : BaseAnimGroup(parent, set){}
~SampleAnimation(){ this->stop(); delete ball; }
-
+
void LoadAnimations(){
//qDebug() << "Loading Sample Animation";
ball = new QWidget(canvas);
diff --git a/src-qt5/core/lumina-desktop-unified/src-screensaver/animations/Text.h b/src-qt5/core/lumina-desktop-unified/src-screensaver/animations/Text.h
new file mode 100644
index 00000000..a4c49692
--- /dev/null
+++ b/src-qt5/core/lumina-desktop-unified/src-screensaver/animations/Text.h
@@ -0,0 +1,93 @@
+//===========================================
+// Lumina-DE source code
+// Copyright (c) 2015, Ken Moore
+// Available under the 3-clause BSD license
+// See the LICENSE file for full details
+//===========================================
+#ifndef _LUMINA_DESKTOP_SCREEN_SAVER_Text_ANIMATION_H
+#define _LUMINA_DESKTOP_SCREEN_SAVER_Text_ANIMATION_H
+
+//PI is equal to 2*pi
+#define PI 6.2832
+
+#include "global-includes.h"
+#include "BaseAnimGroup.h"
+#include <QParallelAnimationGroup>
+#include <QtMath>
+
+class Text: public QParallelAnimationGroup{
+ Q_OBJECT
+private:
+ QLabel *text;
+ QPropertyAnimation *movement;
+ QSize range;
+ QPoint v;
+ bool bounce;
+
+private slots:
+ void LoopChanged(){
+ movement->setStartValue(movement->endValue());
+ QPoint currLoc = movement->startValue().toPoint();
+ bounce = !(currLoc.y() < 100 or currLoc.y() > range.height()-100 or currLoc.x() > range.width()-100 or currLoc.x() < 100);
+ if((currLoc.y() < 10 or currLoc.y() > range.height()-40) and !bounce) {
+ v.setY((v.y() * -1) + (qrand() % 20 - 10));
+ }else if((currLoc.x() > range.width()-10 or currLoc.x() < 10) and !bounce) {
+ v.setX((v.x() * -1) + (qrand() % 20 - 10));
+ }
+ currLoc.setX(currLoc.x() + v.x());
+ currLoc.setY(currLoc.y() + v.y());
+ movement->setEndValue(currLoc);
+ }
+ void stopped(){ qDebug() << "text stopped"; text->hide();}
+
+public:
+ Text(QWidget *parent) : QParallelAnimationGroup(parent){
+ text = new QLabel(parent);
+ range = parent->size();
+ QPoint center = parent->geometry().center();
+
+ QString color = "rgba(" + QString::number(qrand() % 206 + 50) + ", " + QString::number(qrand() % 206 + 50) + ", " + QString::number(qrand() % 206 + 50);
+ text->setStyleSheet("QLabel {background-color: rgba(255, 255, 255, 10); color: " + color + "); }");
+ text->setFont(QFont("Courier", 24, QFont::Bold));
+ text->setText("test");
+ QFontMetrics metrics(text->font());
+ text->setMinimumSize(QSize( metrics.width(text->text())+10, metrics.height()*text->text().count("\n") +10));
+
+ movement = new QPropertyAnimation(text);
+ movement->setPropertyName("pos");
+ movement->setTargetObject(text);
+
+ this->addAnimation(movement);
+ text->show();
+ v.setX((qrand() % 100 + 50) * qPow(-1, qrand() % 2));
+ v.setY((qrand() % 100 + 50) * qPow(-1, qrand() % 2));
+ movement->setStartValue(center);
+ //Ensures the screensaver will not stop until the user wishes to login or it times out
+ this->setLoopCount(2000); //number of movements
+ movement->setDuration(200);
+ movement->setEndValue(QPoint(qrand() % (int)range.height(), qrand() % range.width()));
+ LoopChanged(); //load initial values
+
+ connect(this, SIGNAL(currentLoopChanged(int)), this, SLOT(LoopChanged()) );
+ connect(this, SIGNAL(finished()), this, SLOT(stopped()) );
+ }
+ ~Text(){}
+
+};
+
+class TextAnimation : public BaseAnimGroup{
+ Q_OBJECT
+public:
+ TextAnimation(QWidget *parent, QSettings *set) : BaseAnimGroup(parent, set){}
+ ~TextAnimation(){
+ this->stop();
+ }
+
+ void LoadAnimations(){
+ canvas->setStyleSheet("background: black;");
+ Text *tmp = new Text(canvas);
+ this->addAnimation(tmp);
+ }
+
+};
+#endif
diff --git a/src-qt5/core/lumina-desktop-unified/src-screensaver/animations/animations.pri b/src-qt5/core/lumina-desktop-unified/src-screensaver/animations/animations.pri
index 919ec4e0..35141a0e 100644
--- a/src-qt5/core/lumina-desktop-unified/src-screensaver/animations/animations.pri
+++ b/src-qt5/core/lumina-desktop-unified/src-screensaver/animations/animations.pri
@@ -1,7 +1,8 @@
SOURCES += $$PWD/BaseAnimGroup.cpp
HEADERS += $$PWD/BaseAnimGroup.h \
-# $$PWD/SampleAnimation.h \
- $${PWD}/Fireflies.h
-
+ $$PWD/SampleAnimation.h \
+ $${PWD}/Fireflies.h \
+ $${PWD}/Grav.h \
+ $${PWD}/Text.h
#FORMS +=
diff --git a/src-qt5/core/lumina-desktop/LSession.cpp b/src-qt5/core/lumina-desktop/LSession.cpp
index ebd40030..93318b0f 100644
--- a/src-qt5/core/lumina-desktop/LSession.cpp
+++ b/src-qt5/core/lumina-desktop/LSession.cpp
@@ -471,7 +471,7 @@ void LSession::updateDesktops(){
//Make sure all the background windows are registered on the system as virtual roots
QTimer::singleShot(100,this, SLOT(registerDesktopWindows()));
//Determine if any High-DPI screens are available and enable auto-scaling as needed
- for(int i=0; i<scrns.length(); i++){
+ /*for(int i=0; i<scrns.length(); i++){
qDebug() << "Check Screen DPI:" << scrns[i]->name();
qDebug() << " -- Physical DPI:" << scrns[i]->physicalDotsPerInchX() << "x" << scrns[i]->physicalDotsPerInchY();
qDebug() << " -- Logical DPI:" << scrns[i]->logicalDotsPerInchX() << "x" << scrns[i]->logicalDotsPerInchY();
@@ -481,7 +481,7 @@ void LSession::updateDesktops(){
}else if(i==(scrns.length()-1)){
unsetenv("QT_AUTO_SCREEN_SCALE_FACTOR");
}
- }
+ }*/
}
void LSession::registerDesktopWindows(){
diff --git a/src-qt5/core/lumina-desktop/i18n/lumina-desktop_af.ts b/src-qt5/core/lumina-desktop/i18n/lumina-desktop_af.ts
index 6a86d9f6..caeb719a 100644
--- a/src-qt5/core/lumina-desktop/i18n/lumina-desktop_af.ts
+++ b/src-qt5/core/lumina-desktop/i18n/lumina-desktop_af.ts
@@ -38,62 +38,62 @@
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../desktop-plugins/applauncher/AppLauncherPlugin.cpp" line="72"/>
+ <location filename="../desktop-plugins/applauncher/AppLauncherPlugin.cpp" line="73"/>
<source>Launch %1</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../desktop-plugins/applauncher/AppLauncherPlugin.cpp" line="127"/>
+ <location filename="../desktop-plugins/applauncher/AppLauncherPlugin.cpp" line="134"/>
<source>Open</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../desktop-plugins/applauncher/AppLauncherPlugin.cpp" line="129"/>
+ <location filename="../desktop-plugins/applauncher/AppLauncherPlugin.cpp" line="136"/>
<source>Open With</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../desktop-plugins/applauncher/AppLauncherPlugin.cpp" line="132"/>
+ <location filename="../desktop-plugins/applauncher/AppLauncherPlugin.cpp" line="139"/>
<source>View Properties</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../desktop-plugins/applauncher/AppLauncherPlugin.cpp" line="134"/>
+ <location filename="../desktop-plugins/applauncher/AppLauncherPlugin.cpp" line="141"/>
<source>File Operations</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../desktop-plugins/applauncher/AppLauncherPlugin.cpp" line="136"/>
+ <location filename="../desktop-plugins/applauncher/AppLauncherPlugin.cpp" line="143"/>
<source>Rename</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../desktop-plugins/applauncher/AppLauncherPlugin.cpp" line="139"/>
+ <location filename="../desktop-plugins/applauncher/AppLauncherPlugin.cpp" line="146"/>
<source>Copy</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../desktop-plugins/applauncher/AppLauncherPlugin.cpp" line="142"/>
+ <location filename="../desktop-plugins/applauncher/AppLauncherPlugin.cpp" line="149"/>
<source>Cut</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../desktop-plugins/applauncher/AppLauncherPlugin.cpp" line="144"/>
+ <location filename="../desktop-plugins/applauncher/AppLauncherPlugin.cpp" line="151"/>
<source>Delete</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../desktop-plugins/applauncher/AppLauncherPlugin.cpp" line="205"/>
+ <location filename="../desktop-plugins/applauncher/AppLauncherPlugin.cpp" line="212"/>
<source>Select Application</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../desktop-plugins/applauncher/AppLauncherPlugin.cpp" line="205"/>
+ <location filename="../desktop-plugins/applauncher/AppLauncherPlugin.cpp" line="212"/>
<source>Name:</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../desktop-plugins/applauncher/AppLauncherPlugin.cpp" line="291"/>
+ <location filename="../desktop-plugins/applauncher/AppLauncherPlugin.cpp" line="298"/>
<source>New Filename</source>
<translation type="unfinished"></translation>
</message>
@@ -851,7 +851,7 @@
<name>LSession</name>
<message>
<location filename="../LSession.cpp" line="163"/>
- <location filename="../LSession.cpp" line="344"/>
+ <location filename="../LSession.cpp" line="342"/>
<source>Desktop</source>
<translation type="unfinished"></translation>
</message>
diff --git a/src-qt5/core/lumina-desktop/i18n/lumina-desktop_ar.ts b/src-qt5/core/lumina-desktop/i18n/lumina-desktop_ar.ts
index 6a86d9f6..caeb719a 100644
--- a/src-qt5/core/lumina-desktop/i18n/lumina-desktop_ar.ts
+++ b/src-qt5/core/lumina-desktop/i18n/lumina-desktop_ar.ts
@@ -38,62 +38,62 @@
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../desktop-plugins/applauncher/AppLauncherPlugin.cpp" line="72"/>
+ <location filename="../desktop-plugins/applauncher/AppLauncherPlugin.cpp" line="73"/>
<source>Launch %1</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../desktop-plugins/applauncher/AppLauncherPlugin.cpp" line="127"/>
+ <location filename="../desktop-plugins/applauncher/AppLauncherPlugin.cpp" line="134"/>
<source>Open</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../desktop-plugins/applauncher/AppLauncherPlugin.cpp" line="129"/>
+ <location filename="../desktop-plugins/applauncher/AppLauncherPlugin.cpp" line="136"/>
<source>Open With</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../desktop-plugins/applauncher/AppLauncherPlugin.cpp" line="132"/>
+ <location filename="../desktop-plugins/applauncher/AppLauncherPlugin.cpp" line="139"/>
<source>View Properties</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../desktop-plugins/applauncher/AppLauncherPlugin.cpp" line="134"/>
+ <location filename="../desktop-plugins/applauncher/AppLauncherPlugin.cpp" line="141"/>
<source>File Operations</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../desktop-plugins/applauncher/AppLauncherPlugin.cpp" line="136"/>
+ <location filename="../desktop-plugins/applauncher/AppLauncherPlugin.cpp" line="143"/>
<source>Rename</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../desktop-plugins/applauncher/AppLauncherPlugin.cpp" line="139"/>
+ <location filename="../desktop-plugins/applauncher/AppLauncherPlugin.cpp" line="146"/>
<source>Copy</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../desktop-plugins/applauncher/AppLauncherPlugin.cpp" line="142"/>
+ <location filename="../desktop-plugins/applauncher/AppLauncherPlugin.cpp" line="149"/>
<source>Cut</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../desktop-plugins/applauncher/AppLauncherPlugin.cpp" line="144"/>
+ <location filename="../desktop-plugins/applauncher/AppLauncherPlugin.cpp" line="151"/>
<source>Delete</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../desktop-plugins/applauncher/AppLauncherPlugin.cpp" line="205"/>
+ <location filename="../desktop-plugins/applauncher/AppLauncherPlugin.cpp" line="212"/>
<source>Select Application</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../desktop-plugins/applauncher/AppLauncherPlugin.cpp" line="205"/>
+ <location filename="../desktop-plugins/applauncher/AppLauncherPlugin.cpp" line="212"/>
<source>Name:</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../desktop-plugins/applauncher/AppLauncherPlugin.cpp" line="291"/>
+ <location filename="../desktop-plugins/applauncher/AppLauncherPlugin.cpp" line="298"/>
<source>New Filename</source>
<translation type="unfinished"></translation>
</message>
@@ -851,7 +851,7 @@
<name>LSession</name>
<message>
<location filename="../LSession.cpp" line="163"/>
- <location filename="../LSession.cpp" line="344"/>
+ <location filename="../LSession.cpp" line="342"/>
<source>Desktop</source>
<translation type="unfinished"></translation>
</message>
diff --git a/src-qt5/core/lumina-desktop/i18n/lumina-desktop_az.ts b/src-qt5/core/lumina-desktop/i18n/lumina-desktop_az.ts
index 6a86d9f6..caeb719a 100644
--- a/src-qt5/core/lumina-desktop/i18n/lumina-desktop_az.ts
+++ b/src-qt5/core/lumina-desktop/i18n/lumina-desktop_az.ts
@@ -38,62 +38,62 @@
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../desktop-plugins/applauncher/AppLauncherPlugin.cpp" line="72"/>
+ <location filename="../desktop-plugins/applauncher/AppLauncherPlugin.cpp" line="73"/>
<source>Launch %1</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../desktop-plugins/applauncher/AppLauncherPlugin.cpp" line="127"/>
+ <location filename="../desktop-plugins/applauncher/AppLauncherPlugin.cpp" line="134"/>
<source>Open</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../desktop-plugins/applauncher/AppLauncherPlugin.cpp" line="129"/>
+ <location filename="../desktop-plugins/applauncher/AppLauncherPlugin.cpp" line="136"/>
<source>Open With</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../desktop-plugins/applauncher/AppLauncherPlugin.cpp" line="132"/>
+ <location filename="../desktop-plugins/applauncher/AppLauncherPlugin.cpp" line="139"/>
<source>View Properties</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../desktop-plugins/applauncher/AppLauncherPlugin.cpp" line="134"/>
+ <location filename="../desktop-plugins/applauncher/AppLauncherPlugin.cpp" line="141"/>
<source>File Operations</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../desktop-plugins/applauncher/AppLauncherPlugin.cpp" line="136"/>
+ <location filename="../desktop-plugins/applauncher/AppLauncherPlugin.cpp" line="143"/>
<source>Rename</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../desktop-plugins/applauncher/AppLauncherPlugin.cpp" line="139"/>
+ <location filename="../desktop-plugins/applauncher/AppLauncherPlugin.cpp" line="146"/>
<source>Copy</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../desktop-plugins/applauncher/AppLauncherPlugin.cpp" line="142"/>
+ <location filename="../desktop-plugins/applauncher/AppLauncherPlugin.cpp" line="149"/>
<source>Cut</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../desktop-plugins/applauncher/AppLauncherPlugin.cpp" line="144"/>
+ <location filename="../desktop-plugins/applauncher/AppLauncherPlugin.cpp" line="151"/>
<source>Delete</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../desktop-plugins/applauncher/AppLauncherPlugin.cpp" line="205"/>
+ <location filename="../desktop-plugins/applauncher/AppLauncherPlugin.cpp" line="212"/>
<source>Select Application</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../desktop-plugins/applauncher/AppLauncherPlugin.cpp" line="205"/>
+ <location filename="../desktop-plugins/applauncher/AppLauncherPlugin.cpp" line="212"/>
<source>Name:</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../desktop-plugins/applauncher/AppLauncherPlugin.cpp" line="291"/>
+ <location filename="../desktop-plugins/applauncher/AppLauncherPlugin.cpp" line="298"/>
<source>New Filename</source>
<translation type="unfinished"></translation>
</message>
@@ -851,7 +851,7 @@
<name>LSession</name>
<message>
<location filename="../LSession.cpp" line="163"/>
- <location filename="../LSession.cpp" line="344"/>
+ <location filename="../LSession.cpp" line="342"/>
<source>Desktop</source>
<translation type="unfinished"></translation>
</message>
diff --git a/src-qt5/core/lumina-desktop/i18n/lumina-desktop_bg.ts b/src-qt5/core/lumina-desktop/i18n/lumina-desktop_bg.ts
index 394d0666..2496641f 100644
--- a/src-qt5/core/lumina-desktop/i18n/lumina-desktop_bg.ts
+++ b/src-qt5/core/lumina-desktop/i18n/lumina-desktop_bg.ts
@@ -38,62 +38,62 @@
<translation>Кликнете за задаване</translation>
</message>
<message>
- <location filename="../desktop-plugins/applauncher/AppLauncherPlugin.cpp" line="72"/>
+ <location filename="../desktop-plugins/applauncher/AppLauncherPlugin.cpp" line="73"/>
<source>Launch %1</source>
<translation type="unfinished">Стартиране на %1</translation>
</message>
<message>
- <location filename="../desktop-plugins/applauncher/AppLauncherPlugin.cpp" line="127"/>
+ <location filename="../desktop-plugins/applauncher/AppLauncherPlugin.cpp" line="134"/>
<source>Open</source>
<translation type="unfinished">Отваряне</translation>
</message>
<message>
- <location filename="../desktop-plugins/applauncher/AppLauncherPlugin.cpp" line="129"/>
+ <location filename="../desktop-plugins/applauncher/AppLauncherPlugin.cpp" line="136"/>
<source>Open With</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../desktop-plugins/applauncher/AppLauncherPlugin.cpp" line="132"/>
+ <location filename="../desktop-plugins/applauncher/AppLauncherPlugin.cpp" line="139"/>
<source>View Properties</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../desktop-plugins/applauncher/AppLauncherPlugin.cpp" line="134"/>
+ <location filename="../desktop-plugins/applauncher/AppLauncherPlugin.cpp" line="141"/>
<source>File Operations</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../desktop-plugins/applauncher/AppLauncherPlugin.cpp" line="136"/>
+ <location filename="../desktop-plugins/applauncher/AppLauncherPlugin.cpp" line="143"/>
<source>Rename</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../desktop-plugins/applauncher/AppLauncherPlugin.cpp" line="139"/>
+ <location filename="../desktop-plugins/applauncher/AppLauncherPlugin.cpp" line="146"/>
<source>Copy</source>
<translation type="unfinished">Копиране</translation>
</message>
<message>
- <location filename="../desktop-plugins/applauncher/AppLauncherPlugin.cpp" line="142"/>
+ <location filename="../desktop-plugins/applauncher/AppLauncherPlugin.cpp" line="149"/>
<source>Cut</source>
<translation type="unfinished">Изрязване</translation>
</message>
<message>
- <location filename="../desktop-plugins/applauncher/AppLauncherPlugin.cpp" line="144"/>
+ <location filename="../desktop-plugins/applauncher/AppLauncherPlugin.cpp" line="151"/>
<source>Delete</source>
<translation type="unfinished">Изтриване</translation>
</message>
<message>
- <location filename="../desktop-plugins/applauncher/AppLauncherPlugin.cpp" line="205"/>
+ <location filename="../desktop-plugins/applauncher/AppLauncherPlugin.cpp" line="212"/>
<source>Select Application</source>
<translation>Избор на програма</translation>
</message>
<message>
- <location filename="../desktop-plugins/applauncher/AppLauncherPlugin.cpp" line="205"/>
+ <location filename="../desktop-plugins/applauncher/AppLauncherPlugin.cpp" line="212"/>
<source>Name:</source>
<translation>Име:</translation>
</message>
<message>
- <location filename="../desktop-plugins/applauncher/AppLauncherPlugin.cpp" line="291"/>
+ <location filename="../desktop-plugins/applauncher/AppLauncherPlugin.cpp" line="298"/>
<source>New Filename</source>
<translation type="unfinished"></translation>
</message>
@@ -851,7 +851,7 @@
<name>LSession</name>
<message>
<location filename="../LSession.cpp" line="163"/>
- <location filename="../LSession.cpp" line="344"/>
+ <location filename="../LSession.cpp" line="342"/>
<source>Desktop</source>
<translation>Работен плот</translation>
</message>
diff --git a/src-qt5/core/lumina-desktop/i18n/lumina-desktop_bn.ts b/src-qt5/core/lumina-desktop/i18n/lumina-desktop_bn.ts
index 6a86d9f6..caeb719a 100644
--- a/src-qt5/core/lumina-desktop/i18n/lumina-desktop_bn.ts
+++ b/src-qt5/core/lumina-desktop/i18n/lumina-desktop_bn.ts
@@ -38,62 +38,62 @@
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../desktop-plugins/applauncher/AppLauncherPlugin.cpp" line="72"/>
+ <location filename="../desktop-plugins/applauncher/AppLauncherPlugin.cpp" line="73"/>
<source>Launch %1</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../desktop-plugins/applauncher/AppLauncherPlugin.cpp" line="127"/>
+ <location filename="../desktop-plugins/applauncher/AppLauncherPlugin.cpp" line="134"/>
<source>Open</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../desktop-plugins/applauncher/AppLauncherPlugin.cpp" line="129"/>
+ <location filename="../desktop-plugins/applauncher/AppLauncherPlugin.cpp" line="136"/>
<source>Open With</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../desktop-plugins/applauncher/AppLauncherPlugin.cpp" line="132"/>
+ <location filename="../desktop-plugins/applauncher/AppLauncherPlugin.cpp" line="139"/>
<source>View Properties</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../desktop-plugins/applauncher/AppLauncherPlugin.cpp" line="134"/>
+ <location filename="../desktop-plugins/applauncher/AppLauncherPlugin.cpp" line="141"/>
<source>File Operations</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../desktop-plugins/applauncher/AppLauncherPlugin.cpp" line="136"/>
+ <location filename="../desktop-plugins/applauncher/AppLauncherPlugin.cpp" line="143"/>
<source>Rename</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../desktop-plugins/applauncher/AppLauncherPlugin.cpp" line="139"/>
+ <location filename="../desktop-plugins/applauncher/AppLauncherPlugin.cpp" line="146"/>
<source>Copy</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../desktop-plugins/applauncher/AppLauncherPlugin.cpp" line="142"/>
+ <location filename="../desktop-plugins/applauncher/AppLauncherPlugin.cpp" line="149"/>
<source>Cut</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../desktop-plugins/applauncher/AppLauncherPlugin.cpp" line="144"/>
+ <location filename="../desktop-plugins/applauncher/AppLauncherPlugin.cpp" line="151"/>
<source>Delete</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../desktop-plugins/applauncher/AppLauncherPlugin.cpp" line="205"/>
+ <location filename="../desktop-plugins/applauncher/AppLauncherPlugin.cpp" line="212"/>
<source>Select Application</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../desktop-plugins/applauncher/AppLauncherPlugin.cpp" line="205"/>
+ <location filename="../desktop-plugins/applauncher/AppLauncherPlugin.cpp" line="212"/>
<source>Name:</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../desktop-plugins/applauncher/AppLauncherPlugin.cpp" line="291"/>
+ <location filename="../desktop-plugins/applauncher/AppLauncherPlugin.cpp" line="298"/>
<source>New Filename</source>
<translation type="unfinished"></translation>
</message>
@@ -851,7 +851,7 @@
<name>LSession</name>
<message>
<location filename="../LSession.cpp" line="163"/>
- <location filename="../LSession.cpp" line="344"/>
+ <location filename="../LSession.cpp" line="342"/>
<source>Desktop</source>
<translation type="unfinished"></translation>
</message>
diff --git a/src-qt5/core/lumina-desktop/i18n/lumina-desktop_bs.ts b/src-qt5/core/lumina-desktop/i18n/lumina-desktop_bs.ts
index 6a86d9f6..caeb719a 100644
--- a/src-qt5/core/lumina-desktop/i18n/lumina-desktop_bs.ts
+++ b/src-qt5/core/lumina-desktop/i18n/lumina-desktop_bs.ts
@@ -38,62 +38,62 @@
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../desktop-plugins/applauncher/AppLauncherPlugin.cpp" line="72"/>
+ <location filename="../desktop-plugins/applauncher/AppLauncherPlugin.cpp" line="73"/>
<source>Launch %1</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../desktop-plugins/applauncher/AppLauncherPlugin.cpp" line="127"/>
+ <location filename="../desktop-plugins/applauncher/AppLauncherPlugin.cpp" line="134"/>
<source>Open</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../desktop-plugins/applauncher/AppLauncherPlugin.cpp" line="129"/>
+ <location filename="../desktop-plugins/applauncher/AppLauncherPlugin.cpp" line="136"/>
<source>Open With</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../desktop-plugins/applauncher/AppLauncherPlugin.cpp" line="132"/>
+ <location filename="../desktop-plugins/applauncher/AppLauncherPlugin.cpp" line="139"/>
<source>View Properties</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../desktop-plugins/applauncher/AppLauncherPlugin.cpp" line="134"/>
+ <location filename="../desktop-plugins/applauncher/AppLauncherPlugin.cpp" line="141"/>
<source>File Operations</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../desktop-plugins/applauncher/AppLauncherPlugin.cpp" line="136"/>
+ <location filename="../desktop-plugins/applauncher/AppLauncherPlugin.cpp" line="143"/>
<source>Rename</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../desktop-plugins/applauncher/AppLauncherPlugin.cpp" line="139"/>
+ <location filename="../desktop-plugins/applauncher/AppLauncherPlugin.cpp" line="146"/>
<source>Copy</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../desktop-plugins/applauncher/AppLauncherPlugin.cpp" line="142"/>
+ <location filename="../desktop-plugins/applauncher/AppLauncherPlugin.cpp" line="149"/>
<source>Cut</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../desktop-plugins/applauncher/AppLauncherPlugin.cpp" line="144"/>
+ <location filename="../desktop-plugins/applauncher/AppLauncherPlugin.cpp" line="151"/>
<source>Delete</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../desktop-plugins/applauncher/AppLauncherPlugin.cpp" line="205"/>
+ <location filename="../desktop-plugins/applauncher/AppLauncherPlugin.cpp" line="212"/>
<source>Select Application</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../desktop-plugins/applauncher/AppLauncherPlugin.cpp" line="205"/>
+ <location filename="../desktop-plugins/applauncher/AppLauncherPlugin.cpp" line="212"/>
<source>Name:</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../desktop-plugins/applauncher/AppLauncherPlugin.cpp" line="291"/>
+ <location filename="../desktop-plugins/applauncher/AppLauncherPlugin.cpp" line="298"/>
<source>New Filename</source>
<translation type="unfinished"></translation>
</message>
@@ -851,7 +851,7 @@
<name>LSession</name>
<message>
<location filename="../LSession.cpp" line="163"/>
- <location filename="../LSession.cpp" line="344"/>
+ <location filename="../LSession.cpp" line="342"/>
<source>Desktop</source>
<translation type="unfinished"></translation>
</message>
diff --git a/src-qt5/core/lumina-desktop/i18n/lumina-desktop_ca.ts b/src-qt5/core/lumina-desktop/i18n/lumina-desktop_ca.ts
index d44936d1..20bf3c1b 100644
--- a/src-qt5/core/lumina-desktop/i18n/lumina-desktop_ca.ts
+++ b/src-qt5/core/lumina-desktop/i18n/lumina-desktop_ca.ts
@@ -21,7 +21,7 @@
<message>
<location filename="../panel-plugins/applauncher/AppLaunchButton.cpp" line="67"/>
<source>Select Application</source>
- <translation>Seleccioneu l'aplicació</translation>
+ <translation>Seleccioneu l&apos;aplicació</translation>
</message>
<message>
<location filename="../panel-plugins/applauncher/AppLaunchButton.cpp" line="67"/>
@@ -38,62 +38,62 @@
<translation>Cliqueu per establir-ho</translation>
</message>
<message>
- <location filename="../desktop-plugins/applauncher/AppLauncherPlugin.cpp" line="72"/>
+ <location filename="../desktop-plugins/applauncher/AppLauncherPlugin.cpp" line="73"/>
<source>Launch %1</source>
<translation>Llança %1</translation>
</message>
<message>
- <location filename="../desktop-plugins/applauncher/AppLauncherPlugin.cpp" line="127"/>
+ <location filename="../desktop-plugins/applauncher/AppLauncherPlugin.cpp" line="134"/>
<source>Open</source>
<translation>Obre</translation>
</message>
<message>
- <location filename="../desktop-plugins/applauncher/AppLauncherPlugin.cpp" line="129"/>
+ <location filename="../desktop-plugins/applauncher/AppLauncherPlugin.cpp" line="136"/>
<source>Open With</source>
<translation>Obre amb</translation>
</message>
<message>
- <location filename="../desktop-plugins/applauncher/AppLauncherPlugin.cpp" line="132"/>
+ <location filename="../desktop-plugins/applauncher/AppLauncherPlugin.cpp" line="139"/>
<source>View Properties</source>
- <translation>Mostra'n les propietats</translation>
+ <translation>Mostra&apos;n les propietats</translation>
</message>
<message>
- <location filename="../desktop-plugins/applauncher/AppLauncherPlugin.cpp" line="134"/>
+ <location filename="../desktop-plugins/applauncher/AppLauncherPlugin.cpp" line="141"/>
<source>File Operations</source>
<translation>Operacions de fitxers</translation>
</message>
<message>
- <location filename="../desktop-plugins/applauncher/AppLauncherPlugin.cpp" line="136"/>
+ <location filename="../desktop-plugins/applauncher/AppLauncherPlugin.cpp" line="143"/>
<source>Rename</source>
- <translation>Canvia'n el nom</translation>
+ <translation>Canvia&apos;n el nom</translation>
</message>
<message>
- <location filename="../desktop-plugins/applauncher/AppLauncherPlugin.cpp" line="139"/>
+ <location filename="../desktop-plugins/applauncher/AppLauncherPlugin.cpp" line="146"/>
<source>Copy</source>
<translation>Copia</translation>
</message>
<message>
- <location filename="../desktop-plugins/applauncher/AppLauncherPlugin.cpp" line="142"/>
+ <location filename="../desktop-plugins/applauncher/AppLauncherPlugin.cpp" line="149"/>
<source>Cut</source>
<translation>Retalla</translation>
</message>
<message>
- <location filename="../desktop-plugins/applauncher/AppLauncherPlugin.cpp" line="144"/>
+ <location filename="../desktop-plugins/applauncher/AppLauncherPlugin.cpp" line="151"/>
<source>Delete</source>
<translation>Suprimeix</translation>
</message>
<message>
- <location filename="../desktop-plugins/applauncher/AppLauncherPlugin.cpp" line="205"/>
+ <location filename="../desktop-plugins/applauncher/AppLauncherPlugin.cpp" line="212"/>
<source>Select Application</source>
- <translation>Seleccioneu l'aplicació</translation>
+ <translation>Seleccioneu l&apos;aplicació</translation>
</message>
<message>
- <location filename="../desktop-plugins/applauncher/AppLauncherPlugin.cpp" line="205"/>
+ <location filename="../desktop-plugins/applauncher/AppLauncherPlugin.cpp" line="212"/>
<source>Name:</source>
<translation>Nom:</translation>
</message>
<message>
- <location filename="../desktop-plugins/applauncher/AppLauncherPlugin.cpp" line="291"/>
+ <location filename="../desktop-plugins/applauncher/AppLauncherPlugin.cpp" line="298"/>
<source>New Filename</source>
<translation>Nom de fitxer nou</translation>
</message>
@@ -196,7 +196,7 @@
<message>
<location filename="../BootSplash.ui" line="94"/>
<source>Starting the Lumina Desktop...</source>
- <translation>S'inicia l'escriptori Lumina...</translation>
+ <translation>S&apos;inicia l&apos;escriptori Lumina...</translation>
</message>
<message>
<location filename="../BootSplash.cpp" line="17"/>
@@ -211,22 +211,22 @@
<message>
<location filename="../BootSplash.cpp" line="43"/>
<source>Keep up with desktop news!</source>
- <translation>Mantingueu-vos al dia de les notícies de l'escriptori!</translation>
+ <translation>Mantingueu-vos al dia de les notícies de l&apos;escriptori!</translation>
</message>
<message>
<location filename="../BootSplash.cpp" line="45"/>
<source>There is a full handbook of information about the desktop available online.</source>
- <translation>Hi ha un manual ple d'informació de l'escriptori disponible en línia.</translation>
+ <translation>Hi ha un manual ple d&apos;informació de l&apos;escriptori disponible en línia.</translation>
</message>
<message>
<location filename="../BootSplash.cpp" line="47"/>
<source>Want to change the interface? Everything is customizable in the desktop configuration!</source>
- <translation>Voleu canviar-ne la interfície? Tot és personalitzable des de la configuració de l'escriptori!</translation>
+ <translation>Voleu canviar-ne la interfície? Tot és personalitzable des de la configuració de l&apos;escriptori!</translation>
</message>
<message>
<location filename="../BootSplash.cpp" line="49"/>
<source>Lumina can easily reproduce the interface from most other desktop environments.</source>
- <translation>El Lumina pot reproduir fàcilment la interfície de la majoria d'altres entorns d'escriptori.</translation>
+ <translation>El Lumina pot reproduir fàcilment la interfície de la majoria d&apos;altres entorns d&apos;escriptori.</translation>
</message>
<message>
<location filename="../BootSplash.cpp" line="51"/>
@@ -236,7 +236,7 @@
<message>
<location filename="../BootSplash.cpp" line="53"/>
<source>I have never been hurt by what I have not said</source>
- <translation>Mai no m'ha fet mal el que no he dit.</translation>
+ <translation>Mai no m&apos;ha fet mal el que no he dit.</translation>
</message>
<message>
<location filename="../BootSplash.cpp" line="55"/>
@@ -265,12 +265,12 @@
</message>
<message>
<location filename="../BootSplash.cpp" line="65"/>
- <source>Don't expect to build up the weak by pulling down the strong.</source>
+ <source>Don&apos;t expect to build up the weak by pulling down the strong.</source>
<translation>No espereu fer forts els febles enfonsant forts.</translation>
</message>
<message>
<location filename="../BootSplash.cpp" line="67"/>
- <source>You can't know too much, but you can say too much.</source>
+ <source>You can&apos;t know too much, but you can say too much.</source>
<translation>No es pot saber massa, però es pot dir massa.</translation>
</message>
<message>
@@ -281,7 +281,7 @@
<message>
<location filename="../BootSplash.cpp" line="71"/>
<source>Any society that would give up a little liberty to gain a little security will deserve neither and lose both.</source>
- <translation>Qualsevol societat que deixi de banda una mica de llibertat per guanyar una mica de seguretat no en mereixerà ni una ni l'altra i les perdrà totes dues.</translation>
+ <translation>Qualsevol societat que deixi de banda una mica de llibertat per guanyar una mica de seguretat no en mereixerà ni una ni l&apos;altra i les perdrà totes dues.</translation>
</message>
<message>
<location filename="../BootSplash.cpp" line="73"/>
@@ -341,7 +341,7 @@
<message>
<location filename="../BootSplash.cpp" line="95"/>
<source>The only way to do great work is to love what you do.</source>
- <translation>L'única manera de fer una bona feina és que us agradi el que feu.</translation>
+ <translation>L&apos;única manera de fer una bona feina és que us agradi el que feu.</translation>
</message>
<message>
<location filename="../BootSplash.cpp" line="97"/>
@@ -350,8 +350,8 @@
</message>
<message>
<location filename="../BootSplash.cpp" line="99"/>
- <source>Only two things are infinite, the universe and human stupidity, and I'm not sure about the former.</source>
- <translation>Només hi ha dues coses infinites: l'univers i l'estupidesa humana, i no estic segur de la primera.</translation>
+ <source>Only two things are infinite, the universe and human stupidity, and I&apos;m not sure about the former.</source>
+ <translation>Només hi ha dues coses infinites: l&apos;univers i l&apos;estupidesa humana, i no estic segur de la primera.</translation>
</message>
<message>
<location filename="../BootSplash.cpp" line="101"/>
@@ -360,8 +360,8 @@
</message>
<message>
<location filename="../BootSplash.cpp" line="103"/>
- <source>Do, or do not. There is no 'try'.</source>
- <translation>Fes-ho o no. No hi ha un "intent".</translation>
+ <source>Do, or do not. There is no &apos;try&apos;.</source>
+ <translation>Fes-ho o no. No hi ha un &quot;intent&quot;.</translation>
</message>
<message>
<location filename="../BootSplash.cpp" line="105"/>
@@ -371,7 +371,7 @@
<message>
<location filename="../BootSplash.cpp" line="107"/>
<source>Good people do not need laws to tell them to act responsibly, while bad people will find a way around the laws.</source>
- <translation>La gent bona no necessita lleis que els diguin d'actuar responsablement, mentre que la mala gent trobarà una manera d'evitar les lleis.</translation>
+ <translation>La gent bona no necessita lleis que els diguin d&apos;actuar responsablement, mentre que la mala gent trobarà una manera d&apos;evitar les lleis.</translation>
</message>
<message>
<location filename="../BootSplash.cpp" line="109"/>
@@ -380,8 +380,8 @@
</message>
<message>
<location filename="../BootSplash.cpp" line="111"/>
- <source>It's kind of fun to do the impossible.</source>
- <translation>És bastant divertit fer l'impossible.</translation>
+ <source>It&apos;s kind of fun to do the impossible.</source>
+ <translation>És bastant divertit fer l&apos;impossible.</translation>
</message>
<message>
<location filename="../BootSplash.cpp" line="113"/>
@@ -396,7 +396,7 @@
<message>
<location filename="../BootSplash.cpp" line="117"/>
<source>Success usually comes to those who are too busy to be looking for it.</source>
- <translation>L'èxit normalment arriba als que estan massa enfeinats per buscar-lo.</translation>
+ <translation>L&apos;èxit normalment arriba als que estan massa enfeinats per buscar-lo.</translation>
</message>
<message>
<location filename="../BootSplash.cpp" line="119"/>
@@ -421,7 +421,7 @@
<message>
<location filename="../BootSplash.cpp" line="127"/>
<source>Sometimes it is not enough that we do our best; we must do what is required.</source>
- <translation>Algunes vegades no n'hi ha prou amb fer-ho el millor que podem, hem de fer el que cal.</translation>
+ <translation>Algunes vegades no n&apos;hi ha prou amb fer-ho el millor que podem, hem de fer el que cal.</translation>
</message>
<message>
<location filename="../BootSplash.cpp" line="129"/>
@@ -446,7 +446,7 @@
<message>
<location filename="../BootSplash.cpp" line="148"/>
<source>Loading User Preferences …</source>
- <translation>Carregant les preferències de l'usuari…</translation>
+ <translation>Carregant les preferències de l&apos;usuari…</translation>
</message>
<message>
<location filename="../BootSplash.cpp" line="151"/>
@@ -471,7 +471,7 @@
<message>
<location filename="../BootSplash.cpp" line="163"/>
<source>Preparing Workspace …</source>
- <translation>Preparant l'espai de treball…</translation>
+ <translation>Preparant l&apos;espai de treball…</translation>
</message>
<message>
<location filename="../BootSplash.cpp" line="166"/>
@@ -481,7 +481,7 @@
<message>
<location filename="../BootSplash.cpp" line="169"/>
<source>Starting App: %1</source>
- <translation>Iniciant l'aplicació: %1</translation>
+ <translation>Iniciant l&apos;aplicació: %1</translation>
</message>
</context>
<context>
@@ -532,7 +532,7 @@
<message>
<location filename="../panel-plugins/systemstart/ItemWidget.cpp" line="190"/>
<source>Pin to Desktop</source>
- <translation>Enganxa a l'escriptori</translation>
+ <translation>Enganxa a l&apos;escriptori</translation>
</message>
<message>
<location filename="../panel-plugins/systemstart/ItemWidget.cpp" line="195"/>
@@ -560,7 +560,7 @@
<message>
<location filename="../JsonMenu.h" line="60"/>
<source>Error parsing script output: %1</source>
- <translation>Error analitzant la sortida de l'script: %1</translation>
+ <translation>Error analitzant la sortida de l&apos;script: %1</translation>
</message>
</context>
<context>
@@ -684,7 +684,7 @@
<message>
<location filename="../panel-plugins/clock/LClock.cpp" line="159"/>
<source>Use System Time</source>
- <translation>Usa l'hora del sistema</translation>
+ <translation>Usa l&apos;hora del sistema</translation>
</message>
</context>
<context>
@@ -692,17 +692,17 @@
<message>
<location filename="../desktop-plugins/LDPlugin.cpp" line="37"/>
<source>Modify Item</source>
- <translation>Modifica l'ítem</translation>
+ <translation>Modifica l&apos;ítem</translation>
</message>
<message>
<location filename="../desktop-plugins/LDPlugin.cpp" line="45"/>
<source>Start Moving Item</source>
- <translation>Inicia el trasllat de l'ítem</translation>
+ <translation>Inicia el trasllat de l&apos;ítem</translation>
</message>
<message>
<location filename="../desktop-plugins/LDPlugin.cpp" line="46"/>
<source>Start Resizing Item</source>
- <translation>Inicia el canvi de mida de l'ítem</translation>
+ <translation>Inicia el canvi de mida de l&apos;ítem</translation>
</message>
<message>
<location filename="../desktop-plugins/LDPlugin.cpp" line="48"/>
@@ -717,7 +717,7 @@
<message>
<location filename="../desktop-plugins/LDPlugin.cpp" line="51"/>
<source>Remove Item</source>
- <translation>Elimina l'ítem</translation>
+ <translation>Elimina l&apos;ítem</translation>
</message>
</context>
<context>
@@ -773,7 +773,7 @@
<message>
<location filename="../LDesktop.cpp" line="255"/>
<source>Desktop Actions</source>
- <translation>Accions de l'escriptori</translation>
+ <translation>Accions de l&apos;escriptori</translation>
</message>
<message>
<location filename="../LDesktop.cpp" line="257"/>
@@ -851,7 +851,7 @@
<name>LSession</name>
<message>
<location filename="../LSession.cpp" line="163"/>
- <location filename="../LSession.cpp" line="344"/>
+ <location filename="../LSession.cpp" line="342"/>
<source>Desktop</source>
<translation>Escriptori</translation>
</message>
@@ -879,7 +879,7 @@
<message>
<location filename="../panel-plugins/systemdashboard/SysMenuQuick.ui" line="111"/>
<source>Launch Audio Mixer</source>
- <translation>Obre el Mesclador d'àudio</translation>
+ <translation>Obre el Mesclador d&apos;àudio</translation>
</message>
<message>
<location filename="../panel-plugins/systemdashboard/SysMenuQuick.ui" line="156"/>
@@ -1182,12 +1182,12 @@
<message>
<location filename="../desktop-plugins/rssreader/RSSFeedPlugin.ui" line="62"/>
<source>View Options</source>
- <translation>Mostra'n les opcions</translation>
+ <translation>Mostra&apos;n les opcions</translation>
</message>
<message>
<location filename="../desktop-plugins/rssreader/RSSFeedPlugin.ui" line="89"/>
<source>Open Website</source>
- <translation>Obre'n el lloc web</translation>
+ <translation>Obre&apos;n el lloc web</translation>
</message>
<message>
<location filename="../desktop-plugins/rssreader/RSSFeedPlugin.ui" line="92"/>
@@ -1219,7 +1219,7 @@
<message>
<location filename="../desktop-plugins/rssreader/RSSFeedPlugin.ui" line="287"/>
<source>RSS URL</source>
- <translation>URL de l'RSS</translation>
+ <translation>URL de l&apos;RSS</translation>
</message>
<message>
<location filename="../desktop-plugins/rssreader/RSSFeedPlugin.ui" line="302"/>
@@ -1244,7 +1244,7 @@
<message>
<location filename="../desktop-plugins/rssreader/RSSFeedPlugin.ui" line="437"/>
<source>Some RSS feeds may request custom update intervals instead of using this setting</source>
- <translation>Alguns canals RSS poden sol·licitar intervals d'actualització personalitzats en lloc d'utilitzar aquest paràmetre.</translation>
+ <translation>Alguns canals RSS poden sol·licitar intervals d&apos;actualització personalitzats en lloc d&apos;utilitzar aquest paràmetre.</translation>
</message>
<message>
<location filename="../desktop-plugins/rssreader/RSSFeedPlugin.ui" line="440"/>
@@ -1290,7 +1290,7 @@
<message>
<location filename="../desktop-plugins/rssreader/RSSFeedPlugin.cpp" line="78"/>
<source>Lumina Desktop RSS</source>
- <translation>RSS de l'escriptori Lumina</translation>
+ <translation>RSS de l&apos;escriptori Lumina</translation>
</message>
<message>
<location filename="../desktop-plugins/rssreader/RSSFeedPlugin.cpp" line="143"/>
@@ -1315,7 +1315,7 @@
<message>
<location filename="../desktop-plugins/rssreader/RSSFeedPlugin.cpp" line="147"/>
<source>Last Build Date: %1</source>
- <translation>Data de l'última construcció: %1</translation>
+ <translation>Data de l&apos;última construcció: %1</translation>
</message>
<message>
<location filename="../desktop-plugins/rssreader/RSSFeedPlugin.cpp" line="148"/>
@@ -1353,7 +1353,7 @@
<message>
<location filename="../SettingsMenu.cpp" line="39"/>
<source>All Desktop Settings</source>
- <translation>Tots els paràmetres de l'escriptori</translation>
+ <translation>Tots els paràmetres de l&apos;escriptori</translation>
</message>
<message>
<location filename="../SettingsMenu.cpp" line="54"/>
@@ -1411,7 +1411,7 @@
<message>
<location filename="../panel-plugins/systemstart/StartMenu.ui" line="488"/>
<source>Configure Desktop</source>
- <translation>Configureu l'escriptori</translation>
+ <translation>Configureu l&apos;escriptori</translation>
</message>
<message>
<location filename="../panel-plugins/systemstart/StartMenu.ui" line="924"/>
@@ -1557,7 +1557,7 @@
<message>
<location filename="../panel-plugins/userbutton/UserWidget.ui" line="14"/>
<source>UserWidget</source>
- <translation>Giny de l'usuari</translation>
+ <translation>Giny de l&apos;usuari</translation>
</message>
<message>
<location filename="../panel-plugins/userbutton/UserWidget.ui" line="24"/>
@@ -1605,12 +1605,12 @@
<location filename="../panel-plugins/userbutton/UserWidget.ui" line="290"/>
<location filename="../panel-plugins/userbutton/UserWidget.cpp" line="330"/>
<source>Home</source>
- <translation>Carpeta de l'usuari</translation>
+ <translation>Carpeta de l&apos;usuari</translation>
</message>
<message>
<location filename="../panel-plugins/userbutton/UserWidget.ui" line="293"/>
<source>Home Directory</source>
- <translation>Directori de l'usuari</translation>
+ <translation>Directori de l&apos;usuari</translation>
</message>
<message>
<location filename="../panel-plugins/userbutton/UserWidget.ui" line="322"/>
@@ -1620,7 +1620,7 @@
<message>
<location filename="../panel-plugins/userbutton/UserWidget.ui" line="375"/>
<source>Go back to home directory</source>
- <translation>Torna al directori de l'usuari</translation>
+ <translation>Torna al directori de l&apos;usuari</translation>
</message>
<message>
<location filename="../panel-plugins/userbutton/UserWidget.ui" line="350"/>
@@ -1635,7 +1635,7 @@
<message>
<location filename="../panel-plugins/userbutton/UserWidget.ui" line="461"/>
<source>Desktop Preferences</source>
- <translation>Preferències de l'escriptori</translation>
+ <translation>Preferències de l&apos;escriptori</translation>
</message>
<message>
<location filename="../panel-plugins/userbutton/UserWidget.ui" line="473"/>
@@ -1645,7 +1645,7 @@
<message>
<location filename="../panel-plugins/userbutton/UserWidget.ui" line="495"/>
<source>Desktop Appearance/Plugins</source>
- <translation>Aparença de l'escriptori / connectors</translation>
+ <translation>Aparença de l&apos;escriptori / connectors</translation>
</message>
<message>
<location filename="../panel-plugins/userbutton/UserWidget.ui" line="517"/>
@@ -1655,12 +1655,12 @@
<message>
<location filename="../panel-plugins/userbutton/UserWidget.ui" line="539"/>
<source>Screensaver Settings</source>
- <translation>Paràmetres de l'estalvi de pantalla</translation>
+ <translation>Paràmetres de l&apos;estalvi de pantalla</translation>
</message>
<message>
<location filename="../panel-plugins/userbutton/UserWidget.ui" line="581"/>
<source>About the Lumina Desktop</source>
- <translation>Quant a l'escriptori Lumina</translation>
+ <translation>Quant a l&apos;escriptori Lumina</translation>
</message>
<message>
<location filename="../panel-plugins/userbutton/UserWidget.cpp" line="289"/>
diff --git a/src-qt5/core/lumina-desktop/i18n/lumina-desktop_cs.ts b/src-qt5/core/lumina-desktop/i18n/lumina-desktop_cs.ts
index fe0c683b..d700dbbc 100644
--- a/src-qt5/core/lumina-desktop/i18n/lumina-desktop_cs.ts
+++ b/src-qt5/core/lumina-desktop/i18n/lumina-desktop_cs.ts
@@ -6,7 +6,7 @@
<message>
<location filename="../panel-plugins/applauncher/AppLaunchButton.cpp" line="37"/>
<source>Click to assign an application</source>
- <translation>Klepnutím vyberte aplikaci</translation>
+ <translation>Kliknutím přiřaďte aplikaci</translation>
</message>
<message>
<location filename="../panel-plugins/applauncher/AppLaunchButton.cpp" line="42"/>
@@ -26,7 +26,7 @@
<message>
<location filename="../panel-plugins/applauncher/AppLaunchButton.cpp" line="67"/>
<source>Name:</source>
- <translation>Jméno:</translation>
+ <translation>Název:</translation>
</message>
</context>
<context>
@@ -35,67 +35,67 @@
<location filename="../desktop-plugins/applauncher/AppLauncherPlugin.cpp" line="62"/>
<location filename="../desktop-plugins/applauncher/AppLauncherPlugin.cpp" line="116"/>
<source>Click to Set</source>
- <translation>Klepnutím nastavit</translation>
+ <translation>Nastavte kliknutím</translation>
</message>
<message>
- <location filename="../desktop-plugins/applauncher/AppLauncherPlugin.cpp" line="72"/>
+ <location filename="../desktop-plugins/applauncher/AppLauncherPlugin.cpp" line="73"/>
<source>Launch %1</source>
- <translation type="unfinished">Spustit %1</translation>
+ <translation>Spustit %1</translation>
</message>
<message>
- <location filename="../desktop-plugins/applauncher/AppLauncherPlugin.cpp" line="127"/>
+ <location filename="../desktop-plugins/applauncher/AppLauncherPlugin.cpp" line="134"/>
<source>Open</source>
- <translation type="unfinished">Otevřít</translation>
+ <translation>Otevřít</translation>
</message>
<message>
- <location filename="../desktop-plugins/applauncher/AppLauncherPlugin.cpp" line="129"/>
+ <location filename="../desktop-plugins/applauncher/AppLauncherPlugin.cpp" line="136"/>
<source>Open With</source>
- <translation type="unfinished"></translation>
+ <translation>Otevřít pomocí</translation>
</message>
<message>
- <location filename="../desktop-plugins/applauncher/AppLauncherPlugin.cpp" line="132"/>
+ <location filename="../desktop-plugins/applauncher/AppLauncherPlugin.cpp" line="139"/>
<source>View Properties</source>
- <translation type="unfinished"></translation>
+ <translation>Zobrazit vlastnosti</translation>
</message>
<message>
- <location filename="../desktop-plugins/applauncher/AppLauncherPlugin.cpp" line="134"/>
+ <location filename="../desktop-plugins/applauncher/AppLauncherPlugin.cpp" line="141"/>
<source>File Operations</source>
- <translation type="unfinished"></translation>
+ <translation>Operace se souborem</translation>
</message>
<message>
- <location filename="../desktop-plugins/applauncher/AppLauncherPlugin.cpp" line="136"/>
+ <location filename="../desktop-plugins/applauncher/AppLauncherPlugin.cpp" line="143"/>
<source>Rename</source>
- <translation type="unfinished"></translation>
+ <translation>Přejmenovat</translation>
</message>
<message>
- <location filename="../desktop-plugins/applauncher/AppLauncherPlugin.cpp" line="139"/>
+ <location filename="../desktop-plugins/applauncher/AppLauncherPlugin.cpp" line="146"/>
<source>Copy</source>
- <translation type="unfinished">Kopírovat</translation>
+ <translation>Kopírovat</translation>
</message>
<message>
- <location filename="../desktop-plugins/applauncher/AppLauncherPlugin.cpp" line="142"/>
+ <location filename="../desktop-plugins/applauncher/AppLauncherPlugin.cpp" line="149"/>
<source>Cut</source>
- <translation type="unfinished">Vyjmout</translation>
+ <translation>Vyjmout</translation>
</message>
<message>
- <location filename="../desktop-plugins/applauncher/AppLauncherPlugin.cpp" line="144"/>
+ <location filename="../desktop-plugins/applauncher/AppLauncherPlugin.cpp" line="151"/>
<source>Delete</source>
- <translation type="unfinished">Vymazat</translation>
+ <translation>Vymazat</translation>
</message>
<message>
- <location filename="../desktop-plugins/applauncher/AppLauncherPlugin.cpp" line="205"/>
+ <location filename="../desktop-plugins/applauncher/AppLauncherPlugin.cpp" line="212"/>
<source>Select Application</source>
<translation>Vybrat aplikaci</translation>
</message>
<message>
- <location filename="../desktop-plugins/applauncher/AppLauncherPlugin.cpp" line="205"/>
+ <location filename="../desktop-plugins/applauncher/AppLauncherPlugin.cpp" line="212"/>
<source>Name:</source>
<translation>Název:</translation>
</message>
<message>
- <location filename="../desktop-plugins/applauncher/AppLauncherPlugin.cpp" line="291"/>
+ <location filename="../desktop-plugins/applauncher/AppLauncherPlugin.cpp" line="298"/>
<source>New Filename</source>
- <translation type="unfinished"></translation>
+ <translation>Nový název souboru</translation>
</message>
</context>
<context>
@@ -196,7 +196,7 @@
<message>
<location filename="../BootSplash.ui" line="94"/>
<source>Starting the Lumina Desktop...</source>
- <translation>Spouští se prostředí Lumina...</translation>
+ <translation>Spouští se prostředí Lumina…</translation>
</message>
<message>
<location filename="../BootSplash.cpp" line="17"/>
@@ -206,17 +206,17 @@
<message>
<location filename="../BootSplash.cpp" line="41"/>
<source>This desktop is powered by coffee, coffee, and more coffee.</source>
- <translation>Toto prostředí pohání cukr, káva a další káva.</translation>
+ <translation>Toto prostředí je poháněno kávou, kávou a ještě další kávou.</translation>
</message>
<message>
<location filename="../BootSplash.cpp" line="43"/>
<source>Keep up with desktop news!</source>
- <translation>Posílejte nám zprávy o prostředí!</translation>
+ <translation>Buďte v obraze ohledně novinek v prostředí!</translation>
</message>
<message>
<location filename="../BootSplash.cpp" line="45"/>
<source>There is a full handbook of information about the desktop available online.</source>
- <translation>Na internetu je úplná příručka se spoustou údajů o prostředí.</translation>
+ <translation>Na webových stránkách projektu je k dispozici podrobná příručka se spoustou informací o prostředí.</translation>
</message>
<message>
<location filename="../BootSplash.cpp" line="47"/>
@@ -226,17 +226,17 @@
<message>
<location filename="../BootSplash.cpp" line="49"/>
<source>Lumina can easily reproduce the interface from most other desktop environments.</source>
- <translation>Lumina lehce dokáže napodobit vzhled rozhraní většiny jiných prostředí pracovní plochy.</translation>
+ <translation>Lumina lehce dokáže napodobit vzhled rozhraní většiny ostatních pracovních prostředí.</translation>
</message>
<message>
<location filename="../BootSplash.cpp" line="51"/>
<source>This desktop is generously sponsored by iXsystems</source>
- <translation>Toto prostředí je laskavě podporováno a penězi zaštiťováno podnikem iXsystems</translation>
+ <translation>Toto prostředí je štědře podporováno společností iXsystems</translation>
</message>
<message>
<location filename="../BootSplash.cpp" line="53"/>
<source>I have never been hurt by what I have not said</source>
- <translation>Nikdy jsem se netrápil tím, co jsem neřekl</translation>
+ <translation>Nikdy mi neublížilo to, co jsem nemusel říct</translation>
</message>
<message>
<location filename="../BootSplash.cpp" line="55"/>
@@ -246,17 +246,17 @@
<message>
<location filename="../BootSplash.cpp" line="57"/>
<source>Everything has its beauty but not everyone sees it.</source>
- <translation>Vše je dobré, ale ne každý vidí tu krásu.</translation>
+ <translation>Vše je krásné, ale ne každý to vidí.</translation>
</message>
<message>
<location filename="../BootSplash.cpp" line="59"/>
<source>Before God we are all equally wise - and equally foolish.</source>
- <translation>Před Bohem jsme všichni rozumní stejně - a stejně nerozumní.</translation>
+ <translation>Před Bohem jsme všichni stejně moudří – a stejně hloupí.</translation>
</message>
<message>
<location filename="../BootSplash.cpp" line="61"/>
<source>We cannot do everything at once, but we can do something at once.</source>
- <translation>Nemůžeme všechno udělat zaráz, něco však můžeme provést najednou.</translation>
+ <translation>Nemůžeme udělat všechno najednou, najednou však můžeme něco udělat.</translation>
</message>
<message>
<location filename="../BootSplash.cpp" line="63"/>
@@ -265,13 +265,13 @@
</message>
<message>
<location filename="../BootSplash.cpp" line="65"/>
- <source>Don&apos;t expect to build up the weak by pulling down the strong.</source>
- <translation>Neočekávej, že povzbudíš slabé, tím že dolů stáhneš silné.</translation>
+ <source>Don't expect to build up the weak by pulling down the strong.</source>
+ <translation>Neočekávejte že povzbudíte slabé tím že stáhnete dolů silné.</translation>
</message>
<message>
<location filename="../BootSplash.cpp" line="67"/>
- <source>You can&apos;t know too much, but you can say too much.</source>
- <translation>Nemůžeš vědět příliš mnoho, ale můžeš toho říct přespříliš.</translation>
+ <source>You can't know too much, but you can say too much.</source>
+ <translation>Nemůžete vědět příliš mnoho, ale můžete toho říct přespříliš.</translation>
</message>
<message>
<location filename="../BootSplash.cpp" line="69"/>
@@ -286,27 +286,27 @@
<message>
<location filename="../BootSplash.cpp" line="73"/>
<source>Never trust a computer you can’t throw out a window.</source>
- <translation>Počítačníku, nikdy nevěř počítači, který nemůžeš vyhodit z okna.</translation>
+ <translation>Nikdy nevěřte počítači, který nemůžete vyhodit z okna.</translation>
</message>
<message>
<location filename="../BootSplash.cpp" line="75"/>
<source>Study the past if you would define the future.</source>
- <translation>Uč se z minulosti, jestli chceš určit, jak bude vypadat budoucnost.</translation>
+ <translation>Učte se z minulosti, pokud chcete určovat budoucnost.</translation>
</message>
<message>
<location filename="../BootSplash.cpp" line="77"/>
<source>The way to get started is to quit talking and begin doing.</source>
- <translation>Cestou, jak začít, je přestat mluvit a začít dělat.</translation>
+ <translation>Cestou jak začít je přestat mluvit a začít dělat.</translation>
</message>
<message>
<location filename="../BootSplash.cpp" line="79"/>
<source>Ask and it will be given to you; search, and you will find; knock and the door will be opened for you.</source>
- <translation>Požádej a bude ti dáno; hledej a nalezneš; klepej a dveře ti budou otevřeny.</translation>
+ <translation>Požádejte a bude vám dáno; hledejte a naleznete; zaklepej a dveře vám budou otevřeny.</translation>
</message>
<message>
<location filename="../BootSplash.cpp" line="81"/>
<source>Start where you are. Use what you have. Do what you can.</source>
- <translation>Začni tam, kde jsi. Používej to, co máš. Udělej, co můžeš.</translation>
+ <translation>Začněte tam, kde jste. Používejte to, co máte. Udělejte, co můžete.</translation>
</message>
<message>
<location filename="../BootSplash.cpp" line="83"/>
@@ -316,42 +316,42 @@
<message>
<location filename="../BootSplash.cpp" line="85"/>
<source>It does not matter how slowly you go as long as you do not stop.</source>
- <translation>Nezáleží na tom, jak pomalu jdeš, dokud nezastavíš.</translation>
+ <translation>Nezáleží na tom jak pomalu jdete – důležité je, že se nezastavíte.</translation>
</message>
<message>
<location filename="../BootSplash.cpp" line="87"/>
<source>Do what you can, where you are, with what you have.</source>
- <translation>Dělej, co můžeš, tam kde jsi, s tím, co máš.</translation>
+ <translation>Dělejte, co můžete, tam kde jste, s tím, co máte.</translation>
</message>
<message>
<location filename="../BootSplash.cpp" line="89"/>
<source>Remember no one can make you feel inferior without your consent.</source>
- <translation>Pamatuj si, že nikomu se nepodaří, aby ses cítil být menším, bez tvého souhlasu.</translation>
+ <translation>Pamatujte, že se nikomu nepodaří, aby se cítil být menším, bez jeho souhlasu.</translation>
</message>
<message>
<location filename="../BootSplash.cpp" line="91"/>
<source>It’s not the years in your life that count. It’s the life in your years.</source>
- <translation>Nejsou to roky tvého života, co se počítá. Je to život v tvých letech.</translation>
+ <translation>V životě nejsou roky to, co se počítá. Počítá se život v rocích.</translation>
</message>
<message>
<location filename="../BootSplash.cpp" line="93"/>
<source>Either write something worth reading or do something worth writing.</source>
- <translation>Buď napiš něco, co stojí za přečtení, nebo udělej něco, o čem má smysl napsat.</translation>
+ <translation>Buď napište něco, co stojí za přečtení, nebo udělejte něco, o čem má smysl napsat.</translation>
</message>
<message>
<location filename="../BootSplash.cpp" line="95"/>
<source>The only way to do great work is to love what you do.</source>
- <translation>Jediným způsobem, jak dělat práci skvěle, je milovat to, co děláš.</translation>
+ <translation>Jediným způsobem jak odvádět skvělou práci je milovat to, co děláte.</translation>
</message>
<message>
<location filename="../BootSplash.cpp" line="97"/>
<source>Political correctness is tyranny with manners.</source>
- <translation>Politická správnost je útlak, který si našel své způsoby.</translation>
+ <translation>Politická korektnost je útlak honosící se vybranými způsoby.</translation>
</message>
<message>
<location filename="../BootSplash.cpp" line="99"/>
- <source>Only two things are infinite, the universe and human stupidity, and I&apos;m not sure about the former.</source>
- <translation>Jen dvě věci jsou nekonečné, vesmír a lidská hloupost. A nejsem si jist, jak si mám vykládat to první.</translation>
+ <source>Only two things are infinite, the universe and human stupidity, and I'm not sure about the former.</source>
+ <translation>Jen dvě věci jsou nekonečné – vesmír a lidská hloupost. Tím prvním si vlastně nejsem tak úplně jistý.</translation>
</message>
<message>
<location filename="../BootSplash.cpp" line="101"/>
@@ -360,8 +360,8 @@
</message>
<message>
<location filename="../BootSplash.cpp" line="103"/>
- <source>Do, or do not. There is no &apos;try&apos;.</source>
- <translation>Udělej to, nebo to nedělej vůbec. Nejde o to to jen zkoušet.</translation>
+ <source>Do, or do not. There is no 'try'.</source>
+ <translation>Udělejte to, nebo to nedělejte vůbec. Nejde o to to jen zkoušet.</translation>
</message>
<message>
<location filename="../BootSplash.cpp" line="105"/>
@@ -371,7 +371,7 @@
<message>
<location filename="../BootSplash.cpp" line="107"/>
<source>Good people do not need laws to tell them to act responsibly, while bad people will find a way around the laws.</source>
- <translation>Dobří lidé nepotřebují zákony k tomu, aby jim říkaly, aby jednali zodpovědně, zatímco špatní lidé si najdou cestičku okolo zákonů.</translation>
+ <translation>Dobří lidé nepotřebují zákony k tomu, aby jim říkaly, aby jednali zodpovědně, zatímco špatní lidé si vždy najdou kličku k obejití zákonů.</translation>
</message>
<message>
<location filename="../BootSplash.cpp" line="109"/>
@@ -380,13 +380,13 @@
</message>
<message>
<location filename="../BootSplash.cpp" line="111"/>
- <source>It&apos;s kind of fun to do the impossible.</source>
+ <source>It's kind of fun to do the impossible.</source>
<translation>Dělat nemožné je zábava.</translation>
</message>
<message>
<location filename="../BootSplash.cpp" line="113"/>
<source>Knowledge speaks, but wisdom listens.</source>
- <translation>Vědomost hovoří, ale moudrost poslouchá.</translation>
+ <translation>Vědomost hovoří, ale moudrost naslouchá.</translation>
</message>
<message>
<location filename="../BootSplash.cpp" line="115"/>
@@ -396,7 +396,7 @@
<message>
<location filename="../BootSplash.cpp" line="117"/>
<source>Success usually comes to those who are too busy to be looking for it.</source>
- <translation>Úspěch obyčejně přijde k těm, kdož jsou příliš zaneprázdněni na to, aby jej hledali.</translation>
+ <translation>Úspěch obyčejně přijde k těm, kteří jsou příliš zaneprázdněni na to, aby ho hledali.</translation>
</message>
<message>
<location filename="../BootSplash.cpp" line="119"/>
@@ -406,7 +406,7 @@
<message>
<location filename="../BootSplash.cpp" line="121"/>
<source>I have never let my schooling interfere with my education.</source>
- <translation>Nikdy jsem nenechal vzdělávání plést se do mého vzdělání.</translation>
+ <translation>Nikdy jsem nenechal školy plést se do mého vzdělání.</translation>
</message>
<message>
<location filename="../BootSplash.cpp" line="123"/>
@@ -421,67 +421,67 @@
<message>
<location filename="../BootSplash.cpp" line="127"/>
<source>Sometimes it is not enough that we do our best; we must do what is required.</source>
- <translation>Někdy není dost, že něco uděláme, jak nejlépe umíme. Musíme dělat, co se od nás žádá.</translation>
+ <translation>Někdy nestačí, že děláme jak nejlépe umíme. Musíme dělat, co se od nás žádá.</translation>
</message>
<message>
<location filename="../BootSplash.cpp" line="129"/>
<source>The truth is more important than the facts.</source>
- <translation>Pravda je důležitější než skutečnost.</translation>
+ <translation>Pravda je důležitější než fakta.</translation>
</message>
<message>
<location filename="../BootSplash.cpp" line="131"/>
<source>Better to remain silent and be thought a fool than to speak out and remove all doubt.</source>
- <translation>Lépe zůstat potichu a být považován za hlupáka, než vyjádřit názor a odstranit veškerou pochybnost.</translation>
+ <translation>Lépe zůstat zticha a být považován za hlupáka, než promluvit a tím to potvrdit.</translation>
</message>
<message>
<location filename="../BootSplash.cpp" line="142"/>
<source>Initializing Session …</source>
- <translation>Spouští se sezení…</translation>
+ <translation>Spouštění sezení…</translation>
</message>
<message>
<location filename="../BootSplash.cpp" line="145"/>
<source>Loading System Settings …</source>
- <translation>Nahrává se nastavení systému…</translation>
+ <translation>Načítání nastavení systému…</translation>
</message>
<message>
<location filename="../BootSplash.cpp" line="148"/>
<source>Loading User Preferences …</source>
- <translation>Nahrává se uživatelské nastavení…</translation>
+ <translation>Načítání nastavení uživatele…</translation>
</message>
<message>
<location filename="../BootSplash.cpp" line="151"/>
<source>Preparing System Tray …</source>
- <translation>Připravuje se oznamovací oblast panelu…</translation>
+ <translation>Příprava oznamovací oblasti systémového panelu…</translation>
</message>
<message>
<location filename="../BootSplash.cpp" line="154"/>
<source>Starting Window Manager …</source>
- <translation>Spouští se správce oken…</translation>
+ <translation>Spouštění správce oken…</translation>
</message>
<message>
<location filename="../BootSplash.cpp" line="157"/>
<source>Detecting Applications …</source>
- <translation>Zjišťují se aplikace…</translation>
+ <translation>Zjišťování aplikací…</translation>
</message>
<message>
<location filename="../BootSplash.cpp" line="160"/>
<source>Preparing Menus …</source>
- <translation>Připravují se nabídky…</translation>
+ <translation>Příprava nabídek…</translation>
</message>
<message>
<location filename="../BootSplash.cpp" line="163"/>
<source>Preparing Workspace …</source>
- <translation>Připravuje se pracovní plocha…</translation>
+ <translation>Příprava pracovní plochy…</translation>
</message>
<message>
<location filename="../BootSplash.cpp" line="166"/>
<source>Finalizing …</source>
- <translation>Dokončuje se…</translation>
+ <translation>Dokončování…</translation>
</message>
<message>
<location filename="../BootSplash.cpp" line="169"/>
<source>Starting App: %1</source>
- <translation>Spouští se aplikace: %1</translation>
+ <translation>Spouštění aplikace: %1</translation>
</message>
</context>
<context>
@@ -547,12 +547,12 @@
<message>
<location filename="../panel-plugins/systemstart/ItemWidget.cpp" line="204"/>
<source>Remove from Quicklaunch</source>
- <translation>Odebrat z rychlého spuštění</translation>
+ <translation>Odebrat z rychlého spouštění</translation>
</message>
<message>
<location filename="../panel-plugins/systemstart/ItemWidget.cpp" line="208"/>
<source>Add to Quicklaunch</source>
- <translation>Přidat do rychlého spuštění</translation>
+ <translation>Přidat do rychlého spouštění</translation>
</message>
</context>
<context>
@@ -653,7 +653,7 @@
<message>
<location filename="../panel-plugins/appmenu/LAppMenuPlugin.cpp" line="102"/>
<source>Unsorted</source>
- <translation>Neseřazeno</translation>
+ <translation>Nezařazeno</translation>
</message>
<message>
<location filename="../panel-plugins/appmenu/LAppMenuPlugin.cpp" line="139"/>
@@ -692,7 +692,7 @@
<message>
<location filename="../desktop-plugins/LDPlugin.cpp" line="37"/>
<source>Modify Item</source>
- <translation type="unfinished"></translation>
+ <translation>Upravit položku</translation>
</message>
<message>
<location filename="../desktop-plugins/LDPlugin.cpp" line="45"/>
@@ -773,24 +773,24 @@
<message>
<location filename="../LDesktop.cpp" line="255"/>
<source>Desktop Actions</source>
- <translation type="unfinished"></translation>
+ <translation>Akce desktopu</translation>
</message>
<message>
<location filename="../LDesktop.cpp" line="257"/>
<location filename="../LDesktop.cpp" line="608"/>
<source>New Folder</source>
- <translation type="unfinished"></translation>
+ <translation>Nová složka</translation>
</message>
<message>
<location filename="../LDesktop.cpp" line="258"/>
<location filename="../LDesktop.cpp" line="628"/>
<source>New File</source>
- <translation type="unfinished"></translation>
+ <translation>Nový soubor</translation>
</message>
<message>
<location filename="../LDesktop.cpp" line="259"/>
<source>Paste</source>
- <translation type="unfinished"></translation>
+ <translation>Vložit</translation>
</message>
<message>
<location filename="../LDesktop.cpp" line="291"/>
@@ -827,7 +827,7 @@
<location filename="../LDesktop.cpp" line="634"/>
<location filename="../LDesktop.cpp" line="655"/>
<source>Desktop</source>
- <translation type="unfinished">Plocha</translation>
+ <translation>Plocha</translation>
</message>
</context>
<context>
@@ -844,14 +844,14 @@
<message>
<location filename="../panel-plugins/systemstart/LStartButton.h" line="52"/>
<source>Remove from Quicklaunch</source>
- <translation>Odebrat z rychlého spuštění</translation>
+ <translation>Odebrat z rychlého spouštění</translation>
</message>
</context>
<context>
<name>LSession</name>
<message>
<location filename="../LSession.cpp" line="163"/>
- <location filename="../LSession.cpp" line="344"/>
+ <location filename="../LSession.cpp" line="342"/>
<source>Desktop</source>
<translation>Plocha</translation>
</message>
@@ -861,7 +861,7 @@
<message>
<location filename="../panel-plugins/systemdashboard/LSysDashboard.cpp" line="43"/>
<source>System Dashboard</source>
- <translation>Palubní deska systému</translation>
+ <translation>Přehled o systému</translation>
</message>
</context>
<context>
@@ -874,12 +874,12 @@
<message>
<location filename="../panel-plugins/systemdashboard/SysMenuQuick.ui" line="50"/>
<source>Volume</source>
- <translation type="unfinished"></translation>
+ <translation>Hlasitost</translation>
</message>
<message>
<location filename="../panel-plugins/systemdashboard/SysMenuQuick.ui" line="111"/>
<source>Launch Audio Mixer</source>
- <translation>Spustit Audio Mixer</translation>
+ <translation>Spustit směšovač zvuku</translation>
</message>
<message>
<location filename="../panel-plugins/systemdashboard/SysMenuQuick.ui" line="156"/>
@@ -889,7 +889,7 @@
<message>
<location filename="../panel-plugins/systemdashboard/SysMenuQuick.ui" line="231"/>
<source>Battery Status</source>
- <translation>Stav baterie</translation>
+ <translation>Stav akumulátoru</translation>
</message>
<message>
<location filename="../panel-plugins/systemdashboard/SysMenuQuick.ui" line="296"/>
@@ -899,7 +899,7 @@
<message>
<location filename="../panel-plugins/systemdashboard/SysMenuQuick.ui" line="344"/>
<source>Locale</source>
- <translation>Místní nastavení</translation>
+ <translation>Místní a jazyková nastavení</translation>
</message>
<message>
<location filename="../panel-plugins/systemdashboard/SysMenuQuick.ui" line="378"/>
@@ -967,7 +967,7 @@
<message>
<location filename="../panel-plugins/userbutton/LUserButton.cpp" line="41"/>
<source>Quickly launch applications or open files</source>
- <translation>Rychlé spuštění aplikace nebo otevření souboru</translation>
+ <translation>Rychlé spouštění aplikací nebo otevírání souborů</translation>
</message>
</context>
<context>
@@ -985,22 +985,22 @@
<message>
<location filename="../desktop-plugins/systemmonitor/MonitorWidget.ui" line="42"/>
<source>CPU Temp:</source>
- <translation>Teplota CPU:</translation>
+ <translation>Teplota procesoru:</translation>
</message>
<message>
<location filename="../desktop-plugins/systemmonitor/MonitorWidget.ui" line="56"/>
<source>CPU Usage:</source>
- <translation>Využití CPU:</translation>
+ <translation>Využití procesoru:</translation>
</message>
<message>
<location filename="../desktop-plugins/systemmonitor/MonitorWidget.ui" line="70"/>
<source>Mem Usage:</source>
- <translation>Využití paměti:</translation>
+ <translation>Využití operační paměti:</translation>
</message>
<message>
<location filename="../desktop-plugins/systemmonitor/MonitorWidget.ui" line="85"/>
<source>Disk I/O</source>
- <translation>Diskové I/O</translation>
+ <translation>Vst./výst. datového úložiště</translation>
</message>
</context>
<context>
@@ -1023,17 +1023,17 @@
<message>
<location filename="../desktop-plugins/notepad/NotepadPlugin.cpp" line="138"/>
<source>Name:</source>
- <translation>Jméno:</translation>
+ <translation>Název:</translation>
</message>
<message>
<location filename="../desktop-plugins/notepad/NotepadPlugin.cpp" line="140"/>
<source>Invalid Note Name: Try Again</source>
- <translation>Neplatný název poznámky: Zkuste znovu</translation>
+ <translation>Neplatný název poznámky: Zkuste to znovu</translation>
</message>
<message>
<location filename="../desktop-plugins/notepad/NotepadPlugin.cpp" line="141"/>
<source>Select a Note Name</source>
- <translation>Vyberte jméno poznámky</translation>
+ <translation>Vyberte název poznámky</translation>
</message>
<message>
<location filename="../desktop-plugins/notepad/NotepadPlugin.cpp" line="168"/>
@@ -1081,12 +1081,12 @@
<message>
<location filename="../panel-plugins/audioplayer/PPlayerWidget.cpp" line="73"/>
<source>Add Directory</source>
- <translation>Přidat adresář</translation>
+ <translation>Přidat složku</translation>
</message>
<message>
<location filename="../panel-plugins/audioplayer/PPlayerWidget.cpp" line="74"/>
<source>Add URL</source>
- <translation>Přidat adresu (URL)</translation>
+ <translation>Přidat URL adresu</translation>
</message>
<message>
<location filename="../panel-plugins/audioplayer/PPlayerWidget.cpp" line="102"/>
@@ -1096,22 +1096,22 @@
<message>
<location filename="../panel-plugins/audioplayer/PPlayerWidget.cpp" line="103"/>
<source>Select Multimedia Files</source>
- <translation>Vybere multimediální soubory</translation>
+ <translation>Vyberte multimediální soubory</translation>
</message>
<message>
<location filename="../panel-plugins/audioplayer/PPlayerWidget.cpp" line="130"/>
<source>Select Multimedia Directory</source>
- <translation>Vyberte adresář s multimediálními soubory</translation>
+ <translation>Vyberte složku s multimediálními soubory</translation>
</message>
<message>
<location filename="../panel-plugins/audioplayer/PPlayerWidget.cpp" line="159"/>
<source>Enter a valid URL for a multimedia file or stream:</source>
- <translation>Zadejte platnou adresu (URL) pro multimediální soubor nebo proud:</translation>
+ <translation>Zadejte platnou URL adresu multimediálního souboru nebo proudu:</translation>
</message>
<message>
<location filename="../panel-plugins/audioplayer/PPlayerWidget.cpp" line="161"/>
<source>Multimedia URL</source>
- <translation>Adresa (URL) multimédia</translation>
+ <translation>URL adresa multimédia</translation>
</message>
</context>
<context>
@@ -1139,12 +1139,12 @@
<message>
<location filename="../desktop-plugins/audioplayer/PlayerWidget.cpp" line="73"/>
<source>Add Directory</source>
- <translation>Přidat adresář</translation>
+ <translation>Přidat složku</translation>
</message>
<message>
<location filename="../desktop-plugins/audioplayer/PlayerWidget.cpp" line="74"/>
<source>Add URL</source>
- <translation>Přidat adresu (URL)</translation>
+ <translation>Přidat URL adresu</translation>
</message>
<message>
<location filename="../desktop-plugins/audioplayer/PlayerWidget.cpp" line="102"/>
@@ -1159,17 +1159,17 @@
<message>
<location filename="../desktop-plugins/audioplayer/PlayerWidget.cpp" line="130"/>
<source>Select Multimedia Directory</source>
- <translation>Zvolte adresář s multimédii</translation>
+ <translation>Vyberte složku s multimédii</translation>
</message>
<message>
<location filename="../desktop-plugins/audioplayer/PlayerWidget.cpp" line="159"/>
<source>Enter a valid URL for a multimedia file or stream:</source>
- <translation>Zadejte platnou adresu (URL) pro multimediální soubor nebo proud:</translation>
+ <translation>Zadejte platnou URL adresu multimediálního souboru nebo proudu:</translation>
</message>
<message>
<location filename="../desktop-plugins/audioplayer/PlayerWidget.cpp" line="161"/>
<source>Multimedia URL</source>
- <translation>Adresa (URL) multimédia</translation>
+ <translation>URL adresa multimédia</translation>
</message>
</context>
<context>
@@ -1187,7 +1187,7 @@
<message>
<location filename="../desktop-plugins/rssreader/RSSFeedPlugin.ui" line="89"/>
<source>Open Website</source>
- <translation>Otevřít internetovou stránku</translation>
+ <translation>Otevřít webovou stránku</translation>
</message>
<message>
<location filename="../desktop-plugins/rssreader/RSSFeedPlugin.ui" line="92"/>
@@ -1219,12 +1219,12 @@
<message>
<location filename="../desktop-plugins/rssreader/RSSFeedPlugin.ui" line="287"/>
<source>RSS URL</source>
- <translation>Adresa RSS</translation>
+ <translation>URL adresa RSS kanálu</translation>
</message>
<message>
<location filename="../desktop-plugins/rssreader/RSSFeedPlugin.ui" line="302"/>
<source>Load a preset RSS Feed</source>
- <translation>Nahrát kanál RSS s přednastavením</translation>
+ <translation>Načíst přednastavený RSS kanál</translation>
</message>
<message>
<location filename="../desktop-plugins/rssreader/RSSFeedPlugin.ui" line="332"/>
@@ -1239,7 +1239,7 @@
<message>
<location filename="../desktop-plugins/rssreader/RSSFeedPlugin.ui" line="430"/>
<source>Manual Sync Only</source>
- <translation>Pouze ruční seřízení</translation>
+ <translation>Pouze ruční synchronizace</translation>
</message>
<message>
<location filename="../desktop-plugins/rssreader/RSSFeedPlugin.ui" line="437"/>
@@ -1249,7 +1249,7 @@
<message>
<location filename="../desktop-plugins/rssreader/RSSFeedPlugin.ui" line="440"/>
<source>Default Sync Interval</source>
- <translation>Výchozí seřizovací interval</translation>
+ <translation>Výchozí interval synchronizace</translation>
</message>
<message>
<location filename="../desktop-plugins/rssreader/RSSFeedPlugin.ui" line="471"/>
@@ -1270,7 +1270,7 @@
<message>
<location filename="../desktop-plugins/rssreader/RSSFeedPlugin.cpp" line="70"/>
<source>Add RSS Feed</source>
- <translation>Přidat kanál RSS</translation>
+ <translation>Přidat RSS kanál</translation>
</message>
<message>
<location filename="../desktop-plugins/rssreader/RSSFeedPlugin.cpp" line="71"/>
@@ -1290,12 +1290,12 @@
<message>
<location filename="../desktop-plugins/rssreader/RSSFeedPlugin.cpp" line="78"/>
<source>Lumina Desktop RSS</source>
- <translation>RSS prostředí Lumina</translation>
+ <translation>RSS kanál prostředí Lumina</translation>
</message>
<message>
<location filename="../desktop-plugins/rssreader/RSSFeedPlugin.cpp" line="143"/>
<source>Feed URL: %1</source>
- <translation>Adresa (URL) kanálu: %1</translation>
+ <translation>URL adresa kanálu: %1</translation>
</message>
<message>
<location filename="../desktop-plugins/rssreader/RSSFeedPlugin.cpp" line="144"/>
@@ -1315,17 +1315,17 @@
<message>
<location filename="../desktop-plugins/rssreader/RSSFeedPlugin.cpp" line="147"/>
<source>Last Build Date: %1</source>
- <translation>Poslední datum sestavení: %1</translation>
+ <translation>Datum minulého sestavení: %1</translation>
</message>
<message>
<location filename="../desktop-plugins/rssreader/RSSFeedPlugin.cpp" line="148"/>
<source>Last Sync: %1</source>
- <translation>Poslední seřízení: %1</translation>
+ <translation>Minulá synchronizace: %1</translation>
</message>
<message>
<location filename="../desktop-plugins/rssreader/RSSFeedPlugin.cpp" line="149"/>
<source>Next Sync: %1</source>
- <translation>Další seřízení: %1</translation>
+ <translation>Příští synchronizace: %1</translation>
</message>
</context>
<context>
@@ -1338,7 +1338,7 @@
<message>
<location filename="../SettingsMenu.cpp" line="26"/>
<source>Preferences</source>
- <translation>Nastavení</translation>
+ <translation>Předvolby</translation>
</message>
<message>
<location filename="../SettingsMenu.cpp" line="33"/>
@@ -1416,22 +1416,22 @@
<message>
<location filename="../panel-plugins/systemstart/StartMenu.ui" line="924"/>
<source>Suspend</source>
- <translation type="unfinished">Uspat do paměti</translation>
+ <translation>Uspat do paměti</translation>
</message>
<message>
<location filename="../panel-plugins/systemstart/StartMenu.ui" line="989"/>
<source>Restart</source>
- <translation type="unfinished">Restartovat</translation>
+ <translation>Restartovat</translation>
</message>
<message>
<location filename="../panel-plugins/systemstart/StartMenu.ui" line="1017"/>
<source>Power Off</source>
- <translation type="unfinished"></translation>
+ <translation>Vypnout</translation>
</message>
<message>
<location filename="../panel-plugins/systemstart/StartMenu.ui" line="1065"/>
<source>Log Out</source>
- <translation type="unfinished">Odhlásit se</translation>
+ <translation>Odhlásit se</translation>
</message>
<message>
<location filename="../panel-plugins/systemstart/StartMenu.ui" line="262"/>
@@ -1441,7 +1441,7 @@
<message>
<location filename="../panel-plugins/systemstart/StartMenu.ui" line="1036"/>
<source>(System Performing Updates)</source>
- <translation>(aktualizace výkonu systému)</translation>
+ <translation>(systém instaluje aktualizace)</translation>
</message>
<message>
<location filename="../panel-plugins/systemstart/StartMenu.ui" line="1125"/>
@@ -1451,12 +1451,12 @@
<message>
<location filename="../panel-plugins/systemstart/StartMenu.cpp" line="292"/>
<source>Apply Updates?</source>
- <translation>Použít aktualizace?</translation>
+ <translation>Nainstalovat aktualizace?</translation>
</message>
<message>
<location filename="../panel-plugins/systemstart/StartMenu.cpp" line="292"/>
<source>You have system updates waiting to be applied! Do you wish to install them now?</source>
- <translation>Na použití čekají aktualizace systému! Chcete je nainstalovat nyní?</translation>
+ <translation>Aktualizace systému čekají na instalaci! Chcete je nainstalovat nyní?</translation>
</message>
<message>
<location filename="../panel-plugins/systemstart/StartMenu.cpp" line="500"/>
@@ -1486,7 +1486,7 @@
<message>
<location filename="../SystemWindow.ui" line="14"/>
<source>System Options</source>
- <translation>Možnosti systému</translation>
+ <translation>Předvolby systému</translation>
</message>
<message>
<location filename="../SystemWindow.ui" line="55"/>
@@ -1501,12 +1501,12 @@
<message>
<location filename="../SystemWindow.ui" line="87"/>
<source>Power Off</source>
- <translation type="unfinished"></translation>
+ <translation>Vypnout</translation>
</message>
<message>
<location filename="../SystemWindow.ui" line="127"/>
<source>Cancel</source>
- <translation>Zrušit</translation>
+ <translation>Storno</translation>
</message>
<message>
<location filename="../SystemWindow.ui" line="156"/>
@@ -1521,12 +1521,12 @@
<message>
<location filename="../SystemWindow.cpp" line="57"/>
<source>Apply Updates?</source>
- <translation>Použít aktualizace?</translation>
+ <translation>Nainstalovat aktualizace?</translation>
</message>
<message>
<location filename="../SystemWindow.cpp" line="57"/>
<source>You have system updates waiting to be applied! Do you wish to install them now?</source>
- <translation>Na použití čekají aktualizace systému! Chcete je nainstalovat nyní?</translation>
+ <translation>Aktualizace systému čekají na instalaci! Chcete je nainstalovat nyní?</translation>
</message>
</context>
<context>
@@ -1539,7 +1539,7 @@
<message>
<location filename="../panel-plugins/userbutton/UserItemWidget.cpp" line="134"/>
<source>Remove Shortcut</source>
- <translation>Odebrat klávesovou zkratku</translation>
+ <translation>Odebrat zkratku</translation>
</message>
<message>
<location filename="../panel-plugins/userbutton/UserItemWidget.cpp" line="139"/>
@@ -1630,7 +1630,7 @@
<message>
<location filename="../panel-plugins/userbutton/UserWidget.ui" line="458"/>
<source>Config</source>
- <translation>Konfigurace</translation>
+ <translation>Nastavení</translation>
</message>
<message>
<location filename="../panel-plugins/userbutton/UserWidget.ui" line="461"/>
@@ -1645,12 +1645,12 @@
<message>
<location filename="../panel-plugins/userbutton/UserWidget.ui" line="495"/>
<source>Desktop Appearance/Plugins</source>
- <translation>Vzhled/Pluginy plochy</translation>
+ <translation>Vzhled / zásuvné moduly plochy</translation>
</message>
<message>
<location filename="../panel-plugins/userbutton/UserWidget.ui" line="517"/>
<source>Screen Configuration</source>
- <translation>Konfigurace obrazovky</translation>
+ <translation>Nastavení obrazovky</translation>
</message>
<message>
<location filename="../panel-plugins/userbutton/UserWidget.ui" line="539"/>
diff --git a/src-qt5/core/lumina-desktop/i18n/lumina-desktop_cy.ts b/src-qt5/core/lumina-desktop/i18n/lumina-desktop_cy.ts
index 6a86d9f6..caeb719a 100644
--- a/src-qt5/core/lumina-desktop/i18n/lumina-desktop_cy.ts
+++ b/src-qt5/core/lumina-desktop/i18n/lumina-desktop_cy.ts
@@ -38,62 +38,62 @@
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../desktop-plugins/applauncher/AppLauncherPlugin.cpp" line="72"/>
+ <location filename="../desktop-plugins/applauncher/AppLauncherPlugin.cpp" line="73"/>
<source>Launch %1</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../desktop-plugins/applauncher/AppLauncherPlugin.cpp" line="127"/>
+ <location filename="../desktop-plugins/applauncher/AppLauncherPlugin.cpp" line="134"/>
<source>Open</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../desktop-plugins/applauncher/AppLauncherPlugin.cpp" line="129"/>
+ <location filename="../desktop-plugins/applauncher/AppLauncherPlugin.cpp" line="136"/>
<source>Open With</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../desktop-plugins/applauncher/AppLauncherPlugin.cpp" line="132"/>
+ <location filename="../desktop-plugins/applauncher/AppLauncherPlugin.cpp" line="139"/>
<source>View Properties</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../desktop-plugins/applauncher/AppLauncherPlugin.cpp" line="134"/>
+ <location filename="../desktop-plugins/applauncher/AppLauncherPlugin.cpp" line="141"/>
<source>File Operations</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../desktop-plugins/applauncher/AppLauncherPlugin.cpp" line="136"/>
+ <location filename="../desktop-plugins/applauncher/AppLauncherPlugin.cpp" line="143"/>
<source>Rename</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../desktop-plugins/applauncher/AppLauncherPlugin.cpp" line="139"/>
+ <location filename="../desktop-plugins/applauncher/AppLauncherPlugin.cpp" line="146"/>
<source>Copy</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../desktop-plugins/applauncher/AppLauncherPlugin.cpp" line="142"/>
+ <location filename="../desktop-plugins/applauncher/AppLauncherPlugin.cpp" line="149"/>
<source>Cut</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../desktop-plugins/applauncher/AppLauncherPlugin.cpp" line="144"/>
+ <location filename="../desktop-plugins/applauncher/AppLauncherPlugin.cpp" line="151"/>
<source>Delete</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../desktop-plugins/applauncher/AppLauncherPlugin.cpp" line="205"/>
+ <location filename="../desktop-plugins/applauncher/AppLauncherPlugin.cpp" line="212"/>
<source>Select Application</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../desktop-plugins/applauncher/AppLauncherPlugin.cpp" line="205"/>
+ <location filename="../desktop-plugins/applauncher/AppLauncherPlugin.cpp" line="212"/>
<source>Name:</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../desktop-plugins/applauncher/AppLauncherPlugin.cpp" line="291"/>
+ <location filename="../desktop-plugins/applauncher/AppLauncherPlugin.cpp" line="298"/>
<source>New Filename</source>
<translation type="unfinished"></translation>
</message>
@@ -851,7 +851,7 @@
<name>LSession</name>
<message>
<location filename="../LSession.cpp" line="163"/>
- <location filename="../LSession.cpp" line="344"/>
+ <location filename="../LSession.cpp" line="342"/>
<source>Desktop</source>
<translation type="unfinished"></translation>
</message>
diff --git a/src-qt5/core/lumina-desktop/i18n/lumina-desktop_da.ts b/src-qt5/core/lumina-desktop/i18n/lumina-desktop_da.ts
index d28fbbc4..a9522431 100644
--- a/src-qt5/core/lumina-desktop/i18n/lumina-desktop_da.ts
+++ b/src-qt5/core/lumina-desktop/i18n/lumina-desktop_da.ts
@@ -38,62 +38,62 @@
<translation>Klik for at sætte</translation>
</message>
<message>
- <location filename="../desktop-plugins/applauncher/AppLauncherPlugin.cpp" line="72"/>
+ <location filename="../desktop-plugins/applauncher/AppLauncherPlugin.cpp" line="73"/>
<source>Launch %1</source>
<translation>Start %1</translation>
</message>
<message>
- <location filename="../desktop-plugins/applauncher/AppLauncherPlugin.cpp" line="127"/>
+ <location filename="../desktop-plugins/applauncher/AppLauncherPlugin.cpp" line="134"/>
<source>Open</source>
<translation>Åbn</translation>
</message>
<message>
- <location filename="../desktop-plugins/applauncher/AppLauncherPlugin.cpp" line="129"/>
+ <location filename="../desktop-plugins/applauncher/AppLauncherPlugin.cpp" line="136"/>
<source>Open With</source>
<translation>Åbn med</translation>
</message>
<message>
- <location filename="../desktop-plugins/applauncher/AppLauncherPlugin.cpp" line="132"/>
+ <location filename="../desktop-plugins/applauncher/AppLauncherPlugin.cpp" line="139"/>
<source>View Properties</source>
<translation>Vis egenskaber</translation>
</message>
<message>
- <location filename="../desktop-plugins/applauncher/AppLauncherPlugin.cpp" line="134"/>
+ <location filename="../desktop-plugins/applauncher/AppLauncherPlugin.cpp" line="141"/>
<source>File Operations</source>
<translation>Filhandlinger</translation>
</message>
<message>
- <location filename="../desktop-plugins/applauncher/AppLauncherPlugin.cpp" line="136"/>
+ <location filename="../desktop-plugins/applauncher/AppLauncherPlugin.cpp" line="143"/>
<source>Rename</source>
<translation>Omdøb</translation>
</message>
<message>
- <location filename="../desktop-plugins/applauncher/AppLauncherPlugin.cpp" line="139"/>
+ <location filename="../desktop-plugins/applauncher/AppLauncherPlugin.cpp" line="146"/>
<source>Copy</source>
<translation>Kopiér</translation>
</message>
<message>
- <location filename="../desktop-plugins/applauncher/AppLauncherPlugin.cpp" line="142"/>
+ <location filename="../desktop-plugins/applauncher/AppLauncherPlugin.cpp" line="149"/>
<source>Cut</source>
<translation>Klip</translation>
</message>
<message>
- <location filename="../desktop-plugins/applauncher/AppLauncherPlugin.cpp" line="144"/>
+ <location filename="../desktop-plugins/applauncher/AppLauncherPlugin.cpp" line="151"/>
<source>Delete</source>
<translation>Slet</translation>
</message>
<message>
- <location filename="../desktop-plugins/applauncher/AppLauncherPlugin.cpp" line="205"/>
+ <location filename="../desktop-plugins/applauncher/AppLauncherPlugin.cpp" line="212"/>
<source>Select Application</source>
<translation>Vælg program</translation>
</message>
<message>
- <location filename="../desktop-plugins/applauncher/AppLauncherPlugin.cpp" line="205"/>
+ <location filename="../desktop-plugins/applauncher/AppLauncherPlugin.cpp" line="212"/>
<source>Name:</source>
<translation>Navn:</translation>
</message>
<message>
- <location filename="../desktop-plugins/applauncher/AppLauncherPlugin.cpp" line="291"/>
+ <location filename="../desktop-plugins/applauncher/AppLauncherPlugin.cpp" line="298"/>
<source>New Filename</source>
<translation>Nyt filnavn</translation>
</message>
@@ -265,12 +265,12 @@
</message>
<message>
<location filename="../BootSplash.cpp" line="65"/>
- <source>Don't expect to build up the weak by pulling down the strong.</source>
+ <source>Don&apos;t expect to build up the weak by pulling down the strong.</source>
<translation>Forvent ikke at opbygge det svage ved at nedrive det stærke.</translation>
</message>
<message>
<location filename="../BootSplash.cpp" line="67"/>
- <source>You can't know too much, but you can say too much.</source>
+ <source>You can&apos;t know too much, but you can say too much.</source>
<translation>Du kan ikke vide for meget, men du kan sige for meget.</translation>
</message>
<message>
@@ -350,7 +350,7 @@
</message>
<message>
<location filename="../BootSplash.cpp" line="99"/>
- <source>Only two things are infinite, the universe and human stupidity, and I'm not sure about the former.</source>
+ <source>Only two things are infinite, the universe and human stupidity, and I&apos;m not sure about the former.</source>
<translation>Kun to ting er uendelige, universet og menneskelig dumhed, og jeg er ikke sikker på det første.</translation>
</message>
<message>
@@ -360,8 +360,8 @@
</message>
<message>
<location filename="../BootSplash.cpp" line="103"/>
- <source>Do, or do not. There is no 'try'.</source>
- <translation>Gør eller lad være. Der er ikke noget "prøv".</translation>
+ <source>Do, or do not. There is no &apos;try&apos;.</source>
+ <translation>Gør eller lad være. Der er ikke noget &quot;prøv&quot;.</translation>
</message>
<message>
<location filename="../BootSplash.cpp" line="105"/>
@@ -380,7 +380,7 @@
</message>
<message>
<location filename="../BootSplash.cpp" line="111"/>
- <source>It's kind of fun to do the impossible.</source>
+ <source>It&apos;s kind of fun to do the impossible.</source>
<translation>Det er egentligt sjovt at gøre det umulige.</translation>
</message>
<message>
@@ -851,7 +851,7 @@
<name>LSession</name>
<message>
<location filename="../LSession.cpp" line="163"/>
- <location filename="../LSession.cpp" line="344"/>
+ <location filename="../LSession.cpp" line="342"/>
<source>Desktop</source>
<translation>Skrivebord</translation>
</message>
diff --git a/src-qt5/core/lumina-desktop/i18n/lumina-desktop_de.ts b/src-qt5/core/lumina-desktop/i18n/lumina-desktop_de.ts
index f4626cee..644524e1 100644
--- a/src-qt5/core/lumina-desktop/i18n/lumina-desktop_de.ts
+++ b/src-qt5/core/lumina-desktop/i18n/lumina-desktop_de.ts
@@ -38,62 +38,62 @@
<translation>Klicken zum Festlegen</translation>
</message>
<message>
- <location filename="../desktop-plugins/applauncher/AppLauncherPlugin.cpp" line="72"/>
+ <location filename="../desktop-plugins/applauncher/AppLauncherPlugin.cpp" line="73"/>
<source>Launch %1</source>
<translation>%1 starten</translation>
</message>
<message>
- <location filename="../desktop-plugins/applauncher/AppLauncherPlugin.cpp" line="127"/>
+ <location filename="../desktop-plugins/applauncher/AppLauncherPlugin.cpp" line="134"/>
<source>Open</source>
<translation>Öffnen</translation>
</message>
<message>
- <location filename="../desktop-plugins/applauncher/AppLauncherPlugin.cpp" line="129"/>
+ <location filename="../desktop-plugins/applauncher/AppLauncherPlugin.cpp" line="136"/>
<source>Open With</source>
<translation>Öffnen mit</translation>
</message>
<message>
- <location filename="../desktop-plugins/applauncher/AppLauncherPlugin.cpp" line="132"/>
+ <location filename="../desktop-plugins/applauncher/AppLauncherPlugin.cpp" line="139"/>
<source>View Properties</source>
<translation>Eigenschaften anzeigen</translation>
</message>
<message>
- <location filename="../desktop-plugins/applauncher/AppLauncherPlugin.cpp" line="134"/>
+ <location filename="../desktop-plugins/applauncher/AppLauncherPlugin.cpp" line="141"/>
<source>File Operations</source>
<translation>Dateioperationen</translation>
</message>
<message>
- <location filename="../desktop-plugins/applauncher/AppLauncherPlugin.cpp" line="136"/>
+ <location filename="../desktop-plugins/applauncher/AppLauncherPlugin.cpp" line="143"/>
<source>Rename</source>
<translation>Umbenennen</translation>
</message>
<message>
- <location filename="../desktop-plugins/applauncher/AppLauncherPlugin.cpp" line="139"/>
+ <location filename="../desktop-plugins/applauncher/AppLauncherPlugin.cpp" line="146"/>
<source>Copy</source>
<translation>Kopieren</translation>
</message>
<message>
- <location filename="../desktop-plugins/applauncher/AppLauncherPlugin.cpp" line="142"/>
+ <location filename="../desktop-plugins/applauncher/AppLauncherPlugin.cpp" line="149"/>
<source>Cut</source>
<translation>Ausschneiden</translation>
</message>
<message>
- <location filename="../desktop-plugins/applauncher/AppLauncherPlugin.cpp" line="144"/>
+ <location filename="../desktop-plugins/applauncher/AppLauncherPlugin.cpp" line="151"/>
<source>Delete</source>
<translation>Löschen</translation>
</message>
<message>
- <location filename="../desktop-plugins/applauncher/AppLauncherPlugin.cpp" line="205"/>
+ <location filename="../desktop-plugins/applauncher/AppLauncherPlugin.cpp" line="212"/>
<source>Select Application</source>
<translation>Anwendung auswählen</translation>
</message>
<message>
- <location filename="../desktop-plugins/applauncher/AppLauncherPlugin.cpp" line="205"/>
+ <location filename="../desktop-plugins/applauncher/AppLauncherPlugin.cpp" line="212"/>
<source>Name:</source>
<translation>Name:</translation>
</message>
<message>
- <location filename="../desktop-plugins/applauncher/AppLauncherPlugin.cpp" line="291"/>
+ <location filename="../desktop-plugins/applauncher/AppLauncherPlugin.cpp" line="298"/>
<source>New Filename</source>
<translation>Neuer Dateiname</translation>
</message>
@@ -851,7 +851,7 @@
<name>LSession</name>
<message>
<location filename="../LSession.cpp" line="163"/>
- <location filename="../LSession.cpp" line="344"/>
+ <location filename="../LSession.cpp" line="342"/>
<source>Desktop</source>
<translation>Arbeitsfläche</translation>
</message>
diff --git a/src-qt5/core/lumina-desktop/i18n/lumina-desktop_el.ts b/src-qt5/core/lumina-desktop/i18n/lumina-desktop_el.ts
index ef889209..257c2f1d 100644
--- a/src-qt5/core/lumina-desktop/i18n/lumina-desktop_el.ts
+++ b/src-qt5/core/lumina-desktop/i18n/lumina-desktop_el.ts
@@ -38,62 +38,62 @@
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../desktop-plugins/applauncher/AppLauncherPlugin.cpp" line="72"/>
+ <location filename="../desktop-plugins/applauncher/AppLauncherPlugin.cpp" line="73"/>
<source>Launch %1</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../desktop-plugins/applauncher/AppLauncherPlugin.cpp" line="127"/>
+ <location filename="../desktop-plugins/applauncher/AppLauncherPlugin.cpp" line="134"/>
<source>Open</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../desktop-plugins/applauncher/AppLauncherPlugin.cpp" line="129"/>
+ <location filename="../desktop-plugins/applauncher/AppLauncherPlugin.cpp" line="136"/>
<source>Open With</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../desktop-plugins/applauncher/AppLauncherPlugin.cpp" line="132"/>
+ <location filename="../desktop-plugins/applauncher/AppLauncherPlugin.cpp" line="139"/>
<source>View Properties</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../desktop-plugins/applauncher/AppLauncherPlugin.cpp" line="134"/>
+ <location filename="../desktop-plugins/applauncher/AppLauncherPlugin.cpp" line="141"/>
<source>File Operations</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../desktop-plugins/applauncher/AppLauncherPlugin.cpp" line="136"/>
+ <location filename="../desktop-plugins/applauncher/AppLauncherPlugin.cpp" line="143"/>
<source>Rename</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../desktop-plugins/applauncher/AppLauncherPlugin.cpp" line="139"/>
+ <location filename="../desktop-plugins/applauncher/AppLauncherPlugin.cpp" line="146"/>
<source>Copy</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../desktop-plugins/applauncher/AppLauncherPlugin.cpp" line="142"/>
+ <location filename="../desktop-plugins/applauncher/AppLauncherPlugin.cpp" line="149"/>
<source>Cut</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../desktop-plugins/applauncher/AppLauncherPlugin.cpp" line="144"/>
+ <location filename="../desktop-plugins/applauncher/AppLauncherPlugin.cpp" line="151"/>
<source>Delete</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../desktop-plugins/applauncher/AppLauncherPlugin.cpp" line="205"/>
+ <location filename="../desktop-plugins/applauncher/AppLauncherPlugin.cpp" line="212"/>
<source>Select Application</source>
<translation>Επιλογή εφαρμογής</translation>
</message>
<message>
- <location filename="../desktop-plugins/applauncher/AppLauncherPlugin.cpp" line="205"/>
+ <location filename="../desktop-plugins/applauncher/AppLauncherPlugin.cpp" line="212"/>
<source>Name:</source>
<translation>Όνομα:</translation>
</message>
<message>
- <location filename="../desktop-plugins/applauncher/AppLauncherPlugin.cpp" line="291"/>
+ <location filename="../desktop-plugins/applauncher/AppLauncherPlugin.cpp" line="298"/>
<source>New Filename</source>
<translation type="unfinished"></translation>
</message>
@@ -851,7 +851,7 @@
<name>LSession</name>
<message>
<location filename="../LSession.cpp" line="163"/>
- <location filename="../LSession.cpp" line="344"/>
+ <location filename="../LSession.cpp" line="342"/>
<source>Desktop</source>
<translation type="unfinished"></translation>
</message>
diff --git a/src-qt5/core/lumina-desktop/i18n/lumina-desktop_en_GB.ts b/src-qt5/core/lumina-desktop/i18n/lumina-desktop_en_GB.ts
index c3a92c07..bbc321e2 100644
--- a/src-qt5/core/lumina-desktop/i18n/lumina-desktop_en_GB.ts
+++ b/src-qt5/core/lumina-desktop/i18n/lumina-desktop_en_GB.ts
@@ -38,62 +38,62 @@
<translation>Click to Set</translation>
</message>
<message>
- <location filename="../desktop-plugins/applauncher/AppLauncherPlugin.cpp" line="72"/>
+ <location filename="../desktop-plugins/applauncher/AppLauncherPlugin.cpp" line="73"/>
<source>Launch %1</source>
<translation type="unfinished">Starte %1</translation>
</message>
<message>
- <location filename="../desktop-plugins/applauncher/AppLauncherPlugin.cpp" line="127"/>
+ <location filename="../desktop-plugins/applauncher/AppLauncherPlugin.cpp" line="134"/>
<source>Open</source>
<translation type="unfinished">Open</translation>
</message>
<message>
- <location filename="../desktop-plugins/applauncher/AppLauncherPlugin.cpp" line="129"/>
+ <location filename="../desktop-plugins/applauncher/AppLauncherPlugin.cpp" line="136"/>
<source>Open With</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../desktop-plugins/applauncher/AppLauncherPlugin.cpp" line="132"/>
+ <location filename="../desktop-plugins/applauncher/AppLauncherPlugin.cpp" line="139"/>
<source>View Properties</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../desktop-plugins/applauncher/AppLauncherPlugin.cpp" line="134"/>
+ <location filename="../desktop-plugins/applauncher/AppLauncherPlugin.cpp" line="141"/>
<source>File Operations</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../desktop-plugins/applauncher/AppLauncherPlugin.cpp" line="136"/>
+ <location filename="../desktop-plugins/applauncher/AppLauncherPlugin.cpp" line="143"/>
<source>Rename</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../desktop-plugins/applauncher/AppLauncherPlugin.cpp" line="139"/>
+ <location filename="../desktop-plugins/applauncher/AppLauncherPlugin.cpp" line="146"/>
<source>Copy</source>
<translation type="unfinished">Copy</translation>
</message>
<message>
- <location filename="../desktop-plugins/applauncher/AppLauncherPlugin.cpp" line="142"/>
+ <location filename="../desktop-plugins/applauncher/AppLauncherPlugin.cpp" line="149"/>
<source>Cut</source>
<translation type="unfinished">Cut</translation>
</message>
<message>
- <location filename="../desktop-plugins/applauncher/AppLauncherPlugin.cpp" line="144"/>
+ <location filename="../desktop-plugins/applauncher/AppLauncherPlugin.cpp" line="151"/>
<source>Delete</source>
<translation type="unfinished">Delete</translation>
</message>
<message>
- <location filename="../desktop-plugins/applauncher/AppLauncherPlugin.cpp" line="205"/>
+ <location filename="../desktop-plugins/applauncher/AppLauncherPlugin.cpp" line="212"/>
<source>Select Application</source>
<translation>Select Application</translation>
</message>
<message>
- <location filename="../desktop-plugins/applauncher/AppLauncherPlugin.cpp" line="205"/>
+ <location filename="../desktop-plugins/applauncher/AppLauncherPlugin.cpp" line="212"/>
<source>Name:</source>
<translation>Name:</translation>
</message>
<message>
- <location filename="../desktop-plugins/applauncher/AppLauncherPlugin.cpp" line="291"/>
+ <location filename="../desktop-plugins/applauncher/AppLauncherPlugin.cpp" line="298"/>
<source>New Filename</source>
<translation type="unfinished"></translation>
</message>
@@ -265,12 +265,12 @@
</message>
<message>
<location filename="../BootSplash.cpp" line="65"/>
- <source>Don&apos;t expect to build up the weak by pulling down the strong.</source>
+ <source>Don't expect to build up the weak by pulling down the strong.</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../BootSplash.cpp" line="67"/>
- <source>You can&apos;t know too much, but you can say too much.</source>
+ <source>You can't know too much, but you can say too much.</source>
<translation type="unfinished"></translation>
</message>
<message>
@@ -350,7 +350,7 @@
</message>
<message>
<location filename="../BootSplash.cpp" line="99"/>
- <source>Only two things are infinite, the universe and human stupidity, and I&apos;m not sure about the former.</source>
+ <source>Only two things are infinite, the universe and human stupidity, and I'm not sure about the former.</source>
<translation type="unfinished"></translation>
</message>
<message>
@@ -360,7 +360,7 @@
</message>
<message>
<location filename="../BootSplash.cpp" line="103"/>
- <source>Do, or do not. There is no &apos;try&apos;.</source>
+ <source>Do, or do not. There is no 'try'.</source>
<translation type="unfinished"></translation>
</message>
<message>
@@ -380,7 +380,7 @@
</message>
<message>
<location filename="../BootSplash.cpp" line="111"/>
- <source>It&apos;s kind of fun to do the impossible.</source>
+ <source>It's kind of fun to do the impossible.</source>
<translation type="unfinished"></translation>
</message>
<message>
@@ -436,22 +436,22 @@
<message>
<location filename="../BootSplash.cpp" line="142"/>
<source>Initializing Session …</source>
- <translation>Initialising Session ...</translation>
+ <translation>Initialising Session …</translation>
</message>
<message>
<location filename="../BootSplash.cpp" line="145"/>
<source>Loading System Settings …</source>
- <translation>Loading System Settings ...</translation>
+ <translation>Loading System Settings …</translation>
</message>
<message>
<location filename="../BootSplash.cpp" line="148"/>
<source>Loading User Preferences …</source>
- <translation>Loading User Preferences ...</translation>
+ <translation>Loading User Preferences …</translation>
</message>
<message>
<location filename="../BootSplash.cpp" line="151"/>
<source>Preparing System Tray …</source>
- <translation>Preparing System Tray ...</translation>
+ <translation>Preparing System Tray …</translation>
</message>
<message>
<location filename="../BootSplash.cpp" line="154"/>
@@ -851,7 +851,7 @@
<name>LSession</name>
<message>
<location filename="../LSession.cpp" line="163"/>
- <location filename="../LSession.cpp" line="344"/>
+ <location filename="../LSession.cpp" line="342"/>
<source>Desktop</source>
<translation>Desktop</translation>
</message>
diff --git a/src-qt5/core/lumina-desktop/i18n/lumina-desktop_en_ZA.ts b/src-qt5/core/lumina-desktop/i18n/lumina-desktop_en_ZA.ts
index 6a86d9f6..caeb719a 100644
--- a/src-qt5/core/lumina-desktop/i18n/lumina-desktop_en_ZA.ts
+++ b/src-qt5/core/lumina-desktop/i18n/lumina-desktop_en_ZA.ts
@@ -38,62 +38,62 @@
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../desktop-plugins/applauncher/AppLauncherPlugin.cpp" line="72"/>
+ <location filename="../desktop-plugins/applauncher/AppLauncherPlugin.cpp" line="73"/>
<source>Launch %1</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../desktop-plugins/applauncher/AppLauncherPlugin.cpp" line="127"/>
+ <location filename="../desktop-plugins/applauncher/AppLauncherPlugin.cpp" line="134"/>
<source>Open</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../desktop-plugins/applauncher/AppLauncherPlugin.cpp" line="129"/>
+ <location filename="../desktop-plugins/applauncher/AppLauncherPlugin.cpp" line="136"/>
<source>Open With</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../desktop-plugins/applauncher/AppLauncherPlugin.cpp" line="132"/>
+ <location filename="../desktop-plugins/applauncher/AppLauncherPlugin.cpp" line="139"/>
<source>View Properties</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../desktop-plugins/applauncher/AppLauncherPlugin.cpp" line="134"/>
+ <location filename="../desktop-plugins/applauncher/AppLauncherPlugin.cpp" line="141"/>
<source>File Operations</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../desktop-plugins/applauncher/AppLauncherPlugin.cpp" line="136"/>
+ <location filename="../desktop-plugins/applauncher/AppLauncherPlugin.cpp" line="143"/>
<source>Rename</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../desktop-plugins/applauncher/AppLauncherPlugin.cpp" line="139"/>
+ <location filename="../desktop-plugins/applauncher/AppLauncherPlugin.cpp" line="146"/>
<source>Copy</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../desktop-plugins/applauncher/AppLauncherPlugin.cpp" line="142"/>
+ <location filename="../desktop-plugins/applauncher/AppLauncherPlugin.cpp" line="149"/>
<source>Cut</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../desktop-plugins/applauncher/AppLauncherPlugin.cpp" line="144"/>
+ <location filename="../desktop-plugins/applauncher/AppLauncherPlugin.cpp" line="151"/>
<source>Delete</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../desktop-plugins/applauncher/AppLauncherPlugin.cpp" line="205"/>
+ <location filename="../desktop-plugins/applauncher/AppLauncherPlugin.cpp" line="212"/>
<source>Select Application</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../desktop-plugins/applauncher/AppLauncherPlugin.cpp" line="205"/>
+ <location filename="../desktop-plugins/applauncher/AppLauncherPlugin.cpp" line="212"/>
<source>Name:</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../desktop-plugins/applauncher/AppLauncherPlugin.cpp" line="291"/>
+ <location filename="../desktop-plugins/applauncher/AppLauncherPlugin.cpp" line="298"/>
<source>New Filename</source>
<translation type="unfinished"></translation>
</message>
@@ -851,7 +851,7 @@
<name>LSession</name>
<message>
<location filename="../LSession.cpp" line="163"/>
- <location filename="../LSession.cpp" line="344"/>
+ <location filename="../LSession.cpp" line="342"/>
<source>Desktop</source>
<translation type="unfinished"></translation>
</message>
diff --git a/src-qt5/core/lumina-desktop/i18n/lumina-desktop_es.ts b/src-qt5/core/lumina-desktop/i18n/lumina-desktop_es.ts
index 3a598c96..ad5bcdff 100644
--- a/src-qt5/core/lumina-desktop/i18n/lumina-desktop_es.ts
+++ b/src-qt5/core/lumina-desktop/i18n/lumina-desktop_es.ts
@@ -38,62 +38,62 @@
<translation>Presione para Aplicar</translation>
</message>
<message>
- <location filename="../desktop-plugins/applauncher/AppLauncherPlugin.cpp" line="72"/>
+ <location filename="../desktop-plugins/applauncher/AppLauncherPlugin.cpp" line="73"/>
<source>Launch %1</source>
<translation type="unfinished">Lanzar %1</translation>
</message>
<message>
- <location filename="../desktop-plugins/applauncher/AppLauncherPlugin.cpp" line="127"/>
+ <location filename="../desktop-plugins/applauncher/AppLauncherPlugin.cpp" line="134"/>
<source>Open</source>
- <translation type="unfinished">Abrir</translation>
+ <translation>Abrir</translation>
</message>
<message>
- <location filename="../desktop-plugins/applauncher/AppLauncherPlugin.cpp" line="129"/>
+ <location filename="../desktop-plugins/applauncher/AppLauncherPlugin.cpp" line="136"/>
<source>Open With</source>
- <translation type="unfinished"></translation>
+ <translation>Abrir con</translation>
</message>
<message>
- <location filename="../desktop-plugins/applauncher/AppLauncherPlugin.cpp" line="132"/>
+ <location filename="../desktop-plugins/applauncher/AppLauncherPlugin.cpp" line="139"/>
<source>View Properties</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../desktop-plugins/applauncher/AppLauncherPlugin.cpp" line="134"/>
+ <location filename="../desktop-plugins/applauncher/AppLauncherPlugin.cpp" line="141"/>
<source>File Operations</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../desktop-plugins/applauncher/AppLauncherPlugin.cpp" line="136"/>
+ <location filename="../desktop-plugins/applauncher/AppLauncherPlugin.cpp" line="143"/>
<source>Rename</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../desktop-plugins/applauncher/AppLauncherPlugin.cpp" line="139"/>
+ <location filename="../desktop-plugins/applauncher/AppLauncherPlugin.cpp" line="146"/>
<source>Copy</source>
- <translation type="unfinished">Copiar</translation>
+ <translation>Copiar</translation>
</message>
<message>
- <location filename="../desktop-plugins/applauncher/AppLauncherPlugin.cpp" line="142"/>
+ <location filename="../desktop-plugins/applauncher/AppLauncherPlugin.cpp" line="149"/>
<source>Cut</source>
<translation type="unfinished">Cortar</translation>
</message>
<message>
- <location filename="../desktop-plugins/applauncher/AppLauncherPlugin.cpp" line="144"/>
+ <location filename="../desktop-plugins/applauncher/AppLauncherPlugin.cpp" line="151"/>
<source>Delete</source>
- <translation type="unfinished">Borrar</translation>
+ <translation>Borrar</translation>
</message>
<message>
- <location filename="../desktop-plugins/applauncher/AppLauncherPlugin.cpp" line="205"/>
+ <location filename="../desktop-plugins/applauncher/AppLauncherPlugin.cpp" line="212"/>
<source>Select Application</source>
<translation>Seleccionar Aplicación</translation>
</message>
<message>
- <location filename="../desktop-plugins/applauncher/AppLauncherPlugin.cpp" line="205"/>
+ <location filename="../desktop-plugins/applauncher/AppLauncherPlugin.cpp" line="212"/>
<source>Name:</source>
<translation>Nombre:</translation>
</message>
<message>
- <location filename="../desktop-plugins/applauncher/AppLauncherPlugin.cpp" line="291"/>
+ <location filename="../desktop-plugins/applauncher/AppLauncherPlugin.cpp" line="298"/>
<source>New Filename</source>
<translation type="unfinished"></translation>
</message>
@@ -265,12 +265,12 @@
</message>
<message>
<location filename="../BootSplash.cpp" line="65"/>
- <source>Don&apos;t expect to build up the weak by pulling down the strong.</source>
+ <source>Don't expect to build up the weak by pulling down the strong.</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../BootSplash.cpp" line="67"/>
- <source>You can&apos;t know too much, but you can say too much.</source>
+ <source>You can't know too much, but you can say too much.</source>
<translation type="unfinished">No puedes saber demasiado, pero puedes decir demasiado.</translation>
</message>
<message>
@@ -350,7 +350,7 @@
</message>
<message>
<location filename="../BootSplash.cpp" line="99"/>
- <source>Only two things are infinite, the universe and human stupidity, and I&apos;m not sure about the former.</source>
+ <source>Only two things are infinite, the universe and human stupidity, and I'm not sure about the former.</source>
<translation type="unfinished"></translation>
</message>
<message>
@@ -360,7 +360,7 @@
</message>
<message>
<location filename="../BootSplash.cpp" line="103"/>
- <source>Do, or do not. There is no &apos;try&apos;.</source>
+ <source>Do, or do not. There is no 'try'.</source>
<translation type="unfinished"></translation>
</message>
<message>
@@ -380,7 +380,7 @@
</message>
<message>
<location filename="../BootSplash.cpp" line="111"/>
- <source>It&apos;s kind of fun to do the impossible.</source>
+ <source>It's kind of fun to do the impossible.</source>
<translation type="unfinished"></translation>
</message>
<message>
@@ -851,7 +851,7 @@
<name>LSession</name>
<message>
<location filename="../LSession.cpp" line="163"/>
- <location filename="../LSession.cpp" line="344"/>
+ <location filename="../LSession.cpp" line="342"/>
<source>Desktop</source>
<translation>Escritorio</translation>
</message>
diff --git a/src-qt5/core/lumina-desktop/i18n/lumina-desktop_et.ts b/src-qt5/core/lumina-desktop/i18n/lumina-desktop_et.ts
index 4c1fef59..5bf00b5f 100644
--- a/src-qt5/core/lumina-desktop/i18n/lumina-desktop_et.ts
+++ b/src-qt5/core/lumina-desktop/i18n/lumina-desktop_et.ts
@@ -38,62 +38,62 @@
<translation>Klõpsa määramiseks</translation>
</message>
<message>
- <location filename="../desktop-plugins/applauncher/AppLauncherPlugin.cpp" line="72"/>
+ <location filename="../desktop-plugins/applauncher/AppLauncherPlugin.cpp" line="73"/>
<source>Launch %1</source>
<translation type="unfinished">Käivita %1</translation>
</message>
<message>
- <location filename="../desktop-plugins/applauncher/AppLauncherPlugin.cpp" line="127"/>
+ <location filename="../desktop-plugins/applauncher/AppLauncherPlugin.cpp" line="134"/>
<source>Open</source>
<translation type="unfinished">Ava</translation>
</message>
<message>
- <location filename="../desktop-plugins/applauncher/AppLauncherPlugin.cpp" line="129"/>
+ <location filename="../desktop-plugins/applauncher/AppLauncherPlugin.cpp" line="136"/>
<source>Open With</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../desktop-plugins/applauncher/AppLauncherPlugin.cpp" line="132"/>
+ <location filename="../desktop-plugins/applauncher/AppLauncherPlugin.cpp" line="139"/>
<source>View Properties</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../desktop-plugins/applauncher/AppLauncherPlugin.cpp" line="134"/>
+ <location filename="../desktop-plugins/applauncher/AppLauncherPlugin.cpp" line="141"/>
<source>File Operations</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../desktop-plugins/applauncher/AppLauncherPlugin.cpp" line="136"/>
+ <location filename="../desktop-plugins/applauncher/AppLauncherPlugin.cpp" line="143"/>
<source>Rename</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../desktop-plugins/applauncher/AppLauncherPlugin.cpp" line="139"/>
+ <location filename="../desktop-plugins/applauncher/AppLauncherPlugin.cpp" line="146"/>
<source>Copy</source>
<translation type="unfinished">Kopeeri</translation>
</message>
<message>
- <location filename="../desktop-plugins/applauncher/AppLauncherPlugin.cpp" line="142"/>
+ <location filename="../desktop-plugins/applauncher/AppLauncherPlugin.cpp" line="149"/>
<source>Cut</source>
<translation type="unfinished">Lõika</translation>
</message>
<message>
- <location filename="../desktop-plugins/applauncher/AppLauncherPlugin.cpp" line="144"/>
+ <location filename="../desktop-plugins/applauncher/AppLauncherPlugin.cpp" line="151"/>
<source>Delete</source>
<translation type="unfinished">Kustuta</translation>
</message>
<message>
- <location filename="../desktop-plugins/applauncher/AppLauncherPlugin.cpp" line="205"/>
+ <location filename="../desktop-plugins/applauncher/AppLauncherPlugin.cpp" line="212"/>
<source>Select Application</source>
<translation>Vali rakendus</translation>
</message>
<message>
- <location filename="../desktop-plugins/applauncher/AppLauncherPlugin.cpp" line="205"/>
+ <location filename="../desktop-plugins/applauncher/AppLauncherPlugin.cpp" line="212"/>
<source>Name:</source>
<translation>Nimi:</translation>
</message>
<message>
- <location filename="../desktop-plugins/applauncher/AppLauncherPlugin.cpp" line="291"/>
+ <location filename="../desktop-plugins/applauncher/AppLauncherPlugin.cpp" line="298"/>
<source>New Filename</source>
<translation type="unfinished"></translation>
</message>
@@ -851,7 +851,7 @@
<name>LSession</name>
<message>
<location filename="../LSession.cpp" line="163"/>
- <location filename="../LSession.cpp" line="344"/>
+ <location filename="../LSession.cpp" line="342"/>
<source>Desktop</source>
<translation type="unfinished">Töölaud</translation>
</message>
diff --git a/src-qt5/core/lumina-desktop/i18n/lumina-desktop_eu.ts b/src-qt5/core/lumina-desktop/i18n/lumina-desktop_eu.ts
index f2a8c9c3..800eb234 100644
--- a/src-qt5/core/lumina-desktop/i18n/lumina-desktop_eu.ts
+++ b/src-qt5/core/lumina-desktop/i18n/lumina-desktop_eu.ts
@@ -38,62 +38,62 @@
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../desktop-plugins/applauncher/AppLauncherPlugin.cpp" line="72"/>
+ <location filename="../desktop-plugins/applauncher/AppLauncherPlugin.cpp" line="73"/>
<source>Launch %1</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../desktop-plugins/applauncher/AppLauncherPlugin.cpp" line="127"/>
+ <location filename="../desktop-plugins/applauncher/AppLauncherPlugin.cpp" line="134"/>
<source>Open</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../desktop-plugins/applauncher/AppLauncherPlugin.cpp" line="129"/>
+ <location filename="../desktop-plugins/applauncher/AppLauncherPlugin.cpp" line="136"/>
<source>Open With</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../desktop-plugins/applauncher/AppLauncherPlugin.cpp" line="132"/>
+ <location filename="../desktop-plugins/applauncher/AppLauncherPlugin.cpp" line="139"/>
<source>View Properties</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../desktop-plugins/applauncher/AppLauncherPlugin.cpp" line="134"/>
+ <location filename="../desktop-plugins/applauncher/AppLauncherPlugin.cpp" line="141"/>
<source>File Operations</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../desktop-plugins/applauncher/AppLauncherPlugin.cpp" line="136"/>
+ <location filename="../desktop-plugins/applauncher/AppLauncherPlugin.cpp" line="143"/>
<source>Rename</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../desktop-plugins/applauncher/AppLauncherPlugin.cpp" line="139"/>
+ <location filename="../desktop-plugins/applauncher/AppLauncherPlugin.cpp" line="146"/>
<source>Copy</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../desktop-plugins/applauncher/AppLauncherPlugin.cpp" line="142"/>
+ <location filename="../desktop-plugins/applauncher/AppLauncherPlugin.cpp" line="149"/>
<source>Cut</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../desktop-plugins/applauncher/AppLauncherPlugin.cpp" line="144"/>
+ <location filename="../desktop-plugins/applauncher/AppLauncherPlugin.cpp" line="151"/>
<source>Delete</source>
<translation type="unfinished">Ezabatu</translation>
</message>
<message>
- <location filename="../desktop-plugins/applauncher/AppLauncherPlugin.cpp" line="205"/>
+ <location filename="../desktop-plugins/applauncher/AppLauncherPlugin.cpp" line="212"/>
<source>Select Application</source>
<translation>Aplikazioa hautatu</translation>
</message>
<message>
- <location filename="../desktop-plugins/applauncher/AppLauncherPlugin.cpp" line="205"/>
+ <location filename="../desktop-plugins/applauncher/AppLauncherPlugin.cpp" line="212"/>
<source>Name:</source>
<translation>Izena:</translation>
</message>
<message>
- <location filename="../desktop-plugins/applauncher/AppLauncherPlugin.cpp" line="291"/>
+ <location filename="../desktop-plugins/applauncher/AppLauncherPlugin.cpp" line="298"/>
<source>New Filename</source>
<translation type="unfinished"></translation>
</message>
@@ -851,7 +851,7 @@
<name>LSession</name>
<message>
<location filename="../LSession.cpp" line="163"/>
- <location filename="../LSession.cpp" line="344"/>
+ <location filename="../LSession.cpp" line="342"/>
<source>Desktop</source>
<translation type="unfinished"></translation>
</message>
diff --git a/src-qt5/core/lumina-desktop/i18n/lumina-desktop_fa.ts b/src-qt5/core/lumina-desktop/i18n/lumina-desktop_fa.ts
index 97e33521..d6469c56 100644
--- a/src-qt5/core/lumina-desktop/i18n/lumina-desktop_fa.ts
+++ b/src-qt5/core/lumina-desktop/i18n/lumina-desktop_fa.ts
@@ -38,62 +38,62 @@
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../desktop-plugins/applauncher/AppLauncherPlugin.cpp" line="72"/>
+ <location filename="../desktop-plugins/applauncher/AppLauncherPlugin.cpp" line="73"/>
<source>Launch %1</source>
<translation type="unfinished">%1 را راه بیانداز</translation>
</message>
<message>
- <location filename="../desktop-plugins/applauncher/AppLauncherPlugin.cpp" line="127"/>
+ <location filename="../desktop-plugins/applauncher/AppLauncherPlugin.cpp" line="134"/>
<source>Open</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../desktop-plugins/applauncher/AppLauncherPlugin.cpp" line="129"/>
+ <location filename="../desktop-plugins/applauncher/AppLauncherPlugin.cpp" line="136"/>
<source>Open With</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../desktop-plugins/applauncher/AppLauncherPlugin.cpp" line="132"/>
+ <location filename="../desktop-plugins/applauncher/AppLauncherPlugin.cpp" line="139"/>
<source>View Properties</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../desktop-plugins/applauncher/AppLauncherPlugin.cpp" line="134"/>
+ <location filename="../desktop-plugins/applauncher/AppLauncherPlugin.cpp" line="141"/>
<source>File Operations</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../desktop-plugins/applauncher/AppLauncherPlugin.cpp" line="136"/>
+ <location filename="../desktop-plugins/applauncher/AppLauncherPlugin.cpp" line="143"/>
<source>Rename</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../desktop-plugins/applauncher/AppLauncherPlugin.cpp" line="139"/>
+ <location filename="../desktop-plugins/applauncher/AppLauncherPlugin.cpp" line="146"/>
<source>Copy</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../desktop-plugins/applauncher/AppLauncherPlugin.cpp" line="142"/>
+ <location filename="../desktop-plugins/applauncher/AppLauncherPlugin.cpp" line="149"/>
<source>Cut</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../desktop-plugins/applauncher/AppLauncherPlugin.cpp" line="144"/>
+ <location filename="../desktop-plugins/applauncher/AppLauncherPlugin.cpp" line="151"/>
<source>Delete</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../desktop-plugins/applauncher/AppLauncherPlugin.cpp" line="205"/>
+ <location filename="../desktop-plugins/applauncher/AppLauncherPlugin.cpp" line="212"/>
<source>Select Application</source>
<translation type="unfinished">کاربست برگزین</translation>
</message>
<message>
- <location filename="../desktop-plugins/applauncher/AppLauncherPlugin.cpp" line="205"/>
+ <location filename="../desktop-plugins/applauncher/AppLauncherPlugin.cpp" line="212"/>
<source>Name:</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../desktop-plugins/applauncher/AppLauncherPlugin.cpp" line="291"/>
+ <location filename="../desktop-plugins/applauncher/AppLauncherPlugin.cpp" line="298"/>
<source>New Filename</source>
<translation type="unfinished"></translation>
</message>
@@ -851,7 +851,7 @@
<name>LSession</name>
<message>
<location filename="../LSession.cpp" line="163"/>
- <location filename="../LSession.cpp" line="344"/>
+ <location filename="../LSession.cpp" line="342"/>
<source>Desktop</source>
<translation type="unfinished"></translation>
</message>
diff --git a/src-qt5/core/lumina-desktop/i18n/lumina-desktop_fi.ts b/src-qt5/core/lumina-desktop/i18n/lumina-desktop_fi.ts
index b1a2ede1..62634130 100644
--- a/src-qt5/core/lumina-desktop/i18n/lumina-desktop_fi.ts
+++ b/src-qt5/core/lumina-desktop/i18n/lumina-desktop_fi.ts
@@ -38,62 +38,62 @@
<translation>Aseta napsauttamalla</translation>
</message>
<message>
- <location filename="../desktop-plugins/applauncher/AppLauncherPlugin.cpp" line="72"/>
+ <location filename="../desktop-plugins/applauncher/AppLauncherPlugin.cpp" line="73"/>
<source>Launch %1</source>
<translation type="unfinished">Käynnistä %1</translation>
</message>
<message>
- <location filename="../desktop-plugins/applauncher/AppLauncherPlugin.cpp" line="127"/>
+ <location filename="../desktop-plugins/applauncher/AppLauncherPlugin.cpp" line="134"/>
<source>Open</source>
<translation type="unfinished">Avaa</translation>
</message>
<message>
- <location filename="../desktop-plugins/applauncher/AppLauncherPlugin.cpp" line="129"/>
+ <location filename="../desktop-plugins/applauncher/AppLauncherPlugin.cpp" line="136"/>
<source>Open With</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../desktop-plugins/applauncher/AppLauncherPlugin.cpp" line="132"/>
+ <location filename="../desktop-plugins/applauncher/AppLauncherPlugin.cpp" line="139"/>
<source>View Properties</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../desktop-plugins/applauncher/AppLauncherPlugin.cpp" line="134"/>
+ <location filename="../desktop-plugins/applauncher/AppLauncherPlugin.cpp" line="141"/>
<source>File Operations</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../desktop-plugins/applauncher/AppLauncherPlugin.cpp" line="136"/>
+ <location filename="../desktop-plugins/applauncher/AppLauncherPlugin.cpp" line="143"/>
<source>Rename</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../desktop-plugins/applauncher/AppLauncherPlugin.cpp" line="139"/>
+ <location filename="../desktop-plugins/applauncher/AppLauncherPlugin.cpp" line="146"/>
<source>Copy</source>
<translation type="unfinished">Kopioi</translation>
</message>
<message>
- <location filename="../desktop-plugins/applauncher/AppLauncherPlugin.cpp" line="142"/>
+ <location filename="../desktop-plugins/applauncher/AppLauncherPlugin.cpp" line="149"/>
<source>Cut</source>
<translation type="unfinished">Leikkaa</translation>
</message>
<message>
- <location filename="../desktop-plugins/applauncher/AppLauncherPlugin.cpp" line="144"/>
+ <location filename="../desktop-plugins/applauncher/AppLauncherPlugin.cpp" line="151"/>
<source>Delete</source>
<translation type="unfinished">Poista</translation>
</message>
<message>
- <location filename="../desktop-plugins/applauncher/AppLauncherPlugin.cpp" line="205"/>
+ <location filename="../desktop-plugins/applauncher/AppLauncherPlugin.cpp" line="212"/>
<source>Select Application</source>
<translation>Valitse sovellus</translation>
</message>
<message>
- <location filename="../desktop-plugins/applauncher/AppLauncherPlugin.cpp" line="205"/>
+ <location filename="../desktop-plugins/applauncher/AppLauncherPlugin.cpp" line="212"/>
<source>Name:</source>
<translation>Nimi:</translation>
</message>
<message>
- <location filename="../desktop-plugins/applauncher/AppLauncherPlugin.cpp" line="291"/>
+ <location filename="../desktop-plugins/applauncher/AppLauncherPlugin.cpp" line="298"/>
<source>New Filename</source>
<translation type="unfinished"></translation>
</message>
@@ -851,7 +851,7 @@
<name>LSession</name>
<message>
<location filename="../LSession.cpp" line="163"/>
- <location filename="../LSession.cpp" line="344"/>
+ <location filename="../LSession.cpp" line="342"/>
<source>Desktop</source>
<translation>Työpöytä</translation>
</message>
diff --git a/src-qt5/core/lumina-desktop/i18n/lumina-desktop_fr.ts b/src-qt5/core/lumina-desktop/i18n/lumina-desktop_fr.ts
index ede307cc..53f00a69 100644
--- a/src-qt5/core/lumina-desktop/i18n/lumina-desktop_fr.ts
+++ b/src-qt5/core/lumina-desktop/i18n/lumina-desktop_fr.ts
@@ -38,62 +38,62 @@
<translation>Cliquer pour Définir</translation>
</message>
<message>
- <location filename="../desktop-plugins/applauncher/AppLauncherPlugin.cpp" line="72"/>
+ <location filename="../desktop-plugins/applauncher/AppLauncherPlugin.cpp" line="73"/>
<source>Launch %1</source>
<translation type="unfinished">Lancer %1</translation>
</message>
<message>
- <location filename="../desktop-plugins/applauncher/AppLauncherPlugin.cpp" line="127"/>
+ <location filename="../desktop-plugins/applauncher/AppLauncherPlugin.cpp" line="134"/>
<source>Open</source>
<translation type="unfinished">Ouvrir</translation>
</message>
<message>
- <location filename="../desktop-plugins/applauncher/AppLauncherPlugin.cpp" line="129"/>
+ <location filename="../desktop-plugins/applauncher/AppLauncherPlugin.cpp" line="136"/>
<source>Open With</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../desktop-plugins/applauncher/AppLauncherPlugin.cpp" line="132"/>
+ <location filename="../desktop-plugins/applauncher/AppLauncherPlugin.cpp" line="139"/>
<source>View Properties</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../desktop-plugins/applauncher/AppLauncherPlugin.cpp" line="134"/>
+ <location filename="../desktop-plugins/applauncher/AppLauncherPlugin.cpp" line="141"/>
<source>File Operations</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../desktop-plugins/applauncher/AppLauncherPlugin.cpp" line="136"/>
+ <location filename="../desktop-plugins/applauncher/AppLauncherPlugin.cpp" line="143"/>
<source>Rename</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../desktop-plugins/applauncher/AppLauncherPlugin.cpp" line="139"/>
+ <location filename="../desktop-plugins/applauncher/AppLauncherPlugin.cpp" line="146"/>
<source>Copy</source>
<translation type="unfinished">Copier</translation>
</message>
<message>
- <location filename="../desktop-plugins/applauncher/AppLauncherPlugin.cpp" line="142"/>
+ <location filename="../desktop-plugins/applauncher/AppLauncherPlugin.cpp" line="149"/>
<source>Cut</source>
<translation type="unfinished">Couper</translation>
</message>
<message>
- <location filename="../desktop-plugins/applauncher/AppLauncherPlugin.cpp" line="144"/>
+ <location filename="../desktop-plugins/applauncher/AppLauncherPlugin.cpp" line="151"/>
<source>Delete</source>
<translation type="unfinished">Supprimer</translation>
</message>
<message>
- <location filename="../desktop-plugins/applauncher/AppLauncherPlugin.cpp" line="205"/>
+ <location filename="../desktop-plugins/applauncher/AppLauncherPlugin.cpp" line="212"/>
<source>Select Application</source>
<translation>Sélectionner un Programme</translation>
</message>
<message>
- <location filename="../desktop-plugins/applauncher/AppLauncherPlugin.cpp" line="205"/>
+ <location filename="../desktop-plugins/applauncher/AppLauncherPlugin.cpp" line="212"/>
<source>Name:</source>
<translation>Nom :</translation>
</message>
<message>
- <location filename="../desktop-plugins/applauncher/AppLauncherPlugin.cpp" line="291"/>
+ <location filename="../desktop-plugins/applauncher/AppLauncherPlugin.cpp" line="298"/>
<source>New Filename</source>
<translation type="unfinished"></translation>
</message>
@@ -851,7 +851,7 @@
<name>LSession</name>
<message>
<location filename="../LSession.cpp" line="163"/>
- <location filename="../LSession.cpp" line="344"/>
+ <location filename="../LSession.cpp" line="342"/>
<source>Desktop</source>
<translation>Bureau</translation>
</message>
diff --git a/src-qt5/core/lumina-desktop/i18n/lumina-desktop_fr_CA.ts b/src-qt5/core/lumina-desktop/i18n/lumina-desktop_fr_CA.ts
index 6a86d9f6..caeb719a 100644
--- a/src-qt5/core/lumina-desktop/i18n/lumina-desktop_fr_CA.ts
+++ b/src-qt5/core/lumina-desktop/i18n/lumina-desktop_fr_CA.ts
@@ -38,62 +38,62 @@
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../desktop-plugins/applauncher/AppLauncherPlugin.cpp" line="72"/>
+ <location filename="../desktop-plugins/applauncher/AppLauncherPlugin.cpp" line="73"/>
<source>Launch %1</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../desktop-plugins/applauncher/AppLauncherPlugin.cpp" line="127"/>
+ <location filename="../desktop-plugins/applauncher/AppLauncherPlugin.cpp" line="134"/>
<source>Open</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../desktop-plugins/applauncher/AppLauncherPlugin.cpp" line="129"/>
+ <location filename="../desktop-plugins/applauncher/AppLauncherPlugin.cpp" line="136"/>
<source>Open With</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../desktop-plugins/applauncher/AppLauncherPlugin.cpp" line="132"/>
+ <location filename="../desktop-plugins/applauncher/AppLauncherPlugin.cpp" line="139"/>
<source>View Properties</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../desktop-plugins/applauncher/AppLauncherPlugin.cpp" line="134"/>
+ <location filename="../desktop-plugins/applauncher/AppLauncherPlugin.cpp" line="141"/>
<source>File Operations</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../desktop-plugins/applauncher/AppLauncherPlugin.cpp" line="136"/>
+ <location filename="../desktop-plugins/applauncher/AppLauncherPlugin.cpp" line="143"/>
<source>Rename</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../desktop-plugins/applauncher/AppLauncherPlugin.cpp" line="139"/>
+ <location filename="../desktop-plugins/applauncher/AppLauncherPlugin.cpp" line="146"/>
<source>Copy</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../desktop-plugins/applauncher/AppLauncherPlugin.cpp" line="142"/>
+ <location filename="../desktop-plugins/applauncher/AppLauncherPlugin.cpp" line="149"/>
<source>Cut</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../desktop-plugins/applauncher/AppLauncherPlugin.cpp" line="144"/>
+ <location filename="../desktop-plugins/applauncher/AppLauncherPlugin.cpp" line="151"/>
<source>Delete</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../desktop-plugins/applauncher/AppLauncherPlugin.cpp" line="205"/>
+ <location filename="../desktop-plugins/applauncher/AppLauncherPlugin.cpp" line="212"/>
<source>Select Application</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../desktop-plugins/applauncher/AppLauncherPlugin.cpp" line="205"/>
+ <location filename="../desktop-plugins/applauncher/AppLauncherPlugin.cpp" line="212"/>
<source>Name:</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../desktop-plugins/applauncher/AppLauncherPlugin.cpp" line="291"/>
+ <location filename="../desktop-plugins/applauncher/AppLauncherPlugin.cpp" line="298"/>
<source>New Filename</source>
<translation type="unfinished"></translation>
</message>
@@ -851,7 +851,7 @@
<name>LSession</name>
<message>
<location filename="../LSession.cpp" line="163"/>
- <location filename="../LSession.cpp" line="344"/>
+ <location filename="../LSession.cpp" line="342"/>
<source>Desktop</source>
<translation type="unfinished"></translation>
</message>
diff --git a/src-qt5/core/lumina-desktop/i18n/lumina-desktop_gl.ts b/src-qt5/core/lumina-desktop/i18n/lumina-desktop_gl.ts
index 6a86d9f6..caeb719a 100644
--- a/src-qt5/core/lumina-desktop/i18n/lumina-desktop_gl.ts
+++ b/src-qt5/core/lumina-desktop/i18n/lumina-desktop_gl.ts
@@ -38,62 +38,62 @@
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../desktop-plugins/applauncher/AppLauncherPlugin.cpp" line="72"/>
+ <location filename="../desktop-plugins/applauncher/AppLauncherPlugin.cpp" line="73"/>
<source>Launch %1</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../desktop-plugins/applauncher/AppLauncherPlugin.cpp" line="127"/>
+ <location filename="../desktop-plugins/applauncher/AppLauncherPlugin.cpp" line="134"/>
<source>Open</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../desktop-plugins/applauncher/AppLauncherPlugin.cpp" line="129"/>
+ <location filename="../desktop-plugins/applauncher/AppLauncherPlugin.cpp" line="136"/>
<source>Open With</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../desktop-plugins/applauncher/AppLauncherPlugin.cpp" line="132"/>
+ <location filename="../desktop-plugins/applauncher/AppLauncherPlugin.cpp" line="139"/>
<source>View Properties</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../desktop-plugins/applauncher/AppLauncherPlugin.cpp" line="134"/>
+ <location filename="../desktop-plugins/applauncher/AppLauncherPlugin.cpp" line="141"/>
<source>File Operations</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../desktop-plugins/applauncher/AppLauncherPlugin.cpp" line="136"/>
+ <location filename="../desktop-plugins/applauncher/AppLauncherPlugin.cpp" line="143"/>
<source>Rename</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../desktop-plugins/applauncher/AppLauncherPlugin.cpp" line="139"/>
+ <location filename="../desktop-plugins/applauncher/AppLauncherPlugin.cpp" line="146"/>
<source>Copy</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../desktop-plugins/applauncher/AppLauncherPlugin.cpp" line="142"/>
+ <location filename="../desktop-plugins/applauncher/AppLauncherPlugin.cpp" line="149"/>
<source>Cut</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../desktop-plugins/applauncher/AppLauncherPlugin.cpp" line="144"/>
+ <location filename="../desktop-plugins/applauncher/AppLauncherPlugin.cpp" line="151"/>
<source>Delete</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../desktop-plugins/applauncher/AppLauncherPlugin.cpp" line="205"/>
+ <location filename="../desktop-plugins/applauncher/AppLauncherPlugin.cpp" line="212"/>
<source>Select Application</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../desktop-plugins/applauncher/AppLauncherPlugin.cpp" line="205"/>
+ <location filename="../desktop-plugins/applauncher/AppLauncherPlugin.cpp" line="212"/>
<source>Name:</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../desktop-plugins/applauncher/AppLauncherPlugin.cpp" line="291"/>
+ <location filename="../desktop-plugins/applauncher/AppLauncherPlugin.cpp" line="298"/>
<source>New Filename</source>
<translation type="unfinished"></translation>
</message>
@@ -851,7 +851,7 @@
<name>LSession</name>
<message>
<location filename="../LSession.cpp" line="163"/>
- <location filename="../LSession.cpp" line="344"/>
+ <location filename="../LSession.cpp" line="342"/>
<source>Desktop</source>
<translation type="unfinished"></translation>
</message>
diff --git a/src-qt5/core/lumina-desktop/i18n/lumina-desktop_he.ts b/src-qt5/core/lumina-desktop/i18n/lumina-desktop_he.ts
index 5d7abbd1..9ff16d1d 100644
--- a/src-qt5/core/lumina-desktop/i18n/lumina-desktop_he.ts
+++ b/src-qt5/core/lumina-desktop/i18n/lumina-desktop_he.ts
@@ -38,62 +38,62 @@
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../desktop-plugins/applauncher/AppLauncherPlugin.cpp" line="72"/>
+ <location filename="../desktop-plugins/applauncher/AppLauncherPlugin.cpp" line="73"/>
<source>Launch %1</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../desktop-plugins/applauncher/AppLauncherPlugin.cpp" line="127"/>
+ <location filename="../desktop-plugins/applauncher/AppLauncherPlugin.cpp" line="134"/>
<source>Open</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../desktop-plugins/applauncher/AppLauncherPlugin.cpp" line="129"/>
+ <location filename="../desktop-plugins/applauncher/AppLauncherPlugin.cpp" line="136"/>
<source>Open With</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../desktop-plugins/applauncher/AppLauncherPlugin.cpp" line="132"/>
+ <location filename="../desktop-plugins/applauncher/AppLauncherPlugin.cpp" line="139"/>
<source>View Properties</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../desktop-plugins/applauncher/AppLauncherPlugin.cpp" line="134"/>
+ <location filename="../desktop-plugins/applauncher/AppLauncherPlugin.cpp" line="141"/>
<source>File Operations</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../desktop-plugins/applauncher/AppLauncherPlugin.cpp" line="136"/>
+ <location filename="../desktop-plugins/applauncher/AppLauncherPlugin.cpp" line="143"/>
<source>Rename</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../desktop-plugins/applauncher/AppLauncherPlugin.cpp" line="139"/>
+ <location filename="../desktop-plugins/applauncher/AppLauncherPlugin.cpp" line="146"/>
<source>Copy</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../desktop-plugins/applauncher/AppLauncherPlugin.cpp" line="142"/>
+ <location filename="../desktop-plugins/applauncher/AppLauncherPlugin.cpp" line="149"/>
<source>Cut</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../desktop-plugins/applauncher/AppLauncherPlugin.cpp" line="144"/>
+ <location filename="../desktop-plugins/applauncher/AppLauncherPlugin.cpp" line="151"/>
<source>Delete</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../desktop-plugins/applauncher/AppLauncherPlugin.cpp" line="205"/>
+ <location filename="../desktop-plugins/applauncher/AppLauncherPlugin.cpp" line="212"/>
<source>Select Application</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../desktop-plugins/applauncher/AppLauncherPlugin.cpp" line="205"/>
+ <location filename="../desktop-plugins/applauncher/AppLauncherPlugin.cpp" line="212"/>
<source>Name:</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../desktop-plugins/applauncher/AppLauncherPlugin.cpp" line="291"/>
+ <location filename="../desktop-plugins/applauncher/AppLauncherPlugin.cpp" line="298"/>
<source>New Filename</source>
<translation type="unfinished"></translation>
</message>
@@ -851,7 +851,7 @@
<name>LSession</name>
<message>
<location filename="../LSession.cpp" line="163"/>
- <location filename="../LSession.cpp" line="344"/>
+ <location filename="../LSession.cpp" line="342"/>
<source>Desktop</source>
<translation type="unfinished">שולחן עבודה</translation>
</message>
diff --git a/src-qt5/core/lumina-desktop/i18n/lumina-desktop_hi.ts b/src-qt5/core/lumina-desktop/i18n/lumina-desktop_hi.ts
index d189b796..f1ed8825 100644
--- a/src-qt5/core/lumina-desktop/i18n/lumina-desktop_hi.ts
+++ b/src-qt5/core/lumina-desktop/i18n/lumina-desktop_hi.ts
@@ -38,62 +38,62 @@
<translation>निश्चित करने के लिए क्लिक करे</translation>
</message>
<message>
- <location filename="../desktop-plugins/applauncher/AppLauncherPlugin.cpp" line="72"/>
+ <location filename="../desktop-plugins/applauncher/AppLauncherPlugin.cpp" line="73"/>
<source>Launch %1</source>
<translation type="unfinished">प्रारंभ %1</translation>
</message>
<message>
- <location filename="../desktop-plugins/applauncher/AppLauncherPlugin.cpp" line="127"/>
+ <location filename="../desktop-plugins/applauncher/AppLauncherPlugin.cpp" line="134"/>
<source>Open</source>
<translation type="unfinished">चालू</translation>
</message>
<message>
- <location filename="../desktop-plugins/applauncher/AppLauncherPlugin.cpp" line="129"/>
+ <location filename="../desktop-plugins/applauncher/AppLauncherPlugin.cpp" line="136"/>
<source>Open With</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../desktop-plugins/applauncher/AppLauncherPlugin.cpp" line="132"/>
+ <location filename="../desktop-plugins/applauncher/AppLauncherPlugin.cpp" line="139"/>
<source>View Properties</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../desktop-plugins/applauncher/AppLauncherPlugin.cpp" line="134"/>
+ <location filename="../desktop-plugins/applauncher/AppLauncherPlugin.cpp" line="141"/>
<source>File Operations</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../desktop-plugins/applauncher/AppLauncherPlugin.cpp" line="136"/>
+ <location filename="../desktop-plugins/applauncher/AppLauncherPlugin.cpp" line="143"/>
<source>Rename</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../desktop-plugins/applauncher/AppLauncherPlugin.cpp" line="139"/>
+ <location filename="../desktop-plugins/applauncher/AppLauncherPlugin.cpp" line="146"/>
<source>Copy</source>
<translation type="unfinished">कॉपी करें</translation>
</message>
<message>
- <location filename="../desktop-plugins/applauncher/AppLauncherPlugin.cpp" line="142"/>
+ <location filename="../desktop-plugins/applauncher/AppLauncherPlugin.cpp" line="149"/>
<source>Cut</source>
<translation type="unfinished">काटें</translation>
</message>
<message>
- <location filename="../desktop-plugins/applauncher/AppLauncherPlugin.cpp" line="144"/>
+ <location filename="../desktop-plugins/applauncher/AppLauncherPlugin.cpp" line="151"/>
<source>Delete</source>
<translation type="unfinished">नष्ट करें</translation>
</message>
<message>
- <location filename="../desktop-plugins/applauncher/AppLauncherPlugin.cpp" line="205"/>
+ <location filename="../desktop-plugins/applauncher/AppLauncherPlugin.cpp" line="212"/>
<source>Select Application</source>
<translation>एप्लीकेशन चुनें</translation>
</message>
<message>
- <location filename="../desktop-plugins/applauncher/AppLauncherPlugin.cpp" line="205"/>
+ <location filename="../desktop-plugins/applauncher/AppLauncherPlugin.cpp" line="212"/>
<source>Name:</source>
<translation>नाम</translation>
</message>
<message>
- <location filename="../desktop-plugins/applauncher/AppLauncherPlugin.cpp" line="291"/>
+ <location filename="../desktop-plugins/applauncher/AppLauncherPlugin.cpp" line="298"/>
<source>New Filename</source>
<translation type="unfinished"></translation>
</message>
@@ -851,7 +851,7 @@
<name>LSession</name>
<message>
<location filename="../LSession.cpp" line="163"/>
- <location filename="../LSession.cpp" line="344"/>
+ <location filename="../LSession.cpp" line="342"/>
<source>Desktop</source>
<translation type="unfinished">डेस्कटॉप</translation>
</message>
diff --git a/src-qt5/core/lumina-desktop/i18n/lumina-desktop_hr.ts b/src-qt5/core/lumina-desktop/i18n/lumina-desktop_hr.ts
index 6a86d9f6..caeb719a 100644
--- a/src-qt5/core/lumina-desktop/i18n/lumina-desktop_hr.ts
+++ b/src-qt5/core/lumina-desktop/i18n/lumina-desktop_hr.ts
@@ -38,62 +38,62 @@
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../desktop-plugins/applauncher/AppLauncherPlugin.cpp" line="72"/>
+ <location filename="../desktop-plugins/applauncher/AppLauncherPlugin.cpp" line="73"/>
<source>Launch %1</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../desktop-plugins/applauncher/AppLauncherPlugin.cpp" line="127"/>
+ <location filename="../desktop-plugins/applauncher/AppLauncherPlugin.cpp" line="134"/>
<source>Open</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../desktop-plugins/applauncher/AppLauncherPlugin.cpp" line="129"/>
+ <location filename="../desktop-plugins/applauncher/AppLauncherPlugin.cpp" line="136"/>
<source>Open With</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../desktop-plugins/applauncher/AppLauncherPlugin.cpp" line="132"/>
+ <location filename="../desktop-plugins/applauncher/AppLauncherPlugin.cpp" line="139"/>
<source>View Properties</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../desktop-plugins/applauncher/AppLauncherPlugin.cpp" line="134"/>
+ <location filename="../desktop-plugins/applauncher/AppLauncherPlugin.cpp" line="141"/>
<source>File Operations</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../desktop-plugins/applauncher/AppLauncherPlugin.cpp" line="136"/>
+ <location filename="../desktop-plugins/applauncher/AppLauncherPlugin.cpp" line="143"/>
<source>Rename</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../desktop-plugins/applauncher/AppLauncherPlugin.cpp" line="139"/>
+ <location filename="../desktop-plugins/applauncher/AppLauncherPlugin.cpp" line="146"/>
<source>Copy</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../desktop-plugins/applauncher/AppLauncherPlugin.cpp" line="142"/>
+ <location filename="../desktop-plugins/applauncher/AppLauncherPlugin.cpp" line="149"/>
<source>Cut</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../desktop-plugins/applauncher/AppLauncherPlugin.cpp" line="144"/>
+ <location filename="../desktop-plugins/applauncher/AppLauncherPlugin.cpp" line="151"/>
<source>Delete</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../desktop-plugins/applauncher/AppLauncherPlugin.cpp" line="205"/>
+ <location filename="../desktop-plugins/applauncher/AppLauncherPlugin.cpp" line="212"/>
<source>Select Application</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../desktop-plugins/applauncher/AppLauncherPlugin.cpp" line="205"/>
+ <location filename="../desktop-plugins/applauncher/AppLauncherPlugin.cpp" line="212"/>
<source>Name:</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../desktop-plugins/applauncher/AppLauncherPlugin.cpp" line="291"/>
+ <location filename="../desktop-plugins/applauncher/AppLauncherPlugin.cpp" line="298"/>
<source>New Filename</source>
<translation type="unfinished"></translation>
</message>
@@ -851,7 +851,7 @@
<name>LSession</name>
<message>
<location filename="../LSession.cpp" line="163"/>
- <location filename="../LSession.cpp" line="344"/>
+ <location filename="../LSession.cpp" line="342"/>
<source>Desktop</source>
<translation type="unfinished"></translation>
</message>
diff --git a/src-qt5/core/lumina-desktop/i18n/lumina-desktop_hu.ts b/src-qt5/core/lumina-desktop/i18n/lumina-desktop_hu.ts
index 1dd4b838..abdfc7b4 100644
--- a/src-qt5/core/lumina-desktop/i18n/lumina-desktop_hu.ts
+++ b/src-qt5/core/lumina-desktop/i18n/lumina-desktop_hu.ts
@@ -38,62 +38,62 @@
<translation>Kattintás a beállításhoz</translation>
</message>
<message>
- <location filename="../desktop-plugins/applauncher/AppLauncherPlugin.cpp" line="72"/>
+ <location filename="../desktop-plugins/applauncher/AppLauncherPlugin.cpp" line="73"/>
<source>Launch %1</source>
<translation type="unfinished">%1 indítása</translation>
</message>
<message>
- <location filename="../desktop-plugins/applauncher/AppLauncherPlugin.cpp" line="127"/>
+ <location filename="../desktop-plugins/applauncher/AppLauncherPlugin.cpp" line="134"/>
<source>Open</source>
<translation type="unfinished">Megnyitás</translation>
</message>
<message>
- <location filename="../desktop-plugins/applauncher/AppLauncherPlugin.cpp" line="129"/>
+ <location filename="../desktop-plugins/applauncher/AppLauncherPlugin.cpp" line="136"/>
<source>Open With</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../desktop-plugins/applauncher/AppLauncherPlugin.cpp" line="132"/>
+ <location filename="../desktop-plugins/applauncher/AppLauncherPlugin.cpp" line="139"/>
<source>View Properties</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../desktop-plugins/applauncher/AppLauncherPlugin.cpp" line="134"/>
+ <location filename="../desktop-plugins/applauncher/AppLauncherPlugin.cpp" line="141"/>
<source>File Operations</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../desktop-plugins/applauncher/AppLauncherPlugin.cpp" line="136"/>
+ <location filename="../desktop-plugins/applauncher/AppLauncherPlugin.cpp" line="143"/>
<source>Rename</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../desktop-plugins/applauncher/AppLauncherPlugin.cpp" line="139"/>
+ <location filename="../desktop-plugins/applauncher/AppLauncherPlugin.cpp" line="146"/>
<source>Copy</source>
<translation type="unfinished">Másolás</translation>
</message>
<message>
- <location filename="../desktop-plugins/applauncher/AppLauncherPlugin.cpp" line="142"/>
+ <location filename="../desktop-plugins/applauncher/AppLauncherPlugin.cpp" line="149"/>
<source>Cut</source>
<translation type="unfinished">Kivágás</translation>
</message>
<message>
- <location filename="../desktop-plugins/applauncher/AppLauncherPlugin.cpp" line="144"/>
+ <location filename="../desktop-plugins/applauncher/AppLauncherPlugin.cpp" line="151"/>
<source>Delete</source>
<translation type="unfinished">Törlés</translation>
</message>
<message>
- <location filename="../desktop-plugins/applauncher/AppLauncherPlugin.cpp" line="205"/>
+ <location filename="../desktop-plugins/applauncher/AppLauncherPlugin.cpp" line="212"/>
<source>Select Application</source>
<translation>Alkalmazás kiválasztása</translation>
</message>
<message>
- <location filename="../desktop-plugins/applauncher/AppLauncherPlugin.cpp" line="205"/>
+ <location filename="../desktop-plugins/applauncher/AppLauncherPlugin.cpp" line="212"/>
<source>Name:</source>
<translation>Név:</translation>
</message>
<message>
- <location filename="../desktop-plugins/applauncher/AppLauncherPlugin.cpp" line="291"/>
+ <location filename="../desktop-plugins/applauncher/AppLauncherPlugin.cpp" line="298"/>
<source>New Filename</source>
<translation type="unfinished"></translation>
</message>
@@ -851,7 +851,7 @@
<name>LSession</name>
<message>
<location filename="../LSession.cpp" line="163"/>
- <location filename="../LSession.cpp" line="344"/>
+ <location filename="../LSession.cpp" line="342"/>
<source>Desktop</source>
<translation>Asztal</translation>
</message>
diff --git a/src-qt5/core/lumina-desktop/i18n/lumina-desktop_id.ts b/src-qt5/core/lumina-desktop/i18n/lumina-desktop_id.ts
index 14137dcd..13bba7d0 100644
--- a/src-qt5/core/lumina-desktop/i18n/lumina-desktop_id.ts
+++ b/src-qt5/core/lumina-desktop/i18n/lumina-desktop_id.ts
@@ -38,62 +38,62 @@
<translation>klik untuk mengatur</translation>
</message>
<message>
- <location filename="../desktop-plugins/applauncher/AppLauncherPlugin.cpp" line="72"/>
+ <location filename="../desktop-plugins/applauncher/AppLauncherPlugin.cpp" line="73"/>
<source>Launch %1</source>
<translation type="unfinished">Luncurkan %1</translation>
</message>
<message>
- <location filename="../desktop-plugins/applauncher/AppLauncherPlugin.cpp" line="127"/>
+ <location filename="../desktop-plugins/applauncher/AppLauncherPlugin.cpp" line="134"/>
<source>Open</source>
<translation type="unfinished">Buka</translation>
</message>
<message>
- <location filename="../desktop-plugins/applauncher/AppLauncherPlugin.cpp" line="129"/>
+ <location filename="../desktop-plugins/applauncher/AppLauncherPlugin.cpp" line="136"/>
<source>Open With</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../desktop-plugins/applauncher/AppLauncherPlugin.cpp" line="132"/>
+ <location filename="../desktop-plugins/applauncher/AppLauncherPlugin.cpp" line="139"/>
<source>View Properties</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../desktop-plugins/applauncher/AppLauncherPlugin.cpp" line="134"/>
+ <location filename="../desktop-plugins/applauncher/AppLauncherPlugin.cpp" line="141"/>
<source>File Operations</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../desktop-plugins/applauncher/AppLauncherPlugin.cpp" line="136"/>
+ <location filename="../desktop-plugins/applauncher/AppLauncherPlugin.cpp" line="143"/>
<source>Rename</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../desktop-plugins/applauncher/AppLauncherPlugin.cpp" line="139"/>
+ <location filename="../desktop-plugins/applauncher/AppLauncherPlugin.cpp" line="146"/>
<source>Copy</source>
<translation type="unfinished">Salin</translation>
</message>
<message>
- <location filename="../desktop-plugins/applauncher/AppLauncherPlugin.cpp" line="142"/>
+ <location filename="../desktop-plugins/applauncher/AppLauncherPlugin.cpp" line="149"/>
<source>Cut</source>
<translation type="unfinished">Potong</translation>
</message>
<message>
- <location filename="../desktop-plugins/applauncher/AppLauncherPlugin.cpp" line="144"/>
+ <location filename="../desktop-plugins/applauncher/AppLauncherPlugin.cpp" line="151"/>
<source>Delete</source>
<translation type="unfinished">Hapus</translation>
</message>
<message>
- <location filename="../desktop-plugins/applauncher/AppLauncherPlugin.cpp" line="205"/>
+ <location filename="../desktop-plugins/applauncher/AppLauncherPlugin.cpp" line="212"/>
<source>Select Application</source>
<translation>Pilih Aplikasi</translation>
</message>
<message>
- <location filename="../desktop-plugins/applauncher/AppLauncherPlugin.cpp" line="205"/>
+ <location filename="../desktop-plugins/applauncher/AppLauncherPlugin.cpp" line="212"/>
<source>Name:</source>
<translation>Nama:</translation>
</message>
<message>
- <location filename="../desktop-plugins/applauncher/AppLauncherPlugin.cpp" line="291"/>
+ <location filename="../desktop-plugins/applauncher/AppLauncherPlugin.cpp" line="298"/>
<source>New Filename</source>
<translation type="unfinished"></translation>
</message>
@@ -851,7 +851,7 @@
<name>LSession</name>
<message>
<location filename="../LSession.cpp" line="163"/>
- <location filename="../LSession.cpp" line="344"/>
+ <location filename="../LSession.cpp" line="342"/>
<source>Desktop</source>
<translation type="unfinished">Layar Kerja Utama</translation>
</message>
diff --git a/src-qt5/core/lumina-desktop/i18n/lumina-desktop_is.ts b/src-qt5/core/lumina-desktop/i18n/lumina-desktop_is.ts
index 6a86d9f6..caeb719a 100644
--- a/src-qt5/core/lumina-desktop/i18n/lumina-desktop_is.ts
+++ b/src-qt5/core/lumina-desktop/i18n/lumina-desktop_is.ts
@@ -38,62 +38,62 @@
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../desktop-plugins/applauncher/AppLauncherPlugin.cpp" line="72"/>
+ <location filename="../desktop-plugins/applauncher/AppLauncherPlugin.cpp" line="73"/>
<source>Launch %1</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../desktop-plugins/applauncher/AppLauncherPlugin.cpp" line="127"/>
+ <location filename="../desktop-plugins/applauncher/AppLauncherPlugin.cpp" line="134"/>
<source>Open</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../desktop-plugins/applauncher/AppLauncherPlugin.cpp" line="129"/>
+ <location filename="../desktop-plugins/applauncher/AppLauncherPlugin.cpp" line="136"/>
<source>Open With</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../desktop-plugins/applauncher/AppLauncherPlugin.cpp" line="132"/>
+ <location filename="../desktop-plugins/applauncher/AppLauncherPlugin.cpp" line="139"/>
<source>View Properties</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../desktop-plugins/applauncher/AppLauncherPlugin.cpp" line="134"/>
+ <location filename="../desktop-plugins/applauncher/AppLauncherPlugin.cpp" line="141"/>
<source>File Operations</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../desktop-plugins/applauncher/AppLauncherPlugin.cpp" line="136"/>
+ <location filename="../desktop-plugins/applauncher/AppLauncherPlugin.cpp" line="143"/>
<source>Rename</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../desktop-plugins/applauncher/AppLauncherPlugin.cpp" line="139"/>
+ <location filename="../desktop-plugins/applauncher/AppLauncherPlugin.cpp" line="146"/>
<source>Copy</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../desktop-plugins/applauncher/AppLauncherPlugin.cpp" line="142"/>
+ <location filename="../desktop-plugins/applauncher/AppLauncherPlugin.cpp" line="149"/>
<source>Cut</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../desktop-plugins/applauncher/AppLauncherPlugin.cpp" line="144"/>
+ <location filename="../desktop-plugins/applauncher/AppLauncherPlugin.cpp" line="151"/>
<source>Delete</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../desktop-plugins/applauncher/AppLauncherPlugin.cpp" line="205"/>
+ <location filename="../desktop-plugins/applauncher/AppLauncherPlugin.cpp" line="212"/>
<source>Select Application</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../desktop-plugins/applauncher/AppLauncherPlugin.cpp" line="205"/>
+ <location filename="../desktop-plugins/applauncher/AppLauncherPlugin.cpp" line="212"/>
<source>Name:</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../desktop-plugins/applauncher/AppLauncherPlugin.cpp" line="291"/>
+ <location filename="../desktop-plugins/applauncher/AppLauncherPlugin.cpp" line="298"/>
<source>New Filename</source>
<translation type="unfinished"></translation>
</message>
@@ -851,7 +851,7 @@
<name>LSession</name>
<message>
<location filename="../LSession.cpp" line="163"/>
- <location filename="../LSession.cpp" line="344"/>
+ <location filename="../LSession.cpp" line="342"/>
<source>Desktop</source>
<translation type="unfinished"></translation>
</message>
diff --git a/src-qt5/core/lumina-desktop/i18n/lumina-desktop_it.ts b/src-qt5/core/lumina-desktop/i18n/lumina-desktop_it.ts
index f46b1976..ed420545 100644
--- a/src-qt5/core/lumina-desktop/i18n/lumina-desktop_it.ts
+++ b/src-qt5/core/lumina-desktop/i18n/lumina-desktop_it.ts
@@ -38,62 +38,62 @@
<translation>Clicca per Impostare</translation>
</message>
<message>
- <location filename="../desktop-plugins/applauncher/AppLauncherPlugin.cpp" line="72"/>
+ <location filename="../desktop-plugins/applauncher/AppLauncherPlugin.cpp" line="73"/>
<source>Launch %1</source>
<translation type="unfinished">Lancia %1</translation>
</message>
<message>
- <location filename="../desktop-plugins/applauncher/AppLauncherPlugin.cpp" line="127"/>
+ <location filename="../desktop-plugins/applauncher/AppLauncherPlugin.cpp" line="134"/>
<source>Open</source>
<translation type="unfinished">Apri</translation>
</message>
<message>
- <location filename="../desktop-plugins/applauncher/AppLauncherPlugin.cpp" line="129"/>
+ <location filename="../desktop-plugins/applauncher/AppLauncherPlugin.cpp" line="136"/>
<source>Open With</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../desktop-plugins/applauncher/AppLauncherPlugin.cpp" line="132"/>
+ <location filename="../desktop-plugins/applauncher/AppLauncherPlugin.cpp" line="139"/>
<source>View Properties</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../desktop-plugins/applauncher/AppLauncherPlugin.cpp" line="134"/>
+ <location filename="../desktop-plugins/applauncher/AppLauncherPlugin.cpp" line="141"/>
<source>File Operations</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../desktop-plugins/applauncher/AppLauncherPlugin.cpp" line="136"/>
+ <location filename="../desktop-plugins/applauncher/AppLauncherPlugin.cpp" line="143"/>
<source>Rename</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../desktop-plugins/applauncher/AppLauncherPlugin.cpp" line="139"/>
+ <location filename="../desktop-plugins/applauncher/AppLauncherPlugin.cpp" line="146"/>
<source>Copy</source>
<translation type="unfinished">Copia</translation>
</message>
<message>
- <location filename="../desktop-plugins/applauncher/AppLauncherPlugin.cpp" line="142"/>
+ <location filename="../desktop-plugins/applauncher/AppLauncherPlugin.cpp" line="149"/>
<source>Cut</source>
<translation type="unfinished">Taglia</translation>
</message>
<message>
- <location filename="../desktop-plugins/applauncher/AppLauncherPlugin.cpp" line="144"/>
+ <location filename="../desktop-plugins/applauncher/AppLauncherPlugin.cpp" line="151"/>
<source>Delete</source>
<translation type="unfinished">Cancella</translation>
</message>
<message>
- <location filename="../desktop-plugins/applauncher/AppLauncherPlugin.cpp" line="205"/>
+ <location filename="../desktop-plugins/applauncher/AppLauncherPlugin.cpp" line="212"/>
<source>Select Application</source>
<translation>Seleziona Applicazione</translation>
</message>
<message>
- <location filename="../desktop-plugins/applauncher/AppLauncherPlugin.cpp" line="205"/>
+ <location filename="../desktop-plugins/applauncher/AppLauncherPlugin.cpp" line="212"/>
<source>Name:</source>
<translation>Nome:</translation>
</message>
<message>
- <location filename="../desktop-plugins/applauncher/AppLauncherPlugin.cpp" line="291"/>
+ <location filename="../desktop-plugins/applauncher/AppLauncherPlugin.cpp" line="298"/>
<source>New Filename</source>
<translation type="unfinished"></translation>
</message>
@@ -851,7 +851,7 @@
<name>LSession</name>
<message>
<location filename="../LSession.cpp" line="163"/>
- <location filename="../LSession.cpp" line="344"/>
+ <location filename="../LSession.cpp" line="342"/>
<source>Desktop</source>
<translation>Desktop</translation>
</message>
diff --git a/src-qt5/core/lumina-desktop/i18n/lumina-desktop_ja.ts b/src-qt5/core/lumina-desktop/i18n/lumina-desktop_ja.ts
index d4dc2e77..55ab6645 100644
--- a/src-qt5/core/lumina-desktop/i18n/lumina-desktop_ja.ts
+++ b/src-qt5/core/lumina-desktop/i18n/lumina-desktop_ja.ts
@@ -41,62 +41,62 @@
<translation>クリックして設定してください</translation>
</message>
<message>
- <location filename="../desktop-plugins/applauncher/AppLauncherPlugin.cpp" line="72"/>
+ <location filename="../desktop-plugins/applauncher/AppLauncherPlugin.cpp" line="73"/>
<source>Launch %1</source>
<translation type="unfinished">%1 を起動</translation>
</message>
<message>
- <location filename="../desktop-plugins/applauncher/AppLauncherPlugin.cpp" line="127"/>
+ <location filename="../desktop-plugins/applauncher/AppLauncherPlugin.cpp" line="134"/>
<source>Open</source>
<translation type="unfinished">開く</translation>
</message>
<message>
- <location filename="../desktop-plugins/applauncher/AppLauncherPlugin.cpp" line="129"/>
+ <location filename="../desktop-plugins/applauncher/AppLauncherPlugin.cpp" line="136"/>
<source>Open With</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../desktop-plugins/applauncher/AppLauncherPlugin.cpp" line="132"/>
+ <location filename="../desktop-plugins/applauncher/AppLauncherPlugin.cpp" line="139"/>
<source>View Properties</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../desktop-plugins/applauncher/AppLauncherPlugin.cpp" line="134"/>
+ <location filename="../desktop-plugins/applauncher/AppLauncherPlugin.cpp" line="141"/>
<source>File Operations</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../desktop-plugins/applauncher/AppLauncherPlugin.cpp" line="136"/>
+ <location filename="../desktop-plugins/applauncher/AppLauncherPlugin.cpp" line="143"/>
<source>Rename</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../desktop-plugins/applauncher/AppLauncherPlugin.cpp" line="139"/>
+ <location filename="../desktop-plugins/applauncher/AppLauncherPlugin.cpp" line="146"/>
<source>Copy</source>
<translation type="unfinished">コピー</translation>
</message>
<message>
- <location filename="../desktop-plugins/applauncher/AppLauncherPlugin.cpp" line="142"/>
+ <location filename="../desktop-plugins/applauncher/AppLauncherPlugin.cpp" line="149"/>
<source>Cut</source>
<translation type="unfinished">切り取り</translation>
</message>
<message>
- <location filename="../desktop-plugins/applauncher/AppLauncherPlugin.cpp" line="144"/>
+ <location filename="../desktop-plugins/applauncher/AppLauncherPlugin.cpp" line="151"/>
<source>Delete</source>
<translation type="unfinished">削除</translation>
</message>
<message>
- <location filename="../desktop-plugins/applauncher/AppLauncherPlugin.cpp" line="205"/>
+ <location filename="../desktop-plugins/applauncher/AppLauncherPlugin.cpp" line="212"/>
<source>Select Application</source>
<translation>アプリケーションを選択してください</translation>
</message>
<message>
- <location filename="../desktop-plugins/applauncher/AppLauncherPlugin.cpp" line="205"/>
+ <location filename="../desktop-plugins/applauncher/AppLauncherPlugin.cpp" line="212"/>
<source>Name:</source>
<translation>名前:</translation>
</message>
<message>
- <location filename="../desktop-plugins/applauncher/AppLauncherPlugin.cpp" line="291"/>
+ <location filename="../desktop-plugins/applauncher/AppLauncherPlugin.cpp" line="298"/>
<source>New Filename</source>
<translation type="unfinished"></translation>
</message>
@@ -856,7 +856,7 @@
<name>LSession</name>
<message>
<location filename="../LSession.cpp" line="163"/>
- <location filename="../LSession.cpp" line="344"/>
+ <location filename="../LSession.cpp" line="342"/>
<source>Desktop</source>
<translatorcomment>これ、ファイルパスなので、「デスクトップ」と訳したらまずい</translatorcomment>
<translation>Desktop</translation>
diff --git a/src-qt5/core/lumina-desktop/i18n/lumina-desktop_ka.ts b/src-qt5/core/lumina-desktop/i18n/lumina-desktop_ka.ts
index 6a86d9f6..caeb719a 100644
--- a/src-qt5/core/lumina-desktop/i18n/lumina-desktop_ka.ts
+++ b/src-qt5/core/lumina-desktop/i18n/lumina-desktop_ka.ts
@@ -38,62 +38,62 @@
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../desktop-plugins/applauncher/AppLauncherPlugin.cpp" line="72"/>
+ <location filename="../desktop-plugins/applauncher/AppLauncherPlugin.cpp" line="73"/>
<source>Launch %1</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../desktop-plugins/applauncher/AppLauncherPlugin.cpp" line="127"/>
+ <location filename="../desktop-plugins/applauncher/AppLauncherPlugin.cpp" line="134"/>
<source>Open</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../desktop-plugins/applauncher/AppLauncherPlugin.cpp" line="129"/>
+ <location filename="../desktop-plugins/applauncher/AppLauncherPlugin.cpp" line="136"/>
<source>Open With</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../desktop-plugins/applauncher/AppLauncherPlugin.cpp" line="132"/>
+ <location filename="../desktop-plugins/applauncher/AppLauncherPlugin.cpp" line="139"/>
<source>View Properties</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../desktop-plugins/applauncher/AppLauncherPlugin.cpp" line="134"/>
+ <location filename="../desktop-plugins/applauncher/AppLauncherPlugin.cpp" line="141"/>
<source>File Operations</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../desktop-plugins/applauncher/AppLauncherPlugin.cpp" line="136"/>
+ <location filename="../desktop-plugins/applauncher/AppLauncherPlugin.cpp" line="143"/>
<source>Rename</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../desktop-plugins/applauncher/AppLauncherPlugin.cpp" line="139"/>
+ <location filename="../desktop-plugins/applauncher/AppLauncherPlugin.cpp" line="146"/>
<source>Copy</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../desktop-plugins/applauncher/AppLauncherPlugin.cpp" line="142"/>
+ <location filename="../desktop-plugins/applauncher/AppLauncherPlugin.cpp" line="149"/>
<source>Cut</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../desktop-plugins/applauncher/AppLauncherPlugin.cpp" line="144"/>
+ <location filename="../desktop-plugins/applauncher/AppLauncherPlugin.cpp" line="151"/>
<source>Delete</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../desktop-plugins/applauncher/AppLauncherPlugin.cpp" line="205"/>
+ <location filename="../desktop-plugins/applauncher/AppLauncherPlugin.cpp" line="212"/>
<source>Select Application</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../desktop-plugins/applauncher/AppLauncherPlugin.cpp" line="205"/>
+ <location filename="../desktop-plugins/applauncher/AppLauncherPlugin.cpp" line="212"/>
<source>Name:</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../desktop-plugins/applauncher/AppLauncherPlugin.cpp" line="291"/>
+ <location filename="../desktop-plugins/applauncher/AppLauncherPlugin.cpp" line="298"/>
<source>New Filename</source>
<translation type="unfinished"></translation>
</message>
@@ -851,7 +851,7 @@
<name>LSession</name>
<message>
<location filename="../LSession.cpp" line="163"/>
- <location filename="../LSession.cpp" line="344"/>
+ <location filename="../LSession.cpp" line="342"/>
<source>Desktop</source>
<translation type="unfinished"></translation>
</message>
diff --git a/src-qt5/core/lumina-desktop/i18n/lumina-desktop_ko.ts b/src-qt5/core/lumina-desktop/i18n/lumina-desktop_ko.ts
index 836f74da..c47d7279 100644
--- a/src-qt5/core/lumina-desktop/i18n/lumina-desktop_ko.ts
+++ b/src-qt5/core/lumina-desktop/i18n/lumina-desktop_ko.ts
@@ -38,62 +38,62 @@
<translation>설정하기 위해 누름</translation>
</message>
<message>
- <location filename="../desktop-plugins/applauncher/AppLauncherPlugin.cpp" line="72"/>
+ <location filename="../desktop-plugins/applauncher/AppLauncherPlugin.cpp" line="73"/>
<source>Launch %1</source>
<translation type="unfinished">%1 실행</translation>
</message>
<message>
- <location filename="../desktop-plugins/applauncher/AppLauncherPlugin.cpp" line="127"/>
+ <location filename="../desktop-plugins/applauncher/AppLauncherPlugin.cpp" line="134"/>
<source>Open</source>
<translation type="unfinished">열기</translation>
</message>
<message>
- <location filename="../desktop-plugins/applauncher/AppLauncherPlugin.cpp" line="129"/>
+ <location filename="../desktop-plugins/applauncher/AppLauncherPlugin.cpp" line="136"/>
<source>Open With</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../desktop-plugins/applauncher/AppLauncherPlugin.cpp" line="132"/>
+ <location filename="../desktop-plugins/applauncher/AppLauncherPlugin.cpp" line="139"/>
<source>View Properties</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../desktop-plugins/applauncher/AppLauncherPlugin.cpp" line="134"/>
+ <location filename="../desktop-plugins/applauncher/AppLauncherPlugin.cpp" line="141"/>
<source>File Operations</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../desktop-plugins/applauncher/AppLauncherPlugin.cpp" line="136"/>
+ <location filename="../desktop-plugins/applauncher/AppLauncherPlugin.cpp" line="143"/>
<source>Rename</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../desktop-plugins/applauncher/AppLauncherPlugin.cpp" line="139"/>
+ <location filename="../desktop-plugins/applauncher/AppLauncherPlugin.cpp" line="146"/>
<source>Copy</source>
<translation type="unfinished">복사</translation>
</message>
<message>
- <location filename="../desktop-plugins/applauncher/AppLauncherPlugin.cpp" line="142"/>
+ <location filename="../desktop-plugins/applauncher/AppLauncherPlugin.cpp" line="149"/>
<source>Cut</source>
<translation type="unfinished">잘라내기</translation>
</message>
<message>
- <location filename="../desktop-plugins/applauncher/AppLauncherPlugin.cpp" line="144"/>
+ <location filename="../desktop-plugins/applauncher/AppLauncherPlugin.cpp" line="151"/>
<source>Delete</source>
<translation type="unfinished">삭제</translation>
</message>
<message>
- <location filename="../desktop-plugins/applauncher/AppLauncherPlugin.cpp" line="205"/>
+ <location filename="../desktop-plugins/applauncher/AppLauncherPlugin.cpp" line="212"/>
<source>Select Application</source>
<translation>프로그램 선택</translation>
</message>
<message>
- <location filename="../desktop-plugins/applauncher/AppLauncherPlugin.cpp" line="205"/>
+ <location filename="../desktop-plugins/applauncher/AppLauncherPlugin.cpp" line="212"/>
<source>Name:</source>
<translation>이름:</translation>
</message>
<message>
- <location filename="../desktop-plugins/applauncher/AppLauncherPlugin.cpp" line="291"/>
+ <location filename="../desktop-plugins/applauncher/AppLauncherPlugin.cpp" line="298"/>
<source>New Filename</source>
<translation type="unfinished"></translation>
</message>
@@ -851,7 +851,7 @@
<name>LSession</name>
<message>
<location filename="../LSession.cpp" line="163"/>
- <location filename="../LSession.cpp" line="344"/>
+ <location filename="../LSession.cpp" line="342"/>
<source>Desktop</source>
<translation type="unfinished">바탕 화면</translation>
</message>
diff --git a/src-qt5/core/lumina-desktop/i18n/lumina-desktop_lt.ts b/src-qt5/core/lumina-desktop/i18n/lumina-desktop_lt.ts
index 1869e3e0..34b0a5e6 100644
--- a/src-qt5/core/lumina-desktop/i18n/lumina-desktop_lt.ts
+++ b/src-qt5/core/lumina-desktop/i18n/lumina-desktop_lt.ts
@@ -38,62 +38,62 @@
<translation>Spustelėkite, norėdami nustatyti</translation>
</message>
<message>
- <location filename="../desktop-plugins/applauncher/AppLauncherPlugin.cpp" line="72"/>
+ <location filename="../desktop-plugins/applauncher/AppLauncherPlugin.cpp" line="73"/>
<source>Launch %1</source>
<translation>Paleisti %1</translation>
</message>
<message>
- <location filename="../desktop-plugins/applauncher/AppLauncherPlugin.cpp" line="127"/>
+ <location filename="../desktop-plugins/applauncher/AppLauncherPlugin.cpp" line="134"/>
<source>Open</source>
<translation>Atverti</translation>
</message>
<message>
- <location filename="../desktop-plugins/applauncher/AppLauncherPlugin.cpp" line="129"/>
+ <location filename="../desktop-plugins/applauncher/AppLauncherPlugin.cpp" line="136"/>
<source>Open With</source>
<translation>Atverti, naudojant</translation>
</message>
<message>
- <location filename="../desktop-plugins/applauncher/AppLauncherPlugin.cpp" line="132"/>
+ <location filename="../desktop-plugins/applauncher/AppLauncherPlugin.cpp" line="139"/>
<source>View Properties</source>
<translation>Rodyti savybes</translation>
</message>
<message>
- <location filename="../desktop-plugins/applauncher/AppLauncherPlugin.cpp" line="134"/>
+ <location filename="../desktop-plugins/applauncher/AppLauncherPlugin.cpp" line="141"/>
<source>File Operations</source>
<translation>Failų operacijos</translation>
</message>
<message>
- <location filename="../desktop-plugins/applauncher/AppLauncherPlugin.cpp" line="136"/>
+ <location filename="../desktop-plugins/applauncher/AppLauncherPlugin.cpp" line="143"/>
<source>Rename</source>
<translation>Pervadinti</translation>
</message>
<message>
- <location filename="../desktop-plugins/applauncher/AppLauncherPlugin.cpp" line="139"/>
+ <location filename="../desktop-plugins/applauncher/AppLauncherPlugin.cpp" line="146"/>
<source>Copy</source>
<translation>Kopijuoti</translation>
</message>
<message>
- <location filename="../desktop-plugins/applauncher/AppLauncherPlugin.cpp" line="142"/>
+ <location filename="../desktop-plugins/applauncher/AppLauncherPlugin.cpp" line="149"/>
<source>Cut</source>
<translation>Iškirpti</translation>
</message>
<message>
- <location filename="../desktop-plugins/applauncher/AppLauncherPlugin.cpp" line="144"/>
+ <location filename="../desktop-plugins/applauncher/AppLauncherPlugin.cpp" line="151"/>
<source>Delete</source>
<translation>Ištrinti</translation>
</message>
<message>
- <location filename="../desktop-plugins/applauncher/AppLauncherPlugin.cpp" line="205"/>
+ <location filename="../desktop-plugins/applauncher/AppLauncherPlugin.cpp" line="212"/>
<source>Select Application</source>
<translation>Pasirinkti programą</translation>
</message>
<message>
- <location filename="../desktop-plugins/applauncher/AppLauncherPlugin.cpp" line="205"/>
+ <location filename="../desktop-plugins/applauncher/AppLauncherPlugin.cpp" line="212"/>
<source>Name:</source>
<translation>Pavadinimas:</translation>
</message>
<message>
- <location filename="../desktop-plugins/applauncher/AppLauncherPlugin.cpp" line="291"/>
+ <location filename="../desktop-plugins/applauncher/AppLauncherPlugin.cpp" line="298"/>
<source>New Filename</source>
<translation>Naujas failo pavadinimas</translation>
</message>
@@ -265,12 +265,12 @@
</message>
<message>
<location filename="../BootSplash.cpp" line="65"/>
- <source>Don't expect to build up the weak by pulling down the strong.</source>
+ <source>Don&apos;t expect to build up the weak by pulling down the strong.</source>
<translation>Nesitikėk padrąsinti silpnus, žemindamas stiprius.</translation>
</message>
<message>
<location filename="../BootSplash.cpp" line="67"/>
- <source>You can't know too much, but you can say too much.</source>
+ <source>You can&apos;t know too much, but you can say too much.</source>
<translation>Negali per daug žinoti, tačiau gali per daug pasakyti.</translation>
</message>
<message>
@@ -350,7 +350,7 @@
</message>
<message>
<location filename="../BootSplash.cpp" line="99"/>
- <source>Only two things are infinite, the universe and human stupidity, and I'm not sure about the former.</source>
+ <source>Only two things are infinite, the universe and human stupidity, and I&apos;m not sure about the former.</source>
<translation>Tik du dalykai yra beribiai: visata ir žmogaus kvailumas; tačiau dėl visatos aš nesu tikras.</translation>
</message>
<message>
@@ -360,8 +360,8 @@
</message>
<message>
<location filename="../BootSplash.cpp" line="103"/>
- <source>Do, or do not. There is no 'try'.</source>
- <translation>Daryti arba nedaryti. Nėra "bandyti".</translation>
+ <source>Do, or do not. There is no &apos;try&apos;.</source>
+ <translation>Daryti arba nedaryti. Nėra &quot;bandyti&quot;.</translation>
</message>
<message>
<location filename="../BootSplash.cpp" line="105"/>
@@ -380,7 +380,7 @@
</message>
<message>
<location filename="../BootSplash.cpp" line="111"/>
- <source>It's kind of fun to do the impossible.</source>
+ <source>It&apos;s kind of fun to do the impossible.</source>
<translation>Smagu yra daryti tai, kas neįmanoma.</translation>
</message>
<message>
@@ -851,7 +851,7 @@
<name>LSession</name>
<message>
<location filename="../LSession.cpp" line="163"/>
- <location filename="../LSession.cpp" line="344"/>
+ <location filename="../LSession.cpp" line="342"/>
<source>Desktop</source>
<translation>Darbalaukis</translation>
</message>
diff --git a/src-qt5/core/lumina-desktop/i18n/lumina-desktop_lv.ts b/src-qt5/core/lumina-desktop/i18n/lumina-desktop_lv.ts
index 070884ed..7cf1b6f3 100644
--- a/src-qt5/core/lumina-desktop/i18n/lumina-desktop_lv.ts
+++ b/src-qt5/core/lumina-desktop/i18n/lumina-desktop_lv.ts
@@ -38,62 +38,62 @@
<translation>Klikšķiniet, lai iestatītu</translation>
</message>
<message>
- <location filename="../desktop-plugins/applauncher/AppLauncherPlugin.cpp" line="72"/>
+ <location filename="../desktop-plugins/applauncher/AppLauncherPlugin.cpp" line="73"/>
<source>Launch %1</source>
<translation type="unfinished">Palaist %1</translation>
</message>
<message>
- <location filename="../desktop-plugins/applauncher/AppLauncherPlugin.cpp" line="127"/>
+ <location filename="../desktop-plugins/applauncher/AppLauncherPlugin.cpp" line="134"/>
<source>Open</source>
<translation type="unfinished">Atvērt</translation>
</message>
<message>
- <location filename="../desktop-plugins/applauncher/AppLauncherPlugin.cpp" line="129"/>
+ <location filename="../desktop-plugins/applauncher/AppLauncherPlugin.cpp" line="136"/>
<source>Open With</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../desktop-plugins/applauncher/AppLauncherPlugin.cpp" line="132"/>
+ <location filename="../desktop-plugins/applauncher/AppLauncherPlugin.cpp" line="139"/>
<source>View Properties</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../desktop-plugins/applauncher/AppLauncherPlugin.cpp" line="134"/>
+ <location filename="../desktop-plugins/applauncher/AppLauncherPlugin.cpp" line="141"/>
<source>File Operations</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../desktop-plugins/applauncher/AppLauncherPlugin.cpp" line="136"/>
+ <location filename="../desktop-plugins/applauncher/AppLauncherPlugin.cpp" line="143"/>
<source>Rename</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../desktop-plugins/applauncher/AppLauncherPlugin.cpp" line="139"/>
+ <location filename="../desktop-plugins/applauncher/AppLauncherPlugin.cpp" line="146"/>
<source>Copy</source>
<translation type="unfinished">Kopēt</translation>
</message>
<message>
- <location filename="../desktop-plugins/applauncher/AppLauncherPlugin.cpp" line="142"/>
+ <location filename="../desktop-plugins/applauncher/AppLauncherPlugin.cpp" line="149"/>
<source>Cut</source>
<translation type="unfinished">Izgriezt</translation>
</message>
<message>
- <location filename="../desktop-plugins/applauncher/AppLauncherPlugin.cpp" line="144"/>
+ <location filename="../desktop-plugins/applauncher/AppLauncherPlugin.cpp" line="151"/>
<source>Delete</source>
<translation type="unfinished">Dzēst</translation>
</message>
<message>
- <location filename="../desktop-plugins/applauncher/AppLauncherPlugin.cpp" line="205"/>
+ <location filename="../desktop-plugins/applauncher/AppLauncherPlugin.cpp" line="212"/>
<source>Select Application</source>
<translation>Izvēlieties lietotni</translation>
</message>
<message>
- <location filename="../desktop-plugins/applauncher/AppLauncherPlugin.cpp" line="205"/>
+ <location filename="../desktop-plugins/applauncher/AppLauncherPlugin.cpp" line="212"/>
<source>Name:</source>
<translation>Nosaukums:</translation>
</message>
<message>
- <location filename="../desktop-plugins/applauncher/AppLauncherPlugin.cpp" line="291"/>
+ <location filename="../desktop-plugins/applauncher/AppLauncherPlugin.cpp" line="298"/>
<source>New Filename</source>
<translation type="unfinished"></translation>
</message>
@@ -851,7 +851,7 @@
<name>LSession</name>
<message>
<location filename="../LSession.cpp" line="163"/>
- <location filename="../LSession.cpp" line="344"/>
+ <location filename="../LSession.cpp" line="342"/>
<source>Desktop</source>
<translation>Darbvirsma</translation>
</message>
diff --git a/src-qt5/core/lumina-desktop/i18n/lumina-desktop_mk.ts b/src-qt5/core/lumina-desktop/i18n/lumina-desktop_mk.ts
index 6a86d9f6..caeb719a 100644
--- a/src-qt5/core/lumina-desktop/i18n/lumina-desktop_mk.ts
+++ b/src-qt5/core/lumina-desktop/i18n/lumina-desktop_mk.ts
@@ -38,62 +38,62 @@
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../desktop-plugins/applauncher/AppLauncherPlugin.cpp" line="72"/>
+ <location filename="../desktop-plugins/applauncher/AppLauncherPlugin.cpp" line="73"/>
<source>Launch %1</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../desktop-plugins/applauncher/AppLauncherPlugin.cpp" line="127"/>
+ <location filename="../desktop-plugins/applauncher/AppLauncherPlugin.cpp" line="134"/>
<source>Open</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../desktop-plugins/applauncher/AppLauncherPlugin.cpp" line="129"/>
+ <location filename="../desktop-plugins/applauncher/AppLauncherPlugin.cpp" line="136"/>
<source>Open With</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../desktop-plugins/applauncher/AppLauncherPlugin.cpp" line="132"/>
+ <location filename="../desktop-plugins/applauncher/AppLauncherPlugin.cpp" line="139"/>
<source>View Properties</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../desktop-plugins/applauncher/AppLauncherPlugin.cpp" line="134"/>
+ <location filename="../desktop-plugins/applauncher/AppLauncherPlugin.cpp" line="141"/>
<source>File Operations</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../desktop-plugins/applauncher/AppLauncherPlugin.cpp" line="136"/>
+ <location filename="../desktop-plugins/applauncher/AppLauncherPlugin.cpp" line="143"/>
<source>Rename</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../desktop-plugins/applauncher/AppLauncherPlugin.cpp" line="139"/>
+ <location filename="../desktop-plugins/applauncher/AppLauncherPlugin.cpp" line="146"/>
<source>Copy</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../desktop-plugins/applauncher/AppLauncherPlugin.cpp" line="142"/>
+ <location filename="../desktop-plugins/applauncher/AppLauncherPlugin.cpp" line="149"/>
<source>Cut</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../desktop-plugins/applauncher/AppLauncherPlugin.cpp" line="144"/>
+ <location filename="../desktop-plugins/applauncher/AppLauncherPlugin.cpp" line="151"/>
<source>Delete</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../desktop-plugins/applauncher/AppLauncherPlugin.cpp" line="205"/>
+ <location filename="../desktop-plugins/applauncher/AppLauncherPlugin.cpp" line="212"/>
<source>Select Application</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../desktop-plugins/applauncher/AppLauncherPlugin.cpp" line="205"/>
+ <location filename="../desktop-plugins/applauncher/AppLauncherPlugin.cpp" line="212"/>
<source>Name:</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../desktop-plugins/applauncher/AppLauncherPlugin.cpp" line="291"/>
+ <location filename="../desktop-plugins/applauncher/AppLauncherPlugin.cpp" line="298"/>
<source>New Filename</source>
<translation type="unfinished"></translation>
</message>
@@ -851,7 +851,7 @@
<name>LSession</name>
<message>
<location filename="../LSession.cpp" line="163"/>
- <location filename="../LSession.cpp" line="344"/>
+ <location filename="../LSession.cpp" line="342"/>
<source>Desktop</source>
<translation type="unfinished"></translation>
</message>
diff --git a/src-qt5/core/lumina-desktop/i18n/lumina-desktop_mn.ts b/src-qt5/core/lumina-desktop/i18n/lumina-desktop_mn.ts
index 6a86d9f6..caeb719a 100644
--- a/src-qt5/core/lumina-desktop/i18n/lumina-desktop_mn.ts
+++ b/src-qt5/core/lumina-desktop/i18n/lumina-desktop_mn.ts
@@ -38,62 +38,62 @@
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../desktop-plugins/applauncher/AppLauncherPlugin.cpp" line="72"/>
+ <location filename="../desktop-plugins/applauncher/AppLauncherPlugin.cpp" line="73"/>
<source>Launch %1</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../desktop-plugins/applauncher/AppLauncherPlugin.cpp" line="127"/>
+ <location filename="../desktop-plugins/applauncher/AppLauncherPlugin.cpp" line="134"/>
<source>Open</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../desktop-plugins/applauncher/AppLauncherPlugin.cpp" line="129"/>
+ <location filename="../desktop-plugins/applauncher/AppLauncherPlugin.cpp" line="136"/>
<source>Open With</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../desktop-plugins/applauncher/AppLauncherPlugin.cpp" line="132"/>
+ <location filename="../desktop-plugins/applauncher/AppLauncherPlugin.cpp" line="139"/>
<source>View Properties</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../desktop-plugins/applauncher/AppLauncherPlugin.cpp" line="134"/>
+ <location filename="../desktop-plugins/applauncher/AppLauncherPlugin.cpp" line="141"/>
<source>File Operations</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../desktop-plugins/applauncher/AppLauncherPlugin.cpp" line="136"/>
+ <location filename="../desktop-plugins/applauncher/AppLauncherPlugin.cpp" line="143"/>
<source>Rename</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../desktop-plugins/applauncher/AppLauncherPlugin.cpp" line="139"/>
+ <location filename="../desktop-plugins/applauncher/AppLauncherPlugin.cpp" line="146"/>
<source>Copy</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../desktop-plugins/applauncher/AppLauncherPlugin.cpp" line="142"/>
+ <location filename="../desktop-plugins/applauncher/AppLauncherPlugin.cpp" line="149"/>
<source>Cut</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../desktop-plugins/applauncher/AppLauncherPlugin.cpp" line="144"/>
+ <location filename="../desktop-plugins/applauncher/AppLauncherPlugin.cpp" line="151"/>
<source>Delete</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../desktop-plugins/applauncher/AppLauncherPlugin.cpp" line="205"/>
+ <location filename="../desktop-plugins/applauncher/AppLauncherPlugin.cpp" line="212"/>
<source>Select Application</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../desktop-plugins/applauncher/AppLauncherPlugin.cpp" line="205"/>
+ <location filename="../desktop-plugins/applauncher/AppLauncherPlugin.cpp" line="212"/>
<source>Name:</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../desktop-plugins/applauncher/AppLauncherPlugin.cpp" line="291"/>
+ <location filename="../desktop-plugins/applauncher/AppLauncherPlugin.cpp" line="298"/>
<source>New Filename</source>
<translation type="unfinished"></translation>
</message>
@@ -851,7 +851,7 @@
<name>LSession</name>
<message>
<location filename="../LSession.cpp" line="163"/>
- <location filename="../LSession.cpp" line="344"/>
+ <location filename="../LSession.cpp" line="342"/>
<source>Desktop</source>
<translation type="unfinished"></translation>
</message>
diff --git a/src-qt5/core/lumina-desktop/i18n/lumina-desktop_ms.ts b/src-qt5/core/lumina-desktop/i18n/lumina-desktop_ms.ts
index 6a86d9f6..caeb719a 100644
--- a/src-qt5/core/lumina-desktop/i18n/lumina-desktop_ms.ts
+++ b/src-qt5/core/lumina-desktop/i18n/lumina-desktop_ms.ts
@@ -38,62 +38,62 @@
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../desktop-plugins/applauncher/AppLauncherPlugin.cpp" line="72"/>
+ <location filename="../desktop-plugins/applauncher/AppLauncherPlugin.cpp" line="73"/>
<source>Launch %1</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../desktop-plugins/applauncher/AppLauncherPlugin.cpp" line="127"/>
+ <location filename="../desktop-plugins/applauncher/AppLauncherPlugin.cpp" line="134"/>
<source>Open</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../desktop-plugins/applauncher/AppLauncherPlugin.cpp" line="129"/>
+ <location filename="../desktop-plugins/applauncher/AppLauncherPlugin.cpp" line="136"/>
<source>Open With</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../desktop-plugins/applauncher/AppLauncherPlugin.cpp" line="132"/>
+ <location filename="../desktop-plugins/applauncher/AppLauncherPlugin.cpp" line="139"/>
<source>View Properties</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../desktop-plugins/applauncher/AppLauncherPlugin.cpp" line="134"/>
+ <location filename="../desktop-plugins/applauncher/AppLauncherPlugin.cpp" line="141"/>
<source>File Operations</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../desktop-plugins/applauncher/AppLauncherPlugin.cpp" line="136"/>
+ <location filename="../desktop-plugins/applauncher/AppLauncherPlugin.cpp" line="143"/>
<source>Rename</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../desktop-plugins/applauncher/AppLauncherPlugin.cpp" line="139"/>
+ <location filename="../desktop-plugins/applauncher/AppLauncherPlugin.cpp" line="146"/>
<source>Copy</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../desktop-plugins/applauncher/AppLauncherPlugin.cpp" line="142"/>
+ <location filename="../desktop-plugins/applauncher/AppLauncherPlugin.cpp" line="149"/>
<source>Cut</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../desktop-plugins/applauncher/AppLauncherPlugin.cpp" line="144"/>
+ <location filename="../desktop-plugins/applauncher/AppLauncherPlugin.cpp" line="151"/>
<source>Delete</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../desktop-plugins/applauncher/AppLauncherPlugin.cpp" line="205"/>
+ <location filename="../desktop-plugins/applauncher/AppLauncherPlugin.cpp" line="212"/>
<source>Select Application</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../desktop-plugins/applauncher/AppLauncherPlugin.cpp" line="205"/>
+ <location filename="../desktop-plugins/applauncher/AppLauncherPlugin.cpp" line="212"/>
<source>Name:</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../desktop-plugins/applauncher/AppLauncherPlugin.cpp" line="291"/>
+ <location filename="../desktop-plugins/applauncher/AppLauncherPlugin.cpp" line="298"/>
<source>New Filename</source>
<translation type="unfinished"></translation>
</message>
@@ -851,7 +851,7 @@
<name>LSession</name>
<message>
<location filename="../LSession.cpp" line="163"/>
- <location filename="../LSession.cpp" line="344"/>
+ <location filename="../LSession.cpp" line="342"/>
<source>Desktop</source>
<translation type="unfinished"></translation>
</message>
diff --git a/src-qt5/core/lumina-desktop/i18n/lumina-desktop_mt.ts b/src-qt5/core/lumina-desktop/i18n/lumina-desktop_mt.ts
index 6a86d9f6..caeb719a 100644
--- a/src-qt5/core/lumina-desktop/i18n/lumina-desktop_mt.ts
+++ b/src-qt5/core/lumina-desktop/i18n/lumina-desktop_mt.ts
@@ -38,62 +38,62 @@
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../desktop-plugins/applauncher/AppLauncherPlugin.cpp" line="72"/>
+ <location filename="../desktop-plugins/applauncher/AppLauncherPlugin.cpp" line="73"/>
<source>Launch %1</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../desktop-plugins/applauncher/AppLauncherPlugin.cpp" line="127"/>
+ <location filename="../desktop-plugins/applauncher/AppLauncherPlugin.cpp" line="134"/>
<source>Open</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../desktop-plugins/applauncher/AppLauncherPlugin.cpp" line="129"/>
+ <location filename="../desktop-plugins/applauncher/AppLauncherPlugin.cpp" line="136"/>
<source>Open With</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../desktop-plugins/applauncher/AppLauncherPlugin.cpp" line="132"/>
+ <location filename="../desktop-plugins/applauncher/AppLauncherPlugin.cpp" line="139"/>
<source>View Properties</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../desktop-plugins/applauncher/AppLauncherPlugin.cpp" line="134"/>
+ <location filename="../desktop-plugins/applauncher/AppLauncherPlugin.cpp" line="141"/>
<source>File Operations</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../desktop-plugins/applauncher/AppLauncherPlugin.cpp" line="136"/>
+ <location filename="../desktop-plugins/applauncher/AppLauncherPlugin.cpp" line="143"/>
<source>Rename</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../desktop-plugins/applauncher/AppLauncherPlugin.cpp" line="139"/>
+ <location filename="../desktop-plugins/applauncher/AppLauncherPlugin.cpp" line="146"/>
<source>Copy</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../desktop-plugins/applauncher/AppLauncherPlugin.cpp" line="142"/>
+ <location filename="../desktop-plugins/applauncher/AppLauncherPlugin.cpp" line="149"/>
<source>Cut</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../desktop-plugins/applauncher/AppLauncherPlugin.cpp" line="144"/>
+ <location filename="../desktop-plugins/applauncher/AppLauncherPlugin.cpp" line="151"/>
<source>Delete</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../desktop-plugins/applauncher/AppLauncherPlugin.cpp" line="205"/>
+ <location filename="../desktop-plugins/applauncher/AppLauncherPlugin.cpp" line="212"/>
<source>Select Application</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../desktop-plugins/applauncher/AppLauncherPlugin.cpp" line="205"/>
+ <location filename="../desktop-plugins/applauncher/AppLauncherPlugin.cpp" line="212"/>
<source>Name:</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../desktop-plugins/applauncher/AppLauncherPlugin.cpp" line="291"/>
+ <location filename="../desktop-plugins/applauncher/AppLauncherPlugin.cpp" line="298"/>
<source>New Filename</source>
<translation type="unfinished"></translation>
</message>
@@ -851,7 +851,7 @@
<name>LSession</name>
<message>
<location filename="../LSession.cpp" line="163"/>
- <location filename="../LSession.cpp" line="344"/>
+ <location filename="../LSession.cpp" line="342"/>
<source>Desktop</source>
<translation type="unfinished"></translation>
</message>
diff --git a/src-qt5/core/lumina-desktop/i18n/lumina-desktop_nb.ts b/src-qt5/core/lumina-desktop/i18n/lumina-desktop_nb.ts
index 6a86d9f6..caeb719a 100644
--- a/src-qt5/core/lumina-desktop/i18n/lumina-desktop_nb.ts
+++ b/src-qt5/core/lumina-desktop/i18n/lumina-desktop_nb.ts
@@ -38,62 +38,62 @@
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../desktop-plugins/applauncher/AppLauncherPlugin.cpp" line="72"/>
+ <location filename="../desktop-plugins/applauncher/AppLauncherPlugin.cpp" line="73"/>
<source>Launch %1</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../desktop-plugins/applauncher/AppLauncherPlugin.cpp" line="127"/>
+ <location filename="../desktop-plugins/applauncher/AppLauncherPlugin.cpp" line="134"/>
<source>Open</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../desktop-plugins/applauncher/AppLauncherPlugin.cpp" line="129"/>
+ <location filename="../desktop-plugins/applauncher/AppLauncherPlugin.cpp" line="136"/>
<source>Open With</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../desktop-plugins/applauncher/AppLauncherPlugin.cpp" line="132"/>
+ <location filename="../desktop-plugins/applauncher/AppLauncherPlugin.cpp" line="139"/>
<source>View Properties</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../desktop-plugins/applauncher/AppLauncherPlugin.cpp" line="134"/>
+ <location filename="../desktop-plugins/applauncher/AppLauncherPlugin.cpp" line="141"/>
<source>File Operations</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../desktop-plugins/applauncher/AppLauncherPlugin.cpp" line="136"/>
+ <location filename="../desktop-plugins/applauncher/AppLauncherPlugin.cpp" line="143"/>
<source>Rename</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../desktop-plugins/applauncher/AppLauncherPlugin.cpp" line="139"/>
+ <location filename="../desktop-plugins/applauncher/AppLauncherPlugin.cpp" line="146"/>
<source>Copy</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../desktop-plugins/applauncher/AppLauncherPlugin.cpp" line="142"/>
+ <location filename="../desktop-plugins/applauncher/AppLauncherPlugin.cpp" line="149"/>
<source>Cut</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../desktop-plugins/applauncher/AppLauncherPlugin.cpp" line="144"/>
+ <location filename="../desktop-plugins/applauncher/AppLauncherPlugin.cpp" line="151"/>
<source>Delete</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../desktop-plugins/applauncher/AppLauncherPlugin.cpp" line="205"/>
+ <location filename="../desktop-plugins/applauncher/AppLauncherPlugin.cpp" line="212"/>
<source>Select Application</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../desktop-plugins/applauncher/AppLauncherPlugin.cpp" line="205"/>
+ <location filename="../desktop-plugins/applauncher/AppLauncherPlugin.cpp" line="212"/>
<source>Name:</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../desktop-plugins/applauncher/AppLauncherPlugin.cpp" line="291"/>
+ <location filename="../desktop-plugins/applauncher/AppLauncherPlugin.cpp" line="298"/>
<source>New Filename</source>
<translation type="unfinished"></translation>
</message>
@@ -851,7 +851,7 @@
<name>LSession</name>
<message>
<location filename="../LSession.cpp" line="163"/>
- <location filename="../LSession.cpp" line="344"/>
+ <location filename="../LSession.cpp" line="342"/>
<source>Desktop</source>
<translation type="unfinished"></translation>
</message>
diff --git a/src-qt5/core/lumina-desktop/i18n/lumina-desktop_nl.ts b/src-qt5/core/lumina-desktop/i18n/lumina-desktop_nl.ts
index e39fcf70..9702b408 100644
--- a/src-qt5/core/lumina-desktop/i18n/lumina-desktop_nl.ts
+++ b/src-qt5/core/lumina-desktop/i18n/lumina-desktop_nl.ts
@@ -38,62 +38,62 @@
<translation>Klik om in te stellen</translation>
</message>
<message>
- <location filename="../desktop-plugins/applauncher/AppLauncherPlugin.cpp" line="72"/>
+ <location filename="../desktop-plugins/applauncher/AppLauncherPlugin.cpp" line="73"/>
<source>Launch %1</source>
<translation type="unfinished">%1 opstarten</translation>
</message>
<message>
- <location filename="../desktop-plugins/applauncher/AppLauncherPlugin.cpp" line="127"/>
+ <location filename="../desktop-plugins/applauncher/AppLauncherPlugin.cpp" line="134"/>
<source>Open</source>
<translation type="unfinished">Openen</translation>
</message>
<message>
- <location filename="../desktop-plugins/applauncher/AppLauncherPlugin.cpp" line="129"/>
+ <location filename="../desktop-plugins/applauncher/AppLauncherPlugin.cpp" line="136"/>
<source>Open With</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../desktop-plugins/applauncher/AppLauncherPlugin.cpp" line="132"/>
+ <location filename="../desktop-plugins/applauncher/AppLauncherPlugin.cpp" line="139"/>
<source>View Properties</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../desktop-plugins/applauncher/AppLauncherPlugin.cpp" line="134"/>
+ <location filename="../desktop-plugins/applauncher/AppLauncherPlugin.cpp" line="141"/>
<source>File Operations</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../desktop-plugins/applauncher/AppLauncherPlugin.cpp" line="136"/>
+ <location filename="../desktop-plugins/applauncher/AppLauncherPlugin.cpp" line="143"/>
<source>Rename</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../desktop-plugins/applauncher/AppLauncherPlugin.cpp" line="139"/>
+ <location filename="../desktop-plugins/applauncher/AppLauncherPlugin.cpp" line="146"/>
<source>Copy</source>
<translation type="unfinished">Plakken</translation>
</message>
<message>
- <location filename="../desktop-plugins/applauncher/AppLauncherPlugin.cpp" line="142"/>
+ <location filename="../desktop-plugins/applauncher/AppLauncherPlugin.cpp" line="149"/>
<source>Cut</source>
<translation type="unfinished">Knippen</translation>
</message>
<message>
- <location filename="../desktop-plugins/applauncher/AppLauncherPlugin.cpp" line="144"/>
+ <location filename="../desktop-plugins/applauncher/AppLauncherPlugin.cpp" line="151"/>
<source>Delete</source>
<translation type="unfinished">Verwijderen</translation>
</message>
<message>
- <location filename="../desktop-plugins/applauncher/AppLauncherPlugin.cpp" line="205"/>
+ <location filename="../desktop-plugins/applauncher/AppLauncherPlugin.cpp" line="212"/>
<source>Select Application</source>
<translation>Applicatie selecteren</translation>
</message>
<message>
- <location filename="../desktop-plugins/applauncher/AppLauncherPlugin.cpp" line="205"/>
+ <location filename="../desktop-plugins/applauncher/AppLauncherPlugin.cpp" line="212"/>
<source>Name:</source>
<translation>Naam:</translation>
</message>
<message>
- <location filename="../desktop-plugins/applauncher/AppLauncherPlugin.cpp" line="291"/>
+ <location filename="../desktop-plugins/applauncher/AppLauncherPlugin.cpp" line="298"/>
<source>New Filename</source>
<translation type="unfinished"></translation>
</message>
@@ -851,7 +851,7 @@
<name>LSession</name>
<message>
<location filename="../LSession.cpp" line="163"/>
- <location filename="../LSession.cpp" line="344"/>
+ <location filename="../LSession.cpp" line="342"/>
<source>Desktop</source>
<translation>Bureaublad</translation>
</message>
diff --git a/src-qt5/core/lumina-desktop/i18n/lumina-desktop_pa.ts b/src-qt5/core/lumina-desktop/i18n/lumina-desktop_pa.ts
index 6a86d9f6..caeb719a 100644
--- a/src-qt5/core/lumina-desktop/i18n/lumina-desktop_pa.ts
+++ b/src-qt5/core/lumina-desktop/i18n/lumina-desktop_pa.ts
@@ -38,62 +38,62 @@
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../desktop-plugins/applauncher/AppLauncherPlugin.cpp" line="72"/>
+ <location filename="../desktop-plugins/applauncher/AppLauncherPlugin.cpp" line="73"/>
<source>Launch %1</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../desktop-plugins/applauncher/AppLauncherPlugin.cpp" line="127"/>
+ <location filename="../desktop-plugins/applauncher/AppLauncherPlugin.cpp" line="134"/>
<source>Open</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../desktop-plugins/applauncher/AppLauncherPlugin.cpp" line="129"/>
+ <location filename="../desktop-plugins/applauncher/AppLauncherPlugin.cpp" line="136"/>
<source>Open With</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../desktop-plugins/applauncher/AppLauncherPlugin.cpp" line="132"/>
+ <location filename="../desktop-plugins/applauncher/AppLauncherPlugin.cpp" line="139"/>
<source>View Properties</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../desktop-plugins/applauncher/AppLauncherPlugin.cpp" line="134"/>
+ <location filename="../desktop-plugins/applauncher/AppLauncherPlugin.cpp" line="141"/>
<source>File Operations</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../desktop-plugins/applauncher/AppLauncherPlugin.cpp" line="136"/>
+ <location filename="../desktop-plugins/applauncher/AppLauncherPlugin.cpp" line="143"/>
<source>Rename</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../desktop-plugins/applauncher/AppLauncherPlugin.cpp" line="139"/>
+ <location filename="../desktop-plugins/applauncher/AppLauncherPlugin.cpp" line="146"/>
<source>Copy</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../desktop-plugins/applauncher/AppLauncherPlugin.cpp" line="142"/>
+ <location filename="../desktop-plugins/applauncher/AppLauncherPlugin.cpp" line="149"/>
<source>Cut</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../desktop-plugins/applauncher/AppLauncherPlugin.cpp" line="144"/>
+ <location filename="../desktop-plugins/applauncher/AppLauncherPlugin.cpp" line="151"/>
<source>Delete</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../desktop-plugins/applauncher/AppLauncherPlugin.cpp" line="205"/>
+ <location filename="../desktop-plugins/applauncher/AppLauncherPlugin.cpp" line="212"/>
<source>Select Application</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../desktop-plugins/applauncher/AppLauncherPlugin.cpp" line="205"/>
+ <location filename="../desktop-plugins/applauncher/AppLauncherPlugin.cpp" line="212"/>
<source>Name:</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../desktop-plugins/applauncher/AppLauncherPlugin.cpp" line="291"/>
+ <location filename="../desktop-plugins/applauncher/AppLauncherPlugin.cpp" line="298"/>
<source>New Filename</source>
<translation type="unfinished"></translation>
</message>
@@ -851,7 +851,7 @@
<name>LSession</name>
<message>
<location filename="../LSession.cpp" line="163"/>
- <location filename="../LSession.cpp" line="344"/>
+ <location filename="../LSession.cpp" line="342"/>
<source>Desktop</source>
<translation type="unfinished"></translation>
</message>
diff --git a/src-qt5/core/lumina-desktop/i18n/lumina-desktop_pl.ts b/src-qt5/core/lumina-desktop/i18n/lumina-desktop_pl.ts
index d909cda8..f9c747e9 100644
--- a/src-qt5/core/lumina-desktop/i18n/lumina-desktop_pl.ts
+++ b/src-qt5/core/lumina-desktop/i18n/lumina-desktop_pl.ts
@@ -38,62 +38,62 @@
<translation>Kliknij by ustawić</translation>
</message>
<message>
- <location filename="../desktop-plugins/applauncher/AppLauncherPlugin.cpp" line="72"/>
+ <location filename="../desktop-plugins/applauncher/AppLauncherPlugin.cpp" line="73"/>
<source>Launch %1</source>
<translation type="unfinished">Uruchom %1</translation>
</message>
<message>
- <location filename="../desktop-plugins/applauncher/AppLauncherPlugin.cpp" line="127"/>
+ <location filename="../desktop-plugins/applauncher/AppLauncherPlugin.cpp" line="134"/>
<source>Open</source>
<translation type="unfinished">Otwórz</translation>
</message>
<message>
- <location filename="../desktop-plugins/applauncher/AppLauncherPlugin.cpp" line="129"/>
+ <location filename="../desktop-plugins/applauncher/AppLauncherPlugin.cpp" line="136"/>
<source>Open With</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../desktop-plugins/applauncher/AppLauncherPlugin.cpp" line="132"/>
+ <location filename="../desktop-plugins/applauncher/AppLauncherPlugin.cpp" line="139"/>
<source>View Properties</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../desktop-plugins/applauncher/AppLauncherPlugin.cpp" line="134"/>
+ <location filename="../desktop-plugins/applauncher/AppLauncherPlugin.cpp" line="141"/>
<source>File Operations</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../desktop-plugins/applauncher/AppLauncherPlugin.cpp" line="136"/>
+ <location filename="../desktop-plugins/applauncher/AppLauncherPlugin.cpp" line="143"/>
<source>Rename</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../desktop-plugins/applauncher/AppLauncherPlugin.cpp" line="139"/>
+ <location filename="../desktop-plugins/applauncher/AppLauncherPlugin.cpp" line="146"/>
<source>Copy</source>
<translation type="unfinished">Kopiuj</translation>
</message>
<message>
- <location filename="../desktop-plugins/applauncher/AppLauncherPlugin.cpp" line="142"/>
+ <location filename="../desktop-plugins/applauncher/AppLauncherPlugin.cpp" line="149"/>
<source>Cut</source>
<translation type="unfinished">Wytnij</translation>
</message>
<message>
- <location filename="../desktop-plugins/applauncher/AppLauncherPlugin.cpp" line="144"/>
+ <location filename="../desktop-plugins/applauncher/AppLauncherPlugin.cpp" line="151"/>
<source>Delete</source>
<translation type="unfinished">Usuń</translation>
</message>
<message>
- <location filename="../desktop-plugins/applauncher/AppLauncherPlugin.cpp" line="205"/>
+ <location filename="../desktop-plugins/applauncher/AppLauncherPlugin.cpp" line="212"/>
<source>Select Application</source>
<translation>Wybierz aplikację</translation>
</message>
<message>
- <location filename="../desktop-plugins/applauncher/AppLauncherPlugin.cpp" line="205"/>
+ <location filename="../desktop-plugins/applauncher/AppLauncherPlugin.cpp" line="212"/>
<source>Name:</source>
<translation>Nazwa:</translation>
</message>
<message>
- <location filename="../desktop-plugins/applauncher/AppLauncherPlugin.cpp" line="291"/>
+ <location filename="../desktop-plugins/applauncher/AppLauncherPlugin.cpp" line="298"/>
<source>New Filename</source>
<translation type="unfinished"></translation>
</message>
@@ -851,7 +851,7 @@
<name>LSession</name>
<message>
<location filename="../LSession.cpp" line="163"/>
- <location filename="../LSession.cpp" line="344"/>
+ <location filename="../LSession.cpp" line="342"/>
<source>Desktop</source>
<translation>Pulpit</translation>
</message>
diff --git a/src-qt5/core/lumina-desktop/i18n/lumina-desktop_pt.ts b/src-qt5/core/lumina-desktop/i18n/lumina-desktop_pt.ts
index c87ec370..dfe5c837 100644
--- a/src-qt5/core/lumina-desktop/i18n/lumina-desktop_pt.ts
+++ b/src-qt5/core/lumina-desktop/i18n/lumina-desktop_pt.ts
@@ -38,62 +38,62 @@
<translation>Clique para Definir</translation>
</message>
<message>
- <location filename="../desktop-plugins/applauncher/AppLauncherPlugin.cpp" line="72"/>
+ <location filename="../desktop-plugins/applauncher/AppLauncherPlugin.cpp" line="73"/>
<source>Launch %1</source>
<translation type="unfinished">Iniciar %1</translation>
</message>
<message>
- <location filename="../desktop-plugins/applauncher/AppLauncherPlugin.cpp" line="127"/>
+ <location filename="../desktop-plugins/applauncher/AppLauncherPlugin.cpp" line="134"/>
<source>Open</source>
<translation type="unfinished">Abrir</translation>
</message>
<message>
- <location filename="../desktop-plugins/applauncher/AppLauncherPlugin.cpp" line="129"/>
+ <location filename="../desktop-plugins/applauncher/AppLauncherPlugin.cpp" line="136"/>
<source>Open With</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../desktop-plugins/applauncher/AppLauncherPlugin.cpp" line="132"/>
+ <location filename="../desktop-plugins/applauncher/AppLauncherPlugin.cpp" line="139"/>
<source>View Properties</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../desktop-plugins/applauncher/AppLauncherPlugin.cpp" line="134"/>
+ <location filename="../desktop-plugins/applauncher/AppLauncherPlugin.cpp" line="141"/>
<source>File Operations</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../desktop-plugins/applauncher/AppLauncherPlugin.cpp" line="136"/>
+ <location filename="../desktop-plugins/applauncher/AppLauncherPlugin.cpp" line="143"/>
<source>Rename</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../desktop-plugins/applauncher/AppLauncherPlugin.cpp" line="139"/>
+ <location filename="../desktop-plugins/applauncher/AppLauncherPlugin.cpp" line="146"/>
<source>Copy</source>
<translation type="unfinished">Copiar</translation>
</message>
<message>
- <location filename="../desktop-plugins/applauncher/AppLauncherPlugin.cpp" line="142"/>
+ <location filename="../desktop-plugins/applauncher/AppLauncherPlugin.cpp" line="149"/>
<source>Cut</source>
<translation type="unfinished">Cortar</translation>
</message>
<message>
- <location filename="../desktop-plugins/applauncher/AppLauncherPlugin.cpp" line="144"/>
+ <location filename="../desktop-plugins/applauncher/AppLauncherPlugin.cpp" line="151"/>
<source>Delete</source>
<translation type="unfinished">Excluir</translation>
</message>
<message>
- <location filename="../desktop-plugins/applauncher/AppLauncherPlugin.cpp" line="205"/>
+ <location filename="../desktop-plugins/applauncher/AppLauncherPlugin.cpp" line="212"/>
<source>Select Application</source>
<translation>Selecionar Aplicativo </translation>
</message>
<message>
- <location filename="../desktop-plugins/applauncher/AppLauncherPlugin.cpp" line="205"/>
+ <location filename="../desktop-plugins/applauncher/AppLauncherPlugin.cpp" line="212"/>
<source>Name:</source>
<translation>Nome:</translation>
</message>
<message>
- <location filename="../desktop-plugins/applauncher/AppLauncherPlugin.cpp" line="291"/>
+ <location filename="../desktop-plugins/applauncher/AppLauncherPlugin.cpp" line="298"/>
<source>New Filename</source>
<translation type="unfinished"></translation>
</message>
@@ -851,7 +851,7 @@
<name>LSession</name>
<message>
<location filename="../LSession.cpp" line="163"/>
- <location filename="../LSession.cpp" line="344"/>
+ <location filename="../LSession.cpp" line="342"/>
<source>Desktop</source>
<translation type="unfinished">Área de Trabalho</translation>
</message>
diff --git a/src-qt5/core/lumina-desktop/i18n/lumina-desktop_pt_BR.ts b/src-qt5/core/lumina-desktop/i18n/lumina-desktop_pt_BR.ts
index 0a238ed7..08732029 100644
--- a/src-qt5/core/lumina-desktop/i18n/lumina-desktop_pt_BR.ts
+++ b/src-qt5/core/lumina-desktop/i18n/lumina-desktop_pt_BR.ts
@@ -38,62 +38,62 @@
<translation>Clique para definir</translation>
</message>
<message>
- <location filename="../desktop-plugins/applauncher/AppLauncherPlugin.cpp" line="72"/>
+ <location filename="../desktop-plugins/applauncher/AppLauncherPlugin.cpp" line="73"/>
<source>Launch %1</source>
<translation type="unfinished">Lançar %1</translation>
</message>
<message>
- <location filename="../desktop-plugins/applauncher/AppLauncherPlugin.cpp" line="127"/>
+ <location filename="../desktop-plugins/applauncher/AppLauncherPlugin.cpp" line="134"/>
<source>Open</source>
<translation type="unfinished">Abrir</translation>
</message>
<message>
- <location filename="../desktop-plugins/applauncher/AppLauncherPlugin.cpp" line="129"/>
+ <location filename="../desktop-plugins/applauncher/AppLauncherPlugin.cpp" line="136"/>
<source>Open With</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../desktop-plugins/applauncher/AppLauncherPlugin.cpp" line="132"/>
+ <location filename="../desktop-plugins/applauncher/AppLauncherPlugin.cpp" line="139"/>
<source>View Properties</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../desktop-plugins/applauncher/AppLauncherPlugin.cpp" line="134"/>
+ <location filename="../desktop-plugins/applauncher/AppLauncherPlugin.cpp" line="141"/>
<source>File Operations</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../desktop-plugins/applauncher/AppLauncherPlugin.cpp" line="136"/>
+ <location filename="../desktop-plugins/applauncher/AppLauncherPlugin.cpp" line="143"/>
<source>Rename</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../desktop-plugins/applauncher/AppLauncherPlugin.cpp" line="139"/>
+ <location filename="../desktop-plugins/applauncher/AppLauncherPlugin.cpp" line="146"/>
<source>Copy</source>
<translation type="unfinished">Copiar</translation>
</message>
<message>
- <location filename="../desktop-plugins/applauncher/AppLauncherPlugin.cpp" line="142"/>
+ <location filename="../desktop-plugins/applauncher/AppLauncherPlugin.cpp" line="149"/>
<source>Cut</source>
<translation type="unfinished">Cortar</translation>
</message>
<message>
- <location filename="../desktop-plugins/applauncher/AppLauncherPlugin.cpp" line="144"/>
+ <location filename="../desktop-plugins/applauncher/AppLauncherPlugin.cpp" line="151"/>
<source>Delete</source>
<translation type="unfinished">Excluir</translation>
</message>
<message>
- <location filename="../desktop-plugins/applauncher/AppLauncherPlugin.cpp" line="205"/>
+ <location filename="../desktop-plugins/applauncher/AppLauncherPlugin.cpp" line="212"/>
<source>Select Application</source>
<translation>Selecionar aplicativo</translation>
</message>
<message>
- <location filename="../desktop-plugins/applauncher/AppLauncherPlugin.cpp" line="205"/>
+ <location filename="../desktop-plugins/applauncher/AppLauncherPlugin.cpp" line="212"/>
<source>Name:</source>
<translation>Nome:</translation>
</message>
<message>
- <location filename="../desktop-plugins/applauncher/AppLauncherPlugin.cpp" line="291"/>
+ <location filename="../desktop-plugins/applauncher/AppLauncherPlugin.cpp" line="298"/>
<source>New Filename</source>
<translation type="unfinished"></translation>
</message>
@@ -851,7 +851,7 @@
<name>LSession</name>
<message>
<location filename="../LSession.cpp" line="163"/>
- <location filename="../LSession.cpp" line="344"/>
+ <location filename="../LSession.cpp" line="342"/>
<source>Desktop</source>
<translation>Área de trabalho</translation>
</message>
diff --git a/src-qt5/core/lumina-desktop/i18n/lumina-desktop_ro.ts b/src-qt5/core/lumina-desktop/i18n/lumina-desktop_ro.ts
index 6a86d9f6..caeb719a 100644
--- a/src-qt5/core/lumina-desktop/i18n/lumina-desktop_ro.ts
+++ b/src-qt5/core/lumina-desktop/i18n/lumina-desktop_ro.ts
@@ -38,62 +38,62 @@
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../desktop-plugins/applauncher/AppLauncherPlugin.cpp" line="72"/>
+ <location filename="../desktop-plugins/applauncher/AppLauncherPlugin.cpp" line="73"/>
<source>Launch %1</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../desktop-plugins/applauncher/AppLauncherPlugin.cpp" line="127"/>
+ <location filename="../desktop-plugins/applauncher/AppLauncherPlugin.cpp" line="134"/>
<source>Open</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../desktop-plugins/applauncher/AppLauncherPlugin.cpp" line="129"/>
+ <location filename="../desktop-plugins/applauncher/AppLauncherPlugin.cpp" line="136"/>
<source>Open With</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../desktop-plugins/applauncher/AppLauncherPlugin.cpp" line="132"/>
+ <location filename="../desktop-plugins/applauncher/AppLauncherPlugin.cpp" line="139"/>
<source>View Properties</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../desktop-plugins/applauncher/AppLauncherPlugin.cpp" line="134"/>
+ <location filename="../desktop-plugins/applauncher/AppLauncherPlugin.cpp" line="141"/>
<source>File Operations</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../desktop-plugins/applauncher/AppLauncherPlugin.cpp" line="136"/>
+ <location filename="../desktop-plugins/applauncher/AppLauncherPlugin.cpp" line="143"/>
<source>Rename</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../desktop-plugins/applauncher/AppLauncherPlugin.cpp" line="139"/>
+ <location filename="../desktop-plugins/applauncher/AppLauncherPlugin.cpp" line="146"/>
<source>Copy</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../desktop-plugins/applauncher/AppLauncherPlugin.cpp" line="142"/>
+ <location filename="../desktop-plugins/applauncher/AppLauncherPlugin.cpp" line="149"/>
<source>Cut</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../desktop-plugins/applauncher/AppLauncherPlugin.cpp" line="144"/>
+ <location filename="../desktop-plugins/applauncher/AppLauncherPlugin.cpp" line="151"/>
<source>Delete</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../desktop-plugins/applauncher/AppLauncherPlugin.cpp" line="205"/>
+ <location filename="../desktop-plugins/applauncher/AppLauncherPlugin.cpp" line="212"/>
<source>Select Application</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../desktop-plugins/applauncher/AppLauncherPlugin.cpp" line="205"/>
+ <location filename="../desktop-plugins/applauncher/AppLauncherPlugin.cpp" line="212"/>
<source>Name:</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../desktop-plugins/applauncher/AppLauncherPlugin.cpp" line="291"/>
+ <location filename="../desktop-plugins/applauncher/AppLauncherPlugin.cpp" line="298"/>
<source>New Filename</source>
<translation type="unfinished"></translation>
</message>
@@ -851,7 +851,7 @@
<name>LSession</name>
<message>
<location filename="../LSession.cpp" line="163"/>
- <location filename="../LSession.cpp" line="344"/>
+ <location filename="../LSession.cpp" line="342"/>
<source>Desktop</source>
<translation type="unfinished"></translation>
</message>
diff --git a/src-qt5/core/lumina-desktop/i18n/lumina-desktop_ru.ts b/src-qt5/core/lumina-desktop/i18n/lumina-desktop_ru.ts
index 11bf37d6..a7a78a16 100644
--- a/src-qt5/core/lumina-desktop/i18n/lumina-desktop_ru.ts
+++ b/src-qt5/core/lumina-desktop/i18n/lumina-desktop_ru.ts
@@ -38,62 +38,62 @@
<translation>Нажмите что бы выбрать</translation>
</message>
<message>
- <location filename="../desktop-plugins/applauncher/AppLauncherPlugin.cpp" line="72"/>
+ <location filename="../desktop-plugins/applauncher/AppLauncherPlugin.cpp" line="73"/>
<source>Launch %1</source>
<translation>Запуск %1</translation>
</message>
<message>
- <location filename="../desktop-plugins/applauncher/AppLauncherPlugin.cpp" line="127"/>
+ <location filename="../desktop-plugins/applauncher/AppLauncherPlugin.cpp" line="134"/>
<source>Open</source>
<translation>Открыть</translation>
</message>
<message>
- <location filename="../desktop-plugins/applauncher/AppLauncherPlugin.cpp" line="129"/>
+ <location filename="../desktop-plugins/applauncher/AppLauncherPlugin.cpp" line="136"/>
<source>Open With</source>
<translation>Открыть с помощью</translation>
</message>
<message>
- <location filename="../desktop-plugins/applauncher/AppLauncherPlugin.cpp" line="132"/>
+ <location filename="../desktop-plugins/applauncher/AppLauncherPlugin.cpp" line="139"/>
<source>View Properties</source>
<translation>Посмотреть свойства</translation>
</message>
<message>
- <location filename="../desktop-plugins/applauncher/AppLauncherPlugin.cpp" line="134"/>
+ <location filename="../desktop-plugins/applauncher/AppLauncherPlugin.cpp" line="141"/>
<source>File Operations</source>
<translation>Операции с файлами</translation>
</message>
<message>
- <location filename="../desktop-plugins/applauncher/AppLauncherPlugin.cpp" line="136"/>
+ <location filename="../desktop-plugins/applauncher/AppLauncherPlugin.cpp" line="143"/>
<source>Rename</source>
<translation>Переименовать</translation>
</message>
<message>
- <location filename="../desktop-plugins/applauncher/AppLauncherPlugin.cpp" line="139"/>
+ <location filename="../desktop-plugins/applauncher/AppLauncherPlugin.cpp" line="146"/>
<source>Copy</source>
<translation>Копировать</translation>
</message>
<message>
- <location filename="../desktop-plugins/applauncher/AppLauncherPlugin.cpp" line="142"/>
+ <location filename="../desktop-plugins/applauncher/AppLauncherPlugin.cpp" line="149"/>
<source>Cut</source>
<translation>Вырезать</translation>
</message>
<message>
- <location filename="../desktop-plugins/applauncher/AppLauncherPlugin.cpp" line="144"/>
+ <location filename="../desktop-plugins/applauncher/AppLauncherPlugin.cpp" line="151"/>
<source>Delete</source>
<translation>Удалить</translation>
</message>
<message>
- <location filename="../desktop-plugins/applauncher/AppLauncherPlugin.cpp" line="205"/>
+ <location filename="../desktop-plugins/applauncher/AppLauncherPlugin.cpp" line="212"/>
<source>Select Application</source>
<translation>Выбрать Приложение</translation>
</message>
<message>
- <location filename="../desktop-plugins/applauncher/AppLauncherPlugin.cpp" line="205"/>
+ <location filename="../desktop-plugins/applauncher/AppLauncherPlugin.cpp" line="212"/>
<source>Name:</source>
<translation>Название:</translation>
</message>
<message>
- <location filename="../desktop-plugins/applauncher/AppLauncherPlugin.cpp" line="291"/>
+ <location filename="../desktop-plugins/applauncher/AppLauncherPlugin.cpp" line="298"/>
<source>New Filename</source>
<translation>Новое имя файла</translation>
</message>
@@ -265,12 +265,12 @@
</message>
<message>
<location filename="../BootSplash.cpp" line="65"/>
- <source>Don't expect to build up the weak by pulling down the strong.</source>
+ <source>Don&apos;t expect to build up the weak by pulling down the strong.</source>
<translation>Не ждите, чтобы создать слабое, потянув вниз сильное.</translation>
</message>
<message>
<location filename="../BootSplash.cpp" line="67"/>
- <source>You can't know too much, but you can say too much.</source>
+ <source>You can&apos;t know too much, but you can say too much.</source>
<translation>Вы не можете знать слишком много, но вы можете сказать слишком много.</translation>
</message>
<message>
@@ -350,7 +350,7 @@
</message>
<message>
<location filename="../BootSplash.cpp" line="99"/>
- <source>Only two things are infinite, the universe and human stupidity, and I'm not sure about the former.</source>
+ <source>Only two things are infinite, the universe and human stupidity, and I&apos;m not sure about the former.</source>
<translation>Только две вещи бесконечны, вселенная и человеческая глупость.</translation>
</message>
<message>
@@ -360,7 +360,7 @@
</message>
<message>
<location filename="../BootSplash.cpp" line="103"/>
- <source>Do, or do not. There is no 'try'.</source>
+ <source>Do, or do not. There is no &apos;try&apos;.</source>
<translation>Делай, или не делай. Не пробуй.</translation>
</message>
<message>
@@ -380,7 +380,7 @@
</message>
<message>
<location filename="../BootSplash.cpp" line="111"/>
- <source>It's kind of fun to do the impossible.</source>
+ <source>It&apos;s kind of fun to do the impossible.</source>
<translation>Это своего рода забава - сделать невозможное.</translation>
</message>
<message>
@@ -851,7 +851,7 @@
<name>LSession</name>
<message>
<location filename="../LSession.cpp" line="163"/>
- <location filename="../LSession.cpp" line="344"/>
+ <location filename="../LSession.cpp" line="342"/>
<source>Desktop</source>
<translation>Рабочий стол</translation>
</message>
diff --git a/src-qt5/core/lumina-desktop/i18n/lumina-desktop_sk.ts b/src-qt5/core/lumina-desktop/i18n/lumina-desktop_sk.ts
index 234c5e0b..c9bfecb1 100644
--- a/src-qt5/core/lumina-desktop/i18n/lumina-desktop_sk.ts
+++ b/src-qt5/core/lumina-desktop/i18n/lumina-desktop_sk.ts
@@ -38,62 +38,62 @@
<translation>Kliknutím nastaviť </translation>
</message>
<message>
- <location filename="../desktop-plugins/applauncher/AppLauncherPlugin.cpp" line="72"/>
+ <location filename="../desktop-plugins/applauncher/AppLauncherPlugin.cpp" line="73"/>
<source>Launch %1</source>
<translation type="unfinished">Spustiť %1</translation>
</message>
<message>
- <location filename="../desktop-plugins/applauncher/AppLauncherPlugin.cpp" line="127"/>
+ <location filename="../desktop-plugins/applauncher/AppLauncherPlugin.cpp" line="134"/>
<source>Open</source>
<translation type="unfinished">Otvoriť</translation>
</message>
<message>
- <location filename="../desktop-plugins/applauncher/AppLauncherPlugin.cpp" line="129"/>
+ <location filename="../desktop-plugins/applauncher/AppLauncherPlugin.cpp" line="136"/>
<source>Open With</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../desktop-plugins/applauncher/AppLauncherPlugin.cpp" line="132"/>
+ <location filename="../desktop-plugins/applauncher/AppLauncherPlugin.cpp" line="139"/>
<source>View Properties</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../desktop-plugins/applauncher/AppLauncherPlugin.cpp" line="134"/>
+ <location filename="../desktop-plugins/applauncher/AppLauncherPlugin.cpp" line="141"/>
<source>File Operations</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../desktop-plugins/applauncher/AppLauncherPlugin.cpp" line="136"/>
+ <location filename="../desktop-plugins/applauncher/AppLauncherPlugin.cpp" line="143"/>
<source>Rename</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../desktop-plugins/applauncher/AppLauncherPlugin.cpp" line="139"/>
+ <location filename="../desktop-plugins/applauncher/AppLauncherPlugin.cpp" line="146"/>
<source>Copy</source>
<translation type="unfinished">Kopírovať</translation>
</message>
<message>
- <location filename="../desktop-plugins/applauncher/AppLauncherPlugin.cpp" line="142"/>
+ <location filename="../desktop-plugins/applauncher/AppLauncherPlugin.cpp" line="149"/>
<source>Cut</source>
<translation type="unfinished">Vystrihnúť</translation>
</message>
<message>
- <location filename="../desktop-plugins/applauncher/AppLauncherPlugin.cpp" line="144"/>
+ <location filename="../desktop-plugins/applauncher/AppLauncherPlugin.cpp" line="151"/>
<source>Delete</source>
<translation type="unfinished">Vymazať</translation>
</message>
<message>
- <location filename="../desktop-plugins/applauncher/AppLauncherPlugin.cpp" line="205"/>
+ <location filename="../desktop-plugins/applauncher/AppLauncherPlugin.cpp" line="212"/>
<source>Select Application</source>
<translation>Výber aplikácie</translation>
</message>
<message>
- <location filename="../desktop-plugins/applauncher/AppLauncherPlugin.cpp" line="205"/>
+ <location filename="../desktop-plugins/applauncher/AppLauncherPlugin.cpp" line="212"/>
<source>Name:</source>
<translation>Meno:</translation>
</message>
<message>
- <location filename="../desktop-plugins/applauncher/AppLauncherPlugin.cpp" line="291"/>
+ <location filename="../desktop-plugins/applauncher/AppLauncherPlugin.cpp" line="298"/>
<source>New Filename</source>
<translation type="unfinished"></translation>
</message>
@@ -851,7 +851,7 @@
<name>LSession</name>
<message>
<location filename="../LSession.cpp" line="163"/>
- <location filename="../LSession.cpp" line="344"/>
+ <location filename="../LSession.cpp" line="342"/>
<source>Desktop</source>
<translation type="unfinished">Pracovná plocha</translation>
</message>
diff --git a/src-qt5/core/lumina-desktop/i18n/lumina-desktop_sl.ts b/src-qt5/core/lumina-desktop/i18n/lumina-desktop_sl.ts
index 1773c5ae..5a4ab343 100644
--- a/src-qt5/core/lumina-desktop/i18n/lumina-desktop_sl.ts
+++ b/src-qt5/core/lumina-desktop/i18n/lumina-desktop_sl.ts
@@ -38,62 +38,62 @@
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../desktop-plugins/applauncher/AppLauncherPlugin.cpp" line="72"/>
+ <location filename="../desktop-plugins/applauncher/AppLauncherPlugin.cpp" line="73"/>
<source>Launch %1</source>
<translation type="unfinished">Zaženi %1</translation>
</message>
<message>
- <location filename="../desktop-plugins/applauncher/AppLauncherPlugin.cpp" line="127"/>
+ <location filename="../desktop-plugins/applauncher/AppLauncherPlugin.cpp" line="134"/>
<source>Open</source>
<translation type="unfinished">Odpri</translation>
</message>
<message>
- <location filename="../desktop-plugins/applauncher/AppLauncherPlugin.cpp" line="129"/>
+ <location filename="../desktop-plugins/applauncher/AppLauncherPlugin.cpp" line="136"/>
<source>Open With</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../desktop-plugins/applauncher/AppLauncherPlugin.cpp" line="132"/>
+ <location filename="../desktop-plugins/applauncher/AppLauncherPlugin.cpp" line="139"/>
<source>View Properties</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../desktop-plugins/applauncher/AppLauncherPlugin.cpp" line="134"/>
+ <location filename="../desktop-plugins/applauncher/AppLauncherPlugin.cpp" line="141"/>
<source>File Operations</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../desktop-plugins/applauncher/AppLauncherPlugin.cpp" line="136"/>
+ <location filename="../desktop-plugins/applauncher/AppLauncherPlugin.cpp" line="143"/>
<source>Rename</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../desktop-plugins/applauncher/AppLauncherPlugin.cpp" line="139"/>
+ <location filename="../desktop-plugins/applauncher/AppLauncherPlugin.cpp" line="146"/>
<source>Copy</source>
<translation type="unfinished">Kopiraj</translation>
</message>
<message>
- <location filename="../desktop-plugins/applauncher/AppLauncherPlugin.cpp" line="142"/>
+ <location filename="../desktop-plugins/applauncher/AppLauncherPlugin.cpp" line="149"/>
<source>Cut</source>
<translation type="unfinished">Izreži</translation>
</message>
<message>
- <location filename="../desktop-plugins/applauncher/AppLauncherPlugin.cpp" line="144"/>
+ <location filename="../desktop-plugins/applauncher/AppLauncherPlugin.cpp" line="151"/>
<source>Delete</source>
<translation type="unfinished">Izbriši</translation>
</message>
<message>
- <location filename="../desktop-plugins/applauncher/AppLauncherPlugin.cpp" line="205"/>
+ <location filename="../desktop-plugins/applauncher/AppLauncherPlugin.cpp" line="212"/>
<source>Select Application</source>
<translation>Izberi program</translation>
</message>
<message>
- <location filename="../desktop-plugins/applauncher/AppLauncherPlugin.cpp" line="205"/>
+ <location filename="../desktop-plugins/applauncher/AppLauncherPlugin.cpp" line="212"/>
<source>Name:</source>
<translation>Ime:</translation>
</message>
<message>
- <location filename="../desktop-plugins/applauncher/AppLauncherPlugin.cpp" line="291"/>
+ <location filename="../desktop-plugins/applauncher/AppLauncherPlugin.cpp" line="298"/>
<source>New Filename</source>
<translation type="unfinished"></translation>
</message>
@@ -851,7 +851,7 @@
<name>LSession</name>
<message>
<location filename="../LSession.cpp" line="163"/>
- <location filename="../LSession.cpp" line="344"/>
+ <location filename="../LSession.cpp" line="342"/>
<source>Desktop</source>
<translation type="unfinished"></translation>
</message>
diff --git a/src-qt5/core/lumina-desktop/i18n/lumina-desktop_sr.ts b/src-qt5/core/lumina-desktop/i18n/lumina-desktop_sr.ts
index 6a86d9f6..caeb719a 100644
--- a/src-qt5/core/lumina-desktop/i18n/lumina-desktop_sr.ts
+++ b/src-qt5/core/lumina-desktop/i18n/lumina-desktop_sr.ts
@@ -38,62 +38,62 @@
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../desktop-plugins/applauncher/AppLauncherPlugin.cpp" line="72"/>
+ <location filename="../desktop-plugins/applauncher/AppLauncherPlugin.cpp" line="73"/>
<source>Launch %1</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../desktop-plugins/applauncher/AppLauncherPlugin.cpp" line="127"/>
+ <location filename="../desktop-plugins/applauncher/AppLauncherPlugin.cpp" line="134"/>
<source>Open</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../desktop-plugins/applauncher/AppLauncherPlugin.cpp" line="129"/>
+ <location filename="../desktop-plugins/applauncher/AppLauncherPlugin.cpp" line="136"/>
<source>Open With</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../desktop-plugins/applauncher/AppLauncherPlugin.cpp" line="132"/>
+ <location filename="../desktop-plugins/applauncher/AppLauncherPlugin.cpp" line="139"/>
<source>View Properties</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../desktop-plugins/applauncher/AppLauncherPlugin.cpp" line="134"/>
+ <location filename="../desktop-plugins/applauncher/AppLauncherPlugin.cpp" line="141"/>
<source>File Operations</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../desktop-plugins/applauncher/AppLauncherPlugin.cpp" line="136"/>
+ <location filename="../desktop-plugins/applauncher/AppLauncherPlugin.cpp" line="143"/>
<source>Rename</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../desktop-plugins/applauncher/AppLauncherPlugin.cpp" line="139"/>
+ <location filename="../desktop-plugins/applauncher/AppLauncherPlugin.cpp" line="146"/>
<source>Copy</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../desktop-plugins/applauncher/AppLauncherPlugin.cpp" line="142"/>
+ <location filename="../desktop-plugins/applauncher/AppLauncherPlugin.cpp" line="149"/>
<source>Cut</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../desktop-plugins/applauncher/AppLauncherPlugin.cpp" line="144"/>
+ <location filename="../desktop-plugins/applauncher/AppLauncherPlugin.cpp" line="151"/>
<source>Delete</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../desktop-plugins/applauncher/AppLauncherPlugin.cpp" line="205"/>
+ <location filename="../desktop-plugins/applauncher/AppLauncherPlugin.cpp" line="212"/>
<source>Select Application</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../desktop-plugins/applauncher/AppLauncherPlugin.cpp" line="205"/>
+ <location filename="../desktop-plugins/applauncher/AppLauncherPlugin.cpp" line="212"/>
<source>Name:</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../desktop-plugins/applauncher/AppLauncherPlugin.cpp" line="291"/>
+ <location filename="../desktop-plugins/applauncher/AppLauncherPlugin.cpp" line="298"/>
<source>New Filename</source>
<translation type="unfinished"></translation>
</message>
@@ -851,7 +851,7 @@
<name>LSession</name>
<message>
<location filename="../LSession.cpp" line="163"/>
- <location filename="../LSession.cpp" line="344"/>
+ <location filename="../LSession.cpp" line="342"/>
<source>Desktop</source>
<translation type="unfinished"></translation>
</message>
diff --git a/src-qt5/core/lumina-desktop/i18n/lumina-desktop_sv.ts b/src-qt5/core/lumina-desktop/i18n/lumina-desktop_sv.ts
index 673a2732..9a5870cd 100644
--- a/src-qt5/core/lumina-desktop/i18n/lumina-desktop_sv.ts
+++ b/src-qt5/core/lumina-desktop/i18n/lumina-desktop_sv.ts
@@ -38,62 +38,62 @@
<translation>Klicka för att tilldela</translation>
</message>
<message>
- <location filename="../desktop-plugins/applauncher/AppLauncherPlugin.cpp" line="72"/>
+ <location filename="../desktop-plugins/applauncher/AppLauncherPlugin.cpp" line="73"/>
<source>Launch %1</source>
<translation type="unfinished">Starta %1</translation>
</message>
<message>
- <location filename="../desktop-plugins/applauncher/AppLauncherPlugin.cpp" line="127"/>
+ <location filename="../desktop-plugins/applauncher/AppLauncherPlugin.cpp" line="134"/>
<source>Open</source>
<translation type="unfinished">Öppna</translation>
</message>
<message>
- <location filename="../desktop-plugins/applauncher/AppLauncherPlugin.cpp" line="129"/>
+ <location filename="../desktop-plugins/applauncher/AppLauncherPlugin.cpp" line="136"/>
<source>Open With</source>
<translation>Öppna med</translation>
</message>
<message>
- <location filename="../desktop-plugins/applauncher/AppLauncherPlugin.cpp" line="132"/>
+ <location filename="../desktop-plugins/applauncher/AppLauncherPlugin.cpp" line="139"/>
<source>View Properties</source>
<translation>Visa egenskaper</translation>
</message>
<message>
- <location filename="../desktop-plugins/applauncher/AppLauncherPlugin.cpp" line="134"/>
+ <location filename="../desktop-plugins/applauncher/AppLauncherPlugin.cpp" line="141"/>
<source>File Operations</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../desktop-plugins/applauncher/AppLauncherPlugin.cpp" line="136"/>
+ <location filename="../desktop-plugins/applauncher/AppLauncherPlugin.cpp" line="143"/>
<source>Rename</source>
<translation>Döp om</translation>
</message>
<message>
- <location filename="../desktop-plugins/applauncher/AppLauncherPlugin.cpp" line="139"/>
+ <location filename="../desktop-plugins/applauncher/AppLauncherPlugin.cpp" line="146"/>
<source>Copy</source>
<translation type="unfinished">Kopiera</translation>
</message>
<message>
- <location filename="../desktop-plugins/applauncher/AppLauncherPlugin.cpp" line="142"/>
+ <location filename="../desktop-plugins/applauncher/AppLauncherPlugin.cpp" line="149"/>
<source>Cut</source>
<translation type="unfinished">Klipp ut</translation>
</message>
<message>
- <location filename="../desktop-plugins/applauncher/AppLauncherPlugin.cpp" line="144"/>
+ <location filename="../desktop-plugins/applauncher/AppLauncherPlugin.cpp" line="151"/>
<source>Delete</source>
<translation type="unfinished">Ta bort</translation>
</message>
<message>
- <location filename="../desktop-plugins/applauncher/AppLauncherPlugin.cpp" line="205"/>
+ <location filename="../desktop-plugins/applauncher/AppLauncherPlugin.cpp" line="212"/>
<source>Select Application</source>
<translation>Välj program</translation>
</message>
<message>
- <location filename="../desktop-plugins/applauncher/AppLauncherPlugin.cpp" line="205"/>
+ <location filename="../desktop-plugins/applauncher/AppLauncherPlugin.cpp" line="212"/>
<source>Name:</source>
<translation>Namn:</translation>
</message>
<message>
- <location filename="../desktop-plugins/applauncher/AppLauncherPlugin.cpp" line="291"/>
+ <location filename="../desktop-plugins/applauncher/AppLauncherPlugin.cpp" line="298"/>
<source>New Filename</source>
<translation>Nytt filnamn</translation>
</message>
@@ -851,7 +851,7 @@
<name>LSession</name>
<message>
<location filename="../LSession.cpp" line="163"/>
- <location filename="../LSession.cpp" line="344"/>
+ <location filename="../LSession.cpp" line="342"/>
<source>Desktop</source>
<translation>Skrivbord</translation>
</message>
diff --git a/src-qt5/core/lumina-desktop/i18n/lumina-desktop_sw.ts b/src-qt5/core/lumina-desktop/i18n/lumina-desktop_sw.ts
index 6a86d9f6..caeb719a 100644
--- a/src-qt5/core/lumina-desktop/i18n/lumina-desktop_sw.ts
+++ b/src-qt5/core/lumina-desktop/i18n/lumina-desktop_sw.ts
@@ -38,62 +38,62 @@
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../desktop-plugins/applauncher/AppLauncherPlugin.cpp" line="72"/>
+ <location filename="../desktop-plugins/applauncher/AppLauncherPlugin.cpp" line="73"/>
<source>Launch %1</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../desktop-plugins/applauncher/AppLauncherPlugin.cpp" line="127"/>
+ <location filename="../desktop-plugins/applauncher/AppLauncherPlugin.cpp" line="134"/>
<source>Open</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../desktop-plugins/applauncher/AppLauncherPlugin.cpp" line="129"/>
+ <location filename="../desktop-plugins/applauncher/AppLauncherPlugin.cpp" line="136"/>
<source>Open With</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../desktop-plugins/applauncher/AppLauncherPlugin.cpp" line="132"/>
+ <location filename="../desktop-plugins/applauncher/AppLauncherPlugin.cpp" line="139"/>
<source>View Properties</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../desktop-plugins/applauncher/AppLauncherPlugin.cpp" line="134"/>
+ <location filename="../desktop-plugins/applauncher/AppLauncherPlugin.cpp" line="141"/>
<source>File Operations</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../desktop-plugins/applauncher/AppLauncherPlugin.cpp" line="136"/>
+ <location filename="../desktop-plugins/applauncher/AppLauncherPlugin.cpp" line="143"/>
<source>Rename</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../desktop-plugins/applauncher/AppLauncherPlugin.cpp" line="139"/>
+ <location filename="../desktop-plugins/applauncher/AppLauncherPlugin.cpp" line="146"/>
<source>Copy</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../desktop-plugins/applauncher/AppLauncherPlugin.cpp" line="142"/>
+ <location filename="../desktop-plugins/applauncher/AppLauncherPlugin.cpp" line="149"/>
<source>Cut</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../desktop-plugins/applauncher/AppLauncherPlugin.cpp" line="144"/>
+ <location filename="../desktop-plugins/applauncher/AppLauncherPlugin.cpp" line="151"/>
<source>Delete</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../desktop-plugins/applauncher/AppLauncherPlugin.cpp" line="205"/>
+ <location filename="../desktop-plugins/applauncher/AppLauncherPlugin.cpp" line="212"/>
<source>Select Application</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../desktop-plugins/applauncher/AppLauncherPlugin.cpp" line="205"/>
+ <location filename="../desktop-plugins/applauncher/AppLauncherPlugin.cpp" line="212"/>
<source>Name:</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../desktop-plugins/applauncher/AppLauncherPlugin.cpp" line="291"/>
+ <location filename="../desktop-plugins/applauncher/AppLauncherPlugin.cpp" line="298"/>
<source>New Filename</source>
<translation type="unfinished"></translation>
</message>
@@ -851,7 +851,7 @@
<name>LSession</name>
<message>
<location filename="../LSession.cpp" line="163"/>
- <location filename="../LSession.cpp" line="344"/>
+ <location filename="../LSession.cpp" line="342"/>
<source>Desktop</source>
<translation type="unfinished"></translation>
</message>
diff --git a/src-qt5/core/lumina-desktop/i18n/lumina-desktop_ta.ts b/src-qt5/core/lumina-desktop/i18n/lumina-desktop_ta.ts
index 6a86d9f6..caeb719a 100644
--- a/src-qt5/core/lumina-desktop/i18n/lumina-desktop_ta.ts
+++ b/src-qt5/core/lumina-desktop/i18n/lumina-desktop_ta.ts
@@ -38,62 +38,62 @@
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../desktop-plugins/applauncher/AppLauncherPlugin.cpp" line="72"/>
+ <location filename="../desktop-plugins/applauncher/AppLauncherPlugin.cpp" line="73"/>
<source>Launch %1</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../desktop-plugins/applauncher/AppLauncherPlugin.cpp" line="127"/>
+ <location filename="../desktop-plugins/applauncher/AppLauncherPlugin.cpp" line="134"/>
<source>Open</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../desktop-plugins/applauncher/AppLauncherPlugin.cpp" line="129"/>
+ <location filename="../desktop-plugins/applauncher/AppLauncherPlugin.cpp" line="136"/>
<source>Open With</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../desktop-plugins/applauncher/AppLauncherPlugin.cpp" line="132"/>
+ <location filename="../desktop-plugins/applauncher/AppLauncherPlugin.cpp" line="139"/>
<source>View Properties</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../desktop-plugins/applauncher/AppLauncherPlugin.cpp" line="134"/>
+ <location filename="../desktop-plugins/applauncher/AppLauncherPlugin.cpp" line="141"/>
<source>File Operations</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../desktop-plugins/applauncher/AppLauncherPlugin.cpp" line="136"/>
+ <location filename="../desktop-plugins/applauncher/AppLauncherPlugin.cpp" line="143"/>
<source>Rename</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../desktop-plugins/applauncher/AppLauncherPlugin.cpp" line="139"/>
+ <location filename="../desktop-plugins/applauncher/AppLauncherPlugin.cpp" line="146"/>
<source>Copy</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../desktop-plugins/applauncher/AppLauncherPlugin.cpp" line="142"/>
+ <location filename="../desktop-plugins/applauncher/AppLauncherPlugin.cpp" line="149"/>
<source>Cut</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../desktop-plugins/applauncher/AppLauncherPlugin.cpp" line="144"/>
+ <location filename="../desktop-plugins/applauncher/AppLauncherPlugin.cpp" line="151"/>
<source>Delete</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../desktop-plugins/applauncher/AppLauncherPlugin.cpp" line="205"/>
+ <location filename="../desktop-plugins/applauncher/AppLauncherPlugin.cpp" line="212"/>
<source>Select Application</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../desktop-plugins/applauncher/AppLauncherPlugin.cpp" line="205"/>
+ <location filename="../desktop-plugins/applauncher/AppLauncherPlugin.cpp" line="212"/>
<source>Name:</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../desktop-plugins/applauncher/AppLauncherPlugin.cpp" line="291"/>
+ <location filename="../desktop-plugins/applauncher/AppLauncherPlugin.cpp" line="298"/>
<source>New Filename</source>
<translation type="unfinished"></translation>
</message>
@@ -851,7 +851,7 @@
<name>LSession</name>
<message>
<location filename="../LSession.cpp" line="163"/>
- <location filename="../LSession.cpp" line="344"/>
+ <location filename="../LSession.cpp" line="342"/>
<source>Desktop</source>
<translation type="unfinished"></translation>
</message>
diff --git a/src-qt5/core/lumina-desktop/i18n/lumina-desktop_tg.ts b/src-qt5/core/lumina-desktop/i18n/lumina-desktop_tg.ts
index 6a86d9f6..caeb719a 100644
--- a/src-qt5/core/lumina-desktop/i18n/lumina-desktop_tg.ts
+++ b/src-qt5/core/lumina-desktop/i18n/lumina-desktop_tg.ts
@@ -38,62 +38,62 @@
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../desktop-plugins/applauncher/AppLauncherPlugin.cpp" line="72"/>
+ <location filename="../desktop-plugins/applauncher/AppLauncherPlugin.cpp" line="73"/>
<source>Launch %1</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../desktop-plugins/applauncher/AppLauncherPlugin.cpp" line="127"/>
+ <location filename="../desktop-plugins/applauncher/AppLauncherPlugin.cpp" line="134"/>
<source>Open</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../desktop-plugins/applauncher/AppLauncherPlugin.cpp" line="129"/>
+ <location filename="../desktop-plugins/applauncher/AppLauncherPlugin.cpp" line="136"/>
<source>Open With</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../desktop-plugins/applauncher/AppLauncherPlugin.cpp" line="132"/>
+ <location filename="../desktop-plugins/applauncher/AppLauncherPlugin.cpp" line="139"/>
<source>View Properties</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../desktop-plugins/applauncher/AppLauncherPlugin.cpp" line="134"/>
+ <location filename="../desktop-plugins/applauncher/AppLauncherPlugin.cpp" line="141"/>
<source>File Operations</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../desktop-plugins/applauncher/AppLauncherPlugin.cpp" line="136"/>
+ <location filename="../desktop-plugins/applauncher/AppLauncherPlugin.cpp" line="143"/>
<source>Rename</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../desktop-plugins/applauncher/AppLauncherPlugin.cpp" line="139"/>
+ <location filename="../desktop-plugins/applauncher/AppLauncherPlugin.cpp" line="146"/>
<source>Copy</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../desktop-plugins/applauncher/AppLauncherPlugin.cpp" line="142"/>
+ <location filename="../desktop-plugins/applauncher/AppLauncherPlugin.cpp" line="149"/>
<source>Cut</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../desktop-plugins/applauncher/AppLauncherPlugin.cpp" line="144"/>
+ <location filename="../desktop-plugins/applauncher/AppLauncherPlugin.cpp" line="151"/>
<source>Delete</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../desktop-plugins/applauncher/AppLauncherPlugin.cpp" line="205"/>
+ <location filename="../desktop-plugins/applauncher/AppLauncherPlugin.cpp" line="212"/>
<source>Select Application</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../desktop-plugins/applauncher/AppLauncherPlugin.cpp" line="205"/>
+ <location filename="../desktop-plugins/applauncher/AppLauncherPlugin.cpp" line="212"/>
<source>Name:</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../desktop-plugins/applauncher/AppLauncherPlugin.cpp" line="291"/>
+ <location filename="../desktop-plugins/applauncher/AppLauncherPlugin.cpp" line="298"/>
<source>New Filename</source>
<translation type="unfinished"></translation>
</message>
@@ -851,7 +851,7 @@
<name>LSession</name>
<message>
<location filename="../LSession.cpp" line="163"/>
- <location filename="../LSession.cpp" line="344"/>
+ <location filename="../LSession.cpp" line="342"/>
<source>Desktop</source>
<translation type="unfinished"></translation>
</message>
diff --git a/src-qt5/core/lumina-desktop/i18n/lumina-desktop_th.ts b/src-qt5/core/lumina-desktop/i18n/lumina-desktop_th.ts
index 6a86d9f6..caeb719a 100644
--- a/src-qt5/core/lumina-desktop/i18n/lumina-desktop_th.ts
+++ b/src-qt5/core/lumina-desktop/i18n/lumina-desktop_th.ts
@@ -38,62 +38,62 @@
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../desktop-plugins/applauncher/AppLauncherPlugin.cpp" line="72"/>
+ <location filename="../desktop-plugins/applauncher/AppLauncherPlugin.cpp" line="73"/>
<source>Launch %1</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../desktop-plugins/applauncher/AppLauncherPlugin.cpp" line="127"/>
+ <location filename="../desktop-plugins/applauncher/AppLauncherPlugin.cpp" line="134"/>
<source>Open</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../desktop-plugins/applauncher/AppLauncherPlugin.cpp" line="129"/>
+ <location filename="../desktop-plugins/applauncher/AppLauncherPlugin.cpp" line="136"/>
<source>Open With</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../desktop-plugins/applauncher/AppLauncherPlugin.cpp" line="132"/>
+ <location filename="../desktop-plugins/applauncher/AppLauncherPlugin.cpp" line="139"/>
<source>View Properties</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../desktop-plugins/applauncher/AppLauncherPlugin.cpp" line="134"/>
+ <location filename="../desktop-plugins/applauncher/AppLauncherPlugin.cpp" line="141"/>
<source>File Operations</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../desktop-plugins/applauncher/AppLauncherPlugin.cpp" line="136"/>
+ <location filename="../desktop-plugins/applauncher/AppLauncherPlugin.cpp" line="143"/>
<source>Rename</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../desktop-plugins/applauncher/AppLauncherPlugin.cpp" line="139"/>
+ <location filename="../desktop-plugins/applauncher/AppLauncherPlugin.cpp" line="146"/>
<source>Copy</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../desktop-plugins/applauncher/AppLauncherPlugin.cpp" line="142"/>
+ <location filename="../desktop-plugins/applauncher/AppLauncherPlugin.cpp" line="149"/>
<source>Cut</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../desktop-plugins/applauncher/AppLauncherPlugin.cpp" line="144"/>
+ <location filename="../desktop-plugins/applauncher/AppLauncherPlugin.cpp" line="151"/>
<source>Delete</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../desktop-plugins/applauncher/AppLauncherPlugin.cpp" line="205"/>
+ <location filename="../desktop-plugins/applauncher/AppLauncherPlugin.cpp" line="212"/>
<source>Select Application</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../desktop-plugins/applauncher/AppLauncherPlugin.cpp" line="205"/>
+ <location filename="../desktop-plugins/applauncher/AppLauncherPlugin.cpp" line="212"/>
<source>Name:</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../desktop-plugins/applauncher/AppLauncherPlugin.cpp" line="291"/>
+ <location filename="../desktop-plugins/applauncher/AppLauncherPlugin.cpp" line="298"/>
<source>New Filename</source>
<translation type="unfinished"></translation>
</message>
@@ -851,7 +851,7 @@
<name>LSession</name>
<message>
<location filename="../LSession.cpp" line="163"/>
- <location filename="../LSession.cpp" line="344"/>
+ <location filename="../LSession.cpp" line="342"/>
<source>Desktop</source>
<translation type="unfinished"></translation>
</message>
diff --git a/src-qt5/core/lumina-desktop/i18n/lumina-desktop_tr.ts b/src-qt5/core/lumina-desktop/i18n/lumina-desktop_tr.ts
index e04cdaac..02e7e914 100644
--- a/src-qt5/core/lumina-desktop/i18n/lumina-desktop_tr.ts
+++ b/src-qt5/core/lumina-desktop/i18n/lumina-desktop_tr.ts
@@ -38,62 +38,62 @@
<translation>Ayarlamak için Tıkla</translation>
</message>
<message>
- <location filename="../desktop-plugins/applauncher/AppLauncherPlugin.cpp" line="72"/>
+ <location filename="../desktop-plugins/applauncher/AppLauncherPlugin.cpp" line="73"/>
<source>Launch %1</source>
<translation type="unfinished">%1 öğesini başlat</translation>
</message>
<message>
- <location filename="../desktop-plugins/applauncher/AppLauncherPlugin.cpp" line="127"/>
+ <location filename="../desktop-plugins/applauncher/AppLauncherPlugin.cpp" line="134"/>
<source>Open</source>
<translation type="unfinished">Aç</translation>
</message>
<message>
- <location filename="../desktop-plugins/applauncher/AppLauncherPlugin.cpp" line="129"/>
+ <location filename="../desktop-plugins/applauncher/AppLauncherPlugin.cpp" line="136"/>
<source>Open With</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../desktop-plugins/applauncher/AppLauncherPlugin.cpp" line="132"/>
+ <location filename="../desktop-plugins/applauncher/AppLauncherPlugin.cpp" line="139"/>
<source>View Properties</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../desktop-plugins/applauncher/AppLauncherPlugin.cpp" line="134"/>
+ <location filename="../desktop-plugins/applauncher/AppLauncherPlugin.cpp" line="141"/>
<source>File Operations</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../desktop-plugins/applauncher/AppLauncherPlugin.cpp" line="136"/>
+ <location filename="../desktop-plugins/applauncher/AppLauncherPlugin.cpp" line="143"/>
<source>Rename</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../desktop-plugins/applauncher/AppLauncherPlugin.cpp" line="139"/>
+ <location filename="../desktop-plugins/applauncher/AppLauncherPlugin.cpp" line="146"/>
<source>Copy</source>
<translation type="unfinished">Kopyala</translation>
</message>
<message>
- <location filename="../desktop-plugins/applauncher/AppLauncherPlugin.cpp" line="142"/>
+ <location filename="../desktop-plugins/applauncher/AppLauncherPlugin.cpp" line="149"/>
<source>Cut</source>
<translation type="unfinished">Kes</translation>
</message>
<message>
- <location filename="../desktop-plugins/applauncher/AppLauncherPlugin.cpp" line="144"/>
+ <location filename="../desktop-plugins/applauncher/AppLauncherPlugin.cpp" line="151"/>
<source>Delete</source>
<translation type="unfinished">Sil</translation>
</message>
<message>
- <location filename="../desktop-plugins/applauncher/AppLauncherPlugin.cpp" line="205"/>
+ <location filename="../desktop-plugins/applauncher/AppLauncherPlugin.cpp" line="212"/>
<source>Select Application</source>
<translation>Uygulama Seç</translation>
</message>
<message>
- <location filename="../desktop-plugins/applauncher/AppLauncherPlugin.cpp" line="205"/>
+ <location filename="../desktop-plugins/applauncher/AppLauncherPlugin.cpp" line="212"/>
<source>Name:</source>
<translation>Ad:</translation>
</message>
<message>
- <location filename="../desktop-plugins/applauncher/AppLauncherPlugin.cpp" line="291"/>
+ <location filename="../desktop-plugins/applauncher/AppLauncherPlugin.cpp" line="298"/>
<source>New Filename</source>
<translation type="unfinished"></translation>
</message>
@@ -851,7 +851,7 @@
<name>LSession</name>
<message>
<location filename="../LSession.cpp" line="163"/>
- <location filename="../LSession.cpp" line="344"/>
+ <location filename="../LSession.cpp" line="342"/>
<source>Desktop</source>
<translation>Masaüstü</translation>
</message>
diff --git a/src-qt5/core/lumina-desktop/i18n/lumina-desktop_uk.ts b/src-qt5/core/lumina-desktop/i18n/lumina-desktop_uk.ts
index eab60624..eef5d753 100644
--- a/src-qt5/core/lumina-desktop/i18n/lumina-desktop_uk.ts
+++ b/src-qt5/core/lumina-desktop/i18n/lumina-desktop_uk.ts
@@ -38,62 +38,62 @@
<translation>Натисніть щоб встановити</translation>
</message>
<message>
- <location filename="../desktop-plugins/applauncher/AppLauncherPlugin.cpp" line="72"/>
+ <location filename="../desktop-plugins/applauncher/AppLauncherPlugin.cpp" line="73"/>
<source>Launch %1</source>
<translation type="unfinished">Запуск %1</translation>
</message>
<message>
- <location filename="../desktop-plugins/applauncher/AppLauncherPlugin.cpp" line="127"/>
+ <location filename="../desktop-plugins/applauncher/AppLauncherPlugin.cpp" line="134"/>
<source>Open</source>
<translation type="unfinished">Відкрити</translation>
</message>
<message>
- <location filename="../desktop-plugins/applauncher/AppLauncherPlugin.cpp" line="129"/>
+ <location filename="../desktop-plugins/applauncher/AppLauncherPlugin.cpp" line="136"/>
<source>Open With</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../desktop-plugins/applauncher/AppLauncherPlugin.cpp" line="132"/>
+ <location filename="../desktop-plugins/applauncher/AppLauncherPlugin.cpp" line="139"/>
<source>View Properties</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../desktop-plugins/applauncher/AppLauncherPlugin.cpp" line="134"/>
+ <location filename="../desktop-plugins/applauncher/AppLauncherPlugin.cpp" line="141"/>
<source>File Operations</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../desktop-plugins/applauncher/AppLauncherPlugin.cpp" line="136"/>
+ <location filename="../desktop-plugins/applauncher/AppLauncherPlugin.cpp" line="143"/>
<source>Rename</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../desktop-plugins/applauncher/AppLauncherPlugin.cpp" line="139"/>
+ <location filename="../desktop-plugins/applauncher/AppLauncherPlugin.cpp" line="146"/>
<source>Copy</source>
<translation type="unfinished">Копіювати</translation>
</message>
<message>
- <location filename="../desktop-plugins/applauncher/AppLauncherPlugin.cpp" line="142"/>
+ <location filename="../desktop-plugins/applauncher/AppLauncherPlugin.cpp" line="149"/>
<source>Cut</source>
<translation type="unfinished">Вирізати</translation>
</message>
<message>
- <location filename="../desktop-plugins/applauncher/AppLauncherPlugin.cpp" line="144"/>
+ <location filename="../desktop-plugins/applauncher/AppLauncherPlugin.cpp" line="151"/>
<source>Delete</source>
<translation type="unfinished">Видалити</translation>
</message>
<message>
- <location filename="../desktop-plugins/applauncher/AppLauncherPlugin.cpp" line="205"/>
+ <location filename="../desktop-plugins/applauncher/AppLauncherPlugin.cpp" line="212"/>
<source>Select Application</source>
<translation>Оберіть додаток</translation>
</message>
<message>
- <location filename="../desktop-plugins/applauncher/AppLauncherPlugin.cpp" line="205"/>
+ <location filename="../desktop-plugins/applauncher/AppLauncherPlugin.cpp" line="212"/>
<source>Name:</source>
<translation>Ім&apos;я:</translation>
</message>
<message>
- <location filename="../desktop-plugins/applauncher/AppLauncherPlugin.cpp" line="291"/>
+ <location filename="../desktop-plugins/applauncher/AppLauncherPlugin.cpp" line="298"/>
<source>New Filename</source>
<translation type="unfinished"></translation>
</message>
@@ -851,7 +851,7 @@
<name>LSession</name>
<message>
<location filename="../LSession.cpp" line="163"/>
- <location filename="../LSession.cpp" line="344"/>
+ <location filename="../LSession.cpp" line="342"/>
<source>Desktop</source>
<translation>Робочий стіл</translation>
</message>
diff --git a/src-qt5/core/lumina-desktop/i18n/lumina-desktop_uz.ts b/src-qt5/core/lumina-desktop/i18n/lumina-desktop_uz.ts
index 6a86d9f6..caeb719a 100644
--- a/src-qt5/core/lumina-desktop/i18n/lumina-desktop_uz.ts
+++ b/src-qt5/core/lumina-desktop/i18n/lumina-desktop_uz.ts
@@ -38,62 +38,62 @@
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../desktop-plugins/applauncher/AppLauncherPlugin.cpp" line="72"/>
+ <location filename="../desktop-plugins/applauncher/AppLauncherPlugin.cpp" line="73"/>
<source>Launch %1</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../desktop-plugins/applauncher/AppLauncherPlugin.cpp" line="127"/>
+ <location filename="../desktop-plugins/applauncher/AppLauncherPlugin.cpp" line="134"/>
<source>Open</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../desktop-plugins/applauncher/AppLauncherPlugin.cpp" line="129"/>
+ <location filename="../desktop-plugins/applauncher/AppLauncherPlugin.cpp" line="136"/>
<source>Open With</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../desktop-plugins/applauncher/AppLauncherPlugin.cpp" line="132"/>
+ <location filename="../desktop-plugins/applauncher/AppLauncherPlugin.cpp" line="139"/>
<source>View Properties</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../desktop-plugins/applauncher/AppLauncherPlugin.cpp" line="134"/>
+ <location filename="../desktop-plugins/applauncher/AppLauncherPlugin.cpp" line="141"/>
<source>File Operations</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../desktop-plugins/applauncher/AppLauncherPlugin.cpp" line="136"/>
+ <location filename="../desktop-plugins/applauncher/AppLauncherPlugin.cpp" line="143"/>
<source>Rename</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../desktop-plugins/applauncher/AppLauncherPlugin.cpp" line="139"/>
+ <location filename="../desktop-plugins/applauncher/AppLauncherPlugin.cpp" line="146"/>
<source>Copy</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../desktop-plugins/applauncher/AppLauncherPlugin.cpp" line="142"/>
+ <location filename="../desktop-plugins/applauncher/AppLauncherPlugin.cpp" line="149"/>
<source>Cut</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../desktop-plugins/applauncher/AppLauncherPlugin.cpp" line="144"/>
+ <location filename="../desktop-plugins/applauncher/AppLauncherPlugin.cpp" line="151"/>
<source>Delete</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../desktop-plugins/applauncher/AppLauncherPlugin.cpp" line="205"/>
+ <location filename="../desktop-plugins/applauncher/AppLauncherPlugin.cpp" line="212"/>
<source>Select Application</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../desktop-plugins/applauncher/AppLauncherPlugin.cpp" line="205"/>
+ <location filename="../desktop-plugins/applauncher/AppLauncherPlugin.cpp" line="212"/>
<source>Name:</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../desktop-plugins/applauncher/AppLauncherPlugin.cpp" line="291"/>
+ <location filename="../desktop-plugins/applauncher/AppLauncherPlugin.cpp" line="298"/>
<source>New Filename</source>
<translation type="unfinished"></translation>
</message>
@@ -851,7 +851,7 @@
<name>LSession</name>
<message>
<location filename="../LSession.cpp" line="163"/>
- <location filename="../LSession.cpp" line="344"/>
+ <location filename="../LSession.cpp" line="342"/>
<source>Desktop</source>
<translation type="unfinished"></translation>
</message>
diff --git a/src-qt5/core/lumina-desktop/i18n/lumina-desktop_vi.ts b/src-qt5/core/lumina-desktop/i18n/lumina-desktop_vi.ts
index 6a86d9f6..caeb719a 100644
--- a/src-qt5/core/lumina-desktop/i18n/lumina-desktop_vi.ts
+++ b/src-qt5/core/lumina-desktop/i18n/lumina-desktop_vi.ts
@@ -38,62 +38,62 @@
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../desktop-plugins/applauncher/AppLauncherPlugin.cpp" line="72"/>
+ <location filename="../desktop-plugins/applauncher/AppLauncherPlugin.cpp" line="73"/>
<source>Launch %1</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../desktop-plugins/applauncher/AppLauncherPlugin.cpp" line="127"/>
+ <location filename="../desktop-plugins/applauncher/AppLauncherPlugin.cpp" line="134"/>
<source>Open</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../desktop-plugins/applauncher/AppLauncherPlugin.cpp" line="129"/>
+ <location filename="../desktop-plugins/applauncher/AppLauncherPlugin.cpp" line="136"/>
<source>Open With</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../desktop-plugins/applauncher/AppLauncherPlugin.cpp" line="132"/>
+ <location filename="../desktop-plugins/applauncher/AppLauncherPlugin.cpp" line="139"/>
<source>View Properties</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../desktop-plugins/applauncher/AppLauncherPlugin.cpp" line="134"/>
+ <location filename="../desktop-plugins/applauncher/AppLauncherPlugin.cpp" line="141"/>
<source>File Operations</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../desktop-plugins/applauncher/AppLauncherPlugin.cpp" line="136"/>
+ <location filename="../desktop-plugins/applauncher/AppLauncherPlugin.cpp" line="143"/>
<source>Rename</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../desktop-plugins/applauncher/AppLauncherPlugin.cpp" line="139"/>
+ <location filename="../desktop-plugins/applauncher/AppLauncherPlugin.cpp" line="146"/>
<source>Copy</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../desktop-plugins/applauncher/AppLauncherPlugin.cpp" line="142"/>
+ <location filename="../desktop-plugins/applauncher/AppLauncherPlugin.cpp" line="149"/>
<source>Cut</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../desktop-plugins/applauncher/AppLauncherPlugin.cpp" line="144"/>
+ <location filename="../desktop-plugins/applauncher/AppLauncherPlugin.cpp" line="151"/>
<source>Delete</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../desktop-plugins/applauncher/AppLauncherPlugin.cpp" line="205"/>
+ <location filename="../desktop-plugins/applauncher/AppLauncherPlugin.cpp" line="212"/>
<source>Select Application</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../desktop-plugins/applauncher/AppLauncherPlugin.cpp" line="205"/>
+ <location filename="../desktop-plugins/applauncher/AppLauncherPlugin.cpp" line="212"/>
<source>Name:</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../desktop-plugins/applauncher/AppLauncherPlugin.cpp" line="291"/>
+ <location filename="../desktop-plugins/applauncher/AppLauncherPlugin.cpp" line="298"/>
<source>New Filename</source>
<translation type="unfinished"></translation>
</message>
@@ -851,7 +851,7 @@
<name>LSession</name>
<message>
<location filename="../LSession.cpp" line="163"/>
- <location filename="../LSession.cpp" line="344"/>
+ <location filename="../LSession.cpp" line="342"/>
<source>Desktop</source>
<translation type="unfinished"></translation>
</message>
diff --git a/src-qt5/core/lumina-desktop/i18n/lumina-desktop_zh_CN.ts b/src-qt5/core/lumina-desktop/i18n/lumina-desktop_zh_CN.ts
index 818cd2a6..17149435 100644
--- a/src-qt5/core/lumina-desktop/i18n/lumina-desktop_zh_CN.ts
+++ b/src-qt5/core/lumina-desktop/i18n/lumina-desktop_zh_CN.ts
@@ -38,62 +38,62 @@
<translation>单击以设定</translation>
</message>
<message>
- <location filename="../desktop-plugins/applauncher/AppLauncherPlugin.cpp" line="72"/>
+ <location filename="../desktop-plugins/applauncher/AppLauncherPlugin.cpp" line="73"/>
<source>Launch %1</source>
<translation>启动 %1</translation>
</message>
<message>
- <location filename="../desktop-plugins/applauncher/AppLauncherPlugin.cpp" line="127"/>
+ <location filename="../desktop-plugins/applauncher/AppLauncherPlugin.cpp" line="134"/>
<source>Open</source>
<translation>打开</translation>
</message>
<message>
- <location filename="../desktop-plugins/applauncher/AppLauncherPlugin.cpp" line="129"/>
+ <location filename="../desktop-plugins/applauncher/AppLauncherPlugin.cpp" line="136"/>
<source>Open With</source>
<translation>打开用</translation>
</message>
<message>
- <location filename="../desktop-plugins/applauncher/AppLauncherPlugin.cpp" line="132"/>
+ <location filename="../desktop-plugins/applauncher/AppLauncherPlugin.cpp" line="139"/>
<source>View Properties</source>
<translation>查看属性</translation>
</message>
<message>
- <location filename="../desktop-plugins/applauncher/AppLauncherPlugin.cpp" line="134"/>
+ <location filename="../desktop-plugins/applauncher/AppLauncherPlugin.cpp" line="141"/>
<source>File Operations</source>
<translation>文件操作</translation>
</message>
<message>
- <location filename="../desktop-plugins/applauncher/AppLauncherPlugin.cpp" line="136"/>
+ <location filename="../desktop-plugins/applauncher/AppLauncherPlugin.cpp" line="143"/>
<source>Rename</source>
<translation>重命名</translation>
</message>
<message>
- <location filename="../desktop-plugins/applauncher/AppLauncherPlugin.cpp" line="139"/>
+ <location filename="../desktop-plugins/applauncher/AppLauncherPlugin.cpp" line="146"/>
<source>Copy</source>
<translation>复制</translation>
</message>
<message>
- <location filename="../desktop-plugins/applauncher/AppLauncherPlugin.cpp" line="142"/>
+ <location filename="../desktop-plugins/applauncher/AppLauncherPlugin.cpp" line="149"/>
<source>Cut</source>
<translation>剪切</translation>
</message>
<message>
- <location filename="../desktop-plugins/applauncher/AppLauncherPlugin.cpp" line="144"/>
+ <location filename="../desktop-plugins/applauncher/AppLauncherPlugin.cpp" line="151"/>
<source>Delete</source>
<translation>删除</translation>
</message>
<message>
- <location filename="../desktop-plugins/applauncher/AppLauncherPlugin.cpp" line="205"/>
+ <location filename="../desktop-plugins/applauncher/AppLauncherPlugin.cpp" line="212"/>
<source>Select Application</source>
<translation>选择程序</translation>
</message>
<message>
- <location filename="../desktop-plugins/applauncher/AppLauncherPlugin.cpp" line="205"/>
+ <location filename="../desktop-plugins/applauncher/AppLauncherPlugin.cpp" line="212"/>
<source>Name:</source>
<translation>名称:</translation>
</message>
<message>
- <location filename="../desktop-plugins/applauncher/AppLauncherPlugin.cpp" line="291"/>
+ <location filename="../desktop-plugins/applauncher/AppLauncherPlugin.cpp" line="298"/>
<source>New Filename</source>
<translation>新文件名</translation>
</message>
@@ -851,7 +851,7 @@
<name>LSession</name>
<message>
<location filename="../LSession.cpp" line="163"/>
- <location filename="../LSession.cpp" line="344"/>
+ <location filename="../LSession.cpp" line="342"/>
<source>Desktop</source>
<translation>桌面</translation>
</message>
diff --git a/src-qt5/core/lumina-desktop/i18n/lumina-desktop_zh_HK.ts b/src-qt5/core/lumina-desktop/i18n/lumina-desktop_zh_HK.ts
index 6a86d9f6..caeb719a 100644
--- a/src-qt5/core/lumina-desktop/i18n/lumina-desktop_zh_HK.ts
+++ b/src-qt5/core/lumina-desktop/i18n/lumina-desktop_zh_HK.ts
@@ -38,62 +38,62 @@
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../desktop-plugins/applauncher/AppLauncherPlugin.cpp" line="72"/>
+ <location filename="../desktop-plugins/applauncher/AppLauncherPlugin.cpp" line="73"/>
<source>Launch %1</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../desktop-plugins/applauncher/AppLauncherPlugin.cpp" line="127"/>
+ <location filename="../desktop-plugins/applauncher/AppLauncherPlugin.cpp" line="134"/>
<source>Open</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../desktop-plugins/applauncher/AppLauncherPlugin.cpp" line="129"/>
+ <location filename="../desktop-plugins/applauncher/AppLauncherPlugin.cpp" line="136"/>
<source>Open With</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../desktop-plugins/applauncher/AppLauncherPlugin.cpp" line="132"/>
+ <location filename="../desktop-plugins/applauncher/AppLauncherPlugin.cpp" line="139"/>
<source>View Properties</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../desktop-plugins/applauncher/AppLauncherPlugin.cpp" line="134"/>
+ <location filename="../desktop-plugins/applauncher/AppLauncherPlugin.cpp" line="141"/>
<source>File Operations</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../desktop-plugins/applauncher/AppLauncherPlugin.cpp" line="136"/>
+ <location filename="../desktop-plugins/applauncher/AppLauncherPlugin.cpp" line="143"/>
<source>Rename</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../desktop-plugins/applauncher/AppLauncherPlugin.cpp" line="139"/>
+ <location filename="../desktop-plugins/applauncher/AppLauncherPlugin.cpp" line="146"/>
<source>Copy</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../desktop-plugins/applauncher/AppLauncherPlugin.cpp" line="142"/>
+ <location filename="../desktop-plugins/applauncher/AppLauncherPlugin.cpp" line="149"/>
<source>Cut</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../desktop-plugins/applauncher/AppLauncherPlugin.cpp" line="144"/>
+ <location filename="../desktop-plugins/applauncher/AppLauncherPlugin.cpp" line="151"/>
<source>Delete</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../desktop-plugins/applauncher/AppLauncherPlugin.cpp" line="205"/>
+ <location filename="../desktop-plugins/applauncher/AppLauncherPlugin.cpp" line="212"/>
<source>Select Application</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../desktop-plugins/applauncher/AppLauncherPlugin.cpp" line="205"/>
+ <location filename="../desktop-plugins/applauncher/AppLauncherPlugin.cpp" line="212"/>
<source>Name:</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../desktop-plugins/applauncher/AppLauncherPlugin.cpp" line="291"/>
+ <location filename="../desktop-plugins/applauncher/AppLauncherPlugin.cpp" line="298"/>
<source>New Filename</source>
<translation type="unfinished"></translation>
</message>
@@ -851,7 +851,7 @@
<name>LSession</name>
<message>
<location filename="../LSession.cpp" line="163"/>
- <location filename="../LSession.cpp" line="344"/>
+ <location filename="../LSession.cpp" line="342"/>
<source>Desktop</source>
<translation type="unfinished"></translation>
</message>
diff --git a/src-qt5/core/lumina-desktop/i18n/lumina-desktop_zh_TW.ts b/src-qt5/core/lumina-desktop/i18n/lumina-desktop_zh_TW.ts
index 6a86d9f6..caeb719a 100644
--- a/src-qt5/core/lumina-desktop/i18n/lumina-desktop_zh_TW.ts
+++ b/src-qt5/core/lumina-desktop/i18n/lumina-desktop_zh_TW.ts
@@ -38,62 +38,62 @@
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../desktop-plugins/applauncher/AppLauncherPlugin.cpp" line="72"/>
+ <location filename="../desktop-plugins/applauncher/AppLauncherPlugin.cpp" line="73"/>
<source>Launch %1</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../desktop-plugins/applauncher/AppLauncherPlugin.cpp" line="127"/>
+ <location filename="../desktop-plugins/applauncher/AppLauncherPlugin.cpp" line="134"/>
<source>Open</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../desktop-plugins/applauncher/AppLauncherPlugin.cpp" line="129"/>
+ <location filename="../desktop-plugins/applauncher/AppLauncherPlugin.cpp" line="136"/>
<source>Open With</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../desktop-plugins/applauncher/AppLauncherPlugin.cpp" line="132"/>
+ <location filename="../desktop-plugins/applauncher/AppLauncherPlugin.cpp" line="139"/>
<source>View Properties</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../desktop-plugins/applauncher/AppLauncherPlugin.cpp" line="134"/>
+ <location filename="../desktop-plugins/applauncher/AppLauncherPlugin.cpp" line="141"/>
<source>File Operations</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../desktop-plugins/applauncher/AppLauncherPlugin.cpp" line="136"/>
+ <location filename="../desktop-plugins/applauncher/AppLauncherPlugin.cpp" line="143"/>
<source>Rename</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../desktop-plugins/applauncher/AppLauncherPlugin.cpp" line="139"/>
+ <location filename="../desktop-plugins/applauncher/AppLauncherPlugin.cpp" line="146"/>
<source>Copy</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../desktop-plugins/applauncher/AppLauncherPlugin.cpp" line="142"/>
+ <location filename="../desktop-plugins/applauncher/AppLauncherPlugin.cpp" line="149"/>
<source>Cut</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../desktop-plugins/applauncher/AppLauncherPlugin.cpp" line="144"/>
+ <location filename="../desktop-plugins/applauncher/AppLauncherPlugin.cpp" line="151"/>
<source>Delete</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../desktop-plugins/applauncher/AppLauncherPlugin.cpp" line="205"/>
+ <location filename="../desktop-plugins/applauncher/AppLauncherPlugin.cpp" line="212"/>
<source>Select Application</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../desktop-plugins/applauncher/AppLauncherPlugin.cpp" line="205"/>
+ <location filename="../desktop-plugins/applauncher/AppLauncherPlugin.cpp" line="212"/>
<source>Name:</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../desktop-plugins/applauncher/AppLauncherPlugin.cpp" line="291"/>
+ <location filename="../desktop-plugins/applauncher/AppLauncherPlugin.cpp" line="298"/>
<source>New Filename</source>
<translation type="unfinished"></translation>
</message>
@@ -851,7 +851,7 @@
<name>LSession</name>
<message>
<location filename="../LSession.cpp" line="163"/>
- <location filename="../LSession.cpp" line="344"/>
+ <location filename="../LSession.cpp" line="342"/>
<source>Desktop</source>
<translation type="unfinished"></translation>
</message>
diff --git a/src-qt5/core/lumina-desktop/i18n/lumina-desktop_zu.ts b/src-qt5/core/lumina-desktop/i18n/lumina-desktop_zu.ts
index 6a86d9f6..caeb719a 100644
--- a/src-qt5/core/lumina-desktop/i18n/lumina-desktop_zu.ts
+++ b/src-qt5/core/lumina-desktop/i18n/lumina-desktop_zu.ts
@@ -38,62 +38,62 @@
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../desktop-plugins/applauncher/AppLauncherPlugin.cpp" line="72"/>
+ <location filename="../desktop-plugins/applauncher/AppLauncherPlugin.cpp" line="73"/>
<source>Launch %1</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../desktop-plugins/applauncher/AppLauncherPlugin.cpp" line="127"/>
+ <location filename="../desktop-plugins/applauncher/AppLauncherPlugin.cpp" line="134"/>
<source>Open</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../desktop-plugins/applauncher/AppLauncherPlugin.cpp" line="129"/>
+ <location filename="../desktop-plugins/applauncher/AppLauncherPlugin.cpp" line="136"/>
<source>Open With</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../desktop-plugins/applauncher/AppLauncherPlugin.cpp" line="132"/>
+ <location filename="../desktop-plugins/applauncher/AppLauncherPlugin.cpp" line="139"/>
<source>View Properties</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../desktop-plugins/applauncher/AppLauncherPlugin.cpp" line="134"/>
+ <location filename="../desktop-plugins/applauncher/AppLauncherPlugin.cpp" line="141"/>
<source>File Operations</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../desktop-plugins/applauncher/AppLauncherPlugin.cpp" line="136"/>
+ <location filename="../desktop-plugins/applauncher/AppLauncherPlugin.cpp" line="143"/>
<source>Rename</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../desktop-plugins/applauncher/AppLauncherPlugin.cpp" line="139"/>
+ <location filename="../desktop-plugins/applauncher/AppLauncherPlugin.cpp" line="146"/>
<source>Copy</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../desktop-plugins/applauncher/AppLauncherPlugin.cpp" line="142"/>
+ <location filename="../desktop-plugins/applauncher/AppLauncherPlugin.cpp" line="149"/>
<source>Cut</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../desktop-plugins/applauncher/AppLauncherPlugin.cpp" line="144"/>
+ <location filename="../desktop-plugins/applauncher/AppLauncherPlugin.cpp" line="151"/>
<source>Delete</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../desktop-plugins/applauncher/AppLauncherPlugin.cpp" line="205"/>
+ <location filename="../desktop-plugins/applauncher/AppLauncherPlugin.cpp" line="212"/>
<source>Select Application</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../desktop-plugins/applauncher/AppLauncherPlugin.cpp" line="205"/>
+ <location filename="../desktop-plugins/applauncher/AppLauncherPlugin.cpp" line="212"/>
<source>Name:</source>
<translation type="unfinished"></translation>
</message>
<message>
- <location filename="../desktop-plugins/applauncher/AppLauncherPlugin.cpp" line="291"/>
+ <location filename="../desktop-plugins/applauncher/AppLauncherPlugin.cpp" line="298"/>
<source>New Filename</source>
<translation type="unfinished"></translation>
</message>
@@ -851,7 +851,7 @@
<name>LSession</name>
<message>
<location filename="../LSession.cpp" line="163"/>
- <location filename="../LSession.cpp" line="344"/>
+ <location filename="../LSession.cpp" line="342"/>
<source>Desktop</source>
<translation type="unfinished"></translation>
</message>
diff --git a/src-qt5/core/lumina-desktop/panel-plugins/systemdashboard/LSysDashboard.cpp b/src-qt5/core/lumina-desktop/panel-plugins/systemdashboard/LSysDashboard.cpp
index 267a7cb0..b9d70e97 100644
--- a/src-qt5/core/lumina-desktop/panel-plugins/systemdashboard/LSysDashboard.cpp
+++ b/src-qt5/core/lumina-desktop/panel-plugins/systemdashboard/LSysDashboard.cpp
@@ -77,7 +77,7 @@ void LSysDashboard::updateIcon(bool force){
}
void LSysDashboard::resetIcon(){
- button->setIcon( LXDG::findIcon("dashboard-show",""));
+ button->setIcon( LXDG::findIcon("arrow-down-drop-circle",""));
}
void LSysDashboard::openMenu(){
diff --git a/src-qt5/core/lumina-desktop/panel-plugins/systemdashboard/SysMenuQuick.cpp b/src-qt5/core/lumina-desktop/panel-plugins/systemdashboard/SysMenuQuick.cpp
index 1d699ea9..e6602dd6 100644
--- a/src-qt5/core/lumina-desktop/panel-plugins/systemdashboard/SysMenuQuick.cpp
+++ b/src-qt5/core/lumina-desktop/panel-plugins/systemdashboard/SysMenuQuick.cpp
@@ -29,7 +29,7 @@ LSysMenuQuick::LSysMenuQuick(QWidget *parent) : QWidget(parent), ui(new Ui::LSys
connect(brighttimer, SIGNAL(timeout()), this, SLOT(setCurrentBrightness()) );
connect(ui->combo_locale, SIGNAL(currentIndexChanged(int)), this, SLOT(changeLocale()) );
//And setup the default icons
- ui->label_bright_icon->setPixmap( LXDG::findIcon("preferences-system-power-management","").pixmap(ui->label_bright_icon->maximumSize()) );
+ ui->label_bright_icon->setPixmap( LXDG::findIcon("preferences-desktop-brightness","").pixmap(ui->label_bright_icon->maximumSize()) );
ui->tool_wk_prev->setIcon( LXDG::findIcon("go-previous-view",""));
ui->tool_wk_next->setIcon( LXDG::findIcon("go-next-view","") );
ui->tool_logout->setIcon( LXDG::findIcon("system-log-out","") );
@@ -208,4 +208,4 @@ void LSysMenuQuick::changeLocale(){
QString locale = ui->combo_locale->currentData().toString();
emit CloseMenu();
LSession::handle()->switchLocale(locale);
-} \ No newline at end of file
+}
diff --git a/src-qt5/core/lumina-desktop/panel-plugins/systemstart/StartMenu.cpp b/src-qt5/core/lumina-desktop/panel-plugins/systemstart/StartMenu.cpp
index 4e6055d6..6557dbee 100644
--- a/src-qt5/core/lumina-desktop/panel-plugins/systemstart/StartMenu.cpp
+++ b/src-qt5/core/lumina-desktop/panel-plugins/systemstart/StartMenu.cpp
@@ -57,7 +57,7 @@ void StartMenu::UpdateAll(){
ui->tool_launch_deskinfo->setIcon(LXDG::findIcon("system-help",""));
ui->tool_launch_mixer->setIcon( LXDG::findIcon("preferences-desktop-sound","") );
- ui->label_bright_icon->setPixmap( LXDG::findIcon("preferences-system-power-management","").pixmap(ui->tool_goto_apps->iconSize()) );
+ ui->label_bright_icon->setPixmap( LXDG::findIcon("preferences-desktop-brightness","").pixmap(ui->tool_goto_apps->iconSize()) );
ui->label_locale_icon->setPixmap( LXDG::findIcon("preferences-desktop-locale","").pixmap(ui->tool_goto_apps->iconSize()) );
ui->tool_set_nextwkspace->setIcon(LXDG::findIcon("go-next-view",""));
ui->tool_set_prevwkspace->setIcon(LXDG::findIcon("go-previous-view",""));
diff --git a/src-qt5/core/lumina-info/i18n/lumina-info_cs.ts b/src-qt5/core/lumina-info/i18n/lumina-info_cs.ts
index 8153cee7..923e27a1 100644
--- a/src-qt5/core/lumina-info/i18n/lumina-info_cs.ts
+++ b/src-qt5/core/lumina-info/i18n/lumina-info_cs.ts
@@ -16,12 +16,12 @@
<message>
<location filename="../MainUI.ui" line="89"/>
<source>Source Repository</source>
- <translation>Zdrojový repozitář</translation>
+ <translation>Repozitář se zdrojovými kódy</translation>
</message>
<message>
<location filename="../MainUI.ui" line="124"/>
<source>Lumina Website</source>
- <translation>Stránky Lumina</translation>
+ <translation>Webové stránky projektu Lumina</translation>
</message>
<message>
<location filename="../MainUI.ui" line="152"/>
@@ -36,17 +36,17 @@
<message>
<location filename="../MainUI.ui" line="202"/>
<source>OS Build:</source>
- <translation>Sestavení OS:</translation>
+ <translation>Sestavení operačního systému:</translation>
</message>
<message>
<location filename="../MainUI.ui" line="218"/>
<source>Qt Version:</source>
- <translation>Verze Qt:</translation>
+ <translation>Verze Qt knihoven:</translation>
</message>
<message>
<location filename="../MainUI.ui" line="276"/>
<source>Ask the Community</source>
- <translation>Zeptat se společenství</translation>
+ <translation>Zeptat se ostatních</translation>
</message>
<message>
<location filename="../MainUI.ui" line="233"/>
@@ -70,8 +70,8 @@
</message>
<message>
<location filename="../MainUI.ui" line="340"/>
- <source>&lt;a href=&quot;https://github.com/beanpole135&quot;&gt;Ken Moore&lt;/a&gt;</source>
- <translation>&lt;a href=&quot;https://github.com/beanpole135&quot;&gt;Ken Moore&lt;/a&gt;</translation>
+ <source>&lt;a href="https://github.com/beanpole135"&gt;Ken Moore&lt;/a&gt;</source>
+ <translation>&lt;a href="https://github.com/beanpole135"&gt;Ken Moore&lt;/a&gt;</translation>
</message>
<message>
<location filename="../MainUI.ui" line="353"/>
@@ -85,8 +85,8 @@
</message>
<message>
<location filename="../MainUI.ui" line="428"/>
- <source>&lt;a href=&quot;https://github.com/pcbsd/lumina/graphs/contributors&quot;&gt;Open in web browser&lt;a&gt;</source>
- <translation>&lt;a href=&quot;https://github.com/pcbsd/lumina/graphs/contributors&quot;&gt;Otevřít v prohlížeči&lt;a&gt;</translation>
+ <source>&lt;a href="https://github.com/pcbsd/lumina/graphs/contributors"&gt;Open in web browser&lt;a&gt;</source>
+ <translation>&lt;a href="https://github.com/pcbsd/lumina/graphs/contributors"&gt;Otevřít v prohlížeči&lt;a&gt;</translation>
</message>
<message>
<location filename="../MainUI.ui" line="454"/>
diff --git a/src-qt5/core/lumina-open/i18n/lumina-open_cs.ts b/src-qt5/core/lumina-open/i18n/lumina-open_cs.ts
index a08b5965..6a32e742 100644
--- a/src-qt5/core/lumina-open/i18n/lumina-open_cs.ts
+++ b/src-qt5/core/lumina-open/i18n/lumina-open_cs.ts
@@ -6,12 +6,12 @@
<message>
<location filename="../LFileDialog.ui" line="14"/>
<source>Open With...</source>
- <translation>Otevřít pomocí...</translation>
+ <translation>Otevřít pomocí…</translation>
</message>
<message>
<location filename="../LFileDialog.ui" line="68"/>
<source>Preferred</source>
- <translation>Preferované</translation>
+ <translation>Upřednostňované</translation>
</message>
<message>
<location filename="../LFileDialog.ui" line="75"/>
@@ -26,7 +26,7 @@
<message>
<location filename="../LFileDialog.ui" line="131"/>
<source>Binary Location</source>
- <translation>Místo v binárním kódu</translation>
+ <translation>Umístění spustitelného souboru</translation>
</message>
<message>
<location filename="../LFileDialog.ui" line="138"/>
@@ -46,12 +46,12 @@
<message>
<location filename="../LFileDialog.ui" line="235"/>
<source>Cancel</source>
- <translation>Zrušit</translation>
+ <translation>Storno</translation>
</message>
<message>
<location filename="../LFileDialog.cpp" line="40"/>
<source>(Email Link)</source>
- <translation>(Odkaz na e-mail)</translation>
+ <translation>(Poslat odkaz e-mailem)</translation>
</message>
<message>
<location filename="../LFileDialog.cpp" line="41"/>
@@ -121,7 +121,7 @@
<message>
<location filename="../LFileDialog.cpp" line="126"/>
<source>Utilities</source>
- <translation>Pomůcky</translation>
+ <translation>Nástroje</translation>
</message>
<message>
<location filename="../LFileDialog.cpp" line="127"/>
@@ -136,7 +136,7 @@
<message>
<location filename="../LFileDialog.cpp" line="278"/>
<source>Find Application Binary</source>
- <translation>Najít soubor aplikace</translation>
+ <translation>Najít spustitelný soubor aplikace</translation>
</message>
</context>
<context>
@@ -161,27 +161,27 @@
<message>
<location filename="../main.cpp" line="246"/>
<source>Invalid file or URL: %1</source>
- <translation>Neplatný soubor nebo URL: %1</translation>
+ <translation>Neplatný soubor nebo URL adresa: %1</translation>
</message>
<message>
<location filename="../main.cpp" line="267"/>
<source>Application entry is invalid: %1</source>
- <translation>Záznam programu je neplatný: %1</translation>
+ <translation>Záznam pro aplikaci není platný: %1</translation>
</message>
<message>
<location filename="../main.cpp" line="278"/>
<source>Application shortcut is missing the launching information (malformed shortcut): %1</source>
- <translation>Zástupci aplikace chybí informace o zahájení (chybné zkratky):% 1</translation>
+ <translation>V zástupci aplikace chybí informace pro spouštění (chybná zkratka):% 1</translation>
</message>
<message>
<location filename="../main.cpp" line="291"/>
<source>URL shortcut is missing the URL: %1</source>
- <translation>URL zástupci chybí URL: %1</translation>
+ <translation>V zástupci URL adresy chybí URL: %1</translation>
</message>
<message>
<location filename="../main.cpp" line="302"/>
<source>Directory shortcut is missing the path to the directory: %1</source>
- <translation>Zástupci složky chybí cesta do adresáře: %1</translation>
+ <translation>V zástupci složky chybí popis jejího umístění: %1</translation>
</message>
<message>
<location filename="../main.cpp" line="307"/>
@@ -195,8 +195,8 @@
</message>
<message>
<location filename="../main.cpp" line="370"/>
- <source>Could not find &quot;%1&quot;. Please ensure it is installed first.</source>
- <translation>Nepodařilo se najít &quot;%1&quot;. Nejprve, prosím, zajistěte, aby byl nainstalován.</translation>
+ <source>Could not find "%1". Please ensure it is installed first.</source>
+ <translation>Nepodařilo se najít „%1“. Nejprve zajistěte, aby bylo nainstalované.</translation>
</message>
<message>
<location filename="../main.cpp" line="421"/>
@@ -206,7 +206,7 @@
<message>
<location filename="../main.cpp" line="421"/>
<source>The following application experienced an error and needed to close:</source>
- <translation>Následující aplikace ohlašují chybu a musí být ukončeny:</translation>
+ <translation>V následující aplikaci došlo k chyba a bude proto ukončena:</translation>
</message>
</context>
</TS>
diff --git a/src-qt5/core/lumina-session/session.cpp b/src-qt5/core/lumina-session/session.cpp
index 1aa86720..de9b86ee 100644
--- a/src-qt5/core/lumina-session/session.cpp
+++ b/src-qt5/core/lumina-session/session.cpp
@@ -92,7 +92,7 @@ void LSession::start(bool unified){
if(WM=="fluxbox"){
// FLUXBOX BUG BYPASS: if the ~/.fluxbox dir does not exist, it will ignore the given config file
if( !LUtils::isValidBinary("fluxbox") ){
- qDebug() << "[INCOMPLETE LUMINA INSTALLATION] fluxbox binary is missing - cannot continue";
+ qDebug() << "[INCOMPLETE LUMINA INSTALLATION] fluxbox binary is missing - cannot continue";
}else{
QString confDir = QString( getenv("XDG_CONFIG_HOME"))+"/lumina-desktop";
if(!QFile::exists(confDir)){ QDir dir(confDir); dir.mkpath(confDir); }
diff --git a/src-qt5/core/lumina-theme-engine/LICENSE b/src-qt5/core/lumina-theme-engine/LICENSE
new file mode 100644
index 00000000..2179b01c
--- /dev/null
+++ b/src-qt5/core/lumina-theme-engine/LICENSE
@@ -0,0 +1,38 @@
+Copyright for original source of project (prior to commit a852d14 of:
+https://github.com/trueos/lumina/tree/master/src-qt5/core/lumina-theme-engine
+held by Ilya Kotov <forkotov02@hotmail.ru> https://sourceforge.net/projects/qt5ct/
+under an MIT License.
+Original AUTHORS : https://sourceforge.net/p/qt5ct/code/HEAD/tree/trunk/qt5ct/AUTHORS
+
+All further commits are Copyright of q5sys under MIT License.
+
+
+Original Project Copyright:
+
+
+Copyright (c) 2014-2017, Ilya Kotov <forkotov02@hotmail.ru>
+All rights reserved.
+
+Redistribution and use in source and binary forms, with or without
+modification, are permitted provided that the following conditions are
+met:
+
+1. Redistributions of source code must retain the above copyright
+ notice, this list of conditions and the following disclaimer.
+
+2. Redistributions in binary form must reproduce the above copyright
+ notice, this list of conditions and the following disclaimer in
+ the documentation and/or other materials provided with the
+ distribution.
+
+THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
diff --git a/src-qt5/core/lumina-theme-engine/README.md b/src-qt5/core/lumina-theme-engine/README.md
new file mode 100644
index 00000000..d46797b1
--- /dev/null
+++ b/src-qt5/core/lumina-theme-engine/README.md
@@ -0,0 +1,14 @@
+## Lumina Theme Engine
+
+This is a theme engine for the Lumina Desktop
+
+### Dependencies
+
+1. Qt 5.4+
+ - qtbase >= 5.4.0
+ - qtsvg >= 5.4.0
+ - qttools >= 5.4.0
+
+2. Lumina Desktop
+
+Environment Variable QT_QPA_PLATFORMTHEME=lthemeengine needs to be set
diff --git a/src-qt5/core/lumina-theme-engine/lthemeengine.pri b/src-qt5/core/lumina-theme-engine/lthemeengine.pri
new file mode 100644
index 00000000..be67734b
--- /dev/null
+++ b/src-qt5/core/lumina-theme-engine/lthemeengine.pri
@@ -0,0 +1,32 @@
+#Some conf to redirect intermediate stuff in separate dirs
+UI_DIR=./.build/ui/
+MOC_DIR=./.build/moc/
+OBJECTS_DIR=./.build/obj
+RCC_DIR=./.build/rcc
+
+QMAKE_DISTCLEAN += -r .build
+
+CONFIG += c++11
+
+!isEqual (QT_MAJOR_VERSION, 5) {
+ error("Use Qt 5.4.0 or higher.")
+}
+
+!greaterThan(QT_MINOR_VERSION, 3) {
+ error("Use Qt 5.4.0 or higher.")
+}
+
+#Install paths
+unix {
+ isEmpty(PREFIX) {
+ PREFIX = /usr
+ }
+ isEmpty(PLUGINDIR) {
+ PLUGINDIR = $$[QT_INSTALL_PLUGINS]
+ }
+
+ BINDIR = $$PREFIX/bin
+ DATADIR = $$PREFIX/share
+
+ DEFINES += LTHEMEENGINE_DATADIR=\\\"$$DATADIR\\\"
+}
diff --git a/src-qt5/core/lumina-theme-engine/lthemeengine.pro b/src-qt5/core/lumina-theme-engine/lthemeengine.pro
new file mode 100644
index 00000000..d8ba709e
--- /dev/null
+++ b/src-qt5/core/lumina-theme-engine/lthemeengine.pro
@@ -0,0 +1,57 @@
+QT += core gui
+greaterThan(QT_MAJOR_VERSION, 4): QT += widgets x11extras network
+
+QMAKE_DISTCLEAN += -r .build
+
+CONFIG += c++11
+
+desktop.files=src/lthemeengine/ltheme.desktop
+desktop.path=$${L_SHAREDIR}/applications/
+
+#Install paths
+unix {
+ isEmpty(PREFIX) {
+ PREFIX = /usr
+ }
+ isEmpty(PLUGINDIR) {
+ PLUGINDIR = $$[QT_INSTALL_PLUGINS]
+ }
+
+ BINDIR = $$PREFIX/bin
+ DATADIR = $$PREFIX/share
+
+ DEFINES += LTHEMEENGINE_DATADIR=\\\"$$DATADIR\\\"
+}
+
+TEMPLATE = subdirs
+
+SUBDIRS += src/lthemeengine-qtplugin src/lthemeengine-style src/lthemeengine
+
+unix:exists($$[QT_INSTALL_BINS]/lrelease){
+LRELEASE_EXECUTABLE = $$[QT_INSTALL_BINS]/lrelease
+}
+
+unix:exists($$[QT_INSTALL_BINS]/lrelease-qt5){
+LRELEASE_EXECUTABLE = $$[QT_INSTALL_BINS]/lrelease-qt5
+}
+
+
+isEmpty(LRELEASE_EXECUTABLE){
+error(Could not find lrelease executable)
+}
+else {
+message(Found lrelease executable: $$LRELEASE_EXECUTABLE)
+}
+
+message (PREFIX=$$PREFIX)
+message (BINDIR=$$BINDIR)
+message (DATADIR=$$DATADIR)
+message (PLUGINDIR=$$PLUGINDIR)
+equals (DISABLE_WIDGETS,1):message ("QtWidgets are disabled!")
+
+#Some conf to redirect intermediate stuff in separate dirs
+UI_DIR=./.build/ui/
+MOC_DIR=./.build/moc/
+OBJECTS_DIR=./.build/obj
+RCC_DIR=./.build/rcc
+
diff --git a/src-qt5/core/lumina-theme-engine/src/lthemeengine-qtplugin/lthemeengine-qtplugin.pro b/src-qt5/core/lumina-theme-engine/src/lthemeengine-qtplugin/lthemeengine-qtplugin.pro
new file mode 100644
index 00000000..064c7642
--- /dev/null
+++ b/src-qt5/core/lumina-theme-engine/src/lthemeengine-qtplugin/lthemeengine-qtplugin.pro
@@ -0,0 +1,35 @@
+include(../../lthemeengine.pri)
+
+TEMPLATE = lib
+TARGET = lthemeengine
+CONFIG += plugin
+
+greaterThan(QT_MINOR_VERSION, 7) {
+ QT += gui-private theme_support-private
+} else {
+ QT += gui-private platformsupport-private
+}
+
+!contains(DEFINES, QT_NO_DBUS):greaterThan(QT_MINOR_VERSION, 5) {
+ QT += dbus
+}
+
+SOURCES += \
+ main.cpp \
+ lthemeengineplatformtheme.cpp \
+ ../lthemeengine/lthemeengine.cpp
+
+!equals (DISABLE_WIDGETS,1) {
+ QT += widgets
+}
+
+OTHER_FILES += lthemeengine.json
+
+INCLUDEPATH += ../
+
+HEADERS += \
+ lthemeengineplatformtheme.h \
+ ../lthemeengine/lthemeengine.h
+
+target.path = $$PLUGINDIR/platformthemes
+INSTALLS += target
diff --git a/src-qt5/core/lumina-theme-engine/src/lthemeengine-qtplugin/lthemeengine.json b/src-qt5/core/lumina-theme-engine/src/lthemeengine-qtplugin/lthemeengine.json
new file mode 100644
index 00000000..433d4a88
--- /dev/null
+++ b/src-qt5/core/lumina-theme-engine/src/lthemeengine-qtplugin/lthemeengine.json
@@ -0,0 +1,3 @@
+{
+ "Keys": [ "lthemeengine" ]
+}
diff --git a/src-qt5/core/lumina-theme-engine/src/lthemeengine-qtplugin/lthemeengineplatformtheme.cpp b/src-qt5/core/lumina-theme-engine/src/lthemeengine-qtplugin/lthemeengineplatformtheme.cpp
new file mode 100644
index 00000000..02f6a10f
--- /dev/null
+++ b/src-qt5/core/lumina-theme-engine/src/lthemeengine-qtplugin/lthemeengineplatformtheme.cpp
@@ -0,0 +1,366 @@
+/*
+ * Copyright (c) 2014-2017, Ilya Kotov <forkotov02@hotmail.ru>
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are
+ * met:
+ *
+ * 1. Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ *
+ * 2. Redistributions in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in
+ * the documentation and/or other materials provided with the
+ * distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ * HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+#include <QVariant>
+#include <QSettings>
+#include <QGuiApplication>
+#include <QScreen>
+#include <QFont>
+#include <QPalette>
+#include <QTimer>
+#include <QIcon>
+#include <QRegExp>
+#ifdef QT_WIDGETS_LIB
+#include <QStyle>
+#include <QStyleFactory>
+#include <QApplication>
+#include <QWidget>
+#endif
+#include <QFile>
+#include <QFileSystemWatcher>
+
+#include <lthemeengine/lthemeengine.h>
+#include "lthemeengineplatformtheme.h"
+#if (QT_VERSION >= QT_VERSION_CHECK(5, 7, 0)) && !defined(QT_NO_DBUS)
+#include <private/qdbusmenubar_p.h>
+#endif
+#if !defined(QT_NO_DBUS) && !defined(QT_NO_SYSTEMTRAYICON)
+#include <QDBusArgument>
+#include <private/qdbustrayicon_p.h>
+#endif
+
+
+
+Q_LOGGING_CATEGORY(llthemeengine, "lthemeengine")
+
+//QT_QPA_PLATFORMTHEME=lthemeengine
+
+lthemeenginePlatformTheme::lthemeenginePlatformTheme()
+{
+ if(QGuiApplication::desktopSettingsAware())
+ {
+ readSettings();
+ QMetaObject::invokeMethod(this, "applySettings", Qt::QueuedConnection);
+#ifdef QT_WIDGETS_LIB
+ QMetaObject::invokeMethod(this, "createFSWatcher", Qt::QueuedConnection);
+#endif
+ QGuiApplication::setFont(m_generalFont);
+ }
+ qCDebug(llthemeengine) << "using lthemeengine plugin";
+#ifdef QT_WIDGETS_LIB
+ if(!QStyleFactory::keys().contains("lthemeengine-style"))
+ qCCritical(llthemeengine) << "unable to find lthemeengine proxy style";
+#endif
+}
+
+lthemeenginePlatformTheme::~lthemeenginePlatformTheme()
+{
+ if(m_customPalette)
+ delete m_customPalette;
+}
+
+#if (QT_VERSION >= QT_VERSION_CHECK(5, 7, 0)) && !defined(QT_NO_DBUS)
+QPlatformMenuBar *lthemeenginePlatformTheme::createPlatformMenuBar() const
+{
+ if(m_checkDBusGlobalMenu)
+ {
+ QDBusConnection conn = QDBusConnection::sessionBus();
+ m_dbusGlobalMenuAvailable = conn.interface()->isServiceRegistered("com.canonical.AppMenu.Registrar");
+ qCDebug(llthemeengine) << "D-Bus global menu:" << (m_dbusGlobalMenuAvailable ? "yes" : "no");
+ }
+ return (m_dbusGlobalMenuAvailable ? new QDBusMenuBar() : nullptr);
+}
+#endif
+
+#if !defined(QT_NO_DBUS) && !defined(QT_NO_SYSTEMTRAYICON)
+QPlatformSystemTrayIcon *lthemeenginePlatformTheme::createPlatformSystemTrayIcon() const
+{
+ if(m_checkDBusTray)
+ {
+ QDBusMenuConnection conn;
+ m_dbusTrayAvailable = conn.isStatusNotifierHostRegistered();
+ m_checkDBusTray = false;
+ qCDebug(llthemeengine) << "D-Bus system tray:" << (m_dbusTrayAvailable ? "yes" : "no");
+ }
+ return (m_dbusTrayAvailable ? new QDBusTrayIcon() : nullptr);
+}
+#endif
+
+const QPalette *lthemeenginePlatformTheme::palette(QPlatformTheme::Palette type) const
+{
+ Q_UNUSED(type);
+ return (m_usePalette ? m_customPalette : nullptr);
+}
+
+const QFont *lthemeenginePlatformTheme::font(QPlatformTheme::Font type) const
+{
+ if(type == QPlatformTheme::FixedFont)
+ return &m_fixedFont;
+ return &m_generalFont;
+}
+
+QVariant lthemeenginePlatformTheme::themeHint(QPlatformTheme::ThemeHint hint) const
+{
+ switch (hint)
+ {
+ case QPlatformTheme::CursorFlashTime:
+ return m_cursorFlashTime;
+ case MouseDoubleClickInterval:
+ return m_doubleClickInterval;
+ case QPlatformTheme::ToolButtonStyle:
+ return m_toolButtonStyle;
+ case QPlatformTheme::SystemIconThemeName:
+ return m_iconTheme;
+ case QPlatformTheme::StyleNames:
+ return QStringList() << "lthemeengine-style";
+ case QPlatformTheme::IconThemeSearchPaths:
+ return lthemeengine::iconPaths();
+ case DialogButtonBoxLayout:
+ return m_buttonBoxLayout;
+ case QPlatformTheme::UiEffects:
+ return m_uiEffects;
+#if (QT_VERSION >= QT_VERSION_CHECK(5, 6, 0))
+ case QPlatformTheme::WheelScrollLines:
+ return m_wheelScrollLines;
+#endif
+ default:
+ return QPlatformTheme::themeHint(hint);
+ }
+}
+
+void lthemeenginePlatformTheme::applySettings()
+{
+ if(!QGuiApplication::desktopSettingsAware())
+ return;
+
+#if (QT_VERSION >= QT_VERSION_CHECK(5, 5, 0))
+ if(!m_update)
+ {
+ //do not override application palette
+ if(QCoreApplication::testAttribute(Qt::AA_SetPalette))
+ {
+ m_usePalette = false;
+ qCDebug(llthemeengine) << "palette support is disabled";
+ }
+ }
+#endif
+
+#ifdef QT_WIDGETS_LIB
+ if(hasWidgets())
+ {
+ qApp->setFont(m_generalFont);
+
+ //Qt 5.6 or higher should be use themeHint function on application startup.
+ //So, there is no need to call this function first time.
+#if (QT_VERSION >= QT_VERSION_CHECK(5, 6, 0))
+ if(m_update)
+ qApp->setWheelScrollLines(m_wheelScrollLines);
+#else
+ qApp->setWheelScrollLines(m_wheelScrollLines);
+#endif
+
+ if(m_update && qApp->style()->objectName() == "lthemeengine-style") //ignore application style
+ qApp->setStyle("lthemeengine-style"); //recreate style object
+
+ if(m_update && m_usePalette)
+ {
+ if(m_customPalette)
+ qApp->setPalette(*m_customPalette);
+ else
+ qApp->setPalette(qApp->style()->standardPalette());
+ }
+
+ //do not override application style
+ if(m_prevStyleSheet == qApp->styleSheet())
+ qApp->setStyleSheet(m_userStyleSheet);
+ else
+ qCDebug(llthemeengine) << "custom style sheet is disabled";
+ m_prevStyleSheet = m_userStyleSheet;
+ }
+#endif
+ QGuiApplication::setFont(m_generalFont); //apply font
+ QIcon::setThemeName(m_iconTheme); //apply icons
+ if(m_customPalette && m_usePalette)
+ QGuiApplication::setPalette(*m_customPalette); //apply palette
+
+#ifdef QT_WIDGETS_LIB
+ if(hasWidgets())
+ {
+ foreach (QWidget *w, qApp->allWidgets())
+ {
+ QEvent e(QEvent::ThemeChange);
+ QApplication::sendEvent(w, &e);
+ }
+ }
+#endif
+
+ if(!m_update)
+ m_update = true;
+}
+
+#ifdef QT_WIDGETS_LIB
+void lthemeenginePlatformTheme::createFSWatcher()
+{
+ QFileSystemWatcher *watcher = new QFileSystemWatcher(this);
+ watcher->addPath(lthemeengine::configPath());
+
+ QTimer *timer = new QTimer(this);
+ timer->setSingleShot(true);
+ timer->setInterval(3000);
+ connect(watcher, SIGNAL(directoryChanged(QString)), timer, SLOT(start()));
+ connect(timer, SIGNAL(timeout()), SLOT(updateSettings()));
+}
+
+void lthemeenginePlatformTheme::updateSettings()
+{
+ qCDebug(llthemeengine) << "updating settings..";
+ readSettings();
+ applySettings();
+}
+#endif
+
+void lthemeenginePlatformTheme::readSettings()
+{
+ if(m_customPalette)
+ {
+ delete m_customPalette;
+ m_customPalette = 0;
+ }
+
+ QSettings settings(lthemeengine::configFile(), QSettings::IniFormat);
+
+ settings.beginGroup("Appearance");
+ m_style = settings.value("style", "Fusion").toString();
+ if(settings.value("custom_palette", false).toBool())
+ {
+ QString schemePath = settings.value("color_scheme_path").toString();
+ m_customPalette = new QPalette(loadColorScheme(schemePath));
+ }
+ m_iconTheme = settings.value("icon_theme").toString();
+ settings.endGroup();
+
+ settings.beginGroup("Fonts");
+ m_generalFont = settings.value("general", QPlatformTheme::font(QPlatformTheme::SystemFont)).value<QFont>();
+ m_fixedFont = settings.value("fixed", QPlatformTheme::font(QPlatformTheme::FixedFont)).value<QFont>();
+ settings.endGroup();
+
+ settings.beginGroup("Interface");
+ m_doubleClickInterval = QPlatformTheme::themeHint(QPlatformTheme::MouseDoubleClickInterval).toInt();
+ m_doubleClickInterval = settings.value("double_click_interval", m_doubleClickInterval).toInt();
+ m_cursorFlashTime = QPlatformTheme::themeHint(QPlatformTheme::CursorFlashTime).toInt();
+ m_cursorFlashTime = settings.value("cursor_flash_time", m_cursorFlashTime).toInt();
+ m_buttonBoxLayout = QPlatformTheme::themeHint(QPlatformTheme::DialogButtonBoxLayout).toInt();
+ m_buttonBoxLayout = settings.value("buttonbox_layout", m_buttonBoxLayout).toInt();
+ QCoreApplication::setAttribute(Qt::AA_DontShowIconsInMenus, !settings.value("menus_have_icons", true).toBool());
+ m_toolButtonStyle = settings.value("toolbutton_style", Qt::ToolButtonFollowStyle).toInt();
+ m_wheelScrollLines = settings.value("wheel_scroll_lines", 3).toInt();
+
+ //load effects
+ m_uiEffects = QPlatformTheme::themeHint(QPlatformTheme::UiEffects).toInt();
+ if(settings.childKeys().contains("gui_effects"))
+ {
+ QStringList effectList = settings.value("gui_effects").toStringList();
+ m_uiEffects = 0;
+ if(effectList.contains("General"))
+ m_uiEffects |= QPlatformTheme::GeneralUiEffect;
+ if(effectList.contains("AnimateMenu"))
+ m_uiEffects |= QPlatformTheme::AnimateMenuUiEffect;
+ if(effectList.contains("FadeMenu"))
+ m_uiEffects |= QPlatformTheme::FadeMenuUiEffect;
+ if(effectList.contains("AnimateCombo"))
+ m_uiEffects |= QPlatformTheme::AnimateComboUiEffect;
+ if(effectList.contains("AnimateTooltip"))
+ m_uiEffects |= QPlatformTheme::AnimateTooltipUiEffect;
+ if(effectList.contains("FadeTooltip"))
+ m_uiEffects |= QPlatformTheme::FadeTooltipUiEffect;
+ if(effectList.contains("AnimateToolBox"))
+ m_uiEffects |= QPlatformTheme::AnimateToolBoxUiEffect;
+ }
+
+ //load style sheets
+#ifdef QT_WIDGETS_LIB
+ QStringList qssPaths = settings.value("stylesheets").toStringList();
+ m_userStyleSheet = loadStyleSheets(qssPaths);
+#endif
+ settings.endGroup();
+}
+
+#ifdef QT_WIDGETS_LIB
+bool lthemeenginePlatformTheme::hasWidgets()
+{
+ return qobject_cast<QApplication *> (qApp) != nullptr;
+}
+#endif
+
+QString lthemeenginePlatformTheme::loadStyleSheets(const QStringList &paths)
+{
+ QString content;
+ foreach (QString path, paths)
+ {
+ if(!QFile::exists(path))
+ continue;
+
+ QFile file(path);
+ file.open(QIODevice::ReadOnly);
+ content.append(file.readAll());
+ }
+ QRegExp regExp("//.*(\\n|$)");
+ regExp.setMinimal(true);
+ content.remove(regExp);
+ return content;
+}
+
+QPalette lthemeenginePlatformTheme::loadColorScheme(const QString &filePath)
+{
+ QPalette customPalette;
+ QSettings settings(filePath, QSettings::IniFormat);
+ settings.beginGroup("ColorScheme");
+ QStringList activeColors = settings.value("active_colors").toStringList();
+ QStringList inactiveColors = settings.value("inactive_colors").toStringList();
+ QStringList disabledColors = settings.value("disabled_colors").toStringList();
+ settings.endGroup();
+
+ if(activeColors.count() == QPalette::NColorRoles &&
+ inactiveColors.count() == QPalette::NColorRoles &&
+ disabledColors.count() == QPalette::NColorRoles)
+ {
+ for (int i = 0; i < QPalette::NColorRoles; i++)
+ {
+ QPalette::ColorRole role = QPalette::ColorRole(i);
+ customPalette.setColor(QPalette::Active, role, QColor(activeColors.at(i)));
+ customPalette.setColor(QPalette::Inactive, role, QColor(inactiveColors.at(i)));
+ customPalette.setColor(QPalette::Disabled, role, QColor(disabledColors.at(i)));
+ }
+ }
+ else
+ {
+ customPalette = *QPlatformTheme::palette(SystemPalette); //load fallback palette
+ }
+
+ return customPalette;
+}
diff --git a/src-qt5/core/lumina-theme-engine/src/lthemeengine-qtplugin/lthemeengineplatformtheme.h b/src-qt5/core/lumina-theme-engine/src/lthemeengine-qtplugin/lthemeengineplatformtheme.h
new file mode 100644
index 00000000..3996b451
--- /dev/null
+++ b/src-qt5/core/lumina-theme-engine/src/lthemeengine-qtplugin/lthemeengineplatformtheme.h
@@ -0,0 +1,122 @@
+/*
+ * Copyright (c) 2014-2017, Ilya Kotov <forkotov02@hotmail.ru>
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are
+ * met:
+ *
+ * 1. Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ *
+ * 2. Redistributions in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in
+ * the documentation and/or other materials provided with the
+ * distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ * HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+#ifndef LTHEMEENGINEPLATFORMTHEME_H
+#define LTHEMEENGINEPLATFORMTHEME_H
+
+#include <qpa/qplatformtheme.h>
+#include <QObject>
+#include <QFont>
+#include <QPalette>
+#include <QLoggingCategory>
+
+#if (QT_VERSION < QT_VERSION_CHECK(5, 5, 0))
+#ifndef QT_NO_SYSTEMTRAYICON
+#define QT_NO_SYSTEMTRAYICON
+#endif
+#endif
+
+class QPalette;
+#if !defined(QT_NO_DBUS) && !defined(QT_NO_SYSTEMTRAYICON)
+class QPlatformSystemTrayIcon;
+#endif
+
+#if (QT_VERSION >= QT_VERSION_CHECK(5, 7, 0)) && !defined(QT_NO_DBUS)
+class QPlatformMenuBar;
+#endif
+
+class lthemeenginePlatformTheme : public QObject, public QPlatformTheme
+{
+ Q_OBJECT
+public:
+ lthemeenginePlatformTheme();
+
+ virtual ~lthemeenginePlatformTheme();
+
+
+ //virtual QPlatformMenuItem* createPlatformMenuItem() const;
+ //virtual QPlatformMenu* createPlatformMenu() const;
+#if (QT_VERSION >= QT_VERSION_CHECK(5, 7, 0)) && !defined(QT_NO_DBUS)
+ virtual QPlatformMenuBar* createPlatformMenuBar() const;
+#endif
+ //virtual void showPlatformMenuBar() {}
+ //virtual bool usePlatformNativeDialog(DialogType type) const;
+ //virtual QPlatformDialogHelper *createPlatformDialogHelper(DialogType type) const;
+#if !defined(QT_NO_DBUS) && !defined(QT_NO_SYSTEMTRAYICON)
+ virtual QPlatformSystemTrayIcon *createPlatformSystemTrayIcon() const;
+#endif
+ virtual const QPalette *palette(Palette type = SystemPalette) const;
+ virtual const QFont *font(Font type = SystemFont) const;
+ virtual QVariant themeHint(ThemeHint hint) const;
+ //virtual QPixmap standardPixmap(StandardPixmap sp, const QSizeF &size) const;
+ //virtual QPixmap fileIconPixmap(const QFileInfo &fileInfo, const QSizeF &size,
+ // QPlatformTheme::IconOptions iconOptions = 0) const;
+
+ //virtual QIconEngine *createIconEngine(const QString &iconName) const;
+ //virtual QList<QKeySequence> keyBindings(QKeySequence::StandardKey key) const;
+ //virtual QString standardButtonText(int button) const;
+
+private slots:
+ void applySettings();
+#ifdef QT_WIDGETS_LIB
+ void createFSWatcher();
+ void updateSettings();
+#endif
+
+private:
+ void readSettings();
+#ifdef QT_WIDGETS_LIB
+ bool hasWidgets();
+#endif
+ QString loadStyleSheets(const QStringList &paths);
+ QPalette loadColorScheme(const QString &filePath);
+ QString m_style, m_iconTheme, m_userStyleSheet, m_prevStyleSheet;
+ QPalette *m_customPalette = nullptr;
+ QFont m_generalFont, m_fixedFont;
+ int m_doubleClickInterval;
+ int m_cursorFlashTime;
+ int m_uiEffects;
+ int m_buttonBoxLayout;
+ bool m_update = false;
+ bool m_usePalette = true;
+ int m_toolButtonStyle = Qt::ToolButtonFollowStyle;
+ int m_wheelScrollLines = 3;
+#if (QT_VERSION >= QT_VERSION_CHECK(5, 6, 0)) && !defined(QT_NO_DBUS)
+ mutable bool m_dbusGlobalMenuAvailable = false;
+ mutable bool m_checkDBusGlobalMenu = true;
+#endif
+#if !defined(QT_NO_DBUS) && !defined(QT_NO_SYSTEMTRAYICON)
+ mutable bool m_dbusTrayAvailable = false;
+ mutable bool m_checkDBusTray = true;
+#endif
+
+};
+
+Q_DECLARE_LOGGING_CATEGORY(llthemeengine)
+
+#endif // LTHEMEENGINEPLATFORMTHEME_H
diff --git a/src-qt5/core/lumina-theme-engine/src/lthemeengine-qtplugin/main.cpp b/src-qt5/core/lumina-theme-engine/src/lthemeengine-qtplugin/main.cpp
new file mode 100644
index 00000000..37798f70
--- /dev/null
+++ b/src-qt5/core/lumina-theme-engine/src/lthemeengine-qtplugin/main.cpp
@@ -0,0 +1,52 @@
+/*
+ * Copyright (c) 2014-2017, Ilya Kotov <forkotov02@hotmail.ru>
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are
+ * met:
+ *
+ * 1. Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ *
+ * 2. Redistributions in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in
+ * the documentation and/or other materials provided with the
+ * distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ * HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+#include <qpa/qplatformthemeplugin.h>
+#include "lthemeengineplatformtheme.h"
+
+QT_BEGIN_NAMESPACE
+
+class lthemeenginePlatformThemePlugin: public QPlatformThemePlugin
+{
+ Q_OBJECT
+ Q_PLUGIN_METADATA(IID "org.qt-project.Qt.QPA.QPlatformThemeFactoryInterface.5.1" FILE "lthemeengine.json")
+public:
+ QPlatformTheme *create(const QString &key, const QStringList &params);
+};
+
+QPlatformTheme *lthemeenginePlatformThemePlugin::create(const QString &key, const QStringList &params)
+{
+ Q_UNUSED(params);
+ if (key.toLower() == "lthemeengine")
+ return new lthemeenginePlatformTheme();
+ return NULL;
+}
+
+QT_END_NAMESPACE
+
+#include "main.moc"
diff --git a/src-qt5/core/lumina-theme-engine/src/lthemeengine-style/lthemeengine-style.pro b/src-qt5/core/lumina-theme-engine/src/lthemeengine-style/lthemeengine-style.pro
new file mode 100644
index 00000000..0b40de64
--- /dev/null
+++ b/src-qt5/core/lumina-theme-engine/src/lthemeengine-style/lthemeengine-style.pro
@@ -0,0 +1,26 @@
+include(../../lthemeengine.pri)
+
+TEMPLATE = lib
+TARGET = lthemeengine-style
+QT += widgets
+
+# Input
+
+CONFIG += plugin
+
+target.path = $$PLUGINDIR/styles
+INSTALLS += target
+
+INCLUDEPATH += ../
+
+HEADERS += \
+ lthemeengineproxystyle.h \
+ ../lthemeengine/lthemeengine.h
+
+SOURCES += \
+ plugin.cpp \
+ lthemeengineproxystyle.cpp \
+ ../lthemeengine/lthemeengine.cpp
+
+OTHER_FILES += \
+ lthemeengine.json
diff --git a/src-qt5/core/lumina-theme-engine/src/lthemeengine-style/lthemeengine.json b/src-qt5/core/lumina-theme-engine/src/lthemeengine-style/lthemeengine.json
new file mode 100644
index 00000000..e8aae055
--- /dev/null
+++ b/src-qt5/core/lumina-theme-engine/src/lthemeengine-style/lthemeengine.json
@@ -0,0 +1,3 @@
+{
+ "Keys": [ "lthemeengine-style" ]
+}
diff --git a/src-qt5/core/lumina-theme-engine/src/lthemeengine-style/lthemeengineproxystyle.cpp b/src-qt5/core/lumina-theme-engine/src/lthemeengine-style/lthemeengineproxystyle.cpp
new file mode 100644
index 00000000..c9833a30
--- /dev/null
+++ b/src-qt5/core/lumina-theme-engine/src/lthemeengine-style/lthemeengineproxystyle.cpp
@@ -0,0 +1,63 @@
+/*
+ * Copyright (c) 2014-2017, Ilya Kotov <forkotov02@hotmail.ru>
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are
+ * met:
+ *
+ * 1. Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ *
+ * 2. Redistributions in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in
+ * the documentation and/or other materials provided with the
+ * distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ * HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+#include <QSettings>
+#include <lthemeengine/lthemeengine.h>
+#include "lthemeengineproxystyle.h"
+
+lthemeengineProxyStyle::lthemeengineProxyStyle(const QString &key) :
+ QProxyStyle(key)
+{
+ QSettings settings(lthemeengine::configFile(), QSettings::IniFormat);
+ m_dialogButtonsHaveIcons = settings.value("Interface/dialog_buttons_have_icons", Qt::PartiallyChecked).toInt();
+ m_activateItemOnSingleClick = settings.value("Interface/activate_item_on_single_click", Qt::PartiallyChecked).toInt();
+}
+
+lthemeengineProxyStyle::~lthemeengineProxyStyle()
+{
+ //qDebug("%s", Q_FUNC_INFO);
+}
+
+int lthemeengineProxyStyle::styleHint(QStyle::StyleHint hint, const QStyleOption *option, const QWidget *widget, QStyleHintReturn *returnData) const
+{
+ if(hint == QStyle::SH_DialogButtonBox_ButtonsHaveIcons)
+ {
+ if(m_dialogButtonsHaveIcons == Qt::Unchecked)
+ return 0;
+ else if(m_dialogButtonsHaveIcons == Qt::Checked)
+ return 1;
+ }
+ else if(hint == QStyle::QStyle::SH_ItemView_ActivateItemOnSingleClick)
+ {
+ if(m_activateItemOnSingleClick == Qt::Unchecked)
+ return 0;
+ else if(m_activateItemOnSingleClick == Qt::Checked)
+ return 1;
+ }
+ return QProxyStyle::styleHint(hint, option, widget, returnData);
+}
diff --git a/src-qt5/core/lumina-theme-engine/src/lthemeengine-style/lthemeengineproxystyle.h b/src-qt5/core/lumina-theme-engine/src/lthemeengine-style/lthemeengineproxystyle.h
new file mode 100644
index 00000000..47a18099
--- /dev/null
+++ b/src-qt5/core/lumina-theme-engine/src/lthemeengine-style/lthemeengineproxystyle.h
@@ -0,0 +1,50 @@
+/*
+ * Copyright (c) 2014-2017, Ilya Kotov <forkotov02@hotmail.ru>
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are
+ * met:
+ *
+ * 1. Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ *
+ * 2. Redistributions in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in
+ * the documentation and/or other materials provided with the
+ * distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ * HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+#ifndef LTHEMEENGINEPROXYSTYLE_H
+#define LTHEMEENGINEPROXYSTYLE_H
+
+#include <QProxyStyle>
+
+class lthemeengineProxyStyle : public QProxyStyle
+{
+ Q_OBJECT
+public:
+ explicit lthemeengineProxyStyle(const QString &key);
+
+ virtual ~lthemeengineProxyStyle();
+
+ int styleHint(StyleHint hint, const QStyleOption *option, const QWidget *widget, QStyleHintReturn *returnData) const;
+
+private:
+ int m_dialogButtonsHaveIcons;
+ int m_activateItemOnSingleClick;
+
+};
+
+#endif // LTHEMEENGINEPROXYSTYLE_H
diff --git a/src-qt5/core/lumina-theme-engine/src/lthemeengine-style/plugin.cpp b/src-qt5/core/lumina-theme-engine/src/lthemeengine-style/plugin.cpp
new file mode 100644
index 00000000..9d63093e
--- /dev/null
+++ b/src-qt5/core/lumina-theme-engine/src/lthemeengine-style/plugin.cpp
@@ -0,0 +1,57 @@
+/*
+ * Copyright (c) 2014-2017, Ilya Kotov <forkotov02@hotmail.ru>
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are
+ * met:
+ *
+ * 1. Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ *
+ * 2. Redistributions in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in
+ * the documentation and/or other materials provided with the
+ * distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ * HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+#include <QStylePlugin>
+#include <QSettings>
+#include <QStyleFactory>
+#include <lthemeengine/lthemeengine.h>
+#include "lthemeengineproxystyle.h"
+
+class lthemeengineStylePlugin : public QStylePlugin
+{
+ Q_OBJECT
+ Q_PLUGIN_METADATA(IID "org.qt-project.Qt.QStyleFactoryInterface" FILE "lthemeengine.json")
+
+public:
+ QStyle *create(const QString &key);
+};
+
+QStyle *lthemeengineStylePlugin::create(const QString &key)
+{
+ if (key == "lthemeengine-style")
+ {
+ QSettings settings(lthemeengine::configFile(), QSettings::IniFormat);
+ QString style = settings.value("Appearance/style", "Fusion").toString();
+ if(key == style || !QStyleFactory::keys().contains(style))
+ style = "Fusion";
+ return new lthemeengineProxyStyle(style);
+ }
+ return 0;
+}
+
+#include "plugin.moc"
diff --git a/src-qt5/core/lumina-theme-engine/src/lthemeengine/appearancepage.cpp b/src-qt5/core/lumina-theme-engine/src/lthemeengine/appearancepage.cpp
new file mode 100644
index 00000000..b9175d6e
--- /dev/null
+++ b/src-qt5/core/lumina-theme-engine/src/lthemeengine/appearancepage.cpp
@@ -0,0 +1,418 @@
+/*
+ * Copyright (c) 2014-2017, Ilya Kotov <forkotov02@hotmail.ru>
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are
+ * met:
+ *
+ * 1. Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ *
+ * 2. Redistributions in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in
+ * the documentation and/or other materials provided with the
+ * distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ * HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+#include <QStyleFactory>
+#include <QMdiSubWindow>
+#include <QSettings>
+#include <QDir>
+#include <QInputDialog>
+#include <QMessageBox>
+#include <QMenu>
+#include <QIcon>
+#include "lthemeengine.h"
+#include "appearancepage.h"
+#include "paletteeditdialog.h"
+#include "ui_appearancepage.h"
+#include "ui_previewform.h"
+
+AppearancePage::AppearancePage(QWidget *parent) :
+ TabPage(parent),
+ m_ui(new Ui::AppearancePage)
+{
+ m_ui->setupUi(this);
+ QStringList keys = QStyleFactory::keys();
+ keys.removeAll("lthemeengine-style"); //hide lthemeengine proxy style
+ m_ui->styleComboBox->addItems(keys);
+
+ connect(m_ui->paletteComboBox, SIGNAL(activated(int)), SLOT(updatePalette()));
+ connect(m_ui->customPaletteButton, SIGNAL(clicked()), SLOT(updatePalette()));
+ connect(m_ui->defaultPaletteButton, SIGNAL(clicked()), SLOT(updatePalette()));
+
+ m_previewWidget = new QWidget(this);
+ m_previewUi = new Ui::PreviewForm();
+ m_previewUi->setupUi(m_previewWidget);
+ QMdiSubWindow *w = m_ui->mdiArea->addSubWindow(m_previewWidget, Qt::CustomizeWindowHint
+ | Qt::WindowMinMaxButtonsHint
+ | Qt::WindowTitleHint);
+ w->move(10, 10);
+
+ QMenu *menu = new QMenu(this);
+ menu->addAction(QIcon::fromTheme("list-add"), tr("Create"), this, SLOT(createColorScheme()));
+ m_changeColorSchemeAction = menu->addAction(tr("Edit"), this, SLOT(changeColorScheme()));
+ menu->addAction(tr("Create a Copy"), this, SLOT(copyColorScheme()));
+ m_renameColorSchemeAction = menu->addAction(tr("Rename"), this, SLOT(renameColorScheme()));
+ menu->addSeparator();
+ m_removeColorSchemeAction = menu->addAction(tr("Remove"), this, SLOT(removeColorScheme()));
+ m_ui->colorSchemeButton->setMenu(menu);
+
+ m_changeColorSchemeAction->setIcon(QIcon::fromTheme("accessories-text-editor"));
+ m_removeColorSchemeAction->setIcon(QIcon::fromTheme("list-remove"));
+ connect(menu, SIGNAL(aboutToShow()), SLOT(updateActions()));
+
+ readSettings();
+}
+
+AppearancePage::~AppearancePage()
+{
+ if(m_selectedStyle)
+ delete m_selectedStyle;
+ delete m_ui;
+ delete m_previewUi;
+}
+
+void AppearancePage::writeSettings()
+{
+ QSettings settings(lthemeengine::configFile(), QSettings::IniFormat);
+ settings.beginGroup("Appearance");
+ settings.setValue("style", m_ui->styleComboBox->currentText());
+ settings.setValue("custom_palette", m_ui->customPaletteButton->isChecked());
+ settings.setValue("color_scheme_path", m_ui->colorSchemeComboBox->currentData().toString());
+ settings.endGroup();
+}
+
+void AppearancePage::on_styleComboBox_activated(const QString &text)
+{
+ QStyle *style = QStyleFactory::create(text);
+ if(!style)
+ return;
+ setStyle(m_previewWidget, style);
+
+ if(m_selectedStyle)
+ delete m_selectedStyle;
+ m_selectedStyle = style;
+
+ updatePalette();
+}
+
+void AppearancePage::on_colorSchemeComboBox_activated(int)
+{
+ m_customPalette = loadColorScheme(m_ui->colorSchemeComboBox->currentData().toString());
+ updatePalette();
+}
+
+void AppearancePage::createColorScheme()
+{
+ QString name = QInputDialog::getText(this, tr("Enter Color Scheme Name"), tr("File name:"));
+ if(name.isEmpty())
+ return;
+
+ if(!name.endsWith(".conf", Qt::CaseInsensitive))
+ name.append(".conf");
+
+ if(m_ui->colorSchemeComboBox->findText(name.section('.',0,0)) != -1)
+ {
+ QMessageBox::warning(this, tr("Error"), tr("The color scheme \"%1\" already exists")
+ .arg(name.section('.',0,0)));
+ return;
+ }
+
+ QString schemePath = lthemeengine::userColorSchemePath() + "/" + name;
+
+ createColorScheme(schemePath, palette());
+ m_ui->colorSchemeComboBox->addItem(name.section('.',0,0), schemePath);
+}
+
+void AppearancePage::changeColorScheme()
+{
+ if(m_ui->colorSchemeComboBox->currentIndex() < 0)
+ return;
+
+ if(!QFileInfo(m_ui->colorSchemeComboBox->currentData().toString()).isWritable())
+ {
+ QMessageBox::information(this, tr("Warning"), tr("The color scheme \"%1\" is read only")
+ .arg(m_ui->colorSchemeComboBox->currentText()));
+ return;
+ }
+
+ PaletteEditDialog d(m_customPalette, m_selectedStyle, this);
+ connect(&d, SIGNAL(paletteChanged(QPalette)), SLOT(setPreviewPalette(QPalette)));
+ if(d.exec() == QDialog::Accepted)
+ {
+ m_customPalette = d.selectedPalette();
+ createColorScheme(m_ui->colorSchemeComboBox->currentData().toString(), m_customPalette);
+ }
+ updatePalette();
+}
+
+void AppearancePage::removeColorScheme()
+{
+ int index = m_ui->colorSchemeComboBox->currentIndex();
+ if(index < 0 || m_ui->colorSchemeComboBox->count() <= 1)
+ return;
+
+ if(!QFileInfo(m_ui->colorSchemeComboBox->currentData().toString()).isWritable())
+ {
+ QMessageBox::information(this, tr("Warning"), tr("The color scheme \"%1\" is read only")
+ .arg(m_ui->colorSchemeComboBox->currentText()));
+ return;
+ }
+
+ int button = QMessageBox::question(this, tr("Confirm Remove"),
+ tr("Are you sure you want to remove color scheme \"%1\"?")
+ .arg(m_ui->colorSchemeComboBox->currentText()),
+ QMessageBox::Yes | QMessageBox::No);
+ if(button != QMessageBox::Yes)
+ return;
+
+ if(QFile::remove(m_ui->colorSchemeComboBox->currentData().toString()))
+ {
+ m_ui->colorSchemeComboBox->removeItem(index);
+ on_colorSchemeComboBox_activated(0);
+ }
+}
+
+void AppearancePage::copyColorScheme()
+{
+ if(m_ui->colorSchemeComboBox->currentIndex() < 0)
+ return;
+
+ QString name = QInputDialog::getText(this, tr("Enter Color Scheme Name"), tr("File name:"),
+ QLineEdit::Normal,
+ tr("%1 (copy)").arg(m_ui->colorSchemeComboBox->currentText()));
+ if(name.isEmpty() || name == m_ui->colorSchemeComboBox->currentText())
+ return;
+
+ if(!name.endsWith(".conf", Qt::CaseInsensitive))
+ name.append(".conf");
+
+ if(m_ui->colorSchemeComboBox->findText(name.section('.',0,0)) != -1)
+ {
+ QMessageBox::warning(this, tr("Error"), tr("The color scheme \"%1\" already exists")
+ .arg(name.section('.',0,0)));
+ return;
+ }
+
+ QString newPath = lthemeengine::userColorSchemePath() + "/" + name;
+ QFile::copy(m_ui->colorSchemeComboBox->currentData().toString(), newPath);
+ m_ui->colorSchemeComboBox->addItem(name.section('.',0,0), newPath);
+}
+
+void AppearancePage::renameColorScheme()
+{
+ int index = m_ui->colorSchemeComboBox->currentIndex();
+
+ if(index < 0)
+ return;
+
+ if(!QFileInfo(m_ui->colorSchemeComboBox->currentData().toString()).isWritable())
+ {
+ QMessageBox::information(this, tr("Warning"), tr("The color scheme \"%1\" is read only")
+ .arg(m_ui->colorSchemeComboBox->currentText()));
+ return;
+ }
+
+ QString name = QInputDialog::getText(this, tr("Enter Color Scheme Name"), tr("File name:"),
+ QLineEdit::Normal, m_ui->colorSchemeComboBox->currentText());
+ if(name.isEmpty() || name == m_ui->colorSchemeComboBox->currentText())
+ return;
+
+ if(!name.endsWith(".conf", Qt::CaseInsensitive))
+ name.append(".conf");
+
+ if(m_ui->colorSchemeComboBox->findText(name.section('.',0,0)) != -1)
+ {
+ QMessageBox::warning(this, tr("Error"), tr("The color scheme \"%1\" already exists")
+ .arg(name.section('.',0,0)));
+ return;
+ }
+
+ QString newPath = lthemeengine::userColorSchemePath() + "/" + name;
+ QFile::rename(m_ui->colorSchemeComboBox->currentData().toString(), newPath);
+ m_ui->colorSchemeComboBox->setItemText(index, name.section('.',0,0));
+ m_ui->colorSchemeComboBox->setItemData(index, newPath);
+}
+
+void AppearancePage::updatePalette()
+{
+ if(!m_selectedStyle)
+ return;
+
+ setPreviewPalette(m_ui->customPaletteButton->isChecked() ?
+ m_customPalette : m_selectedStyle->standardPalette());
+}
+
+void AppearancePage::setPreviewPalette(const QPalette &p)
+{
+ QPalette previewPalette = palette();
+
+ QPalette::ColorGroup colorGroup = QPalette::Disabled;
+
+ if(m_ui->paletteComboBox->currentIndex() == 0)
+ {
+ colorGroup = QPalette::Active;
+ }
+ else if(m_ui->paletteComboBox->currentIndex() == 1)
+ {
+ colorGroup = QPalette::Inactive;
+ }
+
+ for (int i = 0; i < QPalette::NColorRoles; i++)
+ {
+ QPalette::ColorRole role = QPalette::ColorRole(i);
+ previewPalette.setColor(QPalette::Active, role, p.color(colorGroup, role));
+ previewPalette.setColor(QPalette::Inactive, role, p.color(colorGroup, role));
+ }
+
+ setPalette(m_ui->mdiArea, previewPalette);
+}
+
+void AppearancePage::updateActions()
+{
+ if(m_ui->colorSchemeComboBox->count() == 0 ||
+ !QFileInfo(m_ui->colorSchemeComboBox->currentData().toString()).isWritable())
+ {
+ m_changeColorSchemeAction->setVisible(false);
+ m_renameColorSchemeAction->setVisible(false);
+ m_removeColorSchemeAction->setVisible(false);
+ }
+ else
+ {
+ m_changeColorSchemeAction->setVisible(true);
+ m_renameColorSchemeAction->setVisible(true);
+ m_removeColorSchemeAction->setVisible(m_ui->colorSchemeComboBox->count() > 1);
+ }
+}
+
+void AppearancePage::readSettings()
+{
+ QSettings settings(lthemeengine::configFile(), QSettings::IniFormat);
+ settings.beginGroup("Appearance");
+ QString style = settings.value("style", "Fusion").toString();
+ m_ui->styleComboBox->setCurrentText(style);
+
+ m_ui->customPaletteButton->setChecked(settings.value("custom_palette", false).toBool());
+ QString colorSchemePath = settings.value("color_scheme_path").toString();
+
+ QDir("/").mkpath(lthemeengine::userColorSchemePath());
+ findColorSchemes(lthemeengine::userColorSchemePath());
+ findColorSchemes(lthemeengine::sharedColorSchemePath().join(", "));
+
+ if(m_ui->colorSchemeComboBox->count() == 0)
+ {
+ m_customPalette = palette(); //load fallback palette
+ }
+ else
+ {
+ int index = m_ui->colorSchemeComboBox->findData(colorSchemePath);
+ if(index >= 0)
+ m_ui->colorSchemeComboBox->setCurrentIndex(index);
+ m_customPalette = loadColorScheme(m_ui->colorSchemeComboBox->currentData().toString());
+ }
+
+ on_styleComboBox_activated(m_ui->styleComboBox->currentText());
+
+ settings.endGroup();
+}
+
+void AppearancePage::setStyle(QWidget *w, QStyle *s)
+{
+ foreach (QObject *o, w->children())
+ {
+ if(o->isWidgetType())
+ {
+ setStyle(qobject_cast<QWidget *>(o), s);
+ }
+ }
+ w->setStyle(s);
+}
+
+void AppearancePage::setPalette(QWidget *w, QPalette p)
+{
+ foreach (QObject *o, w->children())
+ {
+ if(o->isWidgetType())
+ {
+ setPalette(qobject_cast<QWidget *>(o), p);
+ }
+ }
+ w->setPalette(p);
+}
+
+void AppearancePage::findColorSchemes(const QString &path)
+{
+ QDir dir(path);
+ dir.setFilter(QDir::Files);
+ dir.setNameFilters(QStringList() << "*.conf");
+
+ foreach (QFileInfo info, dir.entryInfoList())
+ {
+ m_ui->colorSchemeComboBox->addItem(info.baseName(), info.filePath());
+ }
+}
+
+QPalette AppearancePage::loadColorScheme(const QString &filePath)
+{
+ QPalette customPalette;
+ QSettings settings(filePath, QSettings::IniFormat);
+ settings.beginGroup("ColorScheme");
+ QStringList activeColors = settings.value("active_colors").toStringList();
+ QStringList inactiveColors = settings.value("inactive_colors").toStringList();
+ QStringList disabledColors = settings.value("disabled_colors").toStringList();
+ settings.endGroup();
+
+ if(activeColors.count() == QPalette::NColorRoles &&
+ inactiveColors.count() == QPalette::NColorRoles &&
+ disabledColors.count() == QPalette::NColorRoles)
+ {
+ for (int i = 0; i < QPalette::NColorRoles; i++)
+ {
+ QPalette::ColorRole role = QPalette::ColorRole(i);
+ customPalette.setColor(QPalette::Active, role, QColor(activeColors.at(i)));
+ customPalette.setColor(QPalette::Inactive, role, QColor(inactiveColors.at(i)));
+ customPalette.setColor(QPalette::Disabled, role, QColor(disabledColors.at(i)));
+ }
+ }
+ else
+ {
+ customPalette = palette(); //load fallback palette
+ }
+
+ return customPalette;
+}
+
+void AppearancePage::createColorScheme(const QString &name, const QPalette &palette)
+{
+ QSettings settings(name, QSettings::IniFormat);
+ settings.beginGroup("ColorScheme");
+
+ QStringList activeColors, inactiveColors, disabledColors;
+ for (int i = 0; i < QPalette::NColorRoles; i++)
+ {
+ QPalette::ColorRole role = QPalette::ColorRole(i);
+ activeColors << palette.color(QPalette::Active, role).name();
+ inactiveColors << palette.color(QPalette::Inactive, role).name();
+ disabledColors << palette.color(QPalette::Disabled, role).name();
+ }
+
+ settings.setValue("active_colors",activeColors);
+ settings.setValue("inactive_colors",inactiveColors);
+ settings.setValue("disabled_colors",disabledColors);
+
+ settings.endGroup();
+
+}
diff --git a/src-qt5/core/lumina-theme-engine/src/lthemeengine/appearancepage.h b/src-qt5/core/lumina-theme-engine/src/lthemeengine/appearancepage.h
new file mode 100644
index 00000000..3a7752c7
--- /dev/null
+++ b/src-qt5/core/lumina-theme-engine/src/lthemeengine/appearancepage.h
@@ -0,0 +1,79 @@
+/*
+ * Copyright (c) 2014-2017, Ilya Kotov <forkotov02@hotmail.ru>
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are
+ * met:
+ *
+ * 1. Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ *
+ * 2. Redistributions in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in
+ * the documentation and/or other materials provided with the
+ * distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ * HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+#ifndef APPEARANCEPAGE_H
+#define APPEARANCEPAGE_H
+
+#include "tabpage.h"
+
+namespace Ui {
+class AppearancePage;
+class PreviewForm;
+}
+
+class QStyle;
+class QAction;
+
+class AppearancePage : public TabPage
+{
+ Q_OBJECT
+
+public:
+ explicit AppearancePage(QWidget *parent = 0);
+ ~AppearancePage();
+
+ void writeSettings();
+
+private slots:
+ void on_styleComboBox_activated(const QString &text);
+ void on_colorSchemeComboBox_activated(int);
+ void createColorScheme();
+ void changeColorScheme();
+ void removeColorScheme();
+ void copyColorScheme();
+ void renameColorScheme();
+ void updatePalette();
+ void setPreviewPalette(const QPalette &p);
+ void updateActions();
+
+private:
+ void readSettings();
+ void setStyle(QWidget *w, QStyle *s);
+ void setPalette(QWidget *w, QPalette p);
+ void findColorSchemes(const QString &path);
+ QPalette loadColorScheme(const QString &filePath);
+ void createColorScheme(const QString &name, const QPalette &palette);
+ Ui::AppearancePage *m_ui;
+ QStyle *m_selectedStyle = nullptr;
+ QPalette m_customPalette;
+ QWidget *m_previewWidget;
+ QAction *m_changeColorSchemeAction, *m_renameColorSchemeAction, *m_removeColorSchemeAction;
+ Ui::PreviewForm *m_previewUi;
+};
+
+#endif // APPEARANCEPAGE_H
diff --git a/src-qt5/core/lumina-theme-engine/src/lthemeengine/appearancepage.ui b/src-qt5/core/lumina-theme-engine/src/lthemeengine/appearancepage.ui
new file mode 100644
index 00000000..cd442930
--- /dev/null
+++ b/src-qt5/core/lumina-theme-engine/src/lthemeengine/appearancepage.ui
@@ -0,0 +1,243 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<ui version="4.0">
+ <class>AppearancePage</class>
+ <widget class="QWidget" name="AppearancePage">
+ <property name="geometry">
+ <rect>
+ <x>0</x>
+ <y>0</y>
+ <width>596</width>
+ <height>470</height>
+ </rect>
+ </property>
+ <property name="windowTitle">
+ <string notr="true">Form</string>
+ </property>
+ <layout class="QGridLayout" name="gridLayout_4">
+ <item row="0" column="0">
+ <widget class="QLabel" name="label">
+ <property name="text">
+ <string>Style:</string>
+ </property>
+ </widget>
+ </item>
+ <item row="3" column="0" colspan="3">
+ <widget class="QGroupBox" name="groupBox">
+ <property name="title">
+ <string>Preview</string>
+ </property>
+ <layout class="QGridLayout" name="gridLayout">
+ <item row="0" column="0">
+ <widget class="QComboBox" name="paletteComboBox">
+ <item>
+ <property name="text">
+ <string>Active palette</string>
+ </property>
+ </item>
+ <item>
+ <property name="text">
+ <string>Inactive palette</string>
+ </property>
+ </item>
+ <item>
+ <property name="text">
+ <string>Disabled palette</string>
+ </property>
+ </item>
+ </widget>
+ </item>
+ <item row="0" column="1">
+ <spacer name="horizontalSpacer_2">
+ <property name="orientation">
+ <enum>Qt::Horizontal</enum>
+ </property>
+ <property name="sizeHint" stdset="0">
+ <size>
+ <width>82</width>
+ <height>20</height>
+ </size>
+ </property>
+ </spacer>
+ </item>
+ <item row="1" column="0" colspan="2">
+ <widget class="QMdiArea" name="mdiArea">
+ <property name="tabsMovable">
+ <bool>false</bool>
+ </property>
+ </widget>
+ </item>
+ </layout>
+ </widget>
+ </item>
+ <item row="0" column="1">
+ <widget class="QComboBox" name="styleComboBox"/>
+ </item>
+ <item row="0" column="2">
+ <spacer name="horizontalSpacer">
+ <property name="orientation">
+ <enum>Qt::Horizontal</enum>
+ </property>
+ <property name="sizeHint" stdset="0">
+ <size>
+ <width>40</width>
+ <height>20</height>
+ </size>
+ </property>
+ </spacer>
+ </item>
+ <item row="2" column="0" colspan="3">
+ <widget class="QGroupBox" name="paletteGroupBox">
+ <property name="title">
+ <string>Palette</string>
+ </property>
+ <layout class="QVBoxLayout" name="_2">
+ <item>
+ <layout class="QHBoxLayout" name="horizontalLayout">
+ <property name="spacing">
+ <number>6</number>
+ </property>
+ <item>
+ <widget class="QRadioButton" name="defaultPaletteButton">
+ <property name="text">
+ <string>Default</string>
+ </property>
+ <property name="checked">
+ <bool>true</bool>
+ </property>
+ </widget>
+ </item>
+ <item>
+ <widget class="QRadioButton" name="customPaletteButton">
+ <property name="text">
+ <string>Custom</string>
+ </property>
+ </widget>
+ </item>
+ <item>
+ <spacer name="horizontalSpacer_3">
+ <property name="orientation">
+ <enum>Qt::Horizontal</enum>
+ </property>
+ <property name="sizeHint" stdset="0">
+ <size>
+ <width>230</width>
+ <height>20</height>
+ </size>
+ </property>
+ </spacer>
+ </item>
+ </layout>
+ </item>
+ <item>
+ <layout class="QHBoxLayout" name="horizontalLayout_2">
+ <item>
+ <widget class="QLabel" name="colorScheeLabel">
+ <property name="enabled">
+ <bool>false</bool>
+ </property>
+ <property name="text">
+ <string>Color scheme:</string>
+ </property>
+ </widget>
+ </item>
+ <item>
+ <widget class="QComboBox" name="colorSchemeComboBox">
+ <property name="enabled">
+ <bool>false</bool>
+ </property>
+ <property name="minimumSize">
+ <size>
+ <width>150</width>
+ <height>0</height>
+ </size>
+ </property>
+ </widget>
+ </item>
+ <item>
+ <widget class="QToolButton" name="colorSchemeButton">
+ <property name="enabled">
+ <bool>false</bool>
+ </property>
+ <property name="text">
+ <string>...</string>
+ </property>
+ <property name="popupMode">
+ <enum>QToolButton::InstantPopup</enum>
+ </property>
+ <property name="arrowType">
+ <enum>Qt::NoArrow</enum>
+ </property>
+ </widget>
+ </item>
+ <item>
+ <spacer name="horizontalSpacer_4">
+ <property name="orientation">
+ <enum>Qt::Horizontal</enum>
+ </property>
+ <property name="sizeHint" stdset="0">
+ <size>
+ <width>40</width>
+ <height>20</height>
+ </size>
+ </property>
+ </spacer>
+ </item>
+ </layout>
+ </item>
+ </layout>
+ </widget>
+ </item>
+ </layout>
+ </widget>
+ <resources/>
+ <connections>
+ <connection>
+ <sender>customPaletteButton</sender>
+ <signal>toggled(bool)</signal>
+ <receiver>colorScheeLabel</receiver>
+ <slot>setEnabled(bool)</slot>
+ <hints>
+ <hint type="sourcelabel">
+ <x>160</x>
+ <y>79</y>
+ </hint>
+ <hint type="destinationlabel">
+ <x>77</x>
+ <y>104</y>
+ </hint>
+ </hints>
+ </connection>
+ <connection>
+ <sender>customPaletteButton</sender>
+ <signal>toggled(bool)</signal>
+ <receiver>colorSchemeComboBox</receiver>
+ <slot>setEnabled(bool)</slot>
+ <hints>
+ <hint type="sourcelabel">
+ <x>144</x>
+ <y>75</y>
+ </hint>
+ <hint type="destinationlabel">
+ <x>146</x>
+ <y>100</y>
+ </hint>
+ </hints>
+ </connection>
+ <connection>
+ <sender>customPaletteButton</sender>
+ <signal>toggled(bool)</signal>
+ <receiver>colorSchemeButton</receiver>
+ <slot>setEnabled(bool)</slot>
+ <hints>
+ <hint type="sourcelabel">
+ <x>177</x>
+ <y>78</y>
+ </hint>
+ <hint type="destinationlabel">
+ <x>288</x>
+ <y>116</y>
+ </hint>
+ </hints>
+ </connection>
+ </connections>
+</ui>
diff --git a/src-qt5/core/lumina-theme-engine/src/lthemeengine/fontconfigdialog.cpp b/src-qt5/core/lumina-theme-engine/src/lthemeengine/fontconfigdialog.cpp
new file mode 100644
index 00000000..398a2436
--- /dev/null
+++ b/src-qt5/core/lumina-theme-engine/src/lthemeengine/fontconfigdialog.cpp
@@ -0,0 +1,138 @@
+/*
+ * Copyright (c) 2014-2017, Ilya Kotov <forkotov02@hotmail.ru>
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are
+ * met:
+ *
+ * 1. Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ *
+ * 2. Redistributions in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in
+ * the documentation and/or other materials provided with the
+ * distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ * HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+#include <QXmlStreamWriter>
+#include <QFile>
+#include <QDir>
+#include <QMessageBox>
+#include "fontconfigdialog.h"
+#include "ui_fontconfigdialog.h"
+
+FontConfigDialog::FontConfigDialog(QWidget *parent) :
+ QDialog(parent),
+ m_ui(new Ui::FontConfigDialog)
+{
+ m_ui->setupUi(this);
+
+ m_ui->hintingStyleComboBox->addItem(tr("None"), "hintnone");
+ m_ui->hintingStyleComboBox->addItem(tr("Slight"), "hintslight");
+ m_ui->hintingStyleComboBox->addItem(tr("Medium"), "hintmedium");
+ m_ui->hintingStyleComboBox->addItem(tr("Full"), "hintfull");
+
+ m_ui->rgbaComboBox->addItem(tr("None"), "none");
+ m_ui->rgbaComboBox->addItem("rgb", "rgb");
+ m_ui->rgbaComboBox->addItem("bgr", "bgr");
+ m_ui->rgbaComboBox->addItem("vrgb", "vrgb");
+ m_ui->rgbaComboBox->addItem("vbgr", "vbgr");
+
+ m_ui->lcdFilterComboBox->addItem("lcdnone");
+ m_ui->lcdFilterComboBox->addItem("lcddefault");
+ m_ui->lcdFilterComboBox->addItem("lcdlight");
+ m_ui->lcdFilterComboBox->addItem("lcdlegacy");
+}
+
+FontConfigDialog::~FontConfigDialog()
+{
+ delete m_ui;
+}
+
+void FontConfigDialog::accept()
+{
+ QDir::home().mkpath(".config/fontconfig/");
+ QString path = QDir::homePath() + "/.config/fontconfig/fonts.conf";
+ qDebug("FontConfigDialog: fontconfig path: %s", qPrintable(path));
+
+
+ if(QFile::exists(path))
+ {
+ if(QMessageBox::question(this, tr("Font Configuration"),
+ tr("<i>%1</i> already exists. Do you want to replace it?").arg(path),
+ QMessageBox::Yes | QMessageBox::No) == QMessageBox::No)
+ {
+ QDialog::reject();
+ return;
+ }
+
+ QFile::remove(path + ".back");
+ QFile::copy(path, path + ".back");
+ }
+
+ QFile file(path);
+ if(!file.open(QIODevice::WriteOnly))
+ {
+ qWarning("FontConfigDialog: unable to open file: %s", qPrintable(file.errorString()));
+ return;
+ }
+
+ QXmlStreamWriter stream(&file);
+ stream.setAutoFormatting(true);
+
+ stream.writeStartDocument();
+ stream.writeDTD("<!DOCTYPE fontconfig SYSTEM \"fonts.dtd\">");
+ stream.writeStartElement("fontconfig");
+
+ stream.writeStartElement("match");
+ stream.writeAttribute("target", "font");
+ writeOption(&stream, "antialias", "bool", m_ui->antialisingCheckBox->isChecked() ? "true" : "false");
+ writeOption(&stream, "hinting", "bool", m_ui->hintingCheckBox->isChecked() ? "true" : "false");
+ writeOption(&stream, "hintstyle", "const", m_ui->hintingStyleComboBox->currentData().toString());
+ writeOption(&stream, "rgba", "const", m_ui->rgbaComboBox->currentData().toString());
+ writeOption(&stream, "autohint", "bool", m_ui->autohinterCheckBox->isChecked() ? "true" : "false");
+ writeOption(&stream, "lcdfilter", "const", m_ui->lcdFilterComboBox->currentText());
+ writeOption(&stream, "dpi", "double", QString::number(m_ui->dpiSpinBox->value()));
+ stream.writeEndElement();
+
+ if(m_ui->disableBoldAutohintCheckBox->isChecked())
+ {
+ stream.writeStartElement("match");
+ stream.writeAttribute("target", "font");
+
+ stream.writeStartElement("test");
+ stream.writeAttribute("name", "weight");
+ stream.writeAttribute("compare", "more");
+ stream.writeTextElement("const", "medium");
+ stream.writeEndElement();
+
+ writeOption(&stream, "autohint", "bool", m_ui->autohinterCheckBox->isChecked() ? "true" : "false");
+
+ stream.writeEndElement();
+ }
+ stream.writeEndElement();
+ stream.writeEndDocument();
+
+ QDialog::accept();
+}
+
+void FontConfigDialog::writeOption(QXmlStreamWriter *stream, const QString &name, const QString &type, const QString &value)
+{
+ stream->writeStartElement("edit");
+ stream->writeAttribute("name", name);
+ stream->writeAttribute("mode", "assign");
+ stream->writeTextElement(type, value);
+ stream->writeEndElement();
+}
diff --git a/src-qt5/core/lumina-theme-engine/src/lthemeengine/fontconfigdialog.h b/src-qt5/core/lumina-theme-engine/src/lthemeengine/fontconfigdialog.h
new file mode 100644
index 00000000..5b7e31a5
--- /dev/null
+++ b/src-qt5/core/lumina-theme-engine/src/lthemeengine/fontconfigdialog.h
@@ -0,0 +1,56 @@
+/*
+ * Copyright (c) 2014-2017, Ilya Kotov <forkotov02@hotmail.ru>
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are
+ * met:
+ *
+ * 1. Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ *
+ * 2. Redistributions in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in
+ * the documentation and/or other materials provided with the
+ * distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ * HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+#ifndef FONTCONFIGDIALOG_H
+#define FONTCONFIGDIALOG_H
+
+#include <QDialog>
+
+namespace Ui {
+class FontConfigDialog;
+}
+
+class QXmlStreamWriter;
+
+class FontConfigDialog : public QDialog
+{
+ Q_OBJECT
+
+public:
+ explicit FontConfigDialog(QWidget *parent = 0);
+ ~FontConfigDialog();
+
+public slots:
+ void accept();
+ void writeOption(QXmlStreamWriter *stream, const QString &name, const QString &type, const QString &value);
+
+private:
+ Ui::FontConfigDialog *m_ui;
+};
+
+#endif // FONTCONFIGDIALOG_H
diff --git a/src-qt5/core/lumina-theme-engine/src/lthemeengine/fontconfigdialog.ui b/src-qt5/core/lumina-theme-engine/src/lthemeengine/fontconfigdialog.ui
new file mode 100644
index 00000000..a557695f
--- /dev/null
+++ b/src-qt5/core/lumina-theme-engine/src/lthemeengine/fontconfigdialog.ui
@@ -0,0 +1,160 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<ui version="4.0">
+ <class>FontConfigDialog</class>
+ <widget class="QDialog" name="FontConfigDialog">
+ <property name="geometry">
+ <rect>
+ <x>0</x>
+ <y>0</y>
+ <width>349</width>
+ <height>286</height>
+ </rect>
+ </property>
+ <property name="windowTitle">
+ <string>Font Configuration</string>
+ </property>
+ <layout class="QGridLayout" name="gridLayout">
+ <property name="leftMargin">
+ <number>6</number>
+ </property>
+ <property name="rightMargin">
+ <number>6</number>
+ </property>
+ <property name="bottomMargin">
+ <number>6</number>
+ </property>
+ <item row="5" column="0" colspan="2">
+ <widget class="QCheckBox" name="disableBoldAutohintCheckBox">
+ <property name="text">
+ <string>Disable automatic hinting for bold fonts</string>
+ </property>
+ </widget>
+ </item>
+ <item row="6" column="0">
+ <widget class="QLabel" name="label_3">
+ <property name="text">
+ <string>LCD filter:</string>
+ </property>
+ </widget>
+ </item>
+ <item row="4" column="0" colspan="2">
+ <widget class="QCheckBox" name="autohinterCheckBox">
+ <property name="text">
+ <string>Automatic hinting</string>
+ </property>
+ </widget>
+ </item>
+ <item row="1" column="0" colspan="2">
+ <widget class="QCheckBox" name="hintingCheckBox">
+ <property name="text">
+ <string>Hinting</string>
+ </property>
+ </widget>
+ </item>
+ <item row="8" column="0" colspan="2">
+ <widget class="QDialogButtonBox" name="buttonBox">
+ <property name="orientation">
+ <enum>Qt::Horizontal</enum>
+ </property>
+ <property name="standardButtons">
+ <set>QDialogButtonBox::Cancel|QDialogButtonBox::Ok</set>
+ </property>
+ </widget>
+ </item>
+ <item row="7" column="0">
+ <widget class="QLabel" name="label_4">
+ <property name="text">
+ <string>Font resolution:</string>
+ </property>
+ </widget>
+ </item>
+ <item row="6" column="1">
+ <widget class="QComboBox" name="lcdFilterComboBox"/>
+ </item>
+ <item row="3" column="1">
+ <widget class="QComboBox" name="rgbaComboBox"/>
+ </item>
+ <item row="2" column="1">
+ <widget class="QComboBox" name="hintingStyleComboBox"/>
+ </item>
+ <item row="3" column="0">
+ <widget class="QLabel" name="label_2">
+ <property name="text">
+ <string>Subpixel geometry:</string>
+ </property>
+ </widget>
+ </item>
+ <item row="0" column="0" colspan="2">
+ <widget class="QCheckBox" name="antialisingCheckBox">
+ <property name="text">
+ <string>Antialiasing</string>
+ </property>
+ </widget>
+ </item>
+ <item row="2" column="0">
+ <widget class="QLabel" name="label">
+ <property name="text">
+ <string>Hinting style:</string>
+ </property>
+ </widget>
+ </item>
+ <item row="7" column="1">
+ <widget class="QSpinBox" name="dpiSpinBox">
+ <property name="sizePolicy">
+ <sizepolicy hsizetype="Expanding" vsizetype="Fixed">
+ <horstretch>0</horstretch>
+ <verstretch>0</verstretch>
+ </sizepolicy>
+ </property>
+ <property name="suffix">
+ <string> dpi</string>
+ </property>
+ <property name="minimum">
+ <number>80</number>
+ </property>
+ <property name="maximum">
+ <number>180</number>
+ </property>
+ <property name="value">
+ <number>102</number>
+ </property>
+ </widget>
+ </item>
+ </layout>
+ </widget>
+ <resources/>
+ <connections>
+ <connection>
+ <sender>buttonBox</sender>
+ <signal>accepted()</signal>
+ <receiver>FontConfigDialog</receiver>
+ <slot>accept()</slot>
+ <hints>
+ <hint type="sourcelabel">
+ <x>248</x>
+ <y>254</y>
+ </hint>
+ <hint type="destinationlabel">
+ <x>157</x>
+ <y>274</y>
+ </hint>
+ </hints>
+ </connection>
+ <connection>
+ <sender>buttonBox</sender>
+ <signal>rejected()</signal>
+ <receiver>FontConfigDialog</receiver>
+ <slot>reject()</slot>
+ <hints>
+ <hint type="sourcelabel">
+ <x>316</x>
+ <y>260</y>
+ </hint>
+ <hint type="destinationlabel">
+ <x>286</x>
+ <y>274</y>
+ </hint>
+ </hints>
+ </connection>
+ </connections>
+</ui>
diff --git a/src-qt5/core/lumina-theme-engine/src/lthemeengine/fontspage.cpp b/src-qt5/core/lumina-theme-engine/src/lthemeengine/fontspage.cpp
new file mode 100644
index 00000000..db48a3cc
--- /dev/null
+++ b/src-qt5/core/lumina-theme-engine/src/lthemeengine/fontspage.cpp
@@ -0,0 +1,126 @@
+/*
+ * Copyright (c) 2014-2017, Ilya Kotov <forkotov02@hotmail.ru>
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are
+ * met:
+ *
+ * 1. Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ *
+ * 2. Redistributions in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in
+ * the documentation and/or other materials provided with the
+ * distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ * HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+#include <QSignalMapper>
+#include <QMessageBox>
+#include <QSettings>
+#include <QApplication>
+#include <QFontDialog>
+#include <QDir>
+#include <QFile>
+#include "lthemeengine.h"
+#include "fontspage.h"
+#include "fontconfigdialog.h"
+#include "ui_fontspage.h"
+
+FontsPage::FontsPage(QWidget *parent) :
+ TabPage(parent),
+ m_ui(new Ui::FontsPage)
+{
+ m_ui->setupUi(this);
+
+ QSignalMapper *mapper = new QSignalMapper(this);
+ mapper->setMapping(m_ui->changeGeneralFontButton, m_ui->generalFontLabel);
+ mapper->setMapping(m_ui->changeFixedWidthFontButton, m_ui->fixedFontLabel);
+ connect(m_ui->changeGeneralFontButton, SIGNAL(clicked()), mapper, SLOT(map()));
+ connect(m_ui->changeFixedWidthFontButton, SIGNAL(clicked()), mapper, SLOT(map()));
+ connect(mapper, SIGNAL(mapped(QWidget*)), SLOT(onFontChangeRequested(QWidget*)));
+
+ readSettings();
+
+ //icons
+ m_ui->createFontsConfButton->setIcon(QIcon::fromTheme("document-new"));
+ m_ui->removeFontsConfButton->setIcon(QIcon::fromTheme("edit-delete"));
+}
+
+FontsPage::~FontsPage()
+{
+ delete m_ui;
+}
+
+void FontsPage::writeSettings()
+{
+ QSettings settings(lthemeengine::configFile(), QSettings::IniFormat);
+ settings.beginGroup("Fonts");
+ settings.setValue("general", m_ui->generalFontLabel->font());
+ settings.setValue("fixed", m_ui->fixedFontLabel->font());
+ settings.endGroup();
+}
+
+void FontsPage::onFontChangeRequested(QWidget *widget)
+{
+ bool ok = false;
+ QFont font = QFontDialog::getFont (&ok, widget->font(), this);
+ if(ok)
+ {
+ widget->setFont(font);
+ qobject_cast<QLabel*>(widget)->setText(font.family () + " " + QString::number(font.pointSize ()));
+ }
+}
+
+void FontsPage::readSettings()
+{
+ QSettings settings(lthemeengine::configFile(), QSettings::IniFormat);
+ settings.beginGroup("Fonts");
+ loadFont(&settings, m_ui->generalFontLabel, "general");
+ loadFont(&settings, m_ui->fixedFontLabel, "fixed");
+ settings.endGroup();
+}
+
+void FontsPage::loadFont(QSettings *settings, QLabel *label, const QString &key)
+{
+ QFont font = settings->value(key, QApplication::font()).value<QFont>();
+ label->setText(font.family () + " " + QString::number(font.pointSize ()));
+ label->setFont(font);
+}
+
+void FontsPage::on_createFontsConfButton_clicked()
+{
+ FontConfigDialog d(this);
+ d.exec();
+}
+
+void FontsPage::on_removeFontsConfButton_clicked()
+{
+ QString path = QDir::homePath() + "/.config/fontconfig/fonts.conf";
+
+
+ if(QFile::exists(path))
+ {
+ if(QMessageBox::question(this, tr("Remove Font Configuration"),
+ tr("Are you sure you want to delete <i>%1</i>?").arg(path),
+ QMessageBox::Yes | QMessageBox::No) == QMessageBox::No)
+ {
+ return;
+ }
+
+ QFile::remove(path + ".back");
+ QFile::copy(path, path + ".back");
+ QFile::remove(path);
+ }
+}
diff --git a/src-qt5/core/lumina-theme-engine/src/lthemeengine/fontspage.h b/src-qt5/core/lumina-theme-engine/src/lthemeengine/fontspage.h
new file mode 100644
index 00000000..a9c5f1f6
--- /dev/null
+++ b/src-qt5/core/lumina-theme-engine/src/lthemeengine/fontspage.h
@@ -0,0 +1,62 @@
+/*
+ * Copyright (c) 2014-2017, Ilya Kotov <forkotov02@hotmail.ru>
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are
+ * met:
+ *
+ * 1. Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ *
+ * 2. Redistributions in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in
+ * the documentation and/or other materials provided with the
+ * distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ * HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+#ifndef FONTSPAGE_H
+#define FONTSPAGE_H
+
+#include "tabpage.h"
+
+namespace Ui {
+class FontsPage;
+}
+
+class QLabel;
+class QSettings;
+
+class FontsPage : public TabPage
+{
+ Q_OBJECT
+
+public:
+ explicit FontsPage(QWidget *parent = 0);
+ ~FontsPage();
+
+ void writeSettings();
+
+private slots:
+ void onFontChangeRequested(QWidget *widget);
+ void on_createFontsConfButton_clicked();
+ void on_removeFontsConfButton_clicked();
+
+private:
+ void readSettings();
+ void loadFont(QSettings *settings, QLabel *label, const QString &key);
+ Ui::FontsPage *m_ui;
+};
+
+#endif // FONTSPAGE_H
diff --git a/src-qt5/core/lumina-theme-engine/src/lthemeengine/fontspage.ui b/src-qt5/core/lumina-theme-engine/src/lthemeengine/fontspage.ui
new file mode 100644
index 00000000..b03b5fc0
--- /dev/null
+++ b/src-qt5/core/lumina-theme-engine/src/lthemeengine/fontspage.ui
@@ -0,0 +1,134 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<ui version="4.0">
+ <class>FontsPage</class>
+ <widget class="QWidget" name="FontsPage">
+ <property name="geometry">
+ <rect>
+ <x>0</x>
+ <y>0</y>
+ <width>517</width>
+ <height>320</height>
+ </rect>
+ </property>
+ <property name="windowTitle">
+ <string notr="true">Form</string>
+ </property>
+ <layout class="QGridLayout" name="gridLayout_2">
+ <item row="1" column="2">
+ <spacer name="horizontalSpacer">
+ <property name="orientation">
+ <enum>Qt::Horizontal</enum>
+ </property>
+ <property name="sizeHint" stdset="0">
+ <size>
+ <width>342</width>
+ <height>20</height>
+ </size>
+ </property>
+ </spacer>
+ </item>
+ <item row="0" column="0" colspan="3">
+ <layout class="QGridLayout" name="gridLayout">
+ <item row="0" column="1">
+ <widget class="QLabel" name="generalFontLabel">
+ <property name="sizePolicy">
+ <sizepolicy hsizetype="Expanding" vsizetype="Preferred">
+ <horstretch>0</horstretch>
+ <verstretch>0</verstretch>
+ </sizepolicy>
+ </property>
+ <property name="frameShape">
+ <enum>QFrame::StyledPanel</enum>
+ </property>
+ <property name="text">
+ <string>...</string>
+ </property>
+ </widget>
+ </item>
+ <item row="0" column="0">
+ <widget class="QLabel" name="label_2">
+ <property name="sizePolicy">
+ <sizepolicy hsizetype="Preferred" vsizetype="Preferred">
+ <horstretch>0</horstretch>
+ <verstretch>0</verstretch>
+ </sizepolicy>
+ </property>
+ <property name="text">
+ <string>General:</string>
+ </property>
+ </widget>
+ </item>
+ <item row="0" column="2">
+ <widget class="QToolButton" name="changeGeneralFontButton">
+ <property name="text">
+ <string>...</string>
+ </property>
+ </widget>
+ </item>
+ <item row="1" column="1">
+ <widget class="QLabel" name="fixedFontLabel">
+ <property name="sizePolicy">
+ <sizepolicy hsizetype="Preferred" vsizetype="Preferred">
+ <horstretch>0</horstretch>
+ <verstretch>0</verstretch>
+ </sizepolicy>
+ </property>
+ <property name="frameShape">
+ <enum>QFrame::StyledPanel</enum>
+ </property>
+ <property name="text">
+ <string>...</string>
+ </property>
+ </widget>
+ </item>
+ <item row="1" column="2">
+ <widget class="QToolButton" name="changeFixedWidthFontButton">
+ <property name="text">
+ <string>...</string>
+ </property>
+ </widget>
+ </item>
+ <item row="1" column="0">
+ <widget class="QLabel" name="label_5">
+ <property name="text">
+ <string>Fixed width:</string>
+ </property>
+ </widget>
+ </item>
+ </layout>
+ </item>
+ <item row="2" column="0" colspan="3">
+ <spacer name="verticalSpacer">
+ <property name="orientation">
+ <enum>Qt::Vertical</enum>
+ </property>
+ <property name="sizeType">
+ <enum>QSizePolicy::Expanding</enum>
+ </property>
+ <property name="sizeHint" stdset="0">
+ <size>
+ <width>0</width>
+ <height>280</height>
+ </size>
+ </property>
+ </spacer>
+ </item>
+ <item row="1" column="0">
+ <widget class="QPushButton" name="createFontsConfButton">
+ <property name="text">
+ <string>Create fonts.conf</string>
+ </property>
+ </widget>
+ </item>
+ <item row="1" column="1">
+ <widget class="QPushButton" name="removeFontsConfButton">
+ <property name="text">
+ <string>Remove fonts.conf</string>
+ </property>
+ </widget>
+ </item>
+ </layout>
+ </widget>
+ <resources/>
+ <connections/>
+</ui>
diff --git a/src-qt5/core/lumina-theme-engine/src/lthemeengine/iconthemepage.cpp b/src-qt5/core/lumina-theme-engine/src/lthemeengine/iconthemepage.cpp
new file mode 100644
index 00000000..ca9a3388
--- /dev/null
+++ b/src-qt5/core/lumina-theme-engine/src/lthemeengine/iconthemepage.cpp
@@ -0,0 +1,214 @@
+/*
+ * Copyright (c) 2014-2017, Ilya Kotov <forkotov02@hotmail.ru>
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are
+ * met:
+ *
+ * 1. Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ *
+ * 2. Redistributions in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in
+ * the documentation and/or other materials provided with the
+ * distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ * HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+#include <QSettings>
+#include <QFileInfo>
+#include <QFileInfoList>
+#include <QDir>
+#include <QTreeWidgetItem>
+#include <QImageReader>
+#include <QLocale>
+#include "lthemeengine.h"
+#include "iconthemepage.h"
+#include "ui_iconthemepage.h"
+
+IconThemePage::IconThemePage(QWidget *parent) :
+ TabPage(parent),
+ m_ui(new Ui::IconThemePage)
+{
+ m_ui->setupUi(this);
+ loadThemes();
+ readSettings();
+}
+
+IconThemePage::~IconThemePage()
+{
+ delete m_ui;
+}
+
+void IconThemePage::writeSettings()
+{
+ QSettings settings(lthemeengine::configFile(), QSettings::IniFormat);
+ QTreeWidgetItem *item = m_ui->treeWidget->currentItem();
+ if(item)
+ settings.setValue("Appearance/icon_theme", item->data(3, Qt::UserRole));
+}
+
+void IconThemePage::readSettings()
+{
+ QSettings settings(lthemeengine::configFile(), QSettings::IniFormat);
+ QString name = settings.value("Appearance/icon_theme").toString();
+
+ if(name.isEmpty())
+ return;
+
+ for(int i = 0; i < m_ui->treeWidget->topLevelItemCount(); ++i)
+ {
+ QTreeWidgetItem *item = m_ui->treeWidget->topLevelItem(i);
+ if(item->data(3, Qt::UserRole).toString() == name)
+ {
+ m_ui->treeWidget->setCurrentItem(item);
+ break;
+ }
+ }
+}
+
+void IconThemePage::loadThemes()
+{
+ QFileInfoList themeFileList;
+ foreach(QString path, lthemeengine::iconPaths())
+ {
+ QDir dir(path);
+ dir.setFilter(QDir::Dirs | QDir::NoDotDot | QDir::NoDot);
+ foreach (QFileInfo info, dir.entryInfoList())
+ {
+ QDir themeDir(info.absoluteFilePath());
+ themeDir.setFilter(QDir::Files);
+ themeFileList << themeDir.entryInfoList(QStringList() << "index.theme");
+ }
+ }
+
+ foreach(QFileInfo info, themeFileList)
+ {
+ loadTheme(info.canonicalFilePath());
+ }
+}
+
+void IconThemePage::loadTheme(const QString &path)
+{
+ QSettings config(path, QSettings::IniFormat);
+ config.setIniCodec("UTF-8");
+
+ config.beginGroup("Icon Theme");
+ QStringList dirs = config.value("Directories").toStringList();
+ if(dirs.isEmpty() || config.value("Hidden", false).toBool())
+ return;
+
+ QString name, comment;
+ QString lang = QLocale::system().name();
+
+ name = config.value(QString("Name[%1]").arg(lang)).toString();
+ comment = config.value(QString("Comment[%1]").arg(lang)).toString();
+
+ if(lang.contains("_"))
+ lang = lang.split("_").first();
+
+ if(name.isEmpty())
+ name = config.value(QString("Name[%1]").arg(lang)).toString();
+
+ if(comment.isEmpty())
+ comment = config.value(QString("Comment[%1]").arg(lang)).toString();
+
+ if(name.isEmpty())
+ name = config.value("Name").toString();
+
+ if(comment.isEmpty())
+ comment = config.value("Comment").toString();
+
+ config.endGroup();
+
+ QIcon icon1 = findIcon(path, 24, "document-save");
+ QIcon icon2 = findIcon(path, 24, "document-print");
+ QIcon icon3 = findIcon(path, 24, "media-playback-stop");
+
+ QTreeWidgetItem *item = new QTreeWidgetItem();
+ item->setIcon(0, icon1);
+ item->setIcon(1, icon2);
+ item->setIcon(2, icon3);
+ item->setText(3, name);
+ item->setData(3, Qt::UserRole, QFileInfo(path).path().section("/", -1));
+ item->setToolTip(3, comment);
+ item->setSizeHint(0, QSize(24,24));
+ m_ui->treeWidget->addTopLevelItem(item);
+
+ m_ui->treeWidget->resizeColumnToContents(0);
+ m_ui->treeWidget->resizeColumnToContents(1);
+ m_ui->treeWidget->resizeColumnToContents(2);
+ m_ui->treeWidget->resizeColumnToContents(3);
+}
+
+QIcon IconThemePage::findIcon(const QString &themePath, int size, const QString &name)
+{
+ QSettings config(themePath, QSettings::IniFormat);
+ config.beginGroup("Icon Theme");
+ QStringList dirs = config.value("Directories").toStringList();
+ QStringList parents = config.value("Inherits").toStringList();
+ bool haveInherits = config.contains("Inherits");
+ config.endGroup();
+
+ foreach (QString dir, dirs)
+ {
+ config.beginGroup(dir);
+ if(config.value("Size").toInt() == size)
+ {
+ QDir iconDir = QFileInfo(themePath).path() + "/" + dir;
+ iconDir.setFilter(QDir::Files);
+ iconDir.setNameFilters(QStringList () << name + ".*");
+ if(iconDir.entryInfoList().isEmpty())
+ continue;
+ return QIcon(iconDir.entryInfoList().first().absoluteFilePath());
+ }
+ config.endGroup();
+ }
+
+ foreach (QString dir, dirs)
+ {
+ config.beginGroup(dir);
+ if(abs(config.value("Size").toInt() - size) < 4)
+ {
+ QDir iconDir = QFileInfo(themePath).path() + "/" + dir;
+ iconDir.setFilter(QDir::Files);
+ iconDir.setNameFilters(QStringList () << name + ".*");
+ if(iconDir.entryInfoList().isEmpty())
+ continue;
+ return QIcon(iconDir.entryInfoList().first().absoluteFilePath());
+ }
+ config.endGroup();
+ }
+
+ if (!haveInherits)
+ return QIcon();
+
+ parents.append("hicolor"); //add fallback themes
+ parents.append("gnome");
+ parents.removeDuplicates();
+
+ foreach (QString parent, parents)
+ {
+ QString parentThemePath = QDir(QFileInfo(themePath).path() + "/../" + parent).canonicalPath() + "/index.theme";
+
+ if(!QFile::exists(parentThemePath) || parentThemePath == themePath)
+ continue;
+
+ QIcon icon = findIcon(parentThemePath, size, name);
+ if(!icon.isNull())
+ return icon;
+ }
+
+ return QIcon();
+}
diff --git a/src-qt5/core/lumina-theme-engine/src/lthemeengine/iconthemepage.h b/src-qt5/core/lumina-theme-engine/src/lthemeengine/iconthemepage.h
new file mode 100644
index 00000000..0ccd64e0
--- /dev/null
+++ b/src-qt5/core/lumina-theme-engine/src/lthemeengine/iconthemepage.h
@@ -0,0 +1,57 @@
+/*
+ * Copyright (c) 2014-2017, Ilya Kotov <forkotov02@hotmail.ru>
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are
+ * met:
+ *
+ * 1. Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ *
+ * 2. Redistributions in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in
+ * the documentation and/or other materials provided with the
+ * distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ * HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+#ifndef ICONTHEMEPAGE_H
+#define ICONTHEMEPAGE_H
+
+#include <QIcon>
+#include "tabpage.h"
+
+namespace Ui {
+class IconThemePage;
+}
+
+class IconThemePage : public TabPage
+{
+ Q_OBJECT
+
+public:
+ explicit IconThemePage(QWidget *parent = 0);
+ ~IconThemePage();
+
+ void writeSettings();
+
+private:
+ void readSettings();
+ void loadThemes();
+ void loadTheme(const QString &path);
+ QIcon findIcon(const QString &themePath, int size, const QString &name);
+ Ui::IconThemePage *m_ui;
+};
+
+#endif // ICONTHEMEPAGE_H
diff --git a/src-qt5/core/lumina-theme-engine/src/lthemeengine/iconthemepage.ui b/src-qt5/core/lumina-theme-engine/src/lthemeengine/iconthemepage.ui
new file mode 100644
index 00000000..a6385041
--- /dev/null
+++ b/src-qt5/core/lumina-theme-engine/src/lthemeengine/iconthemepage.ui
@@ -0,0 +1,51 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<ui version="4.0">
+ <class>IconThemePage</class>
+ <widget class="QWidget" name="IconThemePage">
+ <property name="geometry">
+ <rect>
+ <x>0</x>
+ <y>0</y>
+ <width>400</width>
+ <height>300</height>
+ </rect>
+ </property>
+ <property name="windowTitle">
+ <string notr="true">Form</string>
+ </property>
+ <layout class="QVBoxLayout" name="verticalLayout">
+ <item>
+ <widget class="QTreeWidget" name="treeWidget">
+ <property name="columnCount">
+ <number>4</number>
+ </property>
+ <attribute name="headerVisible">
+ <bool>false</bool>
+ </attribute>
+ <column>
+ <property name="text">
+ <string notr="true">1</string>
+ </property>
+ </column>
+ <column>
+ <property name="text">
+ <string notr="true">2</string>
+ </property>
+ </column>
+ <column>
+ <property name="text">
+ <string notr="true">3</string>
+ </property>
+ </column>
+ <column>
+ <property name="text">
+ <string notr="true">4</string>
+ </property>
+ </column>
+ </widget>
+ </item>
+ </layout>
+ </widget>
+ <resources/>
+ <connections/>
+</ui>
diff --git a/src-qt5/core/lumina-theme-engine/src/lthemeengine/interfacepage.cpp b/src-qt5/core/lumina-theme-engine/src/lthemeengine/interfacepage.cpp
new file mode 100644
index 00000000..a9f40080
--- /dev/null
+++ b/src-qt5/core/lumina-theme-engine/src/lthemeengine/interfacepage.cpp
@@ -0,0 +1,140 @@
+/*
+ * Copyright (c) 2014-2017, Ilya Kotov <forkotov02@hotmail.ru>
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are
+ * met:
+ *
+ * 1. Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ *
+ * 2. Redistributions in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in
+ * the documentation and/or other materials provided with the
+ * distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ * HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+#include <QSettings>
+#include <QApplication>
+#include <QDialogButtonBox>
+#include "lthemeengine.h"
+#include "interfacepage.h"
+#include "ui_interfacepage.h"
+
+InterfacePage::InterfacePage(QWidget *parent) :
+ TabPage(parent),
+ m_ui(new Ui::InterfacePage)
+{
+ m_ui->setupUi(this);
+
+ m_ui->buttonLayoutComboBox->addItem("Windows", QDialogButtonBox::WinLayout);
+ m_ui->buttonLayoutComboBox->addItem("Mac OS X", QDialogButtonBox::MacLayout);
+ m_ui->buttonLayoutComboBox->addItem("KDE", QDialogButtonBox::KdeLayout);
+ m_ui->buttonLayoutComboBox->addItem("GNOME", QDialogButtonBox::GnomeLayout);
+
+ m_ui->toolButtonStyleComboBox->addItem(tr("Only display the icon"), Qt::ToolButtonIconOnly);
+ m_ui->toolButtonStyleComboBox->addItem(tr("Only display the text"), Qt::ToolButtonTextOnly);
+ m_ui->toolButtonStyleComboBox->addItem(tr("The text appears beside the icon"), Qt::ToolButtonTextBesideIcon);
+ m_ui->toolButtonStyleComboBox->addItem(tr("The text appears under the icon"), Qt::ToolButtonTextUnderIcon);
+ m_ui->toolButtonStyleComboBox->addItem(tr("Follow the application style"), Qt::ToolButtonFollowStyle);
+
+ readSettings();
+}
+
+InterfacePage::~InterfacePage()
+{
+ delete m_ui;
+}
+
+void InterfacePage::writeSettings()
+{
+ QSettings settings(lthemeengine::configFile(), QSettings::IniFormat);
+ settings.beginGroup("Interface");
+ settings.setValue("double_click_interval", m_ui->doubleClickIntervalSpinBox->value());
+ settings.setValue("cursor_flash_time", m_ui->cursorFlashTimeSpinBox->value());
+ settings.setValue("buttonbox_layout", m_ui->buttonLayoutComboBox->currentData());
+ settings.setValue("menus_have_icons", m_ui->menuIconsCheckBox->isChecked());
+ settings.setValue("activate_item_on_single_click", m_ui->singleClickCheckBox->checkState());
+ settings.setValue("dialog_buttons_have_icons", m_ui->dialogIconsCheckBox->checkState());
+ settings.setValue("toolbutton_style", m_ui->toolButtonStyleComboBox->currentData());
+ settings.setValue("wheel_scroll_lines", m_ui->wheelScrollLinesSpinBox->value());
+
+ QStringList effects;
+ if(m_ui->guiEffectsCheckBox->isChecked())
+ effects << "General";
+
+ if(m_ui->menuEffectComboBox->currentIndex() == 1)
+ effects << "AnimateMenu";
+ else if(m_ui->menuEffectComboBox->currentIndex() == 2)
+ effects << "FadeMenu";
+
+ if(m_ui->comboBoxEffectComboBox->currentIndex() == 1)
+ effects << "AnimateCombo";
+
+ if(m_ui->toolTipEffectComboBox->currentIndex() == 1)
+ effects << "AnimateTooltip";
+ else if(m_ui->toolTipEffectComboBox->currentIndex() == 2)
+ effects << "FadeTooltip";
+
+ if(m_ui->toolBoxEffectComboBox->currentIndex() == 1)
+ effects << "AnimateToolBox";
+
+ settings.setValue("gui_effects", effects);
+ settings.endGroup();
+}
+
+void InterfacePage::readSettings()
+{
+ QSettings settings(lthemeengine::configFile(), QSettings::IniFormat);
+ settings.beginGroup("Interface");
+ m_ui->doubleClickIntervalSpinBox->setValue(qApp->doubleClickInterval());
+ m_ui->cursorFlashTimeSpinBox->setValue(qApp->cursorFlashTime());
+
+ m_ui->guiEffectsCheckBox->setChecked(qApp->isEffectEnabled(Qt::UI_General));
+
+ int layout = settings.value("buttonbox_layout", style()->styleHint(QStyle::SH_DialogButtonLayout)).toInt();
+ int index = m_ui->buttonLayoutComboBox->findData(layout);
+ if(index >= 0)
+ m_ui->buttonLayoutComboBox->setCurrentIndex(index);
+
+ if(qApp->isEffectEnabled(Qt::UI_AnimateMenu))
+ m_ui->menuEffectComboBox->setCurrentIndex(1);
+ else if(qApp->isEffectEnabled(Qt::UI_FadeMenu))
+ m_ui->menuEffectComboBox->setCurrentIndex(2);
+
+ if(qApp->isEffectEnabled(Qt::UI_AnimateCombo))
+ m_ui->comboBoxEffectComboBox->setCurrentIndex(1);
+
+ if(qApp->isEffectEnabled(Qt::UI_AnimateTooltip))
+ m_ui->toolTipEffectComboBox->setCurrentIndex(1);
+ else if(qApp->isEffectEnabled(Qt::UI_FadeTooltip))
+ m_ui->toolTipEffectComboBox->setCurrentIndex(2);
+
+ if(qApp->isEffectEnabled(Qt::UI_AnimateToolBox))
+ m_ui->toolBoxEffectComboBox->setCurrentIndex(1);
+
+ m_ui->singleClickCheckBox->setCheckState((Qt::CheckState)settings.value("activate_item_on_single_click", Qt::PartiallyChecked).toInt());
+ m_ui->dialogIconsCheckBox->setCheckState((Qt::CheckState)settings.value("dialog_buttons_have_icons", Qt::PartiallyChecked).toInt());
+ m_ui->menuIconsCheckBox->setChecked(!qApp->testAttribute(Qt::AA_DontShowIconsInMenus));
+
+ int toolbarStyle = settings.value("toolbutton_style", Qt::ToolButtonFollowStyle).toInt();
+ index = m_ui->toolButtonStyleComboBox->findData(toolbarStyle);
+ if(index >= 0)
+ m_ui->toolButtonStyleComboBox->setCurrentIndex(index);
+
+ m_ui->wheelScrollLinesSpinBox->setValue(settings.value("wheel_scroll_lines", 3).toInt());
+
+ settings.endGroup();
+}
diff --git a/src-qt5/core/lumina-theme-engine/src/lthemeengine/interfacepage.h b/src-qt5/core/lumina-theme-engine/src/lthemeengine/interfacepage.h
new file mode 100644
index 00000000..637b6bf1
--- /dev/null
+++ b/src-qt5/core/lumina-theme-engine/src/lthemeengine/interfacepage.h
@@ -0,0 +1,54 @@
+/*
+ * Copyright (c) 2014-2017, Ilya Kotov <forkotov02@hotmail.ru>
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are
+ * met:
+ *
+ * 1. Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ *
+ * 2. Redistributions in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in
+ * the documentation and/or other materials provided with the
+ * distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ * HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+#ifndef INTERFACEPAGE_H
+#define INTERFACEPAGE_H
+
+#include "tabpage.h"
+
+namespace Ui {
+class InterfacePage;
+}
+
+class InterfacePage : public TabPage
+{
+ Q_OBJECT
+
+public:
+ explicit InterfacePage(QWidget *parent = 0);
+ ~InterfacePage();
+
+ void writeSettings();
+
+private:
+ void readSettings();
+
+ Ui::InterfacePage *m_ui;
+};
+
+#endif // INTERFACEPAGE_H
diff --git a/src-qt5/core/lumina-theme-engine/src/lthemeengine/interfacepage.ui b/src-qt5/core/lumina-theme-engine/src/lthemeengine/interfacepage.ui
new file mode 100644
index 00000000..ca9d0291
--- /dev/null
+++ b/src-qt5/core/lumina-theme-engine/src/lthemeengine/interfacepage.ui
@@ -0,0 +1,327 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<ui version="4.0">
+ <class>InterfacePage</class>
+ <widget class="QWidget" name="InterfacePage">
+ <property name="geometry">
+ <rect>
+ <x>0</x>
+ <y>0</y>
+ <width>498</width>
+ <height>449</height>
+ </rect>
+ </property>
+ <property name="windowTitle">
+ <string notr="true">Form</string>
+ </property>
+ <layout class="QGridLayout" name="gridLayout">
+ <item row="2" column="0">
+ <spacer name="verticalSpacer">
+ <property name="orientation">
+ <enum>Qt::Vertical</enum>
+ </property>
+ <property name="sizeHint" stdset="0">
+ <size>
+ <width>20</width>
+ <height>259</height>
+ </size>
+ </property>
+ </spacer>
+ </item>
+ <item row="0" column="0">
+ <layout class="QFormLayout" name="formLayout">
+ <item row="0" column="0">
+ <widget class="QLabel" name="label">
+ <property name="text">
+ <string>Double click interval:</string>
+ </property>
+ </widget>
+ </item>
+ <item row="1" column="0">
+ <widget class="QLabel" name="label_2">
+ <property name="text">
+ <string>Cursor flash time:</string>
+ </property>
+ </widget>
+ </item>
+ <item row="5" column="0">
+ <widget class="QLabel" name="label_3">
+ <property name="text">
+ <string>ComboBox effect:</string>
+ </property>
+ </widget>
+ </item>
+ <item row="6" column="0">
+ <widget class="QLabel" name="label_4">
+ <property name="text">
+ <string>ToolTip effect:</string>
+ </property>
+ </widget>
+ </item>
+ <item row="7" column="0">
+ <widget class="QLabel" name="label_5">
+ <property name="text">
+ <string>ToolBox effect:</string>
+ </property>
+ </widget>
+ </item>
+ <item row="0" column="1">
+ <widget class="QSpinBox" name="doubleClickIntervalSpinBox">
+ <property name="suffix">
+ <string> ms</string>
+ </property>
+ <property name="maximum">
+ <number>2000</number>
+ </property>
+ </widget>
+ </item>
+ <item row="1" column="1">
+ <widget class="QSpinBox" name="cursorFlashTimeSpinBox">
+ <property name="suffix">
+ <string> ms</string>
+ </property>
+ <property name="maximum">
+ <number>4000</number>
+ </property>
+ </widget>
+ </item>
+ <item row="5" column="1">
+ <widget class="QComboBox" name="comboBoxEffectComboBox">
+ <property name="enabled">
+ <bool>false</bool>
+ </property>
+ <item>
+ <property name="text">
+ <string>Disable</string>
+ </property>
+ </item>
+ <item>
+ <property name="text">
+ <string>Animate</string>
+ </property>
+ </item>
+ </widget>
+ </item>
+ <item row="6" column="1">
+ <widget class="QComboBox" name="toolTipEffectComboBox">
+ <property name="enabled">
+ <bool>false</bool>
+ </property>
+ <item>
+ <property name="text">
+ <string>Disable</string>
+ </property>
+ </item>
+ <item>
+ <property name="text">
+ <string>Animate</string>
+ </property>
+ </item>
+ <item>
+ <property name="text">
+ <string>Fade</string>
+ </property>
+ </item>
+ </widget>
+ </item>
+ <item row="7" column="1">
+ <widget class="QComboBox" name="toolBoxEffectComboBox">
+ <property name="enabled">
+ <bool>false</bool>
+ </property>
+ <item>
+ <property name="text">
+ <string>Disable</string>
+ </property>
+ </item>
+ <item>
+ <property name="text">
+ <string>Animate</string>
+ </property>
+ </item>
+ </widget>
+ </item>
+ <item row="4" column="0">
+ <widget class="QLabel" name="label_6">
+ <property name="text">
+ <string>Menu effect:</string>
+ </property>
+ </widget>
+ </item>
+ <item row="4" column="1">
+ <widget class="QComboBox" name="menuEffectComboBox">
+ <property name="enabled">
+ <bool>false</bool>
+ </property>
+ <item>
+ <property name="text">
+ <string>Disable</string>
+ </property>
+ </item>
+ <item>
+ <property name="text">
+ <string>Animate</string>
+ </property>
+ </item>
+ <item>
+ <property name="text">
+ <string>Fade</string>
+ </property>
+ </item>
+ </widget>
+ </item>
+ <item row="3" column="0" colspan="2">
+ <widget class="QCheckBox" name="guiEffectsCheckBox">
+ <property name="text">
+ <string>Enable gui effects</string>
+ </property>
+ </widget>
+ </item>
+ <item row="8" column="0">
+ <widget class="QLabel" name="label_7">
+ <property name="text">
+ <string>Dialog buttons layout:</string>
+ </property>
+ </widget>
+ </item>
+ <item row="8" column="1">
+ <widget class="QComboBox" name="buttonLayoutComboBox"/>
+ </item>
+ <item row="10" column="0" colspan="2">
+ <widget class="QCheckBox" name="menuIconsCheckBox">
+ <property name="text">
+ <string>Menus have icons</string>
+ </property>
+ </widget>
+ </item>
+ <item row="9" column="0" colspan="2">
+ <widget class="QCheckBox" name="dialogIconsCheckBox">
+ <property name="text">
+ <string>Dialog buttons have icons</string>
+ </property>
+ <property name="tristate">
+ <bool>true</bool>
+ </property>
+ </widget>
+ </item>
+ <item row="2" column="0" colspan="2">
+ <widget class="QCheckBox" name="singleClickCheckBox">
+ <property name="text">
+ <string>Activate item on single-click</string>
+ </property>
+ <property name="tristate">
+ <bool>true</bool>
+ </property>
+ </widget>
+ </item>
+ <item row="11" column="0">
+ <widget class="QLabel" name="label_8">
+ <property name="text">
+ <string>Toolbar button style:</string>
+ </property>
+ </widget>
+ </item>
+ <item row="11" column="1">
+ <widget class="QComboBox" name="toolButtonStyleComboBox"/>
+ </item>
+ <item row="12" column="0">
+ <widget class="QLabel" name="label_9">
+ <property name="text">
+ <string>Mouse wheel scroll lines:</string>
+ </property>
+ </widget>
+ </item>
+ <item row="12" column="1">
+ <widget class="QSpinBox" name="wheelScrollLinesSpinBox">
+ <property name="minimum">
+ <number>1</number>
+ </property>
+ <property name="maximum">
+ <number>20</number>
+ </property>
+ </widget>
+ </item>
+ </layout>
+ </item>
+ <item row="0" column="1">
+ <spacer name="horizontalSpacer">
+ <property name="orientation">
+ <enum>Qt::Horizontal</enum>
+ </property>
+ <property name="sizeHint" stdset="0">
+ <size>
+ <width>238</width>
+ <height>20</height>
+ </size>
+ </property>
+ </spacer>
+ </item>
+ </layout>
+ </widget>
+ <resources/>
+ <connections>
+ <connection>
+ <sender>guiEffectsCheckBox</sender>
+ <signal>toggled(bool)</signal>
+ <receiver>menuEffectComboBox</receiver>
+ <slot>setEnabled(bool)</slot>
+ <hints>
+ <hint type="sourcelabel">
+ <x>126</x>
+ <y>86</y>
+ </hint>
+ <hint type="destinationlabel">
+ <x>201</x>
+ <y>114</y>
+ </hint>
+ </hints>
+ </connection>
+ <connection>
+ <sender>guiEffectsCheckBox</sender>
+ <signal>toggled(bool)</signal>
+ <receiver>comboBoxEffectComboBox</receiver>
+ <slot>setEnabled(bool)</slot>
+ <hints>
+ <hint type="sourcelabel">
+ <x>75</x>
+ <y>84</y>
+ </hint>
+ <hint type="destinationlabel">
+ <x>160</x>
+ <y>153</y>
+ </hint>
+ </hints>
+ </connection>
+ <connection>
+ <sender>guiEffectsCheckBox</sender>
+ <signal>toggled(bool)</signal>
+ <receiver>toolTipEffectComboBox</receiver>
+ <slot>setEnabled(bool)</slot>
+ <hints>
+ <hint type="sourcelabel">
+ <x>54</x>
+ <y>84</y>
+ </hint>
+ <hint type="destinationlabel">
+ <x>155</x>
+ <y>184</y>
+ </hint>
+ </hints>
+ </connection>
+ <connection>
+ <sender>guiEffectsCheckBox</sender>
+ <signal>toggled(bool)</signal>
+ <receiver>toolBoxEffectComboBox</receiver>
+ <slot>setEnabled(bool)</slot>
+ <hints>
+ <hint type="sourcelabel">
+ <x>36</x>
+ <y>91</y>
+ </hint>
+ <hint type="destinationlabel">
+ <x>156</x>
+ <y>216</y>
+ </hint>
+ </hints>
+ </connection>
+ </connections>
+</ui>
diff --git a/src-qt5/core/lumina-theme-engine/src/lthemeengine/lthemeengine.cpp b/src-qt5/core/lumina-theme-engine/src/lthemeengine/lthemeengine.cpp
new file mode 100644
index 00000000..65328963
--- /dev/null
+++ b/src-qt5/core/lumina-theme-engine/src/lthemeengine/lthemeengine.cpp
@@ -0,0 +1,132 @@
+/*
+ * Copyright (c) 2014-2017, Ilya Kotov <forkotov02@hotmail.ru>
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are
+ * met:
+ *
+ * 1. Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ *
+ * 2. Redistributions in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in
+ * the documentation and/or other materials provided with the
+ * distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ * HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+#include <QDir>
+#include <QLocale>
+#include "lthemeengine.h"
+
+#ifndef LTHEMEENGINE_DATADIR
+#define LTHEMEENGINE_DATADIR "/usr/local/share"
+#endif
+
+
+QString lthemeengine::configPath()
+{
+ return QDir::homePath() + "/.config/lthemeengine/";
+}
+
+QString lthemeengine::configFile()
+{
+ return configPath() + "lthemeengine.conf";
+}
+
+QStringList lthemeengine::iconPaths()
+{
+ QString xdgDataDirs = qgetenv("XDG_DATA_DIRS");
+ QString xdgDataHome = qgetenv("XDG_DATA_HOME");
+
+ QStringList paths;
+ paths << QDir::homePath() + "/.icons/";
+
+ if(xdgDataDirs.isEmpty())
+ {
+ paths << "/usr/share/icons";
+ paths << "/usr/local/share/icons";
+ }
+ else
+ {
+ foreach (QString p, xdgDataDirs.split(":"))
+ paths << QDir(p + "/icons/").absolutePath();
+ }
+
+ if(xdgDataHome.isEmpty())
+ xdgDataHome = QDir::homePath() + "/.local/share";
+
+ paths << "/usr/share/pixmaps";
+ paths << xdgDataHome + "/icons";
+ paths.removeDuplicates();
+
+ //remove invalid
+ foreach (QString p, paths)
+ {
+ if(!QDir(p).exists())
+ paths.removeAll(p);
+ }
+ return paths;
+}
+
+QString lthemeengine::userStyleSheetPath()
+{
+ return configPath() + "qss/";
+}
+
+QStringList lthemeengine::sharedStyleSheetPath()
+ {
+ QStringList dirs;
+ dirs << QString(getenv("XDG_CONFIG_HOME"));
+ dirs << QString(getenv("XDG_CONFIG_DIRS")).split(":");
+ for(int i=0; i<dirs.length(); i++){
+ dirs[i].append("/lthemeengine/colors/");
+ }
+ if(dirs.isEmpty()){
+ dirs << LTHEMEENGINE_DATADIR"/lthemeengine/qss/"; //no XDG settings - use the hardcoded path
+ }
+ return dirs;
+ }
+
+ QString lthemeengine::userColorSchemePath(){
+ return configPath() + "colors/";
+ }
+
+QStringList lthemeengine::sharedColorSchemePath()
+ {
+ QStringList dirs;
+ dirs << QString(getenv("XDG_CONFIG_HOME"));
+ dirs << QString(getenv("XDG_CONFIG_DIRS")).split(":");
+ for(int i=0; i<dirs.length(); i++){
+ dirs[i].append("/lthemeengine/colors/");
+ }
+ if(dirs.isEmpty()){
+ dirs << LTHEMEENGINE_DATADIR"/lthemeengine/colors/"; //no XDG settings - use the hardcoded path
+ }
+ return dirs;
+ }
+
+QString lthemeengine::systemLanguageID()
+{
+#ifdef Q_OS_UNIX
+ QByteArray v = qgetenv ("LC_ALL");
+ if (v.isEmpty())
+ v = qgetenv ("LC_MESSAGES");
+ if (v.isEmpty())
+ v = qgetenv ("LANG");
+ if (!v.isEmpty())
+ return QLocale (v).name();
+#endif
+ return QLocale::system().name();
+}
diff --git a/src-qt5/core/lumina-theme-engine/src/lthemeengine/lthemeengine.desktop b/src-qt5/core/lumina-theme-engine/src/lthemeengine/lthemeengine.desktop
new file mode 100644
index 00000000..7eb91bee
--- /dev/null
+++ b/src-qt5/core/lumina-theme-engine/src/lthemeengine/lthemeengine.desktop
@@ -0,0 +1,9 @@
+[Desktop Entry]
+X-Desktop-File-Install-Version=0.11
+Name=Lumine Theme Engine
+Comment=Lumina Theme Engine
+Exec=lthemeengine
+Icon=preferences-desktop-theme
+Terminal=false
+Type=Application
+Categories=Settings;DesktopSettings;Qt;
diff --git a/src-qt5/core/lumina-theme-engine/src/lthemeengine/lthemeengine.h b/src-qt5/core/lumina-theme-engine/src/lthemeengine/lthemeengine.h
new file mode 100644
index 00000000..171f720a
--- /dev/null
+++ b/src-qt5/core/lumina-theme-engine/src/lthemeengine/lthemeengine.h
@@ -0,0 +1,60 @@
+/*
+ * Copyright (c) 2014-2017, Ilya Kotov <forkotov02@hotmail.ru>
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are
+ * met:
+ *
+ * 1. Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ *
+ * 2. Redistributions in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in
+ * the documentation and/or other materials provided with the
+ * distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ * HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+#ifndef LTHEMEENGINE_H
+#define LTHEMEENGINE_H
+
+#define LTHEMEENGINE_VERSION_MAJOR 0
+#define LTHEMEENGINE_VERSION_MINOR 33
+
+#define LTHEMEENGINE_TOSTRING(s) #s
+#define LTHEMEENGINE_STRINGIFY(s) LTHEMEENGINE_TOSTRING(s)
+
+#define LTHEMEENGINE_VERSION_INT (LTHEMEENGINE_VERSION_MAJOR<<8 | LTHEMEENGINE_VERSION_MINOR)
+#define LTHEMEENGINE_VERSION_STR LTHEMEENGINE_STRINGIFY(LTHEMEENGINE_VERSION_MAJOR.QT5CT_VERSION_MINOR)
+
+#include <QString>
+#include <QStringList>
+
+class lthemeengine
+{
+public:
+ static QString configPath();
+ static QString configFile();
+ static QStringList iconPaths();
+ static QString userStyleSheetPath();
+ static QStringList sharedStyleSheetPath();
+ static QString userColorSchemePath();
+ static QStringList sharedColorSchemePath();
+ static QString systemLanguageID();
+
+private:
+ lthemeengine() {}
+};
+
+#endif // LTHEMEENGINE_H
diff --git a/src-qt5/core/lumina-theme-engine/src/lthemeengine/lthemeengine.pro b/src-qt5/core/lumina-theme-engine/src/lthemeengine/lthemeengine.pro
new file mode 100644
index 00000000..cc36ee5b
--- /dev/null
+++ b/src-qt5/core/lumina-theme-engine/src/lthemeengine/lthemeengine.pro
@@ -0,0 +1,55 @@
+include(../../lthemeengine.pri)
+
+TEMPLATE = app
+
+QT += widgets
+
+SOURCES += \
+ main.cpp \
+ mainwindow.cpp \
+ tabpage.cpp \
+ appearancepage.cpp \
+ fontspage.cpp \
+ lthemeengine.cpp \
+ paletteeditdialog.cpp \
+ iconthemepage.cpp \
+ interfacepage.cpp \
+ fontconfigdialog.cpp \
+ qsspage.cpp \
+ qsseditordialog.cpp
+
+FORMS += \
+ mainwindow.ui \
+ appearancepage.ui \
+ fontspage.ui \
+ paletteeditdialog.ui \
+ iconthemepage.ui \
+ interfacepage.ui \
+ fontconfigdialog.ui \
+ previewform.ui \
+ qsspage.ui \
+ qsseditordialog.ui
+
+HEADERS += \
+ mainwindow.h \
+ tabpage.h \
+ appearancepage.h \
+ fontspage.h \
+ lthemeengine.h \
+ paletteeditdialog.h \
+ iconthemepage.h \
+ interfacepage.h \
+ fontconfigdialog.h \
+ qsspage.h \
+ qsseditordialog.h
+
+!equals (DISABLE_WIDGETS,1) {
+ DEFINES += USE_WIDGETS
+}
+
+target.path = $$BINDIR
+
+desktop.files = lthemeengine.desktop
+desktop.path = $$DATADIR/applications
+
+INSTALLS += target desktop
diff --git a/src-qt5/core/lumina-theme-engine/src/lthemeengine/main.cpp b/src-qt5/core/lumina-theme-engine/src/lthemeengine/main.cpp
new file mode 100644
index 00000000..1961d17d
--- /dev/null
+++ b/src-qt5/core/lumina-theme-engine/src/lthemeengine/main.cpp
@@ -0,0 +1,84 @@
+/*
+ * Copyright (c) 2014-2017, Ilya Kotov <forkotov02@hotmail.ru>
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are
+ * met:
+ *
+ * 1. Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ *
+ * 2. Redistributions in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in
+ * the documentation and/or other materials provided with the
+ * distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ * HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+#include <QApplication>
+#include <QLibraryInfo>
+#include <QLocale>
+#include "lthemeengine.h"
+#include <QTranslator>
+#include <QMessageBox>
+#include <QProcessEnvironment>
+#include <QStyleFactory>
+#include "mainwindow.h"
+
+int main(int argc, char **argv)
+{
+ QApplication app(argc, argv);
+ QTranslator translator;
+ QString locale = lthemeengine::systemLanguageID();
+ translator.load(QString(":/lthemeengine_") + locale);
+ app.installTranslator(&translator);
+
+ QTranslator qt_translator;
+ qt_translator.load(QLibraryInfo::location (QLibraryInfo::TranslationsPath) + "/qtbase_" + locale);
+ app.installTranslator(&qt_translator);
+
+ qDebug("Configuration path: %s", qPrintable(lthemeengine::configPath()));
+ qDebug("Shared QSS path: %s", qPrintable(lthemeengine::sharedStyleSheetPath().join(", ")));
+
+ //checking environment
+ QStringList errorMessages;
+ QProcessEnvironment env = QProcessEnvironment::systemEnvironment();
+
+ if(env.contains("QT_STYLE_OVERRIDE"))
+ {
+ errorMessages << app.translate("main", "Please remove the <b>QT_STYLE_OVERRIDE</b> environment variable");
+ }
+
+ if(env.value("QT_QPA_PLATFORMTHEME") != "lthemeengine")
+ {
+ errorMessages << app.translate("main", "The <b>QT_QPA_PLATFORMTHEME</b> environment "
+ "variable is not set correctly");
+ }
+
+ if(!QStyleFactory::keys().contains("lthemeengine-style"))
+ {
+ errorMessages << app.translate("main", "Unable to find <b>liblthemeengine-style.so</b>");
+ }
+
+ if(!errorMessages.isEmpty())
+ {
+ QMessageBox::critical(0, app.translate("main", "Error"), errorMessages.join("<br><br>"));
+ return 0;
+ }
+
+ MainWindow w;
+ w.show();
+
+ return app.exec();
+}
diff --git a/src-qt5/core/lumina-theme-engine/src/lthemeengine/mainwindow.cpp b/src-qt5/core/lumina-theme-engine/src/lthemeengine/mainwindow.cpp
new file mode 100644
index 00000000..ed658e2e
--- /dev/null
+++ b/src-qt5/core/lumina-theme-engine/src/lthemeengine/mainwindow.cpp
@@ -0,0 +1,90 @@
+/*
+ * Copyright (c) 2014-2017, Ilya Kotov <forkotov02@hotmail.ru>
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are
+ * met:
+ *
+ * 1. Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ *
+ * 2. Redistributions in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in
+ * the documentation and/or other materials provided with the
+ * distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ * HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+#include <QApplication>
+#include <QSettings>
+#include "lthemeengine.h"
+#include "mainwindow.h"
+#include "appearancepage.h"
+#include "fontspage.h"
+#include "iconthemepage.h"
+#include "interfacepage.h"
+#include "qsspage.h"
+#include "ui_mainwindow.h"
+
+MainWindow::MainWindow(QWidget *parent) :
+ QWidget(parent),
+ m_ui(new Ui::MainWindow)
+{
+ m_ui->setupUi(this);
+ m_ui->tabWidget->addTab(new AppearancePage(this), tr("Appearance"));
+ m_ui->tabWidget->addTab(new FontsPage(this), tr("Fonts"));
+ m_ui->tabWidget->addTab(new IconThemePage(this), tr("Icon Theme"));
+ m_ui->tabWidget->addTab(new InterfacePage(this), tr("Interface"));
+#ifdef USE_WIDGETS
+ m_ui->tabWidget->addTab(new QSSPage(this), tr("Style Sheets"));
+#endif
+
+ QSettings settings(lthemeengine::configFile(), QSettings::IniFormat);
+ restoreGeometry(settings.value("SettingsWindow/geometry").toByteArray());
+
+ setWindowIcon(QIcon::fromTheme("preferences-desktop-theme"));
+
+ m_ui->versionLabel->setText(tr("Version: %1").arg(LTHEMEENGINE_VERSION_STR));
+}
+
+MainWindow::~MainWindow()
+{
+ delete m_ui;
+}
+
+void MainWindow::closeEvent(QCloseEvent *)
+{
+ QSettings settings(lthemeengine::configFile(), QSettings::IniFormat);
+ settings.setValue("SettingsWindow/geometry", saveGeometry());
+}
+
+void MainWindow::on_buttonBox_clicked(QAbstractButton *button)
+{
+ int id = m_ui->buttonBox->standardButton(button);
+ if(id == QDialogButtonBox::Ok || id == QDialogButtonBox::Apply)
+ {
+ for(int i = 0; i < m_ui->tabWidget->count(); ++i)
+ {
+ TabPage *p = qobject_cast<TabPage*>(m_ui->tabWidget->widget(i));
+ if(p)
+ p->writeSettings();
+ }
+ }
+
+ if(id == QDialogButtonBox::Ok || id == QDialogButtonBox::Cancel)
+ {
+ close();
+ qApp->quit();
+ }
+}
diff --git a/src-qt5/core/lumina-theme-engine/src/lthemeengine/mainwindow.h b/src-qt5/core/lumina-theme-engine/src/lthemeengine/mainwindow.h
new file mode 100644
index 00000000..f532141c
--- /dev/null
+++ b/src-qt5/core/lumina-theme-engine/src/lthemeengine/mainwindow.h
@@ -0,0 +1,57 @@
+/*
+ * Copyright (c) 2014-2017, Ilya Kotov <forkotov02@hotmail.ru>
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are
+ * met:
+ *
+ * 1. Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ *
+ * 2. Redistributions in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in
+ * the documentation and/or other materials provided with the
+ * distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ * HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+#ifndef MAINWINDOW_H
+#define MAINWINDOW_H
+
+#include <QWidget>
+
+class QAbstractButton;
+
+namespace Ui {
+class MainWindow;
+}
+
+class MainWindow : public QWidget
+{
+ Q_OBJECT
+
+public:
+ explicit MainWindow(QWidget *parent = 0);
+ ~MainWindow();
+
+private slots:
+ void on_buttonBox_clicked(QAbstractButton *button);
+
+private:
+ void closeEvent(QCloseEvent *);
+
+ Ui::MainWindow *m_ui;
+};
+
+#endif // MAINWINDOW_H
diff --git a/src-qt5/core/lumina-theme-engine/src/lthemeengine/mainwindow.ui b/src-qt5/core/lumina-theme-engine/src/lthemeengine/mainwindow.ui
new file mode 100644
index 00000000..5bdab6d7
--- /dev/null
+++ b/src-qt5/core/lumina-theme-engine/src/lthemeengine/mainwindow.ui
@@ -0,0 +1,47 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<ui version="4.0">
+ <class>MainWindow</class>
+ <widget class="QWidget" name="MainWindow">
+ <property name="geometry">
+ <rect>
+ <x>0</x>
+ <y>0</y>
+ <width>438</width>
+ <height>374</height>
+ </rect>
+ </property>
+ <property name="windowTitle">
+ <string>Qt5 Configuration Tool</string>
+ </property>
+ <layout class="QGridLayout" name="gridLayout">
+ <property name="leftMargin">
+ <number>6</number>
+ </property>
+ <property name="rightMargin">
+ <number>6</number>
+ </property>
+ <property name="bottomMargin">
+ <number>6</number>
+ </property>
+ <item row="0" column="0" colspan="2">
+ <widget class="QTabWidget" name="tabWidget"/>
+ </item>
+ <item row="1" column="0">
+ <widget class="QLabel" name="versionLabel">
+ <property name="text">
+ <string notr="true">...</string>
+ </property>
+ </widget>
+ </item>
+ <item row="1" column="1">
+ <widget class="QDialogButtonBox" name="buttonBox">
+ <property name="standardButtons">
+ <set>QDialogButtonBox::Apply|QDialogButtonBox::Cancel|QDialogButtonBox::Ok</set>
+ </property>
+ </widget>
+ </item>
+ </layout>
+ </widget>
+ <resources/>
+ <connections/>
+</ui>
diff --git a/src-qt5/core/lumina-theme-engine/src/lthemeengine/paletteeditdialog.cpp b/src-qt5/core/lumina-theme-engine/src/lthemeengine/paletteeditdialog.cpp
new file mode 100644
index 00000000..0f8fcf66
--- /dev/null
+++ b/src-qt5/core/lumina-theme-engine/src/lthemeengine/paletteeditdialog.cpp
@@ -0,0 +1,146 @@
+/*
+ * Copyright (c) 2014-2017, Ilya Kotov <forkotov02@hotmail.ru>
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are
+ * met:
+ *
+ * 1. Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ *
+ * 2. Redistributions in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in
+ * the documentation and/or other materials provided with the
+ * distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ * HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+#include <QPalette>
+#include <QColorDialog>
+#include <QSettings>
+#include "lthemeengine.h"
+#include "paletteeditdialog.h"
+#include "ui_paletteeditdialog.h"
+
+PaletteEditDialog::PaletteEditDialog(const QPalette &palette, QStyle *currentStyle, QWidget *parent) :
+ QDialog(parent),
+ m_ui(new Ui::PaletteEditDialog)
+{
+ m_currentStyle = currentStyle;
+ m_ui->setupUi(this);
+ m_ui->tableWidget->setColumnCount(3);
+ m_ui->tableWidget->setRowCount(QPalette::NColorRoles);
+ m_ui->tableWidget->verticalHeader()->setDefaultSectionSize(fontMetrics().lineSpacing() + 10);
+ m_ui->tableWidget->verticalHeader()->setSectionResizeMode(QHeaderView::Fixed);
+ m_ui->tableWidget->horizontalHeader()->setSectionResizeMode(QHeaderView::Stretch);
+
+ QStringList labels;
+ labels << tr("Active") << tr("Inactive") << tr("Disabled");
+ m_ui->tableWidget->setHorizontalHeaderLabels(labels);
+ setPalette(palette);
+
+ QSettings settings(lthemeengine::configFile(), QSettings::IniFormat);
+ restoreGeometry(settings.value("PaletteEditor/geometry").toByteArray());
+}
+
+PaletteEditDialog::~PaletteEditDialog()
+{
+ delete m_ui;
+}
+
+QPalette PaletteEditDialog::selectedPalette() const
+{
+ QPalette palette;
+ for(int i = 0; i < QPalette::NColorRoles; i++)
+ {
+ palette.setBrush(QPalette::Active, QPalette::ColorRole(i), m_ui->tableWidget->item(i,0)->backgroundColor());
+ palette.setBrush(QPalette::Inactive, QPalette::ColorRole(i), m_ui->tableWidget->item(i,1)->backgroundColor());
+ palette.setBrush(QPalette::Disabled, QPalette::ColorRole(i), m_ui->tableWidget->item(i,2)->backgroundColor());
+ }
+ return palette;
+}
+
+void PaletteEditDialog::setPalette(const QPalette &palette)
+{
+ for(int i = 0; i < QPalette::NColorRoles; i++)
+ {
+ if(!m_ui->tableWidget->item(i,0))
+ m_ui->tableWidget->setItem(i, 0, new QTableWidgetItem());
+ if(!m_ui->tableWidget->item(i,1))
+ m_ui->tableWidget->setItem(i, 1, new QTableWidgetItem());
+ if(!m_ui->tableWidget->item(i,2))
+ m_ui->tableWidget->setItem(i, 2, new QTableWidgetItem());
+
+ m_ui->tableWidget->item(i,0)->setBackgroundColor(palette.color(QPalette::Active, QPalette::ColorRole(i)));
+ m_ui->tableWidget->item(i,1)->setBackgroundColor(palette.color(QPalette::Inactive, QPalette::ColorRole(i)));
+ m_ui->tableWidget->item(i,2)->setBackgroundColor(palette.color(QPalette::Disabled, QPalette::ColorRole(i)));
+ }
+
+ QStringList labels;
+ labels << tr("Window text") << tr("Button background") << tr("Bright") << tr("Less bright") << tr("Dark") << tr("Less dark")
+ << tr("Normal text") << tr("Bright text") << tr("Button text") << tr("Normal background") << tr("Window") << tr("Shadow")
+ << tr("Highlight") << tr("Highlighted text") << tr("Link") << tr("Visited link")
+ << tr("Alternate background") << tr("Default") << tr("Tooltip background") << tr("Tooltip text");
+ m_ui->tableWidget->setVerticalHeaderLabels(labels);
+}
+
+void PaletteEditDialog::hideEvent(QHideEvent *)
+{
+ QSettings settings(lthemeengine::configFile(), QSettings::IniFormat);
+ settings.setValue("PaletteEditor/geometry", saveGeometry());
+}
+
+void PaletteEditDialog::on_tableWidget_itemClicked(QTableWidgetItem *item)
+{
+ QColor color = QColorDialog::getColor(item->backgroundColor(), this, tr("Select Color"));
+ if(color.isValid())
+ {
+ item->setBackgroundColor(color);
+ emit paletteChanged(selectedPalette());
+ }
+}
+
+void PaletteEditDialog::on_resetPaletteButton_clicked()
+{
+ setPalette(m_currentStyle->standardPalette());
+ emit paletteChanged(selectedPalette());
+}
+
+void PaletteEditDialog::on_buildInactiveButton_clicked()
+{
+ QPalette palette = selectedPalette();
+ for(int i = 0; i < QPalette::NColorRoles; i++)
+ {
+ palette.setColor(QPalette::Inactive, QPalette::ColorRole(i),
+ palette.color(QPalette::Active, QPalette::ColorRole(i)));
+ }
+ setPalette(palette);
+ emit paletteChanged(selectedPalette());
+}
+
+void PaletteEditDialog::on_buildDisabledButton_clicked()
+{
+ QPalette palette = selectedPalette();
+ for(int i = 0; i < QPalette::NColorRoles; i++)
+ {
+ palette.setColor(QPalette::Disabled, QPalette::ColorRole(i),
+ palette.color(QPalette::Active, QPalette::ColorRole(i)));
+ }
+ palette.setColor(QPalette::Disabled, QPalette::ButtonText, Qt::darkGray);
+ palette.setColor(QPalette::Disabled, QPalette::WindowText, Qt::darkGray);
+ palette.setColor(QPalette::Disabled, QPalette::Text, Qt::darkGray);
+ palette.setColor(QPalette::Disabled, QPalette::HighlightedText, Qt::darkGray);
+ setPalette(palette);
+ emit paletteChanged(selectedPalette());
+}
diff --git a/src-qt5/core/lumina-theme-engine/src/lthemeengine/paletteeditdialog.h b/src-qt5/core/lumina-theme-engine/src/lthemeengine/paletteeditdialog.h
new file mode 100644
index 00000000..c8691a3c
--- /dev/null
+++ b/src-qt5/core/lumina-theme-engine/src/lthemeengine/paletteeditdialog.h
@@ -0,0 +1,68 @@
+/*
+ * Copyright (c) 2014-2017, Ilya Kotov <forkotov02@hotmail.ru>
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are
+ * met:
+ *
+ * 1. Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ *
+ * 2. Redistributions in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in
+ * the documentation and/or other materials provided with the
+ * distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ * HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+#ifndef PALETTEEDITDIALOG_H
+#define PALETTEEDITDIALOG_H
+
+#include <QDialog>
+#include <QPalette>
+
+class QTableWidgetItem;
+class QStyle;
+
+namespace Ui {
+class PaletteEditDialog;
+}
+
+class PaletteEditDialog : public QDialog
+{
+ Q_OBJECT
+
+public:
+ explicit PaletteEditDialog(const QPalette &palette, QStyle *currentStyle, QWidget *parent = 0);
+ ~PaletteEditDialog();
+
+ QPalette selectedPalette() const;
+
+signals:
+ void paletteChanged(const QPalette &p);
+
+private slots:
+ void on_tableWidget_itemClicked(QTableWidgetItem *item);
+ void on_resetPaletteButton_clicked();
+ void on_buildInactiveButton_clicked();
+ void on_buildDisabledButton_clicked();
+
+private:
+ void setPalette(const QPalette &palette);
+ void hideEvent(QHideEvent *);
+ Ui::PaletteEditDialog *m_ui;
+ QStyle *m_currentStyle;
+};
+
+#endif // PALETTEEDITDIALOG_H
diff --git a/src-qt5/core/lumina-theme-engine/src/lthemeengine/paletteeditdialog.ui b/src-qt5/core/lumina-theme-engine/src/lthemeengine/paletteeditdialog.ui
new file mode 100644
index 00000000..6ca6350f
--- /dev/null
+++ b/src-qt5/core/lumina-theme-engine/src/lthemeengine/paletteeditdialog.ui
@@ -0,0 +1,120 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<ui version="4.0">
+ <class>PaletteEditDialog</class>
+ <widget class="QDialog" name="PaletteEditDialog">
+ <property name="geometry">
+ <rect>
+ <x>0</x>
+ <y>0</y>
+ <width>631</width>
+ <height>529</height>
+ </rect>
+ </property>
+ <property name="windowTitle">
+ <string>Palette Editor</string>
+ </property>
+ <layout class="QGridLayout" name="gridLayout">
+ <property name="leftMargin">
+ <number>6</number>
+ </property>
+ <property name="rightMargin">
+ <number>6</number>
+ </property>
+ <property name="bottomMargin">
+ <number>6</number>
+ </property>
+ <item row="3" column="0">
+ <widget class="QPushButton" name="buildInactiveButton">
+ <property name="text">
+ <string>Build inactive palette</string>
+ </property>
+ </widget>
+ </item>
+ <item row="3" column="1">
+ <widget class="QPushButton" name="buildDisabledButton">
+ <property name="text">
+ <string>Build disabled palette</string>
+ </property>
+ </widget>
+ </item>
+ <item row="3" column="3">
+ <spacer name="horizontalSpacer">
+ <property name="orientation">
+ <enum>Qt::Horizontal</enum>
+ </property>
+ <property name="sizeHint" stdset="0">
+ <size>
+ <width>117</width>
+ <height>20</height>
+ </size>
+ </property>
+ </spacer>
+ </item>
+ <item row="9" column="0" colspan="5">
+ <widget class="QDialogButtonBox" name="buttonBox">
+ <property name="orientation">
+ <enum>Qt::Horizontal</enum>
+ </property>
+ <property name="standardButtons">
+ <set>QDialogButtonBox::Cancel|QDialogButtonBox::Ok</set>
+ </property>
+ </widget>
+ </item>
+ <item row="0" column="0" colspan="5">
+ <widget class="QTableWidget" name="tableWidget">
+ <property name="editTriggers">
+ <set>QAbstractItemView::NoEditTriggers</set>
+ </property>
+ <property name="selectionMode">
+ <enum>QAbstractItemView::NoSelection</enum>
+ </property>
+ <property name="columnCount">
+ <number>0</number>
+ </property>
+ </widget>
+ </item>
+ <item row="3" column="2">
+ <widget class="QPushButton" name="resetPaletteButton">
+ <property name="text">
+ <string>Reset palette</string>
+ </property>
+ </widget>
+ </item>
+ </layout>
+ </widget>
+ <resources/>
+ <connections>
+ <connection>
+ <sender>buttonBox</sender>
+ <signal>accepted()</signal>
+ <receiver>PaletteEditDialog</receiver>
+ <slot>accept()</slot>
+ <hints>
+ <hint type="sourcelabel">
+ <x>248</x>
+ <y>254</y>
+ </hint>
+ <hint type="destinationlabel">
+ <x>157</x>
+ <y>274</y>
+ </hint>
+ </hints>
+ </connection>
+ <connection>
+ <sender>buttonBox</sender>
+ <signal>rejected()</signal>
+ <receiver>PaletteEditDialog</receiver>
+ <slot>reject()</slot>
+ <hints>
+ <hint type="sourcelabel">
+ <x>316</x>
+ <y>260</y>
+ </hint>
+ <hint type="destinationlabel">
+ <x>286</x>
+ <y>274</y>
+ </hint>
+ </hints>
+ </connection>
+ </connections>
+</ui>
diff --git a/src-qt5/core/lumina-theme-engine/src/lthemeengine/previewform.ui b/src-qt5/core/lumina-theme-engine/src/lthemeengine/previewform.ui
new file mode 100644
index 00000000..508201db
--- /dev/null
+++ b/src-qt5/core/lumina-theme-engine/src/lthemeengine/previewform.ui
@@ -0,0 +1,76 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<ui version="4.0">
+ <class>PreviewForm</class>
+ <widget class="QWidget" name="PreviewForm">
+ <property name="geometry">
+ <rect>
+ <x>0</x>
+ <y>0</y>
+ <width>281</width>
+ <height>130</height>
+ </rect>
+ </property>
+ <property name="windowTitle">
+ <string>Preview Window</string>
+ </property>
+ <layout class="QVBoxLayout" name="verticalLayout">
+ <item>
+ <widget class="QTabWidget" name="tabWidget">
+ <property name="currentIndex">
+ <number>0</number>
+ </property>
+ <widget class="QWidget" name="tab_3">
+ <attribute name="title">
+ <string>Tab 1</string>
+ </attribute>
+ <layout class="QGridLayout" name="gridLayout_4">
+ <item row="1" column="0">
+ <widget class="QPushButton" name="pushButton_3">
+ <property name="text">
+ <string>PushButton</string>
+ </property>
+ </widget>
+ </item>
+ <item row="1" column="1" colspan="2">
+ <widget class="QProgressBar" name="progressBar_2">
+ <property name="value">
+ <number>24</number>
+ </property>
+ </widget>
+ </item>
+ <item row="0" column="0">
+ <widget class="QLineEdit" name="lineEdit_2"/>
+ </item>
+ <item row="0" column="1" colspan="2">
+ <widget class="QSpinBox" name="spinBox_2"/>
+ </item>
+ </layout>
+ </widget>
+ <widget class="QWidget" name="tab_4">
+ <attribute name="title">
+ <string>Tab 2</string>
+ </attribute>
+ <layout class="QVBoxLayout" name="verticalLayout_3">
+ <item>
+ <widget class="QRadioButton" name="radioButton_7">
+ <property name="text">
+ <string>RadioButton</string>
+ </property>
+ </widget>
+ </item>
+ <item>
+ <widget class="QCheckBox" name="checkBox_2">
+ <property name="text">
+ <string>CheckBox</string>
+ </property>
+ </widget>
+ </item>
+ </layout>
+ </widget>
+ </widget>
+ </item>
+ </layout>
+ </widget>
+ <resources/>
+ <connections/>
+</ui>
diff --git a/src-qt5/core/lumina-theme-engine/src/lthemeengine/qsseditordialog.cpp b/src-qt5/core/lumina-theme-engine/src/lthemeengine/qsseditordialog.cpp
new file mode 100644
index 00000000..b92b5619
--- /dev/null
+++ b/src-qt5/core/lumina-theme-engine/src/lthemeengine/qsseditordialog.cpp
@@ -0,0 +1,85 @@
+/*
+ * Copyright (c) 2014-2017, Ilya Kotov <forkotov02@hotmail.ru>
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are
+ * met:
+ *
+ * 1. Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ *
+ * 2. Redistributions in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in
+ * the documentation and/or other materials provided with the
+ * distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ * HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+#include <QFile>
+#include <QSettings>
+#include "lthemeengine.h"
+#include "qsseditordialog.h"
+#include "ui_qsseditordialog.h"
+
+QSSEditorDialog::QSSEditorDialog(const QString &filePath, QWidget *parent) :
+ QDialog(parent),
+ m_ui(new Ui::QSSEditorDialog)
+{
+ m_ui->setupUi(this);
+ m_filePath = filePath;
+
+ QFile file(filePath);
+ file.open(QIODevice::ReadOnly);
+ m_ui->textEdit->setPlainText(QString::fromUtf8(file.readAll()));
+ setWindowTitle(tr("%1 - Style Sheet Editor").arg(file.fileName()));
+
+ QSettings settings(lthemeengine::configFile(), QSettings::IniFormat);
+ restoreGeometry(settings.value("QSSEditor/geometry").toByteArray());
+}
+
+QSSEditorDialog::~QSSEditorDialog()
+{
+ delete m_ui;
+}
+
+void QSSEditorDialog::save()
+{
+ QFile file(m_filePath);
+ file.open(QIODevice::WriteOnly);
+ file.write(m_ui->textEdit->toPlainText().toUtf8());
+}
+
+void QSSEditorDialog::hideEvent(QHideEvent *)
+{
+ QSettings settings(lthemeengine::configFile(), QSettings::IniFormat);
+ settings.setValue("QSSEditor/geometry", saveGeometry());
+}
+
+void QSSEditorDialog::on_buttonBox_clicked(QAbstractButton *button)
+{
+ QDialogButtonBox::StandardButton id = m_ui->buttonBox->standardButton(button);
+ if(id == QDialogButtonBox::Ok)
+ {
+ save();
+ accept();
+ }
+ else if(id == QDialogButtonBox::Save)
+ {
+ save();
+ }
+ else
+ {
+ reject();
+ }
+}
diff --git a/src-qt5/core/lumina-theme-engine/src/lthemeengine/qsseditordialog.h b/src-qt5/core/lumina-theme-engine/src/lthemeengine/qsseditordialog.h
new file mode 100644
index 00000000..e2a6c773
--- /dev/null
+++ b/src-qt5/core/lumina-theme-engine/src/lthemeengine/qsseditordialog.h
@@ -0,0 +1,59 @@
+/*
+ * Copyright (c) 2014-2017, Ilya Kotov <forkotov02@hotmail.ru>
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are
+ * met:
+ *
+ * 1. Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ *
+ * 2. Redistributions in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in
+ * the documentation and/or other materials provided with the
+ * distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ * HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+#ifndef QSSEDITORDIALOG_H
+#define QSSEDITORDIALOG_H
+
+#include <QDialog>
+#include <QString>
+
+namespace Ui {
+class QSSEditorDialog;
+}
+
+class QAbstractButton;
+
+class QSSEditorDialog : public QDialog
+{
+ Q_OBJECT
+
+public:
+ explicit QSSEditorDialog(const QString &filePath, QWidget *parent = 0);
+ ~QSSEditorDialog();
+
+private slots:
+ void on_buttonBox_clicked(QAbstractButton *button);
+
+private:
+ void save();
+ void hideEvent(QHideEvent *);
+ Ui::QSSEditorDialog *m_ui;
+ QString m_filePath;
+};
+
+#endif // QSSEDITORDIALOG_H
diff --git a/src-qt5/core/lumina-theme-engine/src/lthemeengine/qsseditordialog.ui b/src-qt5/core/lumina-theme-engine/src/lthemeengine/qsseditordialog.ui
new file mode 100644
index 00000000..7627b4d4
--- /dev/null
+++ b/src-qt5/core/lumina-theme-engine/src/lthemeengine/qsseditordialog.ui
@@ -0,0 +1,47 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<ui version="4.0">
+ <class>QSSEditorDialog</class>
+ <widget class="QDialog" name="QSSEditorDialog">
+ <property name="geometry">
+ <rect>
+ <x>0</x>
+ <y>0</y>
+ <width>643</width>
+ <height>499</height>
+ </rect>
+ </property>
+ <property name="windowTitle">
+ <string>Style Sheet Editor</string>
+ </property>
+ <layout class="QVBoxLayout" name="verticalLayout">
+ <property name="leftMargin">
+ <number>6</number>
+ </property>
+ <property name="rightMargin">
+ <number>6</number>
+ </property>
+ <property name="bottomMargin">
+ <number>6</number>
+ </property>
+ <item>
+ <widget class="QTextEdit" name="textEdit">
+ <property name="acceptRichText">
+ <bool>false</bool>
+ </property>
+ </widget>
+ </item>
+ <item>
+ <widget class="QDialogButtonBox" name="buttonBox">
+ <property name="orientation">
+ <enum>Qt::Horizontal</enum>
+ </property>
+ <property name="standardButtons">
+ <set>QDialogButtonBox::Cancel|QDialogButtonBox::Ok|QDialogButtonBox::Save</set>
+ </property>
+ </widget>
+ </item>
+ </layout>
+ </widget>
+ <resources/>
+ <connections/>
+</ui>
diff --git a/src-qt5/core/lumina-theme-engine/src/lthemeengine/qsspage.cpp b/src-qt5/core/lumina-theme-engine/src/lthemeengine/qsspage.cpp
new file mode 100644
index 00000000..10f21f48
--- /dev/null
+++ b/src-qt5/core/lumina-theme-engine/src/lthemeengine/qsspage.cpp
@@ -0,0 +1,232 @@
+/*
+ * Copyright (c) 2014-2017, Ilya Kotov <forkotov02@hotmail.ru>
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are
+ * met:
+ *
+ * 1. Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ *
+ * 2. Redistributions in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in
+ * the documentation and/or other materials provided with the
+ * distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ * HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+#include <QSettings>
+#include <QDir>
+#include <QInputDialog>
+#include <QMessageBox>
+#include <QFile>
+#include <QMenu>
+#include "lthemeengine.h"
+#include "qsseditordialog.h"
+#include "qsspage.h"
+#include "ui_qsspage.h"
+
+#define QSS_FULL_PATH_ROLE (Qt::ItemDataRole(Qt::UserRole))
+#define QSS_WRITABLE_ROLE (Qt::ItemDataRole(Qt::UserRole + 1))
+
+QSSPage::QSSPage(QWidget *parent) :
+ TabPage(parent),
+ m_ui(new Ui::QSSPage)
+{
+ m_ui->setupUi(this);
+ QDir("/").mkpath(lthemeengine::userStyleSheetPath());
+
+ m_menu = new QMenu(this);
+ m_menu->addAction(QIcon::fromTheme("accessories-text-editor"), tr("Edit"), this, SLOT(on_editButton_clicked()));
+ m_menu->addAction(tr("Rename"), this, SLOT(on_renameButton_clicked()));
+ m_menu->addSeparator();
+ m_menu->addAction(QIcon::fromTheme("edit-delete"), tr("Remove"), this, SLOT(on_removeButton_clicked()));
+
+ readSettings();
+
+ //icons
+ m_ui->createButton->setIcon(QIcon::fromTheme("document-new"));
+ m_ui->editButton->setIcon(QIcon::fromTheme("accessories-text-editor"));
+ m_ui->removeButton->setIcon(QIcon::fromTheme("edit-delete"));
+}
+
+QSSPage::~QSSPage()
+{
+ delete m_ui;
+}
+
+void QSSPage::writeSettings()
+{
+ QStringList styleSheets;
+ QSettings settings(lthemeengine::configFile(), QSettings::IniFormat);
+
+ for(int i = 0; i < m_ui->qssListWidget->count(); ++i)
+ {
+ QListWidgetItem *item = m_ui->qssListWidget->item(i);
+ if(item->checkState() == Qt::Checked)
+ styleSheets << item->data(QSS_FULL_PATH_ROLE).toString();
+ }
+
+ settings.setValue("Interface/stylesheets", styleSheets);
+}
+
+void QSSPage::on_qssListWidget_currentItemChanged(QListWidgetItem *current, QListWidgetItem *)
+{
+ if(current)
+ {
+ m_ui->editButton->setEnabled(current->data(QSS_WRITABLE_ROLE).toBool());
+ m_ui->removeButton->setEnabled(current->data(QSS_WRITABLE_ROLE).toBool());
+ m_ui->renameButton->setEnabled(current->data(QSS_WRITABLE_ROLE).toBool());
+ }
+ else
+ {
+ m_ui->editButton->setEnabled(false);
+ m_ui->removeButton->setEnabled(false);
+ m_ui->renameButton->setEnabled(false);
+ }
+}
+
+void QSSPage::on_createButton_clicked()
+{
+ QString name = QInputDialog::getText(this, tr("Enter Style Sheet Name"), tr("File name:"));
+ if(name.isEmpty())
+ return;
+
+ if(!name.endsWith(".qss", Qt::CaseInsensitive))
+ name.append(".qss");
+
+ QString filePath = lthemeengine::userStyleSheetPath() + name;
+
+ if(QFile::exists(filePath))
+ {
+ QMessageBox::warning(this, tr("Error"), tr("The file \"%1\" already exists").arg(filePath));
+ return;
+ }
+
+ //creating empty file
+ QFile file(filePath);
+ file.open(QIODevice::WriteOnly);
+ file.close();
+
+ //creating item
+ QFileInfo info(filePath);
+ QListWidgetItem *item = new QListWidgetItem(info.fileName(), m_ui->qssListWidget);
+ item->setToolTip(info.filePath());
+ item->setData(QSS_FULL_PATH_ROLE, info.filePath());
+ item->setData(QSS_WRITABLE_ROLE, info.isWritable());
+ item->setCheckState(Qt::Unchecked);
+}
+
+void QSSPage::on_editButton_clicked()
+{
+ QListWidgetItem *item = m_ui->qssListWidget->currentItem();
+ if(item)
+ {
+ QSSEditorDialog dialog(item->data(QSS_FULL_PATH_ROLE).toString(), this);
+ dialog.exec();
+ }
+}
+
+void QSSPage::on_removeButton_clicked()
+{
+ QListWidgetItem *item = m_ui->qssListWidget->currentItem();
+ if(!item)
+ return;
+
+ int button = QMessageBox::question(this, tr("Confirm Remove"),
+ tr("Are you sure you want to remove style sheet \"%1\"?")
+ .arg(item->text()),
+ QMessageBox::Yes | QMessageBox::No);
+ if(button == QMessageBox::Yes)
+ {
+ QFile::remove(item->data(QSS_FULL_PATH_ROLE).toString());
+ delete item;
+ }
+}
+
+void QSSPage::readSettings()
+{
+ //load stylesheets
+ m_ui->qssListWidget->clear();
+ findStyleSheets(lthemeengine::userStyleSheetPath());
+ findStyleSheets(lthemeengine::sharedStyleSheetPath().join(", "));
+
+ QSettings settings(lthemeengine::configFile(), QSettings::IniFormat);
+ QStringList styleSheets = settings.value("Interface/stylesheets").toStringList();
+ for(int i = 0; i < m_ui->qssListWidget->count(); ++i)
+ {
+ QListWidgetItem *item = m_ui->qssListWidget->item(i);
+ if(styleSheets.contains(item->data(QSS_FULL_PATH_ROLE).toString()))
+ item->setCheckState(Qt::Checked);
+ else
+ item->setCheckState(Qt::Unchecked);
+ }
+}
+
+void QSSPage::findStyleSheets(const QString &path)
+{
+ QDir dir(path);
+ dir.setFilter(QDir::Files);
+ dir.setNameFilters(QStringList() << "*.qss");
+
+ foreach (QFileInfo info, dir.entryInfoList())
+ {
+ QListWidgetItem *item = new QListWidgetItem(info.fileName(), m_ui->qssListWidget);
+ item->setToolTip(info.filePath());
+ item->setData(QSS_FULL_PATH_ROLE, info.filePath());
+ item->setData(QSS_WRITABLE_ROLE, info.isWritable());
+ }
+}
+
+void QSSPage::on_renameButton_clicked()
+{
+ QListWidgetItem *item = m_ui->qssListWidget->currentItem();
+ if(!item)
+ return;
+
+ QString name = QInputDialog::getText(this, tr("Rename Style Sheet"), tr("Style sheet name:"),
+ QLineEdit::Normal, item->text(), 0);
+ if(name.isEmpty())
+ return;
+
+ if(!m_ui->qssListWidget->findItems(name, Qt::MatchExactly).isEmpty())
+ {
+ QMessageBox::warning(this, tr("Error"), tr("The style sheet \"%1\" already exists").arg(name));
+ return;
+ }
+
+ if(!name.endsWith(".qss", Qt::CaseInsensitive))
+ name.append(".qss");
+
+ QString newPath = lthemeengine::userStyleSheetPath() + name;
+
+ if(!QFile::rename(item->data(QSS_FULL_PATH_ROLE).toString(), newPath))
+ {
+ QMessageBox::warning(this, tr("Error"), tr("Unable to rename file"));
+ return;
+ }
+
+ item->setText(name);
+ item->setData(QSS_FULL_PATH_ROLE, newPath);
+ item->setToolTip(newPath);
+}
+
+void QSSPage::on_qssListWidget_customContextMenuRequested(const QPoint &pos)
+{
+ QListWidgetItem *item = m_ui->qssListWidget->currentItem();
+ if(item && item->data(QSS_WRITABLE_ROLE).toBool())
+ {
+ m_menu->exec(m_ui->qssListWidget->viewport()->mapToGlobal(pos));
+ }
+}
diff --git a/src-qt5/core/lumina-theme-engine/src/lthemeengine/qsspage.h b/src-qt5/core/lumina-theme-engine/src/lthemeengine/qsspage.h
new file mode 100644
index 00000000..665f68c0
--- /dev/null
+++ b/src-qt5/core/lumina-theme-engine/src/lthemeengine/qsspage.h
@@ -0,0 +1,66 @@
+/*
+ * Copyright (c) 2014-2017, Ilya Kotov <forkotov02@hotmail.ru>
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are
+ * met:
+ *
+ * 1. Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ *
+ * 2. Redistributions in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in
+ * the documentation and/or other materials provided with the
+ * distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ * HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+#ifndef QSSPAGE_H
+#define QSSPAGE_H
+
+#include "tabpage.h"
+
+namespace Ui {
+class QSSPage;
+}
+
+class QListWidgetItem;
+class QMenu;
+
+class QSSPage : public TabPage
+{
+ Q_OBJECT
+
+public:
+ explicit QSSPage(QWidget *parent = 0);
+ ~QSSPage();
+
+ void writeSettings();
+
+private slots:
+ void on_qssListWidget_currentItemChanged(QListWidgetItem *current, QListWidgetItem *);
+ void on_createButton_clicked();
+ void on_editButton_clicked();
+ void on_removeButton_clicked();
+ void on_renameButton_clicked();
+ void on_qssListWidget_customContextMenuRequested(const QPoint &pos);
+
+private:
+ void readSettings();
+ void findStyleSheets(const QString &path);
+ Ui::QSSPage *m_ui;
+ QMenu *m_menu;
+};
+
+#endif // QSSPAGE_H
diff --git a/src-qt5/core/lumina-theme-engine/src/lthemeengine/qsspage.ui b/src-qt5/core/lumina-theme-engine/src/lthemeengine/qsspage.ui
new file mode 100644
index 00000000..124b4dc6
--- /dev/null
+++ b/src-qt5/core/lumina-theme-engine/src/lthemeengine/qsspage.ui
@@ -0,0 +1,84 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<ui version="4.0">
+ <class>QSSPage</class>
+ <widget class="QWidget" name="QSSPage">
+ <property name="geometry">
+ <rect>
+ <x>0</x>
+ <y>0</y>
+ <width>483</width>
+ <height>320</height>
+ </rect>
+ </property>
+ <property name="windowTitle">
+ <string notr="true">Style Sheet Editor</string>
+ </property>
+ <layout class="QGridLayout" name="gridLayout">
+ <item row="1" column="0">
+ <widget class="QPushButton" name="createButton">
+ <property name="enabled">
+ <bool>true</bool>
+ </property>
+ <property name="text">
+ <string>Create</string>
+ </property>
+ </widget>
+ </item>
+ <item row="1" column="3">
+ <widget class="QPushButton" name="removeButton">
+ <property name="enabled">
+ <bool>false</bool>
+ </property>
+ <property name="text">
+ <string>Remove</string>
+ </property>
+ </widget>
+ </item>
+ <item row="1" column="5">
+ <spacer name="horizontalSpacer">
+ <property name="orientation">
+ <enum>Qt::Horizontal</enum>
+ </property>
+ <property name="sizeHint" stdset="0">
+ <size>
+ <width>189</width>
+ <height>20</height>
+ </size>
+ </property>
+ </spacer>
+ </item>
+ <item row="0" column="0" colspan="6">
+ <widget class="QListWidget" name="qssListWidget">
+ <property name="contextMenuPolicy">
+ <enum>Qt::CustomContextMenu</enum>
+ </property>
+ <property name="alternatingRowColors">
+ <bool>true</bool>
+ </property>
+ </widget>
+ </item>
+ <item row="1" column="1">
+ <widget class="QPushButton" name="editButton">
+ <property name="enabled">
+ <bool>false</bool>
+ </property>
+ <property name="text">
+ <string>Edit</string>
+ </property>
+ </widget>
+ </item>
+ <item row="1" column="2">
+ <widget class="QPushButton" name="renameButton">
+ <property name="enabled">
+ <bool>false</bool>
+ </property>
+ <property name="text">
+ <string>Rename</string>
+ </property>
+ </widget>
+ </item>
+ </layout>
+ </widget>
+ <resources/>
+ <connections/>
+</ui>
diff --git a/src-qt5/core/lumina-theme-engine/src/lthemeengine/tabpage.cpp b/src-qt5/core/lumina-theme-engine/src/lthemeengine/tabpage.cpp
new file mode 100644
index 00000000..251ce024
--- /dev/null
+++ b/src-qt5/core/lumina-theme-engine/src/lthemeengine/tabpage.cpp
@@ -0,0 +1,33 @@
+/*
+ * Copyright (c) 2014-2017, Ilya Kotov <forkotov02@hotmail.ru>
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are
+ * met:
+ *
+ * 1. Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ *
+ * 2. Redistributions in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in
+ * the documentation and/or other materials provided with the
+ * distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ * HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+#include "tabpage.h"
+
+TabPage::TabPage(QWidget *parent) : QWidget(parent)
+{
+}
diff --git a/src-qt5/core/lumina-theme-engine/src/lthemeengine/tabpage.h b/src-qt5/core/lumina-theme-engine/src/lthemeengine/tabpage.h
new file mode 100644
index 00000000..ac285054
--- /dev/null
+++ b/src-qt5/core/lumina-theme-engine/src/lthemeengine/tabpage.h
@@ -0,0 +1,43 @@
+/*
+ * Copyright (c) 2014-2017, Ilya Kotov <forkotov02@hotmail.ru>
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are
+ * met:
+ *
+ * 1. Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ *
+ * 2. Redistributions in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in
+ * the documentation and/or other materials provided with the
+ * distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ * HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+#ifndef TABPAGE_H
+#define TABPAGE_H
+
+#include <QWidget>
+
+class TabPage : public QWidget
+{
+ Q_OBJECT
+public:
+ explicit TabPage(QWidget *parent = 0);
+
+ virtual void writeSettings() = 0;
+};
+
+#endif // TABPAGE_H
diff --git a/src-qt5/core/lumina-wm-INCOMPLETE/DEPENDENCIES b/src-qt5/core/lumina-wm-INCOMPLETE/DEPENDENCIES
deleted file mode 100644
index fa0ce486..00000000
--- a/src-qt5/core/lumina-wm-INCOMPLETE/DEPENDENCIES
+++ /dev/null
@@ -1,17 +0,0 @@
-Most dependencies required to build Lumina are listed in the
-DEPENDENCIES file in the directory above this one. The following
-are dependencies specific to Lumina's window manager.
-
-
-FreeBSD/TrueOS
-=======================
-
-
-
-
-Linux (Debian/Ubuntu)
-=======================
-
-libxcb-screensaver0-dev
-
-
diff --git a/src-qt5/core/lumina-wm-INCOMPLETE/GlobalDefines.h b/src-qt5/core/lumina-wm-INCOMPLETE/GlobalDefines.h
deleted file mode 100644
index 3ec278ac..00000000
--- a/src-qt5/core/lumina-wm-INCOMPLETE/GlobalDefines.h
+++ /dev/null
@@ -1,74 +0,0 @@
-//===========================================
-// Lumina-DE source code
-// Copyright (c) 2015, Ken Moore
-// Available under the 3-clause BSD license
-// See the LICENSE file for full details
-//===========================================
-// Global defines and enumerations for the window manager
-//===========================================
-#ifndef _LUMINA_WINDOW_MANAGER_GLOBAL_DEFINES_H
-#define _LUMINA_WINDOW_MANAGER_GLOBAL_DEFINES_H
-
-//Qt includes
-#include <QObject>
-#include <QFrame>
-#include <QLabel>
-#include <QToolButton>
-#include <QMenu>
-#include <QHBoxLayout>
-#include <QMouseEvent>
-#include <QAction>
-#include <QPoint>
-#include <QFile>
-#include <QDir>
-#include <QString>
-#include <QTextStream>
-#include <QUrl>
-#include <QDebug>
-#include <QStringList>
-#include <QAbstractNativeEventFilter>
-#include <QList>
-#include <QX11Info>
-#include <QCoreApplication>
-#include <QPropertyAnimation>
-#include <QAnimationGroup>
-#include <QParallelAnimationGroup>
-#include <QWindow>
-#include <QWidget>
-#include <QBackingStore>
-#include <QPaintEvent>
-#include <QPainter>
-#include <QSettings>
-#include <QHostInfo>
-#include <QDesktopWidget>
-#include <QStyleOption>
-#include <QThread>
-
-// libLumina includes
-#include <LuminaX11.h>
-#include <LuminaXDG.h>
-#include <LuminaOS.h>
-#include <LuminaThemes.h>
-#include <LuminaUtils.h>
-#include <LuminaSingleApplication.h>
-
-//XCB Includes
-#include <xcb/xcb.h>
-#include <xcb/xproto.h>
-#include <xcb/damage.h>
-#include <xcb/xcb_atom.h>
-#include <xcb/xcb_aux.h> //included in libxcb-util.so
-
-#define ANIMTIME 80 //animation time in milliseconds
-//Global flags/structures
-namespace LWM{
- //Flags/enumerations
- enum WindowAction{MoveResize, Show, Hide, TryClose, Closed, WA_NONE};
-
- //Data structures
- extern LXCB *SYSTEM;
-};
-
-
-
-#endif
diff --git a/src-qt5/core/lumina-wm-INCOMPLETE/LLockScreen.cpp b/src-qt5/core/lumina-wm-INCOMPLETE/LLockScreen.cpp
deleted file mode 100644
index 4cc6d68b..00000000
--- a/src-qt5/core/lumina-wm-INCOMPLETE/LLockScreen.cpp
+++ /dev/null
@@ -1,102 +0,0 @@
-//===========================================
-// Lumina-DE source code
-// Copyright (c) 2015, Ken Moore
-// Available under the 3-clause BSD license
-// See the LICENSE file for full details
-//===========================================
-#include "LLockScreen.h"
-#include "ui_LLockScreen.h"
-
-#include <unistd.h>
-
-#define NUMTRIES 3
-#define WAITMINS 1
-#define DEBUG 1
-
-LLockScreen::LLockScreen(QWidget *parent) : QWidget(parent), ui(new Ui::LLockScreen()){
- ui->setupUi(this);
- waittime = new QTimer(this);
- waittime->setInterval(WAITMINS*60000); //(too many attempts in short time)
- waittime->setSingleShot(true);
- refreshtime = new QTimer(this); //timer to update the wait time display
- refreshtime->setInterval(6000); //6 seconds (1/10 second)
-
- connect(ui->tool_unlock, SIGNAL(clicked()), this, SLOT(TryUnlock()) );
- connect(ui->line_password, SIGNAL(returnPressed()), this, SLOT(TryUnlock()) );
- connect(ui->line_password, SIGNAL(textEdited(QString)), this, SIGNAL(InputDetected()) );
- connect(ui->line_password, SIGNAL(cursorPositionChanged(int,int)), this, SIGNAL(InputDetected()) );
- connect(waittime, SIGNAL(timeout()), this, SLOT(aboutToShow()) );
- connect(refreshtime, SIGNAL(timeout()), this, SLOT(UpdateLockInfo()) );
-}
-
-LLockScreen::~LLockScreen(){
-
-}
-
-void LLockScreen::LoadSystemDetails(){
- //Run every time the screen is initially locked
- QString user = QString(getlogin());
- ui->label_username->setText( QString(tr("Locked by: %1")).arg(user) );
- ui->label_hostname->setText( QHostInfo::localHostName() );
- ui->tool_unlock->setIcon( LXDG::findIcon("document-decrypt","") );
- attempts = 0;
-}
-
-void LLockScreen::aboutToHide(){
- //auto-hide timeout - clear display
- ui->line_password->clear();
- ui->line_password->clearFocus();
- if(refreshtime->isActive()){ refreshtime->stop(); }
-}
-
-void LLockScreen::aboutToShow(){
- if(!waittime->isActive()){
- ui->label_info->clear();
- this->setEnabled(true);
- triesleft = NUMTRIES; //back to initial number of tries
- if(refreshtime->isActive()){ refreshtime->stop(); }
- }else{
- if(!refreshtime->isActive()){ refreshtime->start(); }
- }
- UpdateLockInfo();
- ui->line_password->clear();
- ui->line_password->setFocus();
-}
-
-// =================
-// PRIVATE SLOTS
-// =================
-void LLockScreen::UpdateLockInfo(){
- QString info;
- /*if(triesleft>0 && triesleft<NUMTRIES ){
- if(triesleft==1){info = tr("1 Attempt Left"); }
- else{info = QString(tr("%1 Attempts Left")).arg(QString::number(triesleft)); }
- }else*/
- if(waittime->isActive()){
- info = tr("Too Many Failures")+"\n"+ QString(tr("Wait %1 Minutes")).arg( QString::number(qRound(waittime->remainingTime()/6000.0)/10.0) );
- }else if(attempts>0){ info.append("\n"+QString(tr("Failed Attempts: %1")).arg(QString::number(attempts)) ); }
- ui->label_info->setText(info);
-}
-
-void LLockScreen::TryUnlock(){
- attempts++;
- this->setEnabled(false);
- QString pass = ui->line_password->text();
- ui->line_password->clear();
- bool ok = (LUtils::runCmd("lumina-checkpass", QStringList() << pass) == 0);
- if(ok){
- emit ScreenUnlocked();
- this->setEnabled(true);
- }else{
- triesleft--;
- if(triesleft>0){
- this->setEnabled(true);
- }else{
- waittime->start();
- refreshtime->start();
- }
- ui->line_password->setFocus();
- }
- UpdateLockInfo();
-
-}
diff --git a/src-qt5/core/lumina-wm-INCOMPLETE/LLockScreen.h b/src-qt5/core/lumina-wm-INCOMPLETE/LLockScreen.h
deleted file mode 100644
index 040499c1..00000000
--- a/src-qt5/core/lumina-wm-INCOMPLETE/LLockScreen.h
+++ /dev/null
@@ -1,42 +0,0 @@
-//===========================================
-// Lumina-DE source code
-// Copyright (c) 2015, Ken Moore
-// Available under the 3-clause BSD license
-// See the LICENSE file for full details
-//===========================================
-#ifndef _LUMINA_DESKTOP_LOCK_SCREEN_WIDGET_H
-#define _LUMINA_DESKTOP_LOCK_SCREEN_WIDGET_H
-
-#include "GlobalDefines.h"
-
-namespace Ui{
- class LLockScreen;
-};
-
-class LLockScreen : public QWidget{
- Q_OBJECT
-public:
- LLockScreen(QWidget *parent = 0);
- ~LLockScreen();
-
- void LoadSystemDetails(); //Run right after the screen is initially locked
-
-public slots:
- void aboutToHide(); //auto-hide timeout (can happen multiple times per lock)
- void aboutToShow(); //about to be re-shown (can happen multiple times per lock)
-
-private:
- Ui::LLockScreen *ui;
- int triesleft, attempts;
- QTimer *waittime;
- QTimer *refreshtime;
-
-private slots:
- void UpdateLockInfo();
- void TryUnlock();
-
-signals:
- void ScreenUnlocked();
- void InputDetected();
-};
-#endif
diff --git a/src-qt5/core/lumina-wm-INCOMPLETE/LLockScreen.ui b/src-qt5/core/lumina-wm-INCOMPLETE/LLockScreen.ui
deleted file mode 100644
index 7f0b45b8..00000000
--- a/src-qt5/core/lumina-wm-INCOMPLETE/LLockScreen.ui
+++ /dev/null
@@ -1,144 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<ui version="4.0">
- <class>LLockScreen</class>
- <widget class="QWidget" name="LLockScreen">
- <property name="geometry">
- <rect>
- <x>0</x>
- <y>0</y>
- <width>289</width>
- <height>188</height>
- </rect>
- </property>
- <property name="windowTitle">
- <string>Form</string>
- </property>
- <layout class="QVBoxLayout" name="verticalLayout_2">
- <property name="spacing">
- <number>0</number>
- </property>
- <property name="leftMargin">
- <number>0</number>
- </property>
- <property name="topMargin">
- <number>0</number>
- </property>
- <property name="rightMargin">
- <number>0</number>
- </property>
- <property name="bottomMargin">
- <number>0</number>
- </property>
- <item>
- <widget class="QFrame" name="frame_unlock">
- <property name="frameShape">
- <enum>QFrame::NoFrame</enum>
- </property>
- <property name="frameShadow">
- <enum>QFrame::Raised</enum>
- </property>
- <layout class="QVBoxLayout" name="verticalLayout">
- <item>
- <widget class="QLabel" name="label_hostname">
- <property name="font">
- <font>
- <weight>50</weight>
- <italic>true</italic>
- <bold>false</bold>
- <underline>true</underline>
- </font>
- </property>
- <property name="text">
- <string notr="true">hostname</string>
- </property>
- <property name="alignment">
- <set>Qt::AlignCenter</set>
- </property>
- </widget>
- </item>
- <item>
- <widget class="QLabel" name="label_username">
- <property name="text">
- <string notr="true">Locked by username</string>
- </property>
- <property name="alignment">
- <set>Qt::AlignCenter</set>
- </property>
- </widget>
- </item>
- <item>
- <spacer name="verticalSpacer_3">
- <property name="orientation">
- <enum>Qt::Vertical</enum>
- </property>
- <property name="sizeHint" stdset="0">
- <size>
- <width>20</width>
- <height>20</height>
- </size>
- </property>
- </spacer>
- </item>
- <item>
- <widget class="QLabel" name="label_info">
- <property name="font">
- <font>
- <italic>true</italic>
- </font>
- </property>
- <property name="text">
- <string notr="true"/>
- </property>
- <property name="alignment">
- <set>Qt::AlignCenter</set>
- </property>
- <property name="wordWrap">
- <bool>true</bool>
- </property>
- </widget>
- </item>
- <item>
- <layout class="QVBoxLayout" name="verticalLayout_3">
- <item>
- <widget class="QLineEdit" name="line_password">
- <property name="inputMask">
- <string notr="true"/>
- </property>
- <property name="echoMode">
- <enum>QLineEdit::Password</enum>
- </property>
- <property name="alignment">
- <set>Qt::AlignCenter</set>
- </property>
- <property name="placeholderText">
- <string>Password</string>
- </property>
- </widget>
- </item>
- <item>
- <layout class="QHBoxLayout" name="horizontalLayout">
- <item>
- <widget class="QToolButton" name="tool_unlock">
- <property name="focusPolicy">
- <enum>Qt::NoFocus</enum>
- </property>
- <property name="text">
- <string>Unlock Session</string>
- </property>
- <property name="toolButtonStyle">
- <enum>Qt::ToolButtonTextBesideIcon</enum>
- </property>
- </widget>
- </item>
- </layout>
- </item>
- </layout>
- </item>
- </layout>
- </widget>
- </item>
- </layout>
- </widget>
- <resources/>
- <connections/>
-</ui>
diff --git a/src-qt5/core/lumina-wm-INCOMPLETE/LScreenSaver.cpp b/src-qt5/core/lumina-wm-INCOMPLETE/LScreenSaver.cpp
deleted file mode 100644
index 0c92784e..00000000
--- a/src-qt5/core/lumina-wm-INCOMPLETE/LScreenSaver.cpp
+++ /dev/null
@@ -1,181 +0,0 @@
-//===========================================
-// Lumina-DE source code
-// Copyright (c) 2015, Ken Moore
-// Available under the 3-clause BSD license
-// See the LICENSE file for full details
-//===========================================
-#include "LScreenSaver.h"
-#include <QScreen>
-#include <QApplication>
-
-#define DEBUG 1
-
-LScreenSaver::LScreenSaver() : QWidget(0,Qt::BypassWindowManagerHint | Qt::WindowStaysOnTopHint){
- starttimer = new QTimer(this);
- starttimer->setSingleShot(true);
- locktimer = new QTimer(this);
- locktimer->setSingleShot(true);
- hidetimer = new QTimer(this);
- hidetimer->setSingleShot(true);
-
- LOCKER = new LLockScreen(this);
- LOCKER->hide();
- settings = new QSettings("lumina-desktop","lumina-screensaver",this);
- SSRunning = SSLocked = updating = false;
- this->setObjectName("LSCREENSAVERBASE");
- this->setStyleSheet("LScreenSaver#LSCREENSAVERBASE{ background: grey; }");
- this->setMouseTracking(true);
- connect(starttimer, SIGNAL(timeout()), this, SLOT(ShowScreenSaver()) );
- connect(locktimer, SIGNAL(timeout()), this, SLOT(LockScreen()) );
- connect(hidetimer, SIGNAL(timeout()), this, SLOT(HideLockScreen()) );
- connect(LOCKER, SIGNAL(ScreenUnlocked()), this, SLOT(SSFinished()) );
- connect(LOCKER, SIGNAL(InputDetected()), this, SLOT(newInputEvent()) );
-}
-
-LScreenSaver::~LScreenSaver(){
-
-}
-
-bool LScreenSaver::isLocked(){
- return SSLocked;
-}
-
-void LScreenSaver::UpdateTimers(){
- //This is generally used for programmatic changes
- if(starttimer->isActive()){ starttimer->stop();}
- if(locktimer->isActive()){ locktimer->stop(); }
- if(hidetimer->isActive()){ hidetimer->stop(); }
-
- if(!SSRunning && !SSLocked && (starttimer->interval() > 1000) ){ starttimer->start(); } //time to SS start
- else if( SSRunning && !SSLocked && (locktimer->interval() > 1000 ) ){ locktimer->start(); } //time to lock
- else if( !SSRunning && SSLocked ){ hidetimer->start(); } //time to hide lock screen
-}
-
-// ===========
-// PUBLIC SLOTS
-// ===========
-void LScreenSaver::start(){
- reloadSettings(); //setup all the initial time frames
- starttimer->start();
-}
-
-void LScreenSaver::reloadSettings(){
- settings->sync();
- starttimer->setInterval( settings->value("timedelaymin",10).toInt() * 60000 );
- locktimer->setInterval( settings->value("lockdelaymin",1).toInt() * 60000 );
- hidetimer->setInterval( settings->value("hidesecs",15).toInt() * 1000 );
-}
-
-void LScreenSaver::newInputEvent(){
- if(updating){ return; } //in the middle of making changes which could cause an event
- if(DEBUG){ qDebug() << "New Input Event"; }
- if(SSRunning && SSLocked){
- //Running and locked
- // Hide the running setting, and display the lock screen
- HideScreenSaver();
- ShowLockScreen();
- }else if(SSRunning){
- //Only running, not locked
- HideScreenSaver();
- }
- UpdateTimers();
-
-}
-
-void LScreenSaver::LockScreenNow(){
- ShowScreenSaver();
- LockScreen();
-}
-
-// ===========
-// PRIVATE SLOTS
-// ===========
-void LScreenSaver::ShowScreenSaver(){
- if(DEBUG){ qDebug() << "Showing Screen Saver:" << QDateTime::currentDateTime().toString(); }
- SSRunning = true;
- updating = true;
- //Now remove any current Base widgets (prevent any lingering painting between sessions)
- for(int i=0; i<BASES.length(); i++){
- if(DEBUG){ qDebug() << " - Removing SS Base"; }
- delete BASES.takeAt(i); i--;
- }
- //Now go through and create/show all the various widgets
- QList<QScreen*> SCREENS = QApplication::screens();
- QRect bounds;
- cBright = LOS::ScreenBrightness();
- if(cBright>0){ LOS::setScreenBrightness(cBright/2); } //cut to half while the screensaver is active
- for(int i=0; i<SCREENS.length(); i++){
- bounds = bounds.united(SCREENS[i]->geometry());
- if(DEBUG){ qDebug() << " - New SS Base:" << i; }
- BASES << new SSBaseWidget(this, settings);
- connect(BASES[i], SIGNAL(InputDetected()), this, SLOT(newInputEvent()) );
- //Setup the geometry of the base to match the screen
- BASES[i]->setGeometry(SCREENS[i]->geometry()); //match this screen geometry
- BASES[i]->setPlugin(settings->value("screenplugin"+QString::number(i+1), settings->value("defaultscreenplugin","random").toString() ).toString() );
- }
- //Now set the overall parent widget geometry and show everything
- this->setGeometry(bounds); //overall background widget
- if(!this->isActiveWindow()){
- this->raise();
- this->show();
- this->activateWindow();
- }
- for(int i=0; i<BASES.length(); i++){
- BASES[i]->show();
- BASES[i]->startPainting();
- }
- updating = false;
- UpdateTimers();
-}
-
-void LScreenSaver::ShowLockScreen(){
- if(DEBUG){ qDebug() << "Showing Lock Screen:" << QDateTime::currentDateTime().toString(); }
- LOCKER->aboutToShow();
- //Move the screen locker to the appropriate spot
- QPoint ctr = QApplication::desktop()->screenGeometry(QCursor::pos()).center();
- LOCKER->resize(LOCKER->sizeHint());
- LOCKER->move(ctr - QPoint(LOCKER->width()/2, LOCKER->height()/2) );
- LOCKER->show();
- //Start the timer for hiding the lock screen due to inactivity
- UpdateTimers();
-}
-
-void LScreenSaver::HideScreenSaver(){
- if(DEBUG){ qDebug() << "Hiding Screen Saver:" << QDateTime::currentDateTime().toString(); }
- SSRunning = false;
- if(cBright>0){ LOS::setScreenBrightness(cBright); } //return to current brightness
- if(!SSLocked){
- this->hide();
- emit ClosingScreenSaver();
- }
- for(int i=0; i<BASES.length(); i++){
- BASES[i]->hide();
- BASES[i]->stopPainting();
- }
- UpdateTimers();
-}
-
-void LScreenSaver::HideLockScreen(){
- if(DEBUG){ qDebug() << "Hiding Lock Screen:" << QDateTime::currentDateTime().toString(); }
- //Leave the Locked flag set (still locked, just not visible)
- LOCKER->aboutToHide();
- LOCKER->hide();
- this->repaint();
- if(SSLocked){ ShowScreenSaver(); }
- UpdateTimers();
-}
-
-void LScreenSaver::LockScreen(){
- if(SSLocked){ return; }
- if(DEBUG){ qDebug() << "Locking Screen:" << QDateTime::currentDateTime().toString(); }
- SSLocked = true;
- LOCKER->LoadSystemDetails();
- UpdateTimers();
-}
-
-void LScreenSaver::SSFinished(){
- if(DEBUG){ qDebug() << "Screensaver Finished:" << QDateTime::currentDateTime().toString(); }
- SSLocked = false;
- HideLockScreen();
- HideScreenSaver();
-}
diff --git a/src-qt5/core/lumina-wm-INCOMPLETE/LScreenSaver.h b/src-qt5/core/lumina-wm-INCOMPLETE/LScreenSaver.h
deleted file mode 100644
index 5119d8b1..00000000
--- a/src-qt5/core/lumina-wm-INCOMPLETE/LScreenSaver.h
+++ /dev/null
@@ -1,59 +0,0 @@
-//===========================================
-// Lumina-DE source code
-// Copyright (c) 2015, Ken Moore
-// Available under the 3-clause BSD license
-// See the LICENSE file for full details
-//===========================================
-#ifndef _LUMINA_DESKTOP_SCREEN_SAVER_H
-#define _LUMINA_DESKTOP_SCREEN_SAVER_H
-
-#include "GlobalDefines.h"
-
-#include "SSBaseWidget.h"
-#include "LLockScreen.h"
-
-class LScreenSaver : public QWidget{
- Q_OBJECT
-public:
- LScreenSaver();
- ~LScreenSaver();
-
- bool isLocked();
-
-private:
- QTimer *starttimer, *locktimer, *hidetimer;
- QSettings *settings;
- QList<SSBaseWidget*> BASES;
- LLockScreen *LOCKER;
- int cBright;
- bool SSRunning, SSLocked, updating;
-
- void UpdateTimers();
-
-public slots:
- void start();
- void reloadSettings();
- void newInputEvent();
- void LockScreenNow();
-
-private slots:
- void ShowScreenSaver();
- void ShowLockScreen();
- void HideScreenSaver();
- void HideLockScreen();
-
- void LockScreen();
- void SSFinished();
-
-signals:
- void StartingScreenSaver();
- void ClosingScreenSaver();
-
-protected:
- void mouseMoveEvent(QMouseEvent*){
- QTimer::singleShot(0,this, SLOT(newInputEvent()));
- }
-
-};
-
-#endif \ No newline at end of file
diff --git a/src-qt5/core/lumina-wm-INCOMPLETE/LWindow.cpp b/src-qt5/core/lumina-wm-INCOMPLETE/LWindow.cpp
deleted file mode 100644
index 84ff2ffd..00000000
--- a/src-qt5/core/lumina-wm-INCOMPLETE/LWindow.cpp
+++ /dev/null
@@ -1,474 +0,0 @@
-//===========================================
-// Lumina-DE source code
-// Copyright (c) 2015, Ken Moore
-// Available under the 3-clause BSD license
-// See the LICENSE file for full details
-//===========================================
-#include "LWindow.h"
-
-LWindowFrame::LWindowFrame(WId client, QWidget *parent) : QFrame(parent, Qt::X11BypassWindowManagerHint){
- activeState = LWindowFrame::Normal;
- CID = client;
- lastAction = LWM::WA_NONE;
- Closing = false;
- //qDebug() << "New Window:" << CID << "Frame:" << this->winId();
- this->setMouseTracking(true); //need this to determine mouse location when not clicked
- this->setObjectName("LWindowFrame");
- this->setStyleSheet("LWindowFrame#LWindowFrame{ border: 2px solid white; border-radius:3px; } QWidget#TitleBar{background: grey; } QLabel{ color: black; }");
- InitWindow(); //initially create all the child widgets
- //LWM::SYSTEM->setupEventsForFrame(this->winId());
- updateAppearance(); //this loads the appearance based on window/theme settings
- //QApplication::processEvents();
- //Now set the frame size on this window
- SyncSize();
- SyncText();
- this->show();
-}
-
-LWindowFrame::~LWindowFrame(){
-}
-
-// =================
-// PRIVATE
-// =================
-void LWindowFrame::InitWindow(){
- anim = new QPropertyAnimation(this); //For simple window animations
- anim->setTargetObject(this);
- anim->setDuration(ANIMTIME); //In milliseconds
- connect(anim, SIGNAL(finished()), this, SLOT(finishedAnimation()) );
- titleBar = new QLabel(this); //This is the "container" for all the title buttons/widgets
- titleBar->setObjectName("TitleBar");
- titleBar->setSizePolicy(QSizePolicy::Minimum,QSizePolicy::Minimum);
- titleBar->setFocusPolicy(Qt::NoFocus);
- titleBar->setCursor(Qt::ArrowCursor);
- title = new QLabel(this); //Shows the window title/text
- title->setObjectName("Title");
- title->setSizePolicy(QSizePolicy::Expanding, QSizePolicy::Preferred);
- title->setCursor(Qt::ArrowCursor);
- title->setFocusPolicy(Qt::NoFocus);
- icon = new QLabel(this); //Contains the window icon
- icon->setObjectName("Icon");
- icon->setCursor(Qt::ArrowCursor);
- icon->setFocusPolicy(Qt::NoFocus);
- minB = new QToolButton(this); //Minimize Button
- minB->setObjectName("Minimize");
- minB->setCursor(Qt::ArrowCursor);
- minB->setFocusPolicy(Qt::NoFocus);
- connect(minB, SIGNAL(clicked()), this, SLOT(minClicked()) );
- maxB = new QToolButton(this); //Maximize Button
- maxB->setObjectName("Maximize");
- maxB->setCursor(Qt::ArrowCursor);
- maxB->setFocusPolicy(Qt::NoFocus);
- connect(maxB, SIGNAL(clicked()), this, SLOT(maxClicked()) );
- closeB = new QToolButton(this);
- closeB->setObjectName("Close");
- closeB->setCursor(Qt::ArrowCursor);
- closeB->setFocusPolicy(Qt::NoFocus);
- connect(closeB, SIGNAL(clicked()), this, SLOT(closeClicked()) );
- otherB = new QToolButton(this); //Button to place any other actions
- otherB->setObjectName("Options");
- otherB->setCursor(Qt::ArrowCursor);
- otherB->setPopupMode(QToolButton::InstantPopup);
- otherB->setStyleSheet("QToolButton::menu-indicator{ image: none; }");
- otherB->setFocusPolicy(Qt::NoFocus);
- otherM = new QMenu(this); //menu of "other" actions for the window
- otherB->setMenu(otherM);
- connect(otherM, SIGNAL(triggered(QAction*)), this, SLOT(otherClicked(QAction*)) );
- //Now assemble the titlebar
- QHBoxLayout *HL = new QHBoxLayout(this);
- HL->setContentsMargins(0,0,0,0);
- HL->addWidget(otherB);
- HL->addWidget(icon);
- HL->addWidget(title);
- HL->addWidget(minB);
- HL->addWidget(maxB);
- HL->addWidget(closeB);
- titleBar->setLayout(HL);
- QVBoxLayout *VL = new QVBoxLayout(this);
- this->setLayout(VL);
- //The WinWidget container appears shifted right/down by 1 pixel for some reason
- // Adjust the margins to account for this variation
- VL->setContentsMargins(1,1,2,2);
- VL->setSpacing(0);
- //Have the window take the same initial size of the client window
- QRect geom = LWM::SYSTEM->WM_Window_Geom(CID);
- qDebug() << " - Load Size Hints" << "initial size:" << geom.size();
- icccm_size_hints SH = LWM::SYSTEM->WM_ICCCM_GetNormalHints(CID);
- qDebug() << " - - Got Normal Hints";
- if(!SH.isValid()){ SH = LWM::SYSTEM->WM_ICCCM_GetSizeHints(CID); }
- qDebug() << " - - Start resizing...";
- if(SH.base_width>geom.width() && SH.base_height>geom.height()){ this->resize(SH.base_width, SH.base_height); }
- else if(SH.min_width>geom.width() && SH.min_height>geom.height()){ this->resize(SH.min_width, SH.min_height); }
- else if(SH.width>geom.width() && SH.height>geom.height()){ this->resize(SH.width, SH.height); }
- else if(geom.isNull()){ this->resize(100,80); }
- else{ this->resize( geom.size() ); }
- qDebug() << " - done";
-
- //Now embed the native window into the frame
- WIN = QWindow::fromWinId(CID);
- WinWidget = QWidget::createWindowContainer( WIN, this);
- WinWidget->setCursor(Qt::ArrowCursor); //this is just a fallback - the window itself will adjust it
- //WINBACK = new QBackingStore(WIN); //create a data backup for the widget
-
- //Now assemble te initial layout for the window (all while still invisible)
- /*VL->addWidget(titleBar);
- VL->addWidget(WinWidget);
- VL->setStretch(1,1);*/
-}
-
-LWindowFrame::ModState LWindowFrame::getStateAtPoint(QPoint pt, bool setoffset){
- //Note: pt should be in widget-relative coordinates, not global
- if(!this->layout()->geometry().contains(pt)){
- //above the frame itself - need to figure out which quadrant it is in (8-directions)
- if(pt.y() < 3){
- //One of the top options
- if(pt.x() < 3){
- if(setoffset){ offset.setX(pt.x()); offset.setY(pt.y()); } //difference from top-left corner
- return ResizeTopLeft;
- }else if(pt.x() > (this->width()-3)){
- if(setoffset){ offset.setX(this->width()-pt.x()); offset.setY(pt.y()); } //difference from top-right corner
- return ResizeTopRight;
- }else{
- if(setoffset){ offset.setX(0); offset.setY(pt.y()); } //difference from top edge (X does not matter)
- return ResizeTop;
- }
- }else if(pt.y() > (this->height()-3) ){
- //One of the bottom options
- if(pt.x() < 3){
- if(setoffset){ offset.setX(pt.x()); offset.setY(this->height()-pt.y()); } //difference from bottom-left corner
- return ResizeBottomLeft;
- }else if(pt.x() > (this->width()-3)){
- if(setoffset){ offset.setX(this->width()-pt.x()); offset.setY(this->height()-pt.y()); } //difference from bottom-right corner
- return ResizeBottomRight;
- }else{
- if(setoffset){ offset.setX(0); offset.setY(this->height() - pt.y()); } //difference from bottom edge (X does not matter)
- return ResizeBottom;
- }
- }else{
- //One of the side options
- if(pt.x() < 3){
- if(setoffset){ offset.setX(pt.x()); offset.setY(0); } //difference from left edge (Y does not matter)
- return ResizeLeft;
- }else if(pt.x() > (this->width()-3) ){
- if(setoffset){ offset.setX(this->width()-pt.x()); offset.setY(0); } //difference from right edge (Y does not matter)
- return ResizeRight;
- }else{
- return Normal;
- }
- }
- }
- return Normal;
-}
-
-void LWindowFrame::setMouseCursor(ModState state, bool override){
- Qt::CursorShape shape;
- switch(state){
- case Normal:
- shape = Qt::ArrowCursor;
- break;
- case Move:
- shape = Qt::SizeAllCursor;
- break;
- case ResizeTop:
- shape = Qt::SizeVerCursor;
- break;
- case ResizeTopRight:
- shape = Qt::SizeBDiagCursor;
- break;
- case ResizeRight:
- shape = Qt::SizeHorCursor;
- break;
- case ResizeBottomRight:
- shape = Qt::SizeFDiagCursor;
- break;
- case ResizeBottom:
- shape = Qt::SizeVerCursor;
- break;
- case ResizeBottomLeft:
- shape = Qt::SizeBDiagCursor;
- break;
- case ResizeLeft:
- shape = Qt::SizeHorCursor;
- break;
- case ResizeTopLeft:
- shape = Qt::SizeFDiagCursor;
- break;
- }
- if(override){
- QApplication::setOverrideCursor(QCursor(shape));
- }else{
- this->setCursor(shape);
- }
-}
-
-// ==========================
-// WINDOW INTERACTIONS
-//==========================
-void LWindowFrame::SyncSize(bool fromwin){
- //sync the window/frame geometries (generally only done before embedding the client window)
- int frame = this->frameWidth();
- int TH = titleBar->height();
- //Now load the information about the window and adjust the frame to match
- if(fromwin){ lastGeom = LWM::SYSTEM->WM_Window_Geom(CID); }
- else{ lastGeom = this->geometry(); }
- qDebug() << "Initial Size:" << lastGeom << frame << TH;
- //Add in the frame size
- lastGeom.moveTop(lastGeom.y()-frame-TH);
- lastGeom.setHeight(lastGeom.height()+(2*frame)+TH);
- lastGeom.moveLeft(lastGeom.x()-frame);
- lastGeom.setWidth( lastGeom.width()+(2*frame));
- QList<unsigned int> margins;
- margins << frame << frame << frame+TH << frame; //L/R/Top/Bottom
- qDebug() << " - With Frame:" << lastGeom;
- //Now adjust for a out-of-bounds location
- if(lastGeom.x() < 0){ lastGeom.moveLeft(0); }
- if(lastGeom.y() < 0){ lastGeom.moveTop(0); }
- qDebug() << " - Adjusted:" << lastGeom;
- this->setGeometry(lastGeom);
- LWM::SYSTEM->WM_Set_Frame_Extents(CID, margins);
-}
-
-void LWindowFrame::SyncText(){
- QString txt = WIN->title();
- if(txt.isEmpty()){ txt = LWM::SYSTEM->WindowName(CID); }
- if(txt.isEmpty()){ txt = LWM::SYSTEM->OldWindowName(CID); }
- if(txt.isEmpty()){ txt = LWM::SYSTEM->WindowVisibleName(CID); }
- if(txt.isEmpty()){ txt = LWM::SYSTEM->WindowIconName(CID); }
- if(txt.isEmpty()){ txt = LWM::SYSTEM->WindowVisibleIconName(CID); }
- if(txt.isEmpty()){ txt = LWM::SYSTEM->WM_ICCCM_GetClass(CID); }
- title->setText(txt);
-}
-
-// SIMPLE ANIMATIONS
-void LWindowFrame::showAnimation(LWM::WindowAction act){
- bool useanimation = (act!=lastAction);
- if(anim->state()==QAbstractAnimation::Running){
- qDebug() << "New Animation Event:" << act;
- return;
- }
- //Setup the animation routine
- if(act==LWM::Show){
- if(useanimation){
- lastGeom = this->geometry();
- //Expand out from center point
- anim->setPropertyName("geometry");
- anim->setStartValue( QRect(lastGeom.center(), QSize(0,0) ) );
- anim->setEndValue( this->geometry() );
- //Fade in gradually
- //anim->setPropertyName("windowOpacity");
- //anim->setStartValue( 0.0 );
- //anim->setEndValue( 1.0 );
- }else{
- ShowClient(true);
- this->raise();
- this->show(); //just show it right away
- }
-
- }else if(act==LWM::Hide){
- if(useanimation){
- //Collapse in on center point
- lastGeom = this->geometry();
- anim->setPropertyName("geometry");
- anim->setStartValue( QRect(this->geometry()) );
- anim->setEndValue( QRect(this->geometry().center(), QSize(0,0) ) );
- }else{
- this->hide(); //just hide it right away
- }
- }else if(act==LWM::Closed){
- //Need to clean up the container widget first to prevent XCB errors
- //qDebug() << "Window Closed:" << WIN->winId() << CID;
- if(useanimation){
- //Collapse in on center line
- lastGeom = this->geometry();
- anim->setPropertyName("geometry");
- anim->setStartValue( QRect(this->geometry()) );
- anim->setEndValue( QRect(this->geometry().x(), this->geometry().center().y(), this->width(), 0 ) );
- }else{
- CloseAll(); //just hide it right away
- }
- }
- if(useanimation){
- ShowClient(false);
- this->show();
- qDebug() << " - Starting Animation:" << act;
- lastAction = act;
- anim->start();
- };
-}
-
-void LWindowFrame::ShowClient(bool show){
- if(show && this->layout()->indexOf(WinWidget)<0 && !Closing){
- while(this->layout()->count()>0){ this->layout()->removeItem(0); }
- this->layout()->addWidget(titleBar);
- this->layout()->setAlignment(titleBar, Qt::AlignTop);
- this->layout()->addWidget(WinWidget);
- static_cast<QVBoxLayout*>(this->layout())->setStretch(1,1);
- LWM::SYSTEM->WM_ShowWindow(CID);
- }else if( !show && this->layout()->indexOf(WinWidget)>=0){
- LWM::SYSTEM->WM_HideWindow(CID);
- this->layout()->removeWidget(WinWidget);
- }
-}
-
-void LWindowFrame::finishedAnimation(){
- //Also set any final values
- qDebug() << " - Finished Animation:" << lastAction;
- switch(lastAction){
- case LWM::Show:
- ShowClient(true);
- break;
- case LWM::Closed:
- case LWM::Hide:
- this->lower();
- this->hide();
- LWM::SYSTEM->WM_HideWindow(this->winId());
- default:
- break;
- }
- if(Closing){
- qDebug() << "Emitting finished signal";
- emit Finished();
- }
-}
-
-// =================
-// PUBLIC SLOTS
-// =================
-void LWindowFrame::updateAppearance(){
- //Reload any button icons and such
- minB->setIcon(LXDG::findIcon("window-suppressed",""));
- maxB->setIcon(LXDG::findIcon("view-fullscreen",""));
- closeB->setIcon(LXDG::findIcon("application-exit",""));
- otherB->setIcon(LXDG::findIcon("configure",""));
-}
-
-void LWindowFrame::windowChanged(LWM::WindowAction act){
- //A window property was changed - update accordingly
- switch(act){
- case LWM::Closed:
- Closing = true;
- case LWM::Hide:
- case LWM::Show:
- showAnimation(act);
- break;
- case LWM::MoveResize:
- //Re-adjust to the new position/size of the window
- SyncSize(true);
- break;
- default:
- break; //do nothing
- }
-}
-// =================
-// PRIVATE SLOTS
-// =================
-void LWindowFrame::closeClicked(){
- qDebug() << "Closing Window" << LWM::SYSTEM->WM_ICCCM_GetClass(CID);
- //First try the close event to let the client app do cleanup/etc
- LWM::SYSTEM->WM_CloseWindow(CID);
-}
-
-void LWindowFrame::minClicked(){
- qDebug() << "Minimize Window";
- windowChanged(LWM::Hide);
-}
-
-void LWindowFrame::maxClicked(){
- if(normalGeom.isNull()){
- qDebug() << "Maximize Window";
- normalGeom = this->geometry(); //save for later
- this->showMaximized();
- }else{
- qDebug() << "Restore Window";
- this->showNormal();
- this->setGeometry(normalGeom);
- normalGeom = QRect(); //clear it
- }
-}
-
-void LWindowFrame::otherClicked(QAction* act){
- QString action = act->whatsThis();
-}
-
-void LWindowFrame::CloseAll(){
- qDebug() << " - Closing Frame";
- this->hide();
- emit Finished();
-}
-// =====================
-// PROTECTED
-// =====================
-void LWindowFrame::mousePressEvent(QMouseEvent *ev){
- qDebug() << "Frame Mouse Press Event";
- offset.setX(0); offset.setY(0);
- if(activeState != Normal){ return; } // do nothing - already in a state of grabbed mouse
- this->activateWindow();
- LWM::SYSTEM->WM_Set_Active_Window(CID);
- if(this->childAt(ev->pos())!=0){
- //Check for any non-left-click event and skip it
- if(ev->button()!=Qt::LeftButton){ return; }
- activeState = Move;
- offset.setX(ev->pos().x()); offset.setY(ev->pos().y());
- }else{
- //Clicked on the frame somewhere
- activeState = getStateAtPoint(ev->pos(), true); //also have it set the offset variable
- }
- setMouseCursor(activeState, true); //this one is an override cursor
-
-}
-
-void LWindowFrame::mouseMoveEvent(QMouseEvent *ev){
- ev->accept();
- if(activeState == Normal){
- setMouseCursor( getStateAtPoint(ev->pos()) ); //just update the mouse cursor
-
- }else{
- //Currently in a modification state
- QRect geom = this->geometry();
- switch(activeState){
- case Move:
- geom.moveTopLeft(ev->globalPos()-offset); //will not change size
- break;
- case ResizeTop:
- geom.setTop(ev->globalPos().y()-offset.y());
- break;
- case ResizeTopRight:
- geom.setTopRight(ev->globalPos()-offset);
- break;
- case ResizeRight:
- geom.setRight(ev->globalPos().x()-offset.x());
- break;
- case ResizeBottomRight:
- geom.setBottomRight(ev->globalPos()-offset);
- break;
- case ResizeBottom:
- geom.setBottom(ev->globalPos().y()-offset.y());
- break;
- case ResizeBottomLeft:
- geom.setBottomLeft(ev->globalPos()-offset);
- break;
- case ResizeLeft:
- geom.setLeft(ev->globalPos().x()-offset.x());
- break;
- case ResizeTopLeft:
- geom.setTopLeft(ev->globalPos()-offset);
- break;
- default:
- break;
- }
- this->setGeometry(geom);
- }
-}
-
-void LWindowFrame::mouseReleaseEvent(QMouseEvent *ev){
- //Check for a right-click event
- qDebug() << "Frame Mouse Release Event";
- ev->accept();
- if( (activeState==Normal) && (this->childAt(ev->pos())==titleBar) && (ev->button()==Qt::RightButton) ){
- otherM->popup(ev->globalPos());
- return;
- }
- activeState = Normal;
- QApplication::restoreOverrideCursor();
- setMouseCursor( getStateAtPoint(ev->pos()) );
-}
diff --git a/src-qt5/core/lumina-wm-INCOMPLETE/LWindow.h b/src-qt5/core/lumina-wm-INCOMPLETE/LWindow.h
deleted file mode 100644
index ceefca83..00000000
--- a/src-qt5/core/lumina-wm-INCOMPLETE/LWindow.h
+++ /dev/null
@@ -1,114 +0,0 @@
-//===========================================
-// Lumina-DE source code
-// Copyright (c) 2015, Ken Moore
-// Available under the 3-clause BSD license
-// See the LICENSE file for full details
-//===========================================
-#ifndef _LUMINA_DESKTOP_WINDOW_FRAME_H
-#define _LUMINA_DESKTOP_WINDOW_FRAME_H
-
-#include "GlobalDefines.h"
-
-class LWindowFrame : public QFrame{
- Q_OBJECT
-public:
- LWindowFrame(WId client, QWidget *parent = 0); //MUST have a valid client window
- ~LWindowFrame();
-
-private:
- void InitWindow(); //Initialize all the internal widgets
-
- //Window status
- enum ModState{Normal, Move, ResizeTop, ResizeTopRight, ResizeRight, ResizeBottomRight, ResizeBottom, ResizeBottomLeft, ResizeLeft, ResizeTopLeft};
- ModState activeState;
- QPoint offset; //needed for movement calculations (offset from mouse click to movement point)
- //Functions for getting/setting state
- ModState getStateAtPoint(QPoint pt, bool setoffset = false); //generally used for mouse location detection
- void setMouseCursor(ModState, bool override = false); //Update the mouse cursor based on state
-
- //General Properties/Modifications
- WId CID; //Client ID
- QWindow *WIN; //Embedded window container
- QWidget *WinWidget;
- bool Closing;
- LWM::WindowAction lastAction;
- //QBackingStore *WINBACK;
- void SyncSize(bool fromwin = false); //sync the window/frame geometries
- void SyncText();
-
- //Window Frame Widgets/Items
- QLabel *titleBar, *title, *icon;
- QToolButton *minB, *maxB, *closeB, *otherB;
- QMenu *otherM; //menu of "other" actions for the window
- QRect normalGeom; //used for restoring back to original size after maximization/fullscreen
-
- //Animations
- QPropertyAnimation *anim; //used for appear/disappear animations
- QRect lastGeom; //used for appear/disappear animations
- void showAnimation(LWM::WindowAction); //sets lastAction
- void ShowClient(bool show);
-
-public slots:
- //These slots are generally used for the outside event watcher to prod for changes
- void updateAppearance(); //reload the theme and change styling as necessary
- void windowChanged(LWM::WindowAction);
-
-private slots:
- void finishedAnimation(); //uses lastAction
- void closeClicked();
- void minClicked();
- void maxClicked();
- void otherClicked(QAction*);
-
- void CloseAll();
-
-protected:
- void mousePressEvent(QMouseEvent*);
- void mouseMoveEvent(QMouseEvent*);
- void mouseReleaseEvent(QMouseEvent*);
-
-signals:
- void Finished(); //This means the window is completely finished (with animations and such) and should be removed from any lists
-
-};
-
-class LWindow : public QObject{
- Q_OBJECT
-signals:
- void Finished(WId client); //ready to be removed
-private:
- WId CID;
- LWindowFrame *FID;
- bool needsFrame(QList<LXCB::WINDOWTYPE> list){
- if(list.isEmpty()){ return !LWM::SYSTEM->WM_ICCCM_GetClass(CID).contains("Lumina-DE"); } //assume a normal window (fallback)
- return !(list.contains(LXCB::T_DESKTOP) || list.contains(LXCB::T_DOCK) || list.contains(LXCB::T_TOOLBAR) \
- || list.contains(LXCB::T_SPLASH) || list.contains(LXCB::T_DROPDOWN_MENU) \
- || list.contains(LXCB::T_TOOLTIP) || list.contains(LXCB::T_POPUP_MENU) || list.contains(LXCB::T_TOOLTIP) \
- || list.contains(LXCB::T_COMBO) || list.contains(LXCB::T_DND) );
- }
-private slots:
- void frameclosed(){
- qDebug() << " - Window got frame closed signal";
- //FID->close();
- //delete FID;
- emit Finished(CID);
- }
-public:
- LWindow(WId client){
- FID= 0;
- CID = client;
- if( needsFrame(LWM::SYSTEM->WM_Get_Window_Type(CID)) ){
- FID = new LWindowFrame(CID);
- connect(FID, SIGNAL(Finished()), this, SLOT(frameclosed()) );
- }
- }
- ~LWindow(){
- if(FID!=0){delete FID;}
- }
-
- WId clientID(){ return CID; }
- bool hasFrame(){ return FID!=0; }
- LWindowFrame* frame(){ return FID; }
-
-};
-#endif
diff --git a/src-qt5/core/lumina-wm-INCOMPLETE/LWindowManager.cpp b/src-qt5/core/lumina-wm-INCOMPLETE/LWindowManager.cpp
deleted file mode 100644
index 14ce6897..00000000
--- a/src-qt5/core/lumina-wm-INCOMPLETE/LWindowManager.cpp
+++ /dev/null
@@ -1,186 +0,0 @@
-//===========================================
-// Lumina-DE source code
-// Copyright (c) 2015, Ken Moore
-// Available under the 3-clause BSD license
-// See the LICENSE file for full details
-//===========================================
-#include "LWindowManager.h"
-
-#define DEBUG 1
-
-LWindowManager::LWindowManager(){
-
-}
-
-LWindowManager::~LWindowManager(){
-
-}
-
-bool LWindowManager::start(){
- //Setup the initial screen/session values
- LWM::SYSTEM->WM_Set_Root_Supported();
- LWM::SYSTEM->WM_SetNumber_Desktops(1);
- LWM::SYSTEM->WM_Set_Current_Desktop(0);
- LWM::SYSTEM->WM_Set_Desktop_Names(QStringList() << "one");
- QRect totgeom;
- QList<QPoint> viewports;
- QList<QRect> geoms;
- for(int i=0; i<QApplication::desktop()->screenCount(); i++){
- geoms << QApplication::desktop()->screen(i)->geometry();
- viewports << QPoint(0,0);
- totgeom = QApplication::desktop()->screen(i)->geometry();
- }
- LWM::SYSTEM->WM_Set_Desktop_Geometry(totgeom.size());
- LWM::SYSTEM->WM_Set_Desktop_Viewport(viewports);
- LWM::SYSTEM->WM_Set_Workarea(geoms);
- //Should probably do a quick loop over any existing windows with the root as parent (just in case)
- QList<WId> initial = LWM::SYSTEM->WM_RootWindows();
- for(int i=0; i<initial.length(); i++){
- NewWindow(initial[i], false); //These ones did not explicitly request to be mapped
- }
- RestackWindows();
- return true;
-}
-
-void LWindowManager::stop(){
- for(int i=0; i<WINS.length(); i++){
- if(WINS[i]->hasFrame()){
- LWM::SYSTEM->UnembedWindow(WINS[i]->clientID());
- WINS[i]->frame()->close();
- }
- }
-}
-//===============
-// PUBLIC SLOTS
-//===============
-void LWindowManager::NewWindow(WId win, bool requested){
- //Verify that this window can/should be managed first
- //if(DEBUG){ qDebug() << "New Window:" << LWM::SYSTEM->WM_ICCCM_GetClass(win); }
- QString wclass = LWM::SYSTEM->WM_ICCCM_GetClass(win);
- if( wclass.contains("lumina-wm",Qt::CaseInsensitive) ){ return; } //just in case: prevent recursion
- else{
- bool ok = (wclass.isEmpty() ? false : LWM::SYSTEM->WM_ManageWindow(win, requested) );
- if(!ok){
- //See if this window is just a transient pointing to some other window
- WId tran = LWM::SYSTEM->WM_ICCCM_GetTransientFor(win);
- if(tran!=win && tran!=0){
- win = tran;
- ok = LWM::SYSTEM->WM_ManageWindow(win);
- }
- }
- if(!ok){ return; }
- }
- if(DEBUG){ qDebug() << "New Managed Window:" << LWM::SYSTEM->WM_ICCCM_GetClass(win); }
- LWM::SYSTEM->WM_Set_Active_Window(win);
- LWindow *lwin = new LWindow(win);
- connect(lwin, SIGNAL(Finished(WId)), this, SLOT(FinishedWindow(WId)) );
- WINS << lwin;
- if(lwin->hasFrame()){
- lwin->frame()->windowChanged(LWM::Show); //Make sure to show it right away
- }else{
- LWM::SYSTEM->WM_ShowWindow(win); //just map the window right now
- }
-}
-
-void LWindowManager::ClosedWindow(WId win){
- for(int i=0; i<WINS.length(); i++){
- if(WINS[i]->clientID()==win){
- qDebug() << " - Closed Window";
- if(WINS[i]->hasFrame()){ WINS[i]->frame()->windowChanged(LWM::Closed); } //do any animations/cleanup
- else{ FinishedWindow(win); }
- break;
- }
- }
-}
-
-void LWindowManager::ModifyWindow(WId win, LWM::WindowAction act){
- for(int i=0; i<WINS.length(); i++){
- if(WINS[i]->clientID()==win){
- if(WINS[i]->hasFrame()){ WINS[i]->frame()->windowChanged(act); }
- return;
- }
- }
- //If it gets this far - it is an unmanaged window
- if(act==LWM::Show){
- NewWindow(win);
- }
- RestackWindows();
-}
-
-void LWindowManager::RestackWindows(){
- Stack_Desktop.clear(); Stack_Below.clear(); Stack_Normal.clear(); Stack_Above.clear(); Stack_Fullscreen.clear();
- QList<WId> currwins;
- int cwork = LWM::SYSTEM->WM_Get_Current_Desktop();
- int winwork = -1;
- QList<LXCB::WINDOWSTATE> states;
- QList<LXCB::WINDOWTYPE> types;
- for(int i=0; i<WINS.length(); i++){
- //Only show windows on the current desktop
- winwork = LWM::SYSTEM->WM_Get_Desktop(WINS[i]->clientID());
- states = LWM::SYSTEM->WM_Get_Window_States(WINS[i]->clientID());
- types = LWM::SYSTEM->WM_Get_Window_Type(WINS[i]->clientID());
- WId id = WINS[i]->clientID();
- if(WINS[i]->hasFrame()){ id = WINS[i]->frame()->winId(); }
- if(winwork<0 || winwork == cwork || states.contains(LXCB::S_STICKY) ){
- //Now check the state/type and put it in the proper stack
- currwins << WINS[i]->clientID(); //add this to the overall "age" list
- //Now add it to the proper stack
- if(types.contains(LXCB::T_DESKTOP)){ Stack_Desktop << id; }
- else if(states.contains(LXCB::S_BELOW)){ Stack_Below << id; }
- else if(types.contains(LXCB::T_DOCK) || states.contains(LXCB::S_ABOVE) ){ Stack_Above << id; }
- else if(states.contains(LXCB::S_FULLSCREEN)){ Stack_Fullscreen << id; }
- else{ Stack_Normal << id; }
- }
- }
- //Active Window management
- WId active = LWM::SYSTEM->WM_Get_Active_Window();
- if(Stack_Desktop.contains(active)){ Stack_Desktop.removeAll(active); Stack_Desktop << active; }
- else if(Stack_Below.contains(active)){ Stack_Below.removeAll(active); Stack_Below << active; }
- else if(Stack_Normal.contains(active)){ Stack_Normal.removeAll(active); Stack_Normal << active; }
- else if(Stack_Above.contains(active)){ Stack_Above.removeAll(active); Stack_Above << active; }
- else if(Stack_Fullscreen.contains(active)){ Stack_Fullscreen.removeAll(active); Stack_Fullscreen << active; }
-
- //Now set the root properties for these lists
- LWM::SYSTEM->WM_Set_Client_List(currwins, false); //age-ordered version
- LWM::SYSTEM->WM_Set_Client_List(QList<WId>() << Stack_Desktop << Stack_Below << Stack_Normal << Stack_Above << Stack_Fullscreen, true); //stacking order version
- //Now re-paint (in order) the windows
- RepaintWindows();
-}
-
-void LWindowManager::RepaintWindows(){
- //Go through all the current windows (in stacking order) and re-paint them
- for(int i=0; i<Stack_Desktop.length(); i++){
- LWM::SYSTEM->WM_ShowWindow(Stack_Desktop[i]);
- }
- for(int i=0; i<Stack_Below.length(); i++){
- LWM::SYSTEM->WM_ShowWindow(Stack_Below[i]);
- }
- for(int i=0; i<Stack_Normal.length(); i++){
- LWM::SYSTEM->WM_ShowWindow(Stack_Normal[i]);
- }
- for(int i=0; i<Stack_Above.length(); i++){
- LWM::SYSTEM->WM_ShowWindow(Stack_Above[i]);
- }
- for(int i=0; i<Stack_Fullscreen.length(); i++){
- LWM::SYSTEM->WM_ShowWindow(Stack_Fullscreen[i]);
- }
-}
-
-//=================
-// PRIVATE SLOTS
-//=================
-void LWindowManager::FinishedWindow(WId win){
- for(int i=0; i<WINS.length(); i++){
- if(WINS[i]->clientID() == win){
- qDebug() << " - Finished Window";
- if(win == LWM::SYSTEM->WM_Get_Active_Window()){
- if(i==0 && WINS.length()>1){ LWM::SYSTEM->WM_Set_Active_Window(WINS[i+1]->clientID()); }
- else if(i>0){ LWM::SYSTEM->WM_Set_Active_Window(WINS[i-1]->clientID()); }
- else{ LWM::SYSTEM->WM_Set_Active_Window( QX11Info::appRootWindow()); }
- }
- delete WINS.takeAt(i); break;
- }
- }
- //Now update the list of clients
- RestackWindows();
-}
diff --git a/src-qt5/core/lumina-wm-INCOMPLETE/LWindowManager.h b/src-qt5/core/lumina-wm-INCOMPLETE/LWindowManager.h
deleted file mode 100644
index 203efa1b..00000000
--- a/src-qt5/core/lumina-wm-INCOMPLETE/LWindowManager.h
+++ /dev/null
@@ -1,40 +0,0 @@
-//===========================================
-// Lumina-DE source code
-// Copyright (c) 2015, Ken Moore
-// Available under the 3-clause BSD license
-// See the LICENSE file for full details
-//===========================================
-#ifndef _LUMINA_DESKTOP_WINDOW_MANAGER_MAIN_CLASS_H
-#define _LUMINA_DESKTOP_WINDOW_MANAGER_MAIN_CLASS_H
-
-#include "GlobalDefines.h"
-#include "LWindow.h"
-
-class LWindowManager : public QObject{
- Q_OBJECT
-public:
- LWindowManager();
- ~LWindowManager();
-
- bool start();
- void stop();
-
-private:
- QList<LWindow*> WINS;
- QList<WId> Stack_Desktop, Stack_Below, Stack_Normal, Stack_Above, Stack_Fullscreen;
-public slots:
- void NewWindow(WId win, bool requested = true);
- void ClosedWindow(WId win);
- void ModifyWindow(WId win, LWM::WindowAction act);
-
- void RestackWindows();
- void RepaintWindows();
-
-private slots:
- void FinishedWindow(WId win); //This is used for LWindow connections/animations
-
-signals:
- void NewFullScreenWindows(QList<WId>);
-};
-
-#endif
diff --git a/src-qt5/core/lumina-wm-INCOMPLETE/LXcbEventFilter.cpp b/src-qt5/core/lumina-wm-INCOMPLETE/LXcbEventFilter.cpp
deleted file mode 100644
index abbe5a5a..00000000
--- a/src-qt5/core/lumina-wm-INCOMPLETE/LXcbEventFilter.cpp
+++ /dev/null
@@ -1,204 +0,0 @@
-//===========================================
-// Lumina-DE source code
-// Copyright (c) 2015, Ken Moore
-// Available under the 3-clause BSD license
-// See the LICENSE file for full details
-//===========================================
-#include "LXcbEventFilter.h"
-
-//==================================================
-// NOTE: All the XCB interactions and atoms are accessed via:
-// LWM::SYSTEM->EWMH.(atom name)
-// LWM::SYSTEM->(do something)
-// (LWM::SYSTEM is the global XCB structure)
-//==================================================
-
-#include <LuminaX11.h>
-#include <QDebug>
-
-//#include <xcb/screensaver.h>
-
-#define DEBUG 1
-// Also keep the root window/screen around for use in the filters
-namespace L_XCB{
- xcb_screen_t *root_screen;
- xcb_window_t root;
-}
-
-//Constructor for the Event Filter wrapper
-EventFilter::EventFilter() : QObject(){
- EF = new XCBEventFilter(this);
- L_XCB::root_screen = xcb_aux_get_screen(QX11Info::connection(), QX11Info::appScreen());
- L_XCB::root = L_XCB::root_screen->root;
- SSLocked = false;
- WMFlag = 0;
-}
-
-void EventFilter::start(){
- if(DEBUG){ qDebug() << " - Install event filter..."; }
- QCoreApplication::instance()->installNativeEventFilter(EF);
- if(DEBUG){ qDebug() << " - Run request check..."; }
- if(!LWM::SYSTEM->setupEventsForRoot()){
- qCritical() << "[ERROR] Unable to setup WM event retrieval. Is another WM running?";
- exit(1);
- }
- if(DEBUG){ qDebug() << " - Create WM ID Window"; }
- WMFlag = LWM::SYSTEM->WM_CreateWindow();
- LWM::SYSTEM->setupEventsForRoot(WMFlag);
- LWM::SYSTEM->WM_Set_Supporting_WM(WMFlag);
- QCoreApplication::instance()->flush();
-}
-
-//Constructor for the XCB event filter
-XCBEventFilter::XCBEventFilter(EventFilter *parent) : QAbstractNativeEventFilter(){
- obj = parent;
- InitAtoms();
-}
-
-//This function format taken directly from the Qt5.3 documentation
-bool XCBEventFilter::nativeEventFilter(const QByteArray &eventType, void *message, long *) Q_DECL_OVERRIDE
-{
- //if(stopping){ return false; } //don't do any parsing
- //qDebug() << "New Event";
- bool stopevent = false;
- if(eventType=="xcb_generic_event_t"){
- //Convert to known event type (for X11 systems)
- xcb_generic_event_t *ev = static_cast<xcb_generic_event_t *>(message);
- //Now parse the event and emit signals as necessary
- switch( ev->response_type & ~0x80){
-//==============================
-// INTERACTIVITY EVENTS
-//==============================
- case XCB_KEY_PRESS:
- //This is a keyboard key press
- //qDebug() << "Key Press Event";
- obj->emit NewInputEvent();
- stopevent = BlockInputEvent( ((xcb_key_press_event_t *) ev)->root ); //use the main "root" window - not the child widget
- break;
- case XCB_KEY_RELEASE:
- //This is a keyboard key release
- //qDebug() << "Key Release Event";
- obj->emit NewInputEvent();
- stopevent = BlockInputEvent( ((xcb_key_release_event_t *) ev)->root ); //use the main "root" window - not the child widget
- break;
- case XCB_BUTTON_PRESS:
- //This is a mouse button press
- //qDebug() << "Button Press Event";
- obj->emit NewInputEvent();
- stopevent = BlockInputEvent( ((xcb_button_press_event_t *) ev)->root ); //use the main "root" window - not the child widget
- if(!stopevent){
- //Activate the window right now if needed
- if(LWM::SYSTEM->WM_Get_Active_Window()!=((xcb_button_press_event_t *) ev)->root){
- LWM::SYSTEM->WM_Set_Active_Window( ((xcb_button_press_event_t *) ev)->root);
- }
- }
- break;
- case XCB_BUTTON_RELEASE:
- //This is a mouse button release
- //qDebug() << "Button Release Event";
- //xcb_button_release_event_t *tmp = (xcb_button_release_event_t *)ev;
- stopevent = BlockInputEvent( ((xcb_button_release_event_t *) ev)->root ); //use the main "root" window - not the child widget
- break;
- case XCB_MOTION_NOTIFY:
- //This is a mouse movement event
- //qDebug() << "Motion Notify Event";
- obj->emit NewInputEvent();
- stopevent = BlockInputEvent( ((xcb_motion_notify_event_t *) ev)->root ); //use the main "root" window - not the child widget);
- break;
- case XCB_ENTER_NOTIFY:
- //This is a mouse movement event when mouse goes over a new window
- //qDebug() << "Enter Notify Event";
- obj->emit NewInputEvent();
- stopevent = BlockInputEvent( ((xcb_enter_notify_event_t *) ev)->root );
- break;
- case XCB_LEAVE_NOTIFY:
- //This is a mouse movement event when mouse goes leaves a window
- //qDebug() << "Leave Notify Event";
- obj->emit NewInputEvent();
- stopevent = BlockInputEvent();
- break;
-//==============================
- case XCB_EXPOSE:
- //qDebug() << "Expose Notify Event:";
- //qDebug() << " - Given Window:" << ((xcb_property_notify_event_t*)ev)->window;
- break;
-//==============================
- case XCB_MAP_NOTIFY:
- break; //This is just a notification that a window was mapped - nothing needs to change here
- case XCB_MAP_REQUEST:
- qDebug() << "Window Map Request Event";
- obj->emit ModifyWindow( ((xcb_map_request_event_t *) ev)->window, LWM::Show);
- break;
-//==============================
- case XCB_CREATE_NOTIFY:
- qDebug() << "Window Create Event";
- break;
-//==============================
- case XCB_UNMAP_NOTIFY:
- qDebug() << "Window Unmap Event";
- obj->emit ModifyWindow( ((xcb_unmap_notify_event_t *)ev)->window, LWM::Hide);
- break;
-//==============================
- case XCB_DESTROY_NOTIFY:
- qDebug() << "Window Closed Event";
- obj->emit WindowClosed( ((xcb_destroy_notify_event_t *) ev)->window );
- break;
-//==============================
- case XCB_FOCUS_IN:
- //qDebug() << "Focus In Event:";
- break;
-//==============================
- case XCB_FOCUS_OUT:
- //qDebug() << "Focus Out Event:";
- break;
-//==============================
- case XCB_PROPERTY_NOTIFY:
- //qDebug() << "Property Notify Event:";
- //qDebug() << " - Given Window:" << ((xcb_property_notify_event_t*)ev)->window;
- break;
-//==============================
- case XCB_CLIENT_MESSAGE:
- //qDebug() << "Client Message Event";
- //qDebug() << " - Given Window:" << ((xcb_client_message_event_t*)ev)->window;
- break;
-//==============================
- case XCB_CONFIGURE_NOTIFY:
- //qDebug() << "Configure Notify Event";
- break;
-//==============================
- case XCB_CONFIGURE_REQUEST:
- //qDebug() << "Configure Request Event";
- break;
-//==============================
- case XCB_SELECTION_CLEAR:
- //qDebug() << "Selection Clear Event";
- break;
-//==============================
- case 85: //not sure what event this is - but it seems to come up very often (just hide the notice)
- case 0:
- case XCB_GE_GENERIC:
- break; //generic event - don't do anything special
- default:
- qDebug() << "Default Event:" << (ev->response_type & ~0x80);
-//==============================
- }
- }
- return false;
- //never stop event handling (this will not impact the X events themselves - just the internal screensaver/WM/widgets)
-}
-
-bool XCBEventFilter::BlockInputEvent(WId win){
- //Checks the current state of the WM and sets the stop flag as needed
- // - Always let the screensaver know about the event first (need to reset timers and such)
- obj->emit NewInputEvent();
- // - Check the state of the screensaver
- if(obj->SSLocked){ qDebug() << "SS Locked"; return true; }
- // - Check the state of any fullscreen apps
- else if( win!=0 && !obj->FS_WINS.isEmpty()){
- if(!obj->FS_WINS.contains(win) ){
- //If this event is for an app underneath a fullscreen window - stop it
- if(obj->FS_WINS.length() == QApplication::desktop()->screenCount()){ qDebug() << "Screens Covered"; return true; } //all screens covered right now
- }
- }
- return false;
-}
diff --git a/src-qt5/core/lumina-wm-INCOMPLETE/LXcbEventFilter.h b/src-qt5/core/lumina-wm-INCOMPLETE/LXcbEventFilter.h
deleted file mode 100644
index b68eedf5..00000000
--- a/src-qt5/core/lumina-wm-INCOMPLETE/LXcbEventFilter.h
+++ /dev/null
@@ -1,130 +0,0 @@
-//===========================================
-// Lumina-DE source code
-// Copyright (c) 2012, Ken Moore
-// Available under the 3-clause BSD license
-// See the LICENSE file for full details
-//===========================================
-// This class provides the XCB ->Xlib conversion necessary for Qt5 usage
-//===========================================
-#ifndef _LUMINA_DESKTOP_XCB_FILTER_H
-#define _LUMINA_DESKTOP_XCB_FILTER_H
-
-#include "GlobalDefines.h"
-
-
-/*
-List of XCB response types (since almost impossible to find good docs on XCB)
-switch (xcb_generic_event_t*->response_type & ~0x80)
-case values:
-XCB_KEY_[PRESS | RELEASE]
-XCB_BUTTON_[PRESS | RELEASE]
-XCB_MOTION_NOTIFY
-XCB_ENTER_NOTIFY
-XCB_LEAVE_NOTIFY
-XCB_FOCUS_[IN | OUT]
-XCB_KEYMAP_NOTIFY
-XCB_EXPOSE
-XCB_GRAPHICS_EXPOSURE
-XCB_VISIBILITY_NOTIFY
-XCB_CREATE_NOTIFY
-XCB_DESTROY_NOTIFY
-XCB_UNMAP_NOTIFY
-XCB_MAP_[NOTIFY | REQUEST]
-XCB_REPARENT_NOTIFY
-XCB_CONFIGURE_[NOTIFY | REQUEST]
-XCB_GRAVITY_NOTIFY
-XCB_RESIZE_REQUEST
-XCB_CIRCULATE_[NOTIFY | REQUEST]
-XCB_PROPERTY_NOTIFY
-XCB_SELECTION_[CLEAR | REQUEST | NOTIFY]
-XCB_COLORMAP_NOTIFY
-XCB_CLIENT_MESSAGE
-*/
-
-//SYSTEM TRAY STANDARD DEFINITIONS
-//#define SYSTEM_TRAY_REQUEST_DOCK 0
-//#define SYSTEM_TRAY_BEGIN_MESSAGE 1
-//#define SYSTEM_TRAY_CANCEL_MESSAGE 2
-
-
-class EventFilter : public QObject{
- Q_OBJECT
-private:
- QAbstractNativeEventFilter* EF;
- WId WMFlag; //used to flag a running WM process
-
-public:
- EventFilter();
- ~EventFilter(){}
-
- void start();
-
- //Public variables for the event filter to use/check
- QList<WId> FS_WINS; //Full-screen windows (1 per monitor) - used for hiding non-app events as needed
- bool SSLocked;
-
-public slots:
- void StartedSS(){ SSLocked = true; }
- void StoppedSS(){ SSLocked = false; }
- void FullScreenChanged(QList<WId> fslist){ FS_WINS = fslist; }
-
-signals:
- void NewInputEvent();
- void NewManagedWindow(WId);
- void WindowClosed(WId);
- void ModifyWindow(WId win, LWM::WindowAction);
-};
-
-class XCBEventFilter : public QAbstractNativeEventFilter{
-public:
- XCBEventFilter(EventFilter *parent);
- ~XCBEventFilter(){}
-
- virtual bool nativeEventFilter(const QByteArray &eventType, void *message, long *);
-
-private:
- EventFilter *obj;
- QList<xcb_atom_t> WinNotifyAtoms, SysNotifyAtoms;
-
- void InitAtoms(){
- //Initialize any special atoms that we need to save/use regularly
- //NOTE: All the EWMH atoms are already saved globally in LWM::SYSTEM->EWMH
- WinNotifyAtoms.clear();
- WinNotifyAtoms << LWM::SYSTEM->EWMH._NET_WM_NAME \
- << LWM::SYSTEM->EWMH._NET_WM_VISIBLE_NAME \
- << LWM::SYSTEM->EWMH._NET_WM_ICON_NAME \
- << LWM::SYSTEM->EWMH._NET_WM_VISIBLE_ICON_NAME \
- << LWM::SYSTEM->EWMH._NET_WM_ICON \
- << LWM::SYSTEM->EWMH._NET_WM_ICON_GEOMETRY;
-
- SysNotifyAtoms.clear();
- SysNotifyAtoms << LWM::SYSTEM->EWMH._NET_CLIENT_LIST \
- << LWM::SYSTEM->EWMH._NET_CLIENT_LIST_STACKING \
- << LWM::SYSTEM->EWMH._NET_CURRENT_DESKTOP \
- << LWM::SYSTEM->EWMH._NET_WM_STATE \
- << LWM::SYSTEM->EWMH._NET_ACTIVE_WINDOW \
- << LWM::SYSTEM->EWMH._NET_WM_ICON \
- << LWM::SYSTEM->EWMH._NET_WM_ICON_GEOMETRY;
-
- }
-
- bool BlockInputEvent(WId win = 0); //Checks the current state of the WM and sets the stop flag as needed
-
- //Longer Event handling functions
- //bool ParseKeyPressEvent();
- //bool ParseKeyReleaseEvent();
- //bool ParseButtonPressEvent();
- //bool ParseButtonReleaseEvent();
- //bool ParseMotionEvent();
- //bool ParsePropertyEvent();
- //bool ParseClientMessageEvent();
- //bool ParseDestroyEvent();
- //bool ParseConfigureEvent();
- //bool ParseKeySelectionClearEvent();
-
-
-
-
-};
-
-#endif
diff --git a/src-qt5/core/lumina-wm-INCOMPLETE/SSBaseWidget.cpp b/src-qt5/core/lumina-wm-INCOMPLETE/SSBaseWidget.cpp
deleted file mode 100644
index 83b82ff8..00000000
--- a/src-qt5/core/lumina-wm-INCOMPLETE/SSBaseWidget.cpp
+++ /dev/null
@@ -1,83 +0,0 @@
-//===========================================
-// Lumina-DE source code
-// Copyright (c) 2015, Ken Moore
-// Available under the 3-clause BSD license
-// See the LICENSE file for full details
-//===========================================
-
-#include "SSBaseWidget.h"
-
-#define DEBUG 1
-
-static QStringList validPlugs;
-// ========
-// PUBLIC
-// ========
-SSBaseWidget::SSBaseWidget(QWidget *parent, QSettings *set) : QWidget(parent){
- if(validPlugs.isEmpty()){ validPlugs << "none"; } //add more later
- settings = set; //needed to pass along for plugins to read any special options/settings
- this->setObjectName("LuminaBaseSSWidget");
- ANIM = 0;
- this->setMouseTracking(true);
-}
-
-SSBaseWidget::~SSBaseWidget(){
- if(ANIM!=0){ this->stopPainting(); }
-}
-
-void SSBaseWidget::setPlugin(QString plug){
- plug = plug.toLower();
- if(validPlugs.contains(plug) || plug=="random"){ plugType = plug; }
- else{ plugType = "none"; }
-}
-
-// =============
-// PUBLIC SLOTS
-// =============
-void SSBaseWidget::startPainting(){
- cplug = plugType;
- //free up any old animation instance
- if(ANIM!=0){
- ANIM->stop(); ANIM->clear();
- delete ANIM; ANIM = 0;
- }
- //If a random plugin - grab one of the known plugins
- if(cplug=="random"){
- QStringList valid = BaseAnimGroup::KnownAnimations();
- if(valid.isEmpty()){ cplug = "none"; } //no known plugins
- else{ cplug = valid[ qrand()%valid.length() ]; } //grab a random plugin
- }
- if(DEBUG){ qDebug() << " - Screen Saver:" << cplug; }
- //Now list all the various plugins and start them appropriately
- QString style;
- if(cplug=="none"){
- style = "background: transparent;"; //show the underlying black parent widget
- }else{
- style = "background: black;";
- }
- this->setStyleSheet("QWidget#LuminaBaseSSWidget{ "+style+"}");
- this->repaint();
- //If not a stylesheet-based plugin - set it here
- if(cplug!="none"){
- ANIM = BaseAnimGroup::NewAnimation(cplug, this, settings);
- connect(ANIM, SIGNAL(finished()), this, SLOT(startPainting()) ); //repeat the plugin as needed
- ANIM->LoadAnimations();
- }
- //Now start the animation(s)
- if(ANIM!=0){
- //if(DEBUG){ qDebug() << " - Starting SS Plugin:" << cplug << ANIM->animationCount() << ANIM->duration() << ANIM->loopCount(); }
- if(ANIM->animationCount()>0){
- if(DEBUG){ qDebug() << " - Starting SS Plugin:" << cplug << ANIM->animationCount() << ANIM->duration() << ANIM->loopCount(); }
- ANIM->start();
- }
- }
-}
-
-void SSBaseWidget::stopPainting(){
- if(ANIM!=0){
- ANIM->stop();
- ANIM->clear();
- delete ANIM;
- ANIM = 0;
- }
-}
diff --git a/src-qt5/core/lumina-wm-INCOMPLETE/SSBaseWidget.h b/src-qt5/core/lumina-wm-INCOMPLETE/SSBaseWidget.h
deleted file mode 100644
index a6574679..00000000
--- a/src-qt5/core/lumina-wm-INCOMPLETE/SSBaseWidget.h
+++ /dev/null
@@ -1,55 +0,0 @@
-//===========================================
-// Lumina-DE source code
-// Copyright (c) 2015, Ken Moore
-// Available under the 3-clause BSD license
-// See the LICENSE file for full details
-//===========================================
-// This class is the widget which provides the screensaver painting/plugin functionality
-//===========================================
-#ifndef _LUMINA_DESKTOP_SCREEN_SAVER_BASE_WIDGET_H
-#define _LUMINA_DESKTOP_SCREEN_SAVER_BASE_WIDGET_H
-
-#include "GlobalDefines.h"
-#include "animations/BaseAnimGroup.h"
-
-class SSBaseWidget : public QWidget{
- Q_OBJECT
-public:
- SSBaseWidget(QWidget *parent, QSettings *set);
- ~SSBaseWidget();
-
- void setPlugin(QString);
-
-public slots:
- void startPainting();
- void stopPainting();
-
-private:
- QString plugType, cplug; //type of custom painting to do
- BaseAnimGroup *ANIM;
- QSettings *settings;
-
-private slots:
-
-signals:
- void InputDetected(); //just in case no event handling setup at the WM level
-
-protected:
- void mouseMoveEvent(QMouseEvent *ev){
- ev->accept();
- emit InputDetected();
- }
- void keyPressEvent(QKeyEvent *ev){
- ev->accept();
- emit InputDetected();
- }
- void paintEvent(QPaintEvent*){
- QStyleOption opt;
- opt.init(this);
- QPainter p(this);
- style()->drawPrimitive(QStyle::PE_Widget, &opt, &p, this);
- }
-
-};
-
-#endif
diff --git a/src-qt5/core/lumina-wm-INCOMPLETE/WMSession.cpp b/src-qt5/core/lumina-wm-INCOMPLETE/WMSession.cpp
deleted file mode 100644
index 4a7c6e02..00000000
--- a/src-qt5/core/lumina-wm-INCOMPLETE/WMSession.cpp
+++ /dev/null
@@ -1,62 +0,0 @@
-//===========================================
-// Lumina-DE source code
-// Copyright (c) 2015, Ken Moore
-// Available under the 3-clause BSD license
-// See the LICENSE file for full details
-//===========================================
-#include "WMSession.h"
-
-#define DEBUG 1
-// ==========
-// PUBLIC
-// ==========
-WMSession::WMSession(){
- if(DEBUG){ qDebug() << "Creating Event Filter..."; }
- EFILTER = new EventFilter();
- if(DEBUG){ qDebug() << "Creating Screen Saver..."; }
- SS = new LScreenSaver();
- if(DEBUG){ qDebug() << "Creating Window Manager..."; }
- WM = new LWindowManager();
- EVThread = new QThread();
- EFILTER->moveToThread(EVThread);
- //Setup connections
- connect(EFILTER, SIGNAL(NewInputEvent()), SS, SLOT(newInputEvent()) );
- connect(EFILTER, SIGNAL(NewManagedWindow(WId)), WM, SLOT(NewWindow(WId)) );
- connect(EFILTER, SIGNAL(WindowClosed(WId)), WM, SLOT(ClosedWindow(WId)) );
- connect(EFILTER, SIGNAL(ModifyWindow(WId, LWM::WindowAction)), WM, SLOT(ModifyWindow(WId,LWM::WindowAction)) );
- connect(SS, SIGNAL(StartingScreenSaver()), EFILTER, SLOT(StartedSS()) );
- connect(SS, SIGNAL(ClosingScreenSaver()), EFILTER, SLOT(StoppedSS()) );
- connect(WM, SIGNAL(NewFullScreenWindows(QList<WId>)), EFILTER, SLOT(FullScreenChanged(QList<WId>)) );
-}
-
-WMSession::~WMSession(){
-}
-
-void WMSession::start(bool SSONLY){
- //Get the screensaver initialized/ready
- if(DEBUG){ qDebug() << "Starting Screen Saver..."; }
- SS->start();
- if(SSONLY){ return; }
- //Now start pulling/filtering events
- if(DEBUG){ qDebug() << "Starting Window Manager..."; }
- WM->start();
- if(DEBUG){ qDebug() << "Starting Event Filter..."; }
- EVThread->start();
- EFILTER->start();
- if(DEBUG){ qDebug() << "Done Starting WM session..."; }
-}
-
-// ==========
-// Public Slots
-// ==========
-void WMSession::reloadIcons(){
-
-}
-
-void WMSession::newInputsAvailable(QStringList inputs){
- for(int i=0; i<inputs.length(); i++){
- if(inputs[i]=="--lock-now" || inputs[i]=="--test-ss"){
- QTimer::singleShot(0,SS, SLOT(LockScreenNow()) );
- }
- }
-}
diff --git a/src-qt5/core/lumina-wm-INCOMPLETE/WMSession.h b/src-qt5/core/lumina-wm-INCOMPLETE/WMSession.h
deleted file mode 100644
index 5b511326..00000000
--- a/src-qt5/core/lumina-wm-INCOMPLETE/WMSession.h
+++ /dev/null
@@ -1,42 +0,0 @@
-//===========================================
-// Lumina-DE source code
-// Copyright (c) 2015, Ken Moore
-// Available under the 3-clause BSD license
-// See the LICENSE file for full details
-//===========================================
-#ifndef _LUMINA_DESKTOP_WINDOW_MANAGER_SESSION_H
-#define _LUMINA_DESKTOP_WINDOW_MANAGER_SESSION_H
-
-#include "GlobalDefines.h"
-
-#include "LScreenSaver.h"
-#include "LXcbEventFilter.h"
-#include "LWindowManager.h"
-
-class WMSession : public QObject{
- Q_OBJECT
-public:
- WMSession();
- ~WMSession();
-
- void start(bool SSONLY = false);
-
-private:
- //XCB Event Watcher
- EventFilter *EFILTER;
- //ScreenSaver
- LScreenSaver *SS;
- //Window Manager
- LWindowManager *WM;
-
- QThread *EVThread; //X Event thread
-
-public slots:
- void reloadIcons();
- void newInputsAvailable(QStringList);
-
-private slots:
-
-};
-
-#endif \ No newline at end of file
diff --git a/src-qt5/core/lumina-wm-INCOMPLETE/animations/BaseAnimGroup.cpp b/src-qt5/core/lumina-wm-INCOMPLETE/animations/BaseAnimGroup.cpp
deleted file mode 100644
index 1e55dc76..00000000
--- a/src-qt5/core/lumina-wm-INCOMPLETE/animations/BaseAnimGroup.cpp
+++ /dev/null
@@ -1,27 +0,0 @@
-//===========================================
-// Lumina-DE source code
-// Copyright (c) 2015, Ken Moore
-// Available under the 3-clause BSD license
-// See the LICENSE file for full details
-//===========================================
-#include "BaseAnimGroup.h"
-
-//Include all the known subclasses here, then add a unique ID for it to the functions at the bottom
-#include "SampleAnimation.h"
-
-//==============================
-// PLUGIN LOADING/LISTING
-//==============================
-BaseAnimGroup* BaseAnimGroup::NewAnimation(QString type, QWidget *parent, QSettings *set){
- //This is where we place all the known plugin ID's, and load the associated subclass
- if(type == "sample"){
- return (new SampleAnimation(parent, set));
- }else{
- //Unknown screensaver, return a blank animation group
- return (new BaseAnimGroup(parent, set));
- }
-}
-
-QStringList BaseAnimGroup::KnownAnimations(){
- return (QStringList() << "sample");
-} \ No newline at end of file
diff --git a/src-qt5/core/lumina-wm-INCOMPLETE/animations/BaseAnimGroup.h b/src-qt5/core/lumina-wm-INCOMPLETE/animations/BaseAnimGroup.h
deleted file mode 100644
index dd7269d4..00000000
--- a/src-qt5/core/lumina-wm-INCOMPLETE/animations/BaseAnimGroup.h
+++ /dev/null
@@ -1,37 +0,0 @@
-//===========================================
-// Lumina-DE source code
-// Copyright (c) 2015, Ken Moore
-// Available under the 3-clause BSD license
-// See the LICENSE file for full details
-//===========================================
-// This class is the container which provides the screensaver animations
-// and should be subclassed for each of the various animation types
-//===========================================
-#ifndef _LUMINA_DESKTOP_SCREEN_SAVER_BASE_ANIMATION_GROUP_H
-#define _LUMINA_DESKTOP_SCREEN_SAVER_BASE_ANIMATION_GROUP_H
-
-#include "GlobalDefines.h"
-
-class BaseAnimGroup : public QParallelAnimationGroup{
- Q_OBJECT
-public:
- QWidget *canvas;
- QSettings *settings;
-
- virtual void LoadAnimations(){} //This is the main function which needs to be subclassed
-
- BaseAnimGroup(QWidget *parent, QSettings *set){
- canvas = parent;
- settings = set;
- }
- ~BaseAnimGroup(){}
-
- //==============================
- // PLUGIN LOADING/LISTING (Change in the .cpp file)
- //==============================
- static BaseAnimGroup* NewAnimation(QString type, QWidget *parent, QSettings *set);
- static QStringList KnownAnimations();
-
-};
-
-#endif \ No newline at end of file
diff --git a/src-qt5/core/lumina-wm-INCOMPLETE/animations/SampleAnimation.h b/src-qt5/core/lumina-wm-INCOMPLETE/animations/SampleAnimation.h
deleted file mode 100644
index e0f11ba5..00000000
--- a/src-qt5/core/lumina-wm-INCOMPLETE/animations/SampleAnimation.h
+++ /dev/null
@@ -1,45 +0,0 @@
-//===========================================
-// Lumina-DE source code
-// Copyright (c) 2015, Ken Moore
-// Available under the 3-clause BSD license
-// See the LICENSE file for full details
-//===========================================
-// This class is the sample plugin for a ScreenSaver animation
-//===========================================
-#ifndef _LUMINA_DESKTOP_SCREEN_SAVER_SAMPLE_ANIMATION_H
-#define _LUMINA_DESKTOP_SCREEN_SAVER_SAMPLE_ANIMATION_H
-
-#include "GlobalDefines.h"
-#include "BaseAnimGroup.h"
-
-class SampleAnimation : public BaseAnimGroup{
- Q_OBJECT
-private:
- QWidget *ball;
-
-public:
- SampleAnimation(QWidget *parent, QSettings *set) : BaseAnimGroup(parent, set){}
- ~SampleAnimation(){ this->stop(); delete ball; }
-
- void LoadAnimations(){
- //qDebug() << "Loading Sample Animation";
- ball = new QWidget(canvas);
- //This creates a red "ball" on the widget which is going to expand/contract in the center of the screen
- ball->setStyleSheet("background: qradialgradient(spread:pad, cx:0.5, cy:0.5, radius:0.5, fx:0.341, fy:0.796, stop:0.00531915 rgba(107, 10, 10, 255), stop:0.521277 rgba(170, 10, 10, 255), stop:0.957447 rgba(200, 0, 0, 255), stop:0.994681 rgba(0, 0, 0, 225), stop:1 rgba(255, 255, 255, 0));");
- //Now setup the movements
- QPropertyAnimation *move = new QPropertyAnimation(ball,"geometry");
- QPoint ctr(canvas->width()/2, canvas->height()/2);
- QRect initgeom(ctr-QPoint(12,12), QSize(24,24) );
- move->setKeyValueAt(0, initgeom ); //starting point
- move->setKeyValueAt(1, initgeom ); //ending point (same as start for continuity)
- int size = canvas->width();
- if(size > canvas->height()){ size = canvas->height(); }
- move->setKeyValueAt(0.5, QRect(ctr-QPoint(size/2, size/2), QSize(size,size))); //touch the edge of the screen
- move->setDuration(10000); //10 seconds
- this->addAnimation(move);
- this->setLoopCount(10); //repeat 10 times
- ball->show();
- }
-
-};
-#endif
diff --git a/src-qt5/core/lumina-wm-INCOMPLETE/animations/animations.pri b/src-qt5/core/lumina-wm-INCOMPLETE/animations/animations.pri
deleted file mode 100644
index 5473d4e1..00000000
--- a/src-qt5/core/lumina-wm-INCOMPLETE/animations/animations.pri
+++ /dev/null
@@ -1,6 +0,0 @@
-SOURCES += $$PWD/BaseAnimGroup.cpp
-
-HEADERS += $$PWD/BaseAnimGroup.h \
- $$PWD/SampleAnimation.h
-
-FORMS += \ No newline at end of file
diff --git a/src-qt5/core/lumina-wm-INCOMPLETE/i18n/lumina-wm_af.ts b/src-qt5/core/lumina-wm-INCOMPLETE/i18n/lumina-wm_af.ts
deleted file mode 100644
index 94fa7f9d..00000000
--- a/src-qt5/core/lumina-wm-INCOMPLETE/i18n/lumina-wm_af.ts
+++ /dev/null
@@ -1,42 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<!DOCTYPE TS>
-<TS version="2.1" language="af_ZA">
-<context>
- <name>LLockScreen</name>
- <message>
- <location filename="../LLockScreen.ui" line="14"/>
- <source>Form</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../LLockScreen.ui" line="114"/>
- <source>Password</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../LLockScreen.ui" line="126"/>
- <source>Unlock Session</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../LLockScreen.cpp" line="39"/>
- <source>Locked by: %1</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../LLockScreen.cpp" line="76"/>
- <source>Too Many Failures</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../LLockScreen.cpp" line="76"/>
- <source>Wait %1 Minutes</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../LLockScreen.cpp" line="77"/>
- <source>Failed Attempts: %1</source>
- <translation type="unfinished"></translation>
- </message>
-</context>
-</TS>
diff --git a/src-qt5/core/lumina-wm-INCOMPLETE/i18n/lumina-wm_ar.ts b/src-qt5/core/lumina-wm-INCOMPLETE/i18n/lumina-wm_ar.ts
deleted file mode 100644
index c1a77f55..00000000
--- a/src-qt5/core/lumina-wm-INCOMPLETE/i18n/lumina-wm_ar.ts
+++ /dev/null
@@ -1,42 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<!DOCTYPE TS>
-<TS version="2.1" language="ar_EG">
-<context>
- <name>LLockScreen</name>
- <message>
- <location filename="../LLockScreen.ui" line="14"/>
- <source>Form</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../LLockScreen.ui" line="114"/>
- <source>Password</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../LLockScreen.ui" line="126"/>
- <source>Unlock Session</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../LLockScreen.cpp" line="39"/>
- <source>Locked by: %1</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../LLockScreen.cpp" line="76"/>
- <source>Too Many Failures</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../LLockScreen.cpp" line="76"/>
- <source>Wait %1 Minutes</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../LLockScreen.cpp" line="77"/>
- <source>Failed Attempts: %1</source>
- <translation type="unfinished"></translation>
- </message>
-</context>
-</TS>
diff --git a/src-qt5/core/lumina-wm-INCOMPLETE/i18n/lumina-wm_az.ts b/src-qt5/core/lumina-wm-INCOMPLETE/i18n/lumina-wm_az.ts
deleted file mode 100644
index 7f25a0f6..00000000
--- a/src-qt5/core/lumina-wm-INCOMPLETE/i18n/lumina-wm_az.ts
+++ /dev/null
@@ -1,42 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<!DOCTYPE TS>
-<TS version="2.1" language="az_AZ">
-<context>
- <name>LLockScreen</name>
- <message>
- <location filename="../LLockScreen.ui" line="14"/>
- <source>Form</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../LLockScreen.ui" line="114"/>
- <source>Password</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../LLockScreen.ui" line="126"/>
- <source>Unlock Session</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../LLockScreen.cpp" line="39"/>
- <source>Locked by: %1</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../LLockScreen.cpp" line="76"/>
- <source>Too Many Failures</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../LLockScreen.cpp" line="76"/>
- <source>Wait %1 Minutes</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../LLockScreen.cpp" line="77"/>
- <source>Failed Attempts: %1</source>
- <translation type="unfinished"></translation>
- </message>
-</context>
-</TS>
diff --git a/src-qt5/core/lumina-wm-INCOMPLETE/i18n/lumina-wm_bg.ts b/src-qt5/core/lumina-wm-INCOMPLETE/i18n/lumina-wm_bg.ts
deleted file mode 100644
index bc409571..00000000
--- a/src-qt5/core/lumina-wm-INCOMPLETE/i18n/lumina-wm_bg.ts
+++ /dev/null
@@ -1,42 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<!DOCTYPE TS>
-<TS version="2.1" language="bg_BG">
-<context>
- <name>LLockScreen</name>
- <message>
- <location filename="../LLockScreen.ui" line="14"/>
- <source>Form</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../LLockScreen.ui" line="114"/>
- <source>Password</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../LLockScreen.ui" line="126"/>
- <source>Unlock Session</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../LLockScreen.cpp" line="39"/>
- <source>Locked by: %1</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../LLockScreen.cpp" line="76"/>
- <source>Too Many Failures</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../LLockScreen.cpp" line="76"/>
- <source>Wait %1 Minutes</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../LLockScreen.cpp" line="77"/>
- <source>Failed Attempts: %1</source>
- <translation type="unfinished"></translation>
- </message>
-</context>
-</TS>
diff --git a/src-qt5/core/lumina-wm-INCOMPLETE/i18n/lumina-wm_bn.ts b/src-qt5/core/lumina-wm-INCOMPLETE/i18n/lumina-wm_bn.ts
deleted file mode 100644
index 9ed8452e..00000000
--- a/src-qt5/core/lumina-wm-INCOMPLETE/i18n/lumina-wm_bn.ts
+++ /dev/null
@@ -1,42 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<!DOCTYPE TS>
-<TS version="2.1" language="bn_BD">
-<context>
- <name>LLockScreen</name>
- <message>
- <location filename="../LLockScreen.ui" line="14"/>
- <source>Form</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../LLockScreen.ui" line="114"/>
- <source>Password</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../LLockScreen.ui" line="126"/>
- <source>Unlock Session</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../LLockScreen.cpp" line="39"/>
- <source>Locked by: %1</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../LLockScreen.cpp" line="76"/>
- <source>Too Many Failures</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../LLockScreen.cpp" line="76"/>
- <source>Wait %1 Minutes</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../LLockScreen.cpp" line="77"/>
- <source>Failed Attempts: %1</source>
- <translation type="unfinished"></translation>
- </message>
-</context>
-</TS>
diff --git a/src-qt5/core/lumina-wm-INCOMPLETE/i18n/lumina-wm_bs.ts b/src-qt5/core/lumina-wm-INCOMPLETE/i18n/lumina-wm_bs.ts
deleted file mode 100644
index a6b8877f..00000000
--- a/src-qt5/core/lumina-wm-INCOMPLETE/i18n/lumina-wm_bs.ts
+++ /dev/null
@@ -1,42 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<!DOCTYPE TS>
-<TS version="2.1" language="bs_BA">
-<context>
- <name>LLockScreen</name>
- <message>
- <location filename="../LLockScreen.ui" line="14"/>
- <source>Form</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../LLockScreen.ui" line="114"/>
- <source>Password</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../LLockScreen.ui" line="126"/>
- <source>Unlock Session</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../LLockScreen.cpp" line="39"/>
- <source>Locked by: %1</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../LLockScreen.cpp" line="76"/>
- <source>Too Many Failures</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../LLockScreen.cpp" line="76"/>
- <source>Wait %1 Minutes</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../LLockScreen.cpp" line="77"/>
- <source>Failed Attempts: %1</source>
- <translation type="unfinished"></translation>
- </message>
-</context>
-</TS>
diff --git a/src-qt5/core/lumina-wm-INCOMPLETE/i18n/lumina-wm_ca.ts b/src-qt5/core/lumina-wm-INCOMPLETE/i18n/lumina-wm_ca.ts
deleted file mode 100644
index 106fcc87..00000000
--- a/src-qt5/core/lumina-wm-INCOMPLETE/i18n/lumina-wm_ca.ts
+++ /dev/null
@@ -1,42 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<!DOCTYPE TS>
-<TS version="2.1" language="ca_ES">
-<context>
- <name>LLockScreen</name>
- <message>
- <location filename="../LLockScreen.ui" line="14"/>
- <source>Form</source>
- <translation>Formulari</translation>
- </message>
- <message>
- <location filename="../LLockScreen.ui" line="114"/>
- <source>Password</source>
- <translation>Contrasenya</translation>
- </message>
- <message>
- <location filename="../LLockScreen.ui" line="126"/>
- <source>Unlock Session</source>
- <translation>Desbloqueja la sessió</translation>
- </message>
- <message>
- <location filename="../LLockScreen.cpp" line="39"/>
- <source>Locked by: %1</source>
- <translation>Bloquejat per %1</translation>
- </message>
- <message>
- <location filename="../LLockScreen.cpp" line="76"/>
- <source>Too Many Failures</source>
- <translation>Massa fallades</translation>
- </message>
- <message>
- <location filename="../LLockScreen.cpp" line="76"/>
- <source>Wait %1 Minutes</source>
- <translation>Espereu %1 minuts</translation>
- </message>
- <message>
- <location filename="../LLockScreen.cpp" line="77"/>
- <source>Failed Attempts: %1</source>
- <translation>Intents fallits: %1</translation>
- </message>
-</context>
-</TS>
diff --git a/src-qt5/core/lumina-wm-INCOMPLETE/i18n/lumina-wm_cs.ts b/src-qt5/core/lumina-wm-INCOMPLETE/i18n/lumina-wm_cs.ts
deleted file mode 100644
index 8d58b752..00000000
--- a/src-qt5/core/lumina-wm-INCOMPLETE/i18n/lumina-wm_cs.ts
+++ /dev/null
@@ -1,42 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<!DOCTYPE TS>
-<TS version="2.1" language="cs_CZ">
-<context>
- <name>LLockScreen</name>
- <message>
- <location filename="../LLockScreen.ui" line="14"/>
- <source>Form</source>
- <translation>Formulář</translation>
- </message>
- <message>
- <location filename="../LLockScreen.ui" line="114"/>
- <source>Password</source>
- <translation>Heslo</translation>
- </message>
- <message>
- <location filename="../LLockScreen.ui" line="126"/>
- <source>Unlock Session</source>
- <translation>Odemknout sezení</translation>
- </message>
- <message>
- <location filename="../LLockScreen.cpp" line="39"/>
- <source>Locked by: %1</source>
- <translation>Zamknuto: %1</translation>
- </message>
- <message>
- <location filename="../LLockScreen.cpp" line="76"/>
- <source>Too Many Failures</source>
- <translation>Příliš mnoho selhání</translation>
- </message>
- <message>
- <location filename="../LLockScreen.cpp" line="76"/>
- <source>Wait %1 Minutes</source>
- <translation>Počkat %1 minut</translation>
- </message>
- <message>
- <location filename="../LLockScreen.cpp" line="77"/>
- <source>Failed Attempts: %1</source>
- <translation>Nepodařených pokusů: %1</translation>
- </message>
-</context>
-</TS>
diff --git a/src-qt5/core/lumina-wm-INCOMPLETE/i18n/lumina-wm_cy.ts b/src-qt5/core/lumina-wm-INCOMPLETE/i18n/lumina-wm_cy.ts
deleted file mode 100644
index 9f19c204..00000000
--- a/src-qt5/core/lumina-wm-INCOMPLETE/i18n/lumina-wm_cy.ts
+++ /dev/null
@@ -1,42 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<!DOCTYPE TS>
-<TS version="2.1" language="cy_GB">
-<context>
- <name>LLockScreen</name>
- <message>
- <location filename="../LLockScreen.ui" line="14"/>
- <source>Form</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../LLockScreen.ui" line="114"/>
- <source>Password</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../LLockScreen.ui" line="126"/>
- <source>Unlock Session</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../LLockScreen.cpp" line="39"/>
- <source>Locked by: %1</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../LLockScreen.cpp" line="76"/>
- <source>Too Many Failures</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../LLockScreen.cpp" line="76"/>
- <source>Wait %1 Minutes</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../LLockScreen.cpp" line="77"/>
- <source>Failed Attempts: %1</source>
- <translation type="unfinished"></translation>
- </message>
-</context>
-</TS>
diff --git a/src-qt5/core/lumina-wm-INCOMPLETE/i18n/lumina-wm_da.ts b/src-qt5/core/lumina-wm-INCOMPLETE/i18n/lumina-wm_da.ts
deleted file mode 100644
index 0ead248b..00000000
--- a/src-qt5/core/lumina-wm-INCOMPLETE/i18n/lumina-wm_da.ts
+++ /dev/null
@@ -1,42 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<!DOCTYPE TS>
-<TS version="2.1" language="da">
-<context>
- <name>LLockScreen</name>
- <message>
- <location filename="../LLockScreen.ui" line="14"/>
- <source>Form</source>
- <translation>Formular</translation>
- </message>
- <message>
- <location filename="../LLockScreen.ui" line="114"/>
- <source>Password</source>
- <translation>Adgangskode</translation>
- </message>
- <message>
- <location filename="../LLockScreen.ui" line="126"/>
- <source>Unlock Session</source>
- <translation>Lås session op</translation>
- </message>
- <message>
- <location filename="../LLockScreen.cpp" line="39"/>
- <source>Locked by: %1</source>
- <translation>Låst af: %1</translation>
- </message>
- <message>
- <location filename="../LLockScreen.cpp" line="76"/>
- <source>Too Many Failures</source>
- <translation>For mange mislykkede forsøg</translation>
- </message>
- <message>
- <location filename="../LLockScreen.cpp" line="76"/>
- <source>Wait %1 Minutes</source>
- <translation>Vent %1 minutter</translation>
- </message>
- <message>
- <location filename="../LLockScreen.cpp" line="77"/>
- <source>Failed Attempts: %1</source>
- <translation>Mislykkede forsøg: %1</translation>
- </message>
-</context>
-</TS>
diff --git a/src-qt5/core/lumina-wm-INCOMPLETE/i18n/lumina-wm_de.ts b/src-qt5/core/lumina-wm-INCOMPLETE/i18n/lumina-wm_de.ts
deleted file mode 100644
index 9dac4498..00000000
--- a/src-qt5/core/lumina-wm-INCOMPLETE/i18n/lumina-wm_de.ts
+++ /dev/null
@@ -1,42 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<!DOCTYPE TS>
-<TS version="2.1" language="de_DE">
-<context>
- <name>LLockScreen</name>
- <message>
- <location filename="../LLockScreen.ui" line="14"/>
- <source>Form</source>
- <translation>Fenster</translation>
- </message>
- <message>
- <location filename="../LLockScreen.ui" line="114"/>
- <source>Password</source>
- <translation>Kennwort</translation>
- </message>
- <message>
- <location filename="../LLockScreen.ui" line="126"/>
- <source>Unlock Session</source>
- <translation>Sitzung entsperren</translation>
- </message>
- <message>
- <location filename="../LLockScreen.cpp" line="39"/>
- <source>Locked by: %1</source>
- <translation>Gesperrt durch: %1</translation>
- </message>
- <message>
- <location filename="../LLockScreen.cpp" line="76"/>
- <source>Too Many Failures</source>
- <translation>Zu viele Fehlversuche</translation>
- </message>
- <message>
- <location filename="../LLockScreen.cpp" line="76"/>
- <source>Wait %1 Minutes</source>
- <translation>%1 Minuten warten</translation>
- </message>
- <message>
- <location filename="../LLockScreen.cpp" line="77"/>
- <source>Failed Attempts: %1</source>
- <translation>Fehlgeschlagene Versuche: %1</translation>
- </message>
-</context>
-</TS>
diff --git a/src-qt5/core/lumina-wm-INCOMPLETE/i18n/lumina-wm_el.ts b/src-qt5/core/lumina-wm-INCOMPLETE/i18n/lumina-wm_el.ts
deleted file mode 100644
index 492b417b..00000000
--- a/src-qt5/core/lumina-wm-INCOMPLETE/i18n/lumina-wm_el.ts
+++ /dev/null
@@ -1,42 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<!DOCTYPE TS>
-<TS version="2.1" language="el_GR">
-<context>
- <name>LLockScreen</name>
- <message>
- <location filename="../LLockScreen.ui" line="14"/>
- <source>Form</source>
- <translation>Μορφή</translation>
- </message>
- <message>
- <location filename="../LLockScreen.ui" line="114"/>
- <source>Password</source>
- <translation>Κωδικός</translation>
- </message>
- <message>
- <location filename="../LLockScreen.ui" line="126"/>
- <source>Unlock Session</source>
- <translation>Ξεκλείδωμα Συνεδρίας</translation>
- </message>
- <message>
- <location filename="../LLockScreen.cpp" line="39"/>
- <source>Locked by: %1</source>
- <translation>Κλειδώθηκε απο: %1</translation>
- </message>
- <message>
- <location filename="../LLockScreen.cpp" line="76"/>
- <source>Too Many Failures</source>
- <translation>Πάρα Πολλές Αποτυχίες</translation>
- </message>
- <message>
- <location filename="../LLockScreen.cpp" line="76"/>
- <source>Wait %1 Minutes</source>
- <translation>Περιμένετε %1 Λεπτά</translation>
- </message>
- <message>
- <location filename="../LLockScreen.cpp" line="77"/>
- <source>Failed Attempts: %1</source>
- <translation>Αποτυχημένες προσπάθειες: %1</translation>
- </message>
-</context>
-</TS>
diff --git a/src-qt5/core/lumina-wm-INCOMPLETE/i18n/lumina-wm_en_GB.ts b/src-qt5/core/lumina-wm-INCOMPLETE/i18n/lumina-wm_en_GB.ts
deleted file mode 100644
index 78e3a18f..00000000
--- a/src-qt5/core/lumina-wm-INCOMPLETE/i18n/lumina-wm_en_GB.ts
+++ /dev/null
@@ -1,42 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<!DOCTYPE TS>
-<TS version="2.1" language="en_GB">
-<context>
- <name>LLockScreen</name>
- <message>
- <location filename="../LLockScreen.ui" line="14"/>
- <source>Form</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../LLockScreen.ui" line="114"/>
- <source>Password</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../LLockScreen.ui" line="126"/>
- <source>Unlock Session</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../LLockScreen.cpp" line="39"/>
- <source>Locked by: %1</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../LLockScreen.cpp" line="76"/>
- <source>Too Many Failures</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../LLockScreen.cpp" line="76"/>
- <source>Wait %1 Minutes</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../LLockScreen.cpp" line="77"/>
- <source>Failed Attempts: %1</source>
- <translation type="unfinished"></translation>
- </message>
-</context>
-</TS>
diff --git a/src-qt5/core/lumina-wm-INCOMPLETE/i18n/lumina-wm_en_ZA.ts b/src-qt5/core/lumina-wm-INCOMPLETE/i18n/lumina-wm_en_ZA.ts
deleted file mode 100644
index 50272a77..00000000
--- a/src-qt5/core/lumina-wm-INCOMPLETE/i18n/lumina-wm_en_ZA.ts
+++ /dev/null
@@ -1,42 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<!DOCTYPE TS>
-<TS version="2.1" language="en_ZA">
-<context>
- <name>LLockScreen</name>
- <message>
- <location filename="../LLockScreen.ui" line="14"/>
- <source>Form</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../LLockScreen.ui" line="114"/>
- <source>Password</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../LLockScreen.ui" line="126"/>
- <source>Unlock Session</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../LLockScreen.cpp" line="39"/>
- <source>Locked by: %1</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../LLockScreen.cpp" line="76"/>
- <source>Too Many Failures</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../LLockScreen.cpp" line="76"/>
- <source>Wait %1 Minutes</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../LLockScreen.cpp" line="77"/>
- <source>Failed Attempts: %1</source>
- <translation type="unfinished"></translation>
- </message>
-</context>
-</TS>
diff --git a/src-qt5/core/lumina-wm-INCOMPLETE/i18n/lumina-wm_es.ts b/src-qt5/core/lumina-wm-INCOMPLETE/i18n/lumina-wm_es.ts
deleted file mode 100644
index b70e5640..00000000
--- a/src-qt5/core/lumina-wm-INCOMPLETE/i18n/lumina-wm_es.ts
+++ /dev/null
@@ -1,42 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<!DOCTYPE TS>
-<TS version="2.1" language="es_ES">
-<context>
- <name>LLockScreen</name>
- <message>
- <location filename="../LLockScreen.ui" line="14"/>
- <source>Form</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../LLockScreen.ui" line="114"/>
- <source>Password</source>
- <translation>Contraseña</translation>
- </message>
- <message>
- <location filename="../LLockScreen.ui" line="126"/>
- <source>Unlock Session</source>
- <translation>Desbloquear Sesion</translation>
- </message>
- <message>
- <location filename="../LLockScreen.cpp" line="39"/>
- <source>Locked by: %1</source>
- <translation>Bloqueado por:%1</translation>
- </message>
- <message>
- <location filename="../LLockScreen.cpp" line="76"/>
- <source>Too Many Failures</source>
- <translation>Demasiadas Fallas</translation>
- </message>
- <message>
- <location filename="../LLockScreen.cpp" line="76"/>
- <source>Wait %1 Minutes</source>
- <translation>Espera %1 Minutos</translation>
- </message>
- <message>
- <location filename="../LLockScreen.cpp" line="77"/>
- <source>Failed Attempts: %1</source>
- <translation>Intentos Fallidos: %1</translation>
- </message>
-</context>
-</TS>
diff --git a/src-qt5/core/lumina-wm-INCOMPLETE/i18n/lumina-wm_et.ts b/src-qt5/core/lumina-wm-INCOMPLETE/i18n/lumina-wm_et.ts
deleted file mode 100644
index 3dd232ba..00000000
--- a/src-qt5/core/lumina-wm-INCOMPLETE/i18n/lumina-wm_et.ts
+++ /dev/null
@@ -1,42 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<!DOCTYPE TS>
-<TS version="2.1" language="et_EE">
-<context>
- <name>LLockScreen</name>
- <message>
- <location filename="../LLockScreen.ui" line="14"/>
- <source>Form</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../LLockScreen.ui" line="114"/>
- <source>Password</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../LLockScreen.ui" line="126"/>
- <source>Unlock Session</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../LLockScreen.cpp" line="39"/>
- <source>Locked by: %1</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../LLockScreen.cpp" line="76"/>
- <source>Too Many Failures</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../LLockScreen.cpp" line="76"/>
- <source>Wait %1 Minutes</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../LLockScreen.cpp" line="77"/>
- <source>Failed Attempts: %1</source>
- <translation type="unfinished"></translation>
- </message>
-</context>
-</TS>
diff --git a/src-qt5/core/lumina-wm-INCOMPLETE/i18n/lumina-wm_eu.ts b/src-qt5/core/lumina-wm-INCOMPLETE/i18n/lumina-wm_eu.ts
deleted file mode 100644
index 64b6c785..00000000
--- a/src-qt5/core/lumina-wm-INCOMPLETE/i18n/lumina-wm_eu.ts
+++ /dev/null
@@ -1,42 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<!DOCTYPE TS>
-<TS version="2.1" language="eu_ES">
-<context>
- <name>LLockScreen</name>
- <message>
- <location filename="../LLockScreen.ui" line="14"/>
- <source>Form</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../LLockScreen.ui" line="114"/>
- <source>Password</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../LLockScreen.ui" line="126"/>
- <source>Unlock Session</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../LLockScreen.cpp" line="39"/>
- <source>Locked by: %1</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../LLockScreen.cpp" line="76"/>
- <source>Too Many Failures</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../LLockScreen.cpp" line="76"/>
- <source>Wait %1 Minutes</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../LLockScreen.cpp" line="77"/>
- <source>Failed Attempts: %1</source>
- <translation type="unfinished"></translation>
- </message>
-</context>
-</TS>
diff --git a/src-qt5/core/lumina-wm-INCOMPLETE/i18n/lumina-wm_fa.ts b/src-qt5/core/lumina-wm-INCOMPLETE/i18n/lumina-wm_fa.ts
deleted file mode 100644
index f4441b5f..00000000
--- a/src-qt5/core/lumina-wm-INCOMPLETE/i18n/lumina-wm_fa.ts
+++ /dev/null
@@ -1,42 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<!DOCTYPE TS>
-<TS version="2.1" language="fa_IR">
-<context>
- <name>LLockScreen</name>
- <message>
- <location filename="../LLockScreen.ui" line="14"/>
- <source>Form</source>
- <translation>از</translation>
- </message>
- <message>
- <location filename="../LLockScreen.ui" line="114"/>
- <source>Password</source>
- <translation>گذرواژه</translation>
- </message>
- <message>
- <location filename="../LLockScreen.ui" line="126"/>
- <source>Unlock Session</source>
- <translation>نشست را باز کن</translation>
- </message>
- <message>
- <location filename="../LLockScreen.cpp" line="39"/>
- <source>Locked by: %1</source>
- <translation>بسته شده بدست: %1</translation>
- </message>
- <message>
- <location filename="../LLockScreen.cpp" line="76"/>
- <source>Too Many Failures</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../LLockScreen.cpp" line="76"/>
- <source>Wait %1 Minutes</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../LLockScreen.cpp" line="77"/>
- <source>Failed Attempts: %1</source>
- <translation type="unfinished"></translation>
- </message>
-</context>
-</TS>
diff --git a/src-qt5/core/lumina-wm-INCOMPLETE/i18n/lumina-wm_fi.ts b/src-qt5/core/lumina-wm-INCOMPLETE/i18n/lumina-wm_fi.ts
deleted file mode 100644
index a9ecb8f8..00000000
--- a/src-qt5/core/lumina-wm-INCOMPLETE/i18n/lumina-wm_fi.ts
+++ /dev/null
@@ -1,42 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<!DOCTYPE TS>
-<TS version="2.1" language="fi_FI">
-<context>
- <name>LLockScreen</name>
- <message>
- <location filename="../LLockScreen.ui" line="14"/>
- <source>Form</source>
- <translation>Lomake</translation>
- </message>
- <message>
- <location filename="../LLockScreen.ui" line="114"/>
- <source>Password</source>
- <translation>Salasana</translation>
- </message>
- <message>
- <location filename="../LLockScreen.ui" line="126"/>
- <source>Unlock Session</source>
- <translation>Poista istunnon lukitus</translation>
- </message>
- <message>
- <location filename="../LLockScreen.cpp" line="39"/>
- <source>Locked by: %1</source>
- <translation>Lukinnut: %1</translation>
- </message>
- <message>
- <location filename="../LLockScreen.cpp" line="76"/>
- <source>Too Many Failures</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../LLockScreen.cpp" line="76"/>
- <source>Wait %1 Minutes</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../LLockScreen.cpp" line="77"/>
- <source>Failed Attempts: %1</source>
- <translation type="unfinished"></translation>
- </message>
-</context>
-</TS>
diff --git a/src-qt5/core/lumina-wm-INCOMPLETE/i18n/lumina-wm_fr.ts b/src-qt5/core/lumina-wm-INCOMPLETE/i18n/lumina-wm_fr.ts
deleted file mode 100644
index d53f60e3..00000000
--- a/src-qt5/core/lumina-wm-INCOMPLETE/i18n/lumina-wm_fr.ts
+++ /dev/null
@@ -1,42 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<!DOCTYPE TS>
-<TS version="2.1" language="fr_FR">
-<context>
- <name>LLockScreen</name>
- <message>
- <location filename="../LLockScreen.ui" line="14"/>
- <source>Form</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../LLockScreen.ui" line="114"/>
- <source>Password</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../LLockScreen.ui" line="126"/>
- <source>Unlock Session</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../LLockScreen.cpp" line="39"/>
- <source>Locked by: %1</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../LLockScreen.cpp" line="76"/>
- <source>Too Many Failures</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../LLockScreen.cpp" line="76"/>
- <source>Wait %1 Minutes</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../LLockScreen.cpp" line="77"/>
- <source>Failed Attempts: %1</source>
- <translation type="unfinished"></translation>
- </message>
-</context>
-</TS>
diff --git a/src-qt5/core/lumina-wm-INCOMPLETE/i18n/lumina-wm_fr_CA.ts b/src-qt5/core/lumina-wm-INCOMPLETE/i18n/lumina-wm_fr_CA.ts
deleted file mode 100644
index 704ad70f..00000000
--- a/src-qt5/core/lumina-wm-INCOMPLETE/i18n/lumina-wm_fr_CA.ts
+++ /dev/null
@@ -1,42 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<!DOCTYPE TS>
-<TS version="2.1" language="fr_CA">
-<context>
- <name>LLockScreen</name>
- <message>
- <location filename="../LLockScreen.ui" line="14"/>
- <source>Form</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../LLockScreen.ui" line="114"/>
- <source>Password</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../LLockScreen.ui" line="126"/>
- <source>Unlock Session</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../LLockScreen.cpp" line="39"/>
- <source>Locked by: %1</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../LLockScreen.cpp" line="76"/>
- <source>Too Many Failures</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../LLockScreen.cpp" line="76"/>
- <source>Wait %1 Minutes</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../LLockScreen.cpp" line="77"/>
- <source>Failed Attempts: %1</source>
- <translation type="unfinished"></translation>
- </message>
-</context>
-</TS>
diff --git a/src-qt5/core/lumina-wm-INCOMPLETE/i18n/lumina-wm_gl.ts b/src-qt5/core/lumina-wm-INCOMPLETE/i18n/lumina-wm_gl.ts
deleted file mode 100644
index 3ae52d22..00000000
--- a/src-qt5/core/lumina-wm-INCOMPLETE/i18n/lumina-wm_gl.ts
+++ /dev/null
@@ -1,42 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<!DOCTYPE TS>
-<TS version="2.1" language="gl_ES">
-<context>
- <name>LLockScreen</name>
- <message>
- <location filename="../LLockScreen.ui" line="14"/>
- <source>Form</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../LLockScreen.ui" line="114"/>
- <source>Password</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../LLockScreen.ui" line="126"/>
- <source>Unlock Session</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../LLockScreen.cpp" line="39"/>
- <source>Locked by: %1</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../LLockScreen.cpp" line="76"/>
- <source>Too Many Failures</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../LLockScreen.cpp" line="76"/>
- <source>Wait %1 Minutes</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../LLockScreen.cpp" line="77"/>
- <source>Failed Attempts: %1</source>
- <translation type="unfinished"></translation>
- </message>
-</context>
-</TS>
diff --git a/src-qt5/core/lumina-wm-INCOMPLETE/i18n/lumina-wm_he.ts b/src-qt5/core/lumina-wm-INCOMPLETE/i18n/lumina-wm_he.ts
deleted file mode 100644
index 42c618f6..00000000
--- a/src-qt5/core/lumina-wm-INCOMPLETE/i18n/lumina-wm_he.ts
+++ /dev/null
@@ -1,42 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<!DOCTYPE TS>
-<TS version="2.1" language="he_IL">
-<context>
- <name>LLockScreen</name>
- <message>
- <location filename="../LLockScreen.ui" line="14"/>
- <source>Form</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../LLockScreen.ui" line="114"/>
- <source>Password</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../LLockScreen.ui" line="126"/>
- <source>Unlock Session</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../LLockScreen.cpp" line="39"/>
- <source>Locked by: %1</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../LLockScreen.cpp" line="76"/>
- <source>Too Many Failures</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../LLockScreen.cpp" line="76"/>
- <source>Wait %1 Minutes</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../LLockScreen.cpp" line="77"/>
- <source>Failed Attempts: %1</source>
- <translation type="unfinished"></translation>
- </message>
-</context>
-</TS>
diff --git a/src-qt5/core/lumina-wm-INCOMPLETE/i18n/lumina-wm_hi.ts b/src-qt5/core/lumina-wm-INCOMPLETE/i18n/lumina-wm_hi.ts
deleted file mode 100644
index b1e3b837..00000000
--- a/src-qt5/core/lumina-wm-INCOMPLETE/i18n/lumina-wm_hi.ts
+++ /dev/null
@@ -1,42 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<!DOCTYPE TS>
-<TS version="2.1" language="hi_IN">
-<context>
- <name>LLockScreen</name>
- <message>
- <location filename="../LLockScreen.ui" line="14"/>
- <source>Form</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../LLockScreen.ui" line="114"/>
- <source>Password</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../LLockScreen.ui" line="126"/>
- <source>Unlock Session</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../LLockScreen.cpp" line="39"/>
- <source>Locked by: %1</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../LLockScreen.cpp" line="76"/>
- <source>Too Many Failures</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../LLockScreen.cpp" line="76"/>
- <source>Wait %1 Minutes</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../LLockScreen.cpp" line="77"/>
- <source>Failed Attempts: %1</source>
- <translation type="unfinished"></translation>
- </message>
-</context>
-</TS>
diff --git a/src-qt5/core/lumina-wm-INCOMPLETE/i18n/lumina-wm_hr.ts b/src-qt5/core/lumina-wm-INCOMPLETE/i18n/lumina-wm_hr.ts
deleted file mode 100644
index 6e365d53..00000000
--- a/src-qt5/core/lumina-wm-INCOMPLETE/i18n/lumina-wm_hr.ts
+++ /dev/null
@@ -1,42 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<!DOCTYPE TS>
-<TS version="2.1" language="hr_HR">
-<context>
- <name>LLockScreen</name>
- <message>
- <location filename="../LLockScreen.ui" line="14"/>
- <source>Form</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../LLockScreen.ui" line="114"/>
- <source>Password</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../LLockScreen.ui" line="126"/>
- <source>Unlock Session</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../LLockScreen.cpp" line="39"/>
- <source>Locked by: %1</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../LLockScreen.cpp" line="76"/>
- <source>Too Many Failures</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../LLockScreen.cpp" line="76"/>
- <source>Wait %1 Minutes</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../LLockScreen.cpp" line="77"/>
- <source>Failed Attempts: %1</source>
- <translation type="unfinished"></translation>
- </message>
-</context>
-</TS>
diff --git a/src-qt5/core/lumina-wm-INCOMPLETE/i18n/lumina-wm_hu.ts b/src-qt5/core/lumina-wm-INCOMPLETE/i18n/lumina-wm_hu.ts
deleted file mode 100644
index 201e8871..00000000
--- a/src-qt5/core/lumina-wm-INCOMPLETE/i18n/lumina-wm_hu.ts
+++ /dev/null
@@ -1,42 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<!DOCTYPE TS>
-<TS version="2.1" language="hu_HU">
-<context>
- <name>LLockScreen</name>
- <message>
- <location filename="../LLockScreen.ui" line="14"/>
- <source>Form</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../LLockScreen.ui" line="114"/>
- <source>Password</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../LLockScreen.ui" line="126"/>
- <source>Unlock Session</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../LLockScreen.cpp" line="39"/>
- <source>Locked by: %1</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../LLockScreen.cpp" line="76"/>
- <source>Too Many Failures</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../LLockScreen.cpp" line="76"/>
- <source>Wait %1 Minutes</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../LLockScreen.cpp" line="77"/>
- <source>Failed Attempts: %1</source>
- <translation type="unfinished"></translation>
- </message>
-</context>
-</TS>
diff --git a/src-qt5/core/lumina-wm-INCOMPLETE/i18n/lumina-wm_id.ts b/src-qt5/core/lumina-wm-INCOMPLETE/i18n/lumina-wm_id.ts
deleted file mode 100644
index babeef2f..00000000
--- a/src-qt5/core/lumina-wm-INCOMPLETE/i18n/lumina-wm_id.ts
+++ /dev/null
@@ -1,42 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<!DOCTYPE TS>
-<TS version="2.1" language="id_ID">
-<context>
- <name>LLockScreen</name>
- <message>
- <location filename="../LLockScreen.ui" line="14"/>
- <source>Form</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../LLockScreen.ui" line="114"/>
- <source>Password</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../LLockScreen.ui" line="126"/>
- <source>Unlock Session</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../LLockScreen.cpp" line="39"/>
- <source>Locked by: %1</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../LLockScreen.cpp" line="76"/>
- <source>Too Many Failures</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../LLockScreen.cpp" line="76"/>
- <source>Wait %1 Minutes</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../LLockScreen.cpp" line="77"/>
- <source>Failed Attempts: %1</source>
- <translation type="unfinished"></translation>
- </message>
-</context>
-</TS>
diff --git a/src-qt5/core/lumina-wm-INCOMPLETE/i18n/lumina-wm_is.ts b/src-qt5/core/lumina-wm-INCOMPLETE/i18n/lumina-wm_is.ts
deleted file mode 100644
index 6eec6ff3..00000000
--- a/src-qt5/core/lumina-wm-INCOMPLETE/i18n/lumina-wm_is.ts
+++ /dev/null
@@ -1,42 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<!DOCTYPE TS>
-<TS version="2.1" language="is_IS">
-<context>
- <name>LLockScreen</name>
- <message>
- <location filename="../LLockScreen.ui" line="14"/>
- <source>Form</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../LLockScreen.ui" line="114"/>
- <source>Password</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../LLockScreen.ui" line="126"/>
- <source>Unlock Session</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../LLockScreen.cpp" line="39"/>
- <source>Locked by: %1</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../LLockScreen.cpp" line="76"/>
- <source>Too Many Failures</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../LLockScreen.cpp" line="76"/>
- <source>Wait %1 Minutes</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../LLockScreen.cpp" line="77"/>
- <source>Failed Attempts: %1</source>
- <translation type="unfinished"></translation>
- </message>
-</context>
-</TS>
diff --git a/src-qt5/core/lumina-wm-INCOMPLETE/i18n/lumina-wm_it.ts b/src-qt5/core/lumina-wm-INCOMPLETE/i18n/lumina-wm_it.ts
deleted file mode 100644
index ff630fb3..00000000
--- a/src-qt5/core/lumina-wm-INCOMPLETE/i18n/lumina-wm_it.ts
+++ /dev/null
@@ -1,42 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<!DOCTYPE TS>
-<TS version="2.1" language="it_IT">
-<context>
- <name>LLockScreen</name>
- <message>
- <location filename="../LLockScreen.ui" line="14"/>
- <source>Form</source>
- <translation>Modulo</translation>
- </message>
- <message>
- <location filename="../LLockScreen.ui" line="114"/>
- <source>Password</source>
- <translation>Parola chiave</translation>
- </message>
- <message>
- <location filename="../LLockScreen.ui" line="126"/>
- <source>Unlock Session</source>
- <translation>Sessione sbloccata</translation>
- </message>
- <message>
- <location filename="../LLockScreen.cpp" line="39"/>
- <source>Locked by: %1</source>
- <translation>Bloccato da: %1</translation>
- </message>
- <message>
- <location filename="../LLockScreen.cpp" line="76"/>
- <source>Too Many Failures</source>
- <translation>Troppi errori</translation>
- </message>
- <message>
- <location filename="../LLockScreen.cpp" line="76"/>
- <source>Wait %1 Minutes</source>
- <translation>Aspetta %1 minuti</translation>
- </message>
- <message>
- <location filename="../LLockScreen.cpp" line="77"/>
- <source>Failed Attempts: %1</source>
- <translation>Tentativi non riusciti: %1</translation>
- </message>
-</context>
-</TS>
diff --git a/src-qt5/core/lumina-wm-INCOMPLETE/i18n/lumina-wm_ja.ts b/src-qt5/core/lumina-wm-INCOMPLETE/i18n/lumina-wm_ja.ts
deleted file mode 100644
index 52c9b6ae..00000000
--- a/src-qt5/core/lumina-wm-INCOMPLETE/i18n/lumina-wm_ja.ts
+++ /dev/null
@@ -1,42 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<!DOCTYPE TS>
-<TS version="2.1" language="ja_JP">
-<context>
- <name>LLockScreen</name>
- <message>
- <location filename="../LLockScreen.ui" line="14"/>
- <source>Form</source>
- <translation>Form</translation>
- </message>
- <message>
- <location filename="../LLockScreen.ui" line="114"/>
- <source>Password</source>
- <translation>パスワード</translation>
- </message>
- <message>
- <location filename="../LLockScreen.ui" line="126"/>
- <source>Unlock Session</source>
- <translation>セッションのロックを解除</translation>
- </message>
- <message>
- <location filename="../LLockScreen.cpp" line="39"/>
- <source>Locked by: %1</source>
- <translation>%1 によってロックされました</translation>
- </message>
- <message>
- <location filename="../LLockScreen.cpp" line="76"/>
- <source>Too Many Failures</source>
- <translation>認証に続けて失敗しました</translation>
- </message>
- <message>
- <location filename="../LLockScreen.cpp" line="76"/>
- <source>Wait %1 Minutes</source>
- <translation>%1 分お待ちください</translation>
- </message>
- <message>
- <location filename="../LLockScreen.cpp" line="77"/>
- <source>Failed Attempts: %1</source>
- <translation>失敗した回数: %1</translation>
- </message>
-</context>
-</TS>
diff --git a/src-qt5/core/lumina-wm-INCOMPLETE/i18n/lumina-wm_ka.ts b/src-qt5/core/lumina-wm-INCOMPLETE/i18n/lumina-wm_ka.ts
deleted file mode 100644
index 86508f3a..00000000
--- a/src-qt5/core/lumina-wm-INCOMPLETE/i18n/lumina-wm_ka.ts
+++ /dev/null
@@ -1,42 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<!DOCTYPE TS>
-<TS version="2.1" language="ka_GE">
-<context>
- <name>LLockScreen</name>
- <message>
- <location filename="../LLockScreen.ui" line="14"/>
- <source>Form</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../LLockScreen.ui" line="114"/>
- <source>Password</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../LLockScreen.ui" line="126"/>
- <source>Unlock Session</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../LLockScreen.cpp" line="39"/>
- <source>Locked by: %1</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../LLockScreen.cpp" line="76"/>
- <source>Too Many Failures</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../LLockScreen.cpp" line="76"/>
- <source>Wait %1 Minutes</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../LLockScreen.cpp" line="77"/>
- <source>Failed Attempts: %1</source>
- <translation type="unfinished"></translation>
- </message>
-</context>
-</TS>
diff --git a/src-qt5/core/lumina-wm-INCOMPLETE/i18n/lumina-wm_ko.ts b/src-qt5/core/lumina-wm-INCOMPLETE/i18n/lumina-wm_ko.ts
deleted file mode 100644
index c1898e09..00000000
--- a/src-qt5/core/lumina-wm-INCOMPLETE/i18n/lumina-wm_ko.ts
+++ /dev/null
@@ -1,42 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<!DOCTYPE TS>
-<TS version="2.1" language="ko_KR">
-<context>
- <name>LLockScreen</name>
- <message>
- <location filename="../LLockScreen.ui" line="14"/>
- <source>Form</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../LLockScreen.ui" line="114"/>
- <source>Password</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../LLockScreen.ui" line="126"/>
- <source>Unlock Session</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../LLockScreen.cpp" line="39"/>
- <source>Locked by: %1</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../LLockScreen.cpp" line="76"/>
- <source>Too Many Failures</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../LLockScreen.cpp" line="76"/>
- <source>Wait %1 Minutes</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../LLockScreen.cpp" line="77"/>
- <source>Failed Attempts: %1</source>
- <translation type="unfinished"></translation>
- </message>
-</context>
-</TS>
diff --git a/src-qt5/core/lumina-wm-INCOMPLETE/i18n/lumina-wm_lt.ts b/src-qt5/core/lumina-wm-INCOMPLETE/i18n/lumina-wm_lt.ts
deleted file mode 100644
index e98e4f5e..00000000
--- a/src-qt5/core/lumina-wm-INCOMPLETE/i18n/lumina-wm_lt.ts
+++ /dev/null
@@ -1,42 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<!DOCTYPE TS>
-<TS version="2.1" language="lt_LT">
-<context>
- <name>LLockScreen</name>
- <message>
- <location filename="../LLockScreen.ui" line="14"/>
- <source>Form</source>
- <translation>Forma</translation>
- </message>
- <message>
- <location filename="../LLockScreen.ui" line="114"/>
- <source>Password</source>
- <translation>Slaptažodis</translation>
- </message>
- <message>
- <location filename="../LLockScreen.ui" line="126"/>
- <source>Unlock Session</source>
- <translation>Atrakinti seansą</translation>
- </message>
- <message>
- <location filename="../LLockScreen.cpp" line="39"/>
- <source>Locked by: %1</source>
- <translation>Užrakino: %1</translation>
- </message>
- <message>
- <location filename="../LLockScreen.cpp" line="76"/>
- <source>Too Many Failures</source>
- <translation>Per daug nesėkmių</translation>
- </message>
- <message>
- <location filename="../LLockScreen.cpp" line="76"/>
- <source>Wait %1 Minutes</source>
- <translation>Palaukite %1 minutes</translation>
- </message>
- <message>
- <location filename="../LLockScreen.cpp" line="77"/>
- <source>Failed Attempts: %1</source>
- <translation>Nepavykusių bandymų: %1</translation>
- </message>
-</context>
-</TS>
diff --git a/src-qt5/core/lumina-wm-INCOMPLETE/i18n/lumina-wm_lv.ts b/src-qt5/core/lumina-wm-INCOMPLETE/i18n/lumina-wm_lv.ts
deleted file mode 100644
index 1a4139fe..00000000
--- a/src-qt5/core/lumina-wm-INCOMPLETE/i18n/lumina-wm_lv.ts
+++ /dev/null
@@ -1,42 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<!DOCTYPE TS>
-<TS version="2.1" language="lv_LV">
-<context>
- <name>LLockScreen</name>
- <message>
- <location filename="../LLockScreen.ui" line="14"/>
- <source>Form</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../LLockScreen.ui" line="114"/>
- <source>Password</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../LLockScreen.ui" line="126"/>
- <source>Unlock Session</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../LLockScreen.cpp" line="39"/>
- <source>Locked by: %1</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../LLockScreen.cpp" line="76"/>
- <source>Too Many Failures</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../LLockScreen.cpp" line="76"/>
- <source>Wait %1 Minutes</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../LLockScreen.cpp" line="77"/>
- <source>Failed Attempts: %1</source>
- <translation type="unfinished"></translation>
- </message>
-</context>
-</TS>
diff --git a/src-qt5/core/lumina-wm-INCOMPLETE/i18n/lumina-wm_mk.ts b/src-qt5/core/lumina-wm-INCOMPLETE/i18n/lumina-wm_mk.ts
deleted file mode 100644
index 595a844c..00000000
--- a/src-qt5/core/lumina-wm-INCOMPLETE/i18n/lumina-wm_mk.ts
+++ /dev/null
@@ -1,42 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<!DOCTYPE TS>
-<TS version="2.1" language="mk_MK">
-<context>
- <name>LLockScreen</name>
- <message>
- <location filename="../LLockScreen.ui" line="14"/>
- <source>Form</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../LLockScreen.ui" line="114"/>
- <source>Password</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../LLockScreen.ui" line="126"/>
- <source>Unlock Session</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../LLockScreen.cpp" line="39"/>
- <source>Locked by: %1</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../LLockScreen.cpp" line="76"/>
- <source>Too Many Failures</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../LLockScreen.cpp" line="76"/>
- <source>Wait %1 Minutes</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../LLockScreen.cpp" line="77"/>
- <source>Failed Attempts: %1</source>
- <translation type="unfinished"></translation>
- </message>
-</context>
-</TS>
diff --git a/src-qt5/core/lumina-wm-INCOMPLETE/i18n/lumina-wm_mn.ts b/src-qt5/core/lumina-wm-INCOMPLETE/i18n/lumina-wm_mn.ts
deleted file mode 100644
index 0bcaaad2..00000000
--- a/src-qt5/core/lumina-wm-INCOMPLETE/i18n/lumina-wm_mn.ts
+++ /dev/null
@@ -1,42 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<!DOCTYPE TS>
-<TS version="2.1" language="mn_MN">
-<context>
- <name>LLockScreen</name>
- <message>
- <location filename="../LLockScreen.ui" line="14"/>
- <source>Form</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../LLockScreen.ui" line="114"/>
- <source>Password</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../LLockScreen.ui" line="126"/>
- <source>Unlock Session</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../LLockScreen.cpp" line="39"/>
- <source>Locked by: %1</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../LLockScreen.cpp" line="76"/>
- <source>Too Many Failures</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../LLockScreen.cpp" line="76"/>
- <source>Wait %1 Minutes</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../LLockScreen.cpp" line="77"/>
- <source>Failed Attempts: %1</source>
- <translation type="unfinished"></translation>
- </message>
-</context>
-</TS>
diff --git a/src-qt5/core/lumina-wm-INCOMPLETE/i18n/lumina-wm_ms.ts b/src-qt5/core/lumina-wm-INCOMPLETE/i18n/lumina-wm_ms.ts
deleted file mode 100644
index b583bf67..00000000
--- a/src-qt5/core/lumina-wm-INCOMPLETE/i18n/lumina-wm_ms.ts
+++ /dev/null
@@ -1,42 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<!DOCTYPE TS>
-<TS version="2.1" language="ms_MY">
-<context>
- <name>LLockScreen</name>
- <message>
- <location filename="../LLockScreen.ui" line="14"/>
- <source>Form</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../LLockScreen.ui" line="114"/>
- <source>Password</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../LLockScreen.ui" line="126"/>
- <source>Unlock Session</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../LLockScreen.cpp" line="39"/>
- <source>Locked by: %1</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../LLockScreen.cpp" line="76"/>
- <source>Too Many Failures</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../LLockScreen.cpp" line="76"/>
- <source>Wait %1 Minutes</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../LLockScreen.cpp" line="77"/>
- <source>Failed Attempts: %1</source>
- <translation type="unfinished"></translation>
- </message>
-</context>
-</TS>
diff --git a/src-qt5/core/lumina-wm-INCOMPLETE/i18n/lumina-wm_mt.ts b/src-qt5/core/lumina-wm-INCOMPLETE/i18n/lumina-wm_mt.ts
deleted file mode 100644
index 11b14d02..00000000
--- a/src-qt5/core/lumina-wm-INCOMPLETE/i18n/lumina-wm_mt.ts
+++ /dev/null
@@ -1,42 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<!DOCTYPE TS>
-<TS version="2.1" language="mt_MT">
-<context>
- <name>LLockScreen</name>
- <message>
- <location filename="../LLockScreen.ui" line="14"/>
- <source>Form</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../LLockScreen.ui" line="114"/>
- <source>Password</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../LLockScreen.ui" line="126"/>
- <source>Unlock Session</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../LLockScreen.cpp" line="39"/>
- <source>Locked by: %1</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../LLockScreen.cpp" line="76"/>
- <source>Too Many Failures</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../LLockScreen.cpp" line="76"/>
- <source>Wait %1 Minutes</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../LLockScreen.cpp" line="77"/>
- <source>Failed Attempts: %1</source>
- <translation type="unfinished"></translation>
- </message>
-</context>
-</TS>
diff --git a/src-qt5/core/lumina-wm-INCOMPLETE/i18n/lumina-wm_nb.ts b/src-qt5/core/lumina-wm-INCOMPLETE/i18n/lumina-wm_nb.ts
deleted file mode 100644
index 8c484832..00000000
--- a/src-qt5/core/lumina-wm-INCOMPLETE/i18n/lumina-wm_nb.ts
+++ /dev/null
@@ -1,42 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<!DOCTYPE TS>
-<TS version="2.1" language="nb_NO">
-<context>
- <name>LLockScreen</name>
- <message>
- <location filename="../LLockScreen.ui" line="14"/>
- <source>Form</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../LLockScreen.ui" line="114"/>
- <source>Password</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../LLockScreen.ui" line="126"/>
- <source>Unlock Session</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../LLockScreen.cpp" line="39"/>
- <source>Locked by: %1</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../LLockScreen.cpp" line="76"/>
- <source>Too Many Failures</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../LLockScreen.cpp" line="76"/>
- <source>Wait %1 Minutes</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../LLockScreen.cpp" line="77"/>
- <source>Failed Attempts: %1</source>
- <translation type="unfinished"></translation>
- </message>
-</context>
-</TS>
diff --git a/src-qt5/core/lumina-wm-INCOMPLETE/i18n/lumina-wm_nl.ts b/src-qt5/core/lumina-wm-INCOMPLETE/i18n/lumina-wm_nl.ts
deleted file mode 100644
index b164c911..00000000
--- a/src-qt5/core/lumina-wm-INCOMPLETE/i18n/lumina-wm_nl.ts
+++ /dev/null
@@ -1,42 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<!DOCTYPE TS>
-<TS version="2.1" language="nl_NL">
-<context>
- <name>LLockScreen</name>
- <message>
- <location filename="../LLockScreen.ui" line="14"/>
- <source>Form</source>
- <translation>Formulier</translation>
- </message>
- <message>
- <location filename="../LLockScreen.ui" line="114"/>
- <source>Password</source>
- <translation>Wachtwoord</translation>
- </message>
- <message>
- <location filename="../LLockScreen.ui" line="126"/>
- <source>Unlock Session</source>
- <translation>Ontgrendel sessie</translation>
- </message>
- <message>
- <location filename="../LLockScreen.cpp" line="39"/>
- <source>Locked by: %1</source>
- <translation>Vergrendeld door: %1</translation>
- </message>
- <message>
- <location filename="../LLockScreen.cpp" line="76"/>
- <source>Too Many Failures</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../LLockScreen.cpp" line="76"/>
- <source>Wait %1 Minutes</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../LLockScreen.cpp" line="77"/>
- <source>Failed Attempts: %1</source>
- <translation type="unfinished"></translation>
- </message>
-</context>
-</TS>
diff --git a/src-qt5/core/lumina-wm-INCOMPLETE/i18n/lumina-wm_pa.ts b/src-qt5/core/lumina-wm-INCOMPLETE/i18n/lumina-wm_pa.ts
deleted file mode 100644
index d4af901e..00000000
--- a/src-qt5/core/lumina-wm-INCOMPLETE/i18n/lumina-wm_pa.ts
+++ /dev/null
@@ -1,42 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<!DOCTYPE TS>
-<TS version="2.1" language="pa_IN">
-<context>
- <name>LLockScreen</name>
- <message>
- <location filename="../LLockScreen.ui" line="14"/>
- <source>Form</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../LLockScreen.ui" line="114"/>
- <source>Password</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../LLockScreen.ui" line="126"/>
- <source>Unlock Session</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../LLockScreen.cpp" line="39"/>
- <source>Locked by: %1</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../LLockScreen.cpp" line="76"/>
- <source>Too Many Failures</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../LLockScreen.cpp" line="76"/>
- <source>Wait %1 Minutes</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../LLockScreen.cpp" line="77"/>
- <source>Failed Attempts: %1</source>
- <translation type="unfinished"></translation>
- </message>
-</context>
-</TS>
diff --git a/src-qt5/core/lumina-wm-INCOMPLETE/i18n/lumina-wm_pl.ts b/src-qt5/core/lumina-wm-INCOMPLETE/i18n/lumina-wm_pl.ts
deleted file mode 100644
index 6be95399..00000000
--- a/src-qt5/core/lumina-wm-INCOMPLETE/i18n/lumina-wm_pl.ts
+++ /dev/null
@@ -1,42 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<!DOCTYPE TS>
-<TS version="2.1" language="pl_PL">
-<context>
- <name>LLockScreen</name>
- <message>
- <location filename="../LLockScreen.ui" line="14"/>
- <source>Form</source>
- <translation type="unfinished">Formularz</translation>
- </message>
- <message>
- <location filename="../LLockScreen.ui" line="114"/>
- <source>Password</source>
- <translation>Hasło</translation>
- </message>
- <message>
- <location filename="../LLockScreen.ui" line="126"/>
- <source>Unlock Session</source>
- <translation>Odblokuj Sesję</translation>
- </message>
- <message>
- <location filename="../LLockScreen.cpp" line="39"/>
- <source>Locked by: %1</source>
- <translation>Zablokowane przez: %1</translation>
- </message>
- <message>
- <location filename="../LLockScreen.cpp" line="76"/>
- <source>Too Many Failures</source>
- <translation>Za Dużo Błędów</translation>
- </message>
- <message>
- <location filename="../LLockScreen.cpp" line="76"/>
- <source>Wait %1 Minutes</source>
- <translation type="unfinished">Zaczekaj %1 Minut</translation>
- </message>
- <message>
- <location filename="../LLockScreen.cpp" line="77"/>
- <source>Failed Attempts: %1</source>
- <translation>Nieudanych Prób: %1</translation>
- </message>
-</context>
-</TS>
diff --git a/src-qt5/core/lumina-wm-INCOMPLETE/i18n/lumina-wm_pt.ts b/src-qt5/core/lumina-wm-INCOMPLETE/i18n/lumina-wm_pt.ts
deleted file mode 100644
index c2aafc06..00000000
--- a/src-qt5/core/lumina-wm-INCOMPLETE/i18n/lumina-wm_pt.ts
+++ /dev/null
@@ -1,42 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<!DOCTYPE TS>
-<TS version="2.1" language="pt_BR">
-<context>
- <name>LLockScreen</name>
- <message>
- <location filename="../LLockScreen.ui" line="14"/>
- <source>Form</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../LLockScreen.ui" line="114"/>
- <source>Password</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../LLockScreen.ui" line="126"/>
- <source>Unlock Session</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../LLockScreen.cpp" line="39"/>
- <source>Locked by: %1</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../LLockScreen.cpp" line="76"/>
- <source>Too Many Failures</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../LLockScreen.cpp" line="76"/>
- <source>Wait %1 Minutes</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../LLockScreen.cpp" line="77"/>
- <source>Failed Attempts: %1</source>
- <translation type="unfinished"></translation>
- </message>
-</context>
-</TS>
diff --git a/src-qt5/core/lumina-wm-INCOMPLETE/i18n/lumina-wm_pt_BR.ts b/src-qt5/core/lumina-wm-INCOMPLETE/i18n/lumina-wm_pt_BR.ts
deleted file mode 100644
index c0a0387a..00000000
--- a/src-qt5/core/lumina-wm-INCOMPLETE/i18n/lumina-wm_pt_BR.ts
+++ /dev/null
@@ -1,42 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<!DOCTYPE TS>
-<TS version="2.1" language="pt_BR">
-<context>
- <name>LLockScreen</name>
- <message>
- <location filename="../LLockScreen.ui" line="14"/>
- <source>Form</source>
- <translation>Formulário</translation>
- </message>
- <message>
- <location filename="../LLockScreen.ui" line="114"/>
- <source>Password</source>
- <translation>Senha</translation>
- </message>
- <message>
- <location filename="../LLockScreen.ui" line="126"/>
- <source>Unlock Session</source>
- <translation>Desbloquear Sessão</translation>
- </message>
- <message>
- <location filename="../LLockScreen.cpp" line="39"/>
- <source>Locked by: %1</source>
- <translation>Bloqueado por: %1</translation>
- </message>
- <message>
- <location filename="../LLockScreen.cpp" line="76"/>
- <source>Too Many Failures</source>
- <translation>Muitas Falhas</translation>
- </message>
- <message>
- <location filename="../LLockScreen.cpp" line="76"/>
- <source>Wait %1 Minutes</source>
- <translation>Aguarde %1 Minutos</translation>
- </message>
- <message>
- <location filename="../LLockScreen.cpp" line="77"/>
- <source>Failed Attempts: %1</source>
- <translation>Tentativas com Falhas: %1</translation>
- </message>
-</context>
-</TS>
diff --git a/src-qt5/core/lumina-wm-INCOMPLETE/i18n/lumina-wm_ro.ts b/src-qt5/core/lumina-wm-INCOMPLETE/i18n/lumina-wm_ro.ts
deleted file mode 100644
index 0b9f7367..00000000
--- a/src-qt5/core/lumina-wm-INCOMPLETE/i18n/lumina-wm_ro.ts
+++ /dev/null
@@ -1,42 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<!DOCTYPE TS>
-<TS version="2.1" language="ro_RO">
-<context>
- <name>LLockScreen</name>
- <message>
- <location filename="../LLockScreen.ui" line="14"/>
- <source>Form</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../LLockScreen.ui" line="114"/>
- <source>Password</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../LLockScreen.ui" line="126"/>
- <source>Unlock Session</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../LLockScreen.cpp" line="39"/>
- <source>Locked by: %1</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../LLockScreen.cpp" line="76"/>
- <source>Too Many Failures</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../LLockScreen.cpp" line="76"/>
- <source>Wait %1 Minutes</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../LLockScreen.cpp" line="77"/>
- <source>Failed Attempts: %1</source>
- <translation type="unfinished"></translation>
- </message>
-</context>
-</TS>
diff --git a/src-qt5/core/lumina-wm-INCOMPLETE/i18n/lumina-wm_ru.ts b/src-qt5/core/lumina-wm-INCOMPLETE/i18n/lumina-wm_ru.ts
deleted file mode 100644
index 659116b8..00000000
--- a/src-qt5/core/lumina-wm-INCOMPLETE/i18n/lumina-wm_ru.ts
+++ /dev/null
@@ -1,42 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<!DOCTYPE TS>
-<TS version="2.1" language="ru_RU">
-<context>
- <name>LLockScreen</name>
- <message>
- <location filename="../LLockScreen.ui" line="14"/>
- <source>Form</source>
- <translation>Экран блокировки</translation>
- </message>
- <message>
- <location filename="../LLockScreen.ui" line="114"/>
- <source>Password</source>
- <translation>Пароль</translation>
- </message>
- <message>
- <location filename="../LLockScreen.ui" line="126"/>
- <source>Unlock Session</source>
- <translation>Разблокировать сессию</translation>
- </message>
- <message>
- <location filename="../LLockScreen.cpp" line="39"/>
- <source>Locked by: %1</source>
- <translation>Заблокировано: %1</translation>
- </message>
- <message>
- <location filename="../LLockScreen.cpp" line="76"/>
- <source>Too Many Failures</source>
- <translation>Слишком много неудач</translation>
- </message>
- <message>
- <location filename="../LLockScreen.cpp" line="76"/>
- <source>Wait %1 Minutes</source>
- <translation>Подождите %1 минут(ы)</translation>
- </message>
- <message>
- <location filename="../LLockScreen.cpp" line="77"/>
- <source>Failed Attempts: %1</source>
- <translation>Неудачные попытки: %1</translation>
- </message>
-</context>
-</TS>
diff --git a/src-qt5/core/lumina-wm-INCOMPLETE/i18n/lumina-wm_sk.ts b/src-qt5/core/lumina-wm-INCOMPLETE/i18n/lumina-wm_sk.ts
deleted file mode 100644
index dab370e5..00000000
--- a/src-qt5/core/lumina-wm-INCOMPLETE/i18n/lumina-wm_sk.ts
+++ /dev/null
@@ -1,42 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<!DOCTYPE TS>
-<TS version="2.1" language="sk_SK">
-<context>
- <name>LLockScreen</name>
- <message>
- <location filename="../LLockScreen.ui" line="14"/>
- <source>Form</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../LLockScreen.ui" line="114"/>
- <source>Password</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../LLockScreen.ui" line="126"/>
- <source>Unlock Session</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../LLockScreen.cpp" line="39"/>
- <source>Locked by: %1</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../LLockScreen.cpp" line="76"/>
- <source>Too Many Failures</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../LLockScreen.cpp" line="76"/>
- <source>Wait %1 Minutes</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../LLockScreen.cpp" line="77"/>
- <source>Failed Attempts: %1</source>
- <translation type="unfinished"></translation>
- </message>
-</context>
-</TS>
diff --git a/src-qt5/core/lumina-wm-INCOMPLETE/i18n/lumina-wm_sl.ts b/src-qt5/core/lumina-wm-INCOMPLETE/i18n/lumina-wm_sl.ts
deleted file mode 100644
index 69d4fc96..00000000
--- a/src-qt5/core/lumina-wm-INCOMPLETE/i18n/lumina-wm_sl.ts
+++ /dev/null
@@ -1,42 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<!DOCTYPE TS>
-<TS version="2.1" language="sl_SI">
-<context>
- <name>LLockScreen</name>
- <message>
- <location filename="../LLockScreen.ui" line="14"/>
- <source>Form</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../LLockScreen.ui" line="114"/>
- <source>Password</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../LLockScreen.ui" line="126"/>
- <source>Unlock Session</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../LLockScreen.cpp" line="39"/>
- <source>Locked by: %1</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../LLockScreen.cpp" line="76"/>
- <source>Too Many Failures</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../LLockScreen.cpp" line="76"/>
- <source>Wait %1 Minutes</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../LLockScreen.cpp" line="77"/>
- <source>Failed Attempts: %1</source>
- <translation type="unfinished"></translation>
- </message>
-</context>
-</TS>
diff --git a/src-qt5/core/lumina-wm-INCOMPLETE/i18n/lumina-wm_sr.ts b/src-qt5/core/lumina-wm-INCOMPLETE/i18n/lumina-wm_sr.ts
deleted file mode 100644
index 1f825101..00000000
--- a/src-qt5/core/lumina-wm-INCOMPLETE/i18n/lumina-wm_sr.ts
+++ /dev/null
@@ -1,42 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<!DOCTYPE TS>
-<TS version="2.1" language="sr_RS">
-<context>
- <name>LLockScreen</name>
- <message>
- <location filename="../LLockScreen.ui" line="14"/>
- <source>Form</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../LLockScreen.ui" line="114"/>
- <source>Password</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../LLockScreen.ui" line="126"/>
- <source>Unlock Session</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../LLockScreen.cpp" line="39"/>
- <source>Locked by: %1</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../LLockScreen.cpp" line="76"/>
- <source>Too Many Failures</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../LLockScreen.cpp" line="76"/>
- <source>Wait %1 Minutes</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../LLockScreen.cpp" line="77"/>
- <source>Failed Attempts: %1</source>
- <translation type="unfinished"></translation>
- </message>
-</context>
-</TS>
diff --git a/src-qt5/core/lumina-wm-INCOMPLETE/i18n/lumina-wm_sv.ts b/src-qt5/core/lumina-wm-INCOMPLETE/i18n/lumina-wm_sv.ts
deleted file mode 100644
index f9df7d49..00000000
--- a/src-qt5/core/lumina-wm-INCOMPLETE/i18n/lumina-wm_sv.ts
+++ /dev/null
@@ -1,42 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<!DOCTYPE TS>
-<TS version="2.1" language="sv_SE">
-<context>
- <name>LLockScreen</name>
- <message>
- <location filename="../LLockScreen.ui" line="14"/>
- <source>Form</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../LLockScreen.ui" line="114"/>
- <source>Password</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../LLockScreen.ui" line="126"/>
- <source>Unlock Session</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../LLockScreen.cpp" line="39"/>
- <source>Locked by: %1</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../LLockScreen.cpp" line="76"/>
- <source>Too Many Failures</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../LLockScreen.cpp" line="76"/>
- <source>Wait %1 Minutes</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../LLockScreen.cpp" line="77"/>
- <source>Failed Attempts: %1</source>
- <translation type="unfinished"></translation>
- </message>
-</context>
-</TS>
diff --git a/src-qt5/core/lumina-wm-INCOMPLETE/i18n/lumina-wm_sw.ts b/src-qt5/core/lumina-wm-INCOMPLETE/i18n/lumina-wm_sw.ts
deleted file mode 100644
index ee493a36..00000000
--- a/src-qt5/core/lumina-wm-INCOMPLETE/i18n/lumina-wm_sw.ts
+++ /dev/null
@@ -1,42 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<!DOCTYPE TS>
-<TS version="2.1" language="sw_TZ">
-<context>
- <name>LLockScreen</name>
- <message>
- <location filename="../LLockScreen.ui" line="14"/>
- <source>Form</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../LLockScreen.ui" line="114"/>
- <source>Password</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../LLockScreen.ui" line="126"/>
- <source>Unlock Session</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../LLockScreen.cpp" line="39"/>
- <source>Locked by: %1</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../LLockScreen.cpp" line="76"/>
- <source>Too Many Failures</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../LLockScreen.cpp" line="76"/>
- <source>Wait %1 Minutes</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../LLockScreen.cpp" line="77"/>
- <source>Failed Attempts: %1</source>
- <translation type="unfinished"></translation>
- </message>
-</context>
-</TS>
diff --git a/src-qt5/core/lumina-wm-INCOMPLETE/i18n/lumina-wm_ta.ts b/src-qt5/core/lumina-wm-INCOMPLETE/i18n/lumina-wm_ta.ts
deleted file mode 100644
index c998a8c9..00000000
--- a/src-qt5/core/lumina-wm-INCOMPLETE/i18n/lumina-wm_ta.ts
+++ /dev/null
@@ -1,42 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<!DOCTYPE TS>
-<TS version="2.1" language="ta_IN">
-<context>
- <name>LLockScreen</name>
- <message>
- <location filename="../LLockScreen.ui" line="14"/>
- <source>Form</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../LLockScreen.ui" line="114"/>
- <source>Password</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../LLockScreen.ui" line="126"/>
- <source>Unlock Session</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../LLockScreen.cpp" line="39"/>
- <source>Locked by: %1</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../LLockScreen.cpp" line="76"/>
- <source>Too Many Failures</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../LLockScreen.cpp" line="76"/>
- <source>Wait %1 Minutes</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../LLockScreen.cpp" line="77"/>
- <source>Failed Attempts: %1</source>
- <translation type="unfinished"></translation>
- </message>
-</context>
-</TS>
diff --git a/src-qt5/core/lumina-wm-INCOMPLETE/i18n/lumina-wm_tg.ts b/src-qt5/core/lumina-wm-INCOMPLETE/i18n/lumina-wm_tg.ts
deleted file mode 100644
index f2847d66..00000000
--- a/src-qt5/core/lumina-wm-INCOMPLETE/i18n/lumina-wm_tg.ts
+++ /dev/null
@@ -1,42 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<!DOCTYPE TS>
-<TS version="2.1" language="tg_TJ">
-<context>
- <name>LLockScreen</name>
- <message>
- <location filename="../LLockScreen.ui" line="14"/>
- <source>Form</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../LLockScreen.ui" line="114"/>
- <source>Password</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../LLockScreen.ui" line="126"/>
- <source>Unlock Session</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../LLockScreen.cpp" line="39"/>
- <source>Locked by: %1</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../LLockScreen.cpp" line="76"/>
- <source>Too Many Failures</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../LLockScreen.cpp" line="76"/>
- <source>Wait %1 Minutes</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../LLockScreen.cpp" line="77"/>
- <source>Failed Attempts: %1</source>
- <translation type="unfinished"></translation>
- </message>
-</context>
-</TS>
diff --git a/src-qt5/core/lumina-wm-INCOMPLETE/i18n/lumina-wm_th.ts b/src-qt5/core/lumina-wm-INCOMPLETE/i18n/lumina-wm_th.ts
deleted file mode 100644
index 3d34afe7..00000000
--- a/src-qt5/core/lumina-wm-INCOMPLETE/i18n/lumina-wm_th.ts
+++ /dev/null
@@ -1,42 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<!DOCTYPE TS>
-<TS version="2.1" language="th_TH">
-<context>
- <name>LLockScreen</name>
- <message>
- <location filename="../LLockScreen.ui" line="14"/>
- <source>Form</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../LLockScreen.ui" line="114"/>
- <source>Password</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../LLockScreen.ui" line="126"/>
- <source>Unlock Session</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../LLockScreen.cpp" line="39"/>
- <source>Locked by: %1</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../LLockScreen.cpp" line="76"/>
- <source>Too Many Failures</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../LLockScreen.cpp" line="76"/>
- <source>Wait %1 Minutes</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../LLockScreen.cpp" line="77"/>
- <source>Failed Attempts: %1</source>
- <translation type="unfinished"></translation>
- </message>
-</context>
-</TS>
diff --git a/src-qt5/core/lumina-wm-INCOMPLETE/i18n/lumina-wm_tr.ts b/src-qt5/core/lumina-wm-INCOMPLETE/i18n/lumina-wm_tr.ts
deleted file mode 100644
index deb5397b..00000000
--- a/src-qt5/core/lumina-wm-INCOMPLETE/i18n/lumina-wm_tr.ts
+++ /dev/null
@@ -1,42 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<!DOCTYPE TS>
-<TS version="2.1" language="tr_TR">
-<context>
- <name>LLockScreen</name>
- <message>
- <location filename="../LLockScreen.ui" line="14"/>
- <source>Form</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../LLockScreen.ui" line="114"/>
- <source>Password</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../LLockScreen.ui" line="126"/>
- <source>Unlock Session</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../LLockScreen.cpp" line="39"/>
- <source>Locked by: %1</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../LLockScreen.cpp" line="76"/>
- <source>Too Many Failures</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../LLockScreen.cpp" line="76"/>
- <source>Wait %1 Minutes</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../LLockScreen.cpp" line="77"/>
- <source>Failed Attempts: %1</source>
- <translation type="unfinished"></translation>
- </message>
-</context>
-</TS>
diff --git a/src-qt5/core/lumina-wm-INCOMPLETE/i18n/lumina-wm_uk.ts b/src-qt5/core/lumina-wm-INCOMPLETE/i18n/lumina-wm_uk.ts
deleted file mode 100644
index c74b1ec6..00000000
--- a/src-qt5/core/lumina-wm-INCOMPLETE/i18n/lumina-wm_uk.ts
+++ /dev/null
@@ -1,42 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<!DOCTYPE TS>
-<TS version="2.1" language="uk_UA">
-<context>
- <name>LLockScreen</name>
- <message>
- <location filename="../LLockScreen.ui" line="14"/>
- <source>Form</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../LLockScreen.ui" line="114"/>
- <source>Password</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../LLockScreen.ui" line="126"/>
- <source>Unlock Session</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../LLockScreen.cpp" line="39"/>
- <source>Locked by: %1</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../LLockScreen.cpp" line="76"/>
- <source>Too Many Failures</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../LLockScreen.cpp" line="76"/>
- <source>Wait %1 Minutes</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../LLockScreen.cpp" line="77"/>
- <source>Failed Attempts: %1</source>
- <translation type="unfinished"></translation>
- </message>
-</context>
-</TS>
diff --git a/src-qt5/core/lumina-wm-INCOMPLETE/i18n/lumina-wm_uz.ts b/src-qt5/core/lumina-wm-INCOMPLETE/i18n/lumina-wm_uz.ts
deleted file mode 100644
index 506e2eb9..00000000
--- a/src-qt5/core/lumina-wm-INCOMPLETE/i18n/lumina-wm_uz.ts
+++ /dev/null
@@ -1,42 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<!DOCTYPE TS>
-<TS version="2.1" language="uz_UZ">
-<context>
- <name>LLockScreen</name>
- <message>
- <location filename="../LLockScreen.ui" line="14"/>
- <source>Form</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../LLockScreen.ui" line="114"/>
- <source>Password</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../LLockScreen.ui" line="126"/>
- <source>Unlock Session</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../LLockScreen.cpp" line="39"/>
- <source>Locked by: %1</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../LLockScreen.cpp" line="76"/>
- <source>Too Many Failures</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../LLockScreen.cpp" line="76"/>
- <source>Wait %1 Minutes</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../LLockScreen.cpp" line="77"/>
- <source>Failed Attempts: %1</source>
- <translation type="unfinished"></translation>
- </message>
-</context>
-</TS>
diff --git a/src-qt5/core/lumina-wm-INCOMPLETE/i18n/lumina-wm_vi.ts b/src-qt5/core/lumina-wm-INCOMPLETE/i18n/lumina-wm_vi.ts
deleted file mode 100644
index 67f9b9b0..00000000
--- a/src-qt5/core/lumina-wm-INCOMPLETE/i18n/lumina-wm_vi.ts
+++ /dev/null
@@ -1,42 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<!DOCTYPE TS>
-<TS version="2.1" language="vi_VN">
-<context>
- <name>LLockScreen</name>
- <message>
- <location filename="../LLockScreen.ui" line="14"/>
- <source>Form</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../LLockScreen.ui" line="114"/>
- <source>Password</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../LLockScreen.ui" line="126"/>
- <source>Unlock Session</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../LLockScreen.cpp" line="39"/>
- <source>Locked by: %1</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../LLockScreen.cpp" line="76"/>
- <source>Too Many Failures</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../LLockScreen.cpp" line="76"/>
- <source>Wait %1 Minutes</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../LLockScreen.cpp" line="77"/>
- <source>Failed Attempts: %1</source>
- <translation type="unfinished"></translation>
- </message>
-</context>
-</TS>
diff --git a/src-qt5/core/lumina-wm-INCOMPLETE/i18n/lumina-wm_zh_CN.ts b/src-qt5/core/lumina-wm-INCOMPLETE/i18n/lumina-wm_zh_CN.ts
deleted file mode 100644
index b6e21f5e..00000000
--- a/src-qt5/core/lumina-wm-INCOMPLETE/i18n/lumina-wm_zh_CN.ts
+++ /dev/null
@@ -1,42 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<!DOCTYPE TS>
-<TS version="2.1" language="zh_CN">
-<context>
- <name>LLockScreen</name>
- <message>
- <location filename="../LLockScreen.ui" line="14"/>
- <source>Form</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../LLockScreen.ui" line="114"/>
- <source>Password</source>
- <translation>密码</translation>
- </message>
- <message>
- <location filename="../LLockScreen.ui" line="126"/>
- <source>Unlock Session</source>
- <translation>解除会话锁定</translation>
- </message>
- <message>
- <location filename="../LLockScreen.cpp" line="39"/>
- <source>Locked by: %1</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../LLockScreen.cpp" line="76"/>
- <source>Too Many Failures</source>
- <translation>失败次数过多</translation>
- </message>
- <message>
- <location filename="../LLockScreen.cpp" line="76"/>
- <source>Wait %1 Minutes</source>
- <translation>等待 %1 分钟</translation>
- </message>
- <message>
- <location filename="../LLockScreen.cpp" line="77"/>
- <source>Failed Attempts: %1</source>
- <translation type="unfinished">失败尝试: %1</translation>
- </message>
-</context>
-</TS>
diff --git a/src-qt5/core/lumina-wm-INCOMPLETE/i18n/lumina-wm_zh_HK.ts b/src-qt5/core/lumina-wm-INCOMPLETE/i18n/lumina-wm_zh_HK.ts
deleted file mode 100644
index 8457ef3d..00000000
--- a/src-qt5/core/lumina-wm-INCOMPLETE/i18n/lumina-wm_zh_HK.ts
+++ /dev/null
@@ -1,42 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<!DOCTYPE TS>
-<TS version="2.1" language="zh_HK">
-<context>
- <name>LLockScreen</name>
- <message>
- <location filename="../LLockScreen.ui" line="14"/>
- <source>Form</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../LLockScreen.ui" line="114"/>
- <source>Password</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../LLockScreen.ui" line="126"/>
- <source>Unlock Session</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../LLockScreen.cpp" line="39"/>
- <source>Locked by: %1</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../LLockScreen.cpp" line="76"/>
- <source>Too Many Failures</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../LLockScreen.cpp" line="76"/>
- <source>Wait %1 Minutes</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../LLockScreen.cpp" line="77"/>
- <source>Failed Attempts: %1</source>
- <translation type="unfinished"></translation>
- </message>
-</context>
-</TS>
diff --git a/src-qt5/core/lumina-wm-INCOMPLETE/i18n/lumina-wm_zh_TW.ts b/src-qt5/core/lumina-wm-INCOMPLETE/i18n/lumina-wm_zh_TW.ts
deleted file mode 100644
index d1b834bc..00000000
--- a/src-qt5/core/lumina-wm-INCOMPLETE/i18n/lumina-wm_zh_TW.ts
+++ /dev/null
@@ -1,42 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<!DOCTYPE TS>
-<TS version="2.1" language="zh_TW">
-<context>
- <name>LLockScreen</name>
- <message>
- <location filename="../LLockScreen.ui" line="14"/>
- <source>Form</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../LLockScreen.ui" line="114"/>
- <source>Password</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../LLockScreen.ui" line="126"/>
- <source>Unlock Session</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../LLockScreen.cpp" line="39"/>
- <source>Locked by: %1</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../LLockScreen.cpp" line="76"/>
- <source>Too Many Failures</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../LLockScreen.cpp" line="76"/>
- <source>Wait %1 Minutes</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../LLockScreen.cpp" line="77"/>
- <source>Failed Attempts: %1</source>
- <translation type="unfinished"></translation>
- </message>
-</context>
-</TS>
diff --git a/src-qt5/core/lumina-wm-INCOMPLETE/i18n/lumina-wm_zu.ts b/src-qt5/core/lumina-wm-INCOMPLETE/i18n/lumina-wm_zu.ts
deleted file mode 100644
index eebadac5..00000000
--- a/src-qt5/core/lumina-wm-INCOMPLETE/i18n/lumina-wm_zu.ts
+++ /dev/null
@@ -1,42 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<!DOCTYPE TS>
-<TS version="2.1" language="zu_ZA">
-<context>
- <name>LLockScreen</name>
- <message>
- <location filename="../LLockScreen.ui" line="14"/>
- <source>Form</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../LLockScreen.ui" line="114"/>
- <source>Password</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../LLockScreen.ui" line="126"/>
- <source>Unlock Session</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../LLockScreen.cpp" line="39"/>
- <source>Locked by: %1</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../LLockScreen.cpp" line="76"/>
- <source>Too Many Failures</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../LLockScreen.cpp" line="76"/>
- <source>Wait %1 Minutes</source>
- <translation type="unfinished"></translation>
- </message>
- <message>
- <location filename="../LLockScreen.cpp" line="77"/>
- <source>Failed Attempts: %1</source>
- <translation type="unfinished"></translation>
- </message>
-</context>
-</TS>
diff --git a/src-qt5/core/lumina-wm-INCOMPLETE/lumina-wm.pro b/src-qt5/core/lumina-wm-INCOMPLETE/lumina-wm.pro
deleted file mode 100644
index 928f8744..00000000
--- a/src-qt5/core/lumina-wm-INCOMPLETE/lumina-wm.pro
+++ /dev/null
@@ -1,107 +0,0 @@
-include("$${PWD}/../../OS-detect.pri")
-
-QT += core gui network
-greaterThan(QT_MAJOR_VERSION, 4): QT += widgets x11extras
-
-TARGET = lumina-wm
-target.path = $${L_BINDIR}
-
-LIBS += -lLuminaUtils -lxcb -lxcb-damage -lxcb-composite -lxcb-screensaver -lxcb-util
-
-DEPENDPATH += ../libLumina
-
-SOURCES += main.cpp \
- WMSession.cpp \
- LScreenSaver.cpp \
- SSBaseWidget.cpp \
- LLockScreen.cpp \
- LXcbEventFilter.cpp \
- LWindow.cpp \
- LWindowManager.cpp
-
-
-HEADERS += GlobalDefines.h \
- WMSession.h \
- LScreenSaver.h \
- SSBaseWidget.h \
- LLockScreen.h \
- LXcbEventFilter.h \
- LWindow.h \
- LWindowManager.h
-
-FORMS += LLockScreen.ui
-
-#Now add in all the screensaver animation plugins
-include(animations/animations.pri)
-
-TRANSLATIONS = i18n/lumina-wm_af.ts \
- i18n/lumina-wm_ar.ts \
- i18n/lumina-wm_az.ts \
- i18n/lumina-wm_bg.ts \
- i18n/lumina-wm_bn.ts \
- i18n/lumina-wm_bs.ts \
- i18n/lumina-wm_ca.ts \
- i18n/lumina-wm_cs.ts \
- i18n/lumina-wm_cy.ts \
- i18n/lumina-wm_da.ts \
- i18n/lumina-wm_de.ts \
- i18n/lumina-wm_el.ts \
- i18n/lumina-wm_en_GB.ts \
- i18n/lumina-wm_en_ZA.ts \
- i18n/lumina-wm_es.ts \
- i18n/lumina-wm_et.ts \
- i18n/lumina-wm_eu.ts \
- i18n/lumina-wm_fa.ts \
- i18n/lumina-wm_fi.ts \
- i18n/lumina-wm_fr.ts \
- i18n/lumina-wm_fr_CA.ts \
- i18n/lumina-wm_gl.ts \
- i18n/lumina-wm_he.ts \
- i18n/lumina-wm_hi.ts \
- i18n/lumina-wm_hr.ts \
- i18n/lumina-wm_hu.ts \
- i18n/lumina-wm_id.ts \
- i18n/lumina-wm_is.ts \
- i18n/lumina-wm_it.ts \
- i18n/lumina-wm_ja.ts \
- i18n/lumina-wm_ka.ts \
- i18n/lumina-wm_ko.ts \
- i18n/lumina-wm_lt.ts \
- i18n/lumina-wm_lv.ts \
- i18n/lumina-wm_mk.ts \
- i18n/lumina-wm_mn.ts \
- i18n/lumina-wm_ms.ts \
- i18n/lumina-wm_mt.ts \
- i18n/lumina-wm_nb.ts \
- i18n/lumina-wm_nl.ts \
- i18n/lumina-wm_pa.ts \
- i18n/lumina-wm_pl.ts \
- i18n/lumina-wm_pt.ts \
- i18n/lumina-wm_pt_BR.ts \
- i18n/lumina-wm_ro.ts \
- i18n/lumina-wm_ru.ts \
- i18n/lumina-wm_sk.ts \
- i18n/lumina-wm_sl.ts \
- i18n/lumina-wm_sr.ts \
- i18n/lumina-wm_sv.ts \
- i18n/lumina-wm_sw.ts \
- i18n/lumina-wm_ta.ts \
- i18n/lumina-wm_tg.ts \
- i18n/lumina-wm_th.ts \
- i18n/lumina-wm_tr.ts \
- i18n/lumina-wm_uk.ts \
- i18n/lumina-wm_uz.ts \
- i18n/lumina-wm_vi.ts \
- i18n/lumina-wm_zh_CN.ts \
- i18n/lumina-wm_zh_HK.ts \
- i18n/lumina-wm_zh_TW.ts \
- i18n/lumina-wm_zu.ts
-
-dotrans.path=$${L_SHAREDIR}/lumina-desktop/i18n/
-dotrans.extra=cd i18n && $${LRELEASE} -nounfinished *.ts && cp *.qm $(INSTALL_ROOT)$${L_SHAREDIR}/lumina-desktop/i18n/
-
-INSTALLS += target
-
-WITH_I18N{
- INSTALLS += dotrans
-}
diff --git a/src-qt5/core/lumina-wm-INCOMPLETE/main.cpp b/src-qt5/core/lumina-wm-INCOMPLETE/main.cpp
deleted file mode 100644
index 02e48b7b..00000000
--- a/src-qt5/core/lumina-wm-INCOMPLETE/main.cpp
+++ /dev/null
@@ -1,56 +0,0 @@
-//===========================================
-// Lumina-DE source code
-// Copyright (c) 2015, Ken Moore
-// Available under the 3-clause BSD license
-// See the LICENSE file for full details
-//===========================================
-
-#include "GlobalDefines.h"
-//Initialize any global structures here
-LXCB *LWM::SYSTEM = 0;
-
-//Local includes
-#include "WMSession.h"
-#include "LWindow.h"
-#include <QDialog>
-
-
-//#define DEBUG 0
-int main(int argc, char ** argv)
-{
- qDebug() << "Starting lumina-wm...";
- LTHEME::LoadCustomEnvSettings();
- LSingleApplication a(argc, argv, "lumina-wm");
- if(!a.isPrimaryProcess()){ return 0; } //Inputs forwarded on to the primary already
- LuminaThemeEngine themes(&a);
-
- //Setup the global structures
- LWM::SYSTEM = new LXCB();
- if( a.inputlist.contains("--test-win") ){
- //Simple override to test out the window class
- qDebug() << "Starting window test...";
- QLabel dlg(0, Qt::Window | Qt::BypassWindowManagerHint); //this test should be ignored by the current WM
- dlg.setText("Sample Window");
- dlg.setWindowTitle("Test");
- dlg.resize(200,100);
- dlg.setStyleSheet("background: rgba(255,255,255,100); color: black;");
- dlg.move(100,100);
- dlg.show();
- //dlg.move(100,100);
- qDebug() << " - Loading window frame...";
- LWindow win(dlg.winId()); //have it wrap around the dialog
- qDebug() << " - Show frame...";
- win.frame()->windowChanged(LWM::Show);
- qDebug() << " - Start event loop...";
- a.setQuitOnLastWindowClosed(true);
- return a.exec();
- }
- WMSession w;
- w.start(a.inputlist.contains("--test-ss"));
- QObject::connect(&themes, SIGNAL(updateIcons()), &w, SLOT(reloadIcons()) );
- QObject::connect(&a, SIGNAL(InputsAvailable(QStringList)), &w, SLOT(newInputsAvailable(QStringList)) );
- if(!a.inputlist.isEmpty()){ w.newInputsAvailable(a.inputlist); }
- int retCode = a.exec();
-
- return retCode;
-}
bgstack15